STM32F103ZET6超声波测距(hcsr04模块)实验

一、硬件连线图

接线描述
1.供电采+5V,我试了下+3V也是可以的
2. 注意Trig引脚跟Echo引脚不要接错;

二、hcrs04模块测距原理

(1)采用IO口TRIG触发测距,给至少10us的高电平信号;

(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

(4)本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,即可以达到你移动测量的值

三、以上两步骤做正确之后接下来就是编写代码

1.hcrs04.c源文件

#include "hcsr04.h"
#include "sys.h"
#include "delay.h"#define HCSR04_PORT     GPIOB
#define HCSR04_CLK      RCC_APB2Periph_GPIOB
#define HCSR04_TRIG     GPIO_Pin_5
#define HCSR04_ECHO     GPIO_Pin_6#define TRIG_Send  PBout(5)
#define ECHO_Reci  PBin(6)void Delay_Ms(uint16_t time);
void Delay_Us(uint16_t time);
void hcsr04_NVIC();u16 msHcCount = 0;//ms计数void Hcsr04Init()
{  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;     //生成用于定时器设置的结构体GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);//IO初始化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);  //定时器初始化 使用基本定时器TIM6RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);   //使能对应RCC时钟//配置定时器基础结构体TIM_DeInit(TIM2);TIM_TimeBaseStructure.TIM_Period = (1000-1); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到1000为1msTIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频值  1M的计数频率 1US计数TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位         TIM_ClearFlag(TIM6, TIM_FLAG_Update);   //清除更新中断,免得一打开中断立即产生中断TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);    //打开定时器更新中断hcsr04_NVIC();TIM_Cmd(TIM6,DISABLE);
}//tips:static函数的作用域仅限于定义它的源文件内,所以不需要在头文件里声明
static void OpenTimerForHc()        //打开定时器
{TIM_SetCounter(TIM6,0);//清除计数msHcCount = 0;TIM_Cmd(TIM6, ENABLE);  //使能TIMx外设
}static void CloseTimerForHc()        //关闭定时器
{TIM_Cmd(TIM6, DISABLE);  //使能TIMx外设
}//NVIC配置
void hcsr04_NVIC()
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;             //选择串口1中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占式中断优先级设置为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //响应式中断优先级设置为1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能中断NVIC_Init(&NVIC_InitStructure);
}//定时器6中断服务程序
void TIM6_IRQHandler(void)   //TIM3中断
{if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否{TIM_ClearITPendingBit(TIM6, TIM_IT_Update  );  //清除TIMx更新中断标志 msHcCount++;}
}//获取定时器时间
u32 GetEchoTimer(void)
{u32 t = 0;t = msHcCount*1000;//得到MSt += TIM_GetCounter(TIM6);//得到USTIM6->CNT = 0;  //将TIM2计数寄存器的计数值清零Delay_Ms(50);return t;
}//一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号
//为了消除余震的影响,取五次数据的平均值进行加权滤波。
float Hcsr04GetLength(void )
{u32 t = 0;int i = 0;float lengthTemp = 0;float sum = 0;while(i!=5){TRIG_Send = 1;      //发送口高电平输出Delay_Us(20);TRIG_Send = 0;while(ECHO_Reci == 0);      //等待接收口高电平输出OpenTimerForHc();        //打开定时器i = i + 1;while(ECHO_Reci == 1);CloseTimerForHc();        //关闭定时器t = GetEchoTimer();        //获取时间,分辨率为1USlengthTemp = ((float)t/58.0);//cmsum = lengthTemp + sum ;}lengthTemp = sum/5.0;return lengthTemp;
}/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: Delay_Ms_Ms
** 功能描述: 延时1MS (可通过仿真来判断他的准确度)
** 参数描述:time (ms) 注意time<65535
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void Delay_Ms(uint16_t time)  //延时函数
{ uint16_t i,j;for(i=0;i<time;i++)for(j=0;j<10260;j++);
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: Delay_Ms_Us
** 功能描述: 延时1us (可通过仿真来判断他的准确度)
** 参数描述:time (us) 注意time<65535
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void Delay_Us(uint16_t time)  //延时函数
{ uint16_t i,j;for(i=0;i<time;i++)for(j=0;j<9;j++);
}

2.hcsr04.h源代码

#ifndef __HCSR04_H
#define __HCSR04_Hfloat Hcsr04GetLength(void );
void Hcsr04Init();#endif

3.main.c源代码

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "hcsr04.h"int main()
{       float length;delay_init();           //延时函数初始化    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200);     //串口初始化为115200while(1){delay_ms(1000);printf("串口初始化成功!\r\n");Hcsr04Init();    printf("超声波初始化成功!\r\n");//测试程序是否卡在下面两句上面length = Hcsr04GetLength();printf("距离为:%.3f\r\n",length);}return 0;
}

4.将获取到的数据通过串口1打印到串口助手上
主要是通过USART函数来实现,具体代码就不贴出来了,不懂的去参考开发板例程里usart.c文件。

四、测量数据显示

六、总结

需要注意的是的接线的问题,前面我就是因为接线的问题卡住了一会,东查西查以为是程序的问题。。。

STM32F103ZET6超声波测距(hcsr04模块)实验相关推荐

  1. 超声波测距传感器模块在畜牧业的应用

    我国现代养殖是一种"高投入.高产出.高效益"的产业.资本密集型和劳动集约化是其基本特征.这种集约化的产业耗费了大量的人力和自然资源,并在某种程度上对环境造成负面影响.如今物联网应用 ...

  2. 经验分享帖 基于STM32的超声波测距HC-SR04(附程序)

    CSDN上其实有很多超声波测距的博客,但我还是想写一篇,主要是附上可用的程序,伸手党最爱.其实我也是个伸手党,不过还是希望大家能自己动手自己多练自己能实现. 同时写下我的心得与看法: 1,程序是用ST ...

  3. 超声波测距HY-SRF05模块的学习总结

    文章目录 超声波测距 一.HY-SRF05 1.短的介绍 2.引脚介绍 二.实现思路 三.部分代码 1.Trig.Echo的初始设置 2.主函数中的相关代码 总结 写在最后 超声波测距 超声波测距模块 ...

  4. arduino与hcsr04_Arduino 驱动 HC-SR04 超声波测距模块

    /* Arduino Uno 驱动HC-SR04 超声波测距传感器模块 Created 2014 by 太极创客 http://www.taichi-maker.com 使用Arduino Uno驱动 ...

  5. 【arduino--8266】----系列传感器和模块实验目录清单

    一块扩展板完成Arduino的10类37项实验(代码+图形+仿真) https://www.arduino.cn/thread-88696-1-1.html 实验一:干簧管传感器模块 https:// ...

  6. Arduino 超声波测距 LCD1602A

    arduino 实现超声波测距 涉及模块:四线超声波测距模块,LCD1602A LCD1602连接 实验代码: #include <LiquidCrystal.h> LiquidCryst ...

  7. Arduino与Processing交互-超声波测距传感器的读取与显示

    公众号:STCode 1-超声波测距传感器简介 超声波测距传感器是利用频率高于20kHz的声波在空气中传播,遇到障碍物反射回来,通过计算发射和接收时间差,可以计算出发射点与障碍物间的距离. 超声波测距 ...

  8. MC9S12XS128实现超声波测距

    先来说说超声波测距模块的引脚: VCC,  ECHO(接收端),   TRING(控制端),  OUT(悬空),  GND 时序图: 参考代码: 开发环境:Freescale Codewarrior ...

  9. 超声波测距传感器模HG-C40U工作程序图文详解

    超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离. 超声波测距模块有好多种类型,目前比较常用的有URM37超声波传感器默认是232接口 ...

最新文章

  1. ORB-SLAM2 论文翻译
  2. 微软Azure AI负责人:OpenAI只能在微软云上训练模型,不懂中台
  3. JDBC的两种sql命令发送器比较【Statement:PreparedStatement】
  4. 为无LIB的DLL制作LIB函数符号输入库zz
  5. Sass学习笔记(一)
  6. 线上报名 | 高性能深度学习推理引擎 TensorRT 实战编程讲解
  7. python 动态_python实现动态创建类的方法分析
  8. 神舟笔记本电源管理软件_笔记本电脑长期不用充不上电了?原来问题就出在这儿...
  9. java批量提取文件夹名称_bat 批量提取指定目录下的文件名
  10. Linux:守护进程详解及实现
  11. sklearn adaboost_集成学习-从零推导和实现adaboost与3D可视化
  12. 1 WM配置-企业结构-定义-创建仓库号(Warehouse Number)
  13. Codeforces D - High Load
  14. 图解TCPOP-SMTP
  15. lambda表达式学习例子
  16. Visual Studio 2019密钥
  17. thinkphp 运行机制和优缺点
  18. Spring基于XMLMysql | 注解Mysql的简单IOC案例
  19. 用计算机弹奏七月上,七月上歌词背后的故事 七月上背景故事介绍
  20. javaweb常识类英语

热门文章

  1. CSS3 SVG实现可爱的动物哈士奇和狐狸动画
  2. 我的世界基岩版好还是java版好_【Minecraft/我的世界】Java版和基岩版的区别(1)...
  3. 生活:你是如何毁掉生活中的情趣的
  4. pdf 压缩怎么做?三种办法可供选择
  5. 前端生成二维码及把页面转为图片保存到本地
  6. 金三银四马上到了,找工作需要准备什么?
  7. 计算机表格边框,高会《职称计算机》Word 2007:设置表格边框和底纹
  8. 一行Python代码生成酷炫/恶搞/表白二维码(内附源码)
  9. 期权量化策略:如何利用期权捕捉期现套利机会?
  10. 基于Python企业公司网站设计与实现 开题报告