找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3800|回复: 5
收起左侧

汇编用单片机定时器0产生1s时间不准

[复制链接]
ID:481844 发表于 2019-7-28 15:44 | 显示全部楼层 |阅读模式
想做一个60秒倒计时的单片机程序,晶振为11.0592,在用定时器0产生1S的时间时发现1s的时间产生不准,设定的时间为每50ms产生一次中断,每20次秒减一,实际测试时,每20次秒减一大概为实际时间的7秒左右,每30次减一秒的时间和实际时间比较接近,想问一下是哪里出的问题,谢谢!
SharedScreenshot.jpg

单片机汇编语言源程序如下:
        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


回复

使用道具 举报

ID:100312 发表于 2019-7-28 22:45 | 显示全部楼层
(65536-46080)/256
回复

使用道具 举报

ID:401564 发表于 2019-7-29 08:39 | 显示全部楼层
定时器进入中断之后并没有重新启动定时器,中断返回之前要先启动定时器
晶振最好是用12MHZ的,或者是用片上的24MHZ,11.0592MHZ的时间不好计算
回复

使用道具 举报

ID:123289 发表于 2019-7-29 08:49 | 显示全部楼层
你用的是硬延时,标准的51是很容易计算准确的。但果是改良51就麻烦了,它采用流水取指结构,取值会提升1-12倍,你必须弄清楚执行的指令所占用的时钟周期,但同样一条指令可能执行周期会不一样(要看这条指令能不能流水)。
估计你不能明白以上说明,查看一下相关流水取指架构,或CALL我。
回复

使用道具 举报

ID:307020 发表于 2019-7-30 11:17 | 显示全部楼层
必然的,11.059本身就不是整数,等分多少也成不了整数,准不了;换成整数的晶振试试是个好办法。其它的误差先不管,至少能分出整数。
回复

使用道具 举报

ID:267330 发表于 2019-7-30 15:03 | 显示全部楼层
汇编定时应该准确的啊定时器进入中断之后并没有重新启动定时器,中断返回之前要先启动定时器
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表