STM32单片机+HC-SR04超声波测距传感器+OLED屏幕+蜂鸣器报警+超声波测距数据发送到串口调试助手+源代码

目录

一、超声波测距的基本原理

二、HC-SR04超声波测距模块 

三、HC-SR04超声波测距模块代码

四、串口打印数据

五、工程代码

六、串口调试助手软件

七、超声波传感器原理图资料 


一、超声波测距的基本原理

        超声波测距原理是在超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。(超声波在空气中的传播速度约为340m/s,根据计时器记录的时间t(秒),就可以计算出发射点距障碍物的距离(s),即:s=340t/2)

        超声波在空气里的传播速度受温度影响,一般以常温20摄氏度作为参考进行计算:
超声波在空气中的传播速度为340m/s(当然温度不同,传播速度也不同,带温度校准的模块得到的数据会更准),根据计时器记录的时间t(秒),就可以计算出发射点距障碍物的距离(s),即:s=340t/2。

原理如图所示:

二、HC-SR04超声波测距模块 

该实物图的正反面如上图所示,HC-SR04超声波测距模块可实现 2cm~4.5m 的非接触测距功能,拥有 2.4~5.5V 的宽电压输入范围,静态功耗低于 2mA,自带温度传感器对测距结果进行校正,同时具有 GPIO,串口两种通信方式实现数据的读取,工作稳定可靠。 

相关说明如下:

1 号 Pin:VCC接电源(供电范围 2.4V~5.5V)。   

2 号 Pin:当为 UART 模式时,接外部电路 UART 的 TX 端(注意);当为电平触发模式时,接外部电路的 Trig 端。

3 号 Pin:当为 UART 模式时,接外部电路 UART 的 RX 端(注意);当为电平触发模式时,接外部电路的 Echo 端。

 4 、5号 Pin:GND接外部电路的地。

三、HC-SR04超声波测距模块代码

HC-SR04.C文件驱动代码

#include "stm32f10x.h"                  // Device header
#include "HCSR04.h"
#include "Delay.h"
#include "Timer.h"
uint16_t Time;//高电平时间

void HCSR04_Init()
{
	RCC_APB2PeriphClockCmd(Trig_RCC, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;	//推挽输出
	GPIO_InitStruct.GPIO_Pin = Trig_Pin;          //PA0
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//io口速度50MHZ
	GPIO_Init(Trig_Port, &GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;		//上拉输入
	GPIO_InitStruct.GPIO_Pin = Echo_Pin;					//PA1
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(Echo_Port, &GPIO_InitStruct);
	
	GPIO_ResetBits(Trig_Port, Trig_Pin);
}

void HCSR04_Start()
{
	GPIO_SetBits(Trig_Port, Trig_Pin);
	Delay_us(45);
	GPIO_ResetBits(Trig_Port, Trig_Pin);
	Timer_Init();
}

uint16_t HCSR04_GetValue()
{
	HCSR04_Start();
	Delay_ms(100);
	return ((Time * 0.0001) * 34000) / 2;  // cm/s  [(0.00001s*340m/s)/2] * 100
//	return Time;
}

HC-SR04.C文件声明函数

#ifndef __HCSR04_H
#define __HCSR04_H

#define Trig_Port 		GPIOA
#define Trig_Pin 		GPIO_Pin_0 //SCL
#define Trig_RCC		RCC_APB2Periph_GPIOA

#define Echo_Port 		GPIOA
#define Echo_Pin 		GPIO_Pin_1 //CDA
#define Echo_RCC		RCC_APB2Periph_GPIOA

void HCSR04_Init(void);
uint16_t HCSR04_GetValue(void);

#endif 

四、串口打印数据

五、工程代码

《STM32单片机+HC-SR04超声波测距传感器+OLED屏幕+蜂鸣器报警+超声波测距数据发送到串口调试助手》源代码资源-CSDN文库

六、串口调试助手软件

串口调试助手-keil5调试工具资源-CSDN文库

七、超声波传感器原理图资料 

超声波传感器原理图、模块资料资源-CSDN文库

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是使用STM32F407和HC-SR04超声波测距模块的示例代码: ```c #include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_tim.h" #include "misc.h" #define TRIG_PIN GPIO_Pin_0 #define ECHO_PIN GPIO_Pin_1 #define GPIO_PORT GPIOA uint32_t distance = 0; void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = TRIG_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = ECHO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIO_PORT, &GPIO_InitStructure); } void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF; TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_Cmd(TIM2, ENABLE); } uint32_t GetDistance(void) { GPIO_SetBits(GPIO_PORT, TRIG_PIN); Delay_us(10); GPIO_ResetBits(GPIO_PORT, TRIG_PIN); uint32_t start_time = 0; uint32_t end_time = 0; uint32_t timeout = 0; while (GPIO_ReadInputDataBit(GPIO_PORT, ECHO_PIN) == RESET) { if (++timeout > 1000000) { return 0xFFFFFFFF; } } start_time = TIM_GetCounter(TIM2); timeout = 0; while (GPIO_ReadInputDataBit(GPIO_PORT, ECHO_PIN) == SET) { if (++timeout > 1000000) { return 0xFFFFFFFF; } } end_time = TIM_GetCounter(TIM2); if (end_time > start_time) { distance = (end_time - start_time) * 10 / 58; } else { distance = (start_time - end_time) * 10 / 58; } return distance; } int main(void) { GPIO_Configuration(); TIM_Configuration(); while (1) { GetDistance(); } return 0; } ``` 此代码初始化GPIO和定时器,然后在主循环中调用`GetDistance()`函数来获取测量到的距离。该函数使用超声波模块发送一个10微秒的脉冲,然后等待接收到回波。通过测量回波的时间来计算距离,并返回结果。在本例中,距离以毫米为单位表示。如果无法检测到回波或测量超时,则返回0xFFFFFFFF。 需要注意的是,在本例中,我们使用了定时器的输入捕获模式来测量回波的时间。我们使用TIM2的通道2来读取ECHO引脚的状态,并在上升沿触发捕获。此代码假设您已正确配置STM32F407的时钟源。如果您遇到问题,请参阅STM32F407参考手册。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

STM32单片机定制

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值