~~~ 延时不准,请大家来帮忙啊!!!~~~ 我头大了好久了,谢谢先!!

2020-02-04 09:19发布

我用STC89C52RC做的一个测温湿度的节点,测试发现定时不准,我不知道为什么。我想问下面3个问题:
【1】我的程序和实现是否有问题?
【2】这个误差是否会与环境温度有关系? (节点测得的温度就是它的工作的环境温度,传感器和单片机、晶振都在一起。)
【3】除了上面2点,可能造成这个问题的原因还有什么?

我是这样实现的:
【1】用Timer0,计时50ms,晶振11.0592MHz


【2】在Timer0的中断程序里面,计数每20个50ms就是1秒,然后每到一定时间(比如5分钟)就将 sendDataFlag置1一次,


【3】main函数里面是while的死循环,如果sendDataFlag为1,就向上位机发送一次温湿度值,并把sendDataFlag置0。


下面上位机收到的结果,


我们可以看到有段时间7:29至8:19这段时间定时比较准,每5分钟一次
但是6:43至7点23这段时间定时就非常不准。

在我以往的试验中,也有这样不准的情况出现,每5分钟就会有1秒左右的误差。下面是昨晚试验的数据:



请大家指点一下,我迷惑了很久了。谢谢先!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
53条回答
yao1
1楼-- · 2020-02-06 12:55
 精彩回答 2  元偷偷看……
haozi007
2楼-- · 2020-02-06 13:06
回复【21楼】yao1  
同意20楼 定时器初值改成:
th0=(65536-45872)/256; //0x4c
tl0=(65536-45872)%256; //0xd0
tl0不赋值 每次多计数208 所以你的时间会变慢
-----------------------------------------------------------------------

难道是我的常数计算错了?!!

0x4C00就是19456,
而 (65536-19456)*12/11059200=0.05s=50ms 这个好像没问题吧
我当时特意找了一个低8为0的常数。我想这样就可以不用给TL0赋值了。

yao1能否说一下你这个0x4cd0是怎么算出来的?我没看明白。
谢谢
haozi007
3楼-- · 2020-02-06 17:49
我是这么算定时器初值的:
   12个时钟周期=1个机器周期=12*(1/11059200)=1.09us (晶振11.0592)
  若t=50ms 那么N=50000/1.09=45872  要计数45872 TH0 TL0应该装入总数为65536-45872=19664
  把19664对256求模19664/256=76(十六进制4C) 装入TH0
  对256求余19664%256=208(十六进制D0) 装入TL0
yao1
4楼-- · 2020-02-06 17:52
定时器初值改成:
TH0=(65536-45872)/256; //0X4C
TL0=(65536-45872)%256; //0XD0
8238157
5楼-- · 2020-02-06 23:00
我四舍五入误差问题   
12个时钟周期=1个机器周期=12*(1/11059200)=1.085us (晶振11.0592)
若t=50ms 那么N=50000/1.085=45872  要计数46080 TH0 TL0应该装入总数为65536-45872=19456
  把19456对256求模19456/256=76(十六进制4C) 装入TH0  
  对256求余19456%256=0(十六进制0) 装入TL0
你的算法正确
yao1
6楼-- · 2020-02-07 01:47
 精彩回答 2  元偷偷看……

一周热门 更多>