红外遥控 NEC 协议解码:38kHz 载波与脉冲间隔编码怎么收
更新时间:2026-09-24。本文是「集成电路大类 · 芯片设计」入门层(beginner) 数字逻辑基础的一篇正文。遥控器是身边最常见的单向无线链路:按一个键,发射头亮一串肉眼看不见的红外光,电视或空调就换了台。它没有天线协议栈、没有晶振、没有应答,却能在几米距离内把一个字节可靠地送到。秘密全在时间里——数字比特被「藏」进一串光闪烁的长短间隔。这一篇看 NEC 协议怎么编码、接收芯片怎么用纯定时器逻辑把按键码取回来,内容直接复用边沿检测与输入同步、PWM 生成和移位寄存器串并应用里的基础逻辑。
本文要回答的问题
- 红外为什么不直接「亮=1、灭=0」开关光,非要调制在 38kHz 载波上?一体化接收头输出的到底是什么信号?
- NEC 一帧有多长?引导头、32 位数据、终止脉冲和重复码各是什么波形?
- 逻辑 0 和逻辑 1 的低脉冲宽度一模一样、只差后面的间隔,接收端怎么可靠区分?
- 解码状态机如何用定时器输入捕获测边沿间隔、逐位移位收齐 32 位?两组反码拿来做什么?
- 发送端怎样用一路 PWM 把整帧「亮」出去?实际调试时拿什么看波形?
一、物理层:940nm 红外光与 38kHz「频道」
先看这条链路的物理介质。遥控器前端是一颗红外发光二极管,峰值波长约 940nm,属于近红外,肉眼不可见;接收端是一颗黑色环氧树脂封装的一体化接收头(常见型号如 TSOP38238),内部把光电二极管、前置放大、带通滤波、自动增益控制(AGC)和解调电路封在了一起,对外只有三个脚:电源、地、一条数字输出。
问题来了:环境里到处都是红外成分——太阳光、白炽灯、人体热辐射。如果遥控器直接长亮表示 1、熄灭表示 0,接收管输出上信号和背景光混在一起,根本无法分辨。工程上的办法是给信号「调频道」:把要发的电平与一个约 38kHz 的方波做逻辑与,即载波调制(OOK,开关键控)。要发的电平有效时,LED 以 38kHz 快速闪烁;无效时完全不亮。载波周期约 26.3µs,占空比通常只取 1/4~1/3——因为 LED 可以承受远大于连续额定值的脉冲峰值电流(典型 0.5~1A),窄占空比既能让瞬时光很强、拉开接收距离,又把平均功耗和发热压得很低。
接收头内部的带通滤波器只对准 38kHz 附近的闪烁敏感:载波串进来,输出被拉低;没有载波,输出保持高电平。因此它的数据线是低有效、已解调的基带信号,连续背景光因为不含 38kHz 调制分量,被当作共模干扰抑制掉。不同地区和厂商也用 36kHz、40kHz、56kHz 载波,接收头必须与发射频率配对,这也是有时拿 A 遥控器贴着 B 设备完全无效的原因之一。
这张图概括了整条物理链路:基带门控与 38kHz 方波相与后驱动 LED,接收头只对这个频率的闪烁响应,对外输出已经解调好的低有效数字线。后面所有协议讨论都针对这条数字线展开——也就是说,协议层完全不需要碰模拟电路。它和曼彻斯特与 NRZI 线路编码关心的是同一个问题「怎么让接收端在噪声里锁定信号」,只是频率选择这一步在红外链路里由模拟前端完成了。
二、NEC 帧格式:引导头、32 位与终止脉冲
NEC 是日本电气公司制定、如今在电视和机顶盒遥控器上占绝对主流的红外协议。接收头输出线上,按下一个键发出的一帧波形如下表(表中「低」指输出拉低,即有载波):
| 段 | 波形 | 时长 | 作用 |
|---|---|---|---|
| 引导头 | 低 9ms + 高 4.5ms | 合计 13.5ms | 帧起始标志,建立 AGC |
| 地址码 | 8 位 | LSB 先发 | 设备地址 |
| 地址反码 | 8 位 | LSB 先发 | 地址的按位取反 |
| 命令码 | 8 位 | LSB 先发 | 按键编号 |
| 命令反码 | 8 位 | LSB 先发 | 命令的按位取反 |
| 终止脉冲 | 低 560µs | — | 标志一帧结束 |
32 位数据按 低位先传(LSB first) 的顺序排列,这一点写解码软件时最容易出错:移位拼出来的第一个 bit 是 bit0 而不是 bit7。地址加命令的组合可以区分 256 类设备、每设备 256 个按键;实际设备里地址远用不满。由于消费电子设备数量爆炸,后来出现了扩展 NEC:取消地址反码、把 16 位地址全部用作有效位,可寻址空间扩大到 65536。
按住键不放时遥控器不会反复重发整帧,而是每约 110ms 发一个重复码:低 9ms + 高 2.25ms + 低 560µs。接收端收到重复码后重新执行上一次命令(音量连续加减就是靠它),但不产生新的按键事件。
三、脉冲间隔编码:逻辑 0 和 1 只差在间隔
NEC 每一位数据的波形都是「一段固定的 560µs 低脉冲 + 一段长度可变的高间隔」,信息全部编码在间隔长短上,这种方式叫脉冲距离编码(属于 PPM/PDM 思想):
| 比特 | 低脉冲 | 高间隔 | 相邻下降沿间隔 |
|---|---|---|---|
| 逻辑 0 | 560µs | 560µs | 约 1.12ms |
| 逻辑 1 | 560µs | 1.69ms | 约 2.25ms |
因为低脉冲宽度恒定,最稳健的判决办法不是分别测高电平、低电平各自多宽,而是测量相邻两个下降沿之间的时间:约 1.12ms 判 0,约 2.25ms 判 1。门限取两者中间(约 1.7ms),并给足容差窗口,例如 0 判为 0.8ms~1.4ms、1 判为 1.8ms~2.7ms,窗口外的边沿视为干扰丢弃。
对照这张图读波形:引导头之后,每个低脉冲都是 560µs,真正拉开 0 和 1 的是低脉冲之间那段空白的长度——两个下降沿相距 1.12ms 是 0,相距 2.25ms 是 1。图上方还标注了重复码的位置:同样的 9ms 引导头之后,若出现的是 2.25ms 高电平加一个 560µs 低脉冲,而不是 32 个数据位,就表示按键仍按住。
为什么需要容差窗口?因为廉价遥控器里没有晶振,发送时序由一颗 RC 振荡器或陶瓷谐振器给出,频率偏差可达百分之几到十几,温度变化时还会漂移;接收头的检波也有几十微秒延迟。协议设计上故意把 0 和 1 的间隔拉开到三倍差距(560µs 对 1.69ms),就是给这种廉价时基留容错空间。
四、解码状态机:测边沿间隔、移位收 32 位、反码校验
接收线是异步、低速的(一帧最长约 67ms),标准做法有两种:用一个高频采样时钟(如 100kHz~1MHz)轮询采样跑状态机;或者利用定时器的输入捕获单元——每个下降沿自动把自由运行计数器的当前值锁进捕获寄存器并触发中断,在中断服务程序里计算与上次锁存值的差,直接得到边沿间隔,不占用 CPU 连续轮询。
状态机的工作流程如下:
- 空闲与引导头确认:平时停在 IDLE。检测到下降沿后开始计时,若低电平持续约 9ms(如 8ms~10ms 窗口),继续等待上升沿后的高电平:高电平约 4.5ms(3.5ms~5.5ms)则确认是一帧的引导头,进入数据接收;若高电平只有约 2.25ms,则判定为重复码,重发上一键后回到 IDLE;时长都不对则当作噪声丢弃;
- 逐位接收:之后每来一个下降沿,算出与前一个下降沿的间隔,落在 1.12ms 窗口移入 0、落在 2.25ms 窗口移入 1,从 LSB 开始串入并出,凑满 32 位;
- 反码校验:32 位拆成地址、地址反、命令、命令反四段,检查反码段是否分别等于对应段的按位取反。这是用冗余做的简单检错,任何单 bit 翻转都会被抓住,校验一致才把地址和命令上报;
- 超时复位:任意阶段若长时间没有边沿(如超过 20~30ms),说明帧被打断,状态机无条件回 IDLE,避免残帧污染下一帧。
所有时间判决都用「区间比较」而不是精确相等,即硬件或代码里实现 tmin < 间隔 < tmax(数值比较器正是比较与奇偶校验的内容)。输入信号进入逻辑前先做两拍同步与去毛刺,防止亚稳态和窄尖峰误触发。遥控器属于典型的偶发事件设备,空闲时 MCU 可以进入深度睡眠,由下降沿中断唤醒,这在低功耗待机入门里是标准用法;定时器与中断机制本身可参考计数器与定时器和中断与 DMA 入门。
调试方面,接收头输出端直接接逻辑分析仪或示波器即可:大多数逻辑分析仪软件自带 NEC 解码插件,能把引导头、32 位原始值和解析出的地址/命令直接标在波形上,是验证判决窗口和排查「某一个键总是解错」最快的工具。
五、发送端:PWM 载波加时间窗门控
发送是接收的逆过程。用一路 PWM 产生 38kHz、占空比约 25% 的载波,但 PWM 不直接接 LED,而是经过一个发送使能门:引导头的 9ms、每位固定的 560µs 低脉冲期间打开门让载波通过,其余时间关闭。门控信号由一个定时器状态机按帧时序给出,32 位数据通过并入串出逐位取出、决定每位之后的间隔是 560µs 还是 1.69ms。最后经一颗三极管(或 MOSFET)放大电流驱动红外 LED,串联小电阻限制峰值电流。
软件实现上常见的简化写法是关闭 PWM 输出、用一个定时器中断按时间段翻转「载波输出使能」脚,硬件上把该脚与 PWM 脚接一个与门;更省器件的做法直接在中断里启停 PWM 外设。多协议遥控器(空调的超长帧、RC5 的双相编码、风扇的简易协议)只是时间窗和编码规则不同,「一路载波 + 一个时间窗状态机 + 一颗驱动管」的骨架完全一致。
六、NEC 在接口家族里的定位
把 NEC 和其他数字接口摆在一起,它的特征非常鲜明:
| 维度 | NEC 红外 | UART/SPI 等有线串口 | 曼彻斯特编码 |
|---|---|---|---|
| 方向 | 单向广播,无应答 | 可双向 | 通常单向或成对 |
| 介质 | 940nm 光,需视距 | 导线 | 导线/无线均可 |
| 时钟恢复 | 靠绝对时长 + 容差 | 双方约定波特率 | 每 bit 强制跳变,自时钟 |
| 有效速率 | 约几十至几百 bit/s | 数千至数十 Mbit/s | 中等 |
| 校验 | 两组 8 位反码 | 奇偶/CRC/无 | 协议自定 |
| 典型场景 | 按键事件偶发上报 | 板级芯片通信 | RFID、红外 RC5 等 |
NEC 解决的是「偶尔上报一个按键、设备极廉价、不需要回话」的场景,所以它敢用不精确的片上振荡器、敢把速率压得极低。它的脉冲距离思想和曼彻斯特/NRZI同属自时钟线路编码大类,区别在于曼彻斯特每个 bit 都有跳变、接收端靠跳变位置恢复时钟,而 NEC 靠绝对时间长度判决、需要收发双方各有时基。理解了「载波调制—接收解调—测时—移位—校验」这条链路,就同时掌握了所有消费类红外协议和大量廉价无线 OOK(如 315/433MHz 超再生接收)模块的通用模板。
这一篇在知识体系里的位置
本篇属于芯片设计入门层的数字逻辑应用,回答「一条没有时钟的异步脉冲线,怎样用定时器和移位逻辑还原出字节」。向基础读,判决窗口背后是数值比较与奇偶校验,串并转换背后是移位寄存器应用,异步信号入口必须先过边沿检测与同步;向发送侧读,载波生成对应 PWM;向编码体系读,可以对照曼彻斯特与 NRZI 理解不同的自时钟策略;向系统读,中断唤醒与低功耗分别衔接中断与 DMA 和低功耗入门。这一篇是后续 FPGA 输入捕获、多协议红外收发和 OOK 无线接收实验的共同前置。
总结
一句话总结:红外 NEC 协议解码为对抗环境光,先把基带电平与约 38kHz、占空比 1/4~1/3 的方波做门控、驱动 940nm LED 闪烁,一体化接收头靠对准该频率的带通滤波和 AGC 把背景光当共模抑制,输出低有效的解调数字线;NEC 帧以 9ms 低加 4.5ms 高的引导头起始,按 LSB 先发 32 位(地址、地址反、命令、命令反)和一个 560µs 终止脉冲,每位都是固定 560µs 低脉冲加可变高间隔——逻辑 0 间隔 560µs(下降沿间距约 1.12ms)、逻辑 1 间隔 1.69ms(约 2.25ms),故最稳的判据是测相邻下降沿的时间并在带容差的区间内分 0/1;解码时用输入捕获在下降沿锁存计时,状态机先确认引导头(引导头后接 2.25ms 高则是 110ms 一次的重复码)、再逐位移位拼齐 32 位、用两组反码关系检错、超时即复位,输入线先同步去毛刺、空闲可下降沿唤醒低功耗;发送端则用 38kHz PWM 按时间窗门控、经三极管驱动 LED。NEC 是单向、无应答、低速廉价的按键链路,其「载波调制—解调—测时—移位—校验」是所有消费红外与廉价 OOK 无线接收的通用模板。