標題: 51單片機紅外線接收系統設計文檔(原理詳解+源程序) [打印本頁]
作者: 我是范小胖 時間: 2019-12-15 16:21
標題: 51單片機紅外線接收系統設計文檔(原理詳解+源程序)
希望對有需要的人有所幫助
紅外線接收系統,是基于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口用來控制段選。

- #include "reg52.h"
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit beep=P1^5;
- sbit k4=P3^3;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit led1=P2^0;
- sbit IRIN=P3^2;
- //#define led P2
- u8 IrValue[6];
- u8 Time;
- u8 m;
- u8 DisplayData[8];
- u8 code smgduan[17]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
- void delay(u16 i)
- {
- while(i--); //10us 延時函數
- }
- void DigDisplay()
- {
- u8 i;
- for(i=0;i<3;i++)
- {
- switch(i)
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;
- case(1): 數碼管
- LSA=1;LSB=0;LSC=0; break; 的選擇
- case(2):
- LSA=0;LSB=1;LSC=0; break;
- }
- P0=DisplayData[2-i];//發送數據
- delay(100); //間隔一段時間掃描
- P0=0x00;//消隱
- }
- }
- /*void DigDisplay()
- {
- P1=0;
- P0=0x01; 適合于老
- P1=m; 師的程序
- delay(1);
- } */ //shi yong yu lao shi ban zi
-
-
- void IrInit()
- {
- IT0=1;//下降沿觸發
- EX0=1;//打開中斷0允許
- IT1=1;//跳變沿出發方式(下降沿) 紅外線
- EX1=1;//打開INT1的中斷允許。 傳輸打
- EA=1; //打開總中斷 開初始
- IRIN=1;//初始化端口 化函數
- }
- void main()
- {
- unsigned int temp;
- IrInit();
- //zhongduan();
- while(1)
- {
- DisplayData[0] = smgduan[m]; 數碼管
- DisplayData[1] = smgduan[m]; 送位
- DisplayData[2] = smgduan[m];
- DigDisplay();
- temp++;
- delay(100);
- if(m==1)
- {
- beep=~beep;
- }
- if(temp>10) 完成一系
- { 列的動作
- if(m==2)
- {
- led1=~led1;
- temp=0;
- }
- }
- }
- }
- void ReadIr() interrupt 0
- {
- u8 j,k;
- u16 err;
- Time=0;
- delay(700); //7ms
- if(IRIN==0) //確認是否真的接收到正確的信號
- {
-
- err=1000; //1000*10us=10ms,超過說明接收到錯誤的信號
- while((IRIN==0)&&(err>0)) //等待前面9ms的低電平過去
- {
- delay(1);
- err--;
- }
- if(IRIN==1) //如果正確等到9ms低電平
- {
- err=500;
- while((IRIN==1)&&(err>0)) //等待4.5ms的起始高電平過去
- {
- delay(1);
- err--;
- }
- for(k=0;k<4;k++) //共有4組數據
- {
- for(j=0;j<8;j++) //接收一組數據
- {
-
- err=60;
- while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
- {
- delay(1);
- err--;
- }
- err=500;
- while((IRIN==1)&&(err>0)) //計算高電平的時間長度。
- {
- delay(10); //0.1ms
- Time++;
- err--;
- if(Time>30)
- {
- return;
- }
- }
- IrValue[k]>>=1; //k表示第幾組數據
- if(Time>=8) //如果高電平出現大于565us,那么是1
- {
- IrValue[k]|=0x80;
- }
- Time=0; //用完時間要重新賦值
- }
- }
- }
- if(IrValue[2]!=~IrValue[3])
- {
- return;
- }
- if(IrValue[2]==0x16)
- {
- m=0;
- }
- if(IrValue[2]==0x0c)
- {
- m=1;
- }
- if(IrValue[2]==0x18)
- {
- m=2;
- }
- if(IrValue[2]==0x5e)
- {
- m=3;
- }
- if(IrValue[2]==0x08)
- {
- m=4;
- }
- if(IrValue[2]==0x1c)
- {
- m=5;
- }
- if(IrValue[2]==0x5a)
- {
- m=6;
- }
- if(IrValue[2]==0x42)
- {
- m=7;
- }
- if(IrValue[2]==0x52)
- {
- m=8;
- }
- if(IrValue[2]==0x4a)
- {
- m=9;
- }
- if(IrValue[2]==0x40)
- {
- m--;
- }
- if(IrValue[2]==0x43)
- {
- m++;
- }
- if(IrValue[2]==0x46)
- {
-
- }
- }
- }
復制代碼
5.功能仿真與調試
完整的Word格式文檔51黑下載地址:
文檔.doc
(7.55 MB, 下載次數: 66)
2019-12-16 00:30 上傳
點擊文件名下載附件
自己的一些單片機理解
下載積分: 黑幣 -5
作者: 小黑14 時間: 2019-12-17 23:31
使用了,確實能運行,謝謝樓主
作者: linnyshow 時間: 2020-3-5 11:06
很詳細
作者: bjt040412 時間: 2020-3-5 23:35
看看,沒幣,下不了,暫時也不用。留個標記
作者: 布吉島, 時間: 2020-3-6 07:22
謝謝樓主分享了 收下了
作者: wsh791 時間: 2020-3-16 16:45
學習一下
作者: DYZH 時間: 2020-4-26 15:11
我在protues里沒有找到這個元件,怎么弄?
作者: prodragon 時間: 2021-3-27 09:42
原理大概明白了,但程序執行卻怎么都沒有結果
作者: 桃子不可以亂摘 時間: 2021-7-23 08:33
后面應該會用到的,樓主牛逼
作者: hnqylgq 時間: 2021-8-9 15:38
確實能運行,謝謝樓主
作者: 247015164 時間: 2021-8-10 16:58
沒有搞明白。還要繼續看
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
亚洲国产免费
|
自拍偷拍亚洲视频
|
日韩中文字幕2019
|
国产一区二区三区
|
91麻豆精品国产91久久久更新资源速度超快
|
99久久婷婷国产综合精品首页
|
久久综合狠狠综合久久综合88
|
蜜臀av日日欢夜夜爽一区
|
黄网站涩免费蜜桃网站
|
久久亚洲经典
|
91高清视频在线
|
人操人人干人
|
国产一区2区
|
欧洲视频一区二区
|
日本天天操
|
亚洲精品福利视频
|
精品中文视频
|
免费一级大片
|
国产精品久久久久aaaa九色
|
毛片一级网站
|
亚洲国产成人精品女人久久久
|
成人一区二区三区在线观看
|
国产精品久久99
|
国产乡下妇女做爰
|
午夜免费
|
午夜免费视频
|
91精品国产乱码久久久久久
|
日韩av在线免费
|
亚洲在线一区二区三区
|
你懂的av
|
久久久久无码国产精品一区
|
av无遮挡
|
99精品欧美一区二区蜜桃免费
|
国产精品久久久久一区二区三区
|
国产精品日韩一区二区
|
欧美日韩在线精品
|
一区二区在线
|
日韩在线视频一区二区三区
|
亚洲欧美另类在线观看
|
国产精品海角社区在线观看
|
日韩视频中文字幕
|