AVR的精确延时程序(2009-12-28 06:41:30)
1.毫秒级的延时 延时1ms;
void delay_1ms(void) {
unsigned int i;
for(i=1;i<(unsigned int)(xtal*143-2_;i++) ; }
在上式中,xtal为晶振频率,单位为MHz.
当晶振频率为8M时,延时函数软件仿真的结果为1000.25μs.当晶振频率为4M时,延时函数软件仿真结果为999.5μs.
如果需要准确的1ms延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值,并且循环中还必须关闭全局中断,防止中断影响延时函数的延时时间。 下面的函数可以获得1ms的整数倍的延时时间: void delay(unsigned int n) {
unsigned int i; for(i=0;i 如果需要准确的延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值. 2.微秒延时 晶振频率为8MHz时1μs延时函数: void delay_1us(void) { asm(\} 当然也可以使用宏定义来实现1μs延时: #define delay_1us(); asm(\如果小于1μs的延时,只有使用宏定义实现,当然,也可以直接插入在线汇编 asm(\ 语句实现延时。 在程序中需要微秒级的延时时,可以用以下函数实现。 void delay_us(unsigned int n) { unsigned int i; for(i=0;i 说明:如果需要准确的延时时间,则还必须关中断,并通过软件仿真后,再确定循环的次数及循环初值. 强调:在实际应用中一般不直接使用软件进行长时间的延时,因为MCU一直停留延时函数中(称为阻断),不能再干其它的事睛(除了中断外),只有非常简单的应用或者简单的演示时才能使用延时函数实 现长时间延时。实际应用中,对长时间(较简单任务一般指几十毫秒以上,对于复杂的应用,一般指几毫秒以上)的延时,应采用非阻断式的延时方式,或者使用定时器中断来完成延时。 WINAVR自带延时函数说明 delay.h文件位于X:\\WinAVR\\avr\\include\\avr中。 delay.h中有两个函数--------_delay_ms(double __ms)和_delay_us(double __us),分别延时__ms*F_CPU毫秒、__us*F_CPU微秒,(单片机晶振是F_CPU MHZ)两函数的原型分别如下: 1、_delay_us(double __us) static __inline__ void _delay_us(double __us) { uint8_t __ticks; double __tmp = ((F_CPU) / 3e6) * __us; if (__tmp < 1.0) __ticks = 1; else if (__tmp > 255) __ticks = 0; /* i.e. 256 */ else __ticks = (uint8_t)__tmp; _delay_loop_1(__ticks); } 其中,该函数延时的最大时间是768/F_CPU微秒。 2、_delay_ms(double __ms) static __inline__ void _delay_ms(double __ms) { uint16_t __ticks; double __tmp = ((F_CPU) / 4e3) * __ms; if (__tmp < 1.0) __ticks = 1; else if (__tmp > 65535) __ticks = 0; /* i.e. 65536 */ else __ticks = (uint16_t)__tmp; _delay_loop_2(__ticks); } 其中,该函数延时的最大时间是262.14/F_CPU毫秒。 delay_ms,delay_us延时函数在不同工作频下的最大值 GCC中delay_ms,delay_us延时函数在不同工作频(常用)下的最大值如下: _delay_ms(double __ms) The maximal possible delay is 262.14 ms / F_CPU in MHz. 工作频率 最大延时值(ms) 20M 13ms 16M 16ms 12M 21ms 11.0592M 23ms 8M 32ms 7.3728M 35ms 4M 65ms 2M 131ms 1M 262ms _delay_us(double __us) The maximal possible delay is 768 us / F_CPU in MHz. 工作频率 最大延时值(us) 20M 38us 16M 48us 12M 64us 11.0592M 69us 8M 96us 7.3728M 104us 4M 192us 2M 384us 1M 768us
相关推荐: