一、前言
从大一开始一直有着写点东西的想法,如今即将迈入大三,却迟迟没有动笔。没有太多的借口,就是懒,“间歇性的踌躇满志,持续性的混吃等死”说的就是我本人啦。前不久刷微信看到同学在写博客,于是发了个blink立了个flag——在开学前写两篇博客,又过了好几天,开学越来越近,我还没有动笔,今晚上想起来,敲下这篇文章,也算一个开始啦。
大一开始学校就组织我们焊自己的单片机,一开始我也是踌躇满志,但随着一开始的新鲜感褪去,整个大一学期我对单片机的了解大部分都是从大佬室友哪得知的。大一结束的那个寒假我学习的51,随后去学校听学长将32,那十几天现在会想起起来感觉还是有种噩梦的感觉,听学长讲stm32cubemx感觉就是听天书。寒假反反复复把正点原子的32教程看了好多遍,才对32有了一定了解。
因为这次的疫情我在家从寒假蹲到暑假,期间学了车,来来回回去了两次成都,上了4个多月的网课,但总是感觉心底不踏实,玩的时候总不安心,老想着什么时候就要检查什么的,但又提不起兴趣去学习,在纠结中浑浑噩噩荒废时间。
本篇博客主要讲解一下HC-SR04超神波测距模块的的原理及使用,希望可以帮助到大家。
二、HC-SR04的原理
该模块共有四个接口,分别为:VCC、TRIG(控制端)、 ECHO(接收端)、GND
工作原理如下图:
三、HC-SR04的使用
1、超声波模块函数
#include "hcsr04.h"
#include "delay.h"
u16 msHcCount=0;
void Hcsr04_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure;
HCSR04_PORTC_CLK_FUN(HCSR04_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseStructure.TIM_Period = (1000-1);
TIM_TimeBaseStructure.TIM_Prescaler =(72-1);
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM6, TIM_FLAG_Update);
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM6,DISABLE);
}
static void CloseTimerForHc(void)
{
TIM_Cmd(TIM6, DISABLE);
}
static void OpenTimerForHc(void)
{
TIM_SetCounter(TIM6,0);
msHcCount = 0;
TIM_Cmd(TIM6, ENABLE);
}
u32 GetEchoTimer(void)
{
u32 t = 0;
t = msHcCount*1000;
t += TIM_GetCounter(TIM6);
TIM6->CNT = 0;
delay_ms(50);
return t;
}
float Hcsr04GetLength(void)
{
u32 t = 0;
int i = 0;
float lengthTemp = 0;
float sum = 0;
while(i!=5)
{
GPIO_SetBits(HCSR04_PORT,HCSR04_TRIG);
delay_us(20);
GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
while(GPIO_ReadInputDataBit(HCSR04_PORT,HCSR04_ECHO)==RESET);
OpenTimerForHc();
i = i + 1;
while(GPIO_ReadInputDataBit(HCSR04_PORT,HCSR04_ECHO)==SET);
CloseTimerForHc();
t = GetEchoTimer();
lengthTemp = ((float)t/58.0);//cm
sum = lengthTemp + sum ;
}
lengthTemp = sum/5.0;
return lengthTemp;
}
2、主函数
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "hcsr04.h"
float length;
int main()
{
delay_init();
uart_init(115200);
Hcsr04_Init();
while(1)
{
length=Hcsr04GetLength();
printf("前方障碍物距离为:%3fcm\r\n",length);
delay_ms(50);
}
}
四、总结
这篇文章来来回回拖了两天,第一次写也不是很满意,将源文件网盘链接留在这,需要的自取:
链接:https://pan.baidu.com/s/1FkbbnzlMrfhjiwTwT6LpUg
提取码:ar47
在这也立个flag,这两天把报告赶完,在去学校之前学会使用串口屏。