当前位置:首页 > 技术学院 > 技术前线
[导读]在家电遥控、近距离无线数据传输、体感交互这些嵌入式应用场景中,红外通信凭借成本低廉、实现简单、功耗低的优势,一直是单片机开发者的首选方案。从我们每天用的电视空调遥控器,到 Arduino 创客项目里的红外避障、红外数据传输,都离不开红外发射与接收的配合。很多初学者觉得红外通信只是“调对时序就能用”,但实际上从编码格式到硬件调试,都有不少值得深究的细节。

在家电遥控、近距离无线数据传输、体感交互这些嵌入式应用场景中,红外通信凭借成本低廉、实现简单、功耗低的优势,一直是单片机开发者的首选方案。从我们每天用的电视空调遥控器,到 Arduino 创客项目里的红外避障、红外数据传输,都离不开红外发射与接收的配合。很多初学者觉得红外通信只是“调对时序就能用”,但实际上从编码格式到硬件调试,都有不少值得深究的细节。本文就从硬件原理、编码协议到单片机开发实践,完整梳理红外发射与接收的实现逻辑,帮你理清开发中的要点与坑点。

一、红外通信的基本硬件原理

红外通信是利用波长在 850nm~940nm 之间的红外光作为信息载体,通过改变红外光的辐射强度传递数字信号的无线通信方式,和蓝牙、WiFi 等射频通信相比,它不需要复杂的射频电路,硬件成本不到一块钱就能实现,非常适合近距离单向通信场景。

核心硬件组件

一套完整的单片机红外通信系统,由红外发射二极管、红外接收头(或红外接收二极管)两个核心组件构成:

红外发射二极管:外形和普通 LED 类似,不同的是它发出的是不可见的红外光,一般正向压降在 1.2V~1.5V 之间,工作电流一般在 20mA~100mA 之间,电流越大发射功率越大,传输距离越远。单片机 IO 口直接驱动的话电流不够,一般会串一个 100Ω~220Ω 的限流电阻,再用一个三极管放大电流,才能让发射二极管达到足够的发射功率。

红外接收头:这是集成了接收二极管、放大电路、滤波电路、解调电路的一体化组件,市面上最常用的是 HS0038、VS1838B 这两款 3 脚直插接收头,输出就是解调后的数字信号,直接接单片机 IO 就能用,不需要额外的滤波放大电路,非常适合单片机开发使用。接收头一般都预设了固定的载波频率,最常用的是 38kHz,少数也有 36kHz、40kHz 的,使用的时候要保证发射端的载波频率和接收头匹配,否则接收不到信号。

如果对体积有要求,也可以用分离的红外接收二极管加运放解调,但电路复杂很多,调试难度大,一般项目直接用一体化接收头就足够了,性价比最高。

载波调制的意义

很多初学者会疑惑:为什么不直接用高低电平控制红外发光,还要额外加一个 38kHz 的载波?这里其实有两个关键原因: 第一,抗环境干扰能力更强。环境中的太阳光、室内灯光都含有大量红外成分,这些红外干扰一般是直流或者低频的,我们用 38kHz 载波传递信号,接收头只对 38kHz 的交流信号敏感,就能把直流的环境红外干扰过滤掉,大大降低误码率。 第二,提高发射效率。发射二极管持续发光的话功耗很高,用载波的方式是间歇发光,平均功耗更低,而且相同平均功耗下,峰值功率更高,传输距离更远。

简单来说,红外通信的基本逻辑就是:发射端用要发送的数字信号对 38kHz 载波进行调制,有载波代表一个电平,没有载波代表另一个电平;接收端过滤掉环境干扰,解调出原来的数字信号,单片机再解码就能得到原始数据。

二、主流红外编码协议分析

红外通信只是一个物理层的传输方式,具体数据怎么排列,怎么区分地址和命令,都要遵循统一的编码协议,现在市面上绝大多数消费电子的红外遥控,都用 NEC 协议,少数用 Philips RC-5 协议,我们重点讲最常用的 NEC 协议。

NEC 协议编码规则

NEC 协议的编码规则非常清晰,它的特点是用脉冲间隔来编码 0 和 1,也就是我们常说的 PPM 调制(脉冲位置调制):

引导码:每帧数据的开头都会有一个引导码,用来告诉接收端“我要开始发数据了,准备接收”,NEC 引导码的格式是:9ms 高电平(发射载波)+ 4.5ms 低电平(不发射载波)。

数据编码:引导码之后一共发 4 个字节,32 位数据,顺序是:8 位地址码 + 8 位地址反码 + 8 位命令码 + 8 位命令反码。用反码的目的是校验,接收端可以通过地址码和反码、命令码和反码的异或校验判断数据是否出错,提高可靠性。

0 和 1 的编码:不管是 0 还是 1,开头都有一个 562.5μs 的高电平载波,然后跟着低电平:如果是 0,低电平持续时间是 562.5μs;如果是 1,低电平持续时间是 1687.5μs,刚好是 0 的三倍。所以接收端只需要测量高电平之后低电平的持续时间,就能区分出是 0 还是 1。

结束位:最后发一个 562.5μs 的高电平,代表一帧数据发送完成。

重复码:如果用户一直按住按键不放,发射端不会一直重复发送整帧数据,只会每隔 108ms 发一个重复码,重复码的格式是 9ms 高电平 + 2.25ms 低电平 + 562.5μs 高电平,接收端识别到重复码就知道按键还是按住状态。

标准 NEC 协议一帧完整数据的总时间大概在 67.5ms 左右,传输速率大概在 900bps 左右,足够满足遥控场景的需求,速度不快但抗干扰能力强。

除了标准 NEC,还有很多厂商会做自定义修改,比如有的把 32 位改成 16 位,只发 8 位地址 8 位命令,不发反码,减少传输时间,这种适配一下解码逻辑就能用,核心的脉冲间隔编码规则是一样的。

RC-5 协议简介

Philips 的 RC-5 协议用的是曼彻斯特编码,它和 NEC 不同,用脉冲边沿来编码,每个位都是 1.778ms,0 是先低后高,1 是先高后低,一帧数据一共 14 位,包含起始位、地址位、命令位,它的好处是可以识别按键按下和松开,编码更规范,缺点是解码比 NEC 复杂一点,现在用的不如 NEC 广泛。

三、单片机红外发射的实现方法

我们以最常用的 51 单片机和 STM32 为例,讲一下 NEC 协议红外发射的具体实现,核心逻辑其实所有单片机都通用。

硬件电路连接

红外发射的硬件电路非常简单:单片机的一个 IO 口连接到 NPN 三极管的基极,基极串一个 1kΩ 限流电阻,三极管集电极接红外发射二极管的负极,发射二极管正极串一个 100Ω 电阻接到 5V 电源,三极管发射极接地。当 IO 输出高电平时,三极管导通,红外发射二极管发光,输出低电平时三极管截止,二极管不发光,这样单片机就能控制红外发射的开关了。

如果你的单片机 IO 口电流足够,也可以直接串 220Ω 电阻接发射二极管,不用三极管,不过这样发射功率小,传输距离近,一般十米以内的使用场景没问题,想要更远距离还是加三极管放大。

38kHz 载波的产生

产生 38kHz 载波最常用的方法有两种:定时器中断翻转 IO 和 PWM 输出,显然 PWM 方法更简单,不需要占用 CPU 资源:

PWM 生成载波:大部分单片机都自带 PWM 外设,我们只需要配置 PWM 频率为 38kHz,占空比 50%,需要发射载波的时候就开启 PWM 输出,不需要的时候关闭 PWM 输出就行,硬件自动生成载波,CPU 只需要处理时序就行,非常方便。

定时器中断生成:如果没有 PWM 外设,比如早期的 51 单片机,可以开一个定时器中断,每隔约 13μs(38kHz 的周期就是 1/38000 ≈ 26.3μs,半周期就是 13μs)翻转一次 IO 电平,就能得到 38kHz 载波,缺点是需要频繁进中断,占用 CPU 资源,对于主频不高的单片机来说会影响其他任务。

按照 NEC 协议发送数据

产生载波之后,我们只需要按照 NEC 协议的时序,在对应的时间开启或者关闭载波就能发送数据了,发送一帧数据的流程:

发送引导码:开启载波,延时 9ms,关闭载波,延时 4.5ms。

依次发送 32 位数据,从低位开始发送(NEC 是低位先出),每一位的发送规则:

发送当前位之前,先开载波,延时 562.5μs,关闭载波。

如果当前位是 0,延时 562.5μs;如果是 1,延时 1687.5μs。

发送完所有位之后,再开载波延时 562.5μs,关闭载波,一帧发送完成。

如果需要发送重复码,延时 108ms 之后,发送 9ms 载波 + 2.25ms 低电平 + 562.5μs 载波,就完成了一次重复码发送。

这里要注意延时的精度,NEC 协议对时间误差的容忍度大概在 10% 左右,只要误差不超过 100μs,一般都能正常接收,如果用定时器延时精度会更高,不要用空循环延时,空循环延时会因为编译器优化导致时间不准,很容易接收失败。

四、单片机红外接收的实现方法

红外接收比发射稍微复杂一点,因为需要测量脉冲宽度,解码出 0 和 1,现在常用的方法有两种:外部中断捕获和定时器输入捕获,我们分别来讲。

硬件连接

