基于STM32的超声波测距

之前在学校的毕业设计就是这个,当时找资料感觉还真的贼费劲,虽然多但是代码全的还是少,现在又看到了稍作修改分享给大家.
1.基本原理
STM32F407正点原子的开发板加超声波模块HC-SR04,基本原理不多废话,两张图解释下吧,之前写的仅供参考
基于STM32的超声波测距_第1张图片基于STM32的超声波测距_第2张图片
2.连接方式
连接方式:VCC–> +5V TRIG–>PF15 ECHO–>PA0 GND–>GND
3.主要功能
通过模块的返回信号测距,我加上了一个蜂鸣器报警,当距离低于5厘米的时候蜂鸣器报警,有按键控制,但是好像有点问题,所以就是开机自动测距,间隔为200ms,每次测量一次距离LED就闪烁一次,距离低于5cm时报警,测距模块精确到0.3cm,我感觉还是挺靠谱的,但是不适合运用于精确测量.上图
基于STM32的超声波测距_第3张图片
基于STM32的超声波测距_第4张图片
测量的到屋顶的距离,和用手遮挡的距离(忽略界面,应该要改进的).

4.驱动程序
程序简单主要是通过原子的代码修改的,原理就是输入捕获,给模块一个10us以上的高电平,然后捕获模块接收到回波然后给单片机的高电平,然后用公式distance=340*temp/2就得到了距离.
基于STM32的超声波测距_第5张图片
main函数

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "lcd.h"
#include "beep.h"
#include "key.h"

extern u8  TIM5CH1_CAPTURE_STA;  //ÊäÈ벶»ñ״̬       
 extern u32 TIM5CH1_CAPTURE_VAL;   //ÊäÈ벶»ñÖµ
int main(void)
{
 //u8 key;                    //±£´æ¼üÖµ
 float distance=0.0;
 long long temp=0;  
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //ÖжÏÓÅÏȼ¶·Ö×é
 delay_init(168);                  //ÑÓʱº¯Êý³õʼ»¯
 uart_init(115200);                //´®¿Ú²¨ÌØÂÊ115200
 LED_Init(); 
 KEY_Init();
 BEEP_Init();
 LCD_Init();                       //LCD³õʼ»¯
 LCD_Clear(WHITE);
 LCD_ShowString(50,40,210,24,24," Distance is : ");
 LCD_ShowString(60,80,140,24,24,"  xxxxx  ");
 LCD_ShowString(60,120,160,24,24,"m m"); 
  TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1); 
while(1)
 {
  //key=KEY_Scan(0);  //µÃµ½¼üÖµ
  
   //if(key)
   //{
  delay_ms(10);
  
  GPIO_SetBits(GPIOF,GPIO_Pin_15);
  delay_us(20);
  GPIO_ResetBits(GPIOF,GPIO_Pin_15);
   if(TIM5CH1_CAPTURE_STA&0X80)       //³É¹¦²¶»ñµ½Ò»´Î¸ßµçƽ
  {
   temp=TIM5CH1_CAPTURE_STA&0X3F; 
   temp*=0XFFFFFFFF;            //Òç³öʱ¼ä×ܺÍ
   temp+=TIM5CH1_CAPTURE_VAL;   //µÃµ½×ܵĸߵçƽʱ¼ä
   distance=340*temp/2000.0;      //¾àÀëÖµ
   LCD_ShowxNum(60,80,((u32)(distance)),10,24,0);   //LCDÏÔʾʵ¼Ê²âÁ¿Öµ
   TIM5CH1_CAPTURE_STA=0;       //¿ªÆôÏÂÒ»´Î²¶»ñ
   delay_ms(100);
   if(distance<50)      //¾àÀëСÓÚ5ÀåÃ×·äÃùÆ÷±¨¾¯
   {
   GPIO_SetBits(GPIOF,GPIO_Pin_8);
   delay_ms(500);
   GPIO_ResetBits(GPIOF,GPIO_Pin_8);
   }
     GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);  //ÿ²¶»ñÒ»´ÎLEDÉÁ˸һ´Î
   delay_ms(200);
   GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);
   TIM5CH1_CAPTURE_STA=0;       //¿ªÆôÏÂÒ»´Î²¶»ñ
  }
  }
  // }
  }



定时器程序,就是正点原子的例程,定时器5通道1,代码注释有点问题,老是卡死,还是截图吧
基于STM32的超声波测距_第6张图片led.c
基于STM32的超声波测距_第7张图片
beep.c
基于STM32的超声波测距_第8张图片

主要就这么多还有个LCD屏的驱动程序,就是原子的不用改直接用都行,代码太多了不贴了,不过有个问题,就是在模块的触发脚不连接单片机的时候模块也能工作,没加按键控制这倒是不影响,有兴趣的可以加一下按键控制,但是我感觉这样测得的值有可能不准.希望对你们有帮助吧最后祝大家毕业快乐.

你可能感兴趣的:(基于STM32的超声波测距)