stm32超声波测距代码
时间: 2023-07-02 15:10:02 浏览: 51
以下是基于STM32的超声波测距代码,适用于HC-SR04模块:
```c
#include "stm32f10x.h"
#include "delay.h"
#include <stdio.h>
#define Trig GPIO_Pin_9
#define Echo GPIO_Pin_10
void Ultrasonic_Init(void);
void TIM3_Int_Init(u16 arr,u16 psc);
u32 checktime(u8 sta,u8 end);
int main(void)
{
u32 dis = 0;
char buffer[16] = {0};
Ultrasonic_Init();
TIM3_Int_Init(0xFFFF,72-1);
while(1)
{
GPIO_ResetBits(GPIOB,Trig);
delay_us(2);
GPIO_SetBits(GPIOB,Trig);
delay_us(10);
GPIO_ResetBits(GPIOB,Trig);
dis = checktime(0,1)/58;
sprintf(buffer,"Distance:%d cm",dis);
printf("%s\n",buffer);
delay_ms(500);
}
}
void Ultrasonic_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = Trig;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Echo;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler = psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE);
}
u32 checktime(u8 sta,u8 end)
{
u32 time = 0;
while(GPIO_ReadInputDataBit(GPIOB,Echo) == sta);
while(GPIO_ReadInputDataBit(GPIOB,Echo) == end)
{
time++;
delay_us(1);
}
return time;
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
```
代码主要分为三个部分:
1. 初始化函数:对GPIO进行初始化,设置Trig为输出模式,Echo为上拉输入模式。
2. 定时器初始化函数:使用TIM3定时器,设定计数器的自动重载值和预分频值,设置计数器为向上计数模式。同时开启定时器中断,并设置中断优先级。
3. 测距函数:当触发信号发送后,等待回波信号的到来,并测量回波信号的持续时间。根据声音在空气中的传播速度和回波持续时间计算出距离。
其中,定时器中断函数不需要实现具体的功能,只需要清除中断标志位即可。
注意:代码中使用了自定义的延时函数和printf函数,需要根据实际情况进行修改或添加。