紅外控制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;
}
}
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |