摘自:http://blog.csdn.net/feilusia/article/details/53319896

一、简介

本文介绍如何在STM32上使用红外接收头接收红外信号。

其中,红外协议采用为最常见的NEC协议。

二、实验平台

库版本:STM32F10x_StdPeriph_Lib_V3.5.0

编译软件:MDK4.53

硬件平台:STM32开发板(主芯片stm32f103c8t6)

仿真器:JLINK

、版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、实验前提
1、在进行本文步骤前,请先阅读以下博文:
1)《STM8L之红外发射》:http://blog.csdn.net/feilusia/article/details/53305956
2、在进行本文步骤前,请先实现以下博文:

1)《STM32之系统滴答定时器》:http://blog.csdn.net/feilusia/article/details/52835711

五、基础知识

1、硬件原理

答:

1)接收管元器件

上图的引脚从左到右依次为:OUT(空闲时为高电平,接收到载波时为低电平)、GND、VCC。

电压范围为2.7V~5.5V。

附淘宝链接:

https://detail.tmall.com/item.htm?spm=a1z10.3-b.w4011-3079905380.37.ZS9LXo&id=14265901312&rn=9fa50b1d19ad40efa6f149c454e32cfa&abbucket=14

2)硬件原理图

如上图,红外接收引脚接到PB3,PB3为JTAG使用引脚,因此在代码中要注意将引脚功能切换回普通IO口。

2、本文中红外接收的流程是如何的?

答:

1)配置红外接收引脚PB3为IO上拉中断方式。

2)当红外接收头接收到红外遥控器发出的载波信号时,PB3被拉低,代码进入中断服务函数,并依次判断时序是否满足:引导码、用户码、用户反码、键码、键码反码、停止位。

如果时序正确,则获得键值。如果时序不正确,则将此数据过滤。

六、实验步骤

注:下面的步骤为主要步骤,并不是所有步骤,编译有错误的地方请自行修改。

1、编写并添加红外接收的驱动

1)编写驱动GUA_Infrared_Receiver.c(存放在“……\HARDWARE”)

