新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 利用AVR的輸入捕捉進行紅外解碼

        利用AVR的輸入捕捉進行紅外解碼

        作者: 時間:2016-12-03 來源:網絡 收藏
        使用AVR輸入捕捉可以對組碼進行有效地區分,這里是對紅外接收頭接收到遙控器的碼型進行解碼,也可以擴展到其他的應用領域。

        關于紅外的基本知識參看下面的參考文章。需要說明的是紅外的數據端口電源最好加10uf濾波電容,然后數據引腳加上1K限流電阻。

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

        硬件平臺:ATMega16-16PU 紅外接收頭4338 康佳遙控器

        編譯器: IAR For AVR

        代碼:

        /*================START==================*/

        #include
        #include
        #include

        /**********************************************************
        變量聲明
        **********************************************************/

        unsigned int Receive_NewData = 0;
        unsigned int Receive_OldData = 0;
        unsigned int Calc_num = 0;
        unsigned int Temp;
        unsigned char Num;
        unsigned char buffer[5]={0};

        /**********************************************************
        定時器1 捕獲定時器初始化
        **********************************************************/
        void Timer1_Init(void)
        {
        TCCR1A = 0x00;
        // Input Capture on Falling Edge
        TCCR1B = (1< // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK = (1<}
        /**********************************************************
        開始捕獲
        **********************************************************/
        void main(void)
        {
        Timer1_Init();
        _SEI();// Global enable interrupts
        while(1){;}
        }
        /**********************************************************
        定時器1 捕獲中斷 中斷服務程序
        **********************************************************/
        #pragma vector=TIMER1_CAPT_vect//定時器1 輸入捕獲中斷
        __interrupt void OldTimer1_capt_isr(void)
        // Timer 1 input capture interrupt service routine
        {
        unsigned char i,j;
        Receive_NewData = ICR1; //得到新的數據
        Temp = Receive_NewData - Receive_OldData ;//用這一次的數據減去上一次的數據,得到本次捕捉時間
        Receive_OldData = Receive_NewData ;//更新數據到 Receive_OldData

        if(Temp>100 && Temp<150)// ‘0 ’ 信號
        {
        Num = 0;
        }
        else if(Temp>230 && Temp<280)// ‘1 ’ 信號
        {
        Num = 1;
        }
        else if(Temp>1300 && Temp<1800)// ‘ hearder ’信號
        {
        Calc_num = 0;
        Num = 2;
        }
        else//干擾信號
        {
        return ;
        }

        //將二進制碼轉換成十六進制

        //按下的按鍵鍵值碼型應為 1001 1000 1000 0011 0011 1011 (1110 1100 0001 0011 )11
        for(i=0;i<5;i++)
        {
        if((Calc_num>8*i) && (Calc_num<(8*i+8)))
        {
        buffer[i]=buffer[i] | Num;
        buffer[i]<<=1;
        }
        else if(Calc_num==(8*i+8))
        {
        buffer[i]=buffer[i] | Num;
        }
        }


        Calc_num++; //計數變量


        if(Calc_num>41)
        {
        Calc_num=0;
        for(j=0;j<5;j++)
        {
        buffer[j]=0;
        }
        }

        }

        /*================END==================*/

        粗體部分是下面代碼總結的:

        /*
        if((Calc_num>0) && (Calc_num<8))
        {
        buffer[0]=buffer[0] | Num;
        buffer[0]<<=1;
        }
        else if(Calc_num==8)
        {
        buffer[0]=buffer[0] | Num;
        }
        //-------------

        if((Calc_num>8) && (Calc_num<16))
        {
        buffer[1]=buffer[1] | Num;
        buffer[1]<<=1;
        }
        else if(Calc_num==16)
        {
        buffer[1]=buffer[1] | Num;
        }
        //-------------
        if((Calc_num>16) && (Calc_num<24))
        {
        buffer[2]=buffer[2] | Num;
        buffer[2]<<=1;
        }
        else if(Calc_num==24)
        {
        buffer[2]=buffer[2] | Num;
        }
        //-------------
        if((Calc_num>24) && (Calc_num<32))
        {
        buffer[3]=buffer[3] | Num;
        buffer[3]<<=1;
        }
        else if(Calc_num==32)
        {
        buffer[3]=buffer[3] | Num;
        }
        //-------------
        if((Calc_num>32) && (Calc_num<40))
        {
        buffer[4]=buffer[4] | Num;
        buffer[4]<<=1;
        }
        else if(Calc_num==40)
        {
        buffer[4]=buffer[4] | Num;
        }

        */
        //-------------



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 黄龙县| 绿春县| 山阴县| 汕头市| 兖州市| 宜阳县| 巴林右旗| 涟源市| 新和县| 敦煌市| 凌源市| 江都市| 永新县| 炎陵县| 黄梅县| 虞城县| 繁昌县| 武宁县| 乾安县| 道真| 洱源县| 津市市| 安庆市| 涞水县| 澜沧| 廉江市| 玛纳斯县| 开远市| 浮山县| 永善县| 肥乡县| 招远市| 竹北市| 临颍县| 三亚市| 沙雅县| 新源县| 永济市| 泊头市| 河北区| 大连市|