红外控制led灯,其中一号按键控制等亮,二号按键控制灯灭,三号按键控制灯的亮度增加,四好按键控制灯的亮度减小,仿真时接收部分没有信号,谢谢 /********************************************单片机红外发射******************************************* #include <reg52.h> sbit ir=P2^0;//红外发射管控制脚,使用24M晶振 sbit k1=P1^0; sbit k2=P1^1; sbit k3=P1^2; sbit k4=P1^3; unsigned int count, set_count; //中断计数,设定中断次数 bit irflag,keyflag; //红外发送标志位,按键标志位 unsigned char irsys[]={0x00,0xff};//16位用户码 unsigned char irdata,ircode; //发送的红外数据 //--------------------------------------------------------------------------- void delay(unsigned int a)//延时约1ms,晶振24M ,此处延时不需很精确 { unsigned char i; while(--a!=0) for(i=300;i>0;i--); //若是12M晶振i=125 } //--------------------------------------------------------------------------- void keyscan() // 按键扫描 { if(k1==0) { delay(10); if(k1==0) { keyflag=1; while(!k1); irdata=0x01; } } //k1键按下,则发射数据0x01 if(k2==0) { delay(10); if(k2==0) { keyflag=1; while(!k2); irdata=0x02; } } //k2键按下,则发射数据0x02 if(k3==0) { delay(10); if(k3==0) { keyflag=1; while(!k3); irdata=0x03; } }//k3键按下,则发数据0x03 if(k4==0) { delay(10); if(k4==0) { keyflag=1; while(!k4); irdata=0x04; } }//k4键按下,则发数据0x04 } //--------------------------------------------------------------------------- void ir_sendbyte() //红外发送一个字节数据 { unsigned char i; for(i=0;i<8;i++) //发送8位数据 { set_count=43;//35; //发送编码中的0.56ms高电平 (//后为12M晶振下的数值) irflag=1; //启动红外发射二极管发射 count=0; //中断计数先清0 TR0=1; //开启定时器0 while(count<set_count); //等待发送完 TR0=0; //关闭定时器0 if(ircode&0x01) set_count=130;//130; //判断红外编码最低位,若为1则1.69ms的低电平 (//后为12M晶振下的数值) else set_count=43;//35; //为0则0.565ms的低电平 (//后为12M晶振下的数值) irflag=0; //低电平则不发射 count=0; //中断计数清0 TR0=1; //开启定时器0 while(count<set_count); //等待发送完 TR0=0; //关闭定时器0 ircode=ircode>>1; //将数据右移,即从低位到高位发送 } } //--------------------------------------------------------------------------- void ir_send() //发送红外数据 { set_count=346;//672; //发送编码中的引导码(4.5ms高电平+4.5ms低电平) (//后为12M晶振下的数值) irflag=1; //启动红外发射二极管发射 count=0; //中断计数清0 TR0=1; while(count<set_count); TR0=0; set_count=346;//336; //发送编码中的4.5ms低电平(//后为12M晶振下的数值) irflag=0; //低电平则不发射 count=0; TR0=1; while(count<set_count); //等待发送完 TR0=0; ircode=irsys[0]; //发送16位用户码的前1-8位 ir_sendbyte(); ircode=irsys[1]; //发送16位用户码的前9-16位 ir_sendbyte(); ircode=irdata; //发送8位数据码 ir_sendbyte(); ircode=~irdata; //发送8位数据反码 ir_sendbyte(); set_count=43;//35; //发送编码中的0.56ms高电平 (//后为12M晶振下的数值) irflag=1; count=0; TR0=1; while(count<set_count); TR0=0; irflag=0; delay(23); //延时23ms(编码中的23ms低电平) set_count=346;//670; //发送编码中的引导码(4.5ms高电平+4.5ms低电平) (//后为12M晶振下的数值) irflag=1; count=0; TR0=1; while(count<set_count); TR0=0; set_count=346;//336; //发送编码中的4.5ms低电平(//后为12M晶振下的数值) irflag=0; count=0; TR0=1; while(count<set_count); TR0=0; set_count=43;//35; //发送编码中的0.56ms高电平 (//后为12M晶振下的数值) irflag=1; count=0; TR0=1; while(count<set_count); TR0=0; irflag=0; delay(23); } //--------------------------------------------------------------------------- void timer0_init() //定时器初始化 { EA=1; TMOD=0x02; //定时0 8位自动重装模式 ET0=1; TH0=0xe6;//0xf3; //定时13us,38K红外矩形波,晶振24M (//后为12M晶振下的数值) TL0=0xe6; } //--------------------------------------------------------------------------- void main() { timer0_init(); //定时0初始化 count=0; //中断计数先清0 ir=0; irflag=0; while(1) { keyscan(); //键值扫描 if(keyflag) //若有按键按下 { delay(10); ir_send(); //发送红外编码 delay(500); keyflag=0; //按键标志清零 delay(100); } } } //--------------------------------------------------------------------------- void timer0() interrupt 1 //定时器0中断 { count++; if(irflag==1) ir=~ir; //有发射标志,则发射38khz的矩形波 else ir=0; //否则不发射,即相当于发射编码中的低电平 } //***********红外接收********** #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit P2_0=P2^0; sbit P2_1=P2^1; uchar irtime; uchar startflag; uchar irdata[33]; uchar bitnum; uchar irreceok; uchar ircode[4]; uchar irprosok,flag; uchar zkb,i; void delay(uint z) { uint i,j; for(i=z;i>0;i--) for(j=120;j>0;j--);
} void time0init() { TMOD=0x02; TH0=0x00; TL0=0x00; ET0=1; EA=1; TR0=1; } void time1init() { TMOD=0x01; TH1=(65536-10)/256; TL1=(65536-10)%256; EA=1; ET1=1; TR1=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 display() { switch(ircode[2])
{ case 0x05: P2_1=1; break; case 0x02: P2_1=0; break;
case 0x03: if(zkb<9) { zkb++; } break; case 0x04: if(zkb>0) { zkb--; } break; } } void main() { time0init(); time1init(); int0init(); zkb=2; while(1) { if(irreceok) { irpros(); irreceok=0; if(irprosok) { if(ircode[2]=~ircode[3]) { display(); } delay(5); irprosok=0;
} } if(bitnum>33) { bitnum=0; irreceok=1; startflag=0; flag=0; } } } void time1(void) interrupt 2 { TH1=(65536-10)/256; TL1=(65536-10)%256; ++i; if(i>10) { i=0; }; if(i<=zkb) { P2_1=1; } else P2_1=0; } void timer0() interrupt 1 { irtime++; }
void int0() interrupt 0 { if(startflag) { if(irtime>31)//检测引导码 { bitnum=0; flag=1;
} if(flag) { irdata[bitnum]=irtime; irtime=0; bitnum++; } } else { startflag=1; irtime=0; } } |