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

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条回答
packer
1楼-- · 2020-02-09 23:38
 精彩回答 2  元偷偷看……
eduhf_123
2楼-- · 2020-02-10 03:18
感谢您的回复。

首先我强调一下,没有其它中断了,这个定时器是唯一的中断。

其次,我是没有关中断的,我就是想避免由此带来的延迟。

现在的问题在于每次定时的误差表现出来是随机的。同样的程序,有时候快,有时候慢,有时误差大,有时误差小,有时又准了(或没有可测量的误差)

不知道各位是否能解其详?


回复【53楼】eduhf_123  经历
回复【51楼】haozi007  
来跟大家汇报一下今天晚上的测试结果,貌似准确了。
方法就是受48楼的朋友启发,重装th0时考虑已有的计数进位,只是我没有关计数器。
我很惊讶,为什么中断跳转过程难道需要这么长时间?
下面是刚刚出炉的测试数据:
-----------------------------------------------------------------------
这个数据现在只能说定时看起来准确了,其实问题很严重:看你在50楼发上来的数据就知道了,每两次收到数据的时间都比5分钟略长一点(头两行间隔的4秒多认为是上位机的问题,其他时间间隔最长的也有2.156秒,2156ms/300s≈72ms/s,快到1%了)。
不是说“中断跳转过程”有这么长,而在于在中断跳转之前还有“中断响应时间”存在(比如有很长一段关中断的时间、比如更高优先级或同级的中断服务程序在运行)。

如......
-----------------------------------------------------------------------
eduhf_123
3楼-- · 2020-02-10 04:00
回复【50楼】haozi007
-----------------------------------------------------------------------

用C写好程序后编译,再反汇编成汇编代码,就可以看到问题。

定时器中断响应后,最先执行的不是你装初值的代码!

而是先很多的PUSH ***,它叫保护现场,你来的地方(中断产生的时机)不同,会导致保护现场所执行的代码不同。

还有如果有其他的中断正被执行,那你的定时器的中断还可能挂起一阵子才能得到执行,这时你装初值的操作显然被延迟了。
haozi007
4楼-- · 2020-02-10 08:39
mark
jing43
5楼-- · 2020-02-10 12:28
学习气氛浓哇…路过!

一周热门 更多>