用單片機(jī)設(shè)計(jì)15s倒計(jì)時(shí)器
/*
跳線設(shè)置:默認(rèn)跳線位置,注意蜂鳴器選擇跳線J5要選23端
程序效果:利用單片機(jī)的定時(shí)/計(jì)數(shù)器設(shè)計(jì)一個(gè)15到0倒計(jì)時(shí)器,
按S4后啟動(dòng),要求精確顯示到百分之一秒。
發(fā)揮部分:
1、定時(shí)結(jié)束后有提示音報(bào)警,并可重新定時(shí)
2、定時(shí)過(guò)程中按獨(dú)立鍵盤(pán)s5可暫停,按S4繼續(xù)
運(yùn)行環(huán)境:51hei單片機(jī)學(xué)習(xí)板
*/
ORG 0000H
LJMP START //主程序必須避開(kāi)地址000BH
ORG 000BH //定時(shí)器0的中段服務(wù)程序,起始地址為000BH
LJMP IT00
ORG 0030H
START: MOV TH0,#0EBH //裝入初始值,定時(shí)時(shí)間為10ms
MOV TL0,#64H
MOV TMOD,#01H //工作方式1
MOV 33H,#01 //顯示初值為15s
MOV 32H,#05
MOV 31H,#00
MOV 30H,#00
SETB ET0 //打開(kāi)定時(shí)0
SETB EA //開(kāi)總中斷
LOOP1: JB P3.6,LOOP //判斷高低位,即按鍵KEY0是否按 下
LCALL DISPLAY //為低,即按鍵按下,延時(shí)消抖
LCALL DISPLAY
JB P3.6,LOOP //按鍵真的按下,并不是外界的干擾
SETB TR0 //啟動(dòng)定時(shí)器
HERE: LCALL DISPLAY //調(diào)用顯示
JB P3.7,LOOP3 //判斷高低,即KEY1按鍵是否按下
CLR TR0 //按下,關(guān)閉定時(shí)器,這里并沒(méi)有消抖
LJMP LOOP1 //等待KEY0的按下
LOOP3: SJMP HERE //KEY1沒(méi)有按下,就需顯示
LOOP: LCALL DISPLAY //KEY1沒(méi)有按下,就需顯示
LJMP LOOP1
//減10ms子程序
SUB1: DEC 30H //百分位減1
MOV A,30H
CJNE A,#0FFH,LOOP2 //判斷百分位減到0之后是否 再減1
MOV 30H,#09 //是,裝入初值9
DEC 31H //十分位減1
MOV A,31H
CJNE A,#0FFH,LOOP2 //判斷百分位減到0之后是否 再減1
MOV 31H,#09
DEC 32H
MOV A,32H
CJNE A,#0FFH,LOOP2
MOV 32H,#09
DEC 33H
MOV A,33H
CJNE A,#0FFH,LOOP2
clr P2.2 //從15s減到0s后,驅(qū)動(dòng)蜂鳴器
LCALL DELAY //延時(shí)
LCALL DELAY
SETB P2.2 //關(guān)閉蜂鳴器
MOV 33H,#01 //裝入初值15s
MOV 32H,#05
MOV 31H,#00
MOV 30H,#00
LOOP2: NOP //空指令
RET //返回
//顯示子程序
DISPLAY: MOV DPTR,#TAB //賦表首地址
MOV A,#0FBH
SETB P2.7
MOV P0,A //亮最左邊的數(shù)碼管
CLR P2.7
XCH A,R0 //暫存A的值
MOV A,33H
MOVC A,@A+DPTR //根據(jù)表值查找所需的值
SETB P2.6
MOV P0,A //顯示值
CLR P2.6
LCALL DELAY //延時(shí)
XCH A,R0 //恢復(fù)原值
RL A //循環(huán)左移,為下次做準(zhǔn)備
SETB P2.7
MOV P0,A
CLR P2.7
XCH A,R0
MOV A,32H
MOVC A,@A+DPTR
SETB P2.6
MOV P0,A
CLR P2.6
LCALL DELAY
XCH A,R0
RL A
SETB P2.7
MOV P0,A
clr P2.7
XCH A,R0
MOV A,31H
MOVC A,@A+DPTR
SETB P2.6
MOV P0,A
clr P2.6
LCALL DELAY
XCH A,R0
RL A
SETB P2.7
MOV P0,A
clr P2.7
XCH A,R0
MOV A,30H
MOVC A,@A+DPTR
SETB P2.6
MOV P0,A
clr P2.6
LCALL DELAY
RET
TAB: DB 3FH,06H,5BH,4FH,66H ;數(shù)碼管顯示的數(shù)值
DB 6DH,7DH,07H,7FH,6FH
IT00: MOV TH0,#0EBH //裝入初值,時(shí)間為10ms
MOV TL0,#64H
LCALL SUB1 //減10ms
RETI //返回
DELAY: MOV R7,#04 //延時(shí)子程序,時(shí)間大約為:2us*4*250
DEL2: MOV R6,#250
DEL1: DJNZ R6,DEL1
DJNZ R7,DEL2
RET
END //結(jié)束
評(píng)論