關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > 紅外線接收控制器的制作

        紅外線接收控制器的制作

        作者: 時間:2011-08-14 來源:網絡 收藏

        在生活中,我們常用到控制各類電器,如彩電、空調、電風扇等,為我們帶來較多的方便,但有時我們仍感到不方便。如看完電視后,用遙控器只能關掉電視主電源,電視仍處于待機狀態,使用者還得走到電視跟前,按下電視電源開關方能放心。若想看電視,還得動身開電視,顯得很麻煩,尤其是冬天躺在床上看電視,上上下下,深感不便。本文以利用紅外遙控器來遙控風扇的方法為例(可任選一只遙控器,能調速,軟件稍作改變,可增加定時功能等),來介紹方法,如果電視交流電源的開、關,可與電視共用一只遙控器,制作也較簡單些。

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

        制作思路

        紅外遙控發射器是利用紅外線作載體傳送信息的,發射周期不等的經過調制后串行碼,該串行碼一般由引導碼、用戶識別碼、操作碼組成。經紅外頭解碼后得到一串周期不等的矩形波,如示意圖1。

        不同型號的遙控發射器的波形寬度不同,即周期T1、T2……不同,在不知手頭遙控發射器的波形周期的情況下,首先要制作一個檢測紅外線周期的工具。根據測得的周期規律來制作紅外線

        制作方法

        檢測紅外周期的器件制作,見圖2。

        當紅外接收頭沒有接收到發射器發送來的紅外線,其輸出端輸出高電平(約+5V)。當接收到紅外線,輸出端電平變低,送到單片機AT89C2051的外部中斷1口即INT1,使其發生中斷而進入中斷服務:啟動定時器1并開始計數,相當于在圖1的A點,1個周期后即C點,單片機第二次中斷,關定時器1,記下周期T1(實際上只記下TH1的數值,TL1的值可以丟棄),然后清TH1、TL1,再啟動定時器1重新計數,第二個周期完后,同樣會引起單片機發生中斷,再記下周期T2……,如此記下40-50個周期(一般紅外編碼為4字節,即32BIT,之前還有引導碼,又因接收到的紅外數據不一定是從引導碼開始,要分析一次完整的串行碼,應盡可能多記下紅外矩形波周期數),接收完后,通過按輕觸開關將各記下的各周期的TH1在數碼管顯示出來以作分析(每按一次輕觸開關,顯示下一個周期數)。

        編程方法

        在main()中開中斷,啟動定時器1,即EA=1; EX1=1; IT1=1; TR1=1;
        在外部中斷1的服務程序中編寫如下語名:
        #define CNT 50//預測50個紅外線周期
        DATA Byte value_h[CNT];//記錄周期的變量(數組)
        DATA Byte count=0;//接收到的周期數
        void int1(void) interrupt 2
        {
        if(TH1==TL1TL1==0) //判斷是否是第一次接收到紅外數據
        {
        TR1=1;
        } else{
        TR1=0; value_h[count]=TH1; TH1=TL1=0; TR1=1; count++;
        if(count==CNT)
        {
        EX1=0; count=0;
        }
        }
        }
        假設接收到的TH的數值為:
        30,50, 04,08,08,08, 04,04,04,04, 04,08,08,08, 04,04,04,04, 08,04,04,08, 04,04,04,04,04, 04,08,08,04, 08,08,08,08,3f,50----
        稍作分析可知,表示高低電平的有效數為:04,08。若將04定作低電平,08定作高電平,舍棄其他數據,得到4字節數據即:01110000,01110000 ,10010000,01101111。轉為十六進制后得:70h,70h,90h,6fh,至此得到遙控發射器剛才按下的鍵值碼,用同樣的方法可以測得其他鍵鍵值碼。假設有:
        70h,70h,0x90,0x6f, //0鍵
        70h,70h, 0x00,0xff, //1鍵
        ……
        70h,70h, 0xd0,0x2f //power 鍵
        根據以上數據分析得,每鍵碼為4字節,前2字節固定不變,為用戶識別碼,后2字節均不同,是操作碼。將遙控器上的各鍵鍵值碼測出后,根據這些數據可以根據制作需要進行編程了。因鍵值碼為4字節太長,不利于編程,需要將各鍵鍵值轉為相對應的1字節的數據,如:70h,70h,0x90,0x6f,對應于0 ,70h,70h, 0x00,0xff對應于1……
        轉換方法:
        建立一個數組,將上述測得的各鍵碼按順序放入數組中(去掉用戶識別碼)
        code Byte arr[][2]=
        {
        0x90,0x6f, //0,盡可能按鍵0、鍵1……的先后順序放,以符合習慣
        0x00,0xff, //1
        ……
        0x10,0xef, //9
        0xd0,0x2f //power 13
        };
        在接收紅外線的外部中斷1函數中編寫如下的鍵碼轉換語句:
        DATA Byte arrtmp[4];
        DATA Byte Keytmp; //轉換后的鍵值寄存變量
        DATA Byte Keyval=NOKEY;
        bit KeyOk;// 鍵值轉換完成與否的標志
        bit d_Ok;//接收到一個完整的鍵碼標志
        void Ex_int(void) interrupt 2
        {
        Byte i;
        Byte (*p)[2];
        ……
        if(d_Ok) //若接收到完整的鍵碼
        {
        d_Ok=0; //清除
        if(arrtmp[0]==0x70arrtmp[1]
        ==0x70){ //鍵碼轉換
        for(p=arr,i=0;i14;i++,p++)
        { if(arrtmp[2]==*(*p+0)arrtmp[3]
        ==*(*p+1))
        { Keytmp=i; KeyOk=1; //鍵值
        轉換成功標志
        break;
        } else {Keytmp=NOKEY; } //未
        接收到完整的鍵值
        }
        }else { Keytmp=NOKEY; }
        }
        }
        經過轉換后的Keytmp為0、1、2……的整數,然后再編寫主函數、調速函數(參源程序),來進行電風扇調速。
        有關電路的一些解釋:單片機U1(AT89C2051)P37腳輸出高低電平通過R13控制光耦可控硅MOC3041(參數可在《電子制作》網站查找)通斷,通過控制其通斷時間比來達到電風扇調速。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 邹城市| 壶关县| 平果县| 子长县| 全南县| 会同县| 夏河县| 清原| 德惠市| 响水县| 大关县| 吴旗县| 甘德县| 台中市| 太保市| 彭阳县| 福泉市| 永修县| 巴彦县| 拉萨市| 文昌市| 灵璧县| 洛川县| 永康市| 万全县| 东源县| 乌兰察布市| 屯留县| 五指山市| 凤城市| 肥城市| 永昌县| 瓦房店市| 威远县| 天祝| 苍山县| 大田县| 东阿县| 常山县| 崇明县| 花莲县|