[cpp] view plaincopy
  1. //******************************************************************************
  2. //name:             GUA_Infrared_Receiver.c
  3. //introduce:        红外传感器接收驱动
  4. //author:           甜甜的大香瓜
  5. //email:            897503845@qq.com
  6. //QQ group          香瓜单片机之STM8/STM32(164311667)
  7. //changetime:       2016.12.29
  8. //******************************************************************************
  9. #include "stm32f10x.h"
  10. #include "GUA_Infrared_Receiver.h"
  11. #include "GUA_SysTick.h"
  12. /*********************宏定义************************/
  13. #define TRUE            0
  14. #define FALSE           1
  15. //红外接收引脚
  16. //IO
  17. #define GUA_INFRARED_RECEIVER_PORT               GPIOB
  18. #define GUA_INFRARED_RECEIVER_PIN                GPIO_Pin_3
  19. #define GUA_INFRARED_RECEIVER_RCC                RCC_APB2Periph_GPIOB
  20. //中断
  21. #define GUA_INFRARED_RECEIVER_EXTI_LINE          EXTI_Line3
  22. #define GUA_INFRARED_RECEIVER_PORTSOURCE         GPIO_PortSourceGPIOB
  23. #define GUA_INFRARED_RECEIVER_PINSOURCE          GPIO_PinSource3
  24. /*********************外部变量************************/
  25. GUA_U32 gGUA_InfraredReceiver_Data = 0;
  26. /*********************内部函数************************/
  27. static void GUA_Infrared_Receiver_IO_Init(void);
  28. static GUA_U16 GUA_Infrared_Receiver_GetHighLevelTime(void);
  29. static GUA_U16 GUA_Infrared_Receiver_GetLowLevelTime(void);
  30. //******************************************************************************
  31. //name:             GUA_Infrared_Receiver_IO_Init
  32. //introduce:        红外接收的IO初始化
  33. //parameter:        none
  34. //return:           none
  35. //author:           甜甜的大香瓜
  36. //email:            897503845@qq.com
  37. //QQ group          香瓜单片机之STM8/STM32(164311667)
  38. //changetime:       2016.12.29
  39. //******************************************************************************
  40. static void GUA_Infrared_Receiver_IO_Init(void)
  41. {
  42. //IO结构体
  43. GPIO_InitTypeDef GPIO_InitStructure;
  44. //失能JTAG和SWD在PB3上的功能使用
  45. GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
  46. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  47. //时钟使能
  48. RCC_APB2PeriphClockCmd(GUA_INFRARED_RECEIVER_RCC | RCC_APB2Periph_AFIO, ENABLE);
  49. //红外接收IO配置
  50. GPIO_InitStructure.GPIO_Pin = GUA_INFRARED_RECEIVER_PIN;
  51. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  52. GPIO_Init(GUA_INFRARED_RECEIVER_PORT, &GPIO_InitStructure);
  53. }
  54. //******************************************************************************
  55. //name:             GUA_Infrared_Receiver_Exti_Init
  56. //introduce:        红外接收的IO中断初始化
  57. //parameter:        none
  58. //return:           none
  59. //author:           甜甜的大香瓜
  60. //email:            897503845@qq.com
  61. //QQ group          香瓜单片机之STM8/STM32(164311667)
  62. //changetime:       2016.12.29
  63. //******************************************************************************
  64. static void GUA_Infrared_Receiver_Exti_Init(void)
  65. {
  66. EXTI_InitTypeDef EXTI_InitStructure;
  67. //中断配置
  68. EXTI_ClearITPendingBit(GUA_INFRARED_RECEIVER_EXTI_LINE);
  69. GPIO_EXTILineConfig(GUA_INFRARED_RECEIVER_PORTSOURCE, GUA_INFRARED_RECEIVER_PINSOURCE);
  70. EXTI_InitStructure.EXTI_Line = GUA_INFRARED_RECEIVER_EXTI_LINE;
  71. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  72. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  73. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  74. EXTI_Init(&EXTI_InitStructure);
  75. }
  76. //******************************************************************************
  77. //name:             GUA_Infrared_Receiver_Init
  78. //introduce:        红外接收初始化
  79. //parameter:        none
  80. //return:           none
  81. //author:           甜甜的大香瓜
  82. //email:            897503845@qq.com
  83. //QQ group          香瓜单片机之STM8/STM32(164311667)
  84. //changetime:       2016.12.29
  85. //******************************************************************************
  86. void GUA_Infrared_Receiver_Init(void)
  87. {
  88. //初始化IO
  89. GUA_Infrared_Receiver_IO_Init();
  90. //初始化中断配置
  91. GUA_Infrared_Receiver_Exti_Init();
  92. }
  93. //******************************************************************************
  94. //name:             GUA_Infrared_Receiver_GetHighLevelTime
  95. //introduce:        红外接收获取高电平维持时间
  96. //parameter:        none
  97. //return:           nNum:返回20us的个数
  98. //author:           甜甜的大香瓜
  99. //email:            897503845@qq.com
  100. //QQ group          香瓜单片机之STM8/STM32(164311667)
  101. //changetime:       2016.12.29
  102. //******************************************************************************
  103. static GUA_U16 GUA_Infrared_Receiver_GetHighLevelTime(void)
  104. {
  105. GUA_U16 nGUA_Num = 0;
  106. //判断是否一直为高电平
  107. while(GPIO_ReadInputDataBit(GUA_INFRARED_RECEIVER_PORT, GUA_INFRARED_RECEIVER_PIN) == Bit_SET)
  108. {
  109. //超时超时溢出
  110. if(nGUA_Num >= 250)
  111. {
  112. return nGUA_Num;
  113. }
  114. //计延时20us的次数
  115. nGUA_Num++;
  116. //延时
  117. GUA_Delay_Us(17);
  118. }
  119. return nGUA_Num;
  120. }
  121. //******************************************************************************
  122. //name:             GUA_Infrared_Receiver_GetLowLevelTime
  123. //introduce:        红外接收获取低电平维持时间
  124. //parameter:        none
  125. //return:           nNum:返回20us的个数
  126. //author:           甜甜的大香瓜
  127. //email:            897503845@qq.com
  128. //QQ group          香瓜单片机之STM8/STM32(164311667)
  129. //changetime:       2016.12.29
  130. //******************************************************************************
  131. static GUA_U16 GUA_Infrared_Receiver_GetLowLevelTime(void)
  132. {
  133. GUA_U16 nGUA_Num = 0;
  134. //判断是否一直为低电平
  135. while(GPIO_ReadInputDataBit(GUA_INFRARED_RECEIVER_PORT, GUA_INFRARED_RECEIVER_PIN) == Bit_RESET)
  136. {
  137. //超时超时溢出
  138. if(nGUA_Num >= 500)
  139. {
  140. return nGUA_Num;
  141. }
  142. //计延时20us的次数
  143. nGUA_Num++;
  144. //延时
  145. GUA_Delay_Us(17);
  146. }
  147. return nGUA_Num;
  148. }
  149. //******************************************************************************
  150. //name:             GUA_Infrared_Receiver_Process
  151. //introduce:        红外接收的处理函数
  152. //parameter:        none
  153. //return:           GUA_INFRARED_RECEIVER_OK or GUA_INFRARED_RECEIVER_ERROR
  154. //author:           甜甜的大香瓜
  155. //email:            897503845@qq.com
  156. //QQ group          香瓜单片机之STM8/STM32(164311667)
  157. //changetime:       2016.12.29
  158. //******************************************************************************
  159. GUA_U8 GUA_Infrared_Receiver_Process(void)
  160. {
  161. GUA_U16 nGUA_Time_Num = 0;
  162. GUA_U8 nGUA_Data = 0;
  163. GUA_U8 nGUA_Byte_Num = 0;
  164. GUA_U8 nGUA_Bit_Num = 0;
  165. //接收引导码9ms的低电平,过滤无用信号>10ms或<8ms
  166. nGUA_Time_Num = GUA_Infrared_Receiver_GetLowLevelTime();
  167. if((nGUA_Time_Num >= 500) || (nGUA_Time_Num <= 400))
  168. {
  169. return GUA_INFRARED_RECEIVER_ERROR;
  170. }
  171. //接收引导码4.5ms的高电平,过滤无用信号>5ms或<4ms
  172. nGUA_Time_Num = GUA_Infrared_Receiver_GetHighLevelTime();
  173. if((nGUA_Time_Num >= 250) || (nGUA_Time_Num <= 200))
  174. {
  175. return GUA_INFRARED_RECEIVER_ERROR;
  176. }
  177. //接收后4字节数据
  178. for(nGUA_Byte_Num = 0; nGUA_Byte_Num < 4; nGUA_Byte_Num++)
  179. {
  180. //接收每字节8位数据
  181. for(nGUA_Bit_Num = 0; nGUA_Bit_Num < 8; nGUA_Bit_Num++)
  182. {
  183. //接收每bit的前0.56ms的低电平,过滤无用信号>1.2ms或<0.40ms
  184. nGUA_Time_Num = GUA_Infrared_Receiver_GetLowLevelTime();
  185. if((nGUA_Time_Num >= 60) || (nGUA_Time_Num <= 20))
  186. {
  187. return GUA_INFRARED_RECEIVER_ERROR;
  188. }
  189. //接收每bit的后高电平时长:高电平数据,1.68ms(1.2ms~2.0ms),低电平数据,0.56ms(0.2ms~1ms),过滤其他无用信号
  190. nGUA_Time_Num = GUA_Infrared_Receiver_GetHighLevelTime();
  191. if((nGUA_Time_Num >=60) && (nGUA_Time_Num < 100))
  192. {
  193. nGUA_Data = 1;
  194. }
  195. else if((nGUA_Time_Num >=10) && (nGUA_Time_Num < 50))
  196. {
  197. nGUA_Data = 0;
  198. }
  199. else
  200. {
  201. return GUA_INFRARED_RECEIVER_ERROR;
  202. }
  203. //保存数据
  204. gGUA_InfraredReceiver_Data <<= 1;
  205. gGUA_InfraredReceiver_Data |= nGUA_Data;
  206. }
  207. }
  208. return GUA_INFRARED_RECEIVER_OK;
  209. }

