紅外遙控有發(fā)送和接收兩個組成部分。發(fā)送端采用單片機將待發(fā)送的二進制信號編碼調(diào)制為一系列的脈沖串信號,通過紅外發(fā)射管發(fā)射紅外信號。紅外接收完成對紅外信號的接收、放大、檢波、整形,并解調(diào)出遙控編碼脈沖。為了減少干擾,采用的是價格便宜性能可靠的一體化紅外接收頭(HS0038, 它接收紅外信號頻率為38kHz,周期約26μs) 接收紅外信號,它同時對信號進行放大、檢波、整形得到TTL 電平的編碼信號,再送給單片機,經(jīng)單片機解碼并執(zhí)行去控制相關(guān)對象。如圖1 所示:
紅外發(fā)送部分由51單片機、鍵盤、紅外發(fā)光二極管和7段數(shù)碼管組成。鍵盤用于輸入指令, 51單片機檢測鍵盤上按鍵的狀態(tài),并對紅外信號進行調(diào)制,發(fā)光二極管產(chǎn)生紅外線,數(shù)碼管用來顯示發(fā)送的鍵值。圖2紅外發(fā)射電路
紅外接收部分由51單片機、一體化紅外接收頭HS0038和7段數(shù)碼管組成。51單片機檢測HS0038,并對HS0038接收到的數(shù)據(jù)解碼,通過數(shù)碼管顯示接收到的鍵值。圖 3紅外接收電路
二、編碼、解碼
(1) 二進制信號的調(diào)制
二進制信號的調(diào)制由單片機來完成,它把編碼后的二進制信號調(diào)制成頻率為38kHz 的間斷脈沖串,相當于用二進制信號的編碼乘以頻率為38kHz 的脈沖信號得到的間斷脈沖串,即是調(diào)制后用于紅外發(fā)射二極管發(fā)送的信號如圖4 二進制碼的調(diào)制所示
(2) 紅外接收需先進行解調(diào),解調(diào)的過程是通過紅外接收管進行接收的。其基本工作過程為:當接收到調(diào)制信號時,輸出高電平,否則輸出為低電平,是調(diào)制的逆過程(圖5 解調(diào))。HS0038是一體化集成的紅外接收器件,直接就可以輸出解調(diào)后的高低電平信號;紅外接收器HS0038的應(yīng)用電路(圖6)。
(3)紅外遙控發(fā)射芯片采用 PPM 編碼方式,當發(fā)射器按鍵按下后 ,將發(fā)射一組 108ms 的編碼脈沖。遙控編碼脈沖由前導(dǎo)碼、16位地址碼(8 位地址碼、 8 位地址碼的反碼)和16位操作碼(8 位操作碼、 8 位操作碼的反碼)組成。通過對用戶碼的檢驗,每個遙控器只能控制一個設(shè)備動作,這樣可以有效地防止多個設(shè)備之間的干擾。編碼后面還要有編碼的反碼,用來檢驗編碼接收的正確性,防止誤操作,增強系統(tǒng)的可靠性。前導(dǎo)碼是一個遙控碼的起始部分,由一個 9ms 的高電平 ( 起始碼 ) 和一個 4. 5ms 的低電平 ( 結(jié)果碼 ) 組成,作為接受數(shù)據(jù)的準備脈沖。以脈寬為 0. 56ms 、周期為 1. 12ms 的組合表示二進制的 “0” ;以脈寬為 1. 68ms 、周期為 2. 24ms 的組合表示二進制的 “1” 。
(4)單片機采用外部中斷 INT0 管腳和紅外接收頭的信號線相連,中斷方式為邊沿觸發(fā)方式。計算中斷的間隔時間,來區(qū)分前導(dǎo)碼、二進制的 “1” 、 “0” 碼。并將 8 位操作碼提取出來在數(shù)碼管上顯示。
紅外接收頭輸出的原始遙控數(shù)據(jù)信號,正好和發(fā)射端倒向.也就是以前發(fā)射端原始信號是高電平,那接收頭輸出的就是低電平,反之.
軟件原理:
開始時發(fā)射一個特定的同步碼頭,對于接收端而言就是一個9ms的低電平,和一個4.5ms的高電平,這個同步碼頭可以使程序知道從這個同步碼頭以后可以開始接收數(shù)據(jù)。
采用脈寬調(diào)制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進制的“0”;以脈
寬為0.565ms、間隔1.685ms、周期為2.25ms 的組合表示二進制的“1”。
解碼的關(guān)鍵是如何識別“0”和“1”,從位的定義我們可以發(fā)現(xiàn)“0”、“1”均以0.56ms的高電平開始,不同的是低電平的寬度不同,“0”為0.56ms,“1”為1.685ms,所以必須根據(jù)高電平的寬度區(qū)別“0”和“1”。如果從0.56ms低電平過后,開始延時,0.56ms以后,若讀到的電平為低,說明該位為“0”,反之則為“1”,為了可靠起見,延時必須比0.56ms長些,但又不能超過1.12ms,否則如果該位為“0”,讀到的已是下一位的高電平,因此取(1.12ms+0.56ms)/2=0.84ms最為可靠,一般取0.84ms 左右即可。根據(jù)紅外編碼的格式,程序應(yīng)該等待9ms的起始碼和4.5ms的結(jié)果碼完成后才能讀碼。
HS0038紅外接收器,接收紅外遙控器發(fā)射的信號,輸出DATA口和單片機的外部中斷0P3.2口相連。當有紅外信號時,觸發(fā)中斷查詢中斷時間,并和紅外起始碼,“0”、“1”、終止碼的時間進行比較。從而檢測紅外的操作碼。
51可參考的程序
(1)發(fā)送程序
#include
static bit OP; //紅外發(fā)射管的亮滅
static unsigned int count; //延時計數(shù)器
static unsigned int endcount; //終止延時計數(shù)
static unsigned int temp; //按鍵
static unsigned char flag; //紅外發(fā)送標志
static unsigned char num;
sbit ir_in=P3^4;
char iraddr1; //十六位地址的第一個字節(jié)
char iraddr2; //十六位地址的第二個字節(jié)
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共陽數(shù)碼管0~~f
void SendIRdata(char p_irdata);
void delay(unsigned int);
void keyscan();
void main(void)
{
num=0;
P2=0x3f;
count = 0;
flag = 0;
OP = 0;
ir_in= 0;
EA = 1; //允許CPU中斷
TMOD = 0x11; //設(shè)定時器0和1為16位模式1
ET0 = 1; //定時器0中斷允許
TH0 = 0xFF;
TL0 = 0xE6; //設(shè)定時值0為38K也就是每隔26us中斷一次
TR0 = 1;//開始計數(shù)
iraddr1=3;//00000011
iraddr2=252;//11111100
do{keyscan();
}while(1);
}
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //設(shè)定時值為38K也就是每隔26us中斷一次
count++;
if (flag==1)
{
OP=~OP;
}
else
{
OP = 0;
}
ir_in= OP;
}
void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;
//發(fā)送9ms的起始碼
endcount=223;
flag=1;
count=0;
do{}while(count
endcount=117;
flag=0;
count=0;
do{}while(count
irdata=iraddr1;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count
if(irdata-(irdata/2)*2) //判斷二進制數(shù)個位為1還是0
{
endcount=41; //1為寬的高電平
}
else
{
endcount=15; //0為窄的高電平
}
flag=0;
count=0;
do{}while(count
irdata=irdata>>1;
}
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{endcount=15;
}
flag=0;
count=0;
do{}while(count
irdata=irdata>>1;
}
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count
irdata=irdata>>1;
}
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count
irdata=irdata>>1;
}
endcount=10;
flag=1;
count=0;
do{}while(count
flag=0;
}
void delay(unsigned int z)
{
unsigned char x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
(2)接收程序
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
uchar dis_num,num,num1,num2,num3;
sbit led=P1^0;
unsigned char code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e}; //共陽數(shù)碼管0~~f
sbit prem =P3^2; //定義遙控頭的接收腳
uchar ram[4]={0,0,0,0};//存放接受到的4個數(shù)據(jù)地址碼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 //中斷函數(shù)
{
uchar ramc=0; //定義接收了4個字節(jié)的變量
uchar count=0; //定義現(xiàn)在接收第幾位變量
uint i=0; //此處變量用來在下面配合連續(xù)監(jiān)測9MS內(nèi)是否有高電平
prem=1;
for(i=0;i<1100;i++) //以下FOR語句執(zhí)行時間為8MS左右
{
if(prem) //進入遙控接收程序首先進入引導(dǎo)碼的前半部判斷,即:是否有9MS左右的低電平
return; //引導(dǎo)碼錯誤則退出
}
while(prem!=1); //等待引導(dǎo)碼的后半部4.5 MS高電平開始的到來。
delaytime(50); //延時大于4.5MS時間,跨過引導(dǎo)碼的后半部分,來到真正遙控數(shù)據(jù)32位中
//第一位數(shù)據(jù)的0.56MS開始脈沖
for(ramc=0;ramc<4;ramc++)//循環(huán)4次接收4個字節(jié)
{ for(count=0;count<8;count++) //循環(huán)8次接收8位(一個字節(jié))
{
while(prem!=1); //開始判斷現(xiàn)在接收到的數(shù)據(jù)是0或者1,首先在這行本句話時,
//保已經(jīng)進入數(shù)據(jù)的0.56MS低電平階段
//等待本次接受數(shù)據(jù)的高電平的到來。
delaytime(9);//高電平到來后,數(shù)據(jù)0高電平最多延續(xù)0.56MS,而數(shù)據(jù)1,高電平可
//延續(xù)1.66MS大于0.8MS后我們可以再判斷遙控接收腳的電平,
if(prem) //如果這時高電平仍然在繼續(xù)那么接收到的數(shù)據(jù)是1的編碼
{
ram[ramc]=(ram[ramc]<<1)+1;//將目前接收到的數(shù)據(jù)位1放到對應(yīng)的字節(jié)中
delaytime(11); //如果本次接受到的數(shù)據(jù)是1,那么要繼續(xù)延遲1MS,這樣才能跨入//下個位編碼的低電平中(即是開始的0.56MS中)
}
else //否則目前接收到的是數(shù)據(jù)0的編碼
ram[ramc]=ram[ramc]<<1; //將目前接收到的數(shù)據(jù)位0放到對應(yīng)的字節(jié)中
} //本次接收結(jié)束,進行下次位接收,此接收動作進行32次,正好完成4個字節(jié)的接收
}
if(ram[2]!=(~(ram[3]&0x7f))) //本次接收碼的判斷
{
for(i=0;i<4;i++) //沒有此對應(yīng)關(guān)系則表明接收失敗,清除接受到的數(shù)據(jù)
ram[i]=0;
return ;
}
dis_num=ram[2]; //將接收到的按鍵數(shù)據(jù)賦給顯示變量
}
-
二極管
+關(guān)注
關(guān)注
148文章
9990瀏覽量
169823 -
單片機
+關(guān)注
關(guān)注
6060文章
44833瀏覽量
645163 -
二進制
+關(guān)注
關(guān)注
2文章
803瀏覽量
42077
原文標題:單片機實現(xiàn)遙控器-紅外數(shù)據(jù)傳輸--紅外編解碼原理
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
什么是紅外通信?
紅外遙控通信的原理是什么
WinCE 紅外通信程序設(shè)計
紅外線通信原理及特點

畢設(shè)系列 -- 教程:紅外控制原理詳解

評論