中级会员
 
- 积分
- 218
- 金钱
- 218
- 注册时间
- 2015-1-19
- 在线时间
- 28 小时
|
因为楼主工作的单位是遥控器公司,所以红外接触的比较多,最近帮天猫遥控器测试,开发了一个NEC解码算法,程序很高效,代码量也很少,大家可以借鉴一下!
前提:我现在做的工装是反复上掉电测试遥控器死机的次数,我用systick定时器以10us为单位利用时钟摘取法来实时获得电平长度,并存放到数组中。
现在普遍采用的解码算法是比对每个电平的长度是否在某个范围内,来判断是逻辑1还是0,而我采用的算法是吧两个相邻采集的电平长度相加,因为NEC遥控器的逻辑1是560us+1.69ms,逻辑0是560us+560us,因此如果相邻电平的时间和超过2ms就是1,小于2ms就是0。
我声明了存储NEC码的结构,如下:
[mw_shl_code=c,true]typedef struct
{
u8 CustomCode_H; //用户码高字节
u8 CustomCode_L; //用户码低字节
u8 Data_H; //键值高字节
u8 Data_L; //键值低字节
u8 Wrong; //前导码错误标志
}NEC_DataType;[/mw_shl_code]
解码程序如下:
[mw_shl_code=c,true]/**
* NEC解码函数
* pPulse:调用函数前事先采集的电平长度的数组, pnec: NEC数据格式数据结构指针
* 调用nec的结构后要给wrong清零
* 返回1 接收错误 0正常
*/
u8 NEC_Decode(u16 *pPulse,NEC_DataType * pnec)
{
u8 i = 0; //读取字节索引
u8 j = 0; //读取每字节的位索引
u8 index = offset+2; //数组索引
u8 * pnec_cache = (u8 *)pnec;
if(*(pPulse+offset)>5000) // 大于50ms就认为数据头不对
pnec->Wrong = 1; //错位标志置位
if(!pnec->Wrong) //数据没错就进入此代码段
{
for(i=0;i<4;++i) //每字节循环
{
for(j=0;j<8;++j) //每字节接收的8bits循环
{
if(*(pPulse+index)+*(pPulse+index+1)>200) //相邻数组相加
*(pnec_cache+i) |= 0x80>>(7-j);
else
*(pnec_cache+i) &= ~(0x80>>(7-j));
index += 2;
}
}
return 0;
}else
{
pnec->Wrong = 0;
return 1;
}
}[/mw_shl_code]
|
|