基于STM32F103ZET6 HC_SR04超声波测距模块

这是最后的实验现象,改变不同的角度即可测得距离
板子 PZ6806L 超声波模块 HC_SR04
HC_SR04模块讲解
通过该超声波模块说明书,可明白供电需VCC 5V 还需GND ECHO(回响信号) TRIG(触发信号)
也就是说总共需要4根线,其中VCC和GND只需要接到开发板上的5V电源和GND即可
这是我的接线图

ECHO 使用的是PC3引脚,TRIG 使用的是PC2引脚
PC3和PC2只是普通的引脚,没任何特殊性,可凭自己想法配置不同的引脚


从超声波时序图看出,若想能够使用该模块,
1 使用你要触发信号拉高10us以上

2 接着模块内部自己发出8个40khz脉冲,不需要管,接着模块会输出回响信号,而回响信号高电平的
脉冲宽度,与距离成正比
以上知道这些就可以正常使用,至于距离公式后面会再解释
注意:
接着就是代码部分,主函数最后再介绍
HC_SR04配置函数及ECHO高电平时间
首先是头文件

配置一个变量 time,用于存储回响信号高电平的时间
void hc_sr04_init(void); 该函数是引脚的配置函数
float Get_hcsr04length(void);该函数是用来发送触发信号,并得到回响信号的高电平时间
void hc_sr04_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);//打开GPIOC的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//配置引脚2,trig触发信号
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置为推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_2);//触发信号,首先把它拉低,避免额外影响
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//配置引脚3,echo回响信号
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//配置为模拟输入
GPIO_Init(GPIOC, &GPIO_InitStructure);//echo信号
GPIO_ResetBits(GPIOC,GPIO_Pin_3);//也同样拉低
}
float Get_hcsr04length(void)
{
GPIO_SetBits(GPIOC,GPIO_Pin_2);
delay_us(20);
GPIO_ResetBits(GPIOC,GPIO_Pin_2); //TRIG发送触发信号,延时10us以上就可以了
while(PCI(3)==0) //当echo一直是低电平的时候,就清空,并且关闭计时器
{
TIM_SetCounter(TIM2, 0);
TIM_Cmd(TIM2,DISABLE);
}
while(PCI(3)==1)//一旦echo被拉高了,就说明模块传需要的数据回来了,打开计时器
{
TIM_Cmd(TIM2,ENABLE);
}
time=TIM_GetCounter(TIM2);//当被拉高的echo再次变回低电平时,将计时器的值赋给time
return time;//返回time
}
计时器函数的配置
void TIM_Counter(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能TIM2的时钟
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 71;//72MHx/72=1us,
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);
TIM_Cmd(TIM2,DISABLE);//关闭,需要的时候再打开
}
部分主函数
int main(void)
{
float Distance=0;//存储距离
delay_init(72); //配置滴答计时器
RCC_Configuration();//时钟配置
GPIO_Configuration();//GPIO配置,只是PC0(LED0),用来提示系统正常运行
TIM_Counter();//计时器的配置
USART1_Configuration();//串口配置,
hc_sr04_init();//HC_SR04初始化配置好(即PC2,PC3的配置)
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_0);//提示系统正常运行进该循环
Distance =(Get_hcsr04length()*340/2/1000);//从函数得到距离值,340是声音的速度,除于2,是因为声波发出到接收,是一次来回,除于1000,是将距离定为mm(毫米),该函数返回的就是之前time的值
printf("距离是%.2f\r\n",Distance);
delay_ms(1000);//延时1秒钟,这样不会输出太过频繁
}
}
这是我的工程文件
百度网盘 密码 v3y7
https://pan.baidu.com/s/1MNVf70_gnZ5aqSm6XInrMA
如有需要,可结合自己板子修改下代码即可使用,欢迎交流,咱们共同进步
基于STM32F103ZET6 HC_SR04超声波测距模块的更多相关文章
- [自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇·基于C#上位机软件开发
前言 上一节我们已经基本上把超声波硬件的发射和接收模块全部做好了,接下来我们着手开发一个软硬结合的基于C#的平面定位软件! 目录 一.整体思路 二.效果提前展示 2-1.软件部分展示 2-2.硬件部分 ...
- [自娱自乐] 3、超声波测距模块DIY笔记(三)
前言 上一节我们已经研究了超声波接收模块并自己设计了一个超声波接收模块,在此基础上又尝试用单片机加反相器构成生成40KHz的超声波发射电路,可是发现采用这种设计的发射电路存在严重的发射功率太低问题,对 ...
- [自娱自乐] 2、超声波测距模块DIY笔记(二)
前言 上一节我们已经大致浏览下目前销售的超声波测距模块同时设计了自己的分析电路,这次由于我买的电子元件都到了,所以就动手实验了下!至写该笔记时已经设计出超声波接收模块和超声波发射模块,同时存在超声波发 ...
- 基于FPGA的超声波测距(一)
硬件平台:CycloneII EP2C5Q208C8+DYP-ME007 1:超声波原理 DYP-ME007超声波测距模块可提供3cm--3.5m的非接触式距离感测功能,图1为DYP-ME007外观, ...
- STM32—驱动HC-SR04超声波测距模块
文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...
- loto示波器实践——超声波测距模块
我们这里用到的超声波测距模块,一般是用于arduino智能小车自动避障的.经常见到的应用是使用单片机或者stm32和这种模块结合进行开发的. 我们使用LOTO示波器可以更直观和快速的看到超声波测量距离 ...
- 树莓派 HC-SRO4超声波测距模块的使用
先上个图 这个模块的针脚跟之前玩的那三个有所区别,除了VCC和GND两个针脚,还多了两个Trig和Echo针脚,分别是输出和输入,Trig我接的是20针脚,Echo是21 该模块的工作原理为,先向TR ...
- 张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块
HC-SR04 采用 IO 触发测距.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码. 1. 准备 H ...
- Arduino 控制超声波测距模块
一.实物图 二.例子代码 用到数字2 和3 引脚,还有两个就是vcc GND两个阴脚,用模块连线比较简单
随机推荐
- ubuntu 命令、linux环境变量设置
解压与压缩: tar.gz格式tar -xzvf xxx jar格式jar -xvf xxx.jar zip格式unzip xxx.zip zip -r xxx.zip xxx unarunar -e ...
- mysql 客户端
MySQL是基于C/S模式的数据库管理系统.MySQL公司开发了众多的客户端软件来帮助用户管理MySQL软件,最著名的就是 MySQL Command Line Client 和 MySQL-Work ...
- 切片和append操作
本文转自:http://meia.fun/article/1541470004286 学习切片时,被append这个方法困扰了半天:在main方法中把一个切片作为实参传递给另一个函数,并在这个函数内调 ...
- 灰度图的直方图均衡化(Histogram Equalization)原理与 Python 实现
原理 直方图均衡化是一种通过使用图像直方图,调整对比度的图像处理方法:通过对图像的强度(intensity)进行某种非线性变换,使得变换后的图像直方图为近似均匀分布,从而,达到提高图像对比度和增强图片 ...
- Fatal error: Can't use function return value in write context
这个的出错原因很简单,先贴出错代码: <?php $contact = array("id"=>1, "姓名"=>"老高" ...
- webpack-易混淆部分的解释
原文链接: https://medium.com/@rajaraodv/webpack-the-confusing-parts-58712f8fcad9 webpack的核心哲学 1. 任何皆模块 正 ...
- springMVC入门-03
接着上一讲介绍springMVC针对rest风格的支持. 查询数据 使用前:/user_show?id=120 使用后:/user/120 删除数据 使用前:/user_delete?id=123 使 ...
- winform messagebox自动关闭
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 转:在决定使用ClickOnce发布你的软件前,应该知道的一些事情(一些常见问题解决方法)
1,无法有效避免非法的下载 使用ClickOnce部署,你的软件的更新版可以发布到Web服务器上,当用户从开始菜单启动软件时,ClickOnce自动到指定的URL去检测是否存在新版本,并且从这个地址下 ...
- Elasticsearch部分节点不能发现集群(脑裂)问题处理
**现象描述** es1,es2,es3三台es组成一个集群,集群状态正常, 当es1 服务器重启后,es1不能加到集群中,自己选举自己为master,这就产生了es集群中所谓的“脑裂” , 把es1 ...