用stm32f103c8t6定时器3和超声波模块编写一段程序!
时间: 2023-08-12 17:03:20 浏览: 101
好的,下面是一个用STM32F103C8T6的定时器3和超声波模块编写的程序,可以测量距离并输出到串口。
#include "stm32f10x.h"
#include <stdio.h>
#define TRIG_PIN GPIO_Pin_0
#define TRIG_PORT GPIOA
#define ECHO_PIN GPIO_Pin_1
#define ECHO_PORT GPIOA
uint32_t distance = 0;
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置 TRIG 引脚为输出模式
GPIO_InitStructure.GPIO_Pin = TRIG_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TRIG_PORT, &GPIO_InitStructure);
// 配置 ECHO 引脚为输入模式
GPIO_InitStructure.GPIO_Pin = ECHO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ECHO_PORT, &GPIO_InitStructure);
}
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1; // 定时器的预分频系数
TIM_TimeBaseInitStruct.TIM_Period = 0xFFFF; // 定时器的自动重载值
TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
TIM_Cmd(TIM3, ENABLE);
}
void delay_us(uint32_t us)
{
TIM_SetCounter(TIM3, 0x0000);
while (TIM_GetCounter(TIM3) < us);
}
void HCSR04_Read_Distance(void)
{
uint32_t timeout = 0;
uint32_t start_time = 0;
uint32_t end_time = 0;
// 发送一个 10us 的高电平脉冲到 TRIG 引脚
GPIO_SetBits(TRIG_PORT, TRIG_PIN);
delay_us(10);
GPIO_ResetBits(TRIG_PORT, TRIG_PIN);
// 等待 ECHO 引脚变为高电平
timeout = 0;
while (GPIO_ReadInputDataBit(ECHO_PORT, ECHO_PIN) == RESET)
{
timeout++;
if (timeout > 100000)
{
printf("超时!\r\n");
return;
}
}
// 记录 ECHO 引脚变为高电平的时间
start_time = TIM_GetCounter(TIM2);
// 等待 ECHO 引脚变为低电平
timeout = 0;
while (GPIO_ReadInputDataBit(ECHO_PORT, ECHO_PIN) == SET)
{
timeout++;
if (timeout > 100000)
{
printf("超时!\r\n");
return;
}
}
// 记录 ECHO 引脚变为低电平的时间
end_time = TIM_GetCounter(TIM2);
// 计算距离
distance = (end_time - start_time) * 17 / 1000;
printf("距离:%dmm\r\n", distance);
}
int main(void)
{
GPIO_Configuration();
TIM_Configuration();
while (1)
{
HCSR04_Read_Distance();
delay_us(500);
}
}
程序中用定时器3来实现us级延时,用定时器2来记录超声波回波的时间。在主函数中循环不断调用 HCSR04_Read_Distance() 函数,该函数会发送一个超声波脉冲并等待回波,然后计算距离并输出到串口。
相关推荐















