哈哈,51也可以跟WINAVR一样有_delay_us(),_delay_ms()函数了,可以根据晶振自动调整,代

2020-02-05 09:14发布

如题
点击此处下载 ourdev_614624ZCX5XV.pdf(文件大小:56K) (原文件名:WinAVR延时函数理解 .pdf)


我写的头文件 delay.h   最后面的需要自己扩展



#ifndef _DELAY_H_
#define _DELAY_H_
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//时钟频率,需要设置
#ifndef _F_CPU_
#define _F_CPU_
//#define F_CPU_1000000
//#define F_CPU_1843200
//#define F_CPU_2000000
//#define F_CPU_3686400
//#define F_CPU_4000000
//#define F_CPU_7372800
//#define F_CPU_8000000
  #define F_CPU_11059200
//#define F_CPU_12000000
//#define F_CPU_14745600
//#define F_CPU_16000000
//#define F_CPU_18432000
//#define F_CPU_20000000
#endif
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//XT精确延时函数
#ifndef _DELAY_XT_H_
#define _DELAY_XT_H_
#include <intrins.h>
//延时专用全局变量
unsigned char _DELAY_I=0,_DELAY_J=0,_DELAY_K=0;
//精确延时1T秒
#define _delay_1T()            {_nop_();}
//精确延时2xT秒,x范围1-255
#define _delay_2xT(x)         {for(_DELAY_I=x;_DELAY_I>0;_DELAY_I--);}
//精确延时10xT秒,xx范围1-255
#define _delay_10xT(x)        {for(_DELAY_I=x;_DELAY_I>0;_DELAY_I--)
                                    {for(_DELAY_J=3;_DELAY_J>0;_DELAY_J--);};}
//精确延时100xT秒,xx范围1-255
#define _delay_100xT(x)       {for(_DELAY_I=x;_DELAY_I>0;_DELAY_I--)
                                    {for(_DELAY_J=48;_DELAY_J>0;_DELAY_J--);};}
//精确延时xKT秒,x范围1-255
#define _delay_xKT(x)            {for(_DELAY_I=x;_DELAY_I>0;_DELAY_I--)
                                    {for(_DELAY_J=2;_DELAY_J>0;_DELAY_J--)
                                        {for(_DELAY_K=248;_DELAY_K>0;_DELAY_K--);};};}
//精确延时10xKT秒,xx范围1-255
#define _delay_10xKT(x)        {for(_DELAY_I=x;_DELAY_I>0;_DELAY_I--)
                                    {for(_DELAY_J=20;_DELAY_J>0;_DELAY_J--)
                                        {for(_DELAY_K=248;_DELAY_K>0;_DELAY_K--);};};}
//精确延时100xKT秒,xx范围1-255
#define _delay_100xKT(x)       {for(_DELAY_I=x;_DELAY_I>0;_DELAY_I--)
                                    {for(_DELAY_J=200;_DELAY_J>0;_DELAY_J--)
                                        {for(_DELAY_K=248;_DELAY_K>0;_DELAY_K--);};};}
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//uS,mS延时函数自动设置
#ifdef F_CPU_11059200  //F=11.0592MHz,T=1.08507uS
#define _delay_1us() _delay_1T()
#define _delay_10us() {_delay_2xT(4);_delay_1T();}
#define _delay_100us() _delay_2xT(46)
#define _delay_1ms() _delay_10xT(92)
#endif

#ifdef F_CPU_12000000  //F=12.0000MHz,T=1.00000uS
#define _delay_1us() _delay_1T()
#define _delay_10us() _delay_2xT(5)
#define _delay_100us() _delay_2xT(50)
#define _delay_1ms() _delay_xKT(1)
#endif

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////





////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#endif
0条回答

一周热门 更多>