一. 简介

最近在做项目的过程中,由于使用的是核心板,没有按键,尝试通过串口进行数据发送,进行控制,但是太麻烦了。于是想到了通过红外遥控进行控制。经济又实惠,还可以隔空远程操作,且只有一个数据线,YYDS。

欢迎关注 微信公众号 FPGA之旅 获取更多,所用资料将会第一时间发布在上面。


二. 红外遥控数据传输协议

不做过多的理论知识的简介,主要是为了教大家怎么使用。传输过程如下

  1. 空闲态 为 高电平
  2. 引导码 : 9ms的低电平 和 4.5ms的高电平
  3. 数据码: 数据码包括四个部分依次是用户码、用户反码、键码和键码反码,每个8位,共32位,560us的低电平加560us的高电平表示数据0,560us的低电平加1.68ms的高电平表示数据1
  4. 停止位:可以忽略,软件中可以不用管

依次按照对应的时间来检测就可以。

本次设计通过外部IO中断来进行红外数据的读取,低电平触发(空闲为高电平)。


三. 程序设计

  1. 定义好相关变量,RCC和GPIO
//红外遥控控制
#define InfraredGPIOPort        GPIOB
#define InfraredGPIOPin         GPIO_Pin_0
#define InfraredRCC_APB         RCC_APB2Periph_GPIOB
  1. GPIO初始化
void InfraredGPIOInit(void)//GPIO口初始化
{GPIO_InitTypeDef GPIOInitStruct;RCC_APB2PeriphClockCmd(InfraredRCC_APB | RCC_APB2Periph_AFIO ,ENABLE); //开启时钟  RCC_APB2Periph_AFIOGPIOInitStruct.GPIO_Pin = InfraredGPIOPin;GPIOInitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(InfraredGPIOPort,&GPIOInitStruct);
}
  1. 开启中断
    中断控制线可以根据自己的Pin来确定,如果是GPIO_Pin_8,那么这里就是EXTI_Line8.
void InfraredEXTIInit(void)//中断初始化
{EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//定义中断结构体变量//中断配置EXTI_ClearITPendingBit(EXTI_Line0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);  EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;       //子优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //使能NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
}
  1. 电平持续时间计数
    这里主要是对电平的出现时间进行一个计数
//计算低电平的持续时间
uint16_t InfraredRecvLowTime(void)
{uint16_t time = 0;while(GPIO_ReadInputDataBit(InfraredGPIOPort,GPIO_Pin_0) == 0){if(time >= 500)break;time +=1;delay_us(17);}return time;
}
//计算高电平的持续时间
uint16_t InfraredRecvHighTime(void)
{uint16_t time = 0;while(GPIO_ReadInputDataBit(InfraredGPIOPort,GPIO_Pin_0) == 1){if(time >= 250)break;time +=1;delay_us(17);}return time;
}
  1. 编写中断控制函数

通过数据的参数过程进行判断,就可以了。持续时间需要在一个范围内,可以自己测试后设置。

uint8_t InfraredDataRecv() //获取红外遥控数据
{uint16_t time;uint8_t i,j;uint8_t data[4] = {0};//获取引导码time = InfraredRecvLowTime();if(time < 400 || time >= 500)return 0x00;time = InfraredRecvHighTime();if(time < 150 || time > 250)return 0x00;//获取数据for(i = 0; i < 4 ; i++){for(j = 0 ; j < 8 ;j ++){time = InfraredRecvLowTime();if(time < 20 || time > 35)return 0x00;time = InfraredRecvHighTime();   //通过高电平的时间长短来判断数据0,1if(time < 35)   //数据0{data[i] <<= 1;data[i] |=0x0;}else{data[i] <<= 1;data[i] |= 0x1;}}}return data[2];
}
void EXTI0_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line0) != RESET){uint8_t data;data = InfraredDataRecv();if(data == InfraredLeft)KEYState = KEYLEFT;else if(data == InfraredRight)KEYState = KEYRIGHT;else if(data == InfraredUp)KEYState = KEYUP;else if(data == InfraredDown)KEYState = KEYDOWN;else if(data == InfraredReturn)KEYState = KEYRETURN;delay_ms(10);/*清除标志位 */EXTI_ClearITPendingBit(EXTI_Line0);}}

STM32接收红外遥控数据相关推荐

  1. STM32之红外遥控信号自学习实现

    文章目录 一.序言 二.硬件实现原理 三.软件实现自学习 一.序言 很早前就想实现这个红外遥控自学习的这个实验,用于来自己控制房子里如空调等红外遥控设备的自动化,NEC的标准到具体的产品上可能就被厂家 ...

  2. stm32解码红外遥控实验

    stm32解码红外遥控 红外遥控的简介 有关编程的解释 使用hal库进行红外遥控实验 红外遥控的简介 红外解码目前广泛使用的NEC Protocol的PWM(脉冲宽度调制)和Philips RC-5 ...

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

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

  4. 基于stm32的红外遥控

    内容分三个部分: (1)红外遥控协议 (2)硬件连接 (3)代码 1.红外遥控协议 红外遥控是一种无线.非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备 ...

  5. 用定时中断来接收红外遥控信号

    //====红外接收相关定义============================= #define IrDatHigh (P_IrRec == 1) //接收数据高 #define IrDatLo ...

  6. 红外线遥控c语言程序,红外遥控的C程序

    红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成. 引导码是告诉接收机准备接收红外遥控码.系统码是识别码,不同的遥控芯片有不同的误别 ...

  7. c语言红外解码程序,[转载]红外遥控和C语言51红外遥控解码程序设计实例

    什么是红外线?人的眼睛能看到的可见光按波长从长到短排列,依次为红.橙.黄.绿.青.蓝.紫.其中红光的波长范围为0.62-0.76μm:比红光波长还长的光叫红外线.红外遥控在生产和生活中应用越来越广泛, ...

  8. 红外遥控38KHz载波,收发调制解码工作原理

    关注+星标公众号,不错过精彩内容 作者 | sugar 转自 | MultiMCU EDU 红外遥控我们并不陌生,身边随处可见,最常见的就是家电中的红外遥控,那你知道其中的收发原理吗? 今天就来分享一 ...

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

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

  10. hx1838 红外遥控(1):接收时序的解码

    本文开发环境: MCU型号:STM32F103C8T6 IDE环境: MDK 5.27 代码生成工具:STM32CubeMx 5.6.1 HAL库版本:STM32Cube_FW_F1_V1.8.0 本 ...

最新文章

  1. 深度人脸识别:CVPR2020论文要点
  2. 华为Web示例(AC6005配置):直连二层组网隧道转发【AP+傻瓜交换机+AC+出口网关】
  3. eclipse java参数类型_JAVA第二天笔记--eclipse使用/数据类型转换
  4. 高级流程图_数据收集方法之流程图
  5. 对于以太坊的Solidity语言介绍
  6. 牛客18985 数字权重 (数学,快速幂)
  7. Linux ubuntu安装搜狗输入法
  8. 把VS Code打造成Java开发IDE,也挺爽!
  9. 【数据结构的魅力】008.图
  10. 【转载】asp.net core 入门
  11. Q102:光线追踪场景(1)——地球仪
  12. 英语学习网站超级大全(转载自豆瓣网)
  13. 12面魔方公式图解法_高手指教一下十二面魔方怎么拼?!十二面魔方公式新手图解...
  14. 极简OpenFoam编程
  15. 来张券呗 | 打造一款cps小程序《一》
  16. 计算机算法在生物信息学中的应用,引力场算法及其在生物信息学中的应用
  17. 移动双臂机器人仿真[0]--概述
  18. python 淘宝滑块验证_python selenium 淘宝滑块验证码 问题
  19. Win11怎么打开AMD显卡控制面板
  20. 【计算机网络】TCP/IP协议(DNS协议、IP协议、TCP协议、UDP协议、三次握手、四次挥手)

热门文章

  1. Jamovi 教程:比SPSS还好用的统计软件,强烈安利
  2. 随机信号分析基础——基础篇(数字特征)
  3. IDEA格式化js代码
  4. REST服务和RESTful API是什么
  5. 氪8号积木机器人编程_编程机器人怎么选?
  6. ios加密算法AES
  7. saas商业级的小程序商城(已开源)
  8. java rce漏洞原理_JXBrowser JavaScript-Java bridge 中的RCE漏洞
  9. enfp工具箱怎么用_小丸工具箱使用技巧详细图解,值得各位学习
  10. layer时间插件laydate