|
|
上面的代码有问题,下面这个可以正常解码;
#include "MAIN_ALL.H"
bit Ir_OK_Flag = 0; //红外接收完成标志
u8 Ir_Code[6]; //红外接收缓冲区
u8 xdata Ir_Byte_Count; //接收的次数(字节数),32字节+引导码共33
u8 xdata Ir_Byte_Timer; //100us计数时间
u8 xdata Ir_Byte_TimeBuffer[33];// [0]=引导码间隔, [1..32]=数据位间隔
/*----------------P35口中断初始化------------------*/
void Port35_Init()
{
P3IM0 &= ~0x20; //P3.5口下降沿中断
P3IM1 &= ~0x20;
P3INTE |= 0x20; //使能P3.5口中断
PINIPL &= ~0x08; //中断低优先级
PINIPH &= ~0x08;
}
/*----------------红外解码函数------------------*/
void Ir_Decode()
{
u8 i,j,Value=0;
u8 k = 1;
if(Ir_OK_Flag) //接收完成,将接收完成标志清零
{
Ir_OK_Flag=0;
TR1 = 0;
for(i=0;i<4;i++) //循环判断4个字节
{
Value=0;
for(j=0;j<8;j++) //循环判断每个字节中的8位
{
Value >>= 1;
if(Ir_Byte_TimeBuffer[k] > 17)
{
Value = Value|0x80;
}
else
{
Value = Value&0x7F;
}
k++;
}
if(i==3)
{
if(Value != Ir_Code[3]) //长按判断,如果新解码的值与上次的值不相等让数组的第4位清零
{
Ir_Code[4] = 0;
Ir_Code[5] = 0;
}
if(Value == Ir_Code[3]) //连按判断,如果新解码的值与上次的值相等让数组的第5位加1
{
Ir_Code[5] ++;
Ir_Code[4] = 0;
}
}
Ir_Code[i] = Value;
}
}
}
//-------------P35口下降沿中断服务函数-----------------
//========================================================================
// 函数: P35口下降沿中断服务函数
// 描述: 利用P35口下降沿中断判断Ir_Byte_Timer的计时时间,大于110(以100us计时即11ms)则认为是引导码
// (9ms载波+4.5ms高电平),将引导码存入数组的第0号字节,以次存入33个字节,
//
// 参数:
// 返回:
// 备注:
//========================================================================
void P3INT_Isr() interrupt 13
{
static bit Ir_Flag=0;
u8 intf;
intf = P3INTF; // P3INTF,P35口中断的溢出标志位
if(intf)
{
P3INTF = 0x00;
if((intf & 0x20))
{
TR1 = 1;
if(Ir_Byte_Timer >= 110) //计时大于110认为是引导码
{
Ir_Flag=1; //引导码完成标志置1
Ir_Byte_Count=0; //将bit计数值清零,确保把引导码存入第0位
Ir_Code[4] ++; //长按判断
}
if(Ir_Flag)
{
Ir_Byte_TimeBuffer[Ir_Byte_Count] = Ir_Byte_Timer ; //依次存入33位bit数据
Ir_Byte_Timer = 0;
Ir_Byte_Count ++;
if(Ir_Byte_Count >= 33)
{
Ir_Byte_Count=0;
Ir_Byte_Timer = 0;
Ir_OK_Flag = 1;
Ir_Flag=0;
}
}
}
}
}
/*---------------- 定时器1中断服务函数-----------------*/
void Timer1_Isr(void) interrupt 3
{
Ir_Byte_Timer ++ ;
} |
|