|
楼主 |
发表于 2013-11-12 01:39:40
|
显示全部楼层
这个是捕捉方法
/*
//-------------------------------------------------------------------
//捕捉方式的红外遥控可以正检测到键值和及其码
//在2013-11-08AM01:00实验通过
//编译器:WinAvr2010
//遥控器为NEC协议
//-------------------------------------------------------------------
ISR(TIMER1_CAPT_vect)
{
static uint oldCapt;//旧捕捉时间
uint newCapt; //新捕捉时间
static uchar bitcnt;//接收的数据位数总长度
static uchar kk[4];
uint temp=0;//用来存贮newCapt和oldCapt的时间差
uchar x;
newCapt=ICR1;
temp=newCapt-oldCapt;
oldCapt=newCapt;
//数据位'0'的判断,低电平(565us)+高电平(560us) =1125us表示0
if(temp>1025&&temp<1225)
x=0;
//数据位'1'的判断,低电平(565us)+高电平(1685us)=2250us表示1
else if(temp>2150&&temp<2350)
x=0x80;
//起始信号判断,低电平(9000us)+高电平(4500us) =13500us表示headcode
else if(temp>13400&&temp<13600)
{
bitcnt=TCNT1=oldCapt=newCapt=0;
kk[0]=kk[1]=kk[2]=kk[3]=0x00;
return;//返回等待下次继续接收
}
//高低电平总和都不在以上的值则为干扰信号
else return;
if(bitcnt<8)
{
kk[0]>>=1;
kk[0] |=x;
}
if(7<bitcnt&&bitcnt<16)
{
kk[1]>>=1;
kk[1] |=x;
}
if(15<bitcnt&&bitcnt<24)
{
kk[2]>>=1;
kk[2] |=x;
}
if(23<bitcnt&&bitcnt<32)
{
kk[3]>>=1;
kk[3] |=x;
}
bitcnt++;
if((kk[0]==((~kk[1])&0XFF))&&(kk[2]==((~kk[3])&0XFF)))//校验,必须有&0xff,否则会有数据溢出,比如开关机的码值是0x00-0xff-0x45-0xba,若无则会变成0x00-0xff-0x2ba-0xba
{
IRKEY[0]=kk[0];
IRKEY[1]=kk[1];
IRKEY[2]=kk[2];
IRKEY[3]=kk[3];
}
}
*/
中断法
//--------------------------------------------------------------------
//下降沿中断
//--------------------------------------------------------------------
ISR(INT0_vect)
{
uchar i,j,dat,temp;
uint n=2;
//Lcd1602ShowString(0,0,"fuck");
cli();
_delay_ms(6);
if(IR_RD())
{
sei();
return;
}//确定无干扰,有干扰跳出
n=2;
while(!IR_RD()) _delay_us(1);//跳过前导9ms低电平
if(n==1)//电平持续时间过长,出错跳出
{
sei();
return;
}
n=2;
while(IR_RD()&&n++) _delay_us(1);//跳过前导4.5ms高电平
if(n==1)//电平持续时间过长,出错跳出
{
sei();
return;
}
for(i=0;i<4;i++)
//搜集4组数据,每组8位
{
dat=0;
for(j=0;j<8;j++)
{
n=2;
while(!IR_RD()&&n++) _delay_us(1);//以为数据开始前的低电平
if(n==1)//电平持续时间过长,出错跳出
{
sei();
return;
}
_delay_us(2000);
temp=0;
if(IR_RD())//若700us后端口仍然是高电平,说明读到的数据是'1'
temp=0x80;
n=2;
//while(IR_RD()&&n++) _delay_loop_1(1);//等待高电平变为低电平
if(n==1)//电平持续时间过长,出错跳出
{
sei();
return;
}
dat>>=1;
dat|=temp;
}//end for j/
key[i]=dat;
}//end for i
sei();
}
中断法和普通IO差不多。就不贴出来了。 |
|