在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 8路紅外遙控開關控制器(可擴展為32路)

            8路紅外遙控開關控制器(可擴展為32路)

            作者: 時間:2011-02-27 來源:網絡 收藏

            在此給出的只是一個DEMO,主要著重于的應用上,安全方面請大家自行考慮增加。


            論壇上有一些希望能DIY多路的紅外遙控開關,我在此做了一個DOME版的,同樣用我熟悉的SAA3010T的解碼程序(省下了不少時間),程

            序可以直接用于AT89C51或AT89C2051或相容的芯片,用2051時,P1.0,P1.1要用10K電阻上拉。使用一體化接收頭時電源方面一定要做好濾波

            ,如用大的濾波電容使直流更加的穩(wěn)定,用104(0.1uF)的小電容去掉高頻等等,只有這樣才能在一定程序上提高抗干擾性。在程序方面,

            我這里做的很簡單,用了遙控器的1-8號鍵做1-8的繼電器控制,按一下為繼電器通,再按一下為繼,二次按鍵的間隔時間大約在1秒鐘,這

            樣就可以避免按一次鍵會使繼電器返復通斷(按一次鍵的時間不定發(fā)送鍵值的次數也不定)。還用了遙控的電源按鍵,按下時所有斷電器關

            閉。這個電路如果使用AT89C51的話可以找到32路或更多的控制。有網友說要做兼容多遙控學習型的,我想也是可行的,那會用到IC2器件,

            存儲收到的數據做為學習,接收時再對比對,但是如果你的數據較多的話會造成速度慢等問題。我個人認為還是用專一的遙控器好點,比如

            說你用電視遙控去遙控電視和紅外開關,當你要開電視或許同時會觸發(fā)到紅外開關。

            明浩 2004.03.28


            實驗的實物圖
            點擊放大
            原理圖-1 點擊放大(圖上31腳(EA/VPP)應接+5V)
            點擊放大
            原理圖-2 點擊放大


            鍵值編碼

            HEX文件下載:04032801_1_8COM.rar

            C51源碼:

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

            8路紅外遙控開關控制器
            (SAA3010T電視遙控器)

            Copyright 2004/3/27
            http://www.cdle.net
            http://bbs.cdle.net

            All rights reserved.

            明浩 E-mail: [email protected]
            [email protected]

            只用八路時可以用AT89C2051代替AT89C51
            一體化接收頭輸出端拉P3.2(int0),P1為控制輸出端。
            可以擴展到32路或更多
            輸出為低電平有效
            ----------------------------------------*/

            #include AT89x51.h>

            static unsigned char data IRCode[3],IRCON,IRCON2;
            static unsigned char data DT;

            void main(void)
            {
            unsigned int de;

            TMOD =0x01; //定時器0方式1
            EA =1; //允許CPU中斷
            IT0 =1; //INT0下降沿有效
            EX0 =1; //開INT0中斷;
            do
            {
            for (de=0; de10000; de++)
            P3_6 =1;
            for (de=0; de10000; de++)
            P3_6 =0;
            if (DT)
            {
            for (de=0; de30000; de++) //這里起到按鍵值正確后會有一個延時,防止重復按鍵
            P3_6 =1;
            for (de=0; de30000; de++)
            P3_6 =0;
            DT =0;
            }
            EX0 =1;
            }
            while(1);
            }

            //定時器0中斷處理
            void timeint(void) interrupt 1 using 2
            {
            TH0=0xFD;
            TL0=0x1E; //設定時值為800us

            if (IRCON3)
            {
            if (IRCON28) //每中斷一次讀一次遙控接收頭的狀態(tài),每二次為遙控編碼中的一個位
            {
            IRCON2++;
            IRCode[IRCON]=IRCode[IRCON]1; //每讀一次放入變量中的二進制的一個位,每次左移一位
            IRCode[IRCON]=IRCode[IRCON] | P3_2; //每八次填滿一個字節(jié),一個字節(jié)存放遙控編碼4個位
            }
            else
            {
            IRCON++; //填滿一個字節(jié),指向下一個變量
            IRCON2=0; //計數清零
            }
            }
            else
            {
            TR0 =0; //關閉定時器
            ET0 =0; //定時器0中斷關閉
            if ((IRCode[1]!=0xFF) (IRCode[2]!=0xFF))
            {
            if (IRCode[1] ==0x55)
            {
            switch (IRCode[2])
            {
            case 0xAB: //1-8鍵控制
            P1_0 =~P1_0;
            DT =1;
            break;
            case 0xAC:
            P1_1 =~P1_1;
            DT =1;
            break;
            case 0xAD:
            P1_2 =~P1_2;
            DT =1;
            break;
            case 0xB2:
            P1_3 =~P1_3;
            DT =1;
            break;
            case 0xB3:
            P1_4 =~P1_4;
            DT =1;
            break;
            case 0xB4:
            P1_5 =~P1_5;
            DT =1;
            break;
            case 0xB5:
            P1_6 =~P1_6;
            DT =1;
            break;
            case 0xCA:
            P1_7 =~P1_7;
            DT =1;
            break;
            case 0xD2: //按關閉電源鍵,關閉所有繼電器
            P1 =0xFF;
            DT =1;
            break;
            }
            }
            }
            }
            }

            //INT0中斷
            void INT0Fun(void) interrupt 0 using 2
            {
            EX0 =0; //外部中斷0關閉
            ET0 =1; //定時器0中斷打開
            TH0=0xFD;
            TL0=0x1E; //設定時值為800us

            for (IRCON=0; IRCON3; IRCON++)
            IRCode[IRCON] =0;
            IRCON =0;
            IRCON2 =0; //計數清零

            TR0 =1;//開始計數



            評論


            相關推薦

            技術專區(qū)

            關閉