本程序是要求設定一個時間,精確到千分之一秒,從00.000--99.999秒可手動調整,手動調整有十個鍵,5個加5個減,按一下對應的位就加(減)1.時間設好開始計時,時間終結就產生中斷,并且在計時過程中還要顯示時間(倒計時).例如:設定時間為20.000,則一開始就顯示20.000秒,按了開關啟動后開始倒計時,并不斷顯示當前倒計時時間(從20.000一直到00.000),倒計時為0時產生中斷.
程序和電路原理圖如下:為了方便看程序,在程序中加了注釋
;==============================================
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設定為工作方式1
MOV TH0,#FCH
MOV TL0,#17H ;定時器初值為FC17H,即
;64535,當計數到65536時
;時器產生溢出中斷,共計數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 ;連續兩次檢測有無按鍵輸入,
;以消除按鍵抖動
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則表示對應的時間
;位加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則表示對應的時間
;位減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十進制數只用后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 ;確定已經手動置入了數則跳轉把定時數
;據保存,否則返回繼續等待輸入定時數
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 ;啟動計數器
CLR P2.7 ;點亮計數器指示燈
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 ;定時器每經過1001*12/12M=1001微秒則
;產生一次中斷,把手動置入的秒數減去
;0.001秒
PUSH PSW
MOV TH0,#FCH
MOV TL0,#17H
MOV A,R7 ;檢查最高位是否已經為0,為0則跳轉檢查
;次高位.
JZ BITE2
MOV A,R3 ;檢查最低位是否為0,不為0則跳轉進行操
;作減1,為0則檢查上一位是否可以借位
JNZ WRITE5
MOV A,R4 ;上一位為0則繼續檢查再上一位是否可借
;位,不為0則跳轉把上一位減1,把最低位
;置9
JNZ WRITE4
MOV A,R5 ;與上同理
JNZ WRITE3
MOV A,R6 ;與上同理
JNZ WRITE2
AJMP WRITE1
BITE2: MOV A,R6 ;檢查次高位是否已經為0,為0則跳轉檢查下一位.
JZ BITE3
MOV A,R3 ;檢查最低位是否為0,不為0則跳轉進行
;操作減1,為0則檢查上一位是否可以借位
JNZ WRITE5
MOV A,R4 ;上一位為0則繼續檢查再上一位是否可借
;位,不為0則跳轉把上一位減1,把最低位置9
JNZ WRITE4
MOV A,R5
JNZ WRITE3
AJMP WRITE2
BITE3: MOV A,R5 ;檢查第三位是否已經為0,為0則跳轉
;檢查第四位.
JZ BITE4
MOV A,R3
JNZ WRITE5
MOV A,R4
JNZ WRITE4
AJMP WRITE3
BITE4: MOV A,R4 ;檢查第四位是否已經為0,為0則跳轉
;最后位減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則
;中斷返回繼續
SETB P2.7 ;為0則定時時間已到,關閉定時器,并
;把手動置入的數再次調出準備下一次定時
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
;===========================================
請指正程序錯誤
全部回復(0)
正序查看
倒序查看
現在還沒有回復呢,說說你的想法