红外遥控 stm32程序
更多
以下是基于STM32的红外遥控接收与发送的示例程序,采用NEC协议:
一、硬件准备
-
接收部分:
- 红外接收头(如VS1838B)
- 连接至STM32的GPIO(如PA0)和外部中断
-
发送部分:
- 红外发射管 + 三极管驱动电路(如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);
}
四、关键说明
-
协议特性:
- NEC协议使用38kHz载波
- 数据格式:引导码(9ms + 4.5ms) + 16位地址 + 8位数据 + 8位数据反码
-
调试技巧:
- 使用逻辑分析仪查看波形
- 通过串口打印接收到的数据
- 使用已知遥控器进行测试
-
注意事项:
- 确保发射管驱动电流足够(通常10-20mA)
- 接收头需要正确的供电(3-5V)
- 注意中断优先级设置
五、扩展建议
- 添加重复码检测功能
- 实现红外学习功能
- 支持更多协议(如RC5、Sony SIRC)
- 添加软件去抖动处理
实际使用时请根据具体STM32型号调整时钟配置和引脚定义,完整工程需要包含中断服务函数和必要的HAL库初始化代码。
基于STM32的红外遥控重点解析资料下载
电子发烧友网为你提供基于STM32的红外遥控重点解析资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计
资料下载
鼠爱米
2021-04-24 08:52:44
如何去实现基于stm32F103R8T6和STM32CudeMX的红外遥控串口通讯呢
如何去实现基于stm32F103R8T6和STM32CudeMX的红外遥控
2021-11-15 07:56:42
基于单片机系统的红外遥控器的应用程序
红外遥控器由于其体积小、功耗低、功能强、成本低的特点,已经在家电产品设备中广泛应用。现代智能化仪器仪表系统、工业设备中的控制输入也较多地使用红外
2020-07-15 15:06:34
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- amoled屏幕和oled区别
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机
- 元宇宙概念龙头股一览