找回密碼
         注冊會員
        搜索附件  
        MCU資訊論壇 附件中心 單片機論壇 51單片機論壇 單片機紅外遙控器設計.doc

        單片機紅外遙控器設計.doc

         

        數碼管顯示32位紅外遙控按鍵編碼值(原創):
        看了工人大哥關于紅外遙控器的帖子,打算自己也做一個,但是自己沒有LCD屏幕,所以用LED數碼管代替,還有和工人大哥的遙控器不同的是我手上是32位的遙控器。所以在網絡上找了32編碼遙控器的資料;


        紅外線遙控是目前使用很廣泛的一種通信和遙控技術。由于紅外線遙控裝置具有體積小、功耗低、功能強、成本低等特點,因而,繼彩電、錄像機之后,在錄音機、音響設備、空凋機以及玩具等其它小型電器裝置上也紛紛采用紅外線遙控。工業設備中,在高壓、輻射、有毒氣體、粉塵等環境下,采用紅外線遙控不僅完全可靠而且能有效地隔離電氣干擾。

        紅外線是太陽光線中眾多不可見光線中的一種,由德國科學家霍胥爾于1800年發現,又稱為紅外熱輻射,他將太陽光用三棱鏡分解開,在各種不同顏色的色帶位置上放置了溫度計,試圖測量各種顏色的光的加熱效應。結果發現,位于紅光外側的那支溫度計升溫最快。因此得到結論:太陽光譜中,紅光的外側必定存在看不見的光線,這就是紅外線。也可以當作傳輸之媒界。 太陽光譜上紅外線的波長大于可見光線,波長為0.751000μm。紅外線可分為三部分,即近紅外線,波長為0.751.50μm之間;中紅外線,波長為1.506.0μm之間;遠紅外線,波長為6.0l000μm 之間。
        真正的紅外線夜視儀是光電倍增管成像,與望遠鏡原理全完不同,白天不能使用,價格昂貴且需電源才能工作。

         【紅外遙控系統】   通用紅外遙控系統由發射和接收兩大部分組成,應用編/解碼專用集成電路芯片來進行控制操作,如圖1所示。發射部分包括鍵盤矩陣、編碼調制、LED紅外發送器;接收部分包括光、電轉換放大器、解調、解碼電路。









        【遙控發射器及其編碼】   紅外遙控發射器專用芯片很多,根據編碼格式可以分成兩大類,這里我們以運用比較廣泛,解碼比較容易的一類來加以說明,現以日本NECuPD6121G組成發射電路為例說明編碼原理。當發射器按鍵按下后,即有遙控碼發出,所按的鍵不同遙控編碼也不同。這種遙控碼具有以下特征:

          采用脈寬調制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms的組合表示二進制的“1”,其波形如圖2所示。








        上述“0”“1”組成的32位二進制碼經38kHz的載頻進行二次調制以提高發射效率,達到降低電源功耗的目的。然后再通過紅外發射二極管產生紅外線向空間發射,如圖3所示,連發波形如圖4所示。







        UPD6121G產生的遙控編碼是連續的32位二進制碼組,其中前16位為用戶識別碼,能區別不同的電器設備,防止不同機種遙控碼互相干擾。該芯片的用戶識別碼固定為十六進制01H;后16位為8位操作碼(功能碼)及其反碼。UPD6121G最多額128種不同組合的編碼。

          當遙控器在按鍵按下后,周期性地發出同一種32位二進制碼,周期約為108ms。一組碼本身的持續時間隨它包含的二進制“0”“1”的個數不同而不同,大約在4563ms之間,圖4為發射波形圖。

          當一個鍵按下超過36ms,振蕩器使芯片激活,將發射一組108ms的編碼脈沖,108ms發射代碼由一個起始碼(9ms,一個結果碼(4.5ms,8位地址碼(9ms~18ms,8位地址碼(9ms~18ms,8位數據碼(9ms~18ms)和這8位數據的反碼(9ms~18ms)組成。如果鍵按下超過108ms仍未松開,接下來發射的代碼(連發代碼)將僅由起始碼(9ms)和結束碼(2.5ms)組成。
         代碼格式(以接收代碼為準,接收代碼與發射代碼反向)
            位定義




        單發代碼格式



        連發代碼格式





        注:代碼寬度算法:

          16位地址碼的最短寬度:1.12×16=18ms 16位地址碼的最長寬度:2.24ms×16=36ms

          已知8位數據代碼及其8位反代碼的寬度和不變:(1.12ms+2.24ms)×8=27ms

          ∴ 32位代碼的寬度為(18ms+27ms)~(36ms+27ms)

          1解碼的關鍵是如何識別“0”“1”,從位的定義我們可以發現“0”“1”均以0.56ms的低電平開始,不同的是高電平的寬度不同,“0”0.56ms,“1”1.68ms,所以必須根據高電平的寬度區別“0”“1”。如果從0.56ms低電平過后,開始延時,0.56ms以后,若讀到的電平為低,說明該位為“0”,反之則為“1”,為了可靠起見,延時必須比0.56ms長些,但又不能超過1.12ms,否則如果該位為“0”,讀到的已是下一位的高電平,因此取(1.12ms+0.56ms/2=0.84ms最為可靠,一般取0.84ms左右均可。
          2根據碼的格式,應該等待9ms的起始碼和4.5ms的結果碼完成后才能讀碼。

         



        下面是我寫的程序,程序分成兩個部分,分開寫的,一個部分是主程序數碼管顯示main(),一個部分是遙控器解碼程序IRInit(),


        第一部分;

        /*注意這里在數碼管上顯示的是十進制數字,把其轉換為十六進制就是遙控器的各個按鍵的編碼*/

        #include<reg52.h>
        sbit key=P1^3;
        unsigned int number=0;
        unsigned char j,n,i=0;
        unsigned int ledout[10];
        unsigned char code led_num[]={0xfc,0x60,0xda,0xf2,0x66,
        0xb6,0xbe,0xe0,0xfe,0xf6 }; //共陽數碼管的0-9編碼
        unsigned char code led_duan[]={0xfe,0xfd,0xfb,0xf7,
        0xef,0xdF,0xbF,0x7F}; //段選信號編碼,我這里是直接用一個i/o口接的八個數碼管的共陰極

        extern void IRInit();//外部函數申明
        void main()
        {
        while(1)
        { ledout[7]=led_num[number%10];
        ledout[6]=led_num[number/10%10];
        ledout[5]=led_num[number/100%10];
        ledout[4]=led_num[number/1000%10];
        ledout[3]=led_num[number%10];
        ledout[2]=led_num[number/10%10];
        ledout[1]=led_num[number/100%10];
        ledout[0]=led_num[number/1000%10];
        for(j=0;j<9;j++) //數碼管動態顯示,number的值;
        {
        P0=led_duan[j];
        P2=ledout[j];
        for(n=0;n<200;n++);
        }
        IRInit(); //調用解碼程序,把遙控編碼負值給number;
        }

        }




        下面是第二部分;


        #include <reg51.h>
        sbit IRIN = P3^2; //紅外接收器數據線
        void IRdelay(char x); //x*0.14MS
        unsigned char IRCOM[7];
        extern unsigned int number; //外部變量聲明


        void IRInit()
        {
        IE |= 0x81; //允許總中斷中斷,使能 INT0 外部中斷
        TCON |= 0x01; //觸發方式為脈沖負邊沿觸發

        IRIN=1; //I/O口初始化
        }


        void IR_IN() interrupt 0
        {
        unsigned char j,k,N=0;
        EX0 = 0;
        IRdelay(15);
        if (IRIN==1)
        { EX0 =1;
        return;
        }
        //確認IR信號出現
        while (!IRIN) //等IR變為高電平,跳過9ms的前導低電平信號。
        {IRdelay(1);}

        for (j=0;j<4;j++) //收集四組數據
        {
        for (k=0;k<8;k++) //每組數據有8位
        {
        while (IRIN) //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
        {IRdelay(1);}
        while (!IRIN) //等 IR 變為高電平
        {IRdelay(1);}
        while (IRIN) //計算IR高電平時長
        {
        IRdelay(1);
        N++;
        if (N>=30)
        { EX0=1;
        return;} //0.14ms計數過長自動離開。
        } //高電平計數完畢
        IRCOM[j]=IRCOM[j] >> 1; //數據最高位補“0”
        if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //數據最高位補“1”
        N=0;
        }
        }

        if (IRCOM[2]!=~IRCOM[3]) //判斷接收的第三組數據和四組數據是否相反
        { EX0=1;
        return; }
        EX0 = 1;
        }
        /**********************************************************/
        void IRdelay(unsigned char x) //x*0.14MS
        {
        unsigned char i;
        while(x--)
        {
        for (i = 0; i<13; i++) {}
        }
        }



        一下是實物效果圖;因為一個手要拿手機,所以效果不好!














        因為本人剛剛學習單片機不久,所以編程能力可能不怎么的,希望大家看看給點意見,謝謝,在這里還要謝謝工人大哥!!








        這里面是圖片資料

        QQ|手機版|MCU資訊論壇 ( 京ICP備18035221號-2 )|網站地圖

        GMT+8, 2025-5-5 04:26 , Processed in 0.042008 second(s), 9 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2025 Discuz! Team.

        日本精品中文字幕| 久久91精品国产91久久麻豆| 四虎国产精品免费入口| 日韩高清的天堂在线观看免费| 羞羞视频网站在线观看| 精品少妇无码AV无码专区| 国产午夜精品一区二区三区| 国产精品成人99久久久久 | 国产精品久久久久影院嫩草| 国产亚洲精品不卡在线| 青草国产精品视频。| 完整观看高清秒播国内外精品资源| 爽爽精品dvd蜜桃成熟时电影院| 亚洲国产精品久久久久网站| 中文精品99久久国产| 亚洲av永久无码精品漫画| 亚洲国产精品lv| 免费视频精品一区二区| 久久精品国产99久久久| 国产精品H片在线播放| 中文字幕日韩精品无码内射 | 日韩精品一区二区三区大桥未久| 久久精品国产亚洲AV不卡| 亚洲国产精品无码专区影院| 亚洲国产精品国自产电影| 欧美性精品hd在线观看| 国产亚洲精品a在线观看app| 国产精品自产拍在线18禁| 中文字幕日韩精品无码内射| 91精品国产91久久久久久青草| 亚洲之色在线v中文字幕app| www.99精品| 色www免费视频| 2018国产精华国产精品| 老年人精品视频在线| 国产精品igao视频网网址| 精品国产一区二区三区AV性色 | 四虎影视国产精品永久在线| 曰本福利写真片视频在线| 精品久久一区二区三区| 亚洲精品无码久久久久AV麻豆|