基於89C51/52微控制器的紅外線遙控驅動
阿新 • • 發佈:2018-12-16
目錄
說明
編碼格式: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]; } /* 檔案結束 ---------------------------------------------- */