我的stm32学习——HC-SR04超声波测距模块

一、前言

从大一开始一直有着写点东西的想法,如今即将迈入大三,却迟迟没有动笔。没有太多的借口,就是懒,“间歇性的踌躇满志,持续性的混吃等死”说的就是我本人啦。前不久刷微信看到同学在写博客,于是发了个blink立了个flag——在开学前写两篇博客,又过了好几天,开学越来越近,我还没有动笔,今晚上想起来,敲下这篇文章,也算一个开始啦。

大一开始学校就组织我们焊自己的单片机,一开始我也是踌躇满志,但随着一开始的新鲜感褪去,整个大一学期我对单片机的了解大部分都是从大佬室友哪得知的。大一结束的那个寒假我学习的51,随后去学校听学长将32,那十几天现在会想起起来感觉还是有种噩梦的感觉,听学长讲stm32cubemx感觉就是听天书。寒假反反复复把正点原子的32教程看了好多遍,才对32有了一定了解。

因为这次的疫情我在家从寒假蹲到暑假,期间学了车,来来回回去了两次成都,上了4个多月的网课,但总是感觉心底不踏实,玩的时候总不安心,老想着什么时候就要检查什么的,但又提不起兴趣去学习,在纠结中浑浑噩噩荒废时间。

本篇博客主要讲解一下HC-SR04超神波测距模块的的原理及使用,希望可以帮助到大家。

超声波测距模块工作原理_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,这两天把报告赶完,在去学校之前学会使用串口屏。

 

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值