本程序是要求設(shè)定一個時間,精確到千分之一秒,從00.000--99.999秒可手動調(diào)整,手動調(diào)整有十個鍵,5個加5個減,按一下對應(yīng)的位就加(減)1.時間設(shè)好開始計時,時間終結(jié)就產(chǎn)生中斷,并且在計時過程中還要顯示時間(倒計時).例如:設(shè)定時間為20.000,則一開始就顯示20.000秒,按了開關(guān)啟動后開始倒計時,并不斷顯示當(dāng)前倒計時時間(從20.000一直到00.000),倒計時為0時產(chǎn)生中斷.
程序和電路原理圖如下:為了方便看程序,在程序中加了注釋
;==============================================
ORG 0000H
LJMP START
;===========================================
ORG 0003H
MOV R7,A
MOV R7,A
MOV R7,A
MOV R7,A
MOV R7,A
MOV R7,A
MOV R7,A
MOV R7,A
TIME: LJMP INTERRUPT
;===========================================
START: MOV SP,#5FH
MOV TMOD,#01H ;定時器0設(shè)定為工作方式1
MOV TH0,#FCH
MOV TL0,#17H ;定時器初值為FC17H,即
;64535,當(dāng)計數(shù)到65536時
;時器產(chǎn)生溢出中斷,共計數(shù)1001次
SETB EA
SETB ET0
MOV R7,#00H
MOV R6,#00H
MOV R5,#00H
MOV R4,#00H
MOV R3,#00H
MOV P1,#FFH
MOV P2,#FFH
MOV P3,#FFH
CLR 24H.0
DETECT: ACALL DISPLAY ;連續(xù)兩次檢測有無按鍵輸入,
;以消除按鍵抖動
MOV A,#FEH
MOV P1,A
ACALL DELAY
MOV A,P1
ORL A,#03H
CPL A
JNZ DETECT0
ACALL DISPLAY
MOV A,#FDH
MOV P1,A
ACALL DELAY
MOV A,P1
ORL A,#03H
CPL A
JNZ DETECT1
DETECT0:ACALL DISPLAY
MOV A,#FEH
MOV P1,A
ACALL DELAY
MOV A,P1
ORL A,#03H
CPL A
JNZ JUDGE0
DETECT1:ACALL DISPLAY
MOV A,#FDH
MOV P1,A
ACALL DELAY
MOV A,P1
ORL A,#03H
CPL A
JNZ JUDGE1
AJMP DETECT
JUDGE0: CJNE A,#04H,NEXT ;判斷哪一位為1則表示對應(yīng)的時間
;位加1
AJMP TENA
NEXT: CJNE A,#08H,NEXT1
AJMP ONEA
NEXT1: CJNE A,#10H,NEXT2
AJMP POINT1A
NEXT2: CJNE A,#20H,NEXT3
AJMP POINT2A
NEXT3: CJNE A,#40H,NEXT4
AJMP POINT3A
NEXT4: CJNE A,#80H,BACK
AJMP SAVE
BACK: AJMP DETECT
JUDGE1: CJNE A,#04H,NEXT0 ;判斷哪一位為1則表示對應(yīng)的時間
;位減1
AJMP TEND
NEXT0: CJNE A,#08H,NEXT5
AJMP ONED
NEXT5: CJNE A,#10H,NEXT6
AJMP POINT1D
NEXT6: CJNE A,#20H,NEXT7
AJMP POINT2D
NEXT7: CJNE A,#40H,NEXT8
AJMP POINT3D
NEXT8: CJNE A,#80H,BACK
AJMP SAVE
RELESE: ACALL DISPLAY ;確定按鍵是否釋放
MOV A,P1
ORL A,#03H
CPL A
JNZ RELESE
AJMP DETECT
POINT3A:JB 24H.0,RELESE
CLR C
MOV A,R3
ADD A,#01H
DA A
ANL A,#0FH ;BCD十進制數(shù)只用后4位,前4位清0以防
;出錯
MOV R3,A
AJMP RELESE
POINT2A:JB 24H.0,RELESE
CLR C
MOV A,R4
ADD A,#01H
DA A
ANL A,#0FH
MOV R4,A
AJMP RELESE
POINT1A:JB 24H.0,RELESE
CLR C
MOV A,R5
ADD A,#01H
DA A
ANL A,#0FH
MOV R5,A
AJMP RELESE
ONEA: JB 24H.0,RELESE
CLR C
MOV A,R6
ADD A,#01H
DA A
ANL A,#0FH
MOV R6,A
AJMP RELESE
TENA: JB 24H.0,RELESE
CLR C
MOV A,R7
ADD A,#01H
DA A
ANL A,#0FH
MOV R7,A
AJMP RELESE
POINT3D:JB 24H.0,RELESE
CLR C
MOV A,R3
DEC A,#01H
ANL A,#0FH
MOV R3,A
AJMP RELESE
POINT2D:JB 24H.0,RELESE
CLR C
MOV A,R4
DEC A,#01H
ANL A,#0FH
MOV R4,A
AJMP RELESE
POINT1D:JB 24H.0,RELESE
CLR C
MOV A,R5
DEC A,#01H
ANL A,#0FH
MOV R5,A
AJMP RELESE
ONED: JB 24H.0,RELESE
CLR C
MOV A,R6
DEC A,#01H
ANL A,#0FH
MOV R6,A
AJMP RELESE
TEND: JB 24H.0,RELESE
CLR C
MOV A,R7
DEC A,#01H
ANL A,#0FH
MOV R7,A
AJMP RELESE
SAVE: MOV A,R7 ;確定已經(jīng)手動置入了數(shù)則跳轉(zhuǎn)把定時數(shù)
;據(jù)保存,否則返回繼續(xù)等待輸入定時數(shù)
JNZ DONE
MOV A,R6
JNZ DONE
MOV A,R5
JNZ DONE
MOV A,R4
JNZ DONE
MOV A,R3
JNZ DONE
AJMP RELESE
DONE: MOV 37H,R7
MOV 36H,R6
MOV 35H,R5
MOV 34H,R4
MOV 33H,R3
SETB TR0 ;啟動計數(shù)器
CLR P2.7 ;點亮計數(shù)器指示燈
SETB 24H.0
WAIT: ACALL DISPLAY
JB 24H.0,WAIT
AJMP RELESE
DISPLAY:SETB P2.4 ;以掃描顯示方式顯示時間
SETB P2.3
SETB P2.2
SETB P2.1
SETB P2.0
MOV DPTR,#DATAS
MOV A,R7
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4
ACALL DELAY
SETB P2.4
MOV A,R6
MOVC A,@A+DPTR
MOV P0,A
CLR P0.7
CLR P2.3
ACALL DELAY
SETB P2.3
MOV A,R5
MOVC A,@A+DPTR
MOV P0,A
CLR P2.2
ACALL DELAY
SETB P2.2
MOV A,R4
MOVC A,@A+DPTR
MOV P0,A
CLR P2.1
ACALL DELAY
SETB P2.1
MOV A,R3
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0
ACALL DELAY
SETB P2.0
RET
;===========================================
DELAY: MOV R1,#02H ;延時程序
LOOP: MOV R2,#FAH
DJNZ R2,$
DJNZ R1,LOOP
RET
;===========================================
DATAS: DB C0H,F9H,A4H,B0H,99H,92H,82H,F8H ;七段BCD譯
;碼顯示表
DB 80H,90H
;===========================================
INTERRUPT:PUSH A ;定時器每經(jīng)過1001*12/12M=1001微秒則
;產(chǎn)生一次中斷,把手動置入的秒數(shù)減去
;0.001秒
PUSH PSW
MOV TH0,#FCH
MOV TL0,#17H
MOV A,R7 ;檢查最高位是否已經(jīng)為0,為0則跳轉(zhuǎn)檢查
;次高位.
JZ BITE2
MOV A,R3 ;檢查最低位是否為0,不為0則跳轉(zhuǎn)進行操
;作減1,為0則檢查上一位是否可以借位
JNZ WRITE5
MOV A,R4 ;上一位為0則繼續(xù)檢查再上一位是否可借
;位,不為0則跳轉(zhuǎn)把上一位減1,把最低位
;置9
JNZ WRITE4
MOV A,R5 ;與上同理
JNZ WRITE3
MOV A,R6 ;與上同理
JNZ WRITE2
AJMP WRITE1
BITE2: MOV A,R6 ;檢查次高位是否已經(jīng)為0,為0則跳轉(zhuǎn)檢查下一位.
JZ BITE3
MOV A,R3 ;檢查最低位是否為0,不為0則跳轉(zhuǎn)進行
;操作減1,為0則檢查上一位是否可以借位
JNZ WRITE5
MOV A,R4 ;上一位為0則繼續(xù)檢查再上一位是否可借
;位,不為0則跳轉(zhuǎn)把上一位減1,把最低位置9
JNZ WRITE4
MOV A,R5
JNZ WRITE3
AJMP WRITE2
BITE3: MOV A,R5 ;檢查第三位是否已經(jīng)為0,為0則跳轉(zhuǎn)
;檢查第四位.
JZ BITE4
MOV A,R3
JNZ WRITE5
MOV A,R4
JNZ WRITE4
AJMP WRITE3
BITE4: MOV A,R4 ;檢查第四位是否已經(jīng)為0,為0則跳轉(zhuǎn)
;最后位減1.
JZ BITE5
MOV A,R3
JNZ WRITE5
AJMP WRITE4
BITE5: MOV A,R3 ;前四位都為0,只有最低位不為0,則
;把最低位減1
DEC A
MOV R3,A
JNZ RETURN ;最低位減1后是否也已為0,不為0則
;中斷返回繼續(xù)
SETB P2.7 ;為0則定時時間已到,關(guān)閉定時器,并
;把手動置入的數(shù)再次調(diào)出準備下一次定時
CLR 24H.0
CLR TR0
MOV R7,37H
MOV R6,36H
MOV R5,35H
MOV R4,34H
MOV R3,33H
MOV TH0,#FCH
MOV TL0,#17H
AJMP RETURN
WRITE5: MOV A,R3 ;最低位減1
DEC A
MOV R3,A
AJMP RETURN
WRITE4: MOV R3,#09H ;次低位借1,最低位置9
MOV A,R4
DEC A
MOV R4,A
AJMP RETURN
WRITE3: MOV R3,#09H ;第三位借1,低兩位都置9
MOV R4,#09H
MOV A,R5
DEC A
MOV R5,A
AJMP RETURN
WRITE2: MOV R3,#09H ;次高位借1,后三位都置9
MOV R4,#09H
MOV R5,#09H
MOV A,R6
DEC A
MOV R6,A
AJMP RETURN
WRITE1: MOV R3,#09H ;最高位借1,后四位都置9
MOV R4,#09H
MOV R5,#09H
MOV R6,#09H
MOV A,R7
DEC A
MOV R7,A
RETURN: POP PSW
POP ACC
RETI
;===========================================
請指正程序錯誤
全部回復(fù)(0)
正序查看
倒序查看
現(xiàn)在還沒有回復(fù)呢,說說你的想法