紅外數據傳輸_第1頁
紅外數據傳輸_第2頁
紅外數據傳輸_第3頁
紅外數據傳輸_第4頁
紅外數據傳輸_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、紅外數據傳輸一、     紅外通信原理紅外遙控有發送和接收兩個組成部分。發送端采用單片機將待發送的二進制信號編碼調制為一系列的脈沖串信號,通過紅外發射管發射紅外信號。紅外接收完成對紅外信號的接收、放大、檢波、整形,并解調出遙控編碼脈沖。為了減少干擾,采用的是價格便宜性能可靠的一體化紅外接收頭(HS0038, 它接收紅外信號頻率為38kHz,周期約26s) 接收紅外信號,它同時對信號進行放大、檢波、整形得到TTL 電平的編碼信號,再送給單片機,經單片機解碼并執行去控制相關對象。如圖1 所示:紅外發送部分由51單片機、鍵盤、紅外發光二極管和7段數碼管組成。鍵

2、盤用于輸入指令, 51單片機檢測鍵盤上按鍵的狀態,并對紅外信號進行調制,發光二極管產生紅外線,數碼管用來顯示發送的鍵值。圖2紅外發射電路紅外接收部分由51單片機、一體化紅外接收頭HS0038和7段數碼管組成。51單片機檢測HS0038,并對HS0038接收到的數據解碼,通過數碼管顯示接收到的鍵值。圖 3紅外接收電路二、     編碼、解碼(1) 二進制信號的調制 二進制信號的調制由單片機來完成,它把編碼后的二進制信號調制成頻率為38kHz 的間斷脈沖串,相當于用二進制信號的編碼乘以頻率為38kHz 的脈沖信號得到的間斷脈沖串,即是調制后用于紅外發射二極管

3、發送的信號如圖4 二進制碼的調制所示(2) 紅外接收需先進行解調,解調的過程是通過紅外接收管進行接收的。其基本工作過程為:當接收到調制信號時,輸出高電平,否則輸出為低電平,是調制的逆過程(圖5 解調)。HS0038是一體化集成的紅外接收器件,直接就可以輸出解調后的高低電平信號;紅外接收器HS0038的應用電路(圖6)。(3)紅外遙控發射芯片采用 PPM 編碼方式,當發射器按鍵按下后 ,將發射一組 108ms 的編碼脈沖。遙控編碼脈沖由前導碼、16位地址碼(8 位地址碼、 8 位地址碼的反碼)和16位操作碼(8 位操作碼、 8 位操作碼的反碼)組成。通過對用戶碼的檢驗,每個遙控器只能控制一個設備

4、動作,這樣可以有效地防止多個設備之間的干擾。編碼后面還要有編碼的反碼,用來檢驗編碼接收的正確性,防止誤操作,增強系統的可靠性。前導碼是一個遙控碼的起始部分,由一個 9ms 的高電平 ( 起始碼 ) 和一個 4. 5ms 的低電平 ( 結果碼 ) 組成,作為接受數據的準備脈沖。以脈寬為 0. 56ms 、周期為 1. 12ms 的組合表示二進制的 “0” ;以脈寬為 1. 68ms 、周期為 2. 24ms 的組合表示二進制的 “1” 。(4)單片機采用外部中斷 INT0 管腳和紅外接收頭的信號線相連,中斷方式為邊沿觸發方式。計算中斷的間隔時間,來區分前導碼、二進制的 “1” 、 “0” 碼。并

5、將 8 位操作碼提取出來在數碼管上顯示。紅外接收頭輸出的原始遙控數據信號,正好和發射端倒向.也就是以前發射端原始信號是高電平,那接收頭輸出的就是低電平,反之.軟件原理:開始時發射一個特定的同步碼頭,對于接收端而言就是一個9ms的低電平,和一個4.5ms的高電平,這個同步碼頭可以使程序知道從這個同步碼頭以后可以開始接收數據。采用脈寬調制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈寬為0.565ms、間隔1.685ms、周期為2.25ms 的組合表示二進制的“1”。解碼的關鍵是如何識別“0”和“1”,從位的定義我們可以發現“0”、“1”均以

