51單片機 第四節 數碼管


本筆記默認學習者已擁有:
1.Keil5和stc燒寫工具 等各種軟件、驅動、環境;
2.有一個屬於自己的 51單片機開發板及相關零件 ;
3.認識C語言的語法;
本人使用的51開發板為 郭天祥C51 TX-1C增強版開發板
本筆記根據B站up主:江科大自化協的教學視頻 整理得到ヾ(•ω•)




4-1 靜態數碼管顯示

上圖為TX-1C的 數碼管及LED模塊 原理圖

138譯碼器和74HC245 都是用來控制 數碼管顯示 的;




單數碼管

1.上圖為 一位數碼管,數碼管有兩種連接方式(對應 右邊上下兩幅圖);
2.右上圖的原理圖,8個LED的陰極都連在一個引腳上,稱為共陰極連接
3.右下圖的原理圖,8個LED的陽極都連在一個引腳上,稱為共陽極連接

TX-1C開發板的連接方式是 共陰極連接;

4.左下角的 左邊圖片 ,定義了8個LED的名稱;
5.左下角的 右邊圖片 ,定義了引腳的名稱,與右圖的引腳名稱一一對應

假設數碼管連接方式為 共陽極連接,觀察可以發現,數碼管中的 LED 的引腳引出,使用的是就近原則

假設數碼管連接方式為 共陰極連接,如果上數碼管顯示 數字6 ?

1.要讓數碼管顯示 數字6,讓要 LED-A、C、D、E、F、G亮起;

2.共陰極的公共端 要接地(給數據‘0’,或者是低電平);
3.陽極(稱為位選端)根據LED的亮滅需求給 數據0或1(1亮、0滅) ,稱為 段碼(陽碼) (1011 1110 即為段碼);

如果 共陽極連接,共陽極端 要接到 VCC(高電平),陰極給 數據0或1 (1滅,0亮),稱為 段碼(陰碼),和共陰極正好是相反關系;

\[\begin{cases} 共陽極連接 \to 共陽極端 接VCC 並選中 \to 陰極(位選端)傳遞(陰碼)段碼(1亮、0滅) \to 數碼管顯示 \\ 共陰極連接 \to 共陰極端 接GND 並選中 \to 陽極(位選端)傳遞(陽碼)段碼(1滅、0亮) \to 數碼管顯示 \end{cases} \]



四位一體數碼管

開發板上即為 四位一體的數碼管,且有兩個,正好組成了 八位數碼管;

而TX-1C上 包含的是六位數碼管,而非八位;

1.四位數碼管 也有 兩種連接方式,即 共陰極連接共陽極連接

