stm32---红外接受

2023-05-16

一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms( 560us 脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms(560us 脉冲+560us 低电平)。而红外接收头在收到脉冲的时候为低电平,在没有脉冲 的时候为高电平,这样,我们在接收头端收到的信号为:逻辑 1 应该是 560us 低 +1680us 高,逻辑 0 应该是 560us 低+560us 高。
所以可以通过计算高电平时 间判断接收到的数据是 0 还是 1。

hongwai.c

#include "hongwai.h"
#include "systick.h"

u32 Hong_Data;  //红外线接受的数据
u8 Hong_Flag; //接受是否完成

/*****************************************************************
函数名:Hongwai_Init() 
函数功能:红外初始化
输入:无
输出:无
****************************************************************/
void Hongwai_Init()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
    GPIO_Init(GPIOG,&GPIO_InitStructure);
    
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource15); //选择GPIO管脚用作外部中断线路,重映射
    EXTI_ClearITPendingBit(EXTI_Line15);
    
    EXTI_InitStructure.EXTI_Line = EXTI_Line15;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/*****************************************************************
函数名:Hig_Cou() 
函数功能:高电平时间判别函数
输入:无
输出:8位的时间判别参数
****************************************************************/

u8 Hig_Cou()
{
    u8 t=0;
    if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15))
    {
        t++;
        delay_us(20);
        if(t>=250) return t;
    }
    return t;
}

/*****************************************************************
函数名:EXTI15_10_IRQHandler()
函数功能:中断服务函数,进行解码并存储
输入:无
输出:无
****************************************************************/

void EXTI15_10_IRQHandler()
{
    u8 tim;  //高电平时间参数变量
    u8 ok;   //引导码有效变量
    u8 data; //接受高低电平
    u8 num;  //接受次数
    
    while(1)
    {
        if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15)==1)
        {
            tim = Hig_Cou();  //获取高电平时间
            if(tim>=250) break;
            if(tim<250&&tim>200) ok = 1;  //引导码有效
            if(tim<90&&tim>70) data = 1;  //接受是高电平
            else if(tim<40&&tim>15) data = 0;   //接收是低电平
            
            if(ok)  //引导码有效
            {
                Hong_Data <<=1;  //移位
                Hong_Data+=data; //把数据存入Hong_Data
            }
            
            if(num>=32)  //32位4字节都接受完
            {
                Hong_Flag = 1;  //传输完
                break;
            }
            num++;
        }
        EXTI_ClearITPendingBit(EXTI_Line15);
    }
}

hongwai.h

#ifndef _hongwai_H
#define _hongwai_H

#include "system.h"

extern u32 Hong_Data;
extern u8 Hong_Flag;
void Hongwai_Init(void);
u8 Hig_Cou(void);

    
#endif

main.c

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "hongwai.h"

int main()
{
    u8 i=0;
    
    SysTick_Init(72);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
    LED_Init();
    USART1_Init(9600);
    Hongwai_Init();
    while(1)
    {   
        if(Hong_Flag==1)//接受完成
        {
            Hong_Flag=0; //清空标志位,供下次使用
            printf("发红外接收码是:%.8X\r\n",Hong_Data);
            Hong_Data=0;//清空数据供下次使用
        }
        
        i++;
        if(i%20==0)
        {
            led1=!led1;
        }
        
        delay_ms(10);
            
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32---红外接受 的相关文章

  • 5-字符串

    1 字符串基础 1 1 定义字符串 通过String构造函数构造的字符串与字符串直接量的类型不同 前者为引用对象 xff0c 后者为值类型的字符串 span class token keyword var span s1 span clas
  • 没有Android SDK选项的解决办法+修改Android Studio中的Sdk路径

    安装教程 安装Android Studio时没有Android SDK选项 xff0c 可以先不管 xff0c 继续安装 注意在安装的过程中 xff0c 应该在最后一步install时 xff0c 会出现一个sdk的位置 比如我的在C Us
  • Android Studio一直在Download https://services.gradle.org/distributions/gradle-5.4.1-all.zip的解决方法

    Android Studio的新建工程下面一直出现Download https services gradle org distributions gradle 5 4 1 all zip 解决方法 xff1a 去https service
  • TDEngine 集群安装 (K8S)

    1 构建镜像 1 1 entrypoint sh span class token shebang important bin bash span span class token builtin class name set span 4
  • 设置Android Studio中的模拟器

    怎么设置Android Studio中的模拟器 xff0c 下面记录一下大概流程 然后自己选择设备 xff0c next 下好了之后next 建立后可能会出现以下图片所示问题 位于 的ADB二进制文件已过时 xff0c 并且在Android
  • 算法题算法题!!!!

    0223 思路 xff1a 先计算出老板没控制自己的情绪时的满意数量sum xff0c 再根据X的值 xff0c 维护一个滑动窗口 xff0c 遍历grumpy数组 xff0c 计算增加的满意数量add xff0c 选取最大的一个 xff0
  • MongoDB使用教程

    1 下载 xff1a https www mongodb com try download community 2 安装 解压下载包后正常步骤安装 创建服务 e Application develop MongoDB bin为路径 data
  • 动态规划几个例题!!

    动态规划法 xff01 xff01 xff01 dp i j 61 true表示字符串从下标 i 到下标 j 的位置是一个回文子串 xff08 所谓的状态转移 xff09 span class token keyword var span
  • 小白自学PIX飞控学习笔记

    小白自学飞控学习笔记 xff08 三 xff09 飞控开发准备工作准备阶段Misson Planner 高端操作 飞控开发准备工作 准备阶段 地面站电脑上安装mission planner 校准你的飞行器 Pixhawk指示灯的含义 红灯和
  • 线程同步的四种方式

    原文链接 xff1a https blog csdn net qq 40261882 article details 100538711 1 临界区 xff1a 通过对多线程的串行化来访问公共资源或一段代码 xff0c 速度快 xff0c
  • 分卷压缩与解压分卷

    分卷压缩与解压分卷 分卷压缩 名词解释 分卷压缩 分卷压缩操作 应用场景 解压分卷 解压踩坑 解压操作 nbsp nbsp nbsp nbsp 之前有写过一篇关于 Cesium 加载OSGB倾斜摄影三维模型 的文章 对OSGB模型的特点和文
  • C++输出到.txt文档,并被python读取

    C 43 43 中 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 in
  • 主流消息中间件及选型

    应用最为广泛的三大消息中间件 xff1a RabbitMQ RocketMQ kafka 在传统金融机构 银行 政府机构等有一些老系统还在使用IBM等厂商提供的商用MQ产品 选取原则 1 首先 xff0c 产品应该是开源的 开源意味着如果队
  • K8S Core-DNS

    1 Kube dns 1 1 概述 KubeDNS 由三部分构成 xff1a kube dns xff1a 核心组件 KubeDNS xff1a 依赖 client go 中的 informer 机制 xff0c 监听 Service 和
  • 什么是Batch,什么是Epoch?在训练模型的时候经常看到的参数,自己的见解。

    1 首先我们要大概了解一下什么是梯度下降法 xff1a 梯度下降法的基本思想可以类比为一个下山的过程 假设这样一个场景 xff1a 一个人被困在山上 xff0c 需要从山上下来 找到山的最低点 xff0c 也就是山谷 但此时山上的浓雾很大
  • mavlink协议发送与接收--串口版

    mavlink官网 MAVLINK现分为两个版本V1和V2 xff0c 区别是V2的MsgId扩展到24位 xff0c V1只有8位 xff08 0 255 xff09 原理都是差不多的 xff0c 这里以V1为例 xff0c V2也实际测
  • 转载-关于VDDA、VSSA 、参考电压的问题

    在小于等于64Pin的芯片中 xff0c 在芯片的内部Vref 43 是和VDDA连接在一起的 xff0c 也就是说ADC的是以VDDA为参考电压的 那么还有一点需要注意的就是VDDA和VDD的压差必须小于300mV xff0c 否则可能由
  • wsl,Ubuntu,关于解决 mysql-server : 依赖: mysql-server-5.7 但是它将不会被安装 问题

    出现问题 xff1a 安装mysql时 xff0c sudo apt span class token operator span get install mysql span class token operator span serve
  • jQuery-获取/设置 属性(标准属性,自定义属性)和内容

    一 获取 设置内容 text 设置或返回元素的文本内容 xff1b html 设置或返回元素的内容 xff08 包括html标记 xff09 xff1b val 设置或返回表单字段的值 具体例子如下 xff1a 控制台调试 34 Dcoun
  • idea--java开发最常用快捷键

    复制行 xff1a ctrl 43 d 删除行 xff1a ctrl 43 y 将某行代码向下移动 xff1a ctrl 43 shift 43 将某行代码向上移动 xff1a ctrl 43 shift 43 向下插入新行 xff08 e

随机推荐

  • 数据同步之初识Canal

    git地址 xff1a 阿里巴巴Canal的Git地址 Canal基于日志增量订阅和消费的业务包括 xff1a 数据库镜像 数据库实时备份索引构建和实时维护 拆分异构索引 倒排索引 业务cache刷新 带业务逻辑的增量数据处理 Mysql
  • SpringBoot整合Shiro登录认证和授权(附demo)

    SpringBoot整合Shiro登录认证和授权 废话不多说 xff0c 直接上代码 xff1a 代码有点多 xff0c 想直接拿demo的直接拉到底 开发环境 xff1a JDK1 8Maven 3 5 3IntelliJ IDEAMyS
  • QGroundControl 4.0 地面站使用

    QGroundControl 4 0 地面站使用 飞行界面 总览 xff1a 飞行控制栏 xff1a 在飞行界面与任务规划界面间进行切换控制飞机起飞和降落暂停或者重启当前的操作 xff08 比如降落或者规划的任务 xff09 控制飞机安全返
  • 改变PX4飞控通过MAVLink发送IMU数据的频率

    改变PX4飞控通过MAVLink发送IMU数据的频率 参考 xff1a https docs px4 io master en middleware mavlink html 在QGC的MAVLink Console中执行命令 xff1a
  • K8S Calico

    1 概述 Calico是一个基于 BGP 的纯三层网络方案 它在每个计算节点都利用 Linux kernel 实现了一个高效的虚拟路由器 vRouter 来进行数据转发 每个 vRouter 都通过 BGP 协议将本节点上运行容器的路由信息
  • QT读取XML

    读取XML 1 读取根节点 xff1a QDomElement root 61 doc documentElement 2 读取第一个子节点 xff1a QDomNode node 61 root firstChild 3 读取下一个子节点
  • C++基础入门学习笔记

    C 43 43 基础入门 1 1 hello world include lt iostream gt using namespace std int main cout lt lt 34 Hello world 34 lt lt endl
  • Android的Handler的简单理解和使用

    简单来说 xff0c Handler就是用来传递消息的 Handler可以当成子线程与主线程的消息传送的纽带 在安卓开发中 xff0c 在子线程中无法刷新UI xff0c 是因为UI在子线程中刷新的话 xff0c 是不安全的 xff0c 就
  • 使用datax-web把oracle数据库中的数据导入到mysql

    一 所需环境 Windows系统电脑 Python2 7 18 xff08 需要配置环境变量 xff09 oracle环境 mysql环境 jdk1 8 navicat git python安装下载 https www python org
  • 自己动手做后端(三)用户登录系统

    前言 用户登录系统 xff0c 最简单的解释是将用户账号和密码传输到后端 xff0c 后端将传过来的账号和密码信息与数据库进行比对 xff0c 如果正确则登陆成功 这一简单的描述可以概况绝大部分用户登录系统 xff0c 但是真正实现的时候
  • 单片机小白学习之路(十五)---定时器和计数器的理解(一)

    目标 xff1a 定时器和计数器的理解 一 1 定时器 计数器简介 定时器 计数器 xff08 Timer Counter xff0c 简称T C xff09 是单片机中最基本的接口之一 即可以定时又可以计数 常用于计数 延时 测量周期 脉
  • stm32---ADXL345

    ADXL345是一款三轴加速度传感器 xff0c 广泛用于手机 游戏手柄等设计 ADXL 支持标准的 I2C 或 SPI 数字接口 xff0c 自带 32 级 FIFO 存储 xff0c 并且内 部有多种运动状态检测和灵活的中断方式等特性
  • HZ和秒之间换算

    Hz和毫秒不能直接换算 xff0c 两者是交流电频率与周期的关系 xff0c 并且是倒数关系 xff1a 周期T 61 1 100 61 0 01秒 61 10毫秒 100Hz即100次 秒 xff0c 即60x100 60秒 xff0c
  • 野火 FireConfig 从SD卡下载镜像到EMMC

    1 用balenaEtcher把镜像下载到SD卡 2 拨码到SD卡启动 3 用MobaXterm当串口终端 xff0c 选择115200 xff0c 取消硬件流 4 输入用户名cat 密码fish 5 输入sudo fire config
  • K8S 网络策略

    1 网络策略 NetworkPolicy 是一种以应用为中心的结构 xff0c 允许你设置如何允许 Pod 与网络上的各类网络 实体 通信 xff0c 在 IP Port L3 L4 层面控制网络流量 xff0c 用于隔离应用以减少攻击面
  • VCC、VDD、VSS以及VBAT的区别

    原链接 xff1a https blog csdn net LemonLeeB article details 99417945 在STM32 的学习中 xff0c 发现有几种看起来相关的名称 xff0c 分别是VCC VDD VSS VB
  • LWIP_MDNS

    一 xff0e mdns1 什么是mdns xff1f mDNS协议适用于局域网内没有DNS服务器时的域名解析 xff0c 设备通过组播的方式交互DNS记录来完成域名解析 xff0c 约定的组播地址是 xff1a 224 0 0 251 x
  • 组播IGMP

    一 xff0e 什么是组播 xff1f 1 一个发送 组播源 xff0c 多个接收 xff0c 接收的有个特点就是在同一个组播组里面 xff0c 组播组有自己的IP 2 对于组播源来说 xff0c 发送命令到组播IP等于把命令发送到所有组成
  • 单片机小白学习之路(四十三)---LCD12864液晶显示

    目标 xff1a LCD12864原理的理解 1 LCD12864简介 LCD12864可以用来显示字符 数字 汉字 图形等内容 xff0c 其分辨率是128 64点 意思是横着有128个点 xff0c 竖直方向有64点 LCD12864
  • stm32---红外接受

    一个脉冲对应 560us 的连续载波 xff0c 一个逻辑 1 传输需要 2 25ms xff08 560us 脉冲 43 1680us 低电平 xff09 xff0c 一个逻辑 0 的传输需要 1 125ms xff08 560us 脉冲