- 8 位地址码, 8 位命令码
- 完整发射两次地址码和命令码,以提高可靠性
- 脉冲时间长短调制方式
- 38KHz 载波频率
- 位时间 1.12ms 或 2.25ms
下图为一个引导码的调制波形:
下图为逻辑0和逻辑1的调制波形:
下图为重复码的调制波形:
协议解码程序片段:
typedef struct ir_symbol_s
{
unsigned short mark_period;
unsigned short symbol_period;
} ir_symbol_t;
typedef struct ir_key_s
{
unsigned int value;
int state;
}ir_key_t;
int NEC_Decode(ir_symbol_t symbol_buf[], int symbol_num, ir_key_t *ir_key)
{
unsigned int key_value;
if(symbol_num == 33) //解析键值,设定300us的容错范围
{
key_value = 0;
//引导码判断
if ( (symbol_buf[0].symbol_period > (13500 - 300)) && (symbol_buf[0].symbol_period < (13500 + 300))
&& (symbol_buf[0].mark_period > (9000 - 300)) && (symbol_buf[0].mark_period < (9000 + 300)) )
{
for(i = 0; i < (symbol_num-1); i ++)
{
//无效的符号位
if( (symbol_buf[i].symbol_period < (1120-300)) || (symbol_buf[i].symbol_period > (2250+300)) )
{
printf("symbol %d, is invalid\n", i);
return -1;
}
else
{
key_value <<= 1;
//逻辑1判断
if( (symbol_buf[i].symbol_period > (2250-300)) && (symbol_buf[i].symbol_period <= (2250+300)) )
{
key_value |= 1;
}
}
}
ir_key->value = key_value;
ir_key->state = KEY_STATE_PRESS;
}
}
else if(symbol_num == 2) //NEC协议的重复键
{
ir_key->value = 0;
ir_key->state = KEY_STATE_REPEAT;
}
else
{
ir_key->value = 0;
ir_key->state = KEY_STATE_NONE;
}
return 0;
}
1022




被折叠的 条评论
为什么被折叠?