2.四位數碼管,(每位的公共端 單獨引出來,位選端全部連在一起(所有A段連在一起、所有B段連在一起……),總共有12個引腳;


假設數碼管連接方式為 共陰極連接,如何在 第三位 顯示 數字1 ?

1.給第三位的公共端 賦值 0(低電平),給其他位的公共端 賦值 1(高電平);
這樣等同於 其他位的公共端(負極)接到了正極上,無論如何都亮不了;只有第三位能亮;
2.這樣給 LED-B、C 的位選端 賦值 1,其他 位選端 賦值0

共陽極連接 即為 公共端 賦值 1(高電平)亮,其他以此類推;

3.發現這樣一個現象,數碼管無法在同一時間顯示多個數字,其在同一時刻下只能有一個顯示,
只有一個數碼管能被點亮,即使有多個被選中的數碼管,顯示的數字也是相同的

這種共用引腳的現象,是為了減少控制數碼管IO口
(四位數碼管有32個LED,如果都采用 共陰極連接 的方式,也要\(32+1(公共端)=33\)個引腳;)
(采用這種鏈接,就只需要12個引腳即可控制四位數碼管;)


如何讓數碼管多位顯示不同數字(動態數碼管顯示)?

1.利用 人眼視覺的暫留 和 數碼管顯示的余輝 的原理

先讓第一位數碼管顯示1,然后很快地讓第二位數碼管顯示2,再很快地讓第三位數碼管顯示3,
讓它不斷地掃描,重復顯示1、2、3的過程,這樣三個數字就“同時”顯示了;




原理分析

138譯碼器

1.觀察到 原理圖右圖 與數碼管有關的,有138譯碼器(74LS138)和74HC245兩枚芯片;

TX-1C的原理圖為左圖,也有兩個74HC573芯片與數碼管有關;
芯片名稱與功耗、電壓、說明符號有關,具體內容不做分析;

2.如圖,數碼管連接方式為 共陰極連接,這樣傳輸數據,就能讓第三位顯示 數字1 了;
3.而上面的 LED1 ~ 8,其實接在了138譯碼器的輸出端,138譯碼器正好可以實現讓LED1 ~ 8輸出 0或1;

LED1 ~ 8 對應了 TX-1C 六位數碼管的SEG DS 1 ~ 6;

4.138譯碼器可將LED 1 ~ 8的八個端口 轉化為 由 3個端口 (P22、P23、P24)控制,而G1、G2A、G2B端口 被 稱為 使能端

使能端 相當於 一種開關,如果電平有效,它就可以工作;如果電平無效,它就不工作;
觀察原理圖發現,使能端是已經接好 VCC 和 GND 的,也就是說,其上電 其實就會工作
TX-1C的74HC573也是同理,但其並未壓縮 控制端口的數量

5.138譯碼器也叫“38線譯碼器”,是由3個線到8個線,其中C是高位、A是低位,
CBA組成的數符合8進制,控制着Y0 ~ Y7 這8個端口;
6.所以,138譯碼器的作用就是用來選中某一位數碼管的


74HC245

1.74HC245是一種 雙向數據緩沖器,VDD、GND都可視為電源,OE為使能(其 接地 就工作);
2.DIR(direction),是方向的意思,它接到了VCC(高電平)上,將數據從左邊輸出到右邊,從右邊將數據讀取回左邊;

DIR若接到低電平上,會將數據從右邊輸出到左邊,從左邊將數據讀取回右邊;

3.單片機的高電平 驅動能力有限,其輸出的最大電流不能太大;其低電平 驅動能力強;

因此,LED模塊才采用了 低電平點亮 的模式;

4.如果用高電平 直接點亮 數碼管,電流會很小,燈會很暗;所以其加一個緩沖器,緩沖器可以提高 其驅動能力,
如果直接將 數據 輸出 給 數碼管,數據就會被視為 驅動數據;現在增加了緩沖器,數據 就變成了 控制信號,
控制信號 只需要很微弱,緩沖器 就可以接收到,緩沖器再通過自己接到的電源,輸出 數據 到引腳上,
這樣控制的電流只需要非常小,就能驅動數碼管 以比較亮的形式顯示;
5.CC2電容 是用來 穩定電源的,叫電源濾波
6.圖右有 一 排阻,阻值為100R(即為100Ω),作用為 限流電阻 ,防止數碼管的電流過大;

TX-1C既沒有電容,也沒有排阻;




原理總結

1.用 138譯碼器 使 數碼管 的某一位 被選中;
2.再給P0口一個 段碼數據;

TX-1C雖然用P0口控制 段碼輸入,但也用P0口控制 位選;
需要先用 P2.6口和P2.7口 控制 輸入數據 是 段碼 還是 位選;
P2.6口控制 段碼的輸入;P2.7口控制 位選的輸入;
例,給P2.6 數據1 (高電壓)、給P2.7 數據 0 (低電壓),就可以確定現在給數據是 段碼 ;


1.由TX-1C的原理圖可知,數碼管內 LED燈 與 P0端口 的順序關系:

(1)LED的名稱定義是通用無疑的;
(2)數碼管本身的引腳名稱不重要,重要的是 LED與哪個 P0 的 引腳 相連

2.由TX-1C的原理圖可知, P0.0引腳 控制 數碼管的最左位,P0.5引腳控制 數碼管的最右位,
剩余引腳是沒有控制 數碼管 位選 的作用的,哪個P0 的 引腳 控制 六位數碼管的 哪位 很重要;




代碼實現



靜態數碼管顯示(讓數碼管第三位顯示3).c

#include<reg51.h>
sbit D=P2^6; //段碼口
sbit W=P2^7; //位選口
void main(){
	D=0;
	W=1;
	P0=0xFB;//1111 1011
	W=0;
	D=1;
	P0=0x4F;//0100 1111
	while(1);
}

下面寫出了一個通用函數,可以讓數碼管在 第幾個位置 顯示 哪個數

#include<reg51.h>
#define uchar unsigned char
sbit D=P2^6;
sbit W=P2^7;
void NixieTube(uchar wei,uchar duan){ //NixieTube是數碼管的英文
	uchar WEI,DUAN;                   //(Nixie是女水妖的意思)
	D=0;
	W=1;
	switch(wei){ //位選部分
		case 1:WEI=0xFE; break;
		case 2:WEI=0xFD; break;
		case 3:WEI=0xFB; break;
		case 4:WEI=0xF7; break;
		case 5:WEI=0xEF; break;
		case 6:WEI=0xDF; break;
	}
	P0=WEI;
	W=0;
	D=1;
	switch(duan){ //段碼部分
		case 0:DUAN=0x3F; break;
		case 1:DUAN=0x06; break;
		case 2:DUAN=0x5B; break;
		case 3:DUAN=0x4F; break;
		case 4:DUAN=0x66; break;
		case 5:DUAN=0x6D; break;
		case 6:DUAN=0x7D; break;
		case 7:DUAN=0x07; break;
		case 8:DUAN=0x7F; break;
		case 9:DUAN=0x6F; break;
		case 10:DUAN=0x77; break; //A
		case 11:DUAN=0x7F; break; //B
		case 12:DUAN=0x39; break; //C
		case 13:DUAN=0x3F; break; //D
		case 14:DUAN=0x79; break; //E
		case 15:DUAN=0x71; break; //F
		case 16:DUAN=0x80; break; //.
	}
	P0=DUAN;
}
void main(){
	NixieTube(3,3);
	while(1);
}

運行結果如下:




4-2 動態數碼管顯示

1.如果只是單純讓其顯示完一個再顯示一個,代碼如下:

#include<reg51.h>
#define uchar unsigned char
sbit D=P2^6;
sbit W=P2^7;
uchar Nixiewei[]={0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};
uchar Nixiecode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7F,0x39,0x3F,0x79,0x71,0x80};
//將兩個switch改進為數組
void NixieTube(uchar wei,uchar duan){
	D=0;
	W=1;
	P0=Nixiewei[wei];
	W=0;
	D=1;
	P0=Nixiecode[duan];
}
void main(){
	while(1){
		NixieTube(1,1);
		NixieTube(2,2);
		NixieTube(3,3);
	}
}

