#include <stdio.h>
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define T_100US 100
#define T_REP 11250 //连发最小值
#define T_REP_ERROR 500 //连发最大值
#define T_ZERO 1125 //ZERO
#define T_ZERO_ERROR 100 //ZERO偏差
#define T_ONE 2250 //ONE
#define T_ONE_ERROR 100 //ONE偏差
#define T_LEADER 13500 //引导头
#define T_LEADER_ERROR 600 //引导头偏
bit head; //接收头标志
bit c_error=0; //错误标志
bit finish; //完成标志
bit datafg;
uchar c_bits=8; //接收记数器
uchar data irdata[4]={0,0,0,0};
uint onecode;
uint zerocode;
uchar irpoint;
void intersvr0(void) interrupt 0 using 1
{ uint temp;
temp=TL0+TH0*256;
TL0=0;
TH0=0;
if(datafg==1)
{ if((temp>(zerocode-T_ZERO_ERROR))&&(temp<(zerocode+T_ZERO_ERROR)))
_nop_();
if((temp>(onecode-T_ONE_ERROR))&&(temp<(onecode+T_ONE_ERROR)))
irdata[irpoint]+=0x80;
c_bits--;
if(c_bits)
irdata[irpoint]=irdata[irpoint]>>1;
else
{ irpoint++;
c_bits=8;
if(irpoint>=4)
{ datafg=0;
head=0;
finish=1;
}
}
}
if((head==1)&&(datafg==0))
{ if((temp>(T_LEADER-T_LEADER_ERROR))&&(temp<(T_LEADER+T_LEADER_ERROR)))
{ datafg=1;
onecode=temp/6;
zerocode=temp/12;
repeatcode=temp-onecode;
irdata[0]=0;
irdata[1]=0;
irdata[2]=0;
irdata[3]=0;
c_bits=8;
irpoint=0;
}
}
if((head==0)&&(finish==0))
head=1;
}
void timer1(void)interrupt 3 using 1
{ TH1=-1000/256; //1毫秒定时
TL1=-1000%256;
if((first_key_delay==1)&&(nonekey==0))
{ keydlcount++;
if(keydlcount>=400)
{ keydlcount=0;
repeatdelay=0;
keycount=0;
first_key_delay=0;
key_delay=0;
RED=1;
}
}
if((datafg==1)||(repeatflag==1))
{ uint temp;
temp=TL0+TH0*256;
if(temp>0x0e00)
{ head=0;
repeatflag=0; //重复码标志
irdata[0]=0;
irdata[1]=0;
irdata[2]=0;
irdata[3]=0;
finish=0;
}
}
}
void tsetctrl(void)
{ uchar aa;
if(finish==1)
{ aa=irdata[2]+irdata[3];
if(aa!=0xff)
c_error=1;
}
}
void main(void)
{ P1=0x03;
P3=0x0f;
TMOD=0x11; //定时器1为为16位定时器,定时器0为16位定时器
TCON=0x51; //设置T1、T0控制位,外部中断0下降沿触发
TH0=0;
TL0=0;
TH1=-1000/256; //1ms定时
TL1=-1000%256;
IE=0x8b; //总中断使能,定时器1中断使能,定时器0中断使能,外部中断0使能
state=0;
delayX10ms(10);
BEEP=1;
GREEN=1;
RED=0;
for(;;)
{
if(finish==1)
{
userhigh=irdata[0];
userlow=irdata[1];
tsetctrl();
}
}
} |