注意,“GUA_Delay_Us(17);”函数实测为20us左右,我们想要延时的就是20us,因此形参为17。

2)编写驱动头文件GUA_Infrared_Receiver.h(存放在“……\HARDWARE”)

[cpp] view plaincopy
  1. //******************************************************************************
  2. //name:             GUA_Infrared_Receiver.h
  3. //introduce:        红外传感器接收驱动的头文件
  4. //author:           甜甜的大香瓜
  5. //email:            897503845@qq.com
  6. //QQ group          香瓜单片机之STM8/STM32(164311667)
  7. //changetime:       2016.12.29
  8. //******************************************************************************
  9. #ifndef _GUA_INFRARED_RECEIVER_H_
  10. #define _GUA_INFRARED_RECEIVER_H_
  11. /*********************宏定义************************/
  12. #ifndef GUA_U8
  13. typedef unsigned char GUA_U8;
  14. #endif
  15. #ifndef GUA_8
  16. typedef signed char GUA_8;
  17. #endif
  18. #ifndef GUA_U16
  19. typedef unsigned short GUA_U16;
  20. #endif
  21. #ifndef GUA_16
  22. typedef signed short GUA_16;
  23. #endif
  24. #ifndef GUA_U32
  25. typedef unsigned long GUA_U32;
  26. #endif
  27. #ifndef GUA_32
  28. typedef signed long GUA_32;
  29. #endif
  30. #ifndef GUA_U64
  31. typedef unsigned long long GUA_U64;
  32. #endif
  33. #ifndef GUA_64
  34. typedef signed long long GUA_64;
  35. #endif
  36. #define GUA_INFRARED_RECEIVER_OK                    0
  37. #define GUA_INFRARED_RECEIVER_ERROR             1
  38. #define GUA_INFRARED_RECEIVER_KEY1              0x00FF00FF
  39. #define GUA_INFRARED_RECEIVER_KEY2              0x00FF01FE
  40. #define GUA_INFRARED_RECEIVER_KEY3              0x00FF02FD
  41. #define GUA_INFRARED_RECEIVER_KEY4              0x00FF03FC
  42. /*********************外部变量************************/
  43. extern GUA_U32 gGUA_InfraredReceiver_Data;
  44. /*********************外部函数声明************************/
  45. extern void GUA_Infrared_Receiver_Init(void);
  46. extern GUA_U8 GUA_Infrared_Receiver_Process(void);
  47. #endif

