找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2240|回复: 4
收起左侧

单片机定时器的软件调试,定时时间为1ms,但是调试窗口中显示时间已经达到1.4ms左右

[复制链接]
ID:358460 发表于 2020-7-12 07:48 | 显示全部楼层 |阅读模式
使用定时器1,在编写定时器程序时,根据公式
定时时间=(65535-X)*(12/晶振频率)

得到初值,编写如下程序实验
  1. #include <reg52.h>
  2. /*工作方式1_1ms延时函数*/
  3. void delay_ms(uint xms)
  4. {
  5.         while(xms!=0)
  6.         {
  7.                 TMOD=0x01;
  8.                 TR0=1;
  9.                 TH0=0xfc;TL0=0x66;
  10.                 while(TF0!=1);
  11.                 TF0=0;
  12.                 xms--;
  13.         }
  14.         TR0=0;
  15. }
  16. /*主程序*/
  17. void main()
  18. {
  19. delay_ms(1);
  20. }
复制代码
定时时间为1ms,但是调试窗口中显示时间已经达到1.4ms左右,晶振频率为11.0592MHz设置无误,不知道是什么原因,恳请高人解答。



回复

使用道具 举报

ID:332444 发表于 2020-7-12 10:01 | 显示全部楼层
定时器设置一次即可,为何要循环?
回复

使用道具 举报

ID:782419 发表于 2020-7-12 21:41 | 显示全部楼层
你为什么不用定时中断?那样精度会更好一点!
回复

使用道具 举报

ID:358460 发表于 2020-7-24 17:02 | 显示全部楼层
xianfajushi 发表于 2020-7-12 10:01
定时器设置一次即可,为何要循环?

感谢回答
我定义一个delay_ms函数,意在延迟一定的时间,
        while(xms!=0)
        {
                TMOD=0x01;
                TR0=1;
                TH0=0xfc;TL0=0x66;
                while(TF0!=1);
                TF0=0;
                xms--;
        }
是将延迟1ms的动作执行xms次,每一次赋初值后,是等待定时器溢出才重新赋初值。我感觉这样没有问题,教材上也是如此。不知道是不是有其他问题。
回复

使用道具 举报

ID:358460 发表于 2020-7-24 17:05 | 显示全部楼层
wufeng391 发表于 2020-7-12 21:41
你为什么不用定时中断?那样精度会更好一点!

感谢回答
我想试验一下这种方式,遇到这个问题。不知道是操作问题还是误差问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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