日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【51单片机】(三)数码管(原理,静态、动态显示)

發(fā)布時(shí)間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【51单片机】(三)数码管(原理,静态、动态显示) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.數(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”。

#include<regx52.h> void main() {P2_4=0; P2_3=1; P2_2=0; //CBA:010P0=0x4F; //OUTPUT 3:abcdg -> 1111 0010 -> 0100 1111 -> 0x4Fwhile(1){} }

為了方便操作,我們將數(shù)碼管每一個(gè)位置的數(shù)字顯示封裝在函數(shù)中。
①首先,使用段碼表,初始化一個(gè)數(shù)組NixieTable,后面可以直接調(diào)用,顯示數(shù)字。
②其次用分支語(yǔ)句寫(xiě)出所有數(shù)碼光發(fā)光的情況。(P2端口)

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]; }

當(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。