转自:http://blog.sina.com.cn/s/blog_6b86b0f20101iq0q.html
红外解码的关键就是识别“0”和“1”。以下是具体代码,通过51单片机接受红外信号,解码后将8位操作码通过串口以十六进制发送给电脑(比较粗糙,还没来得及完善,仅供参考)
#include//单片机型号 C89C52 #define uchar unsigned char #define uint unsigned int sbit =P3^2;//位定义,使用P3^2口外部中断0 uint lowtime,hightime; uchar a[4],m,flag; bit decode();//解码程序 void sci();//串口初始化 void main() { // delay_ms(100); TR0=0; TH0=0; TL0=0; sci(); EA=1; IT0=1;//设置外部中断0为下降沿触发方式 EX0=1;//开外部中断0 while(1) { if(flag==1) //验证前导码正确后才开始解码并向串口发送数据 { decode(); for(m=0;m<1;m++)//向串口发射a[2],及8位操作码 { SBUF=a[2]; while(! ); TI=0; } while(1); } } } void ext0() interrupt 0 { EX0=0;//进外部中断0后立即关闭中断0,防止二次中断 TR0=1;//开定时器0 while(IR==0);//一直计数,直到IR由0跳变到1 TR0=0;//关闭定时器0 lowtime=256*TH0+TL0;//lowtime储存引导码低电平持续时间 TH0=0; TL0=0;//清空定时器0寄存器值,以备下一次计数 TR0=1; while(IR==1);//等待IR由1跳表到0 TR0=0;//关闭定时器0 hightime=256*TH0+TL0;//hightime存储结果码高电平持续时间 if((lowtime>7800)&&(lowtime<8800)&&(hightime>3600)&&(hightime<4700)) //9000us/1.085=8294,判断区间8800-7800 //4500us/1.085=4100,判断区间3600-4700 //此值为11.0592MHz晶振时的值。