在工业控制、智能家居、消费电子等领域,红外遥控及数据收发仍然有一定的优势。
它成本低、功耗小、抗电磁干扰强,无论是遥控工业设备,还是给老旧设备加装无线控制功能,红外遥控的收发技术都很有实用价值。
今天,就以PIC16F1947单片机为核心,配合HS0038A2红外接收头,聊聊红外遥控的几种控制方式。
一、HS0038A2:把“光信号”变成“电信号”
HS0038A2是一款一体化红外接收头,内部集成了光电二极管、前置放大器、自动增益控制(AGC)、带通滤波器和解调电路。它的核心工作频率是38kHz——这是绝大多数红外遥控使用的载波频率。
红外发射管发出的38kHz调制光信号到达HS0038A2后,内部电路先滤波(只让38kHz附近的信号通过),再放大、解调,最后输出TTL兼容的电平信号。
关键特性:
供电电压:3.3V~5.5V宽电压,可直接与PIC16F1947的3.3V或5V系统对接
静态电流:约1.2mA,功耗低
输出逻辑:低电平有效——收到红外信号时输出低电平,空闲时为高电平
兼容性:支持NEC、RC-5等主流编码协议
三引脚:OUT、GND、VCC(使用时核对具体型号的引脚定义)
简单说:HS0038A2把“看不见的光信号”变成了“单片机认识的数字信号”。你只需要把它的OUT引脚接到PIC16F1947的一个I/O口,就能开始解码了。
二、红外遥控数据收发的四种控制方式
方式一:外部中断 + 定时器捕获
这是最经典、高效的红外解码方式,也是绝大多数工业级红外遥控方案的首选。
原理:红外信号是一串高低电平交替的脉冲,解码的本质是测量每个脉冲的宽度。HS0038A2输出的信号是反相的——收到信号时输出低电平,空闲时输出高电平。所以解码的关键是测量低电平的持续时间。
实现方法:
- 将HS0038A2的OUT引脚连接到PIC16F1947的外部中断引脚(如RB0/INT)
- 配置外部中断为下降沿触发——当红外信号到达时,HS0038A2的输出从高变低,触发中断
- 在中断服务程序中,启动定时器开始计时
- 当下一个上升沿到来时(信号结束),读取定时器值,得到脉冲宽度
- 根据脉冲宽度判断是引导码、逻辑“0”、逻辑“1”还是重复码
NEC协议的脉冲定义(最常用的红外编码):
引导码:9ms低电平 + 4.5ms高电平
逻辑“0” :560μs低电平 + 560μs高电平
逻辑“1” :560μs低电平 + 1687.5μs高电平
重复码:9ms低电平 + 2.25ms高电平 + 560μs低电平
方式二:定时器查询 + 软件轮询
如果单片机的外部中断引脚已经被其他外设占用,或者你用的是没有外部中断的小封装芯片,可以采用纯软件轮询的方式。
原理:在定时器中断中周期性采样I/O口电平,记录每次电平变化的时间,通过软件分析脉冲宽度。
实现方法:
- 配置一个定时器产生固定时间间隔的中断(如50μs或100μs)
- 在定时器中断服务程序中,读取HS0038A2的OUT引脚状态
- 记录电平变化的时刻,计算脉冲宽度
- 在主循环中解析脉冲序列,完成解码
优点:不占用外部中断引脚,灵活性强。
缺点:CPU负担较重,采样频率不够高时可能漏检窄脉冲(NEC协议的最小脉冲宽度约560μs,采样间隔需小于100μs才能可靠捕获)。
方式三:CCP模块捕获模式
PIC16F1947的CCP模块支持输入捕获功能,可以自动捕获外部信号的上升沿或下降沿时刻,并记录定时器值。
原理:将HS0038A2的OUT引脚连接到CCP模块的输入引脚,配置CCP为“每个上升沿捕获”或“每个下降沿捕获”模式。每当电平跳变时,CCP模块自动将定时器值存入捕获寄存器,并触发中断。
实现方法:
- 配置CCP模块为捕获模式,选择捕获边沿(上升沿或下降沿)
- 使能CCP中断
- 在中断服务程序中读取捕获寄存器的值,计算两次捕获之间的时间差
- 根据时间差解码
优点:硬件自动完成时间测量,精度最高,CPU几乎不参与计时过程。
缺点:占用CCP模块,如果项目中还需要PWM输出或其他CCP功能,可能存在资源冲突。
方式四:UART串口红外透传
如果你需要的不是遥控器解码,而是两个设备之间的红外数据传输,可以采用UART串口透传的方式-。
原理:将UART的TXD信号与38kHz载波信号进行“与”操作,驱动红外发射管;接收端HS0038A2解调后直接连到UART的RXD引脚。
实现方法:
- 发射端:用PIC的PWM模块产生38kHz方波作为载波,用UART的TXD信号控制一个与非门或三极管,实现载波的通断调制
- 接收端:HS0038A2的OUT引脚直接连接到UART的RXD引脚
- 双方配置相同的波特率(通常2400~9600bps),即可实现串口数据透传
优点:软件工作量最小,利用现成的UART硬件完成收发。
缺点:传输距离和抗干扰能力不如专用红外遥控协议(因为缺少引导码和校验机制)。
三、软件实现要点(以NEC协议为例)
以下是以PIC16F1947配合外部中断方式解码NEC协议的基本思路:
1. 初始化配置
将RB0/INT引脚设为输入,使能外部中断(下降沿触发)
配置一个16位定时器(如Timer1),时钟源选为内部指令周期,用于测量脉冲宽度
使能全局中断
2. 中断服务程序
void __interrupt() ISR(void) {
if(INTF) { // 外部中断触发(下降沿)
timer_value = TMR1; // 读取当前定时器值
pulse_width = timer_value - last_timer_value;
last_timer_value = timer_value;
// 根据脉冲宽度判断
if(pulse_width > 8000 && pulse_width < 10000) {
// 9ms引导码开始
state = STATE_GUIDE;
} else if(state == STATE_DATA) {
if(pulse_width > 400 && pulse_width < 700) {
// 逻辑"0"
bit = 0;
} else if(pulse_width > 1500 && pulse_width < 1800) {
// 逻辑"1"
bit = 1;
}
// 组装数据位...
}
INTF = 0; // 清除中断标志
}
}
3. 数据校验
NEC协议的一帧数据共32位:8位地址 + 8位地址反码 + 8位命令 + 8位命令反码。解码完成后,必须验证地址和命令的反码是否正确,才能确认数据有效。
四种控制方式各有适用场景:
外部中断+定时器:通用性最强,适合绝大多数遥控解码需求
定时器查询:适合引脚资源紧张或简单应用
CCP捕获:追求最高精度时的优选
UART透传:适合设备间数据传输,而非遥控器解码
无论选哪种方式,理解脉冲时序的本质才是关键。掌握了这个,换什么单片机、换什么接收头,都没什么问题。
后续干货不断,咱们一起在单片机的世界里,共同进步。

1057

被折叠的 条评论
为什么被折叠?



