单片机红外发射的完整实现逻辑
在嵌入式短距离无线控制场景中,红外通信是应用最广泛的经典技术之一,从家家户户的电视遥控器、空调遥控器,到工业设备的红外调试接口、嵌入式设备的近场无线数据传输,红外通信凭借成本极低、实现简单、无无线电干扰的特性,已经在消费电子和工业控制领域稳定应用了几十年。很多新手开发者刚接触红外通信时,对着网上零散的示例代码东拼西凑,勉强实现出能控制家电的demo,但换一款不同编码格式的遥控器就完全无法识别,遇到环境强光干扰就频繁丢包,根本无法在实际项目中稳定运行。
实际上单片机的红外收发逻辑,并不是简单的光电信号转换,背后是一套完整的载波调制、编解码、时序校验体系,只要理清底层的运行机制,避开常见的时序坑点,就能写出兼容主流编码格式、抗干扰能力强的稳定红外驱动。今天我们就从硬件原理、发射实现、接收解码、工程优化几个维度,全面拆解单片机红外收发的完整实现逻辑,帮你彻底掌握这项实用的嵌入式技术。
红外通信的硬件基础原理
单片机红外收发系统的硬件结构非常精简,整个链路的核心组件只有三部分,所有的信号转换都在这三部分之间完成。
发射端的核心是红外发射二极管,它是一种特殊的发光器件,通电之后发出的是波长940nm左右的不可见红外光,人眼完全无法感知,普通手机摄像头可以拍到微弱的光斑。为了避免环境中的自然光、灯光等红外干扰信号的影响,发射端不会直接用原始的二进制信号驱动红外管发光,而是把原始信号调制到38kHz的载波上,用这个高频的间断脉冲去驱动红外发射管。简单来说就是,需要发送逻辑1的时候,让红外管以38kHz的频率快速亮灭,需要发送逻辑0的时候,直接让红外管保持熄灭状态。这种调制方式可以把有效信号的特征频率和环境干扰的频率区分开,让接收端很容易把有效信号从背景干扰中过滤出来。
接收端的核心是一体化红外接收头,这是一款集成了光电二极管、信号放大器、带通滤波器、解调器的集成器件,最常用的型号是HS0038。它的内部带通滤波器只允许38kHz左右的信号通过,环境中其他频率的红外干扰信号会被直接滤除。当接收到38kHz的调制红外信号时,接收头的输出引脚会直接输出低电平,没有检测到有效调制信号时,输出引脚保持高电平,直接把解调之后的原始二进制信号输出给单片机,完全不需要开发者自己设计复杂的模拟信号处理电路。
整个红外通信的传输距离通常在10米以内,属于典型的短距离点对点通信,红外光无法穿透不透明的障碍物,收发两端之间不能有遮挡,而且红外信号的发射有一定的角度范围,接收端必须在发射端的指向范围内才能正常通信,这些特性也让红外通信天然具备了防偷听、防跨设备干扰的优势,非常适合家电控制这类场景。
单片机红外发射的完整实现逻辑
红外发射的核心逻辑,就是按照指定的编码格式,生成对应占空比的38kHz调制脉冲序列,驱动红外发射二极管发出符合协议规范的红外光信号。在单片机上实现红外发射,完全不需要额外的专用编码芯片,只需要用定时器外设配合普通GPIO,就能用软件逻辑生成所有主流编码格式的红外信号。
最基础的实现方案是利用单片机的定时器PWM外设,自动生成38kHz的载波信号。首先配置定时器的时钟源,设置合适的预分频系数,让定时器的计数频率精准对应38kHz的周期,把定时器的PWM通道输出占空比配置为三分之一,也就是每一个周期里,红外发射管三分之一的时间点亮,三分之二的时间熄灭,这个占空比是行业通用的标准配置,既不会让红外发射管功耗过高,也能保证足够的发射距离。之后把PWM输出的GPIO引脚,通过一个NPN三极管连接到红外发射二极管的阴极,当PWM输出载波信号时,三极管快速通断,驱动红外发射管发出调制红外光。
接下来我们只需要按照目标编码格式的时序要求,控制PWM输出的开关,就能生成完整的红外信号。以最常用的NEC编码格式为例,发送一帧完整的红外信号时,首先关闭PWM输出,让红外管保持熄灭状态,之后先打开PWM输出持续9毫秒,发送引导码的高电平部分,再关闭PWM输出持续4.5毫秒,发送引导码的低电平部分。之后依次发送32位数据,每发送一个逻辑1,就打开PWM输出560微秒,再关闭PWM输出1680微秒;每发送一个逻辑0,就打开PWM输出560微秒,再关闭PWM输出560微秒。所有数据位发送完成之后,再发送一个560微秒的脉冲作为帧结束标记,一帧完整的NEC红外信号就发送完成了。如果用户长按遥控器按键,每隔110毫秒左右,重复发送一个只有引导码和结束脉冲的重复码,接收端就能识别出按键处于长按状态。
如果你的单片机没有多余的PWM外设,也可以完全用软件模拟的方式生成38kHz载波,用普通定时器中断,每隔13微秒翻转一次红外发射管的GPIO电平,就能生成等效的38kHz方波,完全不需要依赖硬件PWM外设,在资源极小的8位单片机上也能实现红外发射功能。
单片机红外接收与解码的实现方法
红外接收的核心目标,就是精准测量一体化红外接收头输出的高低电平持续时间,把连续的脉冲序列还原成对应的二进制数据,最终解析出完整的控制指令。在单片机上实现稳定的红外解码,最常用的方案是外部边沿中断配合定时器计时,几乎所有主流的8位、32位单片机都能实现这套方案。
首先把一体化红外接收头的输出引脚连接到单片机的外部中断引脚上,配置外部中断为双边沿触发模式,不管引脚电平从高变低还是从低变高,都会立刻触发中断。同时配置一个1微秒或者10微秒计时精度的定时器,用来记录两次中断之间的时间间隔。当红外接收头输出的信号发生电平跳变时,单片机会立刻进入外部中断服务函数,在中断里读取当前定时器的计数值,计算出上一个电平的持续时间,把这个时间值存入预先定义好的脉冲序列缓存数组中,同时重置定时器的计数值,为下一次计时做准备。
当检测到引导码对应的9毫秒低电平和4.5毫秒高电平的组合时,就代表一帧新的红外数据开始传输了。接下来依次读取后续每一个电平的持续时间,按照NEC编码的规则判断是逻辑0还是逻辑1,把所有数据位解析出来之后,把前四个字节相加得到校验和,和最后一个校验字节做对比,如果二者完全相等,就代表本次解码得到的地址码和命令码是有效的,直接通知主循环处理对应的控制指令。
这里有一个非常关键的细节,红外接收头输出的电平和发射端的原始电平是完全反向的,发射端输出高电平时,接收头输出低电平,发射端输出低电平时,接收头输出高电平,解码的时候必须注意这个电平极性的反转,不能直接按照发射端的时序逻辑去判断,否则会解析出完全错误的数据。
实际项目落地的稳定性优化技巧
很多新手写出来的红外收发驱动,近距离能正常通信,稍微远一点或者遇到强光干扰就频繁丢包,这些问题都有明确的优化方法。
首先是硬件层面的优化,红外发射管的串联限流电阻要调整到合适的阻值,保证发射电流在20毫安左右,既不会烧坏红外管,也能保证足够的发射距离。一体化红外接收头的外壳要贴一个黑色的红外滤光片,过滤掉可见光的干扰,避免环境强光直接照射接收头,导致内部光电电路饱和,无法正常识别信号。接收头的电源引脚旁边要紧贴引脚焊接一个104的滤波电容,滤除电源线上的高频干扰,避免电源纹波影响接收头的解调性能。
其次是软件层面的鲁棒性优化,判断电平持续时间的时候,不能用完全相等的严格判断,要设置合理的时间容差窗口,比如判断560微秒的脉冲,允许正负200微秒的误差,这样哪怕时序因为中断抢占出现微小偏差,也不会导致解码失败。同时在解码过程中,临时关闭其他低优先级的中断,避免其他中断长时间抢占CPU,导致定时器计时出错,错过正确的电平采样点。如果连续多次解码校验失败,直接清空脉冲缓存数组,等待下一帧新的信号到来,避免错误的脉冲序列一直堆积,导致后续正常信号也无法识别。
看似简单的红外收发,背后覆盖了定时器外设使用、中断处理、协议时序解析等多个嵌入式开发的核心技能,把这套逻辑彻底吃透,你就能快速兼容NEC、RC5、SIRC等所有主流的红外编码格式,写出稳定可靠的红外驱动,轻松实现自定义红外遥控器、红外信号学习器这类实用项目。





