HC-SR04超级简单教程(快速入门)

这篇具有很好参考价值的文章主要介绍了HC-SR04超级简单教程(快速入门)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、模块介绍(个人理解)

        1.简单理解

        2.该模块的参数

二、HC-SR04的操作

三、代码

        1.代码前的注意事项

        2.关键代码

四、代码实战效果图

 五、结束


一、模块介绍(个人理解)

        1.简单理解

        HC-SR04是一个超声波测距模块,通过发出超声波然后接收超声波,利用这个往返时间算出距离的模块。

HC-SR04超级简单教程(快速入门),模块使用教程,单片机,stm32,嵌入式硬件

HC-SR04模块 (实物图)

        2.该模块的参数

HC-SR04超级简单教程(快速入门),模块使用教程,单片机,stm32,嵌入式硬件

   参数图 

二、HC-SR04的操作

        HC-SR04的操作相对其他模块来说还是很简单的。首先该模块有四个口VCC、Gnd、Trig、Echo,并不多。在模块工作的时候,先要给Trig口拉高电平至少10us,然后Echo口会返回一个高电平信号,同时发射超声波。在HC-SR04接收到发出去反射回来的声波后,会给一个低电平。至此,一次检测就完成了。我们可以用定时器在发射声波时开始计数,等到接收声波后,停止计数。这样我们就有了时间。但是这个是往返时间,我们要除2,声音的传播速度时340m/s(这里暂时不考虑其他因素的影响)。有了时间和速度,路程就可以算出来了。我的代码会有详细的介绍,这部分内容。

三、代码

        1.代码前的注意事项

               1) 如果你的HC-SR04不能够回应你的单片机发送的信号,可能就是该模块有问题。

               2)下面代码我是看了很多博主的,才写下来的,相对来说比较简单。移植性比较好,没 有在文件外定义有什么变量。

               3)本人用stm32单片机的,型号是stm32f103c8t6 。

               4)代码的解释非常详细,可以结合上面的操作过程看。特别是在操作模块的那个函数的代码。

               5)代码在计算阶段并没有对(温度等)影响做修正,也没有取多次距离再取平均数。大家可以自己加上去,毕竟这个是最低门槛的写法了。

        

        2.关键代码

HC-SR04.h

#ifndef _HC_SR04_H
#define	_HC_SR04_H

uint32_t Get_Timer(void);
static void OpenTIM2();
static void CloseTIM2();
void HC_SR04_Init();
void HC_SR04_GPIO_Init();
void HC_SR_04_TIME_NVIC_Init();
float Get_Length();

#endif

HC-SR04.c


#include	"stm32f10x.h"
#include	"Delay.h"
#include 	"OLED.h"

#define RCC_GPIO	RCC_APB2Periph_GPIOB
#define GPIOx 		GPIOB
#define trigGPIO 	GPIO_Pin_6
#define echoGPIO 	GPIO_Pin_7


//给毫秒ms计数
uint16_t count = 0;

//GPIO口的初始化
void HC_SR04_GPIO_Init(){
    //定义结构体
    GPIO_InitTypeDef GPIO_InitStruct;
    //开启GPIOB RCC时钟
    RCC_APB2PeriphClockCmd(RCC_GPIO,ENABLE);

    //对结构体成员赋值
    //发送GPIOB6 模式为推挽输出 trig
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin =  trigGPIO;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_ResetBits(GPIOx,trigGPIO);   //设置默认为低电平 高电平会触发HC-SR发射超声波

	GPIO_Init(GPIOx,&GPIO_InitStruct);
	
    //返回GPIOB7 模式设置为浮空输入(因为该GPIO口需要被外设改变电平)
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStruct.GPIO_Pin =  echoGPIO;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_ResetBits(GPIOx,echoGPIO);   //设置默认低电平

    //初始化GPIO外围设备    echo
    GPIO_Init(GPIOx,&GPIO_InitStruct);
}

