帮我用c语言写基于stm32f103zet6单片机的hc-sr04模块的超声波测距的代码
时间: 2023-12-03 17:46:32 浏览: 123
基于stm32f103zet6的超声波测距 HC-SR04
5星 · 资源好评率100%
好的,以下是基于stm32f103zet6单片机的hc-sr04模块的超声波测距的代码:
```c
#include "stm32f10x.h"
#define TRIG GPIO_Pin_0
#define ECHO GPIO_Pin_1
void delay_us(u32 us)
{
u32 i;
SysTick->LOAD = 9 * us;
SysTick->VAL = 0x00;
SysTick->CTRL = 0x01;
do
{
i = SysTick->CTRL;
} while ((i & 0x01) && (!(i & (1 << 16))));
SysTick->CTRL = 0x00;
SysTick->VAL = 0X00;
}
u32 HC_SR04_ReadDistance(void)
{
u32 distance;
u32 timeout = 0;
GPIO_SetBits(GPIOA, TRIG);
delay_us(10);
GPIO_ResetBits(GPIOA, TRIG);
while (!GPIO_ReadInputDataBit(GPIOA, ECHO))
{
timeout++;
if (timeout > 8000)
return 0;
}
timeout = 0;
while (GPIO_ReadInputDataBit(GPIOA, ECHO))
{
timeout++;
if (timeout > 80000)
return 0;
}
distance = (float)timeout / 58.0;
return distance;
}
int main()
{
SysTick_Config(SystemCoreClock / 1000000);
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = TRIG;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ECHO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while (1)
{
u32 distance = HC_SR04_ReadDistance();
// do something with distance
}
}
```
这份代码使用 SysTick 作为延时函数,并且使用 GPIOA 的 0 号引脚作为 TRIG,1 号引脚作为 ECHO。在 `HC_SR04_ReadDistance()` 函数中,我们先发送一个 10us 的脉冲来触发测距,然后等待 ECHO 引脚变高,记录下此时的时间戳,然后等待 ECHO 引脚变低,记录下此时的时间戳。通过计算两个时间戳之间的差值,可以得到超声波信号在空气中行驶的时间,从而计算得到距离。最后在主函数中不断调用 `HC_SR04_ReadDistance()` 函数来获取距离,并进行后续的处理。
阅读全文