0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于51單片機(jī)設(shè)計(jì)的紅外遙控器

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

一、項(xiàng)目介紹

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

本項(xiàng)目是基于 51 單片機(jī)設(shè)計(jì)支持 NEC 協(xié)議的紅外遙控器,實(shí)現(xiàn)接收解碼和發(fā)送功能。用戶通過按下相應(yīng)按鍵進(jìn)行信號的發(fā)射,紅外發(fā)射二極管向外發(fā)射紅外信號,被控制設(shè)備通過紅外接收頭接收到這個信號,然后解碼執(zhí)行相應(yīng)的操作。

image-20230605222006672

image-20230605222100272

二、硬件設(shè)計(jì)

本項(xiàng)目所需的硬件器件主要包括:

(1)5STC89C52單片機(jī)

(2)紅外發(fā)射管

(3)紅外接收頭

(4)OLED顯示屏

(5)按鍵開關(guān)

三、軟件設(shè)計(jì)

本項(xiàng)目的程序代碼采用 C 語言編寫,主要分為三個部分:初始化部分、接收解碼部分和發(fā)送數(shù)據(jù)部分。

(1)初始化部分

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

(2)接收解碼部分

接收解碼函數(shù)主要采用計(jì)數(shù)器方式對紅外遙控器發(fā)送的信號進(jìn)行捕獲,并將捕獲到的信號轉(zhuǎn)換成 NEC 碼。然后根據(jù) NEC 碼的規(guī)定,解碼出用戶所輸入的指令,最終實(shí)現(xiàn)控制設(shè)備的功能。

(3)發(fā)送數(shù)據(jù)部分

發(fā)送數(shù)據(jù)函數(shù)主要將單片機(jī)中存放的指令碼進(jìn)行編碼,并通過紅外發(fā)射管發(fā)送給被控制的設(shè)備。在該函數(shù)中,需要通過計(jì)時器的方式來調(diào)節(jié)發(fā)送信號的時間和頻率,以保證信號能夠正確傳輸。

四、代碼實(shí)現(xiàn)

4.1 NEC協(xié)議解碼代碼

下面是基于 51 單片機(jī)實(shí)現(xiàn) NEC 協(xié)議解碼的代碼:

#define IRIN P1_0   //紅外接收管
 unsigned char code Remote6[] = {0x06, 0x09, 0x08, 0x0a, 0x0c, 0x0d, 0x0f};
 //遙控器按鍵對應(yīng)的命令碼
 ?
 unsigned char read_IR()    //讀取紅外信號
 {
   int k = 0;
   unsigned char data = 0;
 ?
   while (IRIN)   //等待低電平出現(xiàn)
   {
     k++;
 ?
     if (k > 1000)
       return 0;  //超時返回
   }
 ?
   k = 0;
 ?
   while (!IRIN)  //等待高電平出現(xiàn)
   {
     k++;
 ?
     if (k > 1000)
       return 0;  //超時返回
   }
 ?
   k = 0;
 ?
   while (IRIN)   //等待低電平出現(xiàn)
   {
     k++;
 ?
     if (k > 1000)
       return 0;  //超時返回
   }
 ?
   for (int i = 0; i < 8; i++)    //解碼 8 個 bit
   {
     k = 0;
 ?
     while (!IRIN)  //等待高電平出現(xiàn)
     {
       k++;
 ?
       if (k > 1000)
         return 0;  //超時返回
     }
 ?
     delay_us(650);
 ?
     if (IRIN)   //判斷 bit 的值
       data |= (1 < < i);
 ?
     k = 0;
 ?
     while (IRIN)   //等待低電平出現(xiàn)
     {
       k++;
 ?
       if (k > 1000)
         return 0;  //超時返回
     }
   }
 ?
   return data;    //返回解碼結(jié)果
 }
 ?
 unsigned char decode_IR(unsigned char code_val)   //NEC 碼轉(zhuǎn)換為命令碼
 {
   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 碼轉(zhuǎn)換為命令碼
 ?
     switch (code_val)    //根據(jù)命令碼控制設(shè)備
     {
       case 1:         //控制設(shè)備執(zhí)行命令 1
         break;
       case 2:         //控制設(shè)備執(zhí)行命令 2
         break;
       case 3:         //控制設(shè)備執(zhí)行命令 3
         break;
       case 4:         //控制設(shè)備執(zhí)行命令 4
         break;
       case 5:         //控制設(shè)備執(zhí)行命令 5
         break;
       case 6:         //控制設(shè)備執(zhí)行命令 6
         break;
       default:
         break;
     }
   }
 }

以上代碼主要實(shí)現(xiàn)了讀取紅外信號和將 NEC 碼轉(zhuǎn)換為命令碼的功能,并且可以根據(jù)不同的命令碼控制設(shè)備執(zhí)行不同的指令。