//初始化定时器
void HC_SR_04_TIME_NVIC_Init(){

    //定义定时器的结构体
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

    //NVIC结构体
    NVIC_InitTypeDef NVIC_InitStructure;

    //开启TIM2
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

    //将TIMx外围寄存器反初始化为其默认重置值。
    TIM_DeInit(TIM2);

    //设置在下一个更新事件装入活动的自动重装载寄存器周期的值,计数到1000为1ms
    TIM_TimeBaseInitStructure.TIM_Period = 1000-1; 	

    //设置用来作为TIMx时钟频率除数的预分频值  1M的计数频率 1US计数				
    TIM_TimeBaseInitStructure.TIM_Prescaler =72-1;

    //不分频					
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;	

    //TIM向上计数模式		
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

    //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx TimeBase Unit外设  	
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); 

    //打开定时器的更新中断
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
    //选择串口1中断
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;           	  

    //抢占式中断优先级设置为1
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     

    //响应式中断优先级设置为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            

    //使能中断
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               
    NVIC_Init(&NVIC_InitStructure);

    //先关掉定时器,先不让它计时
    TIM_Cmd(TIM2,DISABLE); 
}

void HC_SR04_Init(){
    HC_SR04_GPIO_Init();
    HC_SR_04_TIME_NVIC_Init();
}

//打开定时器
static void OpenTIM2()        
{
        TIM_SetCounter(TIM2,0);			//清除计数
        count = 0;
        TIM_Cmd(TIM2, ENABLE);  		//使能TIM2外设
}

//关闭定时器
static void CloseTIM2()        
{
        TIM_Cmd(TIM2, DISABLE);  //使能TIM2外设
}
 
 

//TIM2定时器的中断函数
void TIM2_IRQHandler(void)   
{
        //检查是否是更新中断位
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) 
        {
            //清除标志位	清除TIMx的中断挂起位
            TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  
            count++;
        }
}
 

//获取定时器时间
uint32_t Get_Timer(void)
{
        uint32_t t = 0;

        //此处t为us
        t = count*1000;	

        //TIM_GetCounter 获取TIM2计数器值
        t += TIM_GetCounter(TIM2);
        //将TIM2计数寄存器的计数值清零  
        TIM2->CNT = 0;  					  
        delay_ms(50);
        return t;
}
 
 float Get_Length(){
    
	 
    //存储时间
    float t = 0,length = 0;
    
    // 1. 先将trig置位(设置为高电平)
    GPIO_SetBits(GPIOx,trigGPIO);

    // 2. 持续时间至少要10us    这里我就给20了
    Delay_us(20);

    // 3. 然后需要将trig位清零(也就是设置为低电平)
    GPIO_ResetBits(GPIOx,trigGPIO);
	 
    // 4. 等待 HC-SR04 将echo置位(也就是高电平),如果置位了就开始发出声波了,我们要开始计时
    //      这里用GPIO_ReadInputDataBit 是读取GPIO的输入
    while (GPIO_ReadInputDataBit(GPIOx,echoGPIO) == RESET){
	
	};
    // 5. 打开定时器 开始计时
    OpenTIM2();
	
	
    // 6. 等待 HC-SR04 将echo清零(也就是低电平),如果清零了就是收到了声波
    while (GPIO_ReadInputDataBit(GPIOx,echoGPIO) == SET);
    
	
    // 7. 关闭定时器 停止计时
    CloseTIM2();

    // 8. 获取时间,因为是us(微秒),我们要转化为ms(毫秒)所以除1000
    t = Get_Timer() / 1000.0;

    // 9. 计算长度cm(厘米)
    //      声音在空气中传播的速度是340m/s,我们转换一下就是 34cm/ms
    length = t*34.0;

    // 10. 返回长度,因为是一个往返我们要除2
    return length/2;
 }


main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "HC_SR04.h"

// 不需要的头文件就不用就好了
int main(void)
{
	float length = 0;

	OLED_Init();

	HC_SR04_Init();
	
	while (1)
	{
		OLED_ShowString(1, 1, "kiana");
		length = Get_Length();
		Delay_ms(500);
		OLED_ShowSignedNum(2,1,length,3);
	}
}

四、代码实战效果图

        这里对齐不好固定,我就大概来一下大概的了哦。

HC-SR04超级简单教程(快速入门),模块使用教程,单片机,stm32,嵌入式硬件

效果图

 五、结束

        为了美好的明天继续奋斗吧!文章来源地址https://www.toymoban.com/news/detail-597566.html

