1. 程式人生 > >基於89C51/52微控制器的紅外線遙控驅動

基於89C51/52微控制器的紅外線遙控驅動

目錄

說明

編碼格式: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];
}

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