小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

51入門系列教程| 華麗的顯示(數(shù)碼管篇)

 Zmflc 2016-04-28

今天咱聊聊數(shù)碼管,其實(shí)數(shù)碼管這個(gè)器件,本身沒(méi)有什么好討論的。為什么這里作為單獨(dú)一節(jié)拿出來(lái)討論呢?個(gè)人認(rèn)為,這個(gè)小東西雖然簡(jiǎn)單,實(shí)際使用過(guò)程中,其實(shí)包含了很多。單片機(jī)知識(shí)以外的內(nèi)容,譬如一些簡(jiǎn)單的編程技巧、編程與實(shí)際現(xiàn)象的關(guān)聯(lián),非常值得入門者認(rèn)真思考。因?yàn)樵诮窈蟮碾娮又飞?,遇到的情況會(huì)比這個(gè)復(fù)雜得多。所以建立一種分析問(wèn)題解決問(wèn)題的方法和思考,比掌握一種單片機(jī)或者一種外設(shè)要重要得多。

先來(lái)看看啥是數(shù)碼管吧,其實(shí)數(shù)碼管就是幾個(gè)LED并聯(lián)的產(chǎn)物,看下圖的數(shù)碼管:

51入門系列教程| 華麗的顯示(數(shù)碼管篇)

這是一個(gè)常用的二位8段數(shù)碼管,可以看到有7個(gè)段位和1個(gè)小數(shù)點(diǎn),其實(shí)對(duì)于每一個(gè)段位,內(nèi)部都有與之對(duì)應(yīng)的一個(gè)LED。

51入門系列教程| 華麗的顯示(數(shù)碼管篇)

上圖中右上角給出了每個(gè)段位的稱號(hào),分別是abcdefg和dp,dp指的就是小數(shù)點(diǎn)。上圖中的03621A和03621B說(shuō)明的就是:這8個(gè)LED在內(nèi)部的連接方式。值得注意的是,03621A中,所有LED的陽(yáng)極都連接到了一起,稱之為共陽(yáng)極數(shù)碼管。不難判斷,abcdefg和dp需要給個(gè)低電平,才能使得LED導(dǎo)通發(fā)光。03621B中,所有LED的陰極都連接到了一起,稱之為共陰極數(shù)碼管。不難判斷,abcdefg和dp需要給個(gè)高電平,才能使得LED導(dǎo)通發(fā)光;因?yàn)檫@是個(gè)兩位的數(shù)碼管,所以還設(shè)置了DIG1和DIG2來(lái)控制那位數(shù)碼管進(jìn)行顯示。

舉個(gè)栗子:在共陽(yáng)極數(shù)碼管中,陽(yáng)極連接到電源。如果要顯示數(shù)字“1”,那么就需要a和c這兩個(gè)段位一個(gè)低電平,其它為高,使得這兩段位的LED發(fā)光即可。So,a-g的編碼就是0101111,以此類推,0-9均可以通過(guò)abcdefg的賦值來(lái)通過(guò)顯示。小數(shù)則可以通過(guò)dp段的賦值來(lái)顯示。好玩一點(diǎn)的話,整個(gè)16進(jìn)制0-f都可以顯示,特別值得一提的是。共陰極和共陽(yáng)極的輸入編碼是不一樣的在共陽(yáng)極數(shù)碼管中,如果要顯示數(shù)字“1”,a-g分別輸入0101111 。而在共陽(yáng)陰極數(shù)碼管中,如果要顯示數(shù)字“1”,a-g分別輸入1010000。

到這里,數(shù)碼管的內(nèi)部結(jié)構(gòu)應(yīng)該有了個(gè)大致的了解,來(lái)一起玩玩吧。上個(gè)洞洞板圖

51入門系列教程| 華麗的顯示(數(shù)碼管篇)

背部飛線,焊接功底比較差,請(qǐng)隨性鄙視

51入門系列教程| 華麗的顯示(數(shù)碼管篇)上個(gè)原理圖吧

51入門系列教程| 華麗的顯示(數(shù)碼管篇)

三極管在這里不是用于信號(hào)放大,而是作為一個(gè)開(kāi)關(guān)器件,完成對(duì)位的選通。其余每個(gè)段位都使用1k左右的電阻作為限流,這個(gè)限流電阻值的選取,需要考慮端口的灌電流能力。特別注意a-dp,完全使用P2的8個(gè)端口,加上P1.7,總共消耗9個(gè)IO口

上代碼

#include

sbit smgbit1 = P1^7;

sbit smgbit2 = P1^6;

disp_cache[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};

void delay_ms(unsigned int xms)

{

unsigned int i,j;

for(i=xms;i>0;i--)

{

for(j=124;j>0;j--);

}

}

void main()

{ unsigned char i;

smgbit1 = 1;

smgbit2 = 0;

while(1){

for(i = 0;i <= 9;i++)="">

P2 = disp_cache[i];

delay_ms(250);

}

}

}

這段代碼里面有個(gè)數(shù)組disp_cache,第一個(gè)元素disp_cache[0]=0xC0,換做二進(jìn)制便是1100 0000。

對(duì)照數(shù)碼管的段位,dp至a的電平便是1100 0000,abcdef都亮,g和dp不亮,也就形成的數(shù)字“0”。以此類推,disp_cache[1]- disp_cache[9]則分別代表了數(shù)字“1”-“9”,所以,咱進(jìn)行數(shù)碼管顯示的時(shí)候

