紅外控制led燈,其中一號(hào)按鍵控制等亮,二號(hào)按鍵控制燈滅,三號(hào)按鍵控制燈的亮度增加,四好按鍵控制燈的亮度減小,仿真時(shí)接收部分沒有信號(hào),謝謝 /********************************************單片機(jī)紅外發(fā)射******************************************* #include <reg52.h> sbit ir=P2^0;//紅外發(fā)射管控制腳,使用24M晶振 sbit k1=P1^0; sbit k2=P1^1; sbit k3=P1^2; sbit k4=P1^3; unsigned int count, set_count; //中斷計(jì)數(shù),設(shè)定中斷次數(shù) bit irflag,keyflag; //紅外發(fā)送標(biāo)志位,按鍵標(biāo)志位 unsigned char irsys[]={0x00,0xff};//16位用戶碼 unsigned char irdata,ircode; //發(fā)送的紅外數(shù)據(jù) //--------------------------------------------------------------------------- void delay(unsigned int a)//延時(shí)約1ms,晶振24M ,此處延時(shí)不需很精確 { 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鍵按下,則發(fā)射數(shù)據(jù)0x01 if(k2==0) { delay(10); if(k2==0) { keyflag=1; while(!k2); irdata=0x02; } } //k2鍵按下,則發(fā)射數(shù)據(jù)0x02 if(k3==0) { delay(10); if(k3==0) { keyflag=1; while(!k3); irdata=0x03; } }//k3鍵按下,則發(fā)數(shù)據(jù)0x03 if(k4==0) { delay(10); if(k4==0) { keyflag=1; while(!k4); irdata=0x04; } }//k4鍵按下,則發(fā)數(shù)據(jù)0x04 } //--------------------------------------------------------------------------- void ir_sendbyte() //紅外發(fā)送一個(gè)字節(jié)數(shù)據(jù) { unsigned char i; for(i=0;i<8;i++) //發(fā)送8位數(shù)據(jù) { set_count=43;//35; //發(fā)送編碼中的0.56ms高電平 (//后為12M晶振下的數(shù)值) irflag=1; //啟動(dòng)紅外發(fā)射二極管發(fā)射 count=0; //中斷計(jì)數(shù)先清0 TR0=1; //開啟定時(shí)器0 while(count<set_count); //等待發(fā)送完 TR0=0; //關(guān)閉定時(shí)器0 if(ircode&0x01) set_count=130;//130; //判斷紅外編碼最低位,若為1則1.69ms的低電平 (//后為12M晶振下的數(shù)值) else set_count=43;//35; //為0則0.565ms的低電平 (//后為12M晶振下的數(shù)值) irflag=0; //低電平則不發(fā)射 count=0; //中斷計(jì)數(shù)清0 TR0=1; //開啟定時(shí)器0 while(count<set_count); //等待發(fā)送完 TR0=0; //關(guān)閉定時(shí)器0 ircode=ircode>>1; //將數(shù)據(jù)右移,即從低位到高位發(fā)送 } } //--------------------------------------------------------------------------- void ir_send() //發(fā)送紅外數(shù)據(jù) { set_count=346;//672; //發(fā)送編碼中的引導(dǎo)碼(4.5ms高電平+4.5ms低電平) (//后為12M晶振下的數(shù)值) irflag=1; //啟動(dòng)紅外發(fā)射二極管發(fā)射 count=0; //中斷計(jì)數(shù)清0 TR0=1; while(count<set_count); TR0=0; set_count=346;//336; //發(fā)送編碼中的4.5ms低電平(//后為12M晶振下的數(shù)值) irflag=0; //低電平則不發(fā)射 count=0; TR0=1; while(count<set_count); //等待發(fā)送完 TR0=0; ircode=irsys[0]; //發(fā)送16位用戶碼的前1-8位 ir_sendbyte(); ircode=irsys[1]; //發(fā)送16位用戶碼的前9-16位 ir_sendbyte(); ircode=irdata; //發(fā)送8位數(shù)據(jù)碼 ir_sendbyte(); ircode=~irdata; //發(fā)送8位數(shù)據(jù)反碼 ir_sendbyte(); set_count=43;//35; //發(fā)送編碼中的0.56ms高電平 (//后為12M晶振下的數(shù)值) irflag=1; count=0; TR0=1; while(count<set_count); TR0=0; irflag=0; delay(23); //延時(shí)23ms(編碼中的23ms低電平) set_count=346;//670; //發(fā)送編碼中的引導(dǎo)碼(4.5ms高電平+4.5ms低電平) (//后為12M晶振下的數(shù)值) irflag=1; count=0; TR0=1; while(count<set_count); TR0=0; set_count=346;//336; //發(fā)送編碼中的4.5ms低電平(//后為12M晶振下的數(shù)值) irflag=0; count=0; TR0=1; while(count<set_count); TR0=0; set_count=43;//35; //發(fā)送編碼中的0.56ms高電平 (//后為12M晶振下的數(shù)值) irflag=1; count=0; TR0=1; while(count<set_count); TR0=0; irflag=0; delay(23); } //--------------------------------------------------------------------------- void timer0_init() //定時(shí)器初始化 { EA=1; TMOD=0x02; //定時(shí)0 8位自動(dòng)重裝模式 ET0=1; TH0=0xe6;//0xf3; //定時(shí)13us,38K紅外矩形波,晶振24M (//后為12M晶振下的數(shù)值) TL0=0xe6; } //--------------------------------------------------------------------------- void main() { timer0_init(); //定時(shí)0初始化 count=0; //中斷計(jì)數(shù)先清0 ir=0; irflag=0; while(1) { keyscan(); //鍵值掃描 if(keyflag) //若有按鍵按下 { delay(10); ir_send(); //發(fā)送紅外編碼 delay(500); keyflag=0; //按鍵標(biāo)志清零 delay(100); } } } //--------------------------------------------------------------------------- void timer0() interrupt 1 //定時(shí)器0中斷 { count++; if(irflag==1) ir=~ir; //有發(fā)射標(biāo)志,則發(fā)射38khz的矩形波 else ir=0; //否則不發(fā)射,即相當(dāng)于發(fā)射編碼中的低電平 } //***********紅外接收********** #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)//檢測引導(dǎo)碼 { bitnum=0; flag=1;
} if(flag) { irdata[bitnum]=irtime; irtime=0; bitnum++; } } else { startflag=1; irtime=0; } } |