#i nclude
就能够运用了。这个头文件界说了两个等级的延时函数别离是:
; 在51中咱们的延时函数都是自己编写的
void _delay_us (double __us) ; //微秒级
void _delay_ms (double __ms); //毫秒级
void _delay_ms (double __ms);
sp;
不过不能够高兴的太早,由于要在你的avr-gcc中正确运用它们是有条件的,下面我将渐渐道来。
这个参数和 Makefile 中的 F_CPU 值有关,Makefile 所界说的的F_CPU 变量的值会传递给编译器。你假如用AVR_studio 4.1X来修改和调试,用内嵌AVR-GCC的进行编译,而且让AVR_studio 帮你主动生成Makefile 的话,那你能够在:
,无论是在汇编中仍是在C言语中。虽然有模
; 在51中咱们的延时函数都是自己编写的
写下你的F_CPU的值,F_CPU这个值表明你的AVR单片机的作业频率。单位是 Hz ,不是 MHZ,不要写错。如 7.3728M 则 F_CPU = 7372800 。
你会发现在”delay.h” 头文件中有这个样的一个界说如下:
#ifndef F_CPU; 在51中咱们的延时函数都是自己编写的
# warning “F_CPU not defined for“
# define F_CPU 1000000UL // 1MHz
#endif
# warning “F_CPU not defined for
# define F_CPU 1000000UL
#endif
板,有时仍是有点烦。呵呵。不过在运用av
这是为了在你没有界说F_CPU这个变量(包含空),或是AVR_studio Frequency没有给值的时分,供给一个默许的 1MHz频率值。让编译器编译时不至于犯错。
sp;
下面是这两个函数的实体:
void _delay_us(double __us) // 微秒
{; 在51中咱们的延时函数都是自己编写的
uint8_t __ticks;
double __tmp = ((F_CPU) / 3e6) * __us; // 3e6 是由于调用的_delay_loop_1()是三条指令的
if (__tmp < 1.0) &nb
__ticks = 1;
else if (__tmp > 255)
__ticks = 0;; 在51中咱们的延时函数都是自己编写的
else
__ticks = (uint8_t)__tmp;
_delay_loop_1(__ticks);,无论是在汇编中仍是在C言语中。虽然有模
}
{; 在51中咱们的延时函数都是自己编写的
uint8_t __ticks;
double __tmp = ((F_CPU) / 3e6) * __us;
if (__tmp < 1.0)
else if (__tmp > 255)
else
_delay_loop_1(__ticks);,无论是在汇编中仍是在C言语中。虽然有模
}
void _delay_ms(double __ms) // 毫秒板,有时仍是有点烦。呵呵。不过在运用av
{
uint16_t __ticks;
double __tmp = ((F_CPU) / 4e3) * __ms; // 4e3 是由于调用的_delay_loop_2()是四条指令的 &nb
{
uint16_t __ticks;
double __tmp = ((F_CPU) / 4e3) * __ms; // 4e3 是由于调用的_delay_loop_2()是四条指令的
if (__tmp < 1.0)
else if (__tmp > 65535)
else; 在51中咱们的延时函数都是自己编写的
_delay_loop_2(__ticks);
}
,无论是在汇编中仍是在C言语中。虽然有模
你会发现他们都别离调用了 _delay_loop_1(); 和_delay_loop_2(); 这两个函数
而这两个函数又如下所示:
void _delay_loop_1(uint8_t __count)板,有时仍是有点烦。呵呵。不过在运用av
{
__asm__ volatile (
“1: dec %0” “”,无论是在汇编中仍是在C言语中。虽然有模
“brne 1b”
: “=r” (__count)
: “0” (__count)sp;
);
}
{
__asm__ volatile (
);
}
void _delay_loop_2(uint16_t __count),无论是在汇编中仍是在C言语中。虽然有模
{
__asm__ volatile (
“1: sbiw %0,1” “” &nb
“brne 1b”
: “=w” (__count)
: “0” (__count)sp;
);
}
{
__asm__ volatile (
);
}
板,有时仍是有点烦。呵呵。不过在运用av
这两个函数都是avr-gcc 的 inline汇编格局写的,详细的语法规矩我就不多说了。能够参阅avr-libc。不过这两个函数很简单,很简单理解。一个是字节递减,一个是字递减。假如你仔细看上面几个函数,你就会发现要正确运用它们是有如下条件的:
sp;
关于第4条规模,来个比如:
sp;
只要具有了上面的条件你才能够正确运用延时函数 _delay_us () 和 _delay_ms () 。关于第三个条件,为什么要选用常量,还有第二个条件为什么要翻开优化选项。这是为了让编译器在编译的时分就把延时的值核算好,而不是把它编译到程序中,在运行时才进行核算,那样的话,一是会添加代码的长度,还会使你的延时程序的延时时刻加长,或是变得不行意料。发生时序的过错。
发现一写就写了两个多小时,看起来不长。看来说出来很简单,写下来仍是要费点时间的,期望对你的有所协助。呵呵。共享高兴,共同进步。