51的红外解码移植到ATMEGA32上有改延时可是不能用,
纠结好几天了,不知道出什么问题 !!!!!!!
SIGNAL(SIG_INTERRUPT1) //外部中断1,红外遥控
{
//PD3置位输入,下降沿触发
unsigned char j,k,N=0;
// PORTC = 0xfe; //若有进入中断则亮第一个灯,若收到数据正确,亮0x55,若收到错误,亮0xfd
GICR &=~(1<<INT1); //先关中断
IRdelay(60);
if (IRIN )
{
GICR|=(1<<INT1);//使能外部中断1
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{IRdelay(1);}
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{IRdelay(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (!IRIN) //等 IR 变为高电平
{IRdelay(1);}
while (IRIN) //计算IR高电平时长
{
IRdelay(1);//
N++;
if (N>30)//30
{
GICR|=(1<<INT1);//使能外部中断1
return;
} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3])//2,3是数据码与反码 有用的
{
// PORTC = 0xfd; //错误数据
GICR|=(1<<INT1);//使能外部中断1
return;
}
else //收到数据对
{
IROK=1;PORTC = 0x55;
}
if(IRCOM[2]==0X45 || IRCOM[2]==0X46)
{
PORTC = 0xF0;
}
if(IRCOM[3]==0X45 || IRCOM[3]==0X46)
{
PORTC = 0x0f;
}
GICR|=(1<<INT1);
} |