×
单片机 > 单片机程序设计 > 详情

51实现定时器定时调整

发布时间:2020-09-02 发布时间:
|

随着学习的深入对51的认识也越来越深,尤其对中断的重要性更是深深体会!如果你是和我一样的初学者,请一定要学好中断!


今天来分享一下有关定时器定时补偿的冷知识。


不知道你是否做过这样的实验,就是当你用定时器来定时1ms来实现数码管的自动加1。随着时间的推移,会发现和真正的时间略有偏差。于是就引出了接下来所要讲的。


到底这些值差在哪里呢?主要在三个方面:


进入中断前要进行压栈,即是进行数据保护,这里要耗费几个机器周期 


进出中断这个过程也要耗费一定的机器周期 


进入中断后的重新赋值也要耗费一定的机器周期


所以累计误差就这么慢慢增加了。


如何补偿呢?


其实思路很简单就是进入debug,看两次中断相差的时间间隔和我们真正的定时相差多少,然后在赋初值的时候进行一个调整即可。


下面来分享一个自己的调试过程。 


(以12M晶振为例)


先上自己的调试代码:


#include


unsigned char T0RH;

unsigned char T0RL;


void ConfigTimer0(unsigned int ms)

{

    unsigned long tmp;


    tmp = 12000000/12;//以12M晶振为例子

    tmp = (tmp*ms)/1000;

    tmp = 65536 - tmp;

    //tmp = tmp + 6;//这里是后面进行的初值补偿

    T0RH = (unsigned char)(tmp >> 8);

    T0RL = (unsigned char)tmp;

    TMOD &= 0xF0;

    TMOD |= 0x01;

    TH0 = T0RH;

    TL0 = T0RL;

    ET0 = 1;

    TR0 = 1;

}


void main()

{   

    ConfigTimer0(1);

    EA = 1;

    while(1);   

}


void InterruptTimer0() interrupt 1

{

    TH0 = T0RH;

    TL0 = T0RL;

}


① 设置软件调试的晶振值 



②进入debug 


定位两次中断的时间,算出时间间隔 





注意:程序定时的是1ms但是实际上却是1.006ms多出来了6us! 


即压栈、进出中断、中断的赋值这些过程耗费了6个机器周期 


我们知道12M晶振来说,一个机器周期就是1us,所以当赋初值的时候多上6个机器周期就可以了


③把注释去掉后的 





怎么样?是不是恰好是1ms? 


哇哈哈~~~~


其实这样在实际应用中也并不是精确的定时,因为我们知道一切都是相对的,没有什么是绝对的,没有什么会是永垂不朽的!所以这样定时虽然已经相当精确了,但也只能说相对!!!别忘了还有很多因素,比如气压,温度,……均会有所影响硬件!

关键字:51  定时器  定时调整 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多