2287 字
11 分钟
NEC 红外协议笔记

NEC Protocol - 日电#

  • NEC 红外协议是一种广泛应用于家用电器遥控器的红外通信协议。
  • 红外对射无法穿过障碍物:红外通信是视距 (Line of Sight) 通信,会被大部分非透明障碍物阻挡。
  • 目前广泛使用的是:NEC Protocol的PWM(脉冲宽度调制)和Philips RC-5 Protocol的PPM(脉冲位置调制)。
    • PWM:红外载波的占空比表示‘0’和‘1’。发射时间固定,通过改变不发射载波的时间改变占空比。
    • PPM:发射载波的位置表示‘0’和‘1’。发射载波到不发射载波位‘0’,反之位‘1’。发射载波和不发射载波的时间相同,均为0.889ms,每位时间固定。

一、核心编码规则#

逻辑值红外波形(发射端)总时长说明
0560 µs 高(载波) + 560 µs 低≈ 1.125 ms短间隔
1560 µs 高(载波) + 1690 µs 低≈ 2.25 ms长间隔
NOTE
  • “高电平” = 发射 38kHz 载波(burst)
  • “低电平” = 停止载波(静默)
  • 所有数据位均以 560 µs 高电平 开始,通过后续低电平长度区分 0/1

二、完整帧结构(32位数据)#

红外 NEC 协议编码说明

字段(中文)FIELD (English)位数示例(十六进制)说明
同步码头Leader Pulse / Sync Header9ms + 4.5ms帧起始标志
地址码Address Code8位0x12设备地址
地址反码Address Inverse8位0xED (= ~0x12)地址校验
控制码Command Code8位0x45按键命令
控制反码Command Inverse8位0xBA (= ~0x45)命令校验
NOTE

总数据位:8 + 8 + 8 + 8 = 32位
校验规则:Address ^ AddressInverse == 0xFFCommand ^ CommandInverse == 0xFF

示例题①#

示例题1

字段名称NEC 值 (LSB First)十六进制值
Address Code0000 00000x00
Address Inverse1111 11110xFF
Command Code0100 01010x45
Command Inverse1011 10100xBA

过程:
start: 9ms + 4.5ms
Address Code: 00000000 → 00000000 (00)
Address Inverse1: 11111111 → 11111111 (FF)
Command Code (原始波形 MSB First → NEC 值 LSB First): 10100010 (A2) → 01000101 (45)
Command Inverse (原始波形 MSB First → NEC 值 LSB First): 01011101 (5D) → 10111010 (BA)

示例题②#

示例题2

字段名称NEC 值 (LSB First)十六进制值
Address Code0000 00000x00
Address Inverse1111 11110xFF
Command Code0011 00000x30
Command Inverse1100 11110xCF

过程:
start: 9ms + 4.5ms
Address Code: 00000000 → 00000000 (00)
Address Inverse1: 11111111 → 11111111 (FF)
Command Code (原始波形 MSB First → NEC 值 LSB First): 00110000 (30) → 00001100 (0C)
Command Inverse (原始波形 MSB First → NEC 值 LSB First): 1100 1111 (CF) → 11110011 (F3)


三、位序规则:LSB First(低位在前)#

所有字节(地址码、控制码等)均按 LSB First 发码:

发送顺序(时间先后)对应位编号在字节中的位置权重(2ⁿ)
第1位(最先发送)bit0最低位(LSB)(2^0 = 1)
第2位bit1(2^1 = 2)
第3位bit2(2^2 = 4)
第4位bit3(2^3 = 8)
第5位bit4(2^4 = 16)
第6位bit5(2^5 = 32)
第7位bit6(2^6 = 64)
第8位(最后发送)bit7最高位(MSB)(2^7 = 128)

所有字节(地址码、控制码等)均按 LSB First 解码:

接收顺序(时间先后)对应位编号在字节中的位置权重(2ⁿ)
第1位(最先收到)bit0最低位(LSB)(2^0 = 1)
第2位bit1(2^1 = 2)
第3位bit2(2^2 = 4)
第4位bit3(2^3 = 8)
第5位bit4(2^4 = 16)
第6位bit5(2^5 = 32)
第7位bit6(2^6 = 64)
第8位(最后收到)bit7最高位(MSB)(2^7 = 128)
TIP

示例:发送序列 01000101 → 8位字节转换成16进制数 0x45 示例:接收序列 10100010 → 组合为 bit7~bit0 = 01000101 = 0x45

红外接收程序流程图


四、NEC Protocol的 PWM (脉冲宽度调制)和 Philips RC-5 Protocol 的 PPM (脉冲位置调制)#

项目NEC 协议(PWM 标准)Philips RC-5 协议(PPM 标准)
编码类型脉冲宽度调制(PWM)
(通过改变无载波时间改变占空比)
脉冲位置调制(PPM)
(通过高低电平相位位置区分 0/1)
载波频率38 kHz(典型)36 kHz(典型)
逻辑“0”表示560 µs 载波 + 560 µs 无载波889 µs 低电平 + 889 µs 高电平
逻辑“1”表示560 µs 载波 + 1690 µs 无载波889 µs 高电平 + 889 µs 低电平
位时长不固定(=1.12 ms 或 2.25 ms)固定(≈1.778 ms)
帧结构引导码 + 地址码(16位)+ 命令码(16位)起始位(S)+ 场位(F)+ 控制位(C)+ 系统码(5位)+ 命令码(6位)
位发送顺序LSB First(先发低位)MSB First(先发高位)
重复按键机制全码后发送简码(9ms + 2.25ms + 结束位),周期约 108ms控制位(C)翻转,其余不变,无简码
校验方式命令码与其反码配对校验无显式反码,靠双相位和控制位防误触发
典型芯片WD6122、uPD6121SAA3010
应用场景电视、空调、机顶盒等家电Philips 音响、老式电视等

