#include
#define uint unsigned int
#define uchar unsigned char
uchar irtime;//红外用全局变量
bit irpro_ok,irok;
uchar IRcord[4];
uchar irdata[33];
uchar a;
sbit IRIN=P3^2;
sbit fmq=P2^2;
sbit led=P0^1;
void Ir_work(void);
void Ircordpro(void);
void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数
{
irtime++;
}
void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数
{
static unsigned char i;
static bit startflag;
if(startflag){
if(irtime<63&&irtime>=33)
i=0;
irdata[i]=irtime;
irtime=0;
i++;
if(i==33){
irok=1;
i=0;
}
}
else{
irtime=0;
startflag=1;
}
}
void TIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;//
TL0=0x00;//
ET0=1;//开中断
TR0=1;
}
void EX0init(void)
{
IT0 = 1; //
EX0 = 1; //
EA = 1;
}
void Ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k=1;
unsigned char cord,value;
for(i=0;i<4;i++){//处理4个字节
for(j=1;j<=8;j++){ //处理1个字节8位
cord=irdata[k];
value=value>>1;
if(cord>7) value=value|0x80; //
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
a=IRcord[2];
}
void main(void)
{
EX0init(); // Enable Global Interrupt Flag
TIM0init();
while(1)
{
if(irok)
{
Ircordpro();
irok=0;
}
if(irpro_ok)
{
switch(a)
{
case 0x5a: led=0;
break;
case 0x42: led=1;
break;
case 0x52: fmq=1;
break;
case 0x4a: fmq=0;
break;
default: fmq=1;
break;
}
}
}
}