标题:
汇编用单片机定时器0产生1s时间不准
[打印本页]
作者:
心灵的尘埃
时间:
2019-7-28 15:44
标题:
汇编用单片机定时器0产生1s时间不准
想做一个60秒倒计时的单片机程序,晶振为11.0592,在用定时器0产生1S的时间时发现1s的时间产生不准,设定的时间为每50ms产生一次中断,每20次秒减一,实际测试时,每20次秒减一大概为实际时间的7秒左右,每30次减一秒的时间和实际时间比较接近,想问一下是哪里出的问题,谢谢!
SharedScreenshot.jpg
(158.51 KB, 下载次数: 43)
下载附件
2019-7-28 15:43 上传
单片机汇编语言源程序如下:
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
作者:
s414545584
时间:
2019-7-28 22:45
(65536-46080)/256
作者:
Y_G_G
时间:
2019-7-29 08:39
定时器进入中断之后并没有重新启动定时器,中断返回之前要先启动定时器
晶振最好是用12MHZ的,或者是用片上的24MHZ,11.0592MHZ的时间不好计算
作者:
yzwzfyz
时间:
2019-7-29 08:49
你用的是硬延时,标准的51是很容易计算准确的。但果是改良51就麻烦了,它采用流水取指结构,取值会提升1-12倍,你必须弄清楚执行的指令所占用的时钟周期,但同样一条指令可能执行周期会不一样(要看这条指令能不能流水)。
估计你不能明白以上说明,查看一下相关流水取指架构,或CALL我。
作者:
wj_yuq
时间:
2019-7-30 11:17
必然的,11.059本身就不是整数,等分多少也成不了整数,准不了;换成整数的晶振试试是个好办法。其它的误差先不管,至少能分出整数。
作者:
jiangkeqin_sy
时间:
2019-7-30 15:03
汇编定时应该准确的啊定时器进入中断之后并没有重新启动定时器,中断返回之前要先启动定时器
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1