我用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秒左右的误差。下面是昨晚试验的数据:
请大家指点一下,我迷惑了很久了。谢谢先!
lz你把你t0中断服务程序中开始的“th0 = 0x4c;”改成如下这样试试:
tr0 = 0;
th0 = 0x4c-th0;
tr0 = 1;
如果还不行,用方式2吧。
-----------------------------------------------------------------------
感谢回复 不过我试了一下,误差比原来的还大。据我分析,应该是定时器被关闭后,没有补偿这3行代码执行时间所致。
不过我受你这个启发,把关闭、打开定时器代码去掉,只重装了th0,下面是执行的效果:(这是logger里面出来的数据,可以看到毫秒)
11:54:07.500 data received: ID 100 1 - 50 0 22 6, Length:5.
11:59:11.734 data received: ID 100 1 - 50 0 22 4, Length:5.
12:04:13.890 data received: ID 100 1 - 49 0 22 5, Length:5.
12:09:14.906 data received: ID 100 1 - 49 0 22 4, Length:5.
12:14:15.062 data received: ID 100 1 - 49 0 22 5, Length:5.
12:19:15.625 data received: ID 100 1 - 49 0 22 5, Length:5.
12:24:15.781 data received: ID 100 1 - 49 0 22 4, Length:5.
12:29:16.250 data received: ID 100 1 - 49 0 22 4, Length:5.
奇怪的是5分钟的定时飘忽不定,再次印证了42楼说的,但是为什么会这样呢?
一周热门 更多>