【STM32单片机_(HAL库)】4-5-2【定时器TIM】【感应开关盖垃圾桶项目】HC-SR04超声波模块实验

news2024/10/11 5:36:14

1.硬件

  • STM32单片机最小系统
  • HC-SR04超声波模块

2.软件

  • hcsr04驱动文件添加
  • main.c程序
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "hcsr04.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    led_init();                         /* 初始化LED灯 */
    uart1_init(115200);
    hcsr04_init();
    printf("hello world!\r\n");

    while(1)
    { 
        printf("dis: %.2f\r\n", hcsr04_get_length());
        delay_ms(1000);
    }
}


  • hcsr04.c程序
#include "hcsr04.h"
#include "delay.h"

TIM_HandleTypeDef tim2_handle = {0};

//定时器初始化函数
void tim2_init(void)
{
    tim2_handle.Instance = TIM2;
    tim2_handle.Init.Prescaler = 72 - 1;//定时器溢出时间计算
    tim2_handle.Init.Period = 65536 - 1;//根据超声波最大测距距离
    tim2_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
    tim2_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    HAL_TIM_Base_Init(&tim2_handle);
}

//msp函数
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM2)
    {
        __HAL_RCC_TIM2_CLK_ENABLE();
    }
}

void tim2_start(void)//定时器启动函数
{
    HAL_TIM_Base_Start(&tim2_handle);
}

void tim2_stop(void)//定时器关闭函数
{
    HAL_TIM_Base_Stop(&tim2_handle);
}

uint16_t tim2_get_cnt(void)//读取cnt计数值
{
    return __HAL_TIM_GetCounter(&tim2_handle);
}
void tim2_set_cnt(uint16_t val)//设置计数器值
{
    __HAL_TIM_SetCounter(&tim2_handle, val);
}

void hcsr04_gpio_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    //打开时钟
    TRIG_GPIO_CLK_ENABLE();//宏定义PB管脚时钟
    ECHO_GPIO_CLK_ENABLE();
    
    //初始化Trig引脚(输出引脚)
    gpio_initstruct.Pin = TRIG_PIN;//PB6
    gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;             
    gpio_initstruct.Pull = GPIO_NOPULL;                     
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           
    HAL_GPIO_Init(TRIG_PORT, &gpio_initstruct);
    
    //初始化Echo引脚(输入引脚)
    gpio_initstruct.Pin = ECHO_PIN;//PB7
    gpio_initstruct.Mode = GPIO_MODE_INPUT;             
    HAL_GPIO_Init(ECHO_PORT, &gpio_initstruct);
}

void hcsr04_init(void)
{
    tim2_init();
    hcsr04_gpio_init();
}

float hcsr04_get_length(void)
{
    uint16_t total_time = 0;
    float distance = 0;

    //1. Trig,给Trig端口至少10us的高电平
    TRIG_HIGH();//高电平
    delay_us(15);//延时15us
    TRIG_LOW();//低电平

    //2. Echo引脚,由低电平跳转到高电平,表示开始发送波
        //波发出去的那一下,开始启动定时器
    while(ECHO_STATUS() == GPIO_PIN_RESET);
    tim2_start();//启动定时器
    tim2_set_cnt(0);//清空计数器

    //3. Echo,由高电平跳转回低电平,表示波回来了
        //波回来的那一下,我们开始停止定时器,计算出中间经过多少时间
    while(ECHO_STATUS() == GPIO_PIN_SET);
    tim2_stop();//关闭定时器

    //4. 计算出中间经过多少时间
    total_time = tim2_get_cnt();//获取定时器中计数器值

    //5. 距离 = 速度(343m/s) * 时间 / 2
    distance = total_time * 0.01715;
    return distance;
}

在这里插入图片描述

  • sg90.h程序
#ifndef __HCSR04_H__
#define __HCSR04_H__

#include "sys.h"

//宏定义
#define TRIG_PORT                   GPIOB
#define TRIG_PIN                    GPIO_PIN_6
#define TRIG_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()
#define TRIG_HIGH()                 HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET)
#define TRIG_LOW()                  HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET)

#define ECHO_PORT                   GPIOB
#define ECHO_PIN                    GPIO_PIN_7
#define ECHO_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()
#define ECHO_STATUS()               HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN)

void hcsr04_init(void);
float hcsr04_get_length(void);

#endif


3.实物效果

  • 硬件模块接线
HC-SR04STM32
TrigPB6
EchoPB7
VCC5V
GNDGND

ST-Link下载方式

  • 实验现象
    通过USB转TTL串口模块,将STM32单片机与电脑连接,打开串口软件,设置波特率115200,可以看到串口打印处超声波模块所测量的距离。
    在这里插入图片描述
    请添加图片描述

HC-SR04超声波模块实验keil源文件

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

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

相关文章

OceanBase管理着工具-oat安装

https://www.oceanbase.com/softwarecenter-enterprise https://www.oceanbase.com/docs/enterprise-oat-doc-cn-1000000000762607 (base) [rootlnpg soft]# pwd /db/ob/soft (base) [rootlnpg soft]# ll 总用量 4274536 -rw-r--r-- 1 root root 1730447360 6月 26 14:06 oa…

『网络游戏』客户端发送消息到服务器【17】

将上一章服务器的协议PEProtocol的.dll文件重新生成导入unity客户端中 命名为Net 点击生成 另一种导入.dll文件方式 在客户端粘贴即可 此时Net文件夹的.dll文件就导入进来了 创建脚本:NetSvc.cs 编写脚本:NetSvc.cs 修改脚本:GameRoot.cs 在…

Spring源码:SpringBoot启动流程分析

目录 一、演示代码二、功能介绍三、代码分析1、从主启动类中调用run()方法出发2、看一下SpringApplication的构造方法在干什么?3、看下run()方法的主要流程代码4、run():启动计时器计算springboot启动时间5、run():创建DefaultBootstrapConte…

基于单片机的山林远程环境监测仪设计

本设计基于单片机的智能化的远程山林环境检测仪,该检测仪由硬件系统和软件系统构成。电源管理模块给整个硬件系统提供工作所需电源,系统可完成山林环境有关的温度、湿度、火焰和海拔高度的采集,并且可通过与按键设置阈值作对比判断危险情况&a…

C++ | Leetcode C++题解之第470题用Rand7()实现Rand10()

题目&#xff1a; 题解&#xff1a; class Solution { public:int rand10() {int a, b, idx;while (true) {a rand7();b rand7();idx b (a - 1) * 7;if (idx < 40) {return 1 (idx - 1) % 10;}a idx - 40;b rand7();// get uniform dist from 1 - 63idx b (a - 1)…

Halcon OCR字符识别

create_text_model_reader创建一个文本模型描述要用于分割的文本find_text. 的parameter value文本分段方法的值为自动和手动. 通常&#xff0c;参数模式应设置为自动因为这种模式更稳定&#xff0c;需要更少 配置工作量。请注意&#xff0c;在这种情况下&#xff0c;还有一个…

Redis Windows最新安装教程(2024.10.10)

文章目录 redis介绍下载地址 安装流程基础操作测试Redis常用的服务指令 redis介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、基于内存的数据结构存储系统&#xff0c;常用作数据库、缓存和消息中间件。Redis具有快速、灵活、可扩展和高可用性等特…

2024最新会声会影序列号及会声会影2023怎样添加画中画滤镜

深入简单直观的视频编辑&#xff01;使用 Corel VideoStudio会声会影2023&#xff0c;将您最美好的时刻和生活体验变成令人惊叹的电影&#xff0c;这是一款有趣且直观的视频编辑器&#xff0c;包含高级工具和高级效果会声会影2024免费下载。从自定义标题和过渡&#xff0c;到 M…

微服务(二)

目录 一、服务注册和发现 1、注册中心原理 2、nacos注册中心 3、服务注册 3.1 添加依赖 3.2 配置nacos 3.3 服务的发现 二、openfeign 1、快速入门 1.1 引入依赖 1.2 启用openfeign 1.3 编写openfeign客户端 2、连接池 2.1 引入依赖 2.2 开启连接池 3、 最佳实…

用godot4.3 C#开发一个APP登陆界面

一、下载godot godot 是一个游戏开发平台&#xff0c;可以用gd语言&#xff0c;这一个类似python,python程序员转gd很容易&#xff0c;也可以用C#开发。 https://godotengine.org/ 进行下载&#xff0c;下载 下载,net版本。当然mac也可以下载&#xff0c;linux上也有可以&#…

