stm32f103c8t6超声波测距代码怎么写
时间: 2025-05-31 09:51:44 浏览: 26
### 基于STM32F103C8T6的超声波测距代码示例
以下是基于STM32F103C8T6微控制器实现超声波测距功能的一个典型代码示例。此代码利用了HC-SR04超声波模块,通过触发信号获取回响时间,并计算距离。
#### 初始化GPIO和定时器
首先需要初始化用于控制超声波模块的GPIO引脚以及测量时间间隔的定时器。
```c
#include "stm32f10x.h"
void GPIO_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
// 配置Trig引脚为输出模式 (PA0)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置Echo引脚为输入模式 (PA1)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIM_Init(void){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // 自动重装载寄存器周期值
TIM_TimeBaseStructure.TIM_Prescaler = 72-1; // 设置预分频器,使计数频率为1us
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); // 开启更新中断
}
```
#### 测量函数
接下来编写具体的测距逻辑:
```c
float Distance_Measure(void){
uint16_t HighLevelTime=0;
float distance=0;
// 发送 Trig 信号
GPIO_ResetBits(GPIOA, GPIO_Pin_0); // PA0 输出低电平
Delay_us(2); // 延迟 2 us
GPIO_SetBits(GPIOA, GPIO_Pin_0); // PA0 输出高电平
Delay_us(10); // 持续 10 us
GPIO_ResetBits(GPIOA, GPIO_Pin_0); // PA0 输出低电平
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1));// 等待 Echo 上升沿
TIM_Cmd(TIM2, ENABLE); // 启动定时器
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1));// 等待 Echo 下降沿
TIM_Cmd(TIM2, DISABLE); // 关闭定时器
HighLevelTime = TIM_GetCounter(TIM2); // 获取计数值
distance = ((float)HighLevelTime / 58.0); // 计算距离,单位 cm
return distance;
}
```
以上代码实现了基本的距离测量过程[^1]。其中 `Delay_us` 函数可以由软件延时或者硬件定时器完成。
---
### 定义延迟函数
为了方便使用,在这里定义一个简单的微秒级延时函数作为补充:
```c
void Delay_us(uint16_t nus){
volatile uint32_t temp;
SysTick->LOAD=nus*9; // 设定倒计数值
SysTick->VAL=0x00; // 清空当前计数值
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; // 使能系统滴答定时器
do{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); // 判断是否计数到零
SysTick->CTRL=0x00; // 禁用系统滴答定时器
SysTick->VAL =0X00; // 清空当前计数值
}
```
---
### 使用说明
将上述代码集成至您的项目中,确保正确配置了GPIO端口映射关系以及对应的外设时钟开启状态。此外还需要注意 HC-SR04 的工作电压范围通常为 5V,而 STM32 默认 I/O 工作电压可能低于该值,请考虑增加电平转换电路以保护 MCU 输入管脚[^2]。
---
阅读全文
相关推荐

















