新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 自制51單片機常用頭文件(紅外解碼)

        自制51單片機常用頭文件(紅外解碼)

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

        IR.H

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

        The user function is C51.
        Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
        All rights reserved.
        --------------------------------------------------------------------------*/
        #ifndef __IR_H__
        #define __IR_H__

        #define uchar unsigned char
        #define uint unsigned int

        #define IRIN P3_2 // 紅外引腳
        #define BEEP P3_7 // 蜂鳴器引腳

        uchar IRCOM[4]; // IRCOM[0]和IRCOM[1]存放用戶編碼;IRCOM[2]鍵值碼暫存
        // IRCOM[3]鍵值反碼存放.

        /*======================================== 紅外解碼部分 ======================================================*/

        /*****************************************************
        函 數 名:void DelayIR(uchar number)
        功 能:延時程序
        說 明:對紅外信號進行解碼時的時間比較
        入口參數:無
        返 回 值:無
        *****************************************************/
        void DelayIR(uchar number)//number*0.14MS
        {
        uchar i;

        while (number--)
        {
        for(i=13; i>0; i--);
        }
        }

        /*****************************************************
        函 數 名:void Delay_bell(void)
        功 能:蜂鳴器延時程序
        說 明:對蜂鳴器發音延時
        入口參數:無
        返 回 值:無
        *****************************************************/
        void Delay_bell(void)
        {
        uint i;

        for(i=0; i<20000; i++)
        {
        ;
        }
        }

        /*****************************************************
        函 數 名:void Buzzer(num)
        功 能:蜂鳴器發音程序
        說 明:對密碼輸入正確與否、按鍵等的提示
        入口參數:無
        返 回 值:無
        *****************************************************/
        void Buzzer(num)
        {
        while (num--)
        {
        BEEP = 0; // 燈亮
        Delay_bell(); // 延時
        BEEP = 1; // 燈滅
        Delay_bell(); // 延時
        }
        }

        /*****************************************************
        函 數 名:void IR_IN()
        功 能:紅外解碼
        說 明:把紅外編碼信號進行解碼,并存放在IRCOM[]中
        入口參數:無
        返 回 值:無
        *****************************************************/
        // 外中斷0,紅外數據接收
        void IR_IN()
        {
        uchar i,j,k,num = 0;

        do // 讀引導碼
        {
        for (i=0; i<4; i++)
        {
        if (IRIN == 0)
        {
        break;
        }
        if (i == 3)
        {
        return;
        }
        }

        DelayIR(20);
        }while (IRIN == 1); // 確認IR信號出現


        while (!IRIN)
        {
        DelayIR(1); // 等IR變為高電平
        }

        // 讀4字節按鍵編碼 = 16位的用戶碼+8位鍵值碼+8位鍵值反碼

        for (j=0; j<4; j++) // 解碼原理:0 = 0.8ms的低電平+0.4ms的高電平;
        { // 1 = 0.8ms的低電平+1.6ms的高電平
        for (k=0; k<8; k++) // 8位一接收
        {
        while (IRIN)
        {
        DelayIR(1); // 等 IR 變為低電平
        }

        while (!IRIN)
        {
        DelayIR(1); // 等 IR 變為高電平
        }

        while (IRIN) // 計算IR高電平時長
        {
        DelayIR(1);
        num++;

        if (num >= 30)
        {
        return;
        }
        }

        IRCOM[j] = IRCOM[j] >> 1; // 接收數據右移一位

        if (num >= 8)
        {
        IRCOM[j] = IRCOM[j] | 0x80; // 電平長度大于等于8,則寫入高電平
        }

        num = 0;
        } // 讀完一字節
        } // 按鍵4字節讀完
        // 接收數據檢測
        if (IRCOM[2] != ~IRCOM[3]) // 8位鍵碼!=8位鍵反碼:按鍵錯誤
        {
        return;
        }

        Buzzer(1); // 有鍵按下,蜂鳴器響一聲
        }

        /*===================================
        DT9122D 遙控器

        ****** 紅外遙控器鍵值表 ***********

        | 10 | 03 | 01 | 06 |
        - - - - - - - - - - - - - - - - - - -
        | 09 | 1D | 1F | 0D |
        - - - - - - - - - - - - - - - - - - -
        | 19 | 1B | 11 | 15 |
        - - - - - - - - - - - - - - - - - - -
        | 17 | 12 | 16 | 4C |
        - - - - - - - - - - - - - - - - - - -
        | 40 | 48 | 04 | 00 |
        - - - - - - - - - - - - - - - - - - -
        | 02 | 05 | 54 | 4D |
        - - - - - - - - - - - - - - - - - - -
        | 0A | 1E | 0E | 1A |
        - - - - - - - - - - - - - - - - - - -
        | 1C | 14 | 0F | 0C |
        =====================================*/

        #endif



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 澄城县| 上栗县| 宣恩县| 耿马| 彭山县| 松溪县| 廊坊市| 抚州市| 沅陵县| 古浪县| 界首市| 茶陵县| 鲁山县| 松滋市| 鄢陵县| 正镶白旗| 阿巴嘎旗| 呼伦贝尔市| 黄陵县| 仙桃市| 塔河县| 许昌县| 杨浦区| 清原| 綦江县| 张家港市| 历史| 衡阳市| 镶黄旗| 广宁县| 曲沃县| 会泽县| 图片| 宁阳县| 炉霍县| 吕梁市| 曲沃县| 安阳市| 新乡县| 胶州市| 肥城市|