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

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-07 15:40
回复【34楼】yao1  

18 25 是我发的贴 发现发出来有问题就删除了
-----------------------------------------------------------------------

呵呵 谢谢   其实这个问题不用回答,我写出来供大家娱乐一下的 :)
yao1
2楼-- · 2020-02-07 18:53
看你的实验现象是大概5分钟慢1S 那50ms大概慢0.2ms 你让计数器计数到49.8ms进位看看
我大概算下修正:TH0=0X4C; TL0=0XB4;
haozi007
3楼-- · 2020-02-07 20:45
回复【37楼】yao1  
看你的实验现象是大概5分钟慢1s 那50ms大概慢0.2ms 你让计数器计数到49.8ms进位看看
我大概算下修正:th0=0x4c; tl0=0xb4;
-----------------------------------------------------------------------

这样肯定不行,误差不到1秒,按0.2ms每50ms算误差肯定更大。

我读了你上面付的文章,我觉得应该是每次中断都延迟了中断转移指令周期的时间(T0),但是文章里面提到的T2和T3我就不是很理解了。有朋友出来指点一下吗?

另外,现在这个延时每次慢的时间是随机的,不是一直5分钟慢1秒。有时候有是准的,有时候又会慢。

所以我觉得还是要找出慢的原因来才能最终解决这个问题。

当然,我也很感谢前面回帖的各位网友,给我指点了很多应该怎么做来解决的这个问题的办法和方向。但是到目前位置,还是没人能回答一下我这样做为什么会慢的问题。

谢谢
yao1
4楼-- · 2020-02-08 00:33
 精彩回答 2  元偷偷看……
haozi007
5楼-- · 2020-02-08 05:38
若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
  在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。
haozi007
6楼-- · 2020-02-08 07:44
汗! 我学了5个月了也是很多不明白 所以混论坛提高下自己
高手一般都懒的回答我们的问题的 一般都是水平差不多的回答

一周热门 更多>