久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11528|回復: 9
打印 上一主題 下一主題
收起左側

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

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

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


紅外波形圖:


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

  5. #define SBM   0xFF                //用戶識別碼

  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. 函數功能:主函數
  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. 函數功能:             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;            //將鍵盤端口行值設為1,列值設為0
  50. if(P1!= 0xf0)         //檢測是否有按鍵按下,如果有則hangval必不為0x0f
  51.    {
  52.     YS(10);            //按鍵去抖動,延時10毫秒
  53.     if(P1!=0xf0)       //確實有按鍵按下
  54.       {
  55.        H  = P1&0xf0;   //按鍵后得到按鍵的行標志位,將行標志位賦值給hangval
  56.        P1 = 0x0f;      //翻轉鍵盤接口輸出
  57.        L  = P1&0x0f;   //得到列標志位
  58.       }
  59.         return (H+L);
  60.    }
  61.   return 0;
  62. }
  63. /***************************************************************
  64. 函數功能:散轉程序
  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. 函數功能:發(fā)送主程序
  93. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  94. void ZZ(uchar x)
  95. {
  96.   TT0(1,m9);                   //高電平9mS
  97.   TT0(0,m4_5);               //低電平4.5mS

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

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

  106.   /*┈┈ 重復碼 ┈┈*/
  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. 函數功能:單幀發(fā)送程序
  119. 入口參數:1幀數據
  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. 函數功能:38KHz脈沖發(fā)射 + 延時程序
  134. 入口參數:(是否發(fā)射脈沖,延時約 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;                                //啟動定時器0
  142.   if(BT == 0) while(!TF0);        //BT=0時不發(fā)射38KHz脈沖只延時;BT=1發(fā)射38KHz脈沖且延時;
  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;                                //關閉定時器0
  161.   TF0=0;                                //標志位溢出則清0
  162.   IR =1;                                //脈沖停止后,發(fā)射端口常態(tài)為高電平
  163. }
  164. /***************************************************************
  165. 函數功能:按鍵消抖    延時程序
  166. 入口參數: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. }
復制代碼




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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

用中斷方式應該更加精準.
回復

使用道具 舉報

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

使用道具 舉報

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

樓主proteus用的哪個版本啊
回復

使用道具 舉報

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

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

51hei.png
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中国美女一级黄色片 | 欧美性大战久久久久久久蜜臀 | 国产99久久 | 国产成人精品免费视频 | 伊人一区| 伊人久操 | 免费精品一区 | 久国久产久精永久网页 | 青草青草久热精品视频在线观看 | 精品麻豆剧传媒av国产九九九 | 白浆在线 | 中文字幕一区二区三区日韩精品 | 久久国产视频播放 | 国产精品久久国产精品 | 一级毛片观看 | 手机av免费在线 | 国产欧美一区二区三区在线看 | 成人免费观看网站 | 日韩在线看片 | 欧美中文字幕在线 | 精品国产一区三区 | www.一区二区三区 | 免费看的黄网站 | 成人动漫一区二区 | 亚洲日本免费 | 中文字幕一区二区三区不卡 | 国产日韩视频在线 | 一区二区免费视频 | 国产精品久久久久久久久久东京 | 亚洲一区久久 | 国产精品视频一区二区三区不卡 | 久久精品亚洲 | 午夜色婷婷 | 国产免费麻豆视频 | 久久综合欧美 | 中文字幕一区二区在线观看 | 天天干,夜夜操 | 久久综合久久自在自线精品自 | www.日韩系列 | 日韩在线视频观看 | 一区二区国产精品 |