只需要關(guān)注disp_cache[i]里面i這個(gè)變量就行了。方便不少,這種簡(jiǎn)單有效的編程技巧,會(huì)有助于代碼更加簡(jiǎn)潔,主函數(shù)里面。將smgbit,也就是p1.7位置1。這個(gè)時(shí)候,DIG1端口的三極管導(dǎo)通。DIG1口相當(dāng)于直接連接至Vcc,而DIG2則與Vcc斷開(kāi)。然后在for循環(huán)里面,每500ms對(duì)i從0-9自加操作。同時(shí)在P2口輸出disp_cache[i],也就是數(shù)碼管從0-9進(jìn)行顯示,看實(shí)際運(yùn)行情況

51入門系列教程| 華麗的顯示(數(shù)碼管篇)這樣就完成了一個(gè)基礎(chǔ)的數(shù)碼管顯示,但是回頭想想.咱這可是2位的數(shù)碼管喲!如果按照這種顯示方式,同時(shí)顯示2位的話,需要占用8+1+8+1=18個(gè)IO口.單片機(jī)硬件資源消耗情況實(shí)在太夸張了.

如何解決?

一是采用ASIC來(lái)驅(qū)動(dòng)數(shù)碼管,這種方式一來(lái)會(huì)增加硬件成本,二來(lái)要研究ASIC復(fù)雜的協(xié)議.另外一種就是掃描的顯示方式了,所謂掃描顯示,就是利用人眼的視覺(jué)暫留原理'.這個(gè)原理在現(xiàn)實(shí)生活中用的非常廣泛,譬如電源、搖搖棒等等!每次只顯示一位數(shù)碼管,在ms的時(shí)間內(nèi)進(jìn)行切換.譬如要顯示”13”,那就先顯示1,再切換顯示3.切換時(shí)間不超過(guò)十多ms的話,人眼會(huì)認(rèn)為是同時(shí)顯示的.這種方式可以較少IO口的使用,同時(shí)降低功耗

上個(gè)代碼

#include

sbit smgbit1 = P1^7;

sbit smgbit2 = P1^6;

smgdisp_cache[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};

unsigned int count,timer_count;

void init()

{

smgbit1 = 0;

smgbit2 = 1;

TMOD=0x01;//設(shè)置定時(shí)器0為工作方式1

TH0=0xfc;

TL0=0X66;

EA=1;//開(kāi)總中斷

ET0=1;//開(kāi)定時(shí)器0中斷

TR0=1;//啟動(dòng)定時(shí)器0

}

void SMG_Dis()

{

if(smgbit1){

P2 = smgdisp_cache[count%10];//求余,取個(gè)位數(shù)顯示

}

if(smgbit2){

P2 = smgdisp_cache[count/10];//求商,取十位數(shù)顯示

}

}

void time0() interrupt 1

{

timer_count++;

if(timer_count == 100)

{count++;

timer_count = 0;

}

smgbit1 = ~smgbit1;

smgbit2 = ~smgbit2;

if(count>99){count = 0;}

SMG_Dis();

TF0 = 0;

TH0 = 0xfc;

TL0 = 0x66;

}

void main()

{ init();

while(1){

}

}

在這段代碼中,Init()用于初始化定時(shí)器,1ms中斷,同時(shí)兩位數(shù)碼管只有其中一位可以顯示.SMG_Dis()用于進(jìn)行掃描顯示,如果smgbit1和smgbit2.哪個(gè)選通,哪個(gè)就進(jìn)行顯示,中斷服務(wù)函數(shù)中,處理定時(shí)器事宜,每100ms進(jìn)行一次自加.并且每次中斷都將smgbit1和smgbit2取反,保證每次只顯示其中一位.看看運(yùn)行效果

51入門系列教程| 華麗的顯示(數(shù)碼管篇)上面的動(dòng)圖中,基本計(jì)數(shù)顯示的功能是達(dá)到了,但是,似乎個(gè)位的走動(dòng)會(huì)影響到十位的顯示.其實(shí)就是數(shù)碼管在刷新下一個(gè)數(shù)據(jù)時(shí),上次的數(shù)據(jù)會(huì)留有余暉導(dǎo)致的.也就是傳說(shuō)中的數(shù)碼管鬼影.鬼影的消除,無(wú)非就是兩種,加延時(shí)和數(shù)據(jù)清零.這里使用數(shù)據(jù)清零的辦法,把中斷函數(shù)做個(gè)簡(jiǎn)單處理

void time0() interrupt 1

{ P2 = 0xff; //消除鬼影

timer_count++;

if(timer_count == 100)

{count++;

timer_count = 0;

}

smgbit1 = ~smgbit1;

smgbit2 = ~smgbit2;

if(count>99){count = 0;}

SMG_Dis();

TF0 = 0;

TH0 = 0xfc;

TL0 = 0x66;

}

增加一句P2 = 0xff;及時(shí)對(duì)數(shù)碼管的顯示數(shù)據(jù)進(jìn)行清零.用來(lái)對(duì)暫態(tài)數(shù)據(jù)進(jìn)行清除

看效果

51入門系列教程| 華麗的顯示(數(shù)碼管篇)可以看出來(lái),基本上殘影都被消除掉了.其實(shí)鬼影的出現(xiàn),并非是代碼思路有問(wèn)題.而是一些外部器件的特性使然.今后碰到的器件,很可能會(huì)有類似的情況.養(yǎng)成遇山開(kāi)路、遇水搭橋的思維習(xí)慣,才是學(xué)習(xí)單片機(jī)的捷徑.

Ok,今天就討論到這里.

了解更多51系列教程,請(qǐng)關(guān)注“云漢電子社區(qū)”官方微信公眾號(hào),關(guān)注后回復(fù)'活動(dòng)'可免費(fèi)參與社區(qū)最新活動(dòng),有機(jī)會(huì)獲得電子類圖書(shū)以及京東購(gòu)物卡!


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多