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

news2024/11/25 22:26:52

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/2202147.html

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

相关文章

k8s微服务

一 、什么是微服务 用控制器来完成集群的工作负载,那么应用如何暴漏出去?需要通过微服务暴漏出去后才能被访问 Service是一组提供相同服务的Pod对外开放的接口。 借助Service,应用可以实现服务发现和负载均衡。 service默认只支持4层负载均…

全网首创Windows Powershell 批量创建、重命名和拷贝文件夹和文件到指定目录

哈喽大家好,欢迎来到虚拟化时代君(XNHCYL)。 “ 大家好,我是虚拟化时代君,一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…(每天更新不间断,福利…

Redis 完整指南:命令与原理详解

目录 1. Redis 概述什么是 RedisRedis 应用场景 2. 安装与启动Redis 安装步骤源代码安装使用包管理器安装(以 Ubuntu 为例) 编译与启动命令编客户端连接 3. Redis 存储结构KV 存储结构数据结构类型String(字符串)List(…

selenium有多个frame页时的操作方法(5)

之前文章我们提到,在webdriver.WebDriver类有一个switch_to方法,通过switch_to.frame()可以切换到不同的frame页然后才再定位某个元素做一些输入/点击等操作。 比如下面这个测试网站有2个frame页:http://www.sahitest.com/demo/framesTest.h…

支付宝开放平台-开发者社区——AI 日报「10 月 10 日」

1 AI逆向绘画火了!一键重绘梵高《星空》,来自华盛顿大学 量子位|阅读原文 这项魔法来自华盛顿大学,项目名为Inverse Painting,相关论文已入选SIGGRAPH Asia 2024,其中两位作者还是东北大学(Bo…

车载SerDes历史和发展概述

1. 场景起源 1.1 原始时代: 在古老的很久很久以前,摄像头和显示屏等接口是多种多样的,丰富多彩的。大家各凭本事,各显神通,在各种地盘上成立各种帮派。比如CVBS、DVP、AHD、USB。 CVBS,包括后面的AHD&a…

【puppeteer】wvp-puppeteer制作 过程

、 制作 docker build -t dxw-pupet4 -f .\dockerfile2 . docker run -itd --name dxw4 -p 35105:35105 dxw-pupet4 推送到私库 docker tag dxw-pupet4:latest dualvenregistry:5000/wvp-puppeteer:v1.0 docker push dualvenregistry:5000/wvp-puppeteer:v1.0 重启桌面上…

2024.10.9 QT事件

1.思维导图 2.一个圆形根据wsad上下左右移动&#xff0c;超出界限则不移动。鼠标点击和双击事件测试。 1.main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();re…

JAVA《接口》

文章目录 一、接口是什么&#xff1f;1.1 接口的概念1.2 接口与类的相似点和区别1.3 接口的特性 二、接口的使用2.1 接口的实现2.2 实现多个接口2.3 接口之间的扩展(继承) 三、接口的使用实例3.1 Comparable接口3.2 Comparator接口3.3 Clonable接口3.3.1 使用Clonable接口3.3.2…

Linux——cp-mv-rm命令

cp命令 复制文件 cp test01.txt test02.txt 复制文件夹 cp -r hsy01 hsy02 mv命令 移动文件/文件夹 rm命令 删除文件 rm test.txt 删除文件夹&#xff08;目录 rm -r hsy01 通配符 * 匹配任意内容 注意* 位置 强制删除-f root超级管理员

数字化转型的深度解析:塑造未来企业的关键策略

在当今技术飞速发展的背景下&#xff0c;数字化转型&#xff08;_Digital Transformation_&#xff09;已成为企业保持竞争力的必要手段。随着云计算、物联网&#xff08;IoT&#xff09;、大数据和人工智能等技术的不断成熟&#xff0c;企业通过数字化手段优化业务流程、提升客…

ESXI 的下载 2024 版

ESXI 的下载 前言 最近收到了部分小伙伴的反馈&#xff0c;VMware 的下载官网上 ESXI 自动跳转进入了 BroadCom 的支持页面&#xff0c;难以找到 ESXI 的官方资源&#xff0c;这里我将为大家做出下载的相关指引。 ESXI 下载指引 跳转进入 BroadCom 的支持页面 &#x1f449; …

Python | Leetcode Python题解之第467题环绕字符串中唯一的子字符串

题目&#xff1a; 题解&#xff1a; class Solution:def findSubstringInWraproundString(self, p: str) -> int:dp defaultdict(int)k 0for i, ch in enumerate(p):if i > 0 and (ord(ch) - ord(p[i - 1])) % 26 1: # 字符之差为 1 或 -25k 1else:k 1dp[ch] max…

Web Service Sender ParseError Invalid byte 1 of 1-byte UTF-8 sequence

说明 发送webservice报错 Invalid UTF-8 start byte 0xfc when using Web Service Sender Web Service Sender error ERROR MESSAGE: Error creating web service dispatch com.sun.xml.ws.streaming.XMLStreamReaderException: XML reader error: javax.xml.stream.XMLStream…

k8s之ingress-nginx-controller安装

作者&#xff1a;程序那点事儿 日期&#xff1a;2024/01/30 01:25 要在master节点上安装 helm repo add ingress-nginx Welcome - Ingress-Nginx Controller helm search repo ingress-nginx helm pull ingress-nginx/ingress-nginx --version 4.4.2 mv ingress-nginx-4.4.…

为Floorp浏览器添加搜索引擎及搜索栏相关设置. 2024-10-08

Floorp浏览器开源项目地址: https://github.com/floorp-Projects/floorp/ 以下内容同样适用于firefox和大部分基于firefox的桌面版浏览器 1.第一步 为Floorp浏览器添加搜索栏 (1.工具栏空白处 次键选择 定制工具栏 (2. 把 搜索框 拖动至工具栏 2.添加搜索引擎 以添加 搜狗搜索…

Ubuntu 18.04安装storcli查看阵列信息

rootCeph03:/opt/MegaRAID/storcli# cat /etc/issue Ubuntu 18.04.5 LTS \n \l 准备好storcli的安装包 解压 解压之后可以看到 根据系统版本选择 把storcli_1.18.11_all.deb包传到服务器 使用命令dpkg -I storcli_1.18.11_all.deb ./storcli64 show ./storcli64 /c1 show …

Acwing 贪心算法遗留

1.Huffman树 Acwing 148.合并果子 实现思路&#xff1a;构建一颗哈夫曼树&#xff0c;求最短带权路径长度&#xff08;树中所有的叶结点的权值乘上其到根结点的路径长度&#xff09; 每次选择重量最小的两堆进行合并使用小根堆存储每一堆果子&#xff0c;每次两次弹出堆顶元…

ML 系列:机器学习和深度学习的深层次总结( 15) — KNN — 第 1 部分

一、说明 K-最近邻 (KNN) 算法是一种流行的监督机器学习算法&#xff0c;用于分类和回归任务。它是非参数惰性学习算法的一个典型例子。KNN 被认为是一种惰性学习算法&#xff0c;因为它在训练阶段不对底层数据分布做出任何假设&#xff0c;也不从训练数据中学习特定模型。相反…

uniapp开发 使用vscode代替hbuilderx开发工具

前言&#xff1a;最近接手了一个uniapp项目&#xff0c;很久没有使用hbuilderx了&#xff0c;用着实在难受&#xff0c;并且还总报奇奇怪怪的错误&#xff0c;首次运行要下载很多插件&#xff0c;搜索文件也用不习惯&#xff0c;加上很多鼠标操作&#xff0c;实在是太影响开发效…