51微控制器庫函數詳解(三-二)

2020-08-11 16:31:05

Delay

該資料夾下儲存了庫的通用延時函數,雖精準度沒辦法與定時器相比,但也是可以啦!

delay.h

延時函數標頭檔案,通過頂層宏定義,傳遞進來選擇編譯哪些晶振下的函數,達到對應延時的目的。

#ifndef __DELAY_H
#define __DELAY_H

#include "include_drives.h"

#if XTAL_24MHz
	#define XTAL 24
#elif XTAL_12MHz
	#define XTAL 12
#elif XTAL_110592MHz
	#define XTAL 11.0592
#endif

#if STC89C52RC
	void Delay_Xms(unsigned int n);		//延時 n*1ms
	void Delay_Xs(unsigned int n);		//延時 n*1s
	void Delay_X10us(unsigned int n);	//延時 n*10us
#endif

#endif

delay.c

實現函數,這個我就不解釋了,大家自行看吧!

#include "delay.h"

/*******************************************************************************
以下延時函數,爲粗略延時,精度相對較高,只有11.0592Mhz下10uS延時誤差較大
使用時應注意
功能:延時 12M 24M 11.0592M
誤差:MS S 5%  10uS 8%-80%
*******************************************************************************/
#if STC89C52RC

#if XTAL_24MHz
/*******************************************************************************
* 函 數 名         : Delay_Xms
* 輸    入         : 無符號整形變數
* 輸    出         :	空
* 函數功能		    : 延時
* 詳細描述			 :	有輸入參數的延時函數,且填入數值爲延時多少ms,最大輸入65535
*******************************************************************************/
void Delay_Xms(unsigned int n)
{
	unsigned int i = 0,j = 0;
	
	for(i = 0;i < n;i ++)
		for(j = 0;j < 357;j ++);
}

/*******************************************************************************
* 函 數 名         : Delay_Xs
* 輸    入         : 無符號整形變數
* 輸    出         :	空
* 函數功能		    : 延時
* 詳細描述			 :	有輸入參數的延時函數,且填入數值爲延時多少s,最大輸入65535
*******************************************************************************/
void Delay_Xs(unsigned int n)
{
	for(;n > 0;n --)
		Delay_Xms(1000);
}

/*******************************************************************************
* 函 數 名         : Delay_X10us
* 輸    入         : 無符號整形變數
* 輸    出         :	空
* 函數功能		    : 延時
* 詳細描述			 :	有輸入參數的延時函數,且填入數值爲延時多少個10us,最大輸入65535
*******************************************************************************/
void Delay_X10us(unsigned int n)
{
	unsigned char i;
	
	for(;n > 0;n --)
		for(i = 0;i < 2;i ++);
}

#elif XTAL_12MHz
/*******************************************************************************
* 函 數 名         : Delay_Xms
* 輸    入         : 無符號整形變數
* 輸    出         :	空
* 函數功能		    : 延時
* 詳細描述			 :	有輸入參數的延時函數,且填入數值爲延時多少ms,最大輸入65535
*******************************************************************************/
void Delay_Xms(unsigned int n)
{
	unsigned int i;
	
	for(;n > 0;n --)
		for(i = 0;i < 123;i ++);
}

/*******************************************************************************
* 函 數 名         : Delay_Xs
* 輸    入         : 無符號整形變數
* 輸    出         :	空
* 函數功能		    : 延時
* 詳細描述			 :	有輸入參數的延時函數,且填入數值爲延時多少s,最大輸入65535
*******************************************************************************/
void Delay_Xs(unsigned int n)
{
	for(;n > 0;n --)
		Delay_Xms(1000);
}

/*******************************************************************************
* 函 數 名         : Delay_X10us
* 輸    入         : 無符號整形變數
* 輸    出         :	空
* 函數功能		    : 延時
* 詳細描述			 :	有輸入參數的延時函數,且填入數值爲延時多少個10us,最大輸入65535
*******************************************************************************/
void Delay_X10us(unsigned int n)
{
	while(n --);
}

#elif XTAL_110592MHz
/*******************************************************************************
* 函 數 名         : Delay_Xms
* 輸    入         : 無符號整形變數
* 輸    出         :	空
* 函數功能		    : 延時
* 詳細描述			 :	有輸入參數的延時函數,且填入數值爲延時多少ms,最大輸入65535
*******************************************************************************/
void Delay_Xms(unsigned int n)
{
	unsigned int i;
	
	for(;n > 0;n --)
		for(i = 0;i < 114;i ++);
}

/*******************************************************************************
* 函 數 名         : Delay_Xs
* 輸    入         : 無符號整形變數
* 輸    出         :	空
* 函數功能		    : 延時
* 詳細描述			 :	有輸入參數的延時函數,且填入數值爲延時多少s,最大輸入65535
*******************************************************************************/
void Delay_Xs(unsigned int n)
{
	for(;n > 0;n --)
		Delay_Xms(1000);
}

/*******************************************************************************
* 函 數 名         : Delay_X10us
* 輸    入         : 無符號整形變數
* 輸    出         :	空
* 函數功能		    : 延時
* 詳細描述			 :	有輸入參數的延時函數,且填入數值爲延時多少個10us,最大輸
							入65535,且這個函數是誤差最大的
*******************************************************************************/
void Delay_X10us(unsigned int n)
{
	while(n --);
}
#endif

#endif

外部鏈接

碼雲下載:https://gitee.com/LWTDZ/Core8051.git
店鋪地址:https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-22129052348.16.6b222269wKu2dH&id=615384296160
QQ羣(STM32嵌入式Linux&微控制器):950822175