紅外控制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; } } |