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

单片机延时精确计算

发布时间:2020-05-26 发布时间:
|
在不同单片机中,有不同的单片机指令。每个指令都占用不同的时钟周期。一般延时程序就是通过循环去达到延时的作用。

下面以最基础的51单片机去做说明:

我这边用我之前debug过的2个延时程序,晶振使用12M:

void delay_us_fun (unsigned int i) //us延时  
{
 while (i--);
}

这个是用来微秒级延时的,他在不同的参数i下,延时时间分别为实际为(9*i+16)us,这些延时的实际时间一般可以通过开发环境keil C51中模拟一下,看下时钟就知道了。

汇编好点的话也可以直接看汇编计算或者直接写汇编程序。

 

这时我们可以使用下面宏去调用上面的接口

#define _delay_us(i) delay_us_fun((i)/9)

这边显然有点误差的。但是数值越大,误差就相对小点。

仅仅需要几us的延时,使用_NOP_();

下面ms级延时一样。

void delay_ms_fun (unsigned int mDelay1) //ms延时
{
 unsigned int mDelay2;

 for (; mDelay1 > 0; mDelay1--)
 {
  for (mDelay2 = 0; mDelay2 < 123; mDelay2++)
  {
  }
 }
}

 

#define _delay_ms(i) delay_ms_fun((i*1000L)/998L) //实际为(i*1000-13)/998

 

 

总而言之,就是根据单片机的指令,还有每个指令占用的时钟周期计算出相对应的精确延时。

关键字:单片机延时  精确计算

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

热门文章 更多
浅谈AVR中定时器几种工作模式