找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 11698|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)紅外遙控發(fā)射+接收電路源程序及Proteus仿真設(shè)計(jì) 有波形圖顯示

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
設(shè)計(jì)一個(gè)基于單片機(jī)的嵌入式系統(tǒng),要求具備以下功能:
紅外數(shù)據(jù)的接收及解碼,紅外發(fā)色電路
數(shù)碼管的顯示驅(qū)動(dòng)控制
將接收到的紅外數(shù)據(jù)進(jìn)行實(shí)時(shí)顯示(限于動(dòng)態(tài)掃描方法)
請(qǐng)根據(jù)以上功能要求,進(jìn)行硬件系統(tǒng)設(shè)計(jì),編寫軟件程序并畫出流程圖。
利用單片機(jī)進(jìn)行遙控系統(tǒng)的應(yīng)用設(shè)計(jì),相較于市面上遙控集成電路受功能鍵數(shù)及應(yīng)用范圍限制,具有編程靈活多樣、操作碼個(gè)數(shù)可隨意設(shè)定的優(yōu)點(diǎn)。本設(shè)計(jì)利用AT89C52制作紅外遙控系統(tǒng),使用Keil軟件編寫程序,在Proteus軟件中采用IRLINK模塊用于接收并解調(diào)紅外信號(hào),進(jìn)行程序的仿真。設(shè)計(jì)中,矩陣鍵盤充當(dāng)遙控器,當(dāng)我們按下某一個(gè)鍵時(shí),經(jīng)單片機(jī)識(shí)別,CPU向接有紅外發(fā)射管的端口發(fā)射一定頻率的脈沖,該脈沖與38KHz左右的載波脈沖進(jìn)行調(diào)制,然后將已調(diào)制的脈沖進(jìn)行緩沖放大,激勵(lì)紅外發(fā)光二極管將電能轉(zhuǎn)化為光能,使得紅外發(fā)光二極管發(fā)射出一定頻率的紅外線,當(dāng)接收控制系統(tǒng)接收到該紅外光后,由單片機(jī)內(nèi)定時(shí)/計(jì)數(shù)器得到該紅外光的頻率,然后將該頻率送往CPU,由CPU對(duì)該信號(hào)進(jìn)行反編碼,識(shí)別出控制信號(hào),控制LED燈亮,蜂鳴器發(fā)聲,并從數(shù)碼管顯示出按鍵值,同時(shí)示波器顯示紅外發(fā)射及接受端的脈沖波形,實(shí)現(xiàn)紅外數(shù)據(jù)的接收解碼與動(dòng)態(tài)顯示。
以下為發(fā)射程序,接收見附件。信號(hào)波形解碼顯示都沒問題,LED燈和蜂鳴器設(shè)計(jì)是有點(diǎn)問題的,可以刪掉不用不影響。
自動(dòng)的是壓縮包里第二個(gè)文件的程序,其他包里有額外的參考資料,可借鑒。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


紅外波形圖:


單片機(jī)源程序如下:
  1. #include <REG51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. #define SBM   0xFF                //用戶識(shí)別碼

  6. #define m9    (65536-9000)               //約9mS
  7. #define m4_5  (65536-4500)               //約4.5mS
  8. #define m1_6  (65536-1630)               //約1.65mS
  9. #define m_65  (65536-580)               //約0.65mS
  10. #define m_56  (65536-560)               //約0.56mS
  11. #define m40   (65536-40000)       //約40mS
  12. #define m56   (65536-56000)       //56mS
  13. #define m2_25 (65536-2250)        //約2.25mS

  14. sbit IR  = P3^6;                                  //定義發(fā)射引腳(接PNP三極管基極)
  15. sbit LED = P3^7;                                  //發(fā)射指示燈

  16. uchar KEY(void);
  17. void  SanZhuan(void);
  18. void  ZZ(uchar x);
  19. void  Z0(uchar temp);
  20. void  TT0(bit BT,uint x);
  21. void  YS(uchar time);

  22. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  23. 函數(shù)功能:主函數(shù)
  24. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  25. void main(void)
  26. {

  27.   TMOD = 0x01;         //T0 16位工作方式
  28.   IR=1;                                   //發(fā)射端口常態(tài)為高電平

  29.   while(1)
  30.   {
  31.    SanZhuan();
  32.   }
  33. }
  34. /***************************************************************
  35. 函數(shù)功能:             4×4矩陣鍵盤
  36.                            鍵值                    
  37. P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
  38. │     │    │    │    │    │    │    │    ┃
  39. │     │    │    └────13   14   15   16   ┃   
  40. │     │    └─────────9    10   11   12   ┃   
  41. │     └──────────────5    6    7    8    ┃   
  42. └────────────────────1    2    3    4    ┃  
  43. ***************************************************************/
  44. uchar KEY(void)
  45. {
  46. uchar H,L;            //行值,列值
  47. H=0;
  48. L=0;
  49. P1 = 0xf0;            //將鍵盤端口行值設(shè)為1,列值設(shè)為0
  50. if(P1!= 0xf0)         //檢測是否有按鍵按下,如果有則hangval必不為0x0f
  51.    {
  52.     YS(10);            //按鍵去抖動(dòng),延時(shí)10毫秒
  53.     if(P1!=0xf0)       //確實(shí)有按鍵按下
  54.       {
  55.        H  = P1&0xf0;   //按鍵后得到按鍵的行標(biāo)志位,將行標(biāo)志位賦值給hangval
  56.        P1 = 0x0f;      //翻轉(zhuǎn)鍵盤接口輸出
  57.        L  = P1&0x0f;   //得到列標(biāo)志位
  58.       }
  59.         return (H+L);
  60.    }
  61.   return 0;
  62. }
  63. /***************************************************************
  64. 函數(shù)功能:散轉(zhuǎn)程序
  65. ***************************************************************/
  66. void SanZhuan(void)
  67. {
  68. uchar v;
  69. v = KEY();

  70. switch(v)
  71. {
  72.   case 0x77:ZZ(0x01);v=0;break;                //"  "
  73.   case 0xb7:ZZ(0x02);v=0;break;                //"  "
  74.   case 0xd7:ZZ(0x03);v=0;break;                //"  "
  75.   case 0xe7:ZZ(0x04);v=0;break;                //"  "
  76.   case 0x7b:ZZ(0x05);v=0;break;                //"  "
  77.   case 0xbb:ZZ(0x06);v=0;break;                //"  "
  78.   case 0xdb:ZZ(0x07);v=0;break;                //"  "
  79.   case 0xeb:ZZ(0x08);v=0;break;                //"  "
  80.   case 0x7d:ZZ(0x09);v=0;break;                //"  "
  81.   case 0xbd:ZZ(0x10);v=0;break;                //"  "
  82.   case 0xdd:ZZ(0x11);v=0;break;                //"  "
  83.   case 0xed:ZZ(0x12);v=0;break;                //"  "
  84.   case 0x7e:ZZ(0x13);v=0;break;                //"  "
  85.   case 0xbe:ZZ(0x14);v=0;break;                //"  "
  86.   case 0xde:ZZ(0x15);v=0;break;                //"  "
  87.   case 0xee:ZZ(0x16);v=0;break;                //"  "
  88.   default:v=0;
  89. }
  90. }
  91. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  92. 函數(shù)功能:發(fā)送主程序
  93. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  94. void ZZ(uchar x)
  95. {
  96.   TT0(1,m9);                   //高電平9mS
  97.   TT0(0,m4_5);               //低電平4.5mS

  98.   /*┈ 發(fā)送4幀數(shù)據(jù) ┈*/
  99.   Z0(SBM);                                                                                                                                       
  100.   Z0(~SBM);
  101.   Z0(x);
  102.   Z0(~x);

  103.   /*┈┈ 結(jié)束碼 ┈┈*/
  104.   TT0(1,m_65);
  105.   TT0(0,m40);

  106.   /*┈┈ 重復(fù)碼 ┈┈*/
  107.   while(KEY())
  108.    {
  109.         TT0(1,m9);
  110.         TT0(0,m2_25);

  111.         TT0(1,m_56);
  112.         TT0(0,m40);
  113.                 TT0(0,m56);
  114.                                                          
  115.     }                  
  116. }
  117. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  118. 函數(shù)功能:單幀發(fā)送程序
  119. 入口參數(shù):1幀數(shù)據(jù)
  120. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  121. void Z0(uchar temp)
  122. {
  123.   uchar v;
  124.   for (v=0;v<8;v++)                     //循環(huán)8次移位
  125.        {     
  126.                  TT0(1,m_65);                        //高電平0.65mS         
  127.                          if(temp&0x01) TT0(0,m1_6); //發(fā)送最低位
  128.                          else          TT0(0,m_56);     
  129.                          temp >>= 1;                //右移一位
  130.         }   
  131. }

  132. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  133. 函數(shù)功能:38KHz脈沖發(fā)射 + 延時(shí)程序
  134. 入口參數(shù):(是否發(fā)射脈沖,延時(shí)約 x (uS))
  135. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  136. void TT0(bit BT,uint x)
  137. {
  138.   TH0 = x>>8;                    //輸入T0初始值
  139.   TL0 = x;
  140.   TF0=0;                                //清0
  141.   TR0=1;                                //啟動(dòng)定時(shí)器0
  142.   if(BT == 0) while(!TF0);        //BT=0時(shí)不發(fā)射38KHz脈沖只延時(shí);BT=1發(fā)射38KHz脈沖且延時(shí);
  143.   else while(1)                            //38KHz脈沖,占空比5:26
  144.          {
  145.                   IR = 0;
  146.                   if(TF0)break;
  147.                if(TF0)break;
  148.                   IR = 1;
  149.                 if(TF0)break;
  150.                  if(TF0)break;
  151.                  if(TF0)break;
  152.                   if(TF0)break;
  153.                  if(TF0)break;
  154.                  if(TF0)break;
  155.                  if(TF0)break;
  156.                  if(TF0)break;
  157.                  if(TF0)break;
  158.                   if(TF0)break;
  159.                  }
  160.   TR0=0;                                //關(guān)閉定時(shí)器0
  161.   TF0=0;                                //標(biāo)志位溢出則清0
  162.   IR =1;                                //脈沖停止后,發(fā)射端口常態(tài)為高電平
  163. }
  164. /***************************************************************
  165. 函數(shù)功能:按鍵消抖    延時(shí)程序
  166. 入口參數(shù):1ms×time       (晶振=12MHz)
  167. ***************************************************************/
  168. void YS(uchar time)
  169. {
  170.      uchar i,j;
  171.          for(i=0; i<time; i++)
  172.      for(j=0; j<247; j++)_nop_();
  173. }
