74hc138驅(qū)動(dòng)共陽數(shù)碼管你了解多少呢?74hc138驅(qū)動(dòng)共陽數(shù)碼管的方式是什么呢?本文主要關(guān)于74hc138驅(qū)動(dòng)共陽數(shù)碼管的介紹。
數(shù)碼管的基本介紹
數(shù)碼管原理圖
這是比較常見的數(shù)碼管的原理圖,我們板子上一共有6只數(shù)碼管。前邊有了LED小燈的學(xué)習(xí),數(shù)碼管學(xué)習(xí)就會(huì)輕松的多了。從圖1能看出來,數(shù)碼管共有a,b,c,d,e,f,g,dp這8個(gè)段,而實(shí)際上,這8個(gè)段每一段都是一個(gè)LED小燈,所以數(shù)碼管就是由8個(gè)LED小燈所組成的。我們看一下數(shù)碼管內(nèi)部結(jié)構(gòu)圖。
數(shù)碼管分為共陽數(shù)碼管和共陰數(shù)碼管,所謂的共陰數(shù)碼管就是8只LED小燈的陰極是接在一起的,也就是陰極是公共端,由陽極來控制小燈是否亮滅。同理,共陽數(shù)碼管就是陽極是接到一起的,大家可以仔細(xì)研究下圖1。細(xì)心的同學(xué)也會(huì)發(fā)現(xiàn),數(shù)碼管上邊有2個(gè)com,實(shí)際上就是我們數(shù)碼管的公共端。為什么有2個(gè),我個(gè)人認(rèn)為,一方面有2個(gè)可以起到對稱的效果,剛好是10個(gè)引腳,另外一個(gè)方面,公共端通過的電流較大,我們初中就學(xué)過,并聯(lián)電路電流之和等于總電流,用2個(gè)com可以把公共電流平均到2個(gè)引腳上去,降低線路承受的電流。
從我們板子的電路圖上能看出來,我們所用的數(shù)碼管是共陽數(shù)碼管,如圖所示。
共陽數(shù)碼管電路
74hc138控制共陽數(shù)碼管
從上文我們知道,他們的com是接到了正極上,當(dāng)然了,和LED小燈電路類似,也是由74HC138控制了三極管的導(dǎo)通來控制整個(gè)數(shù)碼管的電流,我們先來看DS1這個(gè)數(shù)碼管。原理圖上可以看出來,控制DS1的三極管是Q17,控制Q17的引腳是LEDS0,對應(yīng)到74HC138上邊就是Y0端的輸出。
74HC138控制圖
我們現(xiàn)在的目的是讓LEDS0這個(gè)引腳輸出低電平,相信大家現(xiàn)在可以獨(dú)立根據(jù)前邊學(xué)到的內(nèi)容把ADDR0,ADDR1,ADDR2,ADDR3,ENLED這4個(gè)輸入狀態(tài)寫出來,現(xiàn)在大家不要偷懶,都去根據(jù)138的手冊去寫一下,不需要你記住這些結(jié)論,但是遇到就寫一次,鍛煉過幾次后,遇到同類芯片自己就知道如何去解決問題了。
數(shù)碼管通常是用來顯示數(shù)字的,我們板子上的6個(gè)數(shù)碼管,習(xí)慣上我們稱之為6位,那控制位選擇的就是74HC138了。而數(shù)碼管內(nèi)部的8個(gè)LED小燈我們稱之為數(shù)碼管的段,那么數(shù)碼管的段選擇(即該段的亮滅)是通過P0口控制,經(jīng)過74HC245驅(qū)動(dòng),這樣整個(gè)電路就完成了。
74hc138控制共陽數(shù)碼管程序
#include //包含寄存器的庫文件
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
unsigned char j = 0;
unsigned int i = 0;
ENLED = 0;
ADDR0 = 0;
ADDR1 = 0;
ADDR2 = 0;
ADDR3 = 1; //74HC138開啟三極管Q17
while(1) //程序死循環(huán)
{
P0 = 0xF9; //打開數(shù)碼管b和c段
}
}
數(shù)碼管的靜態(tài)顯示
從上文我們了解到74HC138同時(shí)一次只能讓一個(gè)輸出口為低電平,也就是在一個(gè)時(shí)刻內(nèi),我們只能讓一個(gè)數(shù)碼管顯示,始終選通數(shù)碼管并且可以根據(jù)我們的P0總線的信號來改變這個(gè)數(shù)碼管的值,我們可以理解為數(shù)碼管的靜態(tài)顯示。
數(shù)碼管靜態(tài)顯示是對應(yīng)動(dòng)態(tài)顯示而言的,靜態(tài)顯示對于一兩個(gè)數(shù)碼管還行,多個(gè)數(shù)碼管,靜態(tài)顯示實(shí)現(xiàn)的意義就沒有了。這節(jié)課我們先用一個(gè)數(shù)碼管的靜態(tài)顯示來實(shí)現(xiàn)一個(gè)簡單的秒表,為下節(jié)課的動(dòng)態(tài)顯示打下基礎(chǔ)。
先來介紹一個(gè)51單片機(jī)的關(guān)鍵字code。我們前邊課程定義變量的時(shí)候,一般用到unsigned?char或者unsigned?int這兩個(gè)關(guān)鍵字,這樣定義的變量都是放在我們的單片機(jī)的RAM中,我們在程序中可以隨意去改變這個(gè)變量的值。但是還有一種常數(shù),我們在程序中要使用,但是卻不進(jìn)行對這個(gè)值的改變,這種值我們可以加一個(gè)code關(guān)鍵字修飾一下,修飾完畢后,這個(gè)值就會(huì)存儲(chǔ)到我們的程序空間flash中,這樣可以大大節(jié)省我們單片機(jī)的RAM的使用量,畢竟我們的RAM空間比較小,而程序空間是很大的。
數(shù)碼管的靜態(tài)顯示程序:
#include //包含寄存器的庫文件
sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e
}; //用數(shù)組來存儲(chǔ)數(shù)碼管真值表,下一課詳細(xì)介紹數(shù)組
void main()
{
unsigned char counter = 0;
unsigned char j = 0;
ENLED = 0; ADDR0 = 0; ADDR1 = 0;
ADDR2 = 0; ADDR3 = 1; P0 = 0XFF; //74HC138和P0初始化部分
TMOD = 0x01; //設(shè)置定時(shí)器0為模式1
TH0 = 0xB8;
TL0 = 0x00; //定時(shí)值初值
TR0 = 1; //打開定時(shí)器0
while(1)
{
if(1 == TF0) //判斷定時(shí)器0是否溢出
{
TF0 = 0;
TH0 = 0xB8; //溢出后,重新賦值
TL0 = 0x00;
counter++;
if(50 == counter) //判斷定時(shí)器0溢出是否達(dá)到50次
{
counter = 0; //counter清0,重新計(jì)數(shù)
P0 = LedChar[j++]; //把數(shù)組里的對應(yīng)值送給P0
if(16 == j) //當(dāng)顯示到F后,歸0重新開始
{
j = 0;
}
}
}
}
}
結(jié)語
關(guān)于74hc138控制共陽數(shù)碼管的介紹就到這里了,如有不足之處歡迎指正。