本帖最后由 dirtwillfly 于 2015-11-30 16:14 编辑
void InterruptTimer2 (void) interrupt 5 //中断解码函数
{
//定时器2计数器重新置0,自动重新计数,原数据已转存到RCAP2H和RCAP2L
TH2=0;
TL2=0;
if(TF2) //判断是否时间溢出中断
{
TF2=0; //清楚中断标志
time_cnt++;
if(time_cnt>1000) time_cnt=100;
if(time_cnt>1) continue_botton=0; //没有连续按键
}
else if (EXF2) //判断是否是输入捕捉中断
{//输入捕捉中断
EXF2=0; //清楚中断标志
temp_time =RCAP2H;
temp_time=temp_time*256+RCAP2L;
if(time_cnt!=0) //判断是否为第一个下降沿
{ //是第一个下降沿
time_cnt=0;
}
else //不是第一个下降沿
{
if(temp_time >924&&temp_time<1325) //接收码“0”的判断
{
temp_time=0x0000;
}
else if (temp_time>1945&&temp_time<2445) //接收码“1”的判断
{
temp_time=0x8000;
}
else if (temp_time>11400&&temp_time<13600) //起始码判断
{ //是起始码
bitcnt=0;
IR_address_temp=0;
IR_data_temp=0;
return;
}
else if(temp_time>9800&&temp_time<11400) //连续按键判断
{
continue_button =1;
time_cnt=0;
return;
}
else
{
time_cnt=0;
return;
}
}
else
{
time_cnt=0;
return;
}
/*数据处理*/
bitcnt++; //接收数据位计数
if(bitcnt<16) //前15位地址位接收
{
IR_address_temp= IR_address_temp|(uint)temp_time;
IR_address_temp=IR_address_temp>>1;
}
else if(bitcnt==16) //末位地址接收
{
IR_address_temp=IR_address_temp| (uint)temp_time;
}
else if(bitcnt<32) //前15位数据位接收
{
IR_data_temp=IR_data_temp|(uint)temp_time;
IR_data_temp=IR_data_temp>>1;
}
else if(bitcnt=32) //末位数据位接收,收到一次完整的指令
{
IR_address_temp=IR_address_temp|(uint)temp_time;
IR_address=IR_address_temp; //保存地址缓存
IR_data=IR_data_temp; //保存数据缓存 |