6、0.56ms的高電平開始,不同的是低電平的寬度不同,“0”為0.56ms,“1”為1.685ms,所以必須根據高電平的寬度區別“0”和“1”。如果從0.56ms低電平過后,開始延時,0.56ms以后,若讀到的電平為低,說明該位為“0”,反之則為“1”,為了可靠起見,延時必須比0.56ms長些,但又不能超過1.12ms,否則如果該位為“0”,讀到的已是下一位的高電平,因此取(1.12ms+0.56ms)/2=0.84ms最為可靠,一般取0.84ms 左右即可。根據紅外編碼的格式,程序應該等待9ms的起始碼和4.5ms的結果碼完成后才能讀碼。HS0038紅外接收器,接收紅外遙控器發射的信號,輸出D

7、ATA口和單片機的外部中斷0P3.2口相連。當有紅外信號時,觸發中斷查詢中斷時間,并和紅外起始碼,“0”、“1”、終止碼的時間進行比較。從而檢測紅外的操作碼。整體流程圖(1)發射部分:通過中斷產生38K 的載波,TX 端口產生發送的數據,然后經過與門放大經發射管發射數據:38k 載波 第一列有效發送數據 第二列對管發射數據 第三列2)接受部分:HS0038A2接受到38k載波時,會輸出低電平,否則輸出高電平。將HS0038A2產生的信號經過非門后得的原來的信號。HS0038A2 產生信號 第一列經過非門后得到原來數據 第二列經過與門(3)設計思想簡介:1:對輸入的數據進行編碼。2:對編碼進行脈

8、沖調制。3:信號放大后,通過發射管發送38khz信號。4:接收信號,進行解碼。5:讓51對信號進行處理(顯示,統計,分析)。51可參考的程序(1)發送程序#include <reg52.h> static bit OP; /紅外發射管的亮滅static unsigned int count; /延時計數器static unsigned int endcount; /終止延時計數static unsigned int temp; /按鍵static unsigned char flag; /紅外發送標志static unsigned char num; sbit ir_in=P34;

9、 char iraddr1; /十六位地址的第一個字節char iraddr2; /十六位地址的第二個字節unsigned char code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e; /共陽數碼管 0f void SendIRdata(char p_irdata); void delay(unsigned int); void keyscan(); /*主函數*/ void main(void) num=0; P2=0x3f; count = 0; flag =

10、 0; OP = 0; ir_in= 0; EA = 1; /允許CPU中斷TMOD = 0x11; /設定時器0和1為16位模式1 ET0 = 1; /定時器0中斷允許TH0 = 0xFF; TL0 = 0xE6; /設定時值0為38K 也就是每隔26us中斷一次TR0 = 1;/開始計數iraddr1=3;/00000011 iraddr2=252;/11111100 dokeyscan(); while(1); /*定時器0中斷處理 */ void timeint(void) interrupt 1 TH0=0xFF; TL0=0xE6; /設定時值為38K 也就是每隔26us中斷一次c

11、ount+; if (flag=1) OP=OP; else OP = 0; ir_in= OP; void SendIRdata(char p_irdata) int i; char irdata=p_irdata; /發送9ms的起始碼endcount=223; flag=1; count=0; dowhile(count<endcount); /*發送4.5ms的結果碼*/ endcount=117; flag=0; count=0; dowhile(count<endcount); /*發送十六位地址的前八位*/ irdata=iraddr1; for(i=0;i<8

12、;i+) /*先發送0.56ms的38KHZ紅外波(即編碼中0.56ms的低電平)*/ endcount=10; flag=1; count=0; dowhile(count<endcount); /*停止發送紅外信號(即編碼中的高電平)*/ if(irdata-(irdata/2)*2) /判斷二進制數個位為1還是0 endcount=41; /1為寬的高電平 else endcount=15; /0為窄的高電平 flag=0; count=0; dowhile(count<endcount); irdata=irdata>>1; /*發送十六位地址的后八位*/ ir

13、data=iraddr2; for(i=0;i<8;i+) endcount=10; flag=1; count=0; dowhile(count<endcount); if(irdata-(irdata/2)*2) endcount=41; else endcount=15; flag=0; count=0; dowhile(count<endcount); irdata=irdata>>1; /*發送八位數據*/ irdata=p_irdata; for(i=0;i<8;i+) endcount=10; flag=1; count=0; dowhile(

14、count<endcount); if(irdata-(irdata/2)*2) endcount=41; else endcount=15; flag=0; count=0; dowhile(count<endcount); irdata=irdata>>1; /*發送八位數據的反碼*/ irdata=p_irdata; for(i=0;i<8;i+) endcount=10; flag=1; count=0; dowhile(count<endcount); if(irdata-(irdata/2)*2) endcount=41; else endcou

