|
|
| <!--插入廣告JS代碼--> |
實驗任務(wù)
學(xué)會數(shù)碼管的顯示原理及編程。
實驗設(shè)備:
本實驗可在本站的:成功一號、新動2005、精簡型2004、ISP下載型等學(xué)習(xí)套件上直接操作。
相關(guān)常識說明:
用單片機進行數(shù)碼顯示應(yīng)具有顯示器件;應(yīng)用最廣泛的是7段數(shù)碼管。習(xí)慣上說是7段,實際含小數(shù)點是8段;下面我們稱其為段數(shù)碼管。

段數(shù)碼管的段排列和內(nèi)結(jié)構(gòu)見下圖:
段排列

內(nèi)部接線圖
段數(shù)碼管從內(nèi)部接線上分共陽和共陰兩種;上圖左為共陰,右為共陽。在電路設(shè)計時應(yīng)根據(jù)情況決定采用共陽或共陰,其基本原則是:若單片機io口直接驅(qū)動數(shù)碼管個段,最好采用共陽數(shù)碼管,因為51單片機io口輸出高電平時輸出的電流很小,數(shù)碼管不會太亮;若數(shù)碼管是通過驅(qū)動芯片與單片機相連的,就要看驅(qū)動芯片對數(shù)碼管極性的要求啦。
電路原理圖:(單片機沒畫出)

這里的數(shù)碼管直接用單片機p0口驅(qū)動,v2、v3是各數(shù)碼管公共陽極的控制三極管,r3~r5和r13~r16是數(shù)碼管個段LED的限流電阻。當(dāng)A、B、C、D、E、F、G、DP 端接低電平,p2.0也為地電平時,L9 數(shù)碼管各段全部點亮;若p2.0=1,p2.1=0則LED10各段全部點亮。
下面我們來寫一段程序,讓一位數(shù)碼管顯示數(shù)字
star: mov dptr,#numtab ;指定查表啟始地址
mov a,#3 ;顯示3,你可以改變該數(shù)顯示
MOVC A,@A+DPTR
mov p0,a
clr p2.0 ;開個位顯示
ljmp $
;段數(shù)碼管各劃的數(shù)字排列表
numtab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h ;顯示內(nèi)容的對應(yīng)代碼
;0 1 2 3 4 5 6 7 8 9 ;顯示內(nèi)容
db 88h,83h,0c6h,0a1h,86h,8eh
; a b c d e f
end
在前一節(jié)講過,數(shù)碼管各段加的電平不同,會顯示不同的圖形;那么,要想數(shù)碼管顯示“1”,就必須使數(shù)碼管“B”“C”段點亮,其他段熄滅;由于共陽數(shù)碼管是0電平點亮段,高電平熄滅段。即:
“DP G F E D C B A” 也就是說,將數(shù)碼管從 DP--A 各段按順序排列,其高低電平應(yīng)呈現(xiàn)二進制“11111001”狀態(tài),換算成十六進制就是“F9H”;顯然,你想顯示的所有數(shù)字和字符,都必須這樣一一對應(yīng)的轉(zhuǎn)換成十六進制數(shù)據(jù)。其他數(shù)字字符的hex代碼見程序的 numtab 表。
遺憾的是,這些hex代碼是沒有規(guī)律可尋的,我們只有先將所希望顯示的數(shù)字字符的hex代碼制成表格,在需要顯示某個數(shù)字字符時進行表格查詢,查詢到對應(yīng)代碼后再將代碼送數(shù)碼管顯示,這樣,我們希望顯示并能理解的數(shù)字字符就顯示了出來。
本實驗程序在開始就將顯示代碼表的基地址賦給dptr,第二句是準(zhǔn)備查找數(shù)字“3”的段代碼,也就是準(zhǔn)備讓數(shù)碼管顯示“3”!癕OVC A,@A+DPTR”是將累加器acc中當(dāng)前的數(shù)據(jù)加上dptr的數(shù)據(jù),作為查表地址,并將這個地址中的數(shù)據(jù)傳送到累加器acc覆蓋原數(shù)據(jù)。acc中現(xiàn)在的數(shù)據(jù)就是“3”的段代碼數(shù)據(jù)。
第4句是將“3”的段代碼數(shù)據(jù)送p0驅(qū)動數(shù)碼管顯示;第5句是打開LED9的公共陽極;第6句是跳轉(zhuǎn)到當(dāng)前行,也就是說程序一直在本行循環(huán)。
改變第二句 #號后面的數(shù),將更改顯示內(nèi)容。但#號后的數(shù)不能大于15,因numtab表中不包括“0”只有15格可查的數(shù)據(jù)!
通過前面的學(xué)習(xí),大家對數(shù)碼管的顯示原理已很清楚,下面這段程序請大家自行分析:
a_bit equ 20h ;個位數(shù)存放處
b_bit equ 21h ;十位數(shù)存放處
temp equ 22h ;計數(shù)器寄存器
star: mov temp,#0 ;初始化計數(shù)器
stlop: acall display
inc temp
mov a,temp
cjne a,#100,next ;=100重來
mov temp,#0
next: ljmp stlop
;顯示子程序
display: mov a,temp ;將temp中的十六進制數(shù)轉(zhuǎn)換成10進制
mov b,#10 ;10進制/10=10進制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;個位在b
mov dptr,#numtab ;指定查表啟始地址
mov r0,#4
dpl1: mov r1,#250 ;顯示1000次
dplop: mov a,a_bit ;取個位數(shù)
MOVC A,@A+DPTR ;查個位數(shù)的7段代碼
mov p0,a ;送出個位的7段代碼
clr p2.0 ;開個位顯示
acall d1ms ;顯示1ms
setb p2.0
mov a,b_bit ;取十位數(shù)
MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
mov p0,a ;送出十位的7段代碼
clr p2.1 ;開十位顯示
acall d1ms ;顯示1ms
setb p2.1
djnz r1,dplop ;100次沒完循環(huán)
djnz r0,dpl1 ;4個100次沒完循環(huán)
ret
;1MS延時(按12MHZ算)
;====================================================
D1MS: MOV R7,#80
DJNZ R7,$
RET
;7段數(shù)碼管各劃的數(shù)字排列表
numtab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h
;0 1 2 3 4 5 6 7 8 9
db 88h,83h,0c6h,0a1h,86h,8eh
;a b c d e f
end
關(guān)于數(shù)碼管的靜態(tài)顯示及動態(tài)顯示原理,我們在后面會單獨的實驗講解。這里只是給大家一個基礎(chǔ)的認識。