51单片机用HS0038B读取遥控按键码

各种红外遥控器产生的红外信号都是使用NEC协议,将自己的信号波加载到38KHZ的载波上发送出去的,而HS0038B自己具有解码功能,所以单片机从HS0038B所读取到的信号是解码后的信号,也就是按键码对应NEC协议里的高低电平。51单片机用HS0038B读取遥控按键码

NEC协议中,数据传输的格式为:引导码、用户码、用户码(或其反码)、按键码、按键码反码,最后一个停止位。

引导码为9ms载波加上4.5ms的空闲。数据“1”为560us的载波加上560us的空闲。数据“0”为560us的载波加上1.68ms的空闲。

配置51单片机的外部中断为下降沿触发,再通过定时器计时,可以得到每次收到的高低电平的时间,再对应得出相应的按键码即可。

写成头文件的形式

ifndef _INFRARED_H_
#define _INFRARED_H_

#include<reg52.h>
#include "infrared.h"
sbit ir_input = P3^3;

unsigned char flag = 0;
unsigned char ircode[4] = {0};

void initinfrared()
{
ir_input = 1;
TMOD &= 0x0f;
TMOD |= 0x10;
TR1 = 0;
ET1 = 0;
IT1 = 1;
EX1 = 1;
}
/*************»ñÈ¡¸ßµçƽʱ¼ä***********/
unsigned int get_high_time()
{
TH1 = 0;
TL1 = 0;
TR1 = 1;
while(ir_input)
{
if(TH1 > 0x40)
{
break;
}
}
TR1 = 0;

return (TH1 * 256 + TL1);
}

/*********»ñÈ¡µÍµçƽʱ¼ä*************/
unsigned int get_low_time()
{
TH1 = 0;
TL1 = 0;
TR1 = 1;
while(!ir_input)
{
if(TH1 > 0x40)
{
break;
}
}
TR1 = 0;

return (TH1*256+TL1);
}


void EXINT1_ISR() interrupt 2
{
unsigned char i,j;
unsigned int time;

time = get_low_time();

if((time < 7833)||(time > 9981))
{
IE1 = 0;
return;
}

time = get_high_time();

if((time < 3686 )||(time > 5216 ))
{
IE1 = 0;
return;
}
for(j = 0;j < 4;j++)
{
for(i=0;i<8;i++)
{
time = get_low_time();

if((time<313) ||(time >782))
{
IE1 = 0;
return;
}
time = get_high_time();

if((time>313) && (time <782))
{
byt >>= 1;
}
else if((time > 1325) && (time < 1930))
{
byt >>= 1;
byt |= 0x80;
}
else
{
IE1 = 0;
return;
}

}
ircode[j] = byt;
}
IE1 = 0;
}

#endif