本筆記默認學習者已擁有:
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亮),稱為 段碼(陰碼),和共陰極正好是相反關系;
四位一體數碼管
開發板上即為 四位一體的數碼管,且有兩個,正好組成了 八位數碼管;
而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口;