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

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-08 12:33
用C语言写的,定时器工作在手动重装初值模式下,定时时间是不能精确的预测的。
建议用自动重装初值的工作模式。
yao1
2楼-- · 2020-02-08 14:45
回复【42楼】jing43  
用c语言写的,定时器工作在手动重装初值模式下,定时时间是不能精确的预测的。
建议用自动重装初值的工作模式。
-----------------------------------------------------------------------

感谢您的回复,恕我太愚,我想追问一下:为什么“用c语言写的,定时器工作在手动重装初值模式下,定时时间是不能精确的预测的”?

特别是在我的这个特定例子,我觉得中断跳转、压栈和重装时间没有超过256个机器周期,应该是准确的呀?我这样想错在哪里呢?

不过顺便说明一下,从我观察到的现象来看,误差确实是随机的(至少我还没发现规律),这个比较复合您说的“不能精确的预测”。
jing43
3楼-- · 2020-02-08 16:52
 精彩回答 2  元偷偷看……
haozi007
4楼-- · 2020-02-08 22:33
我看程序已经彻底凌乱了 呵呵,下面这个截图是最新的数据,居然还有4分钟的间隔。


在没人人回答我的问题之前,我打算先暂时放一放了, 今天耗了大家太多时间,我比较过意不去
haozi007
5楼-- · 2020-02-09 03:05
你上位机不会有问题吧
haozi007
6楼-- · 2020-02-09 03:58
回复【46楼】packer  
你上位机不会有问题吧
-----------------------------------------------------------------------

在您的提示下,我检查了一番,没有看出明显问题。
我觉得我们可以暂时排除上位机有问题的可能性。

今天头已经彻底晕了,等明天我重新搭个电路,就只做定时和串口通信,试验过后再来跟大家汇报。

再次感谢楼上各位的帮忙,祝大家晚安!

一周热门 更多>