0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

紅外通信原理詳解

GReq_mcu168 ? 來源:未知 ? 作者:李倩 ? 2018-07-25 18:32 ? 次閱讀

一、紅外通信原理

紅外遙控有發(fā)送和接收兩個(gè)組成部分。發(fā)送端采用單片機(jī)將待發(fā)送的二進(jìn)制信號(hào)編碼調(diào)制為一系列的脈沖串信號(hào),通過紅外發(fā)射管發(fā)射紅外信號(hào)。紅外接收完成對(duì)紅外信號(hào)的接收、放大、檢波、整形,并解調(diào)出遙控編碼脈沖。為了減少干擾,采用的是價(jià)格便宜性能可靠的一體化紅外接收頭(HS0038, 它接收紅外信號(hào)頻率為38kHz,周期約26μs) 接收紅外信號(hào),它同時(shí)對(duì)信號(hào)進(jìn)行放大、檢波、整形得到TTL 電平的編碼信號(hào),再送給單片機(jī),經(jīng)單片機(jī)解碼并執(zhí)行去控制相關(guān)對(duì)象。如圖1 所示:

紅外發(fā)送部分由51單片機(jī)、鍵盤、紅外發(fā)光二極管和7段數(shù)碼管組成。鍵盤用于輸入指令, 51單片機(jī)檢測鍵盤上按鍵的狀態(tài),并對(duì)紅外信號(hào)進(jìn)行調(diào)制,發(fā)光二極管產(chǎn)生紅外線,數(shù)碼管用來顯示發(fā)送的鍵值。圖2紅外發(fā)射電路

紅外接收部分由51單片機(jī)、一體化紅外接收頭HS0038和7段數(shù)碼管組成。51單片機(jī)檢測HS0038,并對(duì)HS0038接收到的數(shù)據(jù)解碼,通過數(shù)碼管顯示接收到的鍵值。圖 3紅外接收電路

二、編碼、解碼

(1) 二進(jìn)制信號(hào)的調(diào)制

二進(jìn)制信號(hào)的調(diào)制由單片機(jī)來完成,它把編碼后的二進(jìn)制信號(hào)調(diào)制成頻率為38kHz 的間斷脈沖串,相當(dāng)于用二進(jìn)制信號(hào)的編碼乘以頻率為38kHz 的脈沖信號(hào)得到的間斷脈沖串,即是調(diào)制后用于紅外發(fā)射二極管發(fā)送的信號(hào)如圖4 二進(jìn)制碼的調(diào)制所示

(2) 紅外接收需先進(jìn)行解調(diào),解調(diào)的過程是通過紅外接收管進(jìn)行接收的。其基本工作過程為:當(dāng)接收到調(diào)制信號(hào)時(shí),輸出高電平,否則輸出為低電平,是調(diào)制的逆過程(圖5 解調(diào))。HS0038是一體化集成的紅外接收器件,直接就可以輸出解調(diào)后的高低電平信號(hào);紅外接收器HS0038的應(yīng)用電路(圖6)。

(3)紅外遙控發(fā)射芯片采用 PPM 編碼方式,當(dāng)發(fā)射器按鍵按下后 ,將發(fā)射一組 108ms 的編碼脈沖。遙控編碼脈沖由前導(dǎo)碼、16位地址碼(8 位地址碼、 8 位地址碼的反碼)和16位操作碼(8 位操作碼、 8 位操作碼的反碼)組成。通過對(duì)用戶碼的檢驗(yàn),每個(gè)遙控器只能控制一個(gè)設(shè)備動(dòng)作,這樣可以有效地防止多個(gè)設(shè)備之間的干擾。編碼后面還要有編碼的反碼,用來檢驗(yàn)編碼接收的正確性,防止誤操作,增強(qiáng)系統(tǒng)的可靠性。前導(dǎo)碼是一個(gè)遙控碼的起始部分,由一個(gè) 9ms 的高電平 ( 起始碼 ) 和一個(gè) 4. 5ms 的低電平 ( 結(jié)果碼 ) 組成,作為接受數(shù)據(jù)的準(zhǔn)備脈沖。以脈寬為 0. 56ms 、周期為 1. 12ms 的組合表示二進(jìn)制的 “0” ;以脈寬為 1. 68ms 、周期為 2. 24ms 的組合表示二進(jìn)制的 “1” 。

