stm32超声波测距代码
时间: 2023-09-02 07:13:59 浏览: 40
以下是基于STM32的超声波测距代码,可以根据自己的具体情况进行修改和优化:
```c
#include "stm32f10x.h"
#define TRIG GPIO_Pin_0 // 触发引脚
#define ECHO GPIO_Pin_1 // 回波引脚
void delay_us(unsigned int us) // 微秒级延时函数
{
unsigned int i,j;
for(i=0;i<us;i++)
for(j=0;j<10;j++);
}
void delay_ms(unsigned int ms) // 毫秒级延时函数
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<10000;j++);
}
void GPIO_Configuration(void) // GPIO初始化配置
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = TRIG;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ECHO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
float Distance(void) // 距离计算函数
{
float distance;
u32 time1,time2;
GPIO_ResetBits(GPIOA,TRIG); // 按照引脚定义把TRIG引脚拉低
delay_us(2);
GPIO_SetBits(GPIOA,TRIG); // 把TRIG引脚拉高
delay_us(10);
GPIO_ResetBits(GPIOA,TRIG); // 把TRIG引脚拉低
while(GPIO_ReadInputDataBit(GPIOA,ECHO)==RESET); // 等待回波信号到达
time1 = TIM2->CNT; // 记录时间1
while(GPIO_ReadInputDataBit(GPIOA,ECHO)==SET); // 等待回波信号结束
time2 = TIM2->CNT; // 记录时间2
distance = (float)(time2 - time1) / 58.0; // 计算距离
return distance;
}
int main(void)
{
float distance;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 0xffff;
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 定时器2的时钟为72MHz,分频系数为71,即定时器2的时钟为1MHz
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_Cmd(TIM2,ENABLE); // 使能定时器2
GPIO_Configuration(); // 初始化GPIO
while(1)
{
distance = Distance(); // 获取距离
delay_ms(200); // 延时200ms
}
}
```
该代码使用的是PA0和PA1引脚作为超声波模块的触发和回波引脚。具体的GPIO初始化和定时器配置请参考代码注释。