2、使用定時器T0,定時1秒,控制1個數(shù)碼管循環(huán)顯示數(shù)字0~9,每秒鐘數(shù)字加一。ORG 0000H
AJMP START
ORG 000BH ;T0中斷入口地址
AJMP INT_T0
ORG 0030H
START: MOV SP,#60H
MOV TMOD,#01H ;置T0為方式1
MOV TL0,#0B0H ;延時50mS的時間常數(shù)
MOV TH0,#3CH
MOV R0,#00H ;數(shù)碼管顯示單元
MOV R1,#20 ;定時次數(shù)
SETB TR0;啟動定時器1,開始定時
SETB ET0
SETB EA ;開中斷
Slop: acall display
SJMP Slop
INT_T0:;T0中斷服務(wù)子程序
PUSH ACC;保護(hù)現(xiàn)場
PUSH PSW
PUSH DPL
PUSH DPH
CLR TR0;關(guān)閉定時器1,停止定時
MOV TL0,#0B0H;延時50mS常數(shù)
MOV TH0,#3CH
DJNZ R1,EXIT
MOV R1,#20;重置定時次數(shù)
MOV A,R0
INC A ;數(shù)碼管顯示單元內(nèi)容加一
MOV R0,A
CJNE A,#10,EXIT
MOV R0,#00H ; 數(shù)碼管顯示單元清0
EXIT: SETB TR0;啟動定時器0,開始定時
POP DPH;恢復(fù)現(xiàn)場
POP DPL
POP PSW
POP ACC
RETI
;顯示子程序
display: mov a,R0
mov dptr,#numtab;指定查表啟始地址
MOVC A,@A+DPTR ;得到段碼
mov P0,a ; 段碼送P0口
clr P2.7 ;送位碼
acall delay1 ;延時10ms
setb P2.7
ret
;延時子程序
delay1:MOV R2,#20
L1: MOV R3,#248
DJNZ R3,$
DJNZ R2,L1
RET
;實驗板上的7段數(shù)碼管0~9數(shù)字的共陰顯示代碼
numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
END
3、使用軟件定時1秒,控制2個數(shù)碼管循環(huán)顯示秒數(shù)0~59,每秒鐘數(shù)字加一。
(1)在設(shè)計過程中使用一個存儲單元作為秒計數(shù)單元,當(dāng)一秒鐘到來時,就讓秒計數(shù)單元加1,當(dāng)秒計數(shù)達(dá)到60時,就自動返回到0,重新秒計數(shù)。
(2)對于秒計數(shù)單元中的數(shù)據(jù)要把它十位數(shù)和個數(shù)分開,方法一:采用對10整除和對10求余;方法二:采用分?jǐn)?shù)、合數(shù)法。
(3)在數(shù)碼管上顯示數(shù),通過查表的方式完成。
(4)一秒時間的產(chǎn)生采用軟件精確延時的方法來完成,經(jīng)過精確計算得到1秒時間為1.002秒。
方法一匯編源程序
;----------10毫秒延時子程序
DELY10ms: MOV R4,#20
D1: MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET
;-------主程序
Second EQU 30H
ORG 0
START: acall init
NEXT: acall display
Ljmp next
Init: MOV Second,#00H
ret
display: MOV R3,#50
dis2:MOV A,Second
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A ;送出十位數(shù)字的段碼
CLR p2.7 ;送位碼
Acall dely10ms
Setb p2.7
MOV A,B
MOVC A,@A+DPTR
MOV P0,A ;送出個位數(shù)字的段碼
CLR p2.6
LCALL DELY10mS
Setb p2.6
djnz r3,dis2 ;20毫秒循環(huán)執(zhí)行50次,時間約1秒
INC Second
MOV A,Second
CJNE A,#60,ret0
Mov Second,#00h
Ret0: ret
TABLE: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
END
方法二匯編程序:
temp equ 22h ;計數(shù)器個位和十位數(shù)值存放內(nèi)存位置
ORG 0000H ;程序執(zhí)行開始地址
LJMP START ;跳到標(biāo)號START執(zhí)行
;-------------------- 主程序 ---------------------------
START: mov temp,#0 ;初始化計數(shù)器,從0開始
stlop: acall display ;調(diào)用顯示子程序
acall add1 ;對計數(shù)器加1
mov a,temp
cjne a,#60H,next ;判斷計數(shù)器是否滿60?
mov temp,#0 ;滿60就清零重新開始
next: ljmp stlop ;不滿就循環(huán)執(zhí)行
;顯示子程序
display: mov r1,#50
dis1: mov a,temp ;將temp中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制
anl a,#0Fh
mov dptr,#numtab;指定查表啟始地址
MOVC A,@A+DPTR ;查數(shù)字的段碼
mov P0,a ;送出個位數(shù)字的段碼
clr P2.7 ;送出位碼
acall delay1 ;顯示10ms
setb P2.7 ;關(guān)閉位選
mov a,temp;將temp中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制
anl a,#0F0h
swap a
mov dptr,#numtab;指定查表啟始地址
MOVC A,@A+DPTR ;查數(shù)字的段碼
mov P0,a ;送出十位數(shù)字的段碼
clr P2.6 ;送位碼
acall delay1 ;顯示10ms
setb P2.6
djnz r1,dis1
ret
;延時子程序
delay1:MOV R2,#20
L1: MOV R3,#248
DJNZ R3,$
DJNZ R2,L1
RET
;加一子程序
add1: mov a,temp
inc a
da a
mov temp,a
ret
;實驗板上的7段數(shù)碼管0~9數(shù)字的共陰顯示代碼
numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
end
4、使用定時器T0,定時1秒,控制2個數(shù)碼管循環(huán)顯示秒數(shù)0~59,每秒鐘數(shù)字加一。
本題請大家參考前面的例題獨立完成。
1、說明實驗?zāi)康暮蛢?nèi)容。
2、畫出實驗電路原理圖,并簡要分析電路的執(zhí)行過程。
3、完成實驗內(nèi)容(4)的程序設(shè)計框圖并說明編程思想,并給出程序清單。
4、根據(jù)實驗內(nèi)容,調(diào)式程序,觀察、分析程序的運行過程。
5、給出實驗結(jié)果并進(jìn)行分析。
6、實驗體會。