玩单片机,离不开延时函数,用GCC编译器,虽然的自带的_delay_ms(uint uicount)这个库函数,但存在一个问题,这个函数的最大延时长度有限,当晶振为1M时,最长为1X4X65536uS = 200多mS,这使得应用层用起来相当的不方便,于是自定义1个功能类似的函数,不调上层调底层,就用系统自带的那个消耗4个机器周期的底层来实现延时,程序如下,经测试,性能稳定,定时准确,方便使用,共享与大家评析。
#include <avr/io.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//_delay_loop_2(uint16_t __count);
//参数 __count 为 16bit 长度,1-65536,65536被认为是0。
//每个循环花费4个CPU周期。
//所以当晶振为1Mhz时,最长延时为262.1 ms (milliseconds)
//1*4*65536=262144 us
void Delay(uint uiDelayCount)
{
while(uiDelayCount--)
{
_delay_loop_2(1000*(12/4)); //12为当前晶振频率
}
}
//以下部分是测试代码
//指示灯占用PC3,PC5,PC6,PC7
void InitDevice(void)
{
DDRD=0XF7; //D0,D1,D2设置为输出端口
DDRC = 0xFD; //C4-C7设置为输出,点灯用
}
main(void)
{
// DDRA = 0xff;
// PORTA = 0xFF;
InitDevice();
while(1)
{
PORTD &= 0xF8;
PORTC |= 0xE8; //PC5,PC6,PC7,PC3置高
Delay(1000);
PORTD |= 0x07;
PORTC &= 0x17;
Delay(1000);
}
} |