由于发送端自定义了四个按键,因此香瓜在这里将这四个按键键值写在这里,此处可自行修改。

3)工程中添加GUA_Infrared_Receiver.c

4)在MDK设置中添加驱动源文件路径

2、设置NVIC中断优先级(GUA_NVIC.c的GUA_NVIC_Init中)

[cpp] view plaincopy
  1. //红外接收
  2. GUA_NVIC_Config(NVIC_PriorityGroup_2, EXTI3_IRQn, 2, 2, ENABLE);
3、写中断服务函数(stm32f10x_it.c中)
1)添加头文件
[cpp] view plaincopy
  1. #include "GUA_Infrared_Receiver.h"

2)编写中断服务函数

[cpp] view plaincopy
  1. //******************************************************************************
  2. //name:             EXTI3_IRQHandler
  3. //introduce:        红外接收的处理函数
  4. //parameter:        none
  5. //return:           none
  6. //author:           甜甜的大香瓜
  7. //email:            897503845@qq.com
  8. //QQ group          香瓜单片机之STM8/STM32(164311667)
  9. //changetime:       2016.11.21
  10. //******************************************************************************
  11. void EXTI3_IRQHandler(void)
  12. {
  13. //红外
  14. if(EXTI_GetITStatus(EXTI_Line3) != RESET)
  15. {
  16. //接收红外数据正确
  17. if(GUA_Infrared_Receiver_Process() == GUA_INFRARED_RECEIVER_OK)
  18. {
  19. function = FUNC_INFRARED_RECEIVER_EVENT;
  20. }
  21. //清除标志位
  22. EXTI_ClearITPendingBit(EXTI_Line3);
  23. }
  24. }

4、在应用层中调用

1)添加头文件(main.c中)

[cpp] view plaincopy
  1. #include "GUA_Infrared_Receiver.h"

2)添加驱动初始化代码(main.c的main函数中)

[cpp] view plaincopy
  1. //红外接收初始化
  2. GUA_Infrared_Receiver_Init();

3)添加测试代码

①写红外接收处理事件(main.c的main函数中)

[cpp] view plaincopy
  1. //红外接收处理
  2. case FUNC_INFRARED_RECEIVER_EVENT:
  3. {
  4. //键值处理
  5. switch(gGUA_InfraredReceiver_Data)
  6. {
  7. //红外按键1
  8. case GUA_INFRARED_RECEIVER_KEY1:
  9. {
  10. break;
  11. }
  12. //红外按键2
  13. case GUA_INFRARED_RECEIVER_KEY2:
  14. {
  15. break;
  16. }
  17. //红外按键3
  18. case GUA_INFRARED_RECEIVER_KEY3:
  19. {
  20. break;
  21. }
  22. //红外按键4
  23. case GUA_INFRARED_RECEIVER_KEY4:
  24. {
  25. break;
  26. }
  27. //其他
  28. default:
  29. {
  30. break;
  31. }
  32. }
  33. //返回空闲状态
  34. function = FUNC_IDLE_EVENT;
  35. break;
  36. }

②写红外处理事件宏(main.h中)

[cpp] view plaincopy
  1. //主轮询的宏
  2. #define FUNC_IDLE_EVENT                       0x00    //空闲
  3. #define FUNC_INFRARED_RECEIVER_EVENT                  0x16    //红外接收处理

七、注意事项

暂无。

八、实验结果

仿真并设置断点在红外接收处理事件中,全速运行。

当遥控器发送0x00FF00FF的键值时,代码会停止在断点处,并且gGUA_InfraredReceiver_Data的值为0x00FF00FF。

