stm32六路超声波检测程序
时间: 2023-10-16 07:26:52 浏览: 38
以下是使用stm32实现六路超声波检测的程序示例:
```
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "misc.h"
#define TRIG1 GPIO_Pin_0
#define ECHO1 GPIO_Pin_1
#define TRIG2 GPIO_Pin_2
#define ECHO2 GPIO_Pin_3
#define TRIG3 GPIO_Pin_4
#define ECHO3 GPIO_Pin_5
#define TRIG4 GPIO_Pin_6
#define ECHO4 GPIO_Pin_7
#define TRIG5 GPIO_Pin_8
#define ECHO5 GPIO_Pin_9
#define TRIG6 GPIO_Pin_10
#define ECHO6 GPIO_Pin_11
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
TIM_Cmd(TIM2, DISABLE);
}
}
void delay_us(uint32_t us)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = us - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
while (TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET);
}
void Init_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = TRIG1 | TRIG2 | TRIG3 | TRIG4 | TRIG5 | TRIG6;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = ECHO1 | ECHO2 | ECHO3 | ECHO4 | ECHO5 | ECHO6;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
float GetDistance(uint16_t trig_pin, uint16_t echo_pin)
{
uint32_t i;
GPIO_SetBits(GPIOA, trig_pin);
delay_us(10);
GPIO_ResetBits(GPIOA, trig_pin);
while (GPIO_ReadInputDataBit(GPIOC, echo_pin) == RESET);
TIM_Cmd(TIM2, ENABLE);
i = 0;
while (GPIO_ReadInputDataBit(GPIOC, echo_pin) != RESET)
{
i++;
delay_us(1);
if (i > 5800)
{
return -1;
}
}
return i * 0.017; // 声速在空气中的传播速度为340m/s
}
int main(void)
{
float distance1, distance2, distance3, distance4, distance5, distance6;
SystemInit();
Init_GPIO();
while (1)
{
distance1 = GetDistance(TRIG1, ECHO1);
distance2 = GetDistance(TRIG2, ECHO2);
distance3 = GetDistance(TRIG3, ECHO3);
distance4 = GetDistance(TRIG4, ECHO4);
distance5 = GetDistance(TRIG5, ECHO5);
distance6 = GetDistance(TRIG6, ECHO6);
if (distance1 != -1)
{
printf("Distance1: %f cm\r\n", distance1);
}
if (distance2 != -1)
{
printf("Distance2: %f cm\r\n", distance2);
}
if (distance3 != -1)
{
printf("Distance3: %f cm\r\n", distance3);
}
if (distance4 != -1)
{
printf("Distance4: %f cm\r\n", distance4);
}
if (distance5 != -1)
{
printf("Distance5: %f cm\r\n", distance5);
}
if (distance6 != -1)
{
printf("Distance6: %f cm\r\n", distance6);
}
delay_us(50000);
}
}
```
该程序通过使用定时器延时实现微秒级的延时,利用超声波的发射和接收时间计算出距离,并通过串口输出距离值。在程序中,使用了6个超声波模块,分别连接到PA0~PA5和PC1~PC6的引脚上。程序中使用了printf函数输出距离值,因此需要在程序中添加对应的printf函数实现。