//====================================================
//infrared 红外
//====================================================
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay10us(unsigned int t);
void delay_ms(unsigned int t);
sbit IR=P3^2;
uchar sys_code,key_code,buf_code,bit_count,buf_T;
uchar inf_state;//inf_state:0空闲状态,1引导码,2系统码sys,3过渡码,4功能码key
bit inf_new_flg;
//------------------------------------------------------
void main()
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
TR1=1;
PCON=PCON&0x7f;
SCON=0x50;
EX0=1;
IT0=1;
PX0=1;
EA=1;
while(1)
{
if(inf_new_flg==1)
{
inf_new_flg=0;
SBUF=key_code;
while(!TI);
TI=0;
delay10us(60);
}
}
}//------------------------------------------------------
void int0() interrupt 0 using 0
{
EX0=0;
TR0=0;
buf_T=TH0;
switch(inf_state)
{
case 0: inf_state=1;
break;
case 1: if(buf_T>0x2B && buf_T<0x2F)
inf_state=2;
break;
case 2: if(buf_T>0x01 && buf_T<0x05)//窄脉冲接收
{
buf_code>>=1;//接收0
bit_count++;
}
else if(buf_T>0x05&&buf_T<0x09)//宽脉冲接收
{
buf_code>>=1;
buf_code|=0x80;//接收1
bit_count++;//数据脉冲数累加,一共有8 个
}
if(bit_count>=8)//若收完8位数据脉冲,则进行以下的处理
{
inf_state=3;//标志接收系统进入中间过渡态
bit_count=0;
sys_code=buf_code;
buf_code=0;
}
break;
case 3: if(buf_T>0x0e&&buf_T<0x12)
inf_state=4;
break;
case 4: if(buf_T>0x01&&buf_T<0x05)//窄脉冲接收
{
buf_code>>=1;//接收0
bit_count++;
}
else if(buf_T>0x05&&buf_T<0x09)//宽脉冲接收
{
buf_code>>=1;
buf_code|=0x80;//接收1
bit_count++;//数据脉冲数累加,一共有8 个
}
if(bit_count>=8)//若收完8位数据脉冲,则进行以下的处理
{
inf_state=0;//标志进入空闲状态
bit_count=0;
key_code=buf_code;
buf_code=0;
inf_new_flg=1;
//delay_ms(10);
}
}
TL0=0;
TH0=0;
TR0=1;
EX0=1;
}//------------------------------------------------------
void delay10us(unsigned int t)
{
while(t--);
}//------------------------------------------------------
void delay_ms(uint t)
{
uint i;
uchar j;
for(i=0;i<t;i++)
for(j=0;j<125;j++);
}//------------------------------------------------------