单片机控制红外遥控数据收发的几种方式

在工业控制、智能家居、消费电子等领域,红外遥控及数据收发仍然有一定的优势。

它成本低、功耗小、抗电磁干扰强,无论是遥控工业设备,还是给老旧设备加装无线控制功能,红外遥控的收发技术都很有实用价值。

今天,就以PIC16F1947单片机为核心,配合HS0038A2红外接收头,聊聊红外遥控的几种控制方式。

一、HS0038A2:把光信号变成电信号

HS0038A2是一款一体化红外接收头,内部集成了光电二极管、前置放大器、自动增益控制(AGC)、带通滤波器和解调电路。它的核心工作频率是38kHz——这是绝大多数红外遥控使用的载波频率。

红外发射管发出的38kHz调制光信号到达HS0038A2后,内部电路先滤波(只让38kHz附近的信号通过),再放大、解调,最后输出TTL兼容的电平信号

关键特性

供电电压:3.3V~5.5V宽电压,可直接与PIC16F19473.3V5V系统对接

静态电流:约1.2mA,功耗低

输出逻辑:低电平有效——收到红外信号时输出低电平,空闲时为高电平

兼容性:支持NECRC-5等主流编码协议

三引脚:OUTGNDVCC(使用时核对具体型号的引脚定义)

简单说HS0038A2看不见的光信号变成了单片机认识的数字信号。你只需要把它的OUT引脚接到PIC16F1947的一个I/O口,就能开始解码了。

二、红外遥控数据收发的四种控制方式

方式一:外部中断 + 定时器捕获

这是最经典、高效的红外解码方式,也是绝大多数工业级红外遥控方案的首选。

原理:红外信号是一串高低电平交替的脉冲,解码的本质是测量每个脉冲的宽度HS0038A2输出的信号是反相的——收到信号时输出低电平,空闲时输出高电平。所以解码的关键是测量低电平的持续时间

实现方法

  1. HS0038A2OUT引脚连接到PIC16F1947外部中断引脚(如RB0/INT
  2. 配置外部中断为下降沿触发——当红外信号到达时,HS0038A2的输出从高变低,触发中断
  3. 在中断服务程序中,启动定时器开始计时
  4. 当下一个上升沿到来时(信号结束),读取定时器值,得到脉冲宽度
  5. 根据脉冲宽度判断是引导码、逻辑“0”、逻辑“1”还是重复码

NEC协议的脉冲定义(最常用的红外编码):

引导码9ms低电平 + 4.5ms高电平

逻辑“0” 560μs低电平 + 560μs高电平

逻辑“1” 560μs低电平 + 1687.5μs高电平

重复码9ms低电平 + 2.25ms高电平 + 560μs低电平

方式二:定时器查询 + 软件轮询

如果单片机的外部中断引脚已经被其他外设占用,或者你用的是没有外部中断的小封装芯片,可以采用纯软件轮询的方式。

原理:在定时器中断中周期性采样I/O口电平,记录每次电平变化的时间,通过软件分析脉冲宽度。

实现方法

  1. 配置一个定时器产生固定时间间隔的中断(如50μs100μs
  2. 在定时器中断服务程序中,读取HS0038A2OUT引脚状态
  3. 记录电平变化的时刻,计算脉冲宽度
  4. 在主循环中解析脉冲序列,完成解码

优点:不占用外部中断引脚,灵活性强。
缺点CPU负担较重,采样频率不够高时可能漏检窄脉冲(NEC协议的最小脉冲宽度约560μs,采样间隔需小于100μs才能可靠捕获)。

方式三:CCP模块捕获模式

PIC16F1947CCP模块支持输入捕获功能,可以自动捕获外部信号的上升沿或下降沿时刻,并记录定时器值

原理:将HS0038A2OUT引脚连接到CCP模块的输入引脚,配置CCP每个上升沿捕获每个下降沿捕获模式。每当电平跳变时,CCP模块自动将定时器值存入捕获寄存器,并触发中断。

实现方法

  1. 配置CCP模块为捕获模式,选择捕获边沿(上升沿或下降沿)
  2. 使能CCP中断
  3. 在中断服务程序中读取捕获寄存器的值,计算两次捕获之间的时间差
  4. 根据时间差解码

优点:硬件自动完成时间测量,精度最高,CPU几乎不参与计时过程。
缺点:占用CCP模块,如果项目中还需要PWM输出或其他CCP功能,可能存在资源冲突。

方式四:UART串口红外透传

如果你需要的不是遥控器解码,而是两个设备之间的红外数据传输,可以采用UART串口透传的方式-

原理:将UARTTXD信号与38kHz载波信号进行操作,驱动红外发射管;接收端HS0038A2解调后直接连到UARTRXD引脚。

实现方法

  1. 发射端:用PICPWM模块产生38kHz方波作为载波,用UARTTXD信号控制一个与非门或三极管,实现载波的通断调制
  2. 接收端HS0038A2OUT引脚直接连接到UARTRXD引脚
  3. 双方配置相同的波特率(通常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透传:适合设备间数据传输,而非遥控器解码

无论选哪种方式,理解脉冲时序的本质才是关键。掌握了这个,换什么单片机、换什么接收头,都没什么问题。

后续干货不断,咱们一起在单片机的世界里,共同进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值