4.2 NEC協(xié)議發(fā)送代碼

以下是基于 51 單片機(jī)實(shí)現(xiàn) NEC 協(xié)議發(fā)送的代碼,可以根據(jù)需要修改指令碼來控制不同的設(shè)備:

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

以上代碼主要實(shí)現(xiàn)了將命令碼轉(zhuǎn)換為 NEC 碼并發(fā)送的功能,可以根據(jù)需要修改指令碼來控制不同的設(shè)備。

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

4.3 按鍵檢測代碼

以下是支持控制發(fā)送不同控制碼的代碼,可以根據(jù)需要修改指令碼和按鍵設(shè)置:

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

以上代碼主要實(shí)現(xiàn)了支持控制發(fā)送不同控制碼的功能,可以根據(jù)需要修改指令碼和按鍵設(shè)置。當(dāng)用戶按下遙控器上的按鍵時,程序會根據(jù)按鍵編號獲取到對應(yīng)的命令碼,并將其轉(zhuǎn)換為 NEC 碼進(jìn)行發(fā)送。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 51單片機(jī)
    +關(guān)注

    關(guān)注

    272

    文章

    5689

    瀏覽量

    122142
  • 紅外遙控器
    +關(guān)注

    關(guān)注

    3

    文章

    133

    瀏覽量

    21578
收藏 人收藏

    評論

    相關(guān)推薦

    紅外遙控器單片機(jī)的硬件接口的設(shè)計(jì)

    紅外遙控系統(tǒng)設(shè)計(jì)及應(yīng)用:本文介紹了紅外遙控系統(tǒng)的設(shè)計(jì),紅外遙控器
    發(fā)表于 05-24 01:34 ?279次下載

    51單片機(jī)解碼紅外遙控器原理介紹

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

    單片機(jī)解碼紅外遙控器

    本文以TC9012編碼芯片的遙控器為例,談?wù)勅绾斡贸S玫?b class='flag-5'>51系統(tǒng)單片機(jī)進(jìn)行遙控的解碼。
    發(fā)表于 03-30 17:02 ?6次下載

    基于MSP430_單片機(jī)紅外遙控器設(shè)計(jì)

    基于MSP430_單片機(jī)紅外遙控器設(shè)計(jì)
    發(fā)表于 10-12 09:39 ?12次下載
    基于MSP430_<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>紅外</b><b class='flag-5'>遙控器</b>設(shè)計(jì)

    基于MSP430單片機(jī)紅外遙控器設(shè)計(jì)

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

    使用STM8單片機(jī)設(shè)計(jì)的紅外遙控器解碼的程序電路圖芯片資料免費(fèi)下載

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

    使用51單片機(jī)設(shè)計(jì)的遙控紅外指紋鎖的程序和使用說明

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

    使用51單片機(jī)設(shè)計(jì)紅外遙控器的詳細(xì)資料說明

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

    使用51單片機(jī)設(shè)計(jì)在數(shù)碼管上顯示紅外遙控器按鈕的碼值程序免費(fèi)下載

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

    使用51單片機(jī)設(shè)計(jì)紅外遙控器的程序庫文件免費(fèi)下載

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

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

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用AT89S51單片機(jī)制作紅外遙控器的資料和源代碼詳細(xì)說明。
    的頭像 發(fā)表于 05-30 09:26 ?5895次閱讀

    基于單片機(jī)系統(tǒng)的紅外遙控器的應(yīng)用程序

    紅外遙控器由于其體積小、功耗低、功能強(qiáng)、成本低的特點(diǎn),已經(jīng)在家電產(chǎn)品設(shè)備中廣泛應(yīng)用。現(xiàn)代智能化儀器儀表系統(tǒng)、工業(yè)設(shè)備中的控制輸入也較多地使用紅外遙控器。本文給出
    發(fā)表于 07-15 15:06 ?4776次閱讀
    基于<b class='flag-5'>單片機(jī)</b>系統(tǒng)的<b class='flag-5'>紅外</b><b class='flag-5'>遙控器</b>的應(yīng)用程序

    基于單片機(jī)紅外遙控通信實(shí)驗(yàn) 紅外遙控器的發(fā)送和接收原理

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

    基于51單片機(jī)紅外遙控器設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于51單片機(jī)紅外遙控器設(shè)計(jì).rar》資料免費(fèi)下載
    發(fā)表于 01-03 11:23 ?3次下載

    基于51單片機(jī)紅外遙控器設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于51單片機(jī)紅外遙控器設(shè)計(jì).rar》資料免費(fèi)下載
    發(fā)表于 01-12 09:22 ?9次下載