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

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条回答
haozi007
1楼-- · 2020-02-05 01:23
回复【5楼】yao1  
    我也是菜鸟, 我的理解(如果错误见谅):
   发送数据的函数如果时间大于50ms就会出现 如果程序在发送数据 此时恰好定时器进入中断并且t刚好也加到20 那么发送完数据再进入中断时就错过了这次的判断
     》= 已经包含了== 不会多花时间的 只要检测到==20就会进入中断 如果检测不到20 才会继续检测21.22.23 ....
你如果写==如果检测不到20, 就会隔20次才会再次检测 ;而》=是检测不到20,就隔1次再检测
   
  还有就是c语言的这种计数本来就不是很准确 你要很准确要用汇编写
-----------------------------------------------------------------------

感谢你的回复。我更菜, 大家一起讨论下挺好的。

我引用你的话:“发送数据的函数如果时间大于50ms就会出现 如果程序在发送数据 此时恰好定时器进入中断并且t刚好也加到20 那么发送完数据再进入中断时就错过了这次的判断 ”

我觉得这个有问题。我认为判断不会错过,因为中断发生的时候,发送数据程序就暂停了,而是跳过去执行中断子程序,等中断完成后再跳回去继续执行发送数据的程序。 你觉得我说得对不对?

顺便说一下,在发送数据的过程中不会有其它的中断产生了。

不过我现在已经改了程序,用>=了,目前还是准的,有进一步结果我会来更贴的。

另外,我澄清一下,“考虑到做">="要比"=="多花时间” 我指的是执行判断指令==的时间比执行>=这个判断的时间长,而不是说延时的时间会更长。我看你好像误解我的意思了。

谢谢
haozi007
2楼-- · 2020-02-05 03:47
回复一下2楼,改用 >= 后,还是不准。

这是最新的数据,每5分钟还是有1秒左右的误差。
ruizhixing
3楼-- · 2020-02-05 07:46
 精彩回答 2  元偷偷看……
renpeng009
4楼-- · 2020-02-05 08:43
试试看STC的办法,还能省电~~

(原文件名:QQ截图20111025122711.png)
haozi007
5楼-- · 2020-02-05 10:35
回复【10楼】ruizhixing  睿
难道是你的程序里面有其他的中断影响了?或者程序里有中断屏蔽?
-----------------------------------------------------------------------

没有其它中断了。也没有屏蔽过中断。
yao1
6楼-- · 2020-02-05 11:42
还有就是C语言的这种计数本来就不是很准确1周期慢10几个微妙 时间长了就会有误差  C语言的计数没有计算机那么准确的,误差1秒 我认为正常 你要很准确得用汇编写

一周热门 更多>