復(fù)制代碼




全部資料51hei下載地址:
紅外遙控帶原理圖.rar (2.78 MB, 下載次數(shù): 219)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:194006 發(fā)表于 2021-8-1 11:45 | 只看該作者
這個(gè)不錯(cuò),要是38K的載波用了輪循方式,如果單片機(jī)時(shí)序不一樣就要重新調(diào).

用中斷方式應(yīng)該更加精準(zhǔn).
回復(fù)

使用道具 舉報(bào)

板凳
ID:959166 發(fā)表于 2021-8-6 15:21 | 只看該作者
模擬時(shí)無論按那個(gè)按鈕波形都沒有變化
回復(fù)

使用道具 舉報(bào)

地板
ID:943047 發(fā)表于 2021-8-6 16:54 | 只看該作者
本帖最后由 fengshakalaka 于 2021-8-6 17:01 編輯

樓主proteus用的哪個(gè)版本啊
回復(fù)

使用道具 舉報(bào)

5#
ID:328014 發(fā)表于 2021-8-6 17:40 | 只看該作者
我用Proteus7.5打開的,模擬效果如下:

51hei.png (22.37 KB, 下載次數(shù): 58)

51hei.png
回復(fù)

使用道具 舉報(bào)

6#
ID:585365 發(fā)表于 2021-8-10 16:57 | 只看該作者
還是看的不是很明白。還得加強(qiáng)學(xué)習(xí)啊
回復(fù)

使用道具 舉報(bào)

7#
ID:1121795 發(fā)表于 2024-5-30 22:14 | 只看該作者
有仿真圖嗎
回復(fù)

使用道具 舉報(bào)

8#
ID:1146327 發(fā)表于 2025-3-26 11:22 | 只看該作者
講得很好
回復(fù)

使用道具 舉報(bào)

9#
ID:1146327 發(fā)表于 2025-3-26 11:37 | 只看該作者
這幾個(gè)功能都是獨(dú)立的,數(shù)據(jù)顯示,LED,蜂鳴器都可以自行調(diào)用
回復(fù)

使用道具 舉報(bào)

10#
ID:38658 發(fā)表于 2025-4-1 17:49 | 只看該作者
非常感謝大佬的資料!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表