单片机C语言中实际时间为什么比定时的要慢

Python018

单片机C语言中实际时间为什么比定时的要慢,第1张

是用单片机做的电子钟吗?实际计时比计算的定时要慢,是吗?

这肯定会有计时误差,但误差并不大,需要计时一天以上才能测出来,可能只差一两秒,或更少。

这很正常,因为,定时器的初始值是按定时的时间计算出来的。如果定时器用了中断,对中断计算来计时的,那影响中断,是需要时间的,特别是中断函数中,必须要第一条就是重写初始值,这都需要时间的,虽然这点时间极短,但是,中断的次数是非常多的,这样,累加起来的误差,就是计时的误差。如果中断函数,没有把重写初始值放在第一条,那误差就会更大。

调整误差的方法是:把定时器的初始值加8,再测试,根据实际误差大小,再仔细调整这个数,或再加1,或减1。这需 要反复调,反复测,而且要几天的时间才能测出来,要有耐心的。

一个机器周期=12个时钟周期=12*(1/(12*10^6))=1*10^-6 s即一个机器周期既是1微秒

如果用的是定时器或汇编语言 可以很精确的计算 单周期指令执行一次即1微秒

如果用C语言 只能估算也可以用keil仿真计算

大概是105微秒左右吧

延时时间的计算与单片机的晶振频率有关。若晶振频率为12Mhz,那么单片机每震动一次所需要的时间是1/12M s。那么再来看看单片机执行一次自减所需要的振动次数是96次,假如我们对时间要求不是特别精确的话,可以约等于100来计算。现在通过上面两个数据可以得出:单片机每执行一次自减所需要的时间是1/12M *100(s),即1/120000 s,逆向计算一下,每1ms需要自减多少次?120次对吧。所以一个简单的延时功能就诞生了,我们只需要自减120次,就可以延时1ms,如果我们要延时50ms呢,那就自减50*120=6000次。那么在程序上如何表达呢?我们可以用两套for循环

void delay(int i){

int x,y

for(x=ix>0x--){

for(y=120y>0y--)

}

}

参数 i 代表该函数延时多少ms