hc-sr04的stm32f103c8t6代码
时间: 2023-05-03 13:04:48 浏览: 152
stm32f103c8t6 can send代码
HC-SR04是一种常用的超声波测距传感器,可以在Arduino和STM32等各种开发平台中使用。下面是使用STM32F103C8T6的HC-SR04代码。
首先,需要定义IO口和一些变量。
```
#define TRIG GPIO_Pin_0
#define ECHO GPIO_Pin_1
volatile uint32_t ticks;
void delay_us(uint32_t us)
{
ticks = 0;
SysTick->CTRL = 0;
SysTick->LOAD = SystemCoreClock/1000000 * us;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_ENABLE_Msk;
while (ticks == 0);
SysTick->CTRL = 0;
}
void SysTick_Handler(void)
{
ticks++;
}
int main(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
SysTick_Config(SystemCoreClock/1000000);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = TRIG;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ECHO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while(1)
{
GPIO_SetBits(GPIOA, TRIG);
delay_us(10);
GPIO_ResetBits(GPIOA, TRIG);
uint32_t timeout = 6000000;
while (!GPIO_ReadInputDataBit(GPIOA, ECHO))
{
if (--timeout == 0)
return 100;
}
uint32_t start = SysTick->VAL;
timeout = 6000000;
while (GPIO_ReadInputDataBit(GPIOA, ECHO))
{
if (--timeout == 0)
return 200;
}
uint32_t end = SysTick->VAL;
uint32_t distance = (0.034)*((SystemCoreClock/1000000)*(start - end))/2;
}
}
```
代码的主要思路是先定义控制超声波测距的IO口,然后使用SysTick定时器控制超声波的发送和接收。在发送信号时,将TRIG口置HIGH并延时10us,然后再将其置LOW;在接收信号时,使用一个计时器来计算超声波返回的时间,并通过计算得出距离,最后将数据存入distance变量中。注意,在计算距离时需要除以2,因为超声波信号是双向的,即既要计算从发射到接收的时间,也要计算从接收到发射的时间。
阅读全文