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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機紅外線接收系統設計文檔(原理詳解+源程序)

  [復制鏈接]
跳轉到指定樓層
樓主
ID:664394 發表于 2019-12-15 16:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
希望對有需要的人有所幫助

紅外線接收系統,是基于51單片機的普通紅外線接收器,

圖1 紅外線接收器原理圖
2.1.首先我們先解釋一下紅外線:

                            人的眼睛能看到的可見光按波長從長到短排列,依次為紅、橙、黃、綠、青、藍、紫。其中紅光的波長范圍為0.62~0.76μm;紫光的波長范圍為0.38~0.46μm。比紫光波長還短的光叫紫外線,比紅光波長還長的光叫紅外線.紅外線遙控就是利用波長為0.76~1.5μm之間的近紅外線來傳送控制信號的。

2.2 對于紅外接收器而言  

紅外接收設備是由紅外接收電路、紅外解碼、電源和應用電路組成。紅外遙控接收器的主要作用是將遙控發射器發來的紅外光信好轉換成電信號,再放大、限幅、檢波、整形,形成遙控指令脈沖,輸出至遙控微處理器。近幾年不論是業余制作還是正式產品,大多都采用成品紅外接收頭。成品紅外接收頭的封裝大致有兩種:一種采用鐵皮屏蔽;一種是塑料封裝。均有三只引腳,即電源正(VDD)、電源負(GND)和數據輸出(VOUT)。在使用時注意成品紅外接收頭的載波頻率,另外在遙控編碼芯片輸出的波形與接收頭端收到的波形。

2.3我們此次的紅外線接收系統主要是對于遙控器所發出的紅外線,對她進行接收和解碼從而發送到數碼管、小燈、蜂鳴器等等讓其做出相應的反應。

①發送:通常的紅外遙控通常為了提高抗干擾性能和降低電源消耗,紅外遙控器常用載波的方式傳送二進制編碼,常用的載波頻率為38kHz,這是由發射端所使用的455kHz晶振來決定的。在發射端要對晶振進行整數分頻,分頻系數一般取12,所以455kHz÷12≈37.9kHz≈38kHz。也有一些遙控系統采用36kHz、40 kHz、56 kHz等,一般由發射端晶振的振蕩頻率來決定。所以,通常的紅外遙控器是將遙控信號(二進制脈沖碼)調制在38KHz的載波上,經緩沖放大后送至紅外發光二極管,轉化為紅外信號發射出去的。

②接收:二進制脈沖碼的形式有多種,其中最為常用的是PWM碼(脈沖寬度調制碼)和PPM碼(脈沖位置調制碼,脈沖串之間的時間間隔來實現信號調制)。如果要開發紅外接收設備,一定要知道紅外遙控器的編碼方式和載波頻率,我們才可以選取一體化紅外接收頭和制定解碼方案。

發送端接收端
圖2.紅外原理圖

我們通過對發送端進行編碼進行合理控制從而發出數據讓接收端收到一定的波形圖送到數碼管因為接收之后解碼出來是ASC||碼所以我們需要進行一定的轉換。

2.4單片機只能識別二進制數字所以我們對于數據的發送的傳輸以及接受需要很謹慎。接收和發送的數據碼格式一共分為四組:原碼、原碼的反碼、數據碼、數據反碼。
圖3.時序圖

在起始碼之前我們需要先給一定的延時(大約七到八毫秒)判斷是否已經開始接收到真正的信號然后定義一個延時子函數讓他自加如果大約十毫秒左右沒有反應說明發送出了問題,如果接收到真正的信號同時之前的延時子函數也沒有到達十毫秒就開始之后的起始碼讓其等待九毫秒的低電平然后再等待之后的四點五毫秒的高電平開始接受之后的字符串存入我們定義好的數組中。對于單片機的延時誤差可能會很多我們在此考慮的是對于每一次的延時我們的下一都進行判斷直到精確接受到為止。

3.硬件電路設計:
圖4.單片機元器件分布

因為基于單片機的操作所以以51單片機為主,其中的硬件電路連接。

圖5單片機原理圖

本次設計我們主要用到的模塊有以下幾個:

圖6.51單片機最小系統

這是我們所使用的51單片機的最小系統的原理圖,我們通過編碼對它的I/O口進行高低電平的控制,從而控制他的一些外設模塊初始化完成一系列的操作十分方便,但是51單片機的處理速度較慢以及較少的I/O口和少的模塊控制、內存問題只能處理一些簡單一些的問題。

圖7.蜂鳴器

蜂鳴器風味有源蜂鳴器和無源蜂鳴器,因為有源和無源的操作以及工作方式是不一樣的,市面上以及單片機上配置蜂鳴器以無源蜂鳴器為主必須用交流電高低電平的來回轉換控制它的發聲,有源蜂鳴器是直流電源即可,大部分都是用來警報和音樂播放,其中我們用來報警。

圖8數碼管               圖9.譯碼器

用的51單片機本身配置為七段數碼管能顯示數字和極個別文字分別為a,b,c,d,e,f,g,dp這八段dp為小數點位,給與高電平則亮同時八段也符合16進制來取值,控制顯示。譯碼器則為三八線譯碼器,用P2.2,P2.3,P2.4來控制數碼管的選擇一共八位數碼管從000-111來控制位選,則P0口用來控制段選。



  1. #include "reg52.h"                                         
  2. typedef unsigned int u16;               
  3. typedef unsigned char u8;
  4. sbit beep=P1^5;
  5. sbit k4=P3^3;
  6. sbit LSA=P2^2;
  7. sbit LSB=P2^3;
  8. sbit LSC=P2^4;
  9. sbit led1=P2^0;
  10. sbit IRIN=P3^2;
  11. //#define led P2
  12. u8 IrValue[6];
  13. u8 Time;
  14. u8 m;
  15. u8 DisplayData[8];
  16. u8 code smgduan[17]={
  17. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  18. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
  19. void delay(u16 i)
  20. {
  21.               while(i--);                  //10us                                                                                      延時函數
  22. }
  23. void DigDisplay()
  24. {
  25.               u8 i;
  26.               for(i=0;i<3;i++)
  27.               {
  28.                             switch(i)            
  29.                             {
  30.                                           case(0):
  31.                                                         LSA=0;LSB=0;LSC=0; break;
  32.                                           case(1):                                                                                                                                            數碼管
  33.                                                         LSA=1;LSB=0;LSC=0; break;                                             的選擇
  34.                                           case(2):
  35.                                                         LSA=0;LSB=1;LSC=0; break;            
  36.                             }
  37.                             P0=DisplayData[2-i];//發送數據
  38.                             delay(100); //間隔一段時間掃描            
  39.                             P0=0x00;//消隱
  40.               }                           
  41. }
  42. /*void DigDisplay()
  43. {
  44.               P1=0;
  45.               P0=0x01;                                                                                                        適合于老
  46.               P1=m;                                                                                                                                   師的程序
  47.               delay(1);
  48. } */  //shi yong yu lao shi ban zi


  49. void IrInit()
  50. {
  51.               IT0=1;//下降沿觸發
  52.               EX0=1;//打開中斷0允許
  53.               IT1=1;//跳變沿出發方式(下降沿)                                          紅外線
  54.               EX1=1;//打開INT1的中斷允許。                                                        傳輸打
  55.               EA=1;              //打開總中斷              開初始
  56.               IRIN=1;//初始化端口              化函數
  57. }
  58. void main()
  59. {            
  60.     unsigned int temp;
  61.               IrInit();
  62.               //zhongduan();
  63.               while(1)
  64.               {            
  65.                             DisplayData[0] = smgduan[m];                            數碼管
  66.                             DisplayData[1] = smgduan[m];                            送位
  67.                             DisplayData[2] = smgduan[m];
  68.                   DigDisplay();
  69.                             temp++;
  70.                             delay(100);
  71.                  if(m==1)
  72.                   {
  73.                     beep=~beep;
  74.                   }
  75.                   if(temp>10)                                                                                    完成一系
  76.                             {                                                                                                                              列的動作
  77.                             if(m==2)
  78.                             {
  79.                                 led1=~led1;
  80.                                           temp=0;
  81.                             }                                                      
  82.                             }
  83.               }
  84. }
  85. void ReadIr() interrupt 0
  86. {
  87.               u8 j,k;
  88.               u16 err;
  89.               Time=0;                                                                     
  90.               delay(700);              //7ms
  91.               if(IRIN==0)                            //確認是否真的接收到正確的信號
  92.               {            
  93.                            
  94.                             err=1000;                                                        //1000*10us=10ms,超過說明接收到錯誤的信號            
  95.                             while((IRIN==0)&&(err>0))              //等待前面9ms的低電平過去                             
  96.                             {                                         
  97.                                           delay(1);
  98.                                           err--;
  99.                             }
  100.                             if(IRIN==1)                                          //如果正確等到9ms低電平
  101.                             {
  102.                                           err=500;
  103.                                           while((IRIN==1)&&(err>0))                            //等待4.5ms的起始高電平過去
  104.                                           {
  105.                                                         delay(1);
  106.                                                         err--;
  107.                                           }
  108.                                           for(k=0;k<4;k++)                            //共有4組數據
  109.                                           {                                                      
  110.                                                         for(j=0;j<8;j++)              //接收一組數據
  111.                                                         {

  112.                                                                       err=60;                           
  113.                                                                       while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
  114.                                                                       {
  115.                                                                                     delay(1);
  116.                                                                                     err--;
  117.                                                                       }
  118.                                                                       err=500;
  119.                                                                       while((IRIN==1)&&(err>0))              //計算高電平的時間長度。
  120.                                                                       {
  121.                                                                                     delay(10);              //0.1ms
  122.                                                                                     Time++;
  123.                                                                                     err--;
  124.                                                                                     if(Time>30)
  125.                                                                                     {
  126.                                                                                                   return;
  127.                                                                                     }
  128.                                                                       }
  129.                                                                       IrValue[k]>>=1;              //k表示第幾組數據
  130.                                                                       if(Time>=8)                                          //如果高電平出現大于565us,那么是1
  131.                                                                       {
  132.                                                                                     IrValue[k]|=0x80;
  133.                                                                       }
  134.                                                                       Time=0;                            //用完時間要重新賦值                                                                                                
  135.                                                         }
  136.                                           }
  137.                             }
  138.                             if(IrValue[2]!=~IrValue[3])
  139.                             {
  140.                                           return;
  141.                             }
  142.                                           if(IrValue[2]==0x16)
  143.                             {
  144.                                           m=0;
  145.                             }
  146.                             if(IrValue[2]==0x0c)
  147.                             {
  148.                                           m=1;
  149.                             }
  150.                                           if(IrValue[2]==0x18)
  151.                             {
  152.                                           m=2;
  153.                             }
  154.                                           if(IrValue[2]==0x5e)
  155.                             {
  156.                                           m=3;
  157.                             }
  158.                                           if(IrValue[2]==0x08)
  159.                             {
  160.                                           m=4;
  161.                             }
  162.                                           if(IrValue[2]==0x1c)
  163.                             {
  164.                                           m=5;
  165.                             }
  166.                                           if(IrValue[2]==0x5a)
  167.                             {
  168.                                           m=6;
  169.                             }
  170.                                           if(IrValue[2]==0x42)
  171.                             {
  172.                                           m=7;
  173.                             }
  174.                                           if(IrValue[2]==0x52)
  175.                             {
  176.                                           m=8;
  177.                             }
  178.                                           if(IrValue[2]==0x4a)
  179.                             {
  180.                                           m=9;
  181.                             }
  182.                                           if(IrValue[2]==0x40)
  183.                             {
  184.                                           m--;
  185.                             }
  186.                                           if(IrValue[2]==0x43)
  187.                             {
  188.                                           m++;
  189.                             }
  190.                                           if(IrValue[2]==0x46)
  191.                             {
  192.                                          
  193.                             }
  194.               }                                         
  195. }
復制代碼

5.功能仿真與調試


完整的Word格式文檔51黑下載地址:
文檔.doc (7.55 MB, 下載次數: 66)



評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:666819 發表于 2019-12-17 23:31 | 只看該作者
使用了,確實能運行,謝謝樓主
回復

使用道具 舉報

板凳
ID:110278 發表于 2020-3-5 11:06 | 只看該作者
很詳細
回復

使用道具 舉報

地板
ID:663843 發表于 2020-3-5 23:35 | 只看該作者
看看,沒幣,下不了,暫時也不用。留個標記
回復

使用道具 舉報

5#
ID:693628 發表于 2020-3-6 07:22 來自觸屏版 | 只看該作者
謝謝樓主分享了 收下了
回復

使用道具 舉報

6#
ID:686739 發表于 2020-3-16 16:45 來自觸屏版 | 只看該作者
學習一下
回復

使用道具 舉報

7#
ID:738543 發表于 2020-4-26 15:11 | 只看該作者
我在protues里沒有找到這個元件,怎么弄?
回復

使用道具 舉報

8#
ID:896273 發表于 2021-3-27 09:42 | 只看該作者
原理大概明白了,但程序執行卻怎么都沒有結果
回復

使用道具 舉報

9#
ID:954538 發表于 2021-7-23 08:33 | 只看該作者
后面應該會用到的,樓主牛逼
回復

使用道具 舉報

10#
ID:66328 發表于 2021-8-9 15:38 | 只看該作者
確實能運行,謝謝樓主
回復

使用道具 舉報

11#
ID:585365 發表于 2021-8-10 16:58 | 只看該作者
沒有搞明白。還要繼續看
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天久久| h视频免费在线观看 | 亚洲免费一区二区 | 国产91久久久久久久免费 | 国产欧美精品 | 国产精品1区 | 久久久无码精品亚洲日韩按摩 | 国产a视频 | 欧美黄色录像 | 亚洲视频中文字幕 | 国产高清久久 | 亚洲福利网 | 日韩国产中文字幕 | 久久免费精品视频 | 久久国产精99精产国高潮 | 成人免费视频网站在线观看 | 欧美日韩一区精品 | 亚洲一区二区在线视频 | 亚洲欧美在线免费观看 | 婷婷激情综合 | 激情影院久久 | 久久精品中文字幕 | 国产精品美女在线观看 | 中文字幕人成乱码在线观看 | 欧美又大粗又爽又黄大片视频 | 中文字幕在线观看视频网站 | 精品免费国产一区二区三区四区介绍 | 免费三级网站 | 手机av在线 | 我要看免费一级毛片 | 中文字幕亚洲视频 | 国产精品一区二区视频 | 欧美久久久电影 | 日本午夜在线视频 | 欧美日韩国产在线观看 | 久久伊 | 国产精品免费视频一区 | 亚州激情| av在线播放网站 | 国内自拍真实伦在线观看 | 久久久免费在线观看 |