文档介绍:标签:avr延时杂谈分类:;voiddelay_1ms(void){ unsignedinti; for(i=1;i<(unsignedint)(xtal*143-2_;i++) ;}在上式中,xtal为晶振频率,单位为MHz.   当晶振频率为8M时,,.   如果需要准确的1ms延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值,并且循环中还必须关闭全局中断,防止中断影响延时函数的延时时间。   下面的函数可以获得1ms的整数倍的延时时间:voiddelay(unsignedintn){ unsignedinti; for(i=0;i<n;i++) delay_1ms();}     如果需要准确的延时时间,则本计算公式只供参考,应通过软件仿真后,:voiddelay_1us(void){ asm("nop");}当然也可以使用宏定义来实现1μs延时:#definedelay_1us();asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop")如果小于1μs的延时,只有使用宏定义实现,当然,也可以直接插入在线汇编asm("nop");语句实现延时。在程序中需要微秒级的延时时,可以用以下函数实现。voiddelay_us(unsignedintn){ unsignedinti; for(i=0;i<n;i++) delay_1us();}   说明:如果需要准确的延时时间,则还必须关中断,并通过软件仿真后,再确定循环的次数及循环初值.   强调:在实际应用中一般不直接使用软件进行长时间的延时,因为MCU一直停留延时函数中(称为阻断),不能再干其它的事睛(除了中断外),只有非常简单的应用或者简单的演示时才能使用延时函数实现长时间延时。实际应用中,对长时间(较简单任务一般指几十毫秒以上,对于复杂的应用,一般指几毫秒以上)的延时,应采用非阻断式的延时方式,或者使用定时器中断来完成延时。