我使用的模块是stm32F103R8T6,配合STM32CudeMX实现的红外遥控串口通讯

一、 红外编码

1、实物设备

发射管,红外发光二极管,发出的是红外线而不是可见光,红外线波长为940nm左右。(在遥控器上面):

接收管是红外接收二极管VS1838B,在实际应用中要给红外接收二极管加反向偏压,它才能正常工作,亦即红外接收二极管在电路中应用时是反向运用,这样才能获得较高的灵敏度。和主控芯片具有定时器输入捕获功能的I/O引脚连接在一起:

遥控器:

2、基本原理

调制:将数据能够发送更远,并且数据的损耗在合理范围内,大致过程如下1–》2–》3。
解调:将接收到的已调数据重新恢复并获取出来,大致过程如下的3–》2–》1。

红外通信是利用950nm近红外波段的红外线作为传递信息的媒体, 即通信信道。
发送端采用脉时调制(PPM) 方式, 将二进制数字信号调制成某一频率的脉冲序列, 并驱动红外发射管以光脉冲的形式发送出去;
接收端将接收到的光脉转换成电信号, 再经过放大、 滤波等处理后送给解调电路进行解调, 还原为二进制数字信号后输出。
简而言之, 红外通信的实质就是对二进制数字信号进行调制与解调, 以便利用红外信道进行传输, 红外通信接口就是针对红外信道的调制解调器。
特点:
红外遥控的特点是不影响周边环境、不干扰其它电器设备。由于其无法穿透墙壁,故不同房间的家用电器可使用通用的遥控器而不会产生相互干扰;电路调试简单,只要按给定电路连接无误,一般不需任何调试即可投入工作;编解码容易,可进行多路遥控。因此,红外遥控在家用电器、室内近距离(小于10米)遥控中得到了广泛的应用。

3、红外编码原理

NEC编码原理(还有一种Philips RC5协议)
NEC格式的特征:
1:使用38 kHz载波频率
2:引导码间隔是9 ms + 4.5 ms
3:使用16位客户代码
4:使用8位数据代码和8位取反的数据代码
NEC编码的一帧(通常按一下遥控器按钮所发送的数据) 由引导码、 地址码及数据码组成,如下图所示, 把地址码及数据码取反的作用是加强数据的正确性。

NEC 协议通过脉冲串之间的时间间隔来实现信号的调制(英文简写PPM)。逻辑“0”是由0.56ms的38KHZ载波和0.560ms的无 载波间隔组成;逻辑“1”是由0.56ms的38KHZ载波和1.68ms的无载波间隔组成;结束位是0.56ms的38K载波。

二、红外遥控模块程序

1、红外遥控模块头文件

//红外遥控模块头文件
#ifndef __IR_H
#define __IR_H
#include "main.h"
#define IR_TIM                      TIM2
#define MAX_DATALEN 5
typedef struct{uint8_t mode;uint8_t Ir_Data[MAX_DATALEN];uint16_t Ir_Length;
}IR_DATA_TypeDef;
extern uint8_t IR_code;
uint8_t Ir_RecvAnalysis(void);
#endif

2、红外遥控模块函数实现代码