一体化红外接收头的连接非常简单:VCC 接 3.3V 或者 5V(大部分接收头都支持),GND 接地,OUT 引脚直接接单片机的外部中断 IO 就行,不需要额外元件,接收头内部已经做好了所有解调,输出的就是我们需要的数字电平,空闲的时候 OUT 引脚是高电平,收到载波之后会拉低,正好符合 NEC 协议的电平逻辑。

外部中断解码法

外部中断解码是最常用的方法,不需要单片机有输入捕获外设,几乎所有单片机都支持:

我们开启外部中断,设置为双边沿触发,也就是不管电平从高变低还是低变高,都会触发中断。

中断触发的时候,记录两次相邻边沿之间的时间间隔,根据时间间隔判断是什么脉冲。

具体解码流程:

初始状态等待引导码:当检测到一个长度大于 9ms 的低电平(引导码的 9ms 高电平对应接收端输出 9ms 低电平,因为接收头输出反相),之后再检测到一个 4.5ms 左右的高电平,就认为引导码接收完成,准备开始接收数据。

接收 32 位数据:每接收一位,测量低电平之后高电平的持续时间,如果持续时间在 562μs 左右,就是 0,如果在 1687μs 左右,就是 1,依次把 32 位存起来。

校验数据:把地址码和地址反码异或,命令码和命令反码异或,如果结果都是 0xFF,说明校验通过,数据有效,否则丢弃这帧数据。

重复码处理:如果检测到低电平 9ms,之后高电平 2.25ms 左右,说明是重复码,直接上报按键按住状态就行。

这种方法的优点是实现简单,不需要特殊外设,缺点是所有边沿都触发中断,频繁进中断会占用一定 CPU 资源,不过对于红外遥控这种低速率场景,完全够用,STC51、STM32、GD32 都能轻松处理。

输入捕获解码法

如果单片机有定时器输入捕获外设,可以用输入捕获的方法,这种方法更省 CPU 资源:我们配置定时器输入捕获,自动捕获脉冲宽度,捕获完成之后触发一次中断,CPU 只需要在捕获完成后处理数据就行,不需要每个边沿都进中断。比如 STM32 的定时器输入捕获模式,可以配置为自动测量脉宽,测量完成后触发中断,直接读取测量好的宽度就行,代码更简洁,CPU 占用更低,是比较推荐的方法。

五、开发实践中的常见技巧与坑点

很多初学者做红外收发的时候,经常遇到接收不到、误码率高、距离近的问题,大部分都是下面这些常见问题导致的:

1. 载波频率不匹配

这是最常见的问题,接收头是 38kHz,发射端发成了 40kHz,虽然也能偶尔收到,但灵敏度会大大下降,距离稍微远一点就收不到,所以一定要保证发射端载波频率和接收头频率一致,误差最好控制在 1kHz 以内。用 PWM 生成载波的时候一定要算对分频系数,保证频率准确。

2. 发射功率不够导致距离近

如果传输距离只有一两米,稍微远一点就收不到,大部分是发射电流不够,没有加三极管放大,或者限流电阻太大,把电流限制住了。红外发射二极管正常工作峰值电流可以到 100mA,限流电阻用 100Ω 就足够,不要用太大的电阻,想要更远距离可以加一个更大功率的三极管,或者用两个发射二极管并联,增加发射功率,传输距离可以做到十米以上。

3. 时序误差太大导致解码失败

很多初学者用空循环延时,不同编译器优化等级不一样,延时时间差很多,导致时序不对,解码失败。尽量用定时器延时或者 PWM 硬件定时,保证时序准确,NEC 的时间误差容忍度虽然不低,但误差超过 20% 肯定解不出来。

4. 消抖与抗干扰处理

环境中的红外干扰偶尔会导致误触发,我们可以在解码的时候加一个简单的过滤:如果脉冲宽度不在合理范围内,直接丢弃这帧数据,比如 0 的脉宽是 562μs,如果测出来是 200μs 或者 1000μs,直接认为是干扰,重新开始等待引导码,这样能大大降低误码率。另外,接收头电源前面加一个 100nF 的滤波电容,滤除电源噪声,也能提高接收稳定性。

5. 按键重复发送处理

按照 NEC 协议,按住按键只发一次全帧,之后发重复码,所以单片机做遥控的时候,不要每次重复码都发一次全帧,只需要发重复码就行,否则会导致码率太高,接收端容易乱码,遵循标准协议才能和通用红外接收兼容。

6. 电平反相问题

很多初学者搞不清接收端的电平反相:发射端开载波是高电平,经过接收头解调之后,输出是低电平,所以我们测量到的脉冲宽度和发射端是反的,解码的时候不要搞反高低电平的时间,否则解码肯定出错。

六、红外收发的常见应用场景

