數(shù)碼管,其實(shí)就是8個發(fā)光二極管按順序排列而成的,所以讓數(shù)碼管顯示特定的數(shù)字,只需要將該亮的二極管點(diǎn)亮,不該亮的滅了就好了。為了達(dá)到這個目的,就得參考電路圖了,51HEI開發(fā)板的電路圖在我的相冊里有,但是整張貼出來就太大了,所以這里只顯示部分。電路圖如下:
乍一看這張圖比較明顯的就是最左邊的單片機(jī)和兩個鎖存器U1和U2的引腳信息了,從D00到D07,兩個鎖存器是共用的,D00對應(yīng)輸出Y1和X1,D07對應(yīng)輸出Y8和X8。鎖存器,從它的名字大概就可以知道它的用途了!其作用就是有的引腳輸入改變的時候輸出保持之前的狀態(tài),達(dá)到鎖和存的效果(我目前的理解是這樣的,不理解的可以上網(wǎng)搜官方解釋)。查查74HC573是怎么用的,表格如下:
圖中引腳1代表輸出使能,11引腳代表鎖存使能。鎖存器嘛,打開鎖存,讓輸出使能引腳處于低電平,鎖存使能引腳輸入高電平,傳入對應(yīng)的D,然后再使鎖存使能引腳處于低電平,這樣就能讓輸出保持不變。使用的過程就是打開鎖,傳數(shù)據(jù),關(guān)鎖保持。
說完了鎖存器,回到第一張電路圖,途中的鎖存器1號引腳都接地,自然是低電平,11號引腳分別對應(yīng)單片機(jī)的D26和D27,所以控制U1和U2就靠這2個引腳啦!
按道理說,8個數(shù)碼管,應(yīng)該有8*8=64根線才對啊,而第一張圖中只有24個引腳,里面肯定有復(fù)用的引腳,所以不知道內(nèi)部電路是沒辦法寫滴,還好51HEI給的資料比較全。
2個LED管的內(nèi)部電路如下: ABCDEFG DP總共8個二極管,分別由11、7、4、2、1、10、5、3引腳控制,而1這8個引腳對應(yīng)第一個圖中的Y1到Y(jié)8,12、9、8、6呢則有兩組,一組是共陰極的數(shù)碼管,一組是共陽極的數(shù)碼管。12、9、8、6呢則對應(yīng)X1到X8,有2個,一組是X1到X4,一組是X4到X8,X1到X4是共陰極的,X5到X8是共陽極的。本實(shí)驗只讓共陰極的DIG1那個數(shù)碼管顯示數(shù)據(jù),把別的都關(guān)掉。那只要12(X1)引腳輸入低電平,986輸入高電平,其他的都不會亮了,讓DIG1顯示什么數(shù)字,就由Y1到Y(jié)7來決定了。
經(jīng)計算,讓DIG1顯示0到9還有小數(shù)點(diǎn)的表格如下:
uint8 table[11]={ 0x3f, 0x30, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x80 };
TH0和TL0呢分別代表計數(shù)器的高8位和低8位,加起來剛好16位,可以最大值是0~65535,總共65536個數(shù),當(dāng)TH0和TL0組成16位數(shù)等于65535時TF0就會被置1,也就是溢出,這種方法的計時公式是:12*X/晶振頻率=y; X=65536- z; y代表計時器溢出一次的時間,z表示設(shè)置TH0和TL0組成的16位數(shù)的值,而X則代表從z到65536總共有多少個數(shù),一般的晶振頻率有:6MHz,11.059MHz,12MHz,20MHz, 令X取極值,將上述晶振頻率代入式中,得出從計時開始到溢出最多能記錄的時間分別為130ms,71.1ms,65.5ms,39.3ms,明顯這些時間都比較短(相對1s),而且不規(guī)則,1s=1000ms=20*50ms=1000*1ms=40*25ms這種整數(shù)我們比較容易接受,也更容易計算,所以應(yīng)該令y為50等整數(shù),然后再去計算出z的值,讓TH0為z的高八位,TL0為z的第八位。假設(shè)晶振頻率是12MHz,讓y=50ms,計算得出z=15536=0x3CB0,則將TH0設(shè)為0x3C,TL0設(shè)為0xB0,TR0設(shè)為1,TMOD設(shè)為0×01,則到了50ms之后TF0就會變?yōu)?,通過判斷TF0溢出知道過了50ms,判斷完了之后要軟件(也就是代碼)對TF0清零,溢出之后TH0和TL0都會被清零,所以再將TH0和TL0設(shè)成0x3C和0xB0,每次溢出都記錄一次,記錄二十次之后就是過了1秒啦!1秒的定時就是這么來!額,估計被我繞暈了吧·····這個表達(dá)可能是有點(diǎn)問題,想看原版的,去看金沙灘工作室的視頻吧,我也是從那學(xué)的。
計時器的使用步驟總結(jié)如下:
一、設(shè)置TMOD
二、 設(shè)置TH0和TL1(事先計算好值。)
三、設(shè)置TR0
最終代碼如下: #include <reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit D24 = P2^4; sbit D25 = P2^5; sbit U1 = P2^6; //U1鎖存器的開關(guān) sbit U2 = P2^7; //U2鎖存器的開關(guān) sbit LINX1 = P0^0; sbit LINY5 = P0^4; sbit LINY6 = P0^5; uint8 table[11]={ 0x3f, 0x30, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x80 }; void main(void) { uint8 counter = 0; uint8 offset = 0; TH0 = 0x3C; TL0 = 0xB0; TR0 = 1; TMOD = 0x01; //計時模式選01模式 U2 = 1; P0 = 0xfe; U2 = 0; P0 = 0xff; D24 = 0; //關(guān)閉8X8點(diǎn)陣LED D25 = 0; while(1) { if(TF0==1) //每次計時是50ms,達(dá)到50ms后計時器0的溢出位位1,進(jìn)行軟件清零和計時器初始化. { counter++; TF0=0; TH0 = 0x3C; //12MHZ的晶振算出來是從15536開始計時,十六進(jìn)制就是 0x3CB0 TL0 = 0xB0; //高位取0x3C,低位取0xB0 } if(counter==20) //20*50ms=1000ms=1s { counter=0; U1 = 1; P0 = table[offset++]; U1 = 0; if(offset==11) { offset = 0; } } } }
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |