这是解码程序:
#include "ired.h"
/*红外遥控使用的是 NEC 协议,采用PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;*/
unsigned char gired_data[4];
void ired_init(void) //使用外部中断,感应到红外信号产生下降沿立即进入中断服务程序
{
EA=1; //总中断
EX0=1;//开外部中断0
IT0=1;//下降沿触发
IRED=1;
}
void ired() interrupt 0//进行解码
{
char i=0,j=0;
char high_time=0;
int time_count=0;
if(IRED==0)
{
time_count=1000;
while((!IRED)&&(time_count))//判断引导信号
{
delay_10us(1);
time_count--; //不需要严格满足9ms低电平的要求,时间有一定浮动
if(time_count==0)
return; //超过10ms,不是引导信号强制借束
}
if(IRED)//引导信号 9ms 低电平已过,进入 4.5ms 高电平
{
time_count=500; //5ms
while((IRED)&&(time_count))
{
delay_10us(1);
time_count--;
if(time_count==0)
return;
}
for(i=0;i<4;i++)//成功接收到引导信号,读取4个字节数据
{
for(j=0;j<8;j++)
{
time_count=60;
while((IRED==0)&&(time_count))
{
delay_10us(1);
time_count--;
if(time_count==0)
return;
}
while(IRED)//等待数据 1 或 0 后面的高电平结束,若超过 2ms 强制
{
delay_10us(10);
high_time++;
if(high_time>20)
return;
}
gired_data[i]>>=1;//先读取的为低位,然后是高位
if(high_time>=7)//如果高电平时间大于 0.7ms,数据则为 1,否则为 0
gired_data[i]|=0x80;
high_time=0;//清零,下次循环继续使用
}
}
}
if(gired_data[2]!=~gired_data[3])//校验控制码和反码
{
for(i=0;i<4;i++)
gired_data[i]=0;//全部置为0
return;//结束
}
}
}
#include "ired.h"
/*红外遥控使用的是 NEC 协议,采用PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;*/
unsigned char gired_data[4];
void ired_init(void) //使用外部中断,感应到红外信号产生下降沿立即进入中断服务程序
{
EA=1; //总中断
EX0=1;//开外部中断0
IT0=1;//下降沿触发
IRED=1;
}
void ired() interrupt 0//进行解码
{
char i=0,j=0;
char high_time=0;
int time_count=0;
if(IRED==0)
{
time_count=1000;
while((!IRED)&&(time_count))//判断引导信号
{
delay_10us(1);
time_count--; //不需要严格满足9ms低电平的要求,时间有一定浮动
if(time_count==0)
return; //超过10ms,不是引导信号强制借束
}
if(IRED)//引导信号 9ms 低电平已过,进入 4.5ms 高电平
{
time_count=500; //5ms
while((IRED)&&(time_count))
{
delay_10us(1);
time_count--;
if(time_count==0)
return;
}
for(i=0;i<4;i++)//成功接收到引导信号,读取4个字节数据
{
for(j=0;j<8;j++)
{
time_count=60;
while((IRED==0)&&(time_count))
{
delay_10us(1);
time_count--;
if(time_count==0)
return;
}
while(IRED)//等待数据 1 或 0 后面的高电平结束,若超过 2ms 强制
{
delay_10us(10);
high_time++;
if(high_time>20)
return;
}
gired_data[i]>>=1;//先读取的为低位,然后是高位
if(high_time>=7)//如果高电平时间大于 0.7ms,数据则为 1,否则为 0
gired_data[i]|=0x80;
high_time=0;//清零,下次循环继续使用
}
}
}
if(gired_data[2]!=~gired_data[3])//校验控制码和反码
{
for(i=0;i<4;i++)
gired_data[i]=0;//全部置为0
return;//结束
}
}
}