当前位置:文档之家› 最简单详细的红外解码程序

最简单详细的红外解码程序

#include<reg52.h> //包含头文件名
sbit IRIN=P3^2; //定义红外接收头的外部接口,即外部中断0
sbit BEEP=P1^5; //定义蜂鸣器接口,我的在P1^5
unsigned char IRCOM[7]; //定义数组,用来存储红外接收到的数据
void delay(unsigned char x)
{ //延时子程序unsigned char i; //延时约x*0.14ms
while(x--) //不同遥控器应设置不同的参数
{for(i=0;i<13;i++){}} //参数的选择咱们先不管,先看这个
}
void beep()
{
unsigned char i; //蜂鸣器发声子程序
for(i=0;i<100;i++)
{
delay(4); //这个得看你的蜂鸣器内部是否有振荡源
BEEP=~BEEP;
} //如果没有振荡源就应该输入脉冲信号
BEEP=1;
}
void IR_IN() interrupt 0 using 0 //外部中断0程序
{
unsigned char j,k,n=0; //先定义变量,记住n=0
EX0=0; //禁止中断,以免再次进入中断
delay(15); //延时0.14ms*15=2.1ms
if(IRIN==1) //如果在这期间有高电平说明
{ //信号不是来自遥控的,返回主程序
EX0=1;
return;
}
while(!IRIN){delay(1);} //死循环,等待9ms前导低电平信号的结束for(j=0;j<4;j++) //一共有4组数据
{
for(k=0;k<8;k++) //每组数据有8位
{
while(IRIN){delay(1);} //死循环,等待4.5ms前导高电平的结束
while(!IRIN){delay(1);} //等待0.56ms低电平的结束,准备采集数据,
while(IRIN) //开始采集数据
{
delay(1); //延时0.14ms,每过0.14ms时n就加1
n++; //用n记录一共有多少个0.14ms
if(n>=30) //如果超过0.14ms*30=4.2ms
{ //说明是乱码,放弃不要
EX0=1;
return;}
}
IRCOM[j]=IRCOM[j]>>1; //右移1位,xxxx xxxx变成0xxx xxx
//我们先认为这一位数据是0,现在已经送入一位数据了
/*你肯定知道_cror_(x,1)和x>>1的区别吧*/
if(n>=8){IRCOM[j]=IRCOM[j]|0x80;}//但是如果不是0呢,
//0xxx xxxx和0x80相或后变成了1xxx xxxx
//这样这一们数据就被记录为1了
/*想一下这里为什么是8呢,0.14ms*8=1.12ms,知道了吧*/
/*这样反复执行8次,8位数据就存在IRCOM[j]中了*/
/*外层再循环4次,4*8=32位数据码全都在IRCOM[0],IRCOM[1],IRCOM[2],IRCO M[3]中了*/
n=0; //n计数后一定要记得清0,否则下一次就不能准确计数了
}
}
if(IRCOM[2]!=~IRCOM[3]) //这里我们判断数据码和数据反码是不是相反{ //因为相反才是正确的,否则就放弃
EX0=1;
return;}
beep();
EX0=1; //记得开中断,你可以去掉这句话试一试
}
void main()
{
IE=0x81;
TCON=0X01;
BEEP=1;
IRIN=1;
while(1);
}
怎么样,你看懂了吗?
作者:任杰。

相关主题