HC-SR04 stm32f103库函数使用
时间: 2023-05-31 20:02:19 浏览: 133
以下是使用STM32F103库函数控制HC-SR04超声波模块的一些示例代码:
1. 初始化GPIO口
```c
void HC_SR04_GPIO_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;
//PA0作为Trig输出,PA1作为Echo输入
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);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
```
2. 计算距离
```c
#define SOUND_SPEED 340.0 //音速,单位m/s
float HC_SR04_GetDistance(void)
{
uint32_t start_time, end_time;
float distance;
//发送10us脉冲
GPIO_SetBits(GPIOA, GPIO_Pin_0);
delay_us(10);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
//等待Echo输出高电平
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == RESET);
//计时,直到Echo输出低电平
start_time = micros();
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == SET);
end_time = micros();
//计算距离
distance = (end_time - start_time) / 2.0 * SOUND_SPEED / 1000000.0;
return distance;
}
```
其中,`delay_us()`和`micros()`是自定义的延时函数,用于产生10us脉冲和计时。`SOUND_SPEED`是音速,根据环境温度和湿度不同而有所变化,一般取340m/s。
3. 完整代码
```c
#include "stm32f10x.h"
void HC_SR04_GPIO_Init(void);
float HC_SR04_GetDistance(void);
void delay_us(uint32_t us);
uint32_t micros(void);
int main(void)
{
HC_SR04_GPIO_Init();
while (1) {
float distance = HC_SR04_GetDistance();
printf("Distance: %0.2f cm\r\n", distance * 100);
delay_us(500000);
}
}
void HC_SR04_GPIO_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;
//PA0作为Trig输出,PA1作为Echo输入
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);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
float HC_SR04_GetDistance(void)
{
uint32_t start_time, end_time;
float distance;
//发送10us脉冲
GPIO_SetBits(GPIOA, GPIO_Pin_0);
delay_us(10);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
//等待Echo输出高电平
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == RESET);
//计时,直到Echo输出低电平
start_time = micros();
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == SET);
end_time = micros();
//计算距离
distance = (end_time - start_time) / 2.0 * SOUND_SPEED / 1000000.0;
return distance;
}
void delay_us(uint32_t us)
{
us *= (SystemCoreClock / 1000000) / 5;
while (us--) {
asm("nop");
}
}
uint32_t micros(void)
{
static uint32_t us_ticks = 0;
us_ticks += (SysTick->LOAD + 1 - SysTick->VAL) / (SystemCoreClock / 1000000);
return us_ticks;
}
```
阅读全文