• <rp id="m9a4z"></rp>

    <rp id="m9a4z"><object id="m9a4z"><input id="m9a4z"></input></object></rp>
    <th id="m9a4z"><pre id="m9a4z"></pre></th>

  • 0
    • 聊天消息
    • 系統消息
    • 評論與回復
    登錄后你可以
    • 下載海量資料
    • 學習在線課程
    • 觀看技術視頻
    • 寫文章/發帖/加入社區
    創作中心
    發布
    • 發文章

    • 發資料

    • 發帖

    • 提問

    • 發視頻

    創作活動

    完善資料讓更多小伙伴認識你,還能領取20積分哦, 立即完善>

    3天內不再提示

    基于51單片機設計的紅外遙控器

    DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2023-06-09 09:02 ? 次閱讀

    一、項目介紹

    遙控器是現代生活中必不可少的電子產品之一,目前市面上的遙控器種類繁多,應用范圍廣泛。而 NEC 紅外遙控器協議則是目前應用最為廣泛的一種協議之一,幾乎所有的電視、空調等家用電器都支持該協議。

    本項目是基于 51 單片機設計支持 NEC 協議的紅外遙控器,實現接收解碼和發送功能。用戶通過按下相應按鍵進行信號的發射,紅外發射二極管向外發射紅外信號,被控制設備通過紅外接收頭接收到這個信號,然后解碼執行相應的操作。

    image-20230605222006672

    image-20230605222100272

    二、硬件設計

    本項目所需的硬件器件主要包括:

    (1)5STC89C52單片機

    (2)紅外發射管

    (3)紅外接收頭

    (4)OLED顯示屏

    (5)按鍵開關

    三、軟件設計

    本項目的程序代碼采用 C 語言編寫,主要分為三個部分:初始化部分、接收解碼部分和發送數據部分。

    (1)初始化部分

    初始化函數主要完成各個端口的初始化和定時器的配置,以及紅外接收頭和紅外發射管的引腳的配置。

    (2)接收解碼部分

    接收解碼函數主要采用計數器方式對紅外遙控器發送的信號進行捕獲,并將捕獲到的信號轉換成 NEC 碼。然后根據 NEC 碼的規定,解碼出用戶所輸入的指令,最終實現控制設備的功能。

    (3)發送數據部分

    發送數據函數主要將單片機中存放的指令碼進行編碼,并通過紅外發射管發送給被控制的設備。在該函數中,需要通過計時器的方式來調節發送信號的時間和頻率,以保證信號能夠正確傳輸。

    四、代碼實現

    4.1 NEC協議解碼代碼

    下面是基于 51 單片機實現 NEC 協議解碼的代碼:

    #define IRIN P1_0   //紅外接收管
     unsigned char code Remote6[] = {0x06, 0x09, 0x08, 0x0a, 0x0c, 0x0d, 0x0f};
     //遙控器按鍵對應的命令碼
     ?
     unsigned char read_IR()    //讀取紅外信號
     {
       int k = 0;
       unsigned char data = 0;
     ?
       while (IRIN)   //等待低電平出現
       {
         k++;
     ?
         if (k > 1000)
           return 0;  //超時返回
       }
     ?
       k = 0;
     ?
       while (!IRIN)  //等待高電平出現
       {
         k++;
     ?
         if (k > 1000)
           return 0;  //超時返回
       }
     ?
       k = 0;
     ?
       while (IRIN)   //等待低電平出現
       {
         k++;
     ?
         if (k > 1000)
           return 0;  //超時返回
       }
     ?
       for (int i = 0; i < 8; i++)    //解碼 8 個 bit
       {
         k = 0;
     ?
         while (!IRIN)  //等待高電平出現
         {
           k++;
     ?
           if (k > 1000)
             return 0;  //超時返回
         }
     ?
         delay_us(650);
     ?
         if (IRIN)   //判斷 bit 的值
           data |= (1 < < i);
     ?
         k = 0;
     ?
         while (IRIN)   //等待低電平出現
         {
           k++;
     ?
           if (k > 1000)
             return 0;  //超時返回
         }
       }
     ?
       return data;    //返回解碼結果
     }
     ?
     unsigned char decode_IR(unsigned char code_val)   //NEC 碼轉換為命令碼
     {
       for (int i = 0; i < 7; i++)
       {
         if (Remote6[i] == code_val)
           return (i + 1);
       }
     ?
       return 0;
     }
     ?
     void main()
     {
       unsigned char data = 0;
       unsigned char code_val = 0;
     ?
       while (1)
       {
         data = read_IR();   //讀取紅外信號
     ?
         if (data == 0)   //判斷是否讀取成功
           continue;
     ?
         code_val = decode_IR(data);   //將 NEC 碼轉換為命令碼
     ?
         switch (code_val)    //根據命令碼控制設備
         {
           case 1:         //控制設備執行命令 1
             break;
           case 2:         //控制設備執行命令 2
             break;
           case 3:         //控制設備執行命令 3
             break;
           case 4:         //控制設備執行命令 4
             break;
           case 5:         //控制設備執行命令 5
             break;
           case 6:         //控制設備執行命令 6
             break;
           default:
             break;
         }
       }
     }
    

    以上代碼主要實現了讀取紅外信號和將 NEC 碼轉換為命令碼的功能,并且可以根據不同的命令碼控制設備執行不同的指令。

    4.2 NEC協議發送代碼

    以下是基于 51 單片機實現 NEC 協議發送的代碼,可以根據需要修改指令碼來控制不同的設備:

    #define IRLED P1_1   //紅外發射管
     unsigned char code Remote6[] = {0x06, 0x09, 0x08, 0x0a, 0x0c, 0x0d, 0x0f};
     //遙控器按鍵對應的命令碼
     ?
     void delay_us(unsigned int us)    //延時函數,單位為微秒
     {
       while (us--)
         _nop_();
     }
     ?
     void send_IR(unsigned char data)    //發送紅外信號
     {
       unsigned char mask = 0x01;        //bit 掩碼
     ?
       for (int i = 0; i < 8; i++)      //發送 8 個 bit
       {
         if (data & mask)
         {
           IRLED = 0;
           delay_us(600);
           IRLED = 1;
           delay_us(1600);
         }
         else
         {
           IRLED = 0;
           delay_us(600);
           IRLED = 1;
           delay_us(600);
         }
     ?
         mask < <= 1;   //移位更新掩碼
       }
     ?
       IRLED = 0;      //發送結束,將紅外發射管關閉
     }
     ?
     void send_command(unsigned char code_val)   //將命令碼轉換為 NEC 碼并發送
     {
       unsigned char nec_val = 0;
     ?
       if (code_val > 6)     //判斷是否超出范圍
         return;
     ?
       nec_val = 0x80 | (code_val < < 4) | ((~code_val) & 0x0F);    //計算 NEC 碼
     ?
       for (int i = 0; i < 2; i++)    //發送兩遍,以提高成功率
       {
         send_IR(nec_val);
         delay_ms(50);
       }
     }
     ?
     void main()
     {
       while (1)
       {
         //向電視發送命令碼為 1 的指令
         send_command(1);
         delay_ms(1000);   //延時 1s
       }
     }
    

    以上代碼主要實現了將命令碼轉換為 NEC 碼并發送的功能,可以根據需要修改指令碼來控制不同的設備。

    紅外發射管發射的紅外信號有一定的傳輸范圍和傳輸角度限制,需要根據具體情況調整發射管的位置和方向。

    4.3 按鍵檢測代碼

    以下是支持控制發送不同控制碼的代碼,可以根據需要修改指令碼和按鍵設置:

    #define IRLED P1_1   //紅外發射管
     #define IRIN P1_0    //紅外接收管
     ?
     unsigned char code Remote6[] = {0x06, 0x09, 0x08, 0x0a, 0x0c, 0x0d, 0x0f};
     //遙控器按鍵對應的命令碼
     ?
     unsigned char read_IR()    //讀取紅外信號
     {
       int k = 0;
       unsigned char data = 0;
     ?
       while (IRIN)   //等待低電平出現
       {
         k++;
     ?
         if (k > 1000)
           return 0;  //超時返回
       }
     ?
       k = 0;
     ?
       while (!IRIN)  //等待高電平出現
       {
         k++;
     ?
         if (k > 1000)
           return 0;  //超時返回
       }
     ?
       k = 0;
     ?
       while (IRIN)   //等待低電平出現
       {
         k++;
     ?
         if (k > 1000)
           return 0;  //超時返回
       }
     ?
       for (int i = 0; i < 8; i++)    //解碼 8 個 bit
       {
         k = 0;
     ?
         while (!IRIN)  //等待高電平出現
         {
           k++;
     ?
           if (k > 1000)
             return 0;  //超時返回
         }
     ?
         delay_us(650);
     ?
         if (IRIN)   //判斷 bit 的值
           data |= (1 < < i);
     ?
         k = 0;
     ?
         while (IRIN)   //等待低電平出現
         {
           k++;
     ?
           if (k > 1000)
             return 0;  //超時返回
         }
       }
     ?
       return data;    //返回解碼結果
     }
     ?
     void delay_ms(unsigned int ms)   //延時函數,單位為毫秒
     {
       while (ms--)
         for (int i = 0; i < 120; i++)
           _nop_();
     }
     ?
     void delay_us(unsigned int us)    //延時函數,單位為微秒
     {
       while (us--)
         _nop_();
     }
     ?
     void send_IR(unsigned char data)    //發送紅外信號
     {
       unsigned char mask = 0x01;        //bit 掩碼
     ?
       for (int i = 0; i < 8; i++)      //發送 8 個 bit
       {
         if (data & mask)
         {
           IRLED = 0;
           delay_us(600);
           IRLED = 1;
           delay_us(1600);
         }
         else
         {
           IRLED = 0;
           delay_us(600);
           IRLED = 1;
           delay_us(600);
         }
     ?
         mask < <= 1;   //移位更新掩碼
       }
     ?
       IRLED = 0;      //發送結束,將紅外發射管關閉
     }
     ?
     void send_command(unsigned char code_val)   //將命令碼轉換為 NEC 碼并發送
     {
       unsigned char nec_val = 0;
     ?
       if (code_val > 6)     //判斷是否超出范圍
         return;
     ?
       nec_val = 0x80 | (code_val < < 4) | ((~code_val) & 0x0F);    //計算 NEC 碼
     ?
       for (int i = 0; i < 2; i++)    //發送兩遍,以提高成功率
       {
         send_IR(nec_val);
         delay_ms(50);
       }
     }
     ?
     void main()
     {
       unsigned char data = 0;
       unsigned char code_val = 0;
     ?
       while (1)
       {
         data = read_IR();   //讀取紅外信號
     ?
         if (data > 0)   //判斷是否有按鍵按下
         {
           code_val = Remote6[data - 1];   //根據按鍵編號獲取命令碼
           send_command(code_val);         //將命令碼轉換為 NEC 碼并發送
           delay_ms(500);                  //延時一段時間,防止頻繁發送
         }
       }
     }
    

    以上代碼主要實現了支持控制發送不同控制碼的功能,可以根據需要修改指令碼和按鍵設置。當用戶按下遙控器上的按鍵時,程序會根據按鍵編號獲取到對應的命令碼,并將其轉換為 NEC 碼進行發送。

    審核編輯 黃宇

    聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯系本站作侵刪。 侵權投訴
    • 51單片機
      +關注

      關注

      261

      文章

      5159

      瀏覽量

      118646
    • 紅外遙控器
      +關注

      關注

      2

      文章

      107

      瀏覽量

      21143
    收藏 人收藏

      評論

      相關推薦

      自制紅外遙控器

      51單片機自制一個紅外遙控器,望各位學長不吝賜教!
      發表于 10-29 13:22

      如何讓紅外遙控器控制單片機

      紅外遙控器紅外線接收模塊stc52單片機 就是不知道如何將三者聯系起來并通過按紅外遙控器上的按鍵來實現控制單片機從而讓單片機執行其他的功能 求C預言程序
      發表于 04-23 17:11

      51單片機紅外遙控器控制步進電機的轉動的程序咋寫?

      51單片機紅外遙控器控制步進電機的轉動的程序咋寫
      發表于 02-24 18:52

      Enroo紅外遙控器IC單片機

      遙控器與手機App結合的新玩法,將萬能紅外遙控器插入手機的3.5mm口或者Lighting口即可對你家里的電器智能遙控了,紅外遙控的穩定距離取決于采用的IC單片機芯片。手機本身沒有紅外線發射功能,所以需要
      發表于 10-16 11:16

      紅外遙控器單片機的硬件接口的設計

      紅外遙控系統設計及應用:本文介紹了紅外遙控系統的設計,紅外遙控器單片機的硬件接口以及完整的軟件解碼方案、源程序、應用方法,為各類紅外遙控器單片機控制產品中
      發表于 05-24 01:34 ?276次下載

      51單片機解碼紅外遙控器原理介紹

      紅外解碼的一般原理,51單片機紅外遙控接收的原理圖
      發表于 11-16 17:47 ?88次下載

      基于MSP430_單片機紅外遙控器設計

      單片機紅外遙控器設計
      發表于 10-12 09:39 ?11次下載
      基于MSP430_<b>單片機</b>的<b>紅外</b><b>遙控器</b>設計

      基于MSP430單片機紅外遙控器設計

      單片機紅外遙控器設計
      發表于 10-13 08:46 ?27次下載
      基于MSP430<b>單片機</b>的<b>紅外</b><b>遙控器</b>設計

      使用STM8單片機設計的紅外遙控器解碼的程序電路圖芯片資料免費下載

      單片機設計的紅外遙控器解碼的程序電路圖芯片資料免費下載。
      發表于 12-07 17:12 ?45次下載
      使用STM8<b>單片機設</b>計的<b>紅外</b><b>遙控器</b>解碼的程序電路圖芯片資料免費下載

      使用51單片機設計的遙控紅外指紋鎖的程序和使用說明

      51單片機設計的遙控紅外指紋鎖的程序和說明。
      發表于 01-21 08:00 ?4次下載
      使用<b>51</b><b>單片機設</b>計的<b>遙控</b><b>紅外</b>指紋鎖的程序和使用說明

      使用51單片機設紅外遙控器的詳細資料說明

      紅外遙控器紅外接收模塊兩部分。紅外遙控器包括矩陣鍵盤、增強型51單片機(STC11L04E)、紅外發射電路組成。單片機掃描矩陣鍵盤后,將按鍵狀態進行信源編碼與信道編碼,載波(38k脈沖
      發表于 09-16 17:22 ?25次下載
      使用<b>51</b><b>單片機設</b>計<b>紅外</b><b>遙控器</b>的詳細資料說明

      使用51單片機設計在數碼管上顯示紅外遙控器按鈕的碼值程序免費下載

      51單片機設計在數碼管上顯示紅外遙控器按鈕的碼值程序免費下載。
      發表于 09-02 17:28 ?2次下載
      使用<b>51</b><b>單片機設</b>計在數碼管上顯示<b>紅外</b><b>遙控器</b>按鈕的碼值程序免費下載

      使用51單片機設紅外遙控器的程序庫文件免費下載

      51單片機設紅外遙控器的程序庫文件免費下載。
      發表于 07-08 17:41 ?7次下載
      使用<b>51</b><b>單片機設</b>計<b>紅外</b><b>遙控器</b>的程序庫文件免費下載

      基于單片機系統的紅外遙控器的應用程序

      紅外遙控器由于其體積小、功耗低、功能強、成本低的特點,已經在家電產品設備中廣泛應用?,F代智能化儀器儀表系統、工業設備中的控制輸入也較多地使用紅外遙控器。本文給出紅外遙控器信號發射原理、紅外接收器的連接方式和單片機軟件解碼應用程序,并提供了一種對未知
      發表于 07-15 15:06 ?3967次閱讀
      基于<b>單片機</b>系統的<b>紅外</b><b>遙控器</b>的應用程序

      下載硬聲App

      洞里的珠子一颗一颗被扯出,日本JAPANESEXXXX日本熟,欧洲美女粗暴牲交免费观看,性啪啪CHINESE东北女人