五、编程实现#

1. 数据类型与存储策略#

虽然协议由 4 个 8 位字段组成,但在编程中通常将其“拼装”为 32 位整数进行处理:

  • 基本单元uint8_t 存储地址码、命令码及其反码。
  • 最佳实践
    • 发送时:将 4 个 uint8_t 拼装成 1 个 uint32_t,再统一进行位发送循环。
    • 接收时:先接收 32 个位存入 uint32_t,接收完毕后再拆解为 4 个 uint8_t 校验和处理。
// 接收端拆解示例 (假设 rx_data 为接收到的 uint32_t 完整帧)
uint8_t address = (uint8_t)(rx_data & 0xFF);
uint8_t command = (uint8_t)((rx_data >> 16) & 0xFF);

2. 校验机制#

NEC 协议通过“原码 + 反码”进行错误检测。接收端的标准校验逻辑如下:

  • 校验公式(原始值 ^ 反码值) == 0xFF
  • 只有当地址码与命令码都通过校验时,才视为有效的帧。
// 校验逻辑示例
if ( (address ^ address_inv == 0xFF) && (command ^ command_inv == 0xFF) ) {
// 通过校验,执行命令
}

3. 接收端的逻辑反相#

接收端输出电平与发射端的载波逻辑是相反 (Active Low) 的:

状态发射端动作接收头输出引脚软件解码逻辑
有载波发射 38kHz 脉冲低电平 (LOW)对应协议中的“高”时长
无载波静默高电平 (HIGH)对应协议中的“低”时长

编程关键:软件解码时,需测量的是引脚低电平的持续时间(判断是否为 560µs 载波)和随后的引脚高电平持续时间(据此判断是逻辑 0 还是 1)。

4. 时序测量方式#

由于 NEC 协议对微秒级时序敏感,推荐使用硬件资源进行测量:

  • 定时器输入捕获 (Input Capture)。由硬件自动记录引脚跳变时刻,精度最高,CPU 占用最少。
  • 外部中断 (GPIO Interrupt)。在引脚跳变时触发中断记录时间,精度较好。
  • 轮询 (Polling)。容易受其他程序干扰导致时序测量误差,造成解码失败。

5. 状态机实现#

NEC 协议的接收端通常采用状态机结构,按顺序处理引导码、地址码、命令码、命令反码共 4 个字段。每个字段的接收过程中,根据引脚电平变化(高/低)切换状态,记录静默时间(载波时间固定为 560 µs)。


六、关键注意事项 (源自网络,注意甄别)#

  • 载波参数

    • 标准频率:38 kHz(由 455 kHz 晶振 ÷12 得到)
    • 推荐占空比:1<3>(高电平占 1/4 周期),但 1<1> 或 1<2> 在多数接收头下也能工作。
  • 帧结构完整性

    • 必须包含结束位:全码和简码末尾均需发送 0.56 ms 载波,否则部分设备无法识别。
    • 16 位地址码顺序:先发低字节,再发高字节,每个字节内部仍为 LSB First。
  • 重复码(简码)机制

    • 按键长按时,首帧发全码,后续每 108 ms 发送一次简码:
      9 ms 载波 + 2.25 ms 无载波 + 0.56 ms 载波(结束位)
    • 若省略简码,某些设备(如空调)将无法响应长按操作。
  • 发送间隔与时序

    • 两次全码之间建议间隔 ≥110 ms,避免接收端因繁忙而丢帧。
    • 连续快速发送多帧容易导致第二帧失效,应该要加入合适的延时。
    • Sony、机顶盒等二次译码 MCU 在 65 ms 内就准备接收下一帧;做万能遥控可把“全码间隔”做成 60–130 ms 可配置,否则会出现“第二键无响应”。
  • 接收端信号反相

    • 一体化红外接收头输出波形与发射端逻辑相反(载波时输出低电平),解码前需注意是否需软件取反。
    • 注意输出类型(开漏 / 推挽)
  • 厂商变种的兼容性

    • 部分品牌(如美的、新科)可能会用 NEC 的变种协议:帧长可能达 120 ms 甚至 500 ms。
    • 通用遥控器建议支持自学习模式或动态解析引导码/位宽。
  • 硬件设计建议

    • 红外发射管驱动电流建议 ≥100 mA,推荐使用恒流电路(如射极跟随器)以维持发射强度稳定。
    • 接收头电源引脚需加 ≥22 µF 滤波电容,必要时串接 330 Ω 电阻抑制电源干扰。

参考:

NEC协议
红外遥控编码与解码
STM32F103正点原子学习笔记系列——REMOTE
SB-Projects NEC Protocol
NEC Protocol Decoding with STM32
NEC 协议红外遥控器

NEC 红外协议笔记
https://blog.chuwu.top/posts/2025-10-28/nec/
作者
ChuwuYo
发布于
2025-10-28
许可协议
CC BY-NC-SA 4.0