STM32控制HC-SR04超声模块获取距离

news2024/11/19 10:22:52

欢迎入群共同学习交流
时间记录:2024/5/23

一、模块介绍

(1)引脚介绍
VCC:电源引脚,接单片机3.3/5V
GND:电源地
Trig:超声信号触发引脚
Echo:超声信号接收引脚
(2)时序图
HC-SR04时序图
介绍:通过Trig触发引脚设置一个大于10us的TTL高电平,触发内部循环发送8个40KHZ的超声波,然后通过接收引脚判断接收信号高电平的持续时间,通过声速进行计算来回的距离,如果超过38ms仍未接收到回波也会触发高电平,此时电平持续时间最长

二、示例代码

(1)头文件

#ifndef __HCSR04_H__
#define __HCSR04_H__
#include "stm32f10x.h"

/**HC-SR04超声模块初始化*/
void Hcsr04_Init(void);
/**获取距离,单位CM*/
void vGetDistance(float *dis,float temp);

#endif

(2)源文件

#include "hc_sr04.h"
#include "delay.h"

//端口宏定义
#define Tring_GPIO GPIOB
#define Tring_PIN  GPIO_Pin_5
#define Echo_GPIO GPIOB
#define Echo_PIN GPIO_Pin_6

void Hcsr04_Init(void)
{
    //使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    
    /**初始化GPIO端口*/
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = Tring_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Tring_GPIO,&GPIO_InitStruct);
    
    GPIO_InitStruct.GPIO_Pin = Echo_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Echo_GPIO,&GPIO_InitStruct);
    
    /**初始化TIM2,进行计时*/
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
    TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStruct.TIM_Period=0xFFFF;
    TIM_TimeBaseInitStruct.TIM_Prescaler=72-1; //1us计数一次
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);

    TIM_Cmd(TIM2,ENABLE);//使能/开启定时器
}

void vGetDistance(float *dis,float temp)
{
    u16 time = 0;

    /**Tring引脚拉高10us的TTL电平,使模块发送超声波*/
    GPIO_SetBits(Tring_GPIO,Tring_PIN);
    vDelayUs(10);
    GPIO_ResetBits(Tring_GPIO,Tring_PIN);

    /*获取回波时间,高电平持续时间38ms为无回波时返回时间*/
    while(GPIO_ReadInputDataBit(Echo_GPIO,Echo_PIN) == 0);
    TIM_SetCounter(TIM2,0);
    while(GPIO_ReadInputDataBit(Echo_GPIO,Echo_PIN) == 1);
    time = TIM_GetCounter(TIM2);

    //计算距离
    *dis = time*(334.1+0.6*temp) / 20000;
    vDelayMs(5); //等待下一次开始,官方建议60ms采样周期,自己根据情况修改
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1683452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

热红外传感器

热红外传感器 一、热红外测温原理二、热红外传感器三、MLX90640-D55(MLX90640-BAB)测试 一、热红外测温原理 自然界中当物体的温度高于 绝对零度 时,由于它内部 热运动 的存在,就会不断地向四周辐射电磁波,其中就包含了波段位于0.75~100μm …

Unity Render入门

概述 在unity中渲染相关的组件是和Render关联的,比如我们常见的3D模型中的MeshRender,UI中的RenderCanvas等都是和Render相关联的,相信在unity的学习过程中,一定看到过非常多和Render相关的内容,那让我们学习一下这部…

Invoking “make cmake_check_build_system“ failed

前言: 在看过站内其他的方法且试过之后没奏效之后,偶然,无意间,随手整对了,然后后续在老赵的文档也找到了原因,对的上号,那在此我提出一种新的方法,且很简单的小tips。首先先来看看…

对列表进行统计和计算

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Python的列表提供了内置的一些函数来实现统计、计算的功能。下面介绍几种常用的功能。 (1)获取指定元素出现的次数 使用列表…

shell 脚本笔记2

3.env与set区别 env用于查看系统环境变量 set用于查看系统环境变量自定义变量函数 4.常用环境变量 变量名称含义PATH命令搜索的目录路径, 与windows的环境变量PATH功能一样LANG查询系统的字符集HISTFILE查询当前用户执行命令的历史列表 Shell变量:自定义变量 目标…

极光笔记|EngageLab AppPush引入全封装语音播报SDK

推送语音播报简介 语音播报是一种通知方式,在收到通知的时候,用户不用拿起手机查看,直接通过语音播报方式了解通知内容,节省时间提高工作效率。主要适用于商家交易收费通知,用户之间转账通知、公交车到站等场景。 语…

虚拟机安装Windows server 2022时蓝屏Boot Manager解决方案

文章目录 问题一、问题思路分析二、解决方案总结 问题 我在VMware虚拟机中安装Windows server 2022时无法正常安装,会进入Boot Manager界面 点击 Boot normally后过一会儿还会跳转到此页面 一、问题思路分析 简单的判断一下这是一个引导问题,那么可能是…

容器组件:栅格布局,侧边栏容器(HarmonyOS学习第四课【4.5】)

栅格布局 栅格布局可以为布局提供规律性的结构,解决多尺寸多设备的动态布局问题,保证不同设备上各个模块的布局一致性。 栅格容器组件,仅可以和栅格子组件(GridCol)在栅格布局场景中使用。 说明 该组件从API Version 9开始支持。后续版本…

Day35 代码随想录打卡|二叉树篇---二叉树的层序遍历

题目: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 方法:二叉树的层序遍历感觉是相对简单的,只需要定义一个队列,从根节点开始放入队列…

ArrayBlockQueue原理分析

1.简介 它是带有生产者-消费者模式实现的并发容器,同样用来解决高并发场景下多线程之间数据共享的问题。Arra不支持扩缩容,其容量大小在初始化时就已经确定好了,尽管字面意义上来看它属于阻塞队列的一种,但它同时还提供了一些非阻…

【python】python省市水资源数据分析可视化(源码+数据)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

leetCode-hot100-数组专题之区间问题

数组专题之区间问题 知识点:解决思路:例题56.合并区间57.插入区间253.会议室 Ⅱ485.无重叠区间 数组区间问题是算法中常见的一类问题,它们通常涉及对数组中的区间进行排序、合并、插入或删除操作。无论是合并区间、插入区间还是删除重复空间&…

Windows10安装Docker Desktop - WSL update failed

按照提示更新wsl后,仍然会报错,github上没有找到解决方法。版本28、29、30都会报这个错。 经过尝试,将docker内的设置中,采用wsl禁掉即可。如下图:

【C语言回顾】联合和枚举

前言1. 联合体1.1 联合体的声明1.2 联合体的特点1.3 联合体的使用 2. 枚举2.1 枚举的声明2.2 枚举的特点2.3 枚举的使用 结语 #include<GUIQU.h> int main { 上期回顾: 【C语言回顾】结构体 个人主页&#xff1a;C_GUIQU 专栏&#xff1a;【C语言学习】 return 一键三连;…

大数据技术原理(二):搭建hadoop伪分布式集群这一篇就够了

&#xff08;实验一 搭建hadoop伪分布式&#xff09; -------------------------------------------------------------------------------------------------------------------------------- 一、实验目的 1.理解Hadoop伪分布式的安装过程 实验内容涉及Hadoop平台的搭建和…

有史以来最大的苹果手机?iPhone 16屏幕模组大升级

随着科技的不断进步&#xff0c;用户对于手机屏幕的需求也在不断提高。从最初的触控体验到如今的高分辨率、高刷新率&#xff0c;屏幕技术的发展日新月异。而据最新的消息显示&#xff0c;即将到来的iPhone 16系列将在屏幕模组上进行一次重大升级&#xff0c;有望成为有史以来最…

建模:Maya

一、常用按键 1、alt 左键 —— 环绕查看 2、alt 中键 —— 拖动模型所在面板 3、空格 —— 进入三视图模式&#xff1b;空格 左键按住拖动 —— 切换到对应视图 二、骨骼归零 1、T Pose 旋转模式&#xff0c;点击模型&#xff0c;摆好T姿势即可 2、复制模型设置200距离…

c++ queue容器

在C标准库中&#xff0c;std::queue 是一个容器适配器&#xff0c;它提供了队列&#xff08;FIFO - First In First Out&#xff09;的数据结构。队列是一种特殊的线性数据结构&#xff0c;只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端…

做抖音小店找带货达人合作为什么不成功呢?

大家好&#xff0c;我是喷火龙。 做抖音小店&#xff0c;和带货达人合作的模式&#xff0c;流量是最稳定的&#xff0c;爆单几率也是最大的&#xff0c;也是最适合新手商家的&#xff0c;想和带货达人合作&#xff0c;那肯定是得让达人带你的产品的。 但有些朋友把样品寄给达…

【Linux】-Linux文件的上传和下载、压缩和解压[9]

目录 前言 一、上传和下载 1、使用finalshell对Linux系统进行上传下载 2、rz、sz命令 二、解压和压缩 1、压缩格式 2、tar命令压缩 3、tar命令压缩 4、zip命令压缩文件 5、unzip命令解压文件 前言 在Linux系统中&#xff0c;文件的上传和下载、压缩和解压是非常重要…