1.毫秒级的延时
延时1ms;
voiddelay_1ms(void){
unsignedinti;
for(i=1;i<(unsignedint)(xtal*143-2);i++);
}
在上式中,xtal为晶振频率,单位为延时程序
当晶振频率为8M时,延时函数软件仿真的结果为1000.25μs.当晶振频率为4M
时,延时函数软件仿真结果为999.5μ延时程序
如果需要准确的1ms延时时间,则本计算公式只供参考,应通过软件仿真后,
再确定循环的次数及循环初值,并且循环中还必须关闭全局中断,防止中断影响延
时函数的延时时间。
下面的函数可以获得1ms的整数倍的延时时间:
voiddelay(unsignedintn)
{unsignedinti;
for(i=0;i
delay_1ms();
}如果需要准确的延时时间,则本计算公式只供参考,应通过软件仿真后,再
确定循环的次数及循环初值.AVR延时程序
2.微秒延时
晶振4M,编辑器ICCAVR,芯片mega16
//最大延时时间131.072ms
voiddelay(unsignedinti)//延时时间T=2*(i+1)us其中1=
{
while(--i);}
晶振频率为8MHz时1μs延时函数:AVR延时程序
voiddelay_1us(void){
asm("nop");}
当然也可以使用宏定义来实现1μs延时:
#definedelay_1us();
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");as
m("nop")
如果小于1μs的延时,只有使用宏定义实现,当然,也可以直接插入在线汇
编
asm("nop");语句实现延时。
在程序中需要微秒级的延时时,可以用以下函数实现。AVR延时程序
voiddelay_us(unsignedintn)
{
unsignedinti;
for(i=0;i
delay_1us();
}
说明:如果需要准确的延时时间,则还必须关中断,并通过软件仿真后,再
确定循环的次数及循环初值.
强调:在实际应用中一般不直接使用软件进行长时间的延时,AVR延时程序,
因为MCU一直停留延时函数中(称为阻断),不能再干其它的事睛(除了中断外),只
有非常简单的应用或者简单的演示时才能使用延时函数实现长时间延时。实际应用
中,对长时间(较简单任务一般指几十毫秒以上,对于复杂的应用,一般指几毫秒
以上)的延时,应采用非阻断式的延时方式,或者使用定时器中断来完成延时。
本文发布于:2022-11-27 08:45:23,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/29960.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |