标题: 汇编用单片机定时器0产生1s时间不准 [打印本页]

作者: 心灵的尘埃    时间: 2019-7-28 15:44
标题: 汇编用单片机定时器0产生1s时间不准
想做一个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



作者: 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