想做一個60秒倒計時的單片機程序,晶振為11.0592,在用定時器0產生1S的時間時發現1s的時間產生不準,設定的時間為每50ms產生一次中斷,每20次秒減一,實際測試時,每20次秒減一大概為實際時間的7秒左右,每30次減一秒的時間和實際時間比較接近,想問一下是哪里出的問題,謝謝!
單片機匯編語言源程序如下:
SECOND EQU 30H
TCOUNT EQU 31H
ORG 0H
JMP START
ORG 0BH
JMP TIMER0
START: //初始化
SETB EA
SETB ET0
MOV TMOD,#01H
MOV TH0,#(65536-46080)/256
MOV TL0,#(65536-46080) MOD 256
SETB TR0
MOV DPTR,#LED ;數碼管顯示
MOV SECOND,#60 ;60S
MOV TCOUNT,#30
LOOP: //數碼管掃描
MOV A,SECOND
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0
LCALL DELAY
SETB P2.0
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P2.1
LCALL DELAY
SETB P2.1
JMP LOOP
DELAY: //延時
MOV R0,#2
D1: MOV R1,#50
DJNZ R1,$
DJNZ R0,D1
RET
TIMER0: //定時器0中斷
PUSH ACC
PUSH PSW
SETB RS0
MOV TH0,#(65536-46080)/256
MOV TL0,#(65536-46080) MOD 256
DEC TCOUNT
DJNZ TCOUNT,NEXT //產生1S時間
MOV A,SECOND
CJNE A,#00,NEXT1 //判斷60S是否減到0
MOV TCOUNT,#20
MOV SECOND,#60
POP PSW
POP ACC
RETI
NEXT:
POP PSW
POP ACC
RETI
NEXT1:
MOV TCOUNT,#30 //
DEC SECOND //秒減一
JMP NEXT
LED: //數碼管段碼
DB 0x3f
DB 0x06
DB 0x5b
DB 0x4f
DB 0x66
DB 0x6d
DB 0x7d
DB 0x07
DB 0x7f
DB 0x6f
END
|