C语言用标准库写一个基于STM32F103的HCSR04超声波测距的代码
时间: 2024-09-20 20:04:39 浏览: 44
在C语言中,要编写一个基于STM32F103的HC-SR04超声波测距模块的代码,首先需要了解STM32F103的GPIO、定时器以及中断的相关设置。以下是一个基本的示例,假设你已经配置了触发脉冲(TRIG)和echo信号(ECHO)的GPIO端口,并且定时器已启用:
```c
#include "stm32f10x.h" // 包含STM32F10x系列的头文件
#define TRIG_PIN GPIO_Pin_8 // TRIG GPIO引脚编号
#define ECHO_PIN GPIO_Pin_9 // ECHO GPIO引脚编号
#define PWM_FREQ 400000 // 脉冲宽度调制频率
#define US_TO_METER 0.034 // 1微秒对应的距离转换系数 (空气声速 / 2)
// 测量函数
float measureDistance(void) {
uint16_t duration;
uint32_t distance;
// 设置TRIG GPIO为推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = TRIG_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 发送触发脉冲
GPIO_SetBits(GPIOA, TRIG_PIN);
HAL_Delay(10); // 等待Echo信号准备接收
GPIO_ResetBits(GPIOA, TRIG_PIN);
// 开始测量
HAL_TIM_Base_Start(&htim1); // 启动定时器
GPIO_SetBits(GPIOA, ECHO_PIN); // 接收回声信号
while (!GPIO_GetBits(GPIOA, ECHO_PIN)); // 直到Echo信号变为低电平
GPIO_ResetBits(GPIOA, ECHO_PIN); // 结束测量
// 计算超声波往返时间
duration = TIM_ReadCounter(htim1) * (PWM_FREQ / 1000000); // 微秒计数
// 根据时间计算距离并返回
distance = duration / 2 * US_TO_METER;
return distance;
}
int main(void) {
// ... 初始化硬件,设置定时器等
while (1) {
float dist = measureDistance();
printf("Distance: %.2fm\n", dist);
}
return 0;
}
阅读全文