历史上的今天
返回首页

历史上的今天

今天是:2025年01月30日(星期四)

2020年01月30日 | STM32之红外接收

2020-01-30 来源:eefocus

一、简介


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


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


二、实验平台


库版本:STM32F10x_StdPeriph_Lib_V3.5.0


编译软件:MDK4.53


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


仿真器:JLINK


三、版权声明


四、实验前提

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”)


//******************************************************************************              

//name:             GUA_Infrared_Receiver.c             

//introduce:        红外传感器接收驱动      

//author:           甜甜的大香瓜                     

//email:            897503845@qq.com         

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.29      

//******************************************************************************   

#include "stm32f10x.h" 

#include "GUA_Infrared_Receiver.h"

#include "GUA_SysTick.h"

 

/*********************宏定义************************/

#define TRUE 0

#define FALSE 1

 

//红外接收引脚

//IO

#define GUA_INFRARED_RECEIVER_PORT               GPIOB

#define GUA_INFRARED_RECEIVER_PIN                GPIO_Pin_3

#define GUA_INFRARED_RECEIVER_RCC                RCC_APB2Periph_GPIOB

 

//中断

#define GUA_INFRARED_RECEIVER_EXTI_LINE          EXTI_Line3

#define GUA_INFRARED_RECEIVER_PORTSOURCE         GPIO_PortSourceGPIOB

#define GUA_INFRARED_RECEIVER_PINSOURCE          GPIO_PinSource3 

/*********************外部变量************************/

GUA_U32 gGUA_InfraredReceiver_Data = 0;

 

/*********************内部函数************************/ 

static void GUA_Infrared_Receiver_IO_Init(void);

static GUA_U16 GUA_Infrared_Receiver_GetHighLevelTime(void);

static GUA_U16 GUA_Infrared_Receiver_GetLowLevelTime(void);

 

//******************************************************************************        

//name:             GUA_Infrared_Receiver_IO_Init        

//introduce:        红外接收的IO初始化     

//parameter:        none       

//return:           none      

//author:           甜甜的大香瓜             

//email:            897503845@qq.com         

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.29      

//******************************************************************************  

static void GUA_Infrared_Receiver_IO_Init(void)

{

//IO结构体

GPIO_InitTypeDef GPIO_InitStructure;

 

//失能JTAG和SWD在PB3上的功能使用

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

//时钟使能

RCC_APB2PeriphClockCmd(GUA_INFRARED_RECEIVER_RCC | RCC_APB2Periph_AFIO, ENABLE);

//红外接收IO配置

GPIO_InitStructure.GPIO_Pin = GUA_INFRARED_RECEIVER_PIN; 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 

GPIO_Init(GUA_INFRARED_RECEIVER_PORT, &GPIO_InitStructure);

}

 

//******************************************************************************            

//name:             GUA_Infrared_Receiver_Exti_Init           

//introduce:        红外接收的IO中断初始化         

//parameter:        none                 

//return:           none         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group          香瓜单片机之STM8/STM32(164311667)                  

//changetime:       2016.12.29                  

//******************************************************************************

static void GUA_Infrared_Receiver_Exti_Init(void)

{

EXTI_InitTypeDef EXTI_InitStructure;

 

//中断配置

EXTI_ClearITPendingBit(GUA_INFRARED_RECEIVER_EXTI_LINE);

GPIO_EXTILineConfig(GUA_INFRARED_RECEIVER_PORTSOURCE, GUA_INFRARED_RECEIVER_PINSOURCE);  

 

EXTI_InitStructure.EXTI_Line = GUA_INFRARED_RECEIVER_EXTI_LINE;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

}

 

//******************************************************************************        

//name:             GUA_Infrared_Receiver_Init        

//introduce:        红外接收初始化     

//parameter:        none       

//return:           none      

//author:           甜甜的大香瓜             

//email:            897503845@qq.com         

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.29     

//******************************************************************************  

void GUA_Infrared_Receiver_Init(void)

{

  //初始化IO

  GUA_Infrared_Receiver_IO_Init();

 

  //初始化中断配置

GUA_Infrared_Receiver_Exti_Init();

}

 

//******************************************************************************        

//name:             GUA_Infrared_Receiver_GetHighLevelTime        

//introduce:        红外接收获取高电平维持时间   

//parameter:        none       

//return:           nNum:返回20us的个数      

//author:           甜甜的大香瓜             

//email:            897503845@qq.com         

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.29      

//****************************************************************************** 

static GUA_U16 GUA_Infrared_Receiver_GetHighLevelTime(void)

{

GUA_U16 nGUA_Num = 0;

//判断是否一直为高电平

while(GPIO_ReadInputDataBit(GUA_INFRARED_RECEIVER_PORT, GUA_INFRARED_RECEIVER_PIN) == Bit_SET)

{

//超时超时溢出

if(nGUA_Num >= 250) 

{

return nGUA_Num;

}

//计延时20us的次数

nGUA_Num++;

//延时

GUA_Delay_Us(17);

}

return nGUA_Num;

}

 

//******************************************************************************        

//name:             GUA_Infrared_Receiver_GetLowLevelTime        

//introduce:        红外接收获取低电平维持时间   

//parameter:        none       

//return:           nNum:返回20us的个数       

//author:           甜甜的大香瓜             

//email:            897503845@qq.com         

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.29       

//****************************************************************************** 

static GUA_U16 GUA_Infrared_Receiver_GetLowLevelTime(void)

{

GUA_U16 nGUA_Num = 0;

//判断是否一直为低电平

while(GPIO_ReadInputDataBit(GUA_INFRARED_RECEIVER_PORT, GUA_INFRARED_RECEIVER_PIN) == Bit_RESET)

{

//超时超时溢出

if(nGUA_Num >= 500) 

{

return nGUA_Num;

}

//计延时20us的次数

nGUA_Num++;

//延时

GUA_Delay_Us(17);

}

return nGUA_Num;

}

//******************************************************************************            

//name:             GUA_Infrared_Receiver_Process           

推荐阅读

史海拾趣

DAYLIGHT公司的发展小趣事

随着公司规模的扩大和市场份额的增加,DAYLIGHT开始将目光投向国际市场。公司通过与国际知名电子企业的合作,成功将其产品打入国际市场,并在多个国家和地区建立了销售渠道。同时,DAYLIGHT还积极参与国际电子展和技术交流会议,不断提升其在国际市场上的知名度和影响力。

AMI [American Megatrends Inc]公司的发展小趣事

随着全球环保意识的提高,DAYLIGHT公司也开始注重环保和可持续发展。公司投入大量资金用于研发环保型电子产品和技术,并积极参与环保公益活动。此外,DAYLIGHT还制定了严格的环保标准和生产流程,确保其产品的生产和使用过程中对环境的影响最小化。

EVERLIGHT公司的发展小趣事

在电子产品领域,品质是企业生存和发展的关键。EVERLIGHT一直将品质管理放在首位,建立了严格的质量控制体系。公司从原材料采购到生产过程,再到产品出厂,都进行严格的品质检测和监控,确保每一颗LED都符合高标准的质量要求。这种对品质的坚持让EVERLIGHT在市场上赢得了良好的口碑,也为企业赢得了更多客户的信任。

德崧电子(D-SWITCH)公司的发展小趣事

在激烈的市场竞争中,德崧电子始终坚持品质为先的经营理念。公司从原材料采购到生产加工,再到成品检验,每一个环节都严格把控,确保产品质量。这种对品质的坚守不仅赢得了客户的信任,也为公司赢得了良好的口碑。正是凭借着过硬的产品质量和优质的服务,德崧电子在电子开关行业中树立了良好的品牌形象。

DRS Technologies公司的发展小趣事

DRS Technologies公司成立于1968年,由Leonard Newman和David Gross两位工程师共同创立。当时,他们正在Loral Corporation研究反潜战的信号处理技术。然而,当Loral决定转向其他技术方向时,Newman和Gross决定继续他们的研究,并创立了DRS。他们的努力最终导致了AN/SQR-17无源潜艇探测系统的开发,这一系统至今仍在广泛使用。

Chicago Miniature公司的发展小趣事

在发展过程中,CML始终注重产品质量和品牌建设。公司建立了严格的质量管理体系,从原材料采购到生产流程再到产品出厂,都进行严格的质量控制。这使得CML的产品在市场上享有良好的声誉,并赢得了客户的信任。同时,公司还积极参与各种行业展会和交流活动,提升品牌知名度和影响力。

问答坊 | AI 解惑

MCU成为现代汽车技术核心部件

随着X-By-Wire、Telematics、Car-PC等车用信息技术概念逐渐 变为现实,现代汽车已由传统的机械平台,逐渐过渡到集机械、电子 和信息技术于一体的高技术平台,同时也标志着汽车已由功能单一的 交通工具,转化为人们生存的第三信息空间。作为现代电子 ...…

查看全部问答>

基于A/D和D/A转换的单片机语音录放设计

哪位高手能提供下怎么通过A/D和D/A转换将语音录放啊?很急,万分感谢,如有兴趣的可以Q聊,270329846…

查看全部问答>

PIC单片机KIT2仿真器(深圳格兰瑞科技有限公司)

         PIC单片机KIT2仿真器 PIC KIT2 是一款完全兼容于Microchip公司新推出的PICKIT 2的PIC单片机开发工具,它能够对Microchip 的几乎所有的闪存单片机编程。同时它也能对Microchip的几乎所有的闪存单片机进 ...…

查看全部问答>

[紧急求助]单片机系统在高低温过程中死机,不可自恢复!!!!!!!

我的系统采用了一款philips的80C51单片机P89LV51RD2,其温度范围是0-70度。单片机系统在常温下已 经过至少2周的烤机,没有复位过。在常温测试完成后,进入高低温测试阶段。启用了单片机自带的看门狗,所以没有设置外部的硬件看门狗。 目前的现象是 ...…

查看全部问答>

一个有关USB驱动开发的问题。

我现在要实现一个USB驱动,我之前没写过USB驱动,对其不甚了解,请高手指点一二: 用windows系统的USB驱动上开发用户态驱动程序 windowXP系统! 传输第一个字节是端口ID号!其他是传输数据! 具有读写功能 我对\"传输第一个字节是端口ID号\"不 ...…

查看全部问答>

求wince 下的串口程序 只要实现单向通信就行

只要2个按钮,一个发送,一个接受…

查看全部问答>

关于能够采集电参数和模拟量采集模块的价位

关于能够采集电参数(要求能控制开关的)和模拟量采集模块的价位是多少呢? 对以上要求是:本安型,技术成熟, …

查看全部问答>

Freescale iMX27 iMX515硬件平台设计—兼职Allegro PCB Layout

Freescale iMX27 iMX515 Hardware Design—Allegro PCB Layout Freescale iMX27 iMX515硬件平台设计—兼职Allegro PCB Layout 本人现从事(嵌入式ARM)电子硬件设计开发工作。工作时间较为自由。现利用业余时间 兼职Allegro PCB Layout,或者代 ...…

查看全部问答>

大家用贴片电阻电容还是直插的?

大家用贴片电阻电容还是直插的?    …

查看全部问答>