到了这里,关于HC-SR04超级简单教程(快速入门)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【arduino】HC-SR04超声波测距模块的驱动与使用

    超声波是振动频率高于20KHZ的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等特点应用广泛,适合大学生、工程师、技术人员以及电子爱好者等操作。 首先超声波测距模块长这个样 硬件名称:HC-SR04超声波传感器 工作电压:直流(DC):

    2024年02月09日
    浏览(55)
  • 【CubeMX配置STM32驱动超声波模块(HC-SR04)】

    一、CubeMX配置STM32 1、选择定时器 选择 输入捕获模式 预分频设置为71,向上计数,自动重装值65535 然后将名字改为 ECHO 2、配置TRIG口 这里的端口使用其它空闲的IO口是可以的,设置为输出模式,其它配置不需要改变,最主要的是 User Label 那儿,需要设置为 TRIG ,因为驱动函数里

    2024年02月02日
    浏览(57)
  • 超声波测距模块HC-SR04详解(基于51单片机)

    本篇文章是个人整理的包含超声波测距模块HC-SR04的基本介绍与基本工作原理以及分别通过LCD1602、数码管和串口显示距离的实例讲解与代码的笔记,部分内容来自《HC-SR04超声波测距模块说明书》,代码使用模块化编辑,部分模块来自江科大自化协的51单片机教学视频。 希望大

    2023年04月16日
    浏览(51)
  • HC-SR04超声波测距模块使用方法和例程(STM32)

    基于STM32和HC-SR04模块实现超声波测距功能 最近在学STM32做个简单的应用实践一下,顺便水一篇文章。 本文用的单片机是STM32F103C8T6,超声波测距模块是HC-SR04,显示测距结果用的是0.96寸OLED屏模块。 下图中小于10cm时的显示结果有点问题,代码已修复并更新 修复后的结果: 视频

    2024年02月03日
    浏览(48)
  • 基于51单片机驱动HC-SR04超声波模块(LCD1602显示)

    点击图片购买 HC- SR04+是一款宽电压工作的超声波测距模块。模块外形尺寸及软件与老版本 HC- SR04完全兼容;可以与老版本HC SR04无缝切换。低至3V的低工作电压, 使其与3.3V供电的MCU可以直接连接。 特点 探测角度: 15° 采用工业级MCU,工作温度:-20C~80C 探测距离:5V:2cm-- 450cm;3.3V: 2c

    2024年02月02日
    浏览(61)
  • 基于STM32的超声波HC-SR04和红外测距模块测量距离的实验对比(HAL库)

            前言: 本文主要是为了 日常普通场合 下测距做的 对比实验 ,本实验主要包含 2种模块 : 超声波测距模块 (HC-SR04)和 红外测距模块 (SHARP GP2Y0A21YK0F)。两种模块不管是测距原理和编程实验方式都是不相同的,其测距效果也存在很大差异。感兴趣的读者朋友,

    2023年04月27日
    浏览(68)
  • STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

    (1)编程平台:Keil5 (2)CubeMX (3)XCOM(串口调试助手) (1)某宝买的超声波模块   (2)F1的板子,本例使用经典F103C8T6 (3)ST-link 下载器 (4)USB-TTL模块 (5)杜邦线若干 (1)模块简介:         超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射

    2024年02月02日
    浏览(50)
  • HC-SR501人体感应模块介绍

    HC-SR501人体感应模块简介       HC-SR501是基于红外线技术的自动控制模块,采用德国原装进口 LHI778 探头设计,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产品。 HC-SR501人体感应模块实物 HC-SR501人体感应模块电气

    2024年02月01日
    浏览(58)
  • 树莓派使用HC-SR04超声波测距

      超声波测距原理很简单:   1、通过记录发送超声波的时间、记录超声波返回的时间,返回时间与发送时间相减得到超声波的持续时间。   2、通过公式:( 超声波持续时间 * 声波速度 ) / 2 就可以得出距离;   HC-SR04参数:   工作电压: 5V   工作电流:15mA   

    2024年02月06日
    浏览(51)
  • 热释电人体探测模块HC-SR501

          热释电红外传感器是一种能检测人或动物发射的红外线而输出电信号的传感器。早在1938年,有人提出过利用热释电效应探测红外辐射,但并未受到重视,直到六十年代,随着激光、红外技术的迅速发展,才又推动了对热释电效应的研究和对热释电晶体的应用。它正在被

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包