15、nt=15; flag=0; count=0; dowhile(count<endcount); irdata=irdata>>1; endcount=10; flag=1; count=0; dowhile(count<endcount); flag=0; void delay(unsigned int z) unsigned char x,y; for(x=z;x>0;x-) for(y=110;y>0;y-); /*4×4鍵盤掃描按下按鍵發射數據*/ void keyscan() P1=0xfe; temp=P1; temp=temp&

16、;0xf0; while(temp!=0xf0) temp=P1; switch(temp) case 0xee:num=1; break; case 0xde:num=2; break; case 0xbe:num=3; break; case 0x7e:num=4; break; while(temp!=0xf0) temp=P1; temp=temp&0xf0; P2=tablenum-1; SendIRdata(tablenum-1); P1=0xfd; temp=P1; temp=temp&0xf0; while(temp!=0xf0) temp=P1; switch

17、(temp) case 0xed:num=5; break; case 0xdd:num=6; break; case 0xbd:num=7; break; case 0x7d:num=8;break; while(temp!=0xf0) temp=P1; temp=temp&0xf0; P2=tablenum-1; SendIRdata(tablenum-1); P1=0xfb; temp=P1; temp=temp&0xf0; while(temp!=0xf0) temp=P1; switch(temp) case 0xeb:num=9; break; case 0xdb:

18、num=10; break; case 0xbb:num=11; break; case 0x7b:num=12; break; while(temp!=0xf0) temp=P1; temp=temp&0xf0; P2=tablenum-1; SendIRdata(tablenum-1); P1=0xf7; temp=P1; temp=temp&0xf0; while(temp!=0xf0) temp=P1; switch(temp) case 0xe7:num=13; break; case 0xd7:num=14; break; case 0xb7:num=15; bre

19、ak; case 0x77:num=16; break; while(temp!=0xf0) temp=P1; temp=temp&0xf0; P2=tablenum-1; SendIRdata(tablenum-1); (2)接收程序#include"reg52.h" #define uchar unsigned char #define uint unsigned int uchar dis_num,num,num1,num2,num3; sbit led=P10; unsigned char code table= 0xc0,0xf9,0xa4,0xb0, 0

20、x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e; /共陽數碼管 0f sbit prem =P32; /定義遙控頭的接收腳uchar ram4=0,0,0,0;/存放接受到的4個數據地址碼16位+按鍵碼8位+按鍵碼取反的8位void delaytime(uint time) /延遲90uS uchar a,b; for(a=time;a>0;a-) for(b=40;b>0;b-); void rem()interrupt 0 /中斷函數 uchar ramc=0; /定義接收了4個字節的變量uchar co

21、unt=0; /定義現在接收第幾位變量uint i=0; /此處變量用來在下面配合連續監測9MS 內是否有高電平prem=1; for(i=0;i<1100;i+) /以下FOR語句執行時間為8MS左右 if(prem) /進入遙控接收程序首先進入引導碼的前半部判斷,即:是否有9MS左右的低電平return; /引導碼錯誤則退出 while(prem!=1); /等待引導碼的后半部 4.5 MS 高電平開始的到來。delaytime(50); /延時大于4.5MS時間,跨過引導碼的后半部分,來到真正遙控數據32位中/第一位數據的0.56MS開始脈沖for(ramc=0;ramc<4

22、;ramc+)/循環4次接收4個字節 for(count=0;count<8;count+) /循環8次接收8位(一個字節) while(prem!=1); /開始判斷現在接收到的數據是0或者1 ,首先在這行本句話時,/保已經進入數據的0.56MS 低電平階段/等待本次接受數據的高電平的到來。delaytime(9);/高電平到來后,數據0 高電平最多延續0.56MS,而數據1,高電平可/延續1.66MS大于0.8MS 后我們可以再判斷遙控接收腳的電平,if(prem) /如果這時高電平仍然在繼續那么接收到的數據是1的編碼 ramramc=(ramramc<<1)+1;/將目前接收到的數據位1放到對應的字節中delaytime(11); /如果本次接受到的數據是1,那么要繼續延遲1MS,這樣才能跨入/下個位編碼的低電平中(即是開始的0.56MS中) else /否

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論