登录/注册

红外遥控 stm32程序

更多

以下是基于STM32的红外遥控接收与发送的示例程序,采用NEC协议:

一、硬件准备

  1. 接收部分

    • 红外接收头(如VS1838B)
    • 连接至STM32的GPIO(如PA0)和外部中断
  2. 发送部分

    • 红外发射管 + 三极管驱动电路(如8050)
    • 连接至STM32的PWM输出引脚(如PA6,TIM3_CH1)

二、接收程序(NEC协议解码)

#include "stm32f1xx_hal.h"

#define IR_GPIO_PIN GPIO_PIN_0
#define IR_GPIO_PORT GPIOA

volatile uint32_t irLastTime = 0;
volatile uint8_t irData[4];
volatile uint8_t irIndex = 0;
volatile uint8_t irReady = 0;

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    if(GPIO_Pin == IR_GPIO_PIN) {
        uint32_t currentTime = HAL_GetTick();
        uint32_t interval = currentTime - irLastTime;
        irLastTime = currentTime;

        if(interval > 100) {  // 引导码检测
            irIndex = 0;
            return;
        }

        if(irIndex < 32) {
            irData[irIndex/8] <<= 1;
            if(interval > 2) {  // 1.125ms为1,560us为0
                irData[irIndex/8] |= 0x01;
            }
            irIndex++;
            if(irIndex == 32) {
                irReady = 1;  // 数据接收完成
            }
        }
    }
}

void IR_Init(void) {
    GPIO_InitTypeDef gpio;
    __HAL_RCC_GPIOA_CLK_ENABLE();

    gpio.Pin = IR_GPIO_PIN;
    gpio.Mode = GPIO_MODE_IT_FALLING;  // 下降沿触发
    gpio.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(IR_GPIO_PORT, &gpio);

    HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}

// 主循环中检测irReady并处理数据

三、发送程序(NEC协议编码)

void IR_SendByte(uint8_t address, uint8_t command) {
    // 38kHz PWM初始化(TIM3_CH1)
    TIM_HandleTypeDef htim;
    htim.Instance = TIM3;
    htim.Init.Prescaler = 71;          // 72MHz/(71+1)=1MHz
    htim.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim.Init.Period = 26;             // 38kHz (1MHz/26≈38.46kHz)
    HAL_TIM_PWM_Init(&htim);

    TIM_OC_InitTypeDef sConfigOC;
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 13;              // 50%占空比
    HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1);

    // 发送引导码
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);  // 9ms载波
    HAL_Delay(9);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); // 4.5ms空闲
    HAL_Delay(5);

    // 发送32位数据
    uint32_t data = (address << 24) | (address << 16) | (command << 8) | (~command);
    for(int i=0; i<32; i++) {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
        if(data & 0x80000000) {  // 发送1:560us脉冲+1.69ms空闲
            HAL_Delay(1);
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
            HAL_Delay(2);
        } else {                 // 发送0:560us脉冲+560us空闲
            HAL_Delay(1);
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
            HAL_Delay(1);
        }
        data <<= 1;
    }
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
}

四、关键说明

  1. 协议特性

    • NEC协议使用38kHz载波
    • 数据格式:引导码(9ms + 4.5ms) + 16位地址 + 8位数据 + 8位数据反码
  2. 调试技巧

    • 使用逻辑分析仪查看波形
    • 通过串口打印接收到的数据
    • 使用已知遥控器进行测试
  3. 注意事项

    • 确保发射管驱动电流足够(通常10-20mA)
    • 接收头需要正确的供电(3-5V)
    • 注意中断优先级设置

五、扩展建议

  1. 添加重复码检测功能
  2. 实现红外学习功能
  3. 支持更多协议(如RC5、Sony SIRC)
  4. 添加软件去抖动处理

实际使用时请根据具体STM32型号调整时钟配置和引脚定义,完整工程需要包含中断服务函数和必要的HAL库初始化代码。

红外遥控与蓝牙遥控的区别

红外遥控与蓝牙遥控的区别  红外

2024-01-25 16:23:39

STM32红外遥控信号自学习实现

STM32之红外遥控信号自学习实现

2023-09-18 15:52:02

结合STM32、Arduino理解红外遥控编解码通信原理

红外遥控我们并不陌生,身边随处可见,最常见的就是家电中的红外遥控,那你知

2023-03-14 09:46:00

STM32CubeMX系列|红外遥控

红外遥控1. 红外遥控简介2. 硬件设计3. 软件设计3.1

资料下载 417804 2021-12-17 17:49:03

基于STM32红外遥控重点解析资料下载

电子发烧友网为你提供基于STM32的红外遥控重点解析资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计

资料下载 鼠爱米 2021-04-24 08:52:44

红外遥控程序和工程文件免费下载

本文档的主要内容详细介绍的是红外遥控的程序和工程文件免费下载。

资料下载 佚名 2021-03-04 15:35:42

LED的红外遥控系统C语言程序免费下载

本文档的主要内容详细介绍的是LED的红外遥控系统C语言程序免费下载。

资料下载 佚名 2019-12-19 16:15:32

51单片机的红外遥控的资料和程序免费下载

本文档的主要内容详细介绍的是51单片机的红外遥控的资料和程序免费下载。

资料下载 佚名 2019-08-21 17:30:00

STM32 NEC红外遥控器解码的相关资料推荐

STM32 NEC红外遥控器解码红外

2022-01-25 08:07:46

基于stm32实现红外自发自收红外遥控

基于stm32实现红外自发自收红外遥控简介

2021-12-08 06:16:52

如何去实现基于stm32F103R8T6和STM32CudeMX的红外遥控串口通讯呢

如何去实现基于stm32F103R8T6和STM32CudeMX的红外遥控

2021-11-15 07:56:42

如何通过STM32来解码红外遥控器的信号呢

什么是红外遥控?如何通过STM32来解码红外

2021-10-27 06:02:38

STM32主控红外遥控双轮平衡小车设计

我的STM32主控红外遥控双轮平衡小车 (2015-05-28 17:38:27)[编辑][删除]转载▼ 我的

2021-08-17 09:26:32

怎样去设计基于STM32的万能红外遥控

本博客介绍一种基于STM32的可学习和存储已有红外发射设备的万能红外遥控

2021-08-09 06:23:50

基于单片机系统的红外遥控器的应用程序

红外遥控器由于其体积小、功耗低、功能强、成本低的特点,已经在家电产品设备中广泛应用。现代智能化仪器仪表系统、工业设备中的控制输入也较多地使用红外

2020-07-15 15:06:34

7天热门专题 换一换
相关标签