stm32f103超声波模块代码
时间: 2024-08-14 22:00:36 浏览: 32
对于STM32F103系列微控制器,利用超声波模块(如HC-SR04)进行测距,基本步骤如下编写一个示例代码:
```c
#include "stm32f10x.h"
#include "time.h" // 引入时间库,用于延时
// 定义超声波模块引脚
#define TRIGGER_PIN GPIO_Pin_8 // 发射信号
#define ECHO_PIN GPIO_Pin_9 // 接收信号
void GPIO_InitStructure(uint16_t GPIO_Pin, GPIO_PinState PinState)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 输入上拉模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽输出
GPIO_InitStruct.GPIO_PuPd = PinState;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void trigger_pulse(uint16_t duration)
{
GPIO_InitStructure(TRIGGER_PIN, GPIO_Pin_RESET); // 设置发射引脚为低电平
HAL_Delay(duration); // 发送触发脉冲
GPIO_InitStructure(TRIGGER_PIN, GPIO_Pin_SET); // 设置发射引脚为高电平
HAL_Delay(10); // 等待回声反射
}
uint16_t read_echo()
{
GPIO_InitStructure(ECHO_PIN, GPIO_Pin_SET); // 设置接收引脚为高阻抗等待
uint16_t timeout = 50000; // 回声信号检测最大延迟时间(单位:微妙)
while ((GPIO_ReadPin(GPIOA, ECHO_PIN) == GPIO_PIN_RESET) && (timeout > 0))
{
timeout--;
}
if (timeout <= 0) // 没有接收到回声
return 0;
GPIO_InitStructure(ECHO_PIN, GPIO_Pin_PULLUP); // 设置接收引脚为上拉等待回声
uint16_t echo_duration = timeout; // 记录回声持续时间
while((GPIO_ReadPin(GPIOA, ECHO_PIN) == GPIO_PIN_SET) && (echo_duration > 0))
{
echo_duration--;
}
return echo_duration * 58; // 乘以声速常数(一般为340 m/s),得到距离值(单位:厘米)
}
int main(void)
{
GPIO_InitStructure(TRIGGER_PIN, GPIO_Pin_HIGH); // 初始化触发引脚为高电平
GPIO_InitStructure(ECHO_PIN, GPIO_Pin_PULLUP); // 初始化接收引脚为上拉状态
while (1)
{
trigger_pulse(10); // 发送触发脉冲
uint16_t distance = read_echo(); // 读取并计算距离
if (distance != 0)
printf("测得距离: %.2f cm\r\n", distance);
}
}