//红外遥控模块函数实现代码
#include "ir.h"#define RCKeyNum       17
#define RCIRLength  4uint8_t IR_key[17] ="123456789*0#+LOR-";uint8_t RemoteControl_Table[RCKeyNum][RCIRLength] = {{0x00,0xFF,0x45,0xBA},{0x00,0xFF,0x46,0xB9},{0x00,0xFF,0x47,0xB8},   {0x00,0xFF,0x44,0xBB},  {0x00,0xFF,0x40,0xBF},  {0x00,0xFF,0x43,0xBC},  {0x00,0xFF,0x07,0xF8},  {0x00,0xFF,0x15,0xEA},  {0x00,0xFF,0x09,0xF6},  {0x00,0xFF,0x16,0xE9},  {0x00,0xFF,0x19,0xE6},  {0x00,0xFF,0x0D,0xF2},      {0x00,0xFF,0x18,0xE7},      {0x00,0xFF,0x08,0xF7},  {0x00,0xFF,0x1C,0xE3},  {0x00,0xFF,0x5A,0xA5},      {0x00,0xFF,0x52,0xAD},
};uint16_t ir_buf[1024] = {0};
uint16_t ir_count = 0;
uint16_t ir_flag = 0;void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim==&htim2){ir_flag = 1;Ir_RecvAnalysis(); //接收红外信号}
}void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2 ){if(ir_flag == 0){ir_buf[ir_count++] = IR_TIM->CCR2;__HAL_TIM_SET_COUNTER(&htim2,0);IR_TIM->CCER ^= (1<<5);               }
}
}//判断数据范围函数
//数据在给定的范围之内:返回1
//数据在给定的范围之外:返回0
//time1:待判断时间
//time2:标准时间
uint8_t Time_Range(uint16_t time1, uint16_t time2, uint16_t range1, uint16_t range2)
{if((time1 > (time2-range1)) && (time1 < (time2+range2)))return 1;else return 0;
}//校验遥控器按键
//正确,返回遥控器按键所对应的数组行号
//错误 -1  按键地址错误 不是这个遥控器
//错误 -2  地址正确,但是当前版本遥控器没有这个按键值
int Check_RemoteControlKey(uint8_t *buff)
{uint8_t i=0;int retn;
//  if(buff[0] != RemoteControl_Table[0][0] || buff[1] != RemoteControl_Table[0][1])if((buff[0]!=0x00) || (buff[1]!=0xFF))retn = -1;//地址错误for(i=0; i<RCKeyNum; i++){if((buff[2]==RemoteControl_Table[i][2]) && (buff[3]==RemoteControl_Table[i][3])){retn = i;break;}}if(i>=RCKeyNum)   retn = -2;return retn;
}//返回值
//0 解析成功
//1 没有接收完成
//2 引导码错误
//3 前半段数据错误
//4 后半段数据错误IR_DATA_TypeDef ir = {0};
uint8_t IR_code = 0XFF;
uint8_t Ir_RecvAnalysis(void)
{uint16_t i = 0;uint8_t err;if(ir_flag == 0) return 1;
//  for(i=0; i<ir_count; i++)
//      printf("%d\r\n",ir_buf[i]);if(Time_Range(ir_buf[1],9000,1000,1000) == 0){err = 2;goto error;}if(Time_Range(ir_buf[2],4500,500,500) == 0){err = 2;goto error;}for(i=3; i<ir_count-1; i++){if(Time_Range(ir_buf[i],560,200,200)){i++;if(Time_Range(ir_buf[i],560,200,200)){//数据0  0-7  data[0]  8-15 data[1]//先收到低位保存到低位,也可以反着ir.Ir_Data[ir.Ir_Length/8] &= ~(1<<(ir.Ir_Length%8));ir.Ir_Length++;}else if(Time_Range(ir_buf[i],1690,200,200)==1){//数据1ir.Ir_Data[ir.Ir_Length/8] |= (1<<(ir.Ir_Length%8));ir.Ir_Length++;}else{err = 4;goto error;}          }else{err = 3;goto error;}}//  for(i=0; i<ir.Ir_Length/8; i++)
//
//      printf("%02X\t",ir.Ir_Data[i]);
//  printf("\r\n");if(Check_RemoteControlKey(ir.Ir_Data) < 17 && Check_RemoteControlKey(ir.Ir_Data) >=0){IR_code = IR_key[Check_RemoteControlKey(ir.Ir_Data)];memset(ir_buf,0,sizeof(ir_buf));memset(ir.Ir_Data,0,sizeof(ir.Ir_Data));ir.Ir_Length = 0;ir_count = 0;ir_flag = 0;return 0;}error:memset(ir_buf,0,sizeof(ir_buf));memset(ir.Ir_Data,0,sizeof(ir.Ir_Data));ir.Ir_Length = 0;ir_count = 0;ir_flag = 0;
//  TIM_Cmd(TIM2,ENABLE);HAL_TIM_Base_Start_IT(&htim2);if(err)  return err;else return 0;
}

红外遥控模块的使用方法,以及stm32代码相关推荐

  1. 【毕业设计】基于超声波与红外的自动调速风扇系统(代码开源) -物联网 嵌入式 stm32

    文章目录 1 简介 1 设计概要 2 系统设计 2.1 系统供电问题 2.2 自动/手动模式的切换 2.3 PWM信号的产生 2.4 单片机内部资源的分配 三.硬件搭建 3.1 单片机最小系统 3.2 ...

  2. html自动生成工具_关于STM32代码自动生成的工具的进度....

    前情提要:STM32代码自动生成工具_本想...但是...可是...所以 首先说一下那几天大家的反应,有的持观望态度,毕竟STM32CUBE很香:有的很激动,期待我快点出东西:还有的很淡定,知道我在挖 ...

  3. 物联网学习之旅:微信小程序控制STM32(三)--STM32代码编写

    STM32代码编写 STM32端不需要写关于连接MQTT服务器的代码,连接的工作交给ESP8266来做,STM32只需要通过串口接收和发送数据,间接的与服务器交互. 串口三配置 串口一已经与电脑连接了 ...

  4. Matlab生成stm32代码

    文章目录 一.整体思路 二.开发环境 1.安装Matlab 2.安装STM32硬件支持包 3.安装STM32CUBEMX 4.安装KEIL或者IAR等IDE 三.STM32硬件资源配置 1.打开STM ...

  5. 红外和可见光图像融合论文及代码整理

    红外和可见光图像融合论文及代码整理 News [2022-07-29] 我们的综述论文<基于深度学习的图像融合方法综述>被<中国图象图形学报>正式接收![论文下载] 本篇博文在 ...

  6. Matlab/Simulink自动生成STM32代码_基于模型的开发_环境搭建

    目录 前言 官方简介 Matlab R2018b安装 STM32-MAT/TARGET 安装 STM32CubeMX 安装 STM32CubeIDE, Keil安装 ST-Link驱动安装 微信公众号 ...

  7. 目标立体检测 红外图像_一种有效的红外小目标检测方法

    [3]CHEN Bing-wen, WANG Wen-wei, QIN Qian-qing. Infrared dim target detection based on fuzzy-ART neur ...

  8. php执行跟踪_PHP使用debug_backtrace方法跟踪调试代码调用详解

    本文实例讲述了PHP使用debug_backtrace方法跟踪调试代码调用.分享给大家供大家参考,具体如下: 在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到 ...

  9. BC26通过LWM2M协议连接ONENET,AT流程,STM32代码

    onenet平台操作 登录onenet后,进入控制台 选择NB-IoT物联网套件 新建产品 产品名字.类别根据自己情况填,协议选择LWM2M 产品新建成功 点击产品名字,进入产品详情 给产品添加设备 ...

  10. python简单代码画曲线图教程-Python绘制折线图和散点图的详细方法介绍(代码示例)...

    本篇文章给大家带来的内容是关于Python绘制折线图和散点图的详细方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.绘制折线图和散点图要用到matplotlib ...

最新文章

  1. 微软浏览器适配问题前端_「图」微软新贡献:修复Chromium浏览器的奇怪触控板手势问题...
  2. 对于百川SDK签名验证的问题
  3. Vue实现禁止链接打开
  4. Floyed-Warshall算法
  5. 1.6 编程基础之一维数组 05 年龄与疾病 python
  6. api arx autocad_AutoCAD ObjectARX(VC)开发基础与实例教程 此书是利用ObjectARX对AutoCAD二次开发的教程 - 下载 - 搜珍网...
  7. jekins创建ssh_linux – Jenkins SSH slave无法创建/ home // jenkins
  8. indesign使用教程,如何将图形添加到项目?
  9. DVWA模块使用教程(二)
  10. 浅谈IDEA Scratch files万能的临时文件功能
  11. 权限设计,可控制每个接口的使用。
  12. 毕业设计(毕设)目标和要求 (以计算机软件毕业设计为例)
  13. 微信语音技术原理_玩人工智能的你必须知道的语音识别技术原理
  14. vue单页面应用初始加载登录页_6 种 Vue 权限路由实现方式总结(最全)
  15. 闪烁LED灯Verilog
  16. 揭秘IBM架构设计方法论 —— Solution Design I
  17. 09-Hadoop编程
  18. texturepacker 打包图集
  19. oracle数据库中求某行的上一条记录和下一条记录
  20. 团队管理者就是背锅的

热门文章

  1. 苹果cms影视源码的安装和使用
  2. 电脑ps计算机磨皮,ps磨皮教程
  3. 彻底拿下QSPI双闪存W25Q256| STM32H750| QSPI 双FLASH |cubeIDE |下载算法(一)
  4. Java SE Java EE和Java ME的区别
  5. kafka阿里云镜像下载
  6. android截屏与截长图截屏功能的实现
  7. 【灰色系统】—— 灰色系统的定义及其理论内容
  8. java 异步写_Java异步编程实战
  9. ECharts异步数据获取
  10. 环境土壤物理模型HYDRUS1D/2D/3D实践技术