[含文档+PPT+源码等]精品基于Python实现的Django高校职业通的设计与实现

基于Python实现的Django高校招聘系统的设计与实现背景&#xff0c;主要源于以下几个方面的需求和趋势&#xff1a; 1. 就业压力的增加 随着高校毕业生数量的不断增加&#xff0c;就业压力日益加大。传统的招聘方式&#xff0c;如招聘会、报纸广告等&#xff0c;由于其信息传播…

C语言 | Leetcode C语言题解之第470题用Rand7()实现Rand10()

题目&#xff1a; 题解&#xff1a; // The rand7() API is already defined for you. // int rand7(); // return a random integer in the range 1 to 7int rand10() {while(true) {int index (rand7() - 1) * 7 rand7(); if(index < 40) return index % 10 1; } }

ThingsBoard规则链:Copy Keys节点详解

引言 复制键节点简介 用法 含义 应用场景 实际项目运用示例 智能农业监控系统 城市交通管理系统 结论 引言 ThingsBoard是一个功能丰富的物联网平台&#xff0c;它支持设备管理、数据收集与处理以及实时监控。其强大的规则引擎允许用户通过创建复杂的业务逻辑来自动处理…

探索高效的 PDF 拆分工具及其独特功能

当一份大型的PDF文档包含了多个不同主题或章节的内容时&#xff0c;将其拆分成独立的部分可以更方便我们的阅读、编辑和管理。接下来&#xff0c;让我们一起走进PDF拆分工具的世界&#xff0c;了解它们的功能和价值。 1.福昕PDF编辑器 链接一下>>https://editor.foxits…

6-基于TMS320C6678、FPGA XC5VSX95T的6U CPCI 8路光纤信号处理卡

1、板卡概述   本板卡由我公司自主研发&#xff0c;基于CPCI架构&#xff0c;符合CPCI2.0标准&#xff0c;采用两片TI DSP TMS320C6678芯片和Xilinx公司V5系列FPGA XC5VSX95T-1FF1136芯片。包含PCI接口、GMII的以太网接口、Nor Flash接口、8路SFP光 纤&#xff0c;4路RS232。…

Reqable小黄鸟抓包

搜索Reqable到官网进行下载 Windows端配置证书 可以直接自动安装&#xff0c;或者跟着内置的教程手动安装 下载安装安卓端并配置证书 配置证书有内置的教程跟着操作即可 手机协同配置 点击这个位置然后手机扫码就可以抓包了

网络安全知识|网安问答题|OSPF报文协议|抓包工具|路由器环路|序列化与反序列化|磁盘利用率|网络攻防

网络安全知识|网安问答题|OSPF报文协议|抓包工具|路由器环路|序列化与反序列化|磁盘利用率|网络攻防 作为网络工程师&#xff0c;怎么处理防火墙没网的问题&#xff1f; 检查防火墙规则&#xff1a;确保防火墙规则没有错误地阻止了网络访问。需要检查防火墙设置&#xff0c;特…

​ceph掉电后无法启动osd,pgs unknown

处理办法&#xff1a; 只有1个osd,单副本&#xff0c;掉电损坏osd&#xff0c;只能考虑重建pg&#xff0c;丢失部分数据了。生产环境务必考虑2&#xff0c;3副本设计。避免掉电故障风险。 掉电后osdmap丢失无法启动osd的解决方案 - 武汉-磨渣 - 博客园 https://zhuanlan.zhih…

C++ | Leetcode C++题解之第472题连接词

题目&#xff1a; 题解&#xff1a; struct Trie {bool isEnd;vector<Trie *> children;Trie() {this->children vector<Trie *>(26, nullptr);this->isEnd false;} };class Solution { public:Trie * trie new Trie();vector<string> findAllConc…

前端的全栈之路:基于 Vue3 + Nest.js 全栈开发的后台应用

☘️ 项目简介 Vue3 Admin 是一个前端基于 Soybean Admin 二次开发&#xff0c;后端基于 Nest.js 的全栈后台应用&#xff0c;适合学习全栈开发的同学参考学习。 &#x1f341; 前端技术栈&#xff1a; Vue3.5、Ant Design Vue、UnoCSS、Pinia &#x1f341; 后端技术栈&…