NEC Protocol - 日电
- NEC 红外协议是一种广泛应用于家用电器遥控器的红外通信协议。
- 红外对射无法穿过障碍物:红外通信是视距 (Line of Sight) 通信,会被大部分非透明障碍物阻挡。
- 目前广泛使用的是:NEC Protocol的PWM(脉冲宽度调制)和Philips RC-5 Protocol的PPM(脉冲位置调制)。
- PWM:红外载波的占空比表示‘0’和‘1’。发射时间固定,通过改变不发射载波的时间改变占空比。
- PPM:发射载波的位置表示‘0’和‘1’。发射载波到不发射载波位‘0’,反之位‘1’。发射载波和不发射载波的时间相同,均为0.889ms,每位时间固定。
一、核心编码规则
| 逻辑值 | 红外波形(发射端) | 总时长 | 说明 |
|---|---|---|---|
0 | 560 µs 高(载波) + 560 µs 低 | ≈ 1.125 ms | 短间隔 |
1 | 560 µs 高(载波) + 1690 µs 低 | ≈ 2.25 ms | 长间隔 |
NOTE
- “高电平” = 发射 38kHz 载波(burst)
- “低电平” = 停止载波(静默)
- 所有数据位均以 560 µs 高电平 开始,通过后续低电平长度区分 0/1
二、完整帧结构(32位数据)

| 字段(中文) | FIELD (English) | 位数 | 示例(十六进制) | 说明 |
|---|---|---|---|---|
| 同步码头 | Leader Pulse / Sync Header | — | 9ms + 4.5ms | 帧起始标志 |
| 地址码 | Address Code | 8位 | 0x12 | 设备地址 |
| 地址反码 | Address Inverse | 8位 | 0xED (= ~0x12) | 地址校验 |
| 控制码 | Command Code | 8位 | 0x45 | 按键命令 |
| 控制反码 | Command Inverse | 8位 | 0xBA (= ~0x45) | 命令校验 |
NOTE总数据位:8 + 8 + 8 + 8 = 32位
校验规则:Address ^ AddressInverse == 0xFF,Command ^ CommandInverse == 0xFF
示例题①

| 字段名称 | NEC 值 (LSB First) | 十六进制值 |
|---|---|---|
| Address Code | 0000 0000 | 0x00 |
| Address Inverse | 1111 1111 | 0xFF |
| Command Code | 0100 0101 | 0x45 |
| Command Inverse | 1011 1010 | 0xBA |
过程:
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)
示例题②

| 字段名称 | NEC 值 (LSB First) | 十六进制值 |
|---|---|---|
| Address Code | 0000 0000 | 0x00 |
| Address Inverse | 1111 1111 | 0xFF |
| Command Code | 0011 0000 | 0x30 |
| Command Inverse | 1100 1111 | 0xCF |
过程:
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、uPD6121 | SAA3010 |
| 应用场景 | 电视、空调、机顶盒等家电 | Philips 音响、老式电视等 |
五、编程实现
1. 数据类型与存储策略
虽然协议由 4 个 8 位字段组成,但在编程中通常将其“拼装”为 32 位整数进行处理:
- 基本单元:
uint8_t存储地址码、命令码及其反码。 - 最佳实践:
- 发送时:将 4 个
uint8_t拼装成 1 个uint32_t,再统一进行位发送循环。 - 接收时:先接收 32 个位存入
uint32_t,接收完毕后再拆解为 4 个uint8_t校验和处理。
- 发送时:将 4 个
// 接收端拆解示例 (假设 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>3>(高电平占 1/4 周期),但 1<1>1> 或 1<2>2> 在多数接收头下也能工作。
-
帧结构完整性
- 必须包含结束位:全码和简码末尾均需发送 0.56 ms 载波,否则部分设备无法识别。
- 16 位地址码顺序:先发低字节,再发高字节,每个字节内部仍为 LSB First。
-
重复码(简码)机制
- 按键长按时,首帧发全码,后续每 108 ms 发送一次简码:
9 ms 载波 + 2.25 ms 无载波 + 0.56 ms 载波(结束位) - 若省略简码,某些设备(如空调)将无法响应长按操作。
- 按键长按时,首帧发全码,后续每 108 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 协议红外遥控器