女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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單片機
    +關注

    關注

    277

    文章

    5708

    瀏覽量

    126357
  • 紅外遙控器
    +關注

    關注

    3

    文章

    133

    瀏覽量

    22058
收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

    紅外遙控系統設計及應用:本文介紹了紅外遙控系統的設計,紅外遙控器
    發表于 05-24 01:34 ?279次下載

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

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

    單片機解碼紅外遙控器

    本文以TC9012編碼芯片的遙控器為例,談談如何用常用的51系統單片機進行遙控的解碼。
    發表于 03-30 17:02 ?6次下載

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

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

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

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

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

    本文檔的主要內容詳細介紹的是使用STM8單片機設計的紅外遙控器解碼的程序電路圖芯片資料免費下載。
    發表于 12-07 17:12 ?49次下載
    使用STM8<b class='flag-5'>單片機設</b>計的<b class='flag-5'>紅外</b><b class='flag-5'>遙控器</b>解碼的程序電路圖芯片資料免費下載

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

    本文檔的主要內容詳細介紹的是使用51單片機設計的遙控紅外指紋鎖的程序和說明。
    發表于 01-21 08:00 ?4次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計的<b class='flag-5'>遙控</b><b class='flag-5'>紅外</b>指紋鎖的程序和使用說明

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

    本設計分為紅外遙控器紅外接收模塊兩部分。紅外遙控器包括矩陣鍵盤、增強型51
    發表于 09-16 17:22 ?27次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計<b class='flag-5'>紅外</b><b class='flag-5'>遙控器</b>的詳細資料說明

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

    本文檔的主要內容詳細介紹的是使用51單片機設計在數碼管上顯示紅外遙控器按鈕的碼值程序免費下載。
    發表于 09-02 17:28 ?6次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計在數碼管上顯示<b class='flag-5'>紅外</b><b class='flag-5'>遙控器</b>按鈕的碼值程序免費下載

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

    本文檔的主要內容詳細介紹的是使用51單片機設紅外遙控器的程序庫文件免費下載。
    發表于 07-08 17:41 ?11次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計<b class='flag-5'>紅外</b><b class='flag-5'>遙控器</b>的程序庫文件免費下載

    使用AT89S51單片機制作紅外遙控器的資料和源代碼詳細說明

    本文檔的主要內容詳細介紹的是使用AT89S51單片機制作紅外遙控器的資料和源代碼詳細說明。
    的頭像 發表于 05-30 09:26 ?6526次閱讀

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

    紅外遙控器由于其體積小、功耗低、功能強、成本低的特點,已經在家電產品設備中廣泛應用。現代智能化儀器儀表系統、工業設備中的控制輸入也較多地使用紅外遙控器。本文給出
    發表于 07-15 15:06 ?5360次閱讀
    基于<b class='flag-5'>單片機</b>系統的<b class='flag-5'>紅外</b><b class='flag-5'>遙控器</b>的應用程序

    基于單片機紅外遙控通信實驗 紅外遙控器的發送和接收原理

    本章介紹紅外遙控通信試驗,通過本章的學習掌握紅外遙控器的編碼原理以及使用。在 RY-51 單片機
    的頭像 發表于 07-27 17:35 ?9046次閱讀
    基于<b class='flag-5'>單片機</b>的<b class='flag-5'>紅外</b><b class='flag-5'>遙控</b>通信實驗 <b class='flag-5'>紅外</b><b class='flag-5'>遙控器</b>的發送和接收原理

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

    電子發燒友網站提供《基于51單片機紅外遙控器設計.rar》資料免費下載
    發表于 01-03 11:23 ?7次下載

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

    電子發燒友網站提供《基于51單片機紅外遙控器設計.rar》資料免費下載
    發表于 01-12 09:22 ?12次下載