hcsr04超声波模块stm32代码讲解
时间: 2023-09-01 22:07:21 浏览: 115
好的,下面给出一个简单的 HCSR04 超声波模块的 STM32 代码讲解,代码如下:
```c
#include "stm32f10x.h"
#include "delay.h"
#define TRIG GPIO_Pin_0 // 发射引脚
#define ECHO GPIO_Pin_1 // 接收引脚
void HCSR04_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = TRIG;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = ECHO;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
float HCSR04_GetDistance(void)
{
uint32_t time = 0;
float distance = 0;
GPIO_ResetBits(GPIOA, TRIG); // 拉低发射引脚
delay_us(2); // 延时2us
GPIO_SetBits(GPIOA, TRIG); // 拉高发射引脚
delay_us(10); // 延时10us
GPIO_ResetBits(GPIOA, TRIG); // 拉低发射引脚
while (GPIO_ReadInputDataBit(GPIOA, ECHO) == RESET); // 等待高电平
time = 0;
while (GPIO_ReadInputDataBit(GPIOA, ECHO) == SET) // 计算高电平持续时间
{
delay_us(1);
time++;
}
distance = (float)time * 1.7 / 100; // 计算距离,单位为厘米
return distance;
}
int main(void)
{
HCSR04_Init();
float distance = 0;
while (1)
{
distance = HCSR04_GetDistance();
printf("Distance: %.2fcm\n", distance); // 在串口终端输出距离值
delay_ms(500);
}
}
```
该代码主要包含两个函数:`HCSR04_Init` 和 `HCSR04_GetDistance`。
首先,`HCSR04_Init` 函数用于初始化超声波模块的发射和接收引脚。发射引脚采用推挽输出模式,接收引脚采用浮空输入模式。
其次,`HCSR04_GetDistance` 函数用于获取超声波探测器与物体之间的距离。具体实现步骤如下:
1. 首先拉低发射引脚,延时2us,再拉高发射引脚,延时10us后再将发射引脚拉低,这样就可以发射一定周期的超声波信号。
2. 接下来等待接收引脚的高电平信号,计算高电平持续时间。
3. 最后根据高电平持续时间计算距离值,单位为厘米。
最后,在主函数中不断获取距离值,并在串口终端输出。其中,`delay.h` 头文件中包含了延时函数的实现,可以根据需要进行调整。同时,需要注意超声波探测器的工作电压和输出距离范围,以避免超出范围导致测量错误。
阅读全文