/**********************************
** file_name delay.h **
** describe 软件延时函数头文件 **
** auther 古欣 **
** Time 2007-1-31 **
**********************************/
#ifndef _delay_
#define _delay_
//晶振大小,保证延时的准确性
#define xtal 8
//#define xtal 4
//1us
extern void delay_1us(void);
//1ms
extern void delay_1ms(void);
//1s
extern void delay_1s(void);
//nus
extern void delay_us(unsigned int n);
//nms
extern void delay_ms(unsigned int n);
//ns
extern void delay_s(unsigned int n);
#endif
/****************************
** file_name delay.c **
** describe 软件延时函数 **
** auther 古欣 **
** Time 2007-1-31 **
*****************************/
#include "delay.h"
/***********************
** 8M晶振下 1us
** 也可以宏定义 8个asm("nop");
** #define delay_1us asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
***********************/
void delay_1us(void)
{
asm("nop");
}
/***********************
**8M时为 1000.25us
**4M时为 999.5us
**xtal 为晶振频率,单位为MHz
************************/
void delay_1ms(void)
{
unsigned int i;
for(i=(xtal*143-2);i>0;i--)
;
}
/***********************
** 1S延时,误差可能稍大
** 250ms*4=1000ms
************************/
void delay_1s(void)
{
unsigned int i;
for(i=250;i>0;i--) //250ms*4=1000ms
delay_1ms();
for(i=250;i>0;i--)
delay_1ms();
for(i=250;i>0;i--)
delay_1ms();
for(i=250;i>0;i--)
delay_1ms();
}
/***********************
**微秒级延时
************************/
void delay_us(unsigned int n)
{
unsigned int i;
for(i=n;i>0;i--)
delay_1us();
}
/***********************
**毫秒级延时
************************/
void delay_ms(unsigned int n)
{
unsigned int i;
for(i=n;i>0;i--)
delay_1ms();
}
/***********************
**秒级延时,太浪费资源,不建议使用
************************/
void delay_s(unsigned int n)
{
unsigned int i,j;
for(j=n;j>0;j--)
{
for(i=250;i>0;i--) //250ms*4=1000ms
delay_1ms();
for(i=250;i>0;i--)
delay_1ms();
for(i=250;i>0;i--)
delay_1ms();
for(i=250;i>0;i--)
delay_1ms();
}
}
本文关键字:暂无联系方式AVR单片机,单片机-工控设备 - AVR单片机