想做一个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
|