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

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

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

hs0038紅外接收電路

姚小熊27 ? 來(lái)源:xx ? 2019-09-13 11:24 ? 次閱讀

紅外遙控有發(fā)送和接收兩個(gè)組成部分。發(fā)送端采用單片機(jī)將待發(fā)送的二進(jìn)制信號(hào)編碼調(diào)制為一系列的脈沖串信號(hào),通過(guò)紅外發(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ì)象。具體實(shí)現(xiàn)過(guò)程如下:

hs0038紅外接收電路

(在這里特別強(qiáng)調(diào):編碼與解碼是一對(duì)逆過(guò)程,不僅在原理上是一對(duì)逆過(guò)程,在碼的發(fā)收過(guò)程也是互反的,即以前發(fā)射端原始信號(hào)是高電平,那接收頭輸出的就是低電平,反之亦然。因此為了保證解碼過(guò)程簡(jiǎn)單方便,在編碼時(shí)應(yīng)該直接換算成其反碼。)

hs0038紅外接收電路

1.紅外發(fā)射部分:

下圖為紅外發(fā)射部分的電路擬圖:

hs0038紅外接收電路

編碼過(guò)程:

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

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

(2)PPM編碼

這種遙控編碼具有以下特征:

1遙控編碼脈沖由前導(dǎo)碼、16 位地址碼(8位地址碼、8 位地址碼的反碼)和 16 位操作碼(8 位操作碼、8 位操作碼的反碼)組成。前導(dǎo)碼:是一個(gè)遙控碼的起始部分,由一個(gè)9ms的高電平 ( 起始碼 ) 和一個(gè)4. 5ms的低電平 ( 結(jié)果碼 )組成,作為接受數(shù)據(jù)的準(zhǔn)備脈沖。

16位地址碼:能區(qū)別不同的紅外遙控設(shè)備,防止不同機(jī)種遙控碼互相干擾。

16 位操作碼:用來(lái)執(zhí)行不同的操作。

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

hs0038紅外接收電路

(3)發(fā)送程序

#include 《AT89X51.h》

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

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

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

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

sbit P3_4=P3^4;

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

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

void SendIRdata(char p_irdata);//發(fā)送子函數(shù)

void delay();

void main(void)

{

count = 0;

flag = 0; //無(wú)載波

OP = 0; //不亮

P3_4 = 0; //在后面會(huì)發(fā)現(xiàn)用OP賦值的

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;//自定義的一個(gè)地址

iraddr2=252;//地址反碼

do{

delay();

SendIRdata(12);

}while(1);

}

//定時(shí)器0中斷處理

void timeint(void) interrupt 1

{

TH0=0xFF;

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

count++;

if (flag==1)

{OP=~OP; }//如果是待發(fā)送的有效數(shù)據(jù)flag=1,就在此產(chǎn)生載波(亮滅交變)

else

{OP = 0; }

P3_4 = OP;

}

void SendIRdata(char p_irdata) //發(fā)送數(shù)據(jù)子函數(shù)

{

int i;

char irdata=p_irdata;

//發(fā)送9ms的起始碼,并是載波模式有效

endcount=223;

flag=1;

count=0;

while(count《endcount);//等待中斷,控制亮滅交變的總時(shí)間為9ms

//發(fā)送4.5ms的結(jié)果碼,并是載波模式無(wú)效

endcount=117

flag=0;

count=0;

do{}while(count《endcount);

//發(fā)送十六位地址的前八位

irdata=iraddr1;

for(i=0;i《8;i++)

{//一個(gè)周期里規(guī)定先以高電平開始,在以低電平結(jié)束。先發(fā)送0.56ms的38KHZ“1”的紅外波(即編碼中0.56ms的高電平)

endcount=10;

flag=1;

count=0;

do{}while(count《endcount);

//停止發(fā)送紅外信號(hào)(即編碼中的低電平)

if(irdata-(irdata/2)*2) //判斷二進(jìn)制數(shù)個(gè)位為1還是0

{endcount=41; } //1為寬的高電平1.68ms

else

{endcount=15; } //0為窄的高電平0.56ms

flag=0;

count=0;

while(count《endcount);

irdata=irdata》》1;//依次取位

}

//發(fā)送十六位地址的后八位

irdata=iraddr2; //此處已經(jīng)是地址的反碼

for(i=0;i《8;i++)

{

endcount=10;

flag=1;

count=0;

while(count《endcount);

if(irdata-(irdata/2)*2)

{endcount=41;}

else

{endcount=15;}

flag=0;

count=0;

do{}while(count《endcount);

irdata=irdata》》1;

}

//發(fā)送八位數(shù)據(jù)

irdata=p_irdata;

for(i=0;i《8;i++)

{

endcount=10;

flag=1;

count=0;

while(count《endcount);

if(irdata-(irdata/2)*2)

{ endcount=41; }

else

{endcount=15; }

flag=0;

count=0;

do{}while(count《endcount);

irdata=irdata》》1;

}

//發(fā)送八位數(shù)據(jù)的反碼

irdata=~p_irdata; //要將數(shù)據(jù)位取反

for(i=0;i《8;i++)

{

endcount=10;

flag=1;

count=0;

while(count《endcount);

if(irdata-(irdata/2)*2)

{endcount=41; }

else

{endcount=15; }

flag=0;

count=0;

while(count《endcount);

irdata=irdata》》1;

}

endcount=10;

flag=1;

count=0;

do{}while(count《endcount);

flag=0;

}

void delay()

{

int i,j;

for(i=0;i《400;i++)

{

for(j=0;j《100;j++)

{

}

}

}

一串完整的編碼如下圖所示

hs0038紅外接收電路

2.紅外接收部分:

紅外接收完成對(duì)紅外信號(hào)的接收、放大、檢波、整形,并解調(diào)出遙控編碼脈沖。為了減少干擾,采用的是價(jià)格便宜性能可靠的一體化紅外接收頭(HS0038,它接收紅外信號(hào)頻率為38kHz,周期約26us) 接收紅外信號(hào),它同時(shí)對(duì)信號(hào)進(jìn)行放大、檢波、整形得到 TTL電平的編碼信號(hào),再送給單片機(jī),經(jīng)單片機(jī)解碼并執(zhí)行去控制相關(guān)對(duì)象。

接收部分的電路擬圖為:

hs0038紅外接收電路

其應(yīng)用程序?yàn)椋?/p>

#include“reg52.h”

#define uchar unsigned char

#define uint unsigned int

#include“reg52.h”

#define uchar unsigned char

#define uint unsigned int

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; //此處變量用來(lái)在下面配合連續(xù)監(jiān)測(cè)9MS 內(nèi)是否有高電平

prem=1;

for(i=0;i《1100;i++) //以下FOR語(yǔ)句執(zhí)行時(shí)間為8MS左右

{

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

return; //引導(dǎo)碼錯(cuò)誤則退出 ,注意與break語(yǔ)句的區(qū)別

}

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

delaytime(50); //延時(shí)大于4.5MS時(shí)間,跨過(guò)引導(dǎo)碼的后半部分,來(lái)到真正遙控?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ù)的高電平的到來(lái)。

delaytime(9);//高電平到來(lái)后,數(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;

returned;}

main()

{

IT0=1; //設(shè)定INT0為邊沿觸發(fā)

EX0=1; //打開外部中斷0

EA=1; //全局中斷開關(guān)打開

while(1)

{

switch(dis_num)

{

case 0x81: num=0; break;

case 0xcf: num=1; break;

case 0x92: num=2; break;

case 0x86: num=3; break;

case 0xcc: num=4; break;

case 0xa4: num=5; break;

case 0xa0: num=6; break;

case 0x8f: num=7; break;

case 0x80: num=8; break;

case 0x84: num=9; break;

case 0x88: num=10;break;

case 0xe0: num=11;break;

case 0xb1: num=12;break;

case 0xc2: num=13;break;

case 0xb0: num=14;break;

case 0xb8: num=15;break;

}

P2=table[num];

P1=0x01;

delaytime(5);

}

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

    關(guān)注

    0

    文章

    154

    瀏覽量

    29635
  • 紅外遙控
    +關(guān)注

    關(guān)注

    22

    文章

    347

    瀏覽量

    45478
  • HS0038
    +關(guān)注

    關(guān)注

    1

    文章

    5

    瀏覽量

    13371
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    單片機(jī)應(yīng)用之紅外HS0038資料和程序

    單片機(jī)應(yīng)用之紅外HS0038資料和程序
    發(fā)表于 03-26 21:02

    HS0038B紅外接收問(wèn)題

    大家給看一下什么問(wèn)題? 我現(xiàn)在做一個(gè)紅外接收裝置,用0038來(lái)接收,紅外管發(fā)射頻率38KHZ沒問(wèn)題,用示波器看過(guò),為什么接收這段沒反應(yīng)呢?
    發(fā)表于 02-25 15:03

    請(qǐng)問(wèn)在Proteus中紅外接收HS0038A2怎么找

    請(qǐng)問(wèn)在Proteus中紅外接收HS0038A2怎么找?
    發(fā)表于 06-12 14:17

    5mm 紅外發(fā)射管940nm的接收管可以用hs0038接收嗎?

    5mm 紅外發(fā)射管940nm的接收管可以用hs0038接收嗎?還是要與之對(duì)應(yīng)的接收管?
    發(fā)表于 06-02 21:53

    解調(diào)38K載波的信號(hào)的紅外接收電路該如何設(shè)計(jì)?

    HS0038一體化紅外接收器件內(nèi)部的解調(diào)38K載波電路該如何設(shè)計(jì)呢,現(xiàn)在需要自己設(shè)計(jì)一個(gè)紅外接收
    發(fā)表于 11-21 18:00

    紅外接收設(shè)計(jì)問(wèn)題

    of theperiod. This leaves at most another 1/3 of the period to spend in transition. 我目前設(shè)計(jì)了一個(gè)電路:使用HS0038B這個(gè)紅外接收
    發(fā)表于 12-09 10:46

    紅外遙控接收HS0038是如何與紅外遙控器相匹配的?紅外接收器的工作原理是怎么樣的?

    `附件為從HS0038接收到的波形,紅外遙控器發(fā)射過(guò)來(lái)的數(shù)據(jù)中有地址碼,接收器是如何處理地址碼的、 `
    發(fā)表于 07-13 08:28

    紅外接收HS0038A2

    紅外接收HS0038A2
    發(fā)表于 11-05 14:49

    單片機(jī)的紅外線發(fā)射和接收配置端口的問(wèn)題

    紅外接收頭打算采用以下這些型號(hào):電平型”紅外接收頭:IRM138C、IRM38BC、IRM138S-2、IRM38BL-2……“脈沖型”紅外
    發(fā)表于 07-21 13:23

    基于STC89C52芯片和HS0038紅外接收探頭的紅外通信系統(tǒng)該如何去設(shè)計(jì)?

    紅外遙控系統(tǒng)是由哪幾部分組成的?基于STC89C52芯片和HS0038紅外接收探頭的紅外通信系統(tǒng)該如何去設(shè)計(jì)?
    發(fā)表于 07-06 08:13

    如何對(duì)基于STC89C52和HS0038紅外通信進(jìn)行實(shí)驗(yàn)?zāi)?/a>

    紅外遙控電路是由哪些部分組成的?如何對(duì)基于STC89C52和HS0038紅外通信進(jìn)行實(shí)驗(yàn)?zāi)兀?/div>
    發(fā)表于 10-28 07:01

    在用HS0038接收要遙控器的信號(hào)時(shí),通常識(shí)用IO口查詢還是外部中斷?

    在用HS0038接收要遙控器的信號(hào)時(shí),通常識(shí)用IO口查詢還是外部中斷。
    發(fā)表于 10-28 06:19

    紅外接收電路

    紅外接收電路資料,個(gè)人收藏資料參考,方便各位學(xué)習(xí)
    發(fā)表于 05-16 17:38 ?0次下載

    51單片機(jī)軟件解碼程序的核心要點(diǎn)

    紅外接收頭的型號(hào)有很多HS0038 VS838等 功能大致相同,只是引腳封裝不同。
    的頭像 發(fā)表于 11-21 09:30 ?1.1w次閱讀
    51單片機(jī)軟件解碼程序的核心要點(diǎn)

    迅為i.MX6Q開發(fā)板-紅外 hs0038 測(cè)試

    型號(hào):i.MX6Q開發(fā)板、紅外hs0038本文檔配套資料在網(wǎng)盤“iTOP-IMX6開發(fā)板資料匯總(不含光盤資料)\06_iTOP-iMX6開發(fā)板最小linux系統(tǒng)源碼、鏡像以及應(yīng)用\03_應(yīng)用測(cè)試
    的頭像 發(fā)表于 11-16 17:18 ?920次閱讀
    迅為i.MX6Q開發(fā)板-<b class='flag-5'>紅外</b> <b class='flag-5'>hs0038</b> 測(cè)試