STM32进阶-红外遥控器的应用详细步骤

发布者:西周以前的最新更新时间:2022-05-29 来源: eefocus关键字:STM32  红外遥控器  抗干扰 手机看文章 扫描二维码
随时随地手机看文章

红外遥控器概述

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。


同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。


红外遥控的编码目前广泛使用的是:NEC Protocol 的PWM(脉冲宽度调制)和Philips

RC-5 Protocol 的PPM(脉冲位置调制)。


NEC协议的特征:

1、8位地址和8位指令长度;

2、地址和命令两次传输;(确保可靠性)

3、PWM脉冲宽度调制,以发射红外载波的占空比代表“0”和“1”;

4、载波频率为38KHz

5、位时间为1.125ms和2.25ms


NEC码位的定义:

一个脉冲对应560us的连续载波,一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),一个逻辑0的传输需要1.125ms(560us脉冲+560us低电平)。而遥控接收头在收到脉冲时为低电平,在没有收到脉冲时为高电平,因此,我们在接收头端收到的信号为:逻辑1应该是560us低+1680us高,逻辑0应该是560us低+560us高。如下图:

NEC遥控器指令格式:

NEC遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是8位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于校验)。

其地址码为0,控制码为21(从左往右读数)。可以看到在100ms之后,我们还收到了几个脉冲,这是NEC码规定的连发码(由9ms低电平+2.5m高电平+0.56ms低电平+97.94ms高电平组成),如果在一帧数据发送完毕之后,按键仍然没有放开,则发射重复码,即连发码,可以通过统计连发码的次数来标记按键按下的长短/次数。


红外遥控器接口

根据自己芯片类型查询相应的引脚接口

由图可知:

应该初始化GPIO口PA8,输入模式,中断线设置为8,NVIC通道为EXTI9_5_IRQn


红外遥控器程序思路

对应通道输入捕获功能,下降沿捕获

开启捕获中断。当捕获到下升沿产生捕获中断

在中断中使用函数判断高电平持续时间,若高电平时间为4~5ms, 则为引导码;若为1.2m~1.8ms,则为1;若为0.2ms ~1ms ,则为1; 然后通过判断反码关系,确定数据的有效。

关键代码


void Infrared_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;    

EXTI_InitTypeDef    EXTI_InitStruct;

NVIC_InitTypeDef NVIC_InitStruct;

//使能SYSCFG时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

//使能GPIOA

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

/*

...

*/

GPIO_Init(GPIOA, &GPIO_InitStruct);

//设置IO口与中断线的映射关系,必须分开写      

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource8);

/*

...

*/

EXTI_Init(&EXTI_InitStruct);

/*

...

*/

NVIC_Init(&NVIC_InitStruct);

}


u32 ir_pluse_high_time(void)

{

u32 t=0;

//while跳出条件低电平到来或者t > 250

while(PAin(8) == 1)

{

t++;

delay_us(20); //20微秒

if(t > 250)   //大于5ms数据异常  250*20 = 5000us

break;

}

return t;

}


//返回1数据帧正常,0数据帧异常

int pending(u32 ir_data)  //地址码(31~24) 地址反码(16~23)  控制码(8~15) 控制反码(0~7)

{

u8 addr1,addr2,data1,data2;

addr1 = ((ir_data>>24) & 0xff);

addr2 = ((ir_data>>16) & 0xff);

data1 = ((ir_data>>8) & 0xff);

data2 = (ir_data & 0xff);

if((addr1+addr2 == 0xff) && (data1+data2 == 0xff))

return 1;

else 

return 0;

}


void EXTI9_5_IRQHandler(void)

{

u32 t=0;

u32 ir_bit=0;

u8  ir_valed=0;

u32 ir_data = 0;

u8  ir_cunt=0;

//判断是否中断线8

if(EXTI_GetITStatus(EXTI_Line8) == SET)

{

while(1)

{

if(PAin(8) == 1)  //等待到高电平,过滤低电平 == if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 1)

{

//获取高电平时间

t = ir_pluse_high_time();

if(t>=250)

break;

//同步码头高电平时间在4ms~5ms

if(t>200 && t<250)

{

ir_valed = 1; //同步码头有效

continue;

}

//若高电平持续时间为400~1000us内则为数据位为0:  560us在400~1000us

else if(t>20 && t<50)

{

ir_bit = 0;  

}

else if(t>60 && t<90)//若高电平持续时间为1200~1800us内则为数据位为1:  1680us在1200~1800us

{

ir_bit = 1;

}

if(ir_valed)

{

//将位数据移到到ir_data

ir_data |= ir_bit<<(31-ir_cunt);

ir_cunt++;

if(ir_cunt >= 32)

if(pending(ir_data))

{

printf("ir_data = %#Xn",ir_data);

}

break;

}

}

}

}

}

//清除中断标志位

EXTI_ClearITPendingBit(EXTI_Line8);

}

在这里插入图片描述


关键字:STM32  红外遥控器  抗干扰 引用地址:STM32进阶-红外遥控器的应用详细步骤

上一篇:STM32进阶-DHT11传感器的应用详细步骤
下一篇:STM32进阶-超声波传感器的应用详细步骤

推荐阅读最新更新时间:2024-11-13 10:19

基于STM32设计的智能空调
一、项目背景 随着人们生活水平的不断提高,对居住环境的舒适度要求也越来越高。空调作为一种重要的家电设备,已经成为了现代家庭中必不可少的一部分。本文介绍了一种基于STM32的智能空调设计方案,可以自动地根据环境温度进行温度调节。 二、设计思路 2.1 整体构架 智能空调系统由温度检测传感器、微控制器、OLED显示屏、按键及直流电源等组件构成。传感器用于检测环境温度,通过微控制器进行处理后,将结果输出到OLED显示屏上展示。按键可根据需求调整预设阀值,切换模式等操作。 2.2 硬件设计 (1)温度检测传感器 选择DS18B20数字温度传感器作为本系统的温度检测器件。该传感器具有精度高,响应速度
[单片机]
基于<font color='red'>STM32</font>设计的智能空调
STM32时钟RCC详解(一)
1、时钟源 在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL 。 ①HSI 是高速内部时钟, RC 振荡器,频率为8MHz ; ②HSE 是高速外部时钟,可接石英 / 陶瓷谐振器,或者接外部时钟源,频率范围是4MHz – 16MHz ; ③LSI 是低速内部时钟,RC振荡器,频率为40KHz; ④LSE 是低速外部时钟,接频率为32.768KHz的石英晶体; ⑤PLL 为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL的输入可以接HSI/2、HSE或者HSE/2 。PLL倍频可选择为2 – 16倍,但是其输出频率最大不得超过72MHz。 其中,40kHz的LSI供独立看门狗IWDG使用
[单片机]
<font color='red'>STM32</font>时钟RCC详解(一)
stm32 iap 程序跳转进入硬件异常 hex合并
工作多年,常常觉得自己遇到的问题及解决办法,时间稍长,就容易遗忘,且没地方查。再者,经常看别人的文章,受益匪浅,自己也有些经验,却从来没有分享出来,深感惭愧。工作忙不是好借口,今日开始开博,不为别的,只为记录、备忘,以及解决其他人可能遇到的相同问题顺利找到解决办法。 问题: stm32f103ret6上做的IAP,仿真调试阶段没有遇到过问题,外场使用就发现不能跳转到app,且不同板子、不同isp等都可能出现这种问题 解决: 直觉上是有规律的,一直找规律,经过一天试验、跟踪、bin代码对比,终于发现bin的最后一部分代码没有成功写入flash。 进一步分析iap的bootloader程序,果然最后不够整页的代码写
[单片机]
STM32的中断优先级和库函数的 开、关总中断
一,中断优先级: STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决
[单片机]
什么是串口通讯?STM32中的串口通讯接口有哪些
所谓通信就是两种设备之间进行数据交互,从而传递大料的信息,因为通讯的存在,使得大量的数据有了传输通道,各种信息得到了汇总,方便了人们的生活 。MCU系统间常见的通讯方式有:RS232、RS422、RS485、LIN Bus、Bluetooth、Ethernte、wifi等,而大多数的通信接口都可以通过串口来扩展,所以对于单片机系统而言,只要掌握了串口,就掌握了大多数的通信方式,所以今天给大家介绍串口通信。 什么是串口通讯? 串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。 典型的串口通信使用3根线完成
[单片机]
什么是串口通讯?<font color='red'>STM32</font>中的串口通讯接口有哪些
STM32技巧: Keil错误提示“ File Not Found”
1、文件已添加到工程目录但提示“file not found” 原因:仅添加到目录但未包含编译文件的路径 解决: Option- C/C++- Include Paths,添加提示缺失的文件所在路径。错误提示消失。
[单片机]
<font color='red'>STM32</font>技巧: Keil错误提示“ File Not Found”
STM32开发笔记34:USB CDC驱动程序的详细移植过程
单片机型号:STM32F401 本文详细介绍USB CDC驱动程序的移植过程。 1、按照STM32F4 开发笔记8:解决USB CDC “该设备无法启动”问题介绍的过程生成驱动程序后,找到如下图所示的文件加入到自己的项目工程中。 2、打开usbd_cdc_if.c文件,可以看到其中有,如下4个函数,其中Init、DeInit和Control函数都不需要改变,关键是Receive函数。 static int8_t CDC_Init_FS(void); static int8_t CDC_DeInit_FS(void); static int8_t CDC_Control_FS(uint8_t cm
[单片机]
<font color='red'>STM32</font>开发笔记34:USB CDC驱动程序的详细移植过程
STM32最小系统硬件组成部分
STM32最小系统硬件组成 最小系统为单片机工作的最低要求,不含外设控制,原理简单,分析最小系统是STM32入门的基础。 组成: 电源 复位 时钟 调试/下载接口 启动 电源 3.3V的电源从这里接入,其中电容起到滤波的作用。 复位电路 当RESET引脚被拉低产生外部复位时,产生复位脉冲,从而使系统复位。 有三种复位方式: 上电复位 手动复位 程序自动复位 上电复位,在上电瞬间,电容充电,RESET出现短暂的低电平,该低电平持续时间由电阻和电容共同决定,需求的复位信号持续时间约在1ms左右,计算方式如下: t = 1.1RC(固定计算公式) 1.1*10K*0.1uF=1.1ms 手动复位:按键按下时,RESET与地导
[单片机]
<font color='red'>STM32</font>最小系统硬件组成部分

推荐帖子

新能源汽车电驱动系统研发,主机厂,需要对电机控制器芯片做选型
新能源汽车电驱动系统研发,主机厂,需要对电机控制器芯片做选型BEV纯电车型,电机220KW,控制器需要确认芯片,评估用那款好,我是新人,不知道行情,有没有大佬,提供一些主控芯片参考,哪家的,型号,接口信息等,非常感谢,有感兴趣的铁子,可以在评论区一起谈论新能源汽车电驱动系统研发,主机厂,需要对电机控制器芯片做选型这要根据你所用的电机类型和型号,不同的使用需求来看。既然是主机厂,你们有的资源应该很丰富才对。楼主,能麻烦科普一下主机厂,设计流程吗?先确定功能再找物料。还是根据现有
haocede 电机驱动控制(Motor Control)
运用阻抗调谐以最大限度地提高 5G 手机的天线性能
随着5G的到来,手机中的RF设计也日益愈加复杂,使得手机制造商更难满足严格的性能要求。由于手机包括更多天线,支持更多频段,在所有使用条件和频率下保持天线性能变得越来越具有挑战性。阻抗调谐器可在不同的条件下,在多个频段之间,最大限度地提高RF功率传输,能够帮助解决此问题。因此,阻抗调谐器越来越多地用于优化性能,降低设计成本并满足5G要求。本白皮书介绍如何使用阻抗调谐器,并讨论不同阻抗调谐器设计的相对优势。此外还通过多个示例,演示在典型的实际应用场景中如何使用阻抗调谐来显著改善性能
兰博 RF/无线
ADC采用外部参考电压好还是内部参考电压好?
例如,TI的ADS8472,16bit1MSPS差分输入ADC(http://www.ti.com.cn/product/cn/...earch-CN-Everything)内部拥有4.096V参考电压,也可以接外部参考电压假设我不需要改变参考电压的值,就使用4.096V如果使用外部参考电压,还需要至少添加一个参考电压芯片,而且PCB的线路肯定比ADC芯片内部的干扰要大那么使用外部参考电压好还是内部参考电压好呢?另外,很多ADC都是采用QFN封装,没有伸出的引脚这种封
zpccx 模拟电子
LWIP协议栈中一包数据最后是怎么发送出去了?(已经解决)
我想知道一包数据是怎么发送出去的。所以根据上图,我把对应的函数“tcp_write——tcp_enqueue——tcp_output——ip_output_if——netif-output”我看到“ip_output_if()”这个函数,最后调用了“netif-output”说这样就把数据发出去了。但是“netif-output”的定义是这样的。我想问的是“err_t(*output)(structne
dayup 微控制器 MCU
将剩余nor flash 划分分区问题
我的平台是PXA270+Wince6.0,32MIntelP30NORFlash使用MSFALH来将flash剩余容量利用起来,遇到了一些问题,也有一些疑问,请大家帮忙一下。如果使用RAM运行,分区划分成功,可正常显示盘符,也可以正常读写。但如果选择IMGFLASH写入flash后,fmd_driver一调用write_command命令读写flash就死机。造成没法启动。我查了很多资料,也参考了前辈大侠们的一些帖子,我现在的做法是:1、在catolog中加入MS
果果2012 嵌入式系统
关于二进制代码的烧写问题
请问用JATG口能烧写进二进制代码吗?如果不能,需要烧写二进制的时候,需要用到哪几根线?或者有哪几根线需要单独引出来?关于二进制代码的烧写问题不管用什么东东,写到ROM中的程序代码都是二进制 引用: 不管用什么东东,写到ROM中的程序代码都是二进制 偶的意思不是芯片内的二进制,偶是说不用源程序,而是烧写编译过的msp430.txt文件,用编程器的时候是否除了JATG不需要另外的引脚?感谢一楼、二楼!晕!
mpc 微控制器 MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved