0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F103驱动HCSR04超声波测距显示

jf_88434166 来源:jf_88434166 2026-04-11 16:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

目录

超声波模块介绍

超声波模块在电子DIY作品中实现小车避障测距等方面均应用广泛,在大学生智能车DIY爱好者中尤为显眼。

①实物图

1-主图.png

②产品说明

HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达3mm,包括发射器、接收器控制电路,它是一种压电式传感器,利用电致伸缩现象而制成。

电气参数

电气参数HCSR04超声波模块
工作电压DC5V
工作电流15mA
工作频率40KHz
最远射程4M
最近射程2cm
测量角度15°
输入触发信号10us的TTL脉冲
输出回响信号输出TTL电平信号,与射程成比例

④超声波工作原理

首先我们可以看下面的一张超声波的时序图:
在这里插入图片描述
图中我们可以大致看出,要使用HCSR04这个超声波模组,我们必须先给超声波发送一个触发信号,引导超声波内部循环发出8个40Khz的脉冲然后输出回响信号引脚上拉为高电平,然后我们利用超声波回响信号引脚的高电平所得计数时间经过相关运算就可以得到对应的距离,具体公式如下:
测试距离 = (高电平时间声速(340M/S)/2)= ((float)t/58.0)
这个公式的具体换算过程,大家可以用以前学过的知识进行还算下,最后得到的距离单位是厘米。
下面放一张超声波的引脚功能示意图,能更好的理解HCSR04的具体使用和接线在代码中:
在这里插入图片描述

驱动代码

之前写过用51单片机驱动HCSR04在LCD1602上的驱动代码,这篇文章我使用STM32驱动HCSR04在0.96OLED(使用人数较多并且开源初始化代码方便移植)上面使用的驱动代码。

①STM32配置初始化代码

时钟和GPIO以及中断相关配置:

void HCSR04_Init(void)
{  
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;     //定义定时器结构体
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
     
    //IO 初始化
    GPIO_InitStructure.GPIO_Pin = HCSR04_TRIG;       	//发送高点平引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	//推挽输出
    GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
    GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
     
    GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO;    	 //返回电平引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;	
    GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  
    GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);	
	 
	//定时器初始化使用基本定时器3
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   //打开TIM3定时器时钟

	TIM_DeInit(TIM3);
	TIM_TimeBaseStructure.TIM_Period = 65535; //(1000-1); //设置在下一个更新时间装入活动的自动重装载寄存器周期的值         计数到1000为1ms
	TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频  1M的计时频率 1US计数
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;	//不分频
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位	 
		
	TIM_ClearFlag(TIM3, TIM_FLAG_Update);   	//清除更新中断避免立即产生更新中断
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);    //启用计时器更新中断

	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;            	//设置中断服务
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  	//主优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         	//次优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        		//启用中断
	NVIC_Init(&NVIC_InitStructure);
	
    TIM_Cmd(TIM3,DISABLE);     
}

//定时器中断服务程序
void TIM3_IRQHandler(void)   //TIM3中斷
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM更新中断是否发生
    {
         TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIM更新中断标志位
         msHcCount++;
    }
}

①超声波驱动应用代码

下面展示写根据超声波时序图可以写出下面的驱动代码:

//开始计数
static void StartTimer()        //打开定时器
{
    TIM_SetCounter(TIM3,0);	//清除计数
    msHcCount = 0;
    TIM_Cmd(TIM3, ENABLE);  //启用TIM3外设
}
 
static void StopTimer() 	//关闭定时器外设
{
    TIM_Cmd(TIM3, DISABLE); //关闭TIM定时器外设
}
 
//获取计时器时间
float GetEchoTimer(void)
{
    u32 t = 0;
    t = msHcCount*1000;			//得到ms
    t += TIM_GetCounter(TIM3);	//得到us
	TIM3- >CNT = 0;  			//将TIM3定时计数器的寄存器清零
	delay_ms(50);
    return t;
}

②超声波距离计算代码

//取五次数据平均值,为了使测距所得到的值更加精确可采取多次测距的平均值来使用应用中
float HCSR04GetLength(void)
{
	u32 t = 0;
	int i = 0;
	float lengthTemp = 0;  
	float sum = 0; 	
	float distance;

	for(i=0;i< 5;i++){		
		
		TRIG_SEND = 1;      //发送高电平输出
		delay_us(20);
		TRIG_SEND = 0;
			
		while(ECHO_RECEIVE == 0); 	//等待接收高电平输出
		StartTimer();        	//打开计时器

		while(ECHO_RECEIVE == 1);
		StopTimer();        	//关闭计时器
		
		t = GetEchoTimer();     //获取时间,解析度为1US

		lengthTemp = ((float)t/58.2);	//cm
		sum = lengthTemp + sum ;
	}
	distance = 100*sum/5.0;
	return distance;
}

具体测试现象

本次使用OLED屏幕显示超声波所测距离并显示如下图所示:
在这里插入图片描述

总结

文章中使用的显示方式为0.96寸OLED模块显示,驱动MCU使用的为STM32F103C8T6,在使用HCSR04的过程中也可以自己根据HCSR04的驱动代码所得到的距离值去做其他的接口应用,例如做小车,或者其他测距案例均可移植使用,需要完整工程的可下方留言邮箱获取。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2848

    浏览量

    53429
  • 超声波
    +关注

    关注

    63

    文章

    3320

    浏览量

    146010
  • 测距
    +关注

    关注

    2

    文章

    115

    浏览量

    20856
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    求msp430f149与hcsr04程序,

    各位大神,我才学430不久,想做一个超声波测距,但是写的程序一直调试不出来,希望你们有这个程序的发给我一下,msp430f149与hcsr04程序,用12864
    发表于 06-18 00:14

    单片机hcsr04超声波对射测距

    求教,两个单片机相隔一段距离怎么通过hcsr04超声波模块和蓝牙来测距
    发表于 03-11 15:13

    基于STM32超声波测距设计的合集

    本文档的主要内容介绍的是STM32超声波测距设计的合集包括了的原始材料,原理图,程序和原理说明的详细资料概述合嵌入式处理器STM32F103超声波
    发表于 09-05 16:13

    基于STM32超声波测距设计

    基于STM32F103超声波测距(定时器)使用的硬件设备:stm32f103c8t6,0.96寸OLED,超声波模块HC-SR
    发表于 07-22 08:53

    STM32f103是如何驱动超声波测距模块

    STM32f103驱动超声波测距模块关键词:输入捕获 定时器 中断使用的超声波测距模块型号为US
    发表于 08-12 08:11

    浅析TM32F1系列超声波测距程序

    STM32F1系列超声波测距程序因为自己做毕设的缘故,用到超声波HCSR04模块,在网上查找了相关的代码,发现关于
    发表于 08-16 06:10

    STM32F103ZET6超声波测距hcsr04模块

    STM32F103ZET6超声波测距(hcsr04模块)实验一、硬件连线图接线描述:1.供电采+5V,我试了下+3V也是可以的2. 注意Trig引脚跟Echo引脚不要接错;二、hcrs
    发表于 08-24 07:36

    怎样去编写HCSR04模块超声波测距程序呢

    超声波测距原理是什么?怎样去编写HCSR04模块超声波测距程序呢?
    发表于 11-17 06:45

    STM32F103超声波HCSR04模块串口输出距离代码分享

    STM32F103超声波HCSR04模块串口输出距离代码分享
    发表于 12-14 08:01

    超声波HCSR-04驱动及开发讲解

    文章目录1、超声波HCSR-04驱动及开发本次的超声波主要是用于测试小车前方与障碍物之间的距离的,本次主要是通过获取到超声波的距离后,然后
    发表于 01-05 07:32

    基于单片机的HCSR04超声波测距传感器设计有哪些注意事项

    基于单片机的HCSR04超声波测距传感器设计有哪些注意事项?
    发表于 01-20 06:52

    超声波HCSR04模块的工作原理是什么

    代码是基于STC89C52RC单片机芯片写的,有些地方引脚定义不同根据情况更换即口HCSR04模块超声波HCSR04模块的工作原理其实还是较为简单的,我们只需要通过IO口给超声波模块的
    发表于 03-02 07:20

    用lcd1602显示超声波hcsr04测出的距离

    单片机stm32发送消息启动HCSR04超声波模块发出超声波超声波模块通过测量发出超声波和接收
    发表于 09-22 07:26

    使用STM32F103单片机实现超声波测距OLED显示的设计程序和电路图

    本文档的主要内容详细介绍的使用使用STM32F103单片机实现超声波测距OLED显示的设计程序和电路图及工程文件免费下载
    发表于 11-09 08:00 47次下载
    使用<b class='flag-5'>STM32F103</b>单片机实现<b class='flag-5'>超声波</b><b class='flag-5'>测距</b>OLED<b class='flag-5'>显示</b>的设计程序和电路图

    使用HCSR04超声波传感器DIY测距

    电子发烧友网站提供《使用HCSR04超声波传感器DIY测距仪.zip》资料免费下载
    发表于 11-16 09:33 3次下载
    使用<b class='flag-5'>HCSR04</b><b class='flag-5'>超声波</b>传感器DIY<b class='flag-5'>测距</b>仪