(4)單片機(jī)采用外部中斷 INT0 管腳和紅外接收頭的信號(hào)線相連,中斷方式為邊沿觸發(fā)方式。計(jì)算中斷的間隔時(shí)間,來區(qū)分前導(dǎo)碼、二進(jìn)制的 “1” 、 “0” 碼。并將 8 位操作碼提取出來在數(shù)碼管上顯示。

紅外接收頭輸出的原始遙控?cái)?shù)據(jù)信號(hào),正好和發(fā)射端倒向.也就是以前發(fā)射端原始信號(hào)是高電平,那接收頭輸出的就是低電平,反之.

軟件原理:

開始時(shí)發(fā)射一個(gè)特定的同步碼頭,對(duì)于接收端而言就是一個(gè)9ms的低電平,和一個(gè)4.5ms的高電平,這個(gè)同步碼頭可以使程序知道從這個(gè)同步碼頭以后可以開始接收數(shù)據(jù)。

采用脈寬調(diào)制的串行碼,以脈寬為0.565ms、間隔0.56ms、周期為1.125ms的組合表示二進(jìn)制的“0”;以脈

寬為0.565ms、間隔1.685ms、周期為2.25ms 的組合表示二進(jìn)制的“1”。

解碼的關(guān)鍵是如何識(shí)別“0”和“1”,從位的定義我們可以發(fā)現(xiàn)“0”、“1”均以0.56ms的高電平開始,不同的是低電平的寬度不同,“0”為0.56ms,“1”為1.685ms,所以必須根據(jù)高電平的寬度區(qū)別“0”和“1”。如果從0.56ms低電平過后,開始延時(shí),0.56ms以后,若讀到的電平為低,說明該位為“0”,反之則為“1”,為了可靠起見,延時(shí)必須比0.56ms長些,但又不能超過1.12ms,否則如果該位為“0”,讀到的已是下一位的高電平,因此?。?.12ms+0.56ms)/2=0.84ms最為可靠,一般取0.84ms 左右即可。根據(jù)紅外編碼的格式,程序應(yīng)該等待9ms的起始碼和4.5ms的結(jié)果碼完成后才能讀碼。

HS0038紅外接收器,接收紅外遙控器發(fā)射的信號(hào),輸出DATA口和單片機(jī)的外部中斷0P3.2口相連。當(dāng)有紅外信號(hào)時(shí),觸發(fā)中斷查詢中斷時(shí)間,并和紅外起始碼,“0”、“1”、終止碼的時(shí)間進(jìn)行比較。從而檢測紅外的操作碼。

51可參考的程序

(1)發(fā)送程序

#include

static bit OP; //紅外發(fā)射管的亮滅

static unsigned int count; //延時(shí)計(jì)數(shù)器

static unsigned int endcount; //終止延時(shí)計(jì)數(shù)

static unsigned int temp; //按鍵

static unsigned char flag; //紅外發(fā)送標(biāo)志

static unsigned char num;

sbit ir_in=P3^4;

char iraddr1; //十六位地址的第一個(gè)字節(jié)

char iraddr2; //十六位地址的第二個(gè)字節(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è)定時(shí)器0和1為16位模式1

ET0 = 1; //定時(shí)器0中斷允許

TH0 = 0xFF;

TL0 = 0xE6; //設(shè)定時(shí)值0為38K也就是每隔26us中斷一次

TR0 = 1;//開始計(jì)數(shù)

iraddr1=3;//00000011

iraddr2=252;//11111100

do{keyscan();

}while(1);

}

void timeint(void) interrupt 1

{

TH0=0xFF;

TL0=0xE6; //設(shè)定時(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) //判斷二進(jìn)制數(shù)個(gè)位為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個(gè)數(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個(gè)字節(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í)行時(shí)間為8MS左右

{

if(prem) //進(jìn)入遙控接收程序首先進(jìn)入引導(dǎo)碼的前半部判斷,即:是否有9MS左右的低電平

return; //引導(dǎo)碼錯(cuò)誤則退出

}

while(prem!=1); //等待引導(dǎo)碼的后半部4.5 MS高電平開始的到來。

delaytime(50); //延時(shí)大于4.5MS時(shí)間,跨過引導(dǎo)碼的后半部分,來到真正遙控?cái)?shù)據(jù)32位中

//第一位數(shù)據(jù)的0.56MS開始脈沖

for(ramc=0;ramc<4;ramc++)//循環(huán)4次接收4個(gè)字節(jié)

{ for(count=0;count<8;count++) //循環(huán)8次接收8位(一個(gè)字節(jié))

{

while(prem!=1); //開始判斷現(xiàn)在接收到的數(shù)據(jù)是0或者1,首先在這行本句話時(shí),

//保已經(jīng)進(jìn)入數(shù)據(jù)的0.56MS低電平階段

//等待本次接受數(shù)據(jù)的高電平的到來。

delaytime(9);//高電平到來后,數(shù)據(jù)0高電平最多延續(xù)0.56MS,而數(shù)據(jù)1,高電平可

//延續(xù)1.66MS大于0.8MS后我們可以再判斷遙控接收腳的電平,

if(prem) //如果這時(shí)高電平仍然在繼續(xù)那么接收到的數(shù)據(jù)是1的編碼

{

ram[ramc]=(ram[ramc]<<1)+1;//將目前接收到的數(shù)據(jù)位1放到對(duì)應(yīng)的字節(jié)中

delaytime(11); //如果本次接受到的數(shù)據(jù)是1,那么要繼續(xù)延遲1MS,這樣才能跨入//下個(gè)位編碼的低電平中(即是開始的0.56MS中)

}

else //否則目前接收到的是數(shù)據(jù)0的編碼

ram[ramc]=ram[ramc]<<1; //將目前接收到的數(shù)據(jù)位0放到對(duì)應(yīng)的字節(jié)中

} //本次接收結(jié)束,進(jìn)行下次位接收,此接收動(dòng)作進(jìn)行32次,正好完成4個(gè)字節(jié)的接收

}

if(ram[2]!=(~(ram[3]&0x7f))) //本次接收碼的判斷

{

for(i=0;i<4;i++) //沒有此對(duì)應(yīng)關(guān)系則表明接收失敗,清除接受到的數(shù)據(jù)

ram[i]=0;

return ;

}

dis_num=ram[2]; //將接收到的按鍵數(shù)據(jù)賦給顯示變量

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 二極管
    +關(guān)注

    關(guān)注

    147

    文章

    9534

    瀏覽量

    165555
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6030

    文章

    44491

    瀏覽量

    632023
  • 二進(jìn)制
    +關(guān)注

    關(guān)注

    2

    文章

    786

    瀏覽量

    41566

原文標(biāo)題:單片機(jī)實(shí)現(xiàn)遙控器-紅外數(shù)據(jù)傳輸--紅外編解碼原理

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    串口通信詳解

    串口通信詳解
    發(fā)表于 08-16 17:19

    LabVIEW串口通信詳解

    LabVIEW串口通信詳解,很好的資料,推薦
    發(fā)表于 12-18 14:54

    紅外通信原理

    單片機(jī)紅外通信原理,帶C語言參考程序。
    發(fā)表于 02-12 19:33

    什么是紅外通信

    什么是紅外通信?人的眼睛能看到的可見光按波長從長到短排列,依次為紅、橙、黃、綠、青、藍(lán)、紫。其中紅光的波長范圍為0.62~0.76μm;紫光的波長范圍為0.38~0.46μm。比紫光波長還短的光叫紫外線,比紅光波長還長的光叫紅外
    發(fā)表于 07-27 06:50

    紅外遙控通信的原理是什么

    文章目錄紅外遙控通信原理紅外遙控通信原理在實(shí)際的通信領(lǐng)域,發(fā)出來的信號(hào)一般有較寬的頻譜,而且都是在比較低的頻率段分布大量的能量,所以稱之為基
    發(fā)表于 11-17 06:09

    WinCE 紅外通信程序設(shè)計(jì)

    以 WinCE 為操作系統(tǒng)的掌上電腦的紅外通信程序設(shè)計(jì)方法,分析了實(shí)現(xiàn)紅外通信的幾 種不同方式的特點(diǎn),用實(shí)例詳細(xì)介紹了紅外
    發(fā)表于 06-15 16:28 ?53次下載

    Modbus通信協(xié)議詳解

    關(guān)于Modbus通信協(xié)議的詳解和應(yīng)用分析
    發(fā)表于 10-12 16:54 ?150次下載
    Modbus<b class='flag-5'>通信</b>協(xié)議<b class='flag-5'>詳解</b>

    LabVIEW串口通信詳解

    LabVIEW串口通信詳解,基于LabVIEW來分析串口通信。
    發(fā)表于 03-15 13:55 ?479次下載

    CAN總線通信詳解

    CAN總線通信詳解。
    發(fā)表于 03-30 16:46 ?0次下載

    MATLAB通信仿真及應(yīng)用實(shí)例詳解

    通信系統(tǒng)的仿真和實(shí)例詳解,非常詳細(xì)的程序內(nèi)容
    發(fā)表于 07-13 17:43 ?15次下載

    幾種串行通信接口標(biāo)準(zhǔn)詳解

    幾種串行通信接口標(biāo)準(zhǔn)詳解
    發(fā)表于 01-03 11:34 ?0次下載

    基于MATLAB通信仿真及應(yīng)用實(shí)例詳解

    基于MATLAB通信仿真及應(yīng)用實(shí)例詳解
    發(fā)表于 09-04 09:01 ?49次下載
    基于MATLAB<b class='flag-5'>通信</b>仿真及應(yīng)用實(shí)例<b class='flag-5'>詳解</b>

    紅外通信原理及特點(diǎn)

    紅外通信是一種利用紅外線傳輸信息的通信方式??蓚鬏斦Z言、文字、數(shù)據(jù)、圖像等信息。傳輸角度有一定限制。 紅外線波長范圍為0.70m~1mm,
    發(fā)表于 11-02 17:46 ?2.9w次閱讀
    <b class='flag-5'>紅外</b>線<b class='flag-5'>通信</b>原理及特點(diǎn)

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

    ,這里是丹成學(xué)長,今天向大家詳細(xì)介紹分享,單片機(jī)的紅外控制原理紅外控制原理詳解大家可用于 課程設(shè)計(jì) 或 畢業(yè)設(shè)計(jì)技術(shù)解答畢設(shè)幫助:7468760412 紅外光特性
    發(fā)表于 12-17 17:49 ?5次下載
    畢設(shè)系列 -- 教程:<b class='flag-5'>紅外</b>控制原理<b class='flag-5'>詳解</b>

    紅外熱成像設(shè)備光學(xué)鏡頭詳解

    紅外熱成像儀的工作原理詳解紅外熱成像設(shè)備的工作原理相當(dāng)直接且簡潔。它的工作過程包括以下幾個(gè)關(guān)鍵步驟:紅外輻射的感知——紅外鏡頭
    的頭像 發(fā)表于 06-13 12:13 ?382次閱讀
    <b class='flag-5'>紅外</b>熱成像設(shè)備光學(xué)鏡頭<b class='flag-5'>詳解</b>