最简单的51延时
{
while(--us)
}
void delay_ms(unsigned int ms)
{
}
对于第一个延时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)
{
}
计算方法:((i×2+3)×j+3)×k+5 us
同样可以先把i和j赋值
(注:该条我没有验证通过,因为生成的代码不是DJNZ的,而是DEC,SUBB之类的。当该函数无形参时,即将i,j,k在内部定义时则可满足公式)
再长的延时就没意义了
51延时传递 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)