天天看點

基于89C51/52單片機的紅外線遙控驅動

基于89C51/52系列單片機的紅外遙控驅動(NEC編碼,基于外部中斷和延時函數實作)

目錄

  • 說明
  • IR.h
  • IR.c

說明

編碼格式:NEC

IR.h

/************************************************************
 *            @Project    課程設計 —— 旋轉LED
 *            @File     IR.h - 紅外線遙控驅動頭檔案
 *            @Author       1500830205 黃玉婷
 *            @Teacher           黎蓮花
 ************************************************************
 */
 #ifndef _IR_H_
 #define _IR_H_
 
 /* 鍵值定義 ---------------------------------------------- */
 #define KEY_POWER 	0x45
 #define KEY_MENU  	0x47
 #define KEY_TEST  	0x44
 #define KEY_RETURN 0x43
 #define KEY_CANCEL 0x0D
 #define KEY_LAST	0x07
 #define KEY_NEXT	0x09
 #define KEY_OK  	0x15
 
 #define KEY_U	0X40
 #define KEY_D  0x19
 #define KEY_0 	0x16
 #define KEY_1 	0x0C
 #define KEY_2  0x18
 #define KEY_3  0x5E
 #define KEY_4  0x08
 #define KEY_5 	0x1C
 #define KEY_6 	0x5A
 #define KEY_7 	0x42
 #define KEY_8 	0x52
 #define KEY_9 	0x4A
 
 /* 變量定義 ---------------------------------------------- */
 
 sbit IRIN = P3^3;	//紅外線輸入管腳,同時也是單片機外部中斷1
 
 /* 函數聲明 ---------------------------------------------- */
 
 void IR_Init();					   //初始化紅外接收
 unsigned char IR_Get_KeyValue( void ); //擷取鍵值
 
	 
 #endif /* _IR_H_ */
 /* 檔案結束 ---------------------------------------------- */
 
           

IR.c

/************************************************************
 *            @Project    課程設計 —— 旋轉LED
 *            @File     IR.c - 紅外線遙控驅動實作
 *            @Author       1500830205 黃玉婷
 *            @Teacher           黎蓮花
 ************************************************************
 */

 /* 頭檔案 ------------------------------------------------- */
 #include <reg52.h>
 #include "IR.h"

 /* 變量定義 ----------------------------------------------- */
 unsigned char Time;
 unsigned char IrValue[6];	  //用來存放讀取到的紅外值
 
 /* 函數聲明 ----------------------------------------------- */
 void Delay140us(unsigned int );	
									 
/*******************************************************************************
* 函數           : Delay140us()
* 函數功能		 : 延時
* 輸入           : x
* 輸出         	 : 無
*******************************************************************************/

void Delay140us(unsigned int x)   //0.14ms誤差 0us
{
	unsigned char i;
	while(x--)
	{
		for (i = 0; i<12; i++)
		{}
	}
}
/**********************************************************
 * 函數名稱 : IR_Init()
 * 功    能 : 初始化紅外線接收
 * 備    注 : 初始化外部中斷1
 **********************************************************/
void IR_Init()
{
	IT1=1;   //下降沿觸發
	EX1=1;   //打開中斷0允許
	EA=1;	 //打開總中斷
	IRIN=1;  //初始化端口
}

/**********************************************************
 * 函數名稱 : ReadIr()
 * 功    能 : 接受紅外線信号并進行解碼
 * 備    注 : 外部中斷1中斷函數
 ***********************************************************/
void ReadIr() interrupt 2
{
	unsigned char j,k;
	unsigned int err;
	Time=0;					 
	Delay140us(60);

	if(IRIN==0)		//确認是否真的接收到正确的信号
	{	 
		err=1000;				//1000*10us=10ms,超過說明接收到錯誤的信号
		/*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程式出錯的時
		侯,程式死在這裡*/	
		while((IRIN==0)&&(err>0))	//等待前面9ms的低電平過去  		
		{			
			Delay140us(1);
			err--;
		} 
		if(IRIN==1)			//如果正确等到9ms低電平
		{
			err=500;
			while((IRIN==1)&&(err>0))		 //等待4.5ms的起始高電平過去
			{
				Delay140us(1);
				err--;
			}
			for(k=0;k<4;k++)		//共有4組資料
			{				
				for(j=0;j<8;j++)	//接收一組資料
				{

					err=60;		
					while((IRIN==0)&&(err>0))//等待信号前面的560us低電平過去
					{
						Delay140us(1);
						err--;
					}
					err=500;
					while((IRIN==1)&&(err>0))	 //計算高電平的時間長度。
					{
						Delay140us(1);//0.14ms
						Time++;
						err--;
						if(Time>30)
						{
							EX1=1;
							return;
						}
					}
					IrValue[k]>>=1;	 //k表示第幾組資料
					if(Time>=8)			//如果高電平出現大于565us,那麼是1
					{
						IrValue[k]|=0x80;
					}
					Time=0;		//用完時間要重新指派							
				}
			}
		}
		if(IrValue[2]!=~IrValue[3])
		{
			return;
		}
	}	
}

/**********************************************************
 * 函數名稱 : IR_Get_KeyValue
 * 功    能 : 取得紅外線信号中指令碼
 * 輸    出 : 指令碼(鍵值)
***********************************************************/
unsigned char IR_Get_KeyValue( void )
{
	return IrValue[2];
}

 /* 檔案結束 ---------------------------------------------- */