红外收发在单片机项目中的应用非常广泛,最常见的有这么几类:

红外遥控:这是最常见的应用,用单片机做万能遥控,学习家电遥控器的码值,然后通过蓝牙或者 WiFi 联网,就能做成手机控制的万能红外遥控器,现在很多智能家居产品都是这么做的。

近距离双向数据传输:两个单片机之间,用红外收发做双向数据传输,不需要接线,传输速率虽然不高,但传几字节的控制数据完全足够,适合低速率的无线控制场景。

红外测距避障:通过发射红外脉冲,测量反射回来的脉冲强度,估算障碍物距离,很多小车避障项目都是用这种方案,成本非常低。

心率检测:在可穿戴项目中,用红外发射二极管照射手指,接收透射的红外光,通过光强变化检测脉搏跳动,这也是红外收发的一个常见应用。

单片机红外发射与接收是一个非常经典的嵌入式入门项目,它的硬件简单,代码量不大,但能练习到定时器、中断、PWM、编码解码这些核心的单片机知识点,非常适合初学者练手。从原理上来说,红外通信的核心就是载波调制和脉冲间隔编码,只要理清编码规则,保证时序和频率准确,就能轻松实现稳定的收发。

现在虽然蓝牙、zigbee 等无线技术越来越普及,但红外通信凭借成本低、实现简单、不占用射频带宽的优势,依然在遥控、近距离传输这些场景中不可替代,掌握红外收发的开发,是每个嵌入式开发者必备的基础技能。只要避开本文说的这些常见坑点,你就能快速实现稳定的红外通信,做出各种各样有意思的单片机项目。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

在工业自动化生产中,步进电机凭借“脉冲-位移”的精准对应特性,成为精密定位、高速运动控制的核心执行元件,广泛应用于3D打印、CNC雕刻、SMT贴片机等设备中。然而,在高速运行场景下,步进电机易出现失步、定位偏差、动态响应...

关键字: 单片机 步进电机 高速纠偏

Microchip基于CLB的PIC®单片机在单一器件中结合了可编程逻辑与嵌入式控制,有助于降低延迟、成本和设计复杂度

关键字: 可编程逻辑 单片机 嵌入式

在电子系统设计中,单片机作为核心控制单元,其选型直接关系到整个系统的性能、成本、可靠性以及后续的可维护性。一款合适的单片机能够让系统设计事半功倍,而错误的选型则可能导致项目成本飙升、性能不达标,甚至面临项目延期的风险。因...

关键字: 单片机 控制单元

在单片机的数字逻辑世界里,高电平和低电平如同二进制的"0"与"1",构成了整个系统的基础。我们习惯了通过这两种状态的切换来实现数据传输、逻辑运算和设备控制,却常常忽略了第三种至关重要的状态——高阻态(High Imped...

关键字: 高阻态 单片机

在现代电子技术领域,单片机应用系统凭借高集成度、强控制能力、低功耗等显著优势,已深度融入工业控制、智能家居、医疗设备、汽车电子等众多领域。系统可靠性作为衡量其性能的核心指标,直接关系到设备运行的稳定性、安全性以及用户体验...

关键字: 单片机 CMOS器件

在单片机开发领域,C语言凭借其高效、易维护和可移植性强的特性,成为了开发者的首选编程语言。而延时程序作为单片机程序中控制时序、协调各模块运行的关键组成部分,其编写的合理性直接影响到整个系统的稳定性与可靠性。然而,看似简单...

关键字: 单片机 C语言

在电子技术飞速发展的当下,单片机作为嵌入式系统的核心部件,广泛应用于工业控制、智能家居、汽车电子等众多领域。对于开发者而言,掌握单片机开发的基本技巧,不仅能提升开发效率,还能优化产品性能、降低成本。

关键字: 单片机 C语言

在电子技术飞速发展的当下,单片机作为嵌入式系统的核心部件,广泛应用于工业控制、智能家居、汽车电子等众多领域。对于开发者而言,掌握单片机开发的基本技巧,不仅能提升开发效率,还能优化产品性能、降低成本。

关键字: 单片机 C语言

在物联网、工业控制、智能家居等领域,单片机作为核心控制单元,承载着设备的关键程序与数据。这些程序凝聚了开发者大量的研发成本与技术心血,一旦被非法窃取,不仅会导致产品被快速仿冒,造成直接的经济损失,还可能引发技术泄露、市场...

关键字: 单片机 物联网

在数字化浪潮席卷全球的当下,物联网、嵌入式系统与单片机这三个技术名词频繁出现在科技报道、产业论坛以及校园课堂中。它们看似独立,实则紧密相连,共同构成了推动智能时代发展的核心技术链条。从智能家居里自动调节温度的空调,到工业...

关键字: 单片机 CPU
关闭