【51单片机】(三)数码管(原理,静态、动态显示)
一.數(shù)碼管基礎(chǔ)知識(shí)
四位一體數(shù)碼管:
數(shù)碼管電路原理:
與之有關(guān)的元件——“138譯碼器”:
①想要點(diǎn)亮一個(gè)數(shù)碼管并讓其顯示數(shù)字,我們需要操作兩個(gè)端口,給兩個(gè)端口不同的電平。我們的單片機(jī)數(shù)碼管上端是共陰極的,所以發(fā)光的條件是上端賦予低電平,下端賦予高電平。
【通俗理解:上方LED端口選擇要點(diǎn)亮哪一個(gè)數(shù)碼管;下方abcdefg端口確定點(diǎn)亮什么數(shù)字。】
(1)數(shù)碼管上方有8個(gè)接口LED1~8,分別對(duì)應(yīng)接到“譯碼器”的右輸出端。譯碼器的左端連接單片機(jī)的3個(gè)P2口。(具體如何用三個(gè)P2口控制8個(gè)LED輸出口,后面會(huì)單獨(dú)講解)
(2)每一體數(shù)碼管下方引出abcdefg和dp共八個(gè)接口,分別對(duì)應(yīng)點(diǎn)亮一個(gè)LED長(zhǎng)條(圖中有標(biāo)注)或是小數(shù)點(diǎn),點(diǎn)亮幾個(gè)就可以組合成一個(gè)數(shù)字。這八個(gè)接口接到74HC245緩沖器的右輸出端,而74HC245的左端連接單片機(jī)的8個(gè)P0口。74HC245左右端一一對(duì)應(yīng)(A0-B0,A1-B1……)。
(緩沖器是用來(lái)提高單片機(jī)驅(qū)動(dòng)能力的一個(gè)元件,VCC可以增強(qiáng)信號(hào)強(qiáng)度)
比如我現(xiàn)在想讓LED6數(shù)碼管發(fā)出“3”的數(shù)字。那么,上方接口所賦予的電平情況應(yīng)該是(從左往右)1101 1111;下方接口接通abcdg,應(yīng)該是(從左往右)1111 0010。但是,
我們?cè)诰彌_器左端傳入的二進(jìn)制必須從高位往低位讀取。
比如,現(xiàn)在從左往右端口是1111 0010,但是P0輸入端輸入的是0100 1111,也就是P0=0x4F。
為了方便,這里總結(jié)數(shù)碼管段碼表:
②數(shù)碼管靜態(tài)顯示時(shí),只能讓其中一個(gè)數(shù)碼管發(fā)光。也就是說(shuō),在同一時(shí)間,上端接口只能保證有一個(gè)輸入0。(具體原因見(jiàn)“譯碼器”工作方法)
③譯碼器工作方法:
左端輸入端輸入的信號(hào)按CBA排序,組成一個(gè)三位的二進(jìn)制數(shù),再將這個(gè)二進(jìn)制數(shù)轉(zhuǎn)化為十進(jìn)制數(shù),這個(gè)十進(jìn)制數(shù)對(duì)應(yīng)右端輸出端的下標(biāo),這個(gè)輸出端將會(huì)輸出低電平。
比如輸入:A : 0 、B : 1 、C : 1,排序?yàn)?10,轉(zhuǎn)十進(jìn)制為6,Y6口(對(duì)應(yīng)LED7)將會(huì)輸出低電平,其他端口均輸出高電平。
二.數(shù)碼管靜態(tài)顯示
根據(jù)之前的講解,不難寫(xiě)出代碼了:
這個(gè)代碼可以讓數(shù)碼管LED3顯示數(shù)字“3”。
為了方便操作,我們將數(shù)碼管每一個(gè)位置的數(shù)字顯示封裝在函數(shù)中。
①首先,使用段碼表,初始化一個(gè)數(shù)組NixieTable,后面可以直接調(diào)用,顯示數(shù)字。
②其次用分支語(yǔ)句寫(xiě)出所有數(shù)碼光發(fā)光的情況。(P2端口)
當(dāng)然,我們可以把函數(shù)改的人性化一些。內(nèi)部LED1~8序號(hào)是從右往左的,我們?cè)趯?xiě)函數(shù)的時(shí)候,可以反一反。
三.數(shù)碼管動(dòng)態(tài)顯示
由于數(shù)碼管在同一時(shí)間只能靜態(tài)顯示一個(gè)數(shù)字,那么如果我們讓多個(gè)數(shù)字同時(shí)顯示,該怎么辦呢?
我們可以讓這些LED按順序以極高的頻率快速閃爍,在人眼看來(lái)就是同時(shí)顯示。
有了這樣的方法,我們先付諸實(shí)踐:(略去函數(shù)部分)
void main() {while(1){Nixie(1,1);Nixie(2,2);Nixie(3,3);} }但是,實(shí)際上的效果卻是:雖然顯示了321,但是每個(gè)數(shù)字不該點(diǎn)亮的燈條會(huì)有一些模糊的光泛出:
這顯然是不符合我們的預(yù)期的。原因是單片機(jī)在操作“段選->位選”的時(shí)候,速度很快,可能會(huì)篡位,導(dǎo)致順序錯(cuò)亂。
于是,我們?cè)跀?shù)碼管動(dòng)態(tài)顯示時(shí),還必須完成一步“消影”操作。
在Nixie函數(shù)中,每一次“位選->段選”操作完,在極短的時(shí)間之內(nèi),完成將P0清零(P0=0x00;)的操作。
void Nixie(int LED,int number) {char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};switch (LED) //CBA{ case 1: P2_4=0; P2_3=0; P2_2=0; break;case 2: P2_4=0; P2_3=0; P2_2=1; break;case 3: P2_4=0; P2_3=1; P2_2=0; break;case 4: P2_4=0; P2_3=1; P2_2=1; break;case 5: P2_4=1; P2_3=0; P2_2=0; break;case 6: P2_4=1; P2_3=0; P2_2=1; break;case 7: P2_4=1; P2_3=1; P2_2=0; break;case 8: P2_4=1; P2_3=1; P2_2=1; break;}P0=NixieTable[number];Delay(100); //<----------------------P0=0x00; //<----------------------- }這樣執(zhí)行之后,就不會(huì)出現(xiàn)殘影了。
總結(jié)
以上是生活随笔為你收集整理的【51单片机】(三)数码管(原理,静态、动态显示)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: essay--网页播放器代码大全
- 下一篇: 进程调度算法FCFS和RR