红外编码解码程序,我写的是:发送模块通过按键,发送出相应键值的编码,接收模块接收到信号后解码该键值,并点亮相应的状态灯(新手,高手勿喷)
//*************************单片机红外发射*******************************
#include sbit ir=P1^3; sbit k1=P2^5; sbit k2=P2^4; sbit k3=P2^3; sbit k4=P2^2; sbit k5=P2^1; unsigned int count, set_count; bit irflag,keyflag; unsigned char irsys[]={0x00,0xff}; unsigned char irdata,ircode; void delay(unsigned int a) { unsigned char i; while(--a!=0) for(i=300;i>0;i--); } void keyscan() { /*if(k1==0) { delay(10); if(k1==0) { keyflag=1; while(!k1); irdata=0x01; } }*/ if(k2==0) { delay(10); if(k2==0) { keyflag=1; while(!k2); irdata=0x02; } } if(k3==0) { delay(10); if(k3==0) { keyflag=1; while(!k3); irdata=0x03; } } if(k4==0) { delay(10); if(k4==0) { keyflag=1; while(!k4); irdata=0x04; } } if(k5==0) { delay(10); if(k5==0) { keyflag=1; while(!k5); irdata=0x05; } } } void ir_sendbyte() //红外发送一个字节数据 { unsigned char i; for(i=0;i<8;i++) //发送8位数据 { set_count=43; //发送编码中的0.56ms高电平 irflag=1; count=0; TR0=1; while(count if(ircode&0x01) set_count=130; //判断红外编码最低位,若为1则1.69ms的低电平 else set_count=43; //为0则0.565ms的低电平 irflag=0; count=0; TR0=1; while(count ircode=ircode>>1; } } void ir_send() { set_count=346; //发送编码中的引导码(4.5ms高电平+4.5ms低电平) irflag=1; count=0; TR0=1; while(count set_count=346; //发送编码中的4.5ms低电平 irflag=0; count=0; TR0=1; while(count ircode=irsys[0]; ir_sendbyte(); ircode=irsys[1]; ir_sendbyte(); ircode=irdata; //发送8位数据码 ir_sendbyte(); ircode=~irdata; //发送8位数据反码 ir_sendbyte(); set_count=43; //发送编码中的0.56ms高电平 irflag=1; count=0; TR0=1; while(count irflag=0; /*delay(23); //延时23ms(编码中的23ms低电平) set_count=346; //发送编码中的引导码(4.5ms高电平+4.5ms低电平) irflag=1; count=0; TR0=1; while(count set_count=346; irflag=0; count=0; TR0=1; while(count set_count=43; irflag=1; count=0; TR0=1; while(count irflag=0; delay(23); } void timer0_init() { EA=1; TMOD=0x02; //定时0 8位自动重装模式 ET0=1; TH0=0xe6; //定时13us,38K红外矩形波,晶振24M TL0=0xe6; } void main() { timer0_init(); count=0; ir=0; irflag=0; while(1) { keyscan(); if(keyflag) { delay(10); ir_send(); delay(500); keyflag=0; delay(100); } } } void timer0() interrupt 1 { count++; if(irflag==1) ir=~ir; //有发射标志,则发射38khz的矩形波 else ir=0; } //*************************红外接收**************************** #include #define uchar unsigned char #define uint unsigned int sbit led1=P2^1; sbit led2=P2^2; sbit led3=P2^3; uchar irtime; uchar startflag; uchar irdata[33]; uchar bitnum; uchar irreceok; uchar ircode[4]; uchar irprosok; void display(); void timer0init() { TMOD=0x02; TH0=0x00; TL0=0x00; ET0=1; EA=1; TR0=1; } void int0init() { IT0=1; EX0=1; EA=1; } void irpros() { uchar k,i,j; uchar value; k=1; for(j=0;j<4;j++) { for(i=0;i<8;i++) { value=value>>1; if(irdata[k]>6) { value=value | 0x80; } k++; if(k>33) k=1; } ircode[j]=value; } irprosok=1; } void main() { timer0init(); int0init(); while(1) { if(irreceok) { irpros(); irreceok=0; } display(); } } void display() { switch(ircode[2]) { case 0x05: led1=1; led2=1; led3=1; break; case 0x02: led1=0; led2=1; led3=1; break; case 0x03: led2=0; led1=1; led3=1; break; case 0x04: led3=0; led1=1; led2=1; break; //case 0x01: 备用 } } void timer0 () interrupt 1 { irtime++; } void int0 () interrupt 0 { if(startflag) { if(irtime>32) //检测引导码 { bitnum=0; } irdata[bitnum]=irtime; irtime=0; bitnum++; if(bitnum==33) { bitnum=0; irreceok=1; startflag=0; } } else { startflag=1; irtime=0; } } 因篇幅问题不能全部显示,请点此查看更多更全内容