運行結果如下:

2.這是一個數碼管的常見問題,稱為 數碼管的消影

位選-->段選-->位選-->段選-->位選-->......
在這一位的段選 (輸入段碼)結束,進行下一位的位選時,很短的時間內,上一位的數據會串到下一位數據里面去;
所以我們在 段選和位選之間 ,增加一個 P0 清零 的操作;



動態數碼管顯示(數碼管同時顯示123).c

#include<reg51.h>
#define uchar unsigned char
sbit D=P2^6;
sbit W=P2^7;
uchar Nixiewei[]={0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};
uchar Nixiecode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7F,0x39,0x3F,0x79,0x71,0x80};
void Delayms(unsigned int x){
	unsigned int j;
	for(;x>0;x--) for(j=110;j>0;j--);
}
void NixieTube(uchar wei,uchar duan){
	D=0;
	W=1;
	P0=Nixiewei[wei];
	W=0;
	D=1;
	P0=Nixiecode[duan];
	Delayms(1); //讓數碼管 穩定顯示,立刻清零會讓數碼管 顯示較暗
        P0=0; //清零操作
}
void main(){
	while(1){
		NixieTube(1,1);
		NixieTube(2,2);
		NixieTube(3,3);
	}
}

運行結果如下:




相關知識

1.在運行某些代碼時,TX-1C的LED點陣模塊會亂閃

2.將左下角 DOT-OE旁的跳線帽 拔下來即可 斷開LED點陣模塊,

3.拔下來的跳線帽不要亂丟,可以 只插一個腳放在原處,也可以妥善保管在其他地方

上圖即為拔下來的跳線帽


1.此元件為電容
2.104的數量規則與 第二節 所講的電容是相同的,其單位是pF

1000pF=1nF, 1000nF=1uF, 1000uF=1000mF, 1000mF=1F
F 是一個很大的單位,正常電容都是uF、nF級別的;超級電容能達到1 ~ 2 F,其一般作為備用電池;

3.TX-1C的原理圖上,電容的量都是直接用單位標記好的。


TM1640芯片:內部自帶顯存 掃描電路,單片機只需 通過兩根通訊線,按照它規定的 通訊協議 告訴它顯示什么即可;
74HC595(移位寄存器)驅動數碼管:通過 三根數據線和兩根電源線 就可控制 八個數碼管,可耗費單片機CPU時間,但可以很大地節省單片機的IO口;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM