在51中我们的延时函数都是自己编写的,无论是在汇编中还是在C言语中。虽然有模板,有时还是有点烦。呵呵。不过在应用avr 单片机的时候我们就有福了。因为avr-gcc 提供给我们很方便的delay 延时函数, 只有在源文件包含:#i nclude <util/delay.h> 就可以使用了。不过不可以高兴的太早,因为要在你的avr-gcc中正确使用它们是有条件的,下面我将慢慢道来。 WINAVR自带了四个延时程序,在C:\WinAVR\avr\include\util\delay.h下可以打开,我一开始应用是以为很好用,结果出现了很多问题,有时想要的延时时间达不到,后来仔细查看了一下delay.h,发现里面是有说明的。
应用较多的是void_delay_us(double __us)和void_delay_ms(double __ms)两个函数, void_delay_us(double __us)函数说明如下:
Perform a delay of \c __us microseconds, using _delay_loop_1().
The macro F_CPU is supposed to be defined to a
constant defining the CPU clock frequency (in Hertz).
The maximal possible delay is 768 us / F_CPU in MHz.
说明每1Mhz最大的延时是768us,举个例子,如果F_CPU=4Mhz,那么_delay_us最大的延时是768/4=192us。
同理_delay_ms函数也有这样的限制:
Perform a delay of \c __ms milliseconds, using _delay_loop_2().
The macro F_CPU is supposed to be defined to a
constant defining the CPU clock frequency (in Hertz).
The maximal possible delay is 262.14 ms / F_CPU in MHz.
如果F_CPU=4Mhz,那么_delay_ms最大的延时是262.14/4=65.535ms。
这个参数和 Makefile 中的 F_CPU 值有关,Makefile 所定义的的F_CPU 变量的值会传递给编译器。你如果用 AVR_studio 4.1X来编辑和调试,用内嵌AVR-GCC的进行编译,并且让AVR_studio 帮你自动生成Makefile 的话,那你可以在:Project -> Configuration Options -> Gerneral -> Frequency 如下图:
写下你的F_CPU的值,F_CPU这个值表示你的AVR单片机的工作频率。单位是 Hz ,不是 MHZ,不要写错。如 7.3728M 则 F_CPU = 7372800 。
你会发现在"delay.h" 头文件中有这个样的一个定义如下:
#ifndef F_CPU
# warning "F_CPU not defined for <util/delay.h>"
# define F_CPU 1000000UL // 1MHz
#endif
这是为了在你没有定义F_CPU这个变量(包括空),或是AVR_studio Frequency没有给值的时候,提供一个默认的 1MHz频率值。让编译器编译时不至于出错。
|