新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 紅外解碼原理及程序

        紅外解碼原理及程序

        作者: 時間:2016-11-18 來源:網絡 收藏
        //----------------------------------------------------------------------------------------------------------------------------------------------

        //紅外解碼原理基本簡介:當發射鍵按下后,就會發射出33位遙控編碼,按下的鍵不同,發射出的編碼不同;
        //33位數據中。第一位是起始碼,告訴接收器準備開始接收。后面的32位時數據,最開始發送出去的是操控碼,用于不同遙控器的識別。同一各遙控器
        //所有按鍵的操控碼都相同;發送時,先發低位,再發高位;接下來的數據是操控碼的反碼,用于驗證操控碼,同樣也是低位在前,高位在后;接下來
        //的就是數據了,數據石油8位2進制的數構成,同樣低位在前,高位在后。最后的8位數據時前面數據的反碼,用于數據的校對;
        //在解碼時最關鍵的是怎樣識別發送過來的0和1;遙控編碼,是用38kHZ的載波發送的;通常, ”0“用0.56ms的低電平和0.56ms的高電平組合而成,脈沖寬度
        //位1.12ms;”1“是用0.56ms的低電平和1.69ms的高電平組合而成,脈沖寬度為2.25ms。這頁就位我們提供了一種方法來識別0和1,即判別脈沖寬度;這頁就是
        //本程序所用到的方法;其次,比較關鍵的是,如何識別起始位;通常用9ms的低電平和4.5ms的高電平組合成起始位,因而同樣可以用判別脈沖寬度的方法來識
        //別起始位;
        //------------------------------------------------------------------------------------------------------------------------------------------------

        本文引用地址:http://www.104case.com/article/201611/315931.htm



        #include//包含頭文件;

        //--------------------------------------------------------------------
        //重新聲明變量標識符;
        //--------------------------------------------------------------------
        #defineucharunsignedchar
        #defineuintunsignedint
        #defineulongunsignedlongint

        sbitout=P3^2;//端口定義;


        ucharadd=0,_add=0,tdata=0,_tdata=0;//分別為 操控碼,操控反碼,數據,數據反碼;
        ucharadd_up=0,add_down=0,_add_up=0,_add_down=0,tdata_up=0,tdata_down=0,_tdata_up=0,_tdata_down=0;//up代表高4位,down代表低4位;
        ucharnum=0;//用于判斷接收數據的位數,判斷終止位;
        ulongbitdata=0x00000000;//用于存放接收到的32位二進制數

        bitfinish_flag=0;//結束標志;
        bitstart_flag=0;//開始標志;
        bittime=1;//數據與開始標志識別;
        bitdata_start=0;//數據開始標志;

        ucharcodetable[]={
        0x28,/*0*/
        0x7E,/*1*/
        0xA2,/*2*/
        0x62,/*3*/
        0x74,/*4*/
        0x61,/*5*/
        0x21,/*6*/
        0x7A,/*7*/
        0x20,/*8*/
        0x60,/*9*/
        0x30,/*A*/
        0x25,/*b*/
        0xA9,/*C*/
        0x26,/*d*/
        0xA1,/*E*/
        0xB1 /*F*/
        };

        //------------------------------------------------------------------------------------------------------
        //所用到函數的聲明;
        //------------------------------------------------------------------------------------------------------
        voiddisplay(uchart);
        voidinitial();
        bitstart_check(uchardata1,uchardata2);
        bittrans_to_bit(uchardata1,uchardata2);
        voidtrans_bitdata_to_data();
        voidtrans_data();
        bitdata_check();
        voidinterrupt0();
        voiddisplay(uchart);

        //-------------------------------------------------------------------------------------------------
        //函數名稱:delay();
        //入口參數:uchar n;
        //功能:延時;

        //-------------------------------------------------------------------------------------------------


        voiddelay(ucharn)
        {
        while(n--);
        }

        //-------------------------------------------------------------------------------------------------
        //函數名稱:initial();
        //入口參數:無;
        //功能:初始化;

        //-------------------------------------------------------------------------------------------------

        voidinitial()
        {
        EA=1;//開總中斷;
        EX0=1;//開外部中斷0;
        IT0=1;//外部0中斷方式位下降沿中斷;
        TMOD=0x01;//定時器0,工作方式1;
        TH0=0x00;//置初值;
        TL0=0x00;
        time=1;
        num=0;
        data_start=0;
        start_flag=0;
        finish_flag=0;
        }

        //-------------------------------------------------------------------------------------------------
        //函數名稱:start_check();
        //入口參數:uchar data1,uchar data2;
        //出口參數類型:bit;
        //功能:開始位判斷;
        //-------------------------------------------------------------------------------------------------
        bitstart_check(uchardata1,uchardata2)
        {
        uinti;
        i=data1*256+data2;
        if(i>7500&&i<14500)
        return1;
        else
        return0;
        }


        //-------------------------------------------------------------------------------------------------
        //函數名稱:trans_to_bit();
        //入口參數:uchar data1,uchar data2;
        //出口參數類型:bit;
        //功能:將定時器的值轉化位2進制數0和1;

        //-------------------------------------------------------------------------------------------------

        bittrans_to_bit(uchardata1,uchardata2)
        {
        uint i;
        i=data1*256+data2;
        if(i>1200&&i<2300)
        return1;
        else
        return0;
        }

        //-------------------------------------------------------------------------------------------------
        //函數名稱:trans_bitdata_to_data();
        //入口參數:無;
        //出口參數類型:void;
        //功能:分離出操控碼,操控反碼,數據,數據反碼;;

        //-------------------------------------------------------------------------------------------------

        voidtrans_bitdata_to_data()
        {
        add=(uchar)(bitdata&0x000000ff);
        _add=(uchar)((bitdata&0x0000ff00)>>8);
        tdata=(uchar)((bitdata&0x00ff0000)>>16);
        _tdata=(uchar)((bitdata&0xff000000)>>24);
        }


        //-------------------------------------------------------------------------------------------------
        //函數名稱:trans_data();
        //入口參數:無;
        //出口參數類型:void;
        //功能:分離出操控碼,操控反碼,數據,數據反碼的高4位和低4位;
        //-------------------------------------------------------------------------------------------------
        voidtrans_data()
        {
        add_up=(add&0xf0)/16;
        add_down=add&0x0f;
        _add_up=(_add&0xf0)/16;
        _add_down=_add&0x0f;
        tdata_up=(tdata&0xf0)/16;
        tdata_down=tdata&0x0f;
        _tdata_up=(_tdata&0xf0)/16;
        _tdata_down=_tdata&0x0f;

        }

        //-------------------------------------------------------------------------------------------------
        //函數名稱:data_check();
        //入口參數:無;
        //出口參數類型:bit;
        //功能:檢驗所得數據的正確性;
        //-------------------------------------------------------------------------------------------------
        bitdata_check()
        {
        if((add==~_add)&&(tdata==~_tdata))
        return1;
        else
        return0;
        }

        //-------------------------------------------------------------------------------------------------
        //函數名稱:interrupt0();
        //入口參數:無;
        //出口參數類型:void;
        //功能:外部中斷0;

        //-------------------------------------------------------------------------------------------------

        voidinterrupt0()interrupt0
        {
        ucharTH0_BUF,TL0_BUF;//定時器數據緩存;
        if(!time&&data_start)//判斷起始位是否有效,為第二次中斷時;
        {
        TR0=0;//關定時器0;
        if(start_check(TH0,TL0))
        {start_flag=1;data_start=0;TH0=0x00;TL0=0x00;TR0=1;}//若起始位有效,置位開始標志位start_flag,定時器重新定時;
        else//若起始位無效,初始化,等待下個起始位;
        initial();
        }

        else if(!time&&start_flag)//起始位有效,則在第二次中斷時接收數據;
        {
        TR0=0;
        TH0_BUF=TH0;
        TL0_BUF=TL0;
        TH0=0x00;
        TL0=0x00;
        TR0=1;
        bitdata=bitdata>>1;//先移位,后賦值;
        if(trans_to_bit(TH0_BUF,TL0_BUF))
        bitdata=bitdata|0x80000000;
        else
        ;
        if(num>=31)//接收完成,完成標志finish_flag置位;
        finish_flag=1;
        else
        num++;
        }
        elseif(time)//第一此中斷,開定時器;
        {
        time=!time;
        TR0=1;
        data_start=1;
        }
        }


        //-------------------------------------------------------------------------------------------------
        //函數名稱:display();
        //入口參數:uchar t;
        //出口參數類型:void;
        //功能:顯示函數;

        //-------------------------------------------------------------------------------------------------
        voiddisplay(uchart)
        {
        while(t--)
        {
        P0=0x00;
        P2=0xfe;
        P0=table[add_up];
        delay(10);
        P0=0x00;
        P2=0xfd;
        P0=table[add_down];
        delay(10);
        P0=0x00;
        P2=0xfb;
        P0=table[_add_up];
        delay(10);
        P0=0x00;
        P2=0xf7;
        P0=table[_add_down];
        delay(10);
        P0=0x00;
        P2=0xef;
        P0=table[tdata_up];
        delay(10);
        P0=0x00;
        P2=0xdf;
        P0=table[tdata_down];
        delay(10);
        P0=0x00;
        P2=0xbf;
        P0=table[_tdata_up];
        delay(10);
        P0=0x00;
        P2=0x7f;
        P0=table[_tdata_down];
        delay(10);
        }
        }


        //----------------------------------------------------------------------------------------------
        //主函數入口;
        //----------------------------------------------------------------------------------------------

        main()
        {
        initial();//初始化;
        while(1)
        {
        display(1);
        if(finish_flag)//完成后,進行數據處理;
        {
        initial();//初始化,準備接收第二次;
        trans_bitdata_to_data();
        if(data_check())//判斷接收數據是否正確,如果正確,則顯示,否則丟棄;
        trans_data();
        }
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 图片| 班戈县| 水富县| 年辖:市辖区| 平武县| 柳河县| 望奎县| 伽师县| 眉山市| 大化| 库尔勒市| 武城县| 邵东县| 石渠县| 绿春县| 和硕县| 曲周县| 浮山县| 岱山县| 永清县| 大埔区| 亚东县| 蓬安县| 屏南县| 调兵山市| 元阳县| 德州市| 莫力| 福贡县| 盘锦市| 江油市| 溧水县| 双峰县| 曲沃县| 涡阳县| 弥渡县| 达拉特旗| 商丘市| 余庆县| 大姚县| 花莲县|