文档库 最新最全的文档下载
当前位置:文档库 › 红外解码

红外解码

#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;
}
}
}
}

相关文档
相关文档 最新文档