微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 最简单的51延时

最简单的51延时

时间:11-26 来源:互联网 点击:
void delay_us(unsigned char us) //延时微秒@12M,us最大值255

{

while(--us);

}

void delay_ms(unsigned int ms)//延时毫秒@12M,ms

{

unsigned char i;

while(ms--)

for(i =123; i >0; i--) ;

}

对于第一个延时us的函数,计算方法:us×2+5可完成5~515us的延时,经验证,挺准的。

对于第二个延时ms的函数,传递值的类型可取unsigned int和unsigned char两种类型,当取unsigned int时传递值的范围可以更广一些。for循环中i的取值也可以修改,取不同的值延时也不尽相同。在12M的晶振频率下,用Keil验证的结果如下:

结论:不管传递数为何种的类型,for循环中i取值123时延时误差最小,所以建议取123。从结果中也可以看出当取123时有负偏差,取124时有正偏差,所以可根据具体应用进行取值。

而对于不同的频率下的取值,就以12M下的123为参考来取值。譬如用8.0000M的晶振,则取值为123*8/12=82(近似取值)。因为需要这种延时的应用,本身就不需要很高的精度;如果有要求延时精度高的应用时,则需要定时器来完成。

----------------------------------

常用的延时方法(12M晶振)

1、1~4us

_nop()_实现

计算方法:1~4us分别用1~4个_nop()_

2:5~500us

void delay(unsigned char i)

{

while(--i) ;

}

计算方法:i×2+5可完成5~515us的延时

3、10us~2ms

void delay(unsigned char i)

{

for( ;i>0 ;i--) ;

}

计算方法:i×8+10可完成10us~2.050ms的延时

4、2ms~130ms

void delay(unsigned char i,unsigned char j)

{

for( ;j>0 ;j--)

for( ;i>0 ;i--) ;

}

计算方法:(i×2+3)×j+5 us

个人建议:i在里面赋值248,这样延时为0.5ms的倍数(注:该条我没有验证通过,因为生成的代码不是DJNZ的,而是DEC,SUBB之类的)

5、130ms~30s

void delay(unsigned char i,unsigned char j,unsigned char k)

{

for( ;k>0 ;k--)

for( ;j>0 ;j--)

for( ;i>0 ;i--) ;

}

计算方法:((i×2+3)×j+3)×k+5 us

同样可以先把i和j赋值

(注:该条我没有验证通过,因为生成的代码不是DJNZ的,而是DEC,SUBB之类的。当该函数无形参时,即将i,j,k在内部定义时则可满足公式)

再长的延时就没意义了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top