STM32之红外接收相关推荐

  1. 【STM32】STM32之红外接收

    本篇博文最后修改时间:2017年04月04日,12:48. 一.简介 本文介绍如何在STM32上使用红外接收头接收红外信号. 其中,红外协议采用为最常见的NEC协议. 二.实验平台 库版本:STM32 ...

  2. STM32F4驱动NEC协议的红外接收头

    红外遥控是一种无线.非接触式控制技术,具有抗干扰能力强.传输可靠.价格便宜.功耗低.易实现等优点.被很多的家用电器所采用.目前常用的红外遥控器协议有NEC协议(PWM脉冲宽度调制).Philips R ...

  3. STM32制作红外遥控和红外接收装置

    声明         .这是一部分读取遥控器的键值然后再模拟出该键值的红外信号并发射的代码,可以读到键值,以及设备对应的识别码,收到的2进制转16进制的数据,不是每个遥控器都可以复制的哟,一些简单的遥 ...

  4. STM32 CubeMX HAL库 之红外接收(NEC协议)定时器捕获

    第一次自己写完整的硬件驱动,发上来给大家看看,顺便吸收些改进方案,希望各位能够不吝赐教,指出代码的不足之处.同时我也很高兴这代码能给你带来帮助. 工程使用CubeMX创建,使用VS Code编程,单片 ...

  5. thinkphp6 接收不到数据_单片机红外接收与红外发射

    1. 红外接收1.1 说明1.2 NEC协议1.3 关于红外接收的波形1.4 解码1.4 红外对射思考2. 红外发射2.1 红外发射管参数2.2 红外发射电路搭建2.3 程序设计2.5 实验结果2.4 ...

  6. STM32F103:三.(2)红外接收

    STM32F103:三.(2)红外接收 代码参考正点原子,STM32F103C8T6正常运行. NEC 协议的高低电平辨别方式 整体思路是将PB9设置上拉输入,并开启定时器4的输入捕获功能,溢出值设置 ...

  7. 基于STM32的万能红外遥控器

    本博客介绍一种基于STM32的可学习和存储已有红外发射设备的万能红外遥控器的设计思路. 一.首先需要了解设计一款这功能的遥控器需要什么硬件设备支持. 1.3.3V,5V电源模块,用作给系统模块供电和单 ...

  8. android手机红外代码HAL,手机红外遥控器发送红外信号到STM32【HAL库】

    现在大部分手机上都有红外遥控功能,而且好像大部分信号STM32都是可以收到的.现在就使用STM32发送红外信号,由STM32上的红外接收器接收后执行不同的操作.以下是注意事项: 在标准库中有  EXT ...

  9. 【毕业设计】基于 STM32 的自动泊车系统 -智能小车 - 物联网单片机

    文章目录 1 简介 1 背景 2 设计概要 3 硬件选型 3.1 主控 - STM32 3.2 电机驱动 3.3 红外遥控设计 3.4 传感器部分 3.4.1 循迹模块 3.4.2 红外避障模块 3. ...

  10. “药药切克闹”系列-基于STM32触摸屏的超级无敌智能电子密码锁(仿手机键盘26键设计,密码支持英文大写+英文小写+数字)

    项目名称:"药药切克闹"系列-基于STM32触摸屏的超级无敌智能电子密码锁(密码支持英文大写+英文小写+数字) CSDN:YANG-03                      ...

最新文章

  1. TVM darknet yolov3算子优化与量化代码的配置方法
  2. jq 读取office插件_800+页麦肯锡经典图示发送!让你不用插件,轻松搞定逻辑图...
  3. js -“=”“==”和“===”的区别
  4. Android获取apk信息(版本、包名等)
  5. CentOS 6 php5.6.0一键部署脚本
  6. 5-python学习——条件语句
  7. Seafile 1.3 发布,文件同步和协作平台
  8. background 图片比例缩小_如何更精准控制背景图片?
  9. 机器视觉检测技术之颜色视觉工具应用
  10. Unity之Touch触摸屏单指、多指触碰
  11. 姓舒男孩名字简单大气
  12. wordpress 安装教程
  13. [渝粤教育] 广东-国家-开放大学 21秋期末考试建筑工程计量与计价10517k1
  14. vlog常用参数解析
  15. MATLAB软件基础学习篇——003
  16. 历史上有哪些看似经PS处理实则没有的照片?
  17. 加速,永无止境,媲美PanDownload!
  18. 河北省计算机应用与基础知识,2013河北省职称计算机应用能力考试基础知识分章整理...
  19. 2021年全球与中国手动切片机行业市场规模及发展前景分析
  20. 我win7的快捷方式图标显示不正常的解决方法

热门文章

  1. 项目管理实战课程总结
  2. 2021最新学习路线,Java快速入门到精通(附Java教学视频)
  3. 中标麒麟系统u盘安装_如何用u盘安装中标麒麟桌面操作系统v6.0
  4. laravel框架解决sql注入问题
  5. SVN客户端——SmartSVN功能详解
  6. 六年级上册计算机教材分析,人教版六年级上册数学教材分析
  7. 2018-10-8-如何安装-btsync
  8. tomcat未自动解压war包原因分析
  9. 分形理论的Hausdorff维数
  10. Android 终端使用 JavaCV