#一、超声波HC_SR04简介
#二、超声波工作原理
#三、超声波测距步骤
#四、硬件接线
#五、项目代码

一、超声波HC_SR04简介


超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应)

工作电压与电流:5V,15mA
感应距离:2~400cm
感测角度:不小于15度
被测物体的面积不要小于50平方厘米并且尽量平整
具备温度补偿电路
超声波模块的触发脚(Trig)输入10us以上的高电位,即可发射超声波,发射超声波后,与接收到收回的超声波之前,“响应“脚(Echo)位呈现高电平。因此,程序可以“响应”脚位(Echo)的高电平脉冲持续时间,换算出被测物的距离。

二、超声波原理


距离公式:
高电平持续时间*声速(340m/s)/2

三、超声波测距步骤

1.配置GPIO引脚结构体(Trig,Echo)
2.配置定时器结构体
3.配置定时器中断结构体
4.开启时钟(定时器、GPIO)
5.Trig引脚输出高电平(10us以上),然后关闭
6.等待Echo引脚输出高电平开始,定时器打开->开启计数器计数
7.等待Echo引脚输出高电平结束,定时器关闭->停止计数器计数

四、硬件接线

1.GND——GND
2.VCC——5V
3.Trig——PB11
4.Echo——PB10

五、项目代码

HC_SR04.C

#include "stm32f10x.h"
#include "hc_sr04.h"
#include "systick.h"extern uint16_t mscount=0;//定义毫秒级计数void HC_SR04Config(void)
{GPIO_InitTypeDef GPIO_hcsr04init;//超声波时钟结构体初始化TIM_TimeBaseInitTypeDef TIM_hcsr04init;//定时器时钟结构体初始化NVIC_InitTypeDef NVIC_hcsr04init;//定时器中断结构体初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断定时器优先级分组//1.打开时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开GPIO时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//打开定时器时钟//2.配置GPIO时钟//Trig PB11 输出端 高电平GPIO_hcsr04init.GPIO_Mode  = GPIO_Mode_Out_PP;//推挽输出GPIO_hcsr04init.GPIO_Pin   = GPIO_Pin_11;//引脚11GPIO_hcsr04init.GPIO_Speed = GPIO_Speed_50MHz;//速度为50MhzGPIO_Init(GPIOB,&GPIO_hcsr04init);//配置GPIO初始化函数//Echo PB10 输入端 GPIO_hcsr04init.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_hcsr04init.GPIO_Pin   = GPIO_Pin_10;//引脚10GPIO_Init(GPIOB,&GPIO_hcsr04init);//配置GPIO初始化函数//3.配置定时器结构体TIM_hcsr04init.TIM_ClockDivision = TIM_CKD_DIV1;//不分频TIM_hcsr04init.TIM_CounterMode   = TIM_CounterMode_Up;//计数模式为向上计数TIM_hcsr04init.TIM_Period        = 100-1;//重装载值为99TIM_hcsr04init.TIM_Prescaler     = 72-1;//分频系数为71TIM_TimeBaseInit(TIM4,&TIM_hcsr04init);//配置定时器初始化函数TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);//使能定时器中断TIM_Cmd(TIM4,DISABLE);//失能定时器//4.配置定时器中断结构体NVIC_hcsr04init.NVIC_IRQChannel     =  TIM4_IRQn;//配置通道4NVIC_hcsr04init.NVIC_IRQChannelCmd  =  ENABLE;//使能定时器中断NVIC_hcsr04init.NVIC_IRQChannelPreemptionPriority  = 0;//抢占优先级为0NVIC_hcsr04init.NVIC_IRQChannelSubPriority         = 0;//子优先级为0NVIC_Init(&NVIC_hcsr04init);//配置中断初始化}void Open_Tim4(void)//定时器开启
{TIM_SetCounter(TIM4,0);//开启定时器mscount=0;TIM_Cmd(TIM4,ENABLE);//打开定时器}void Close_Tim4(void)//定时器关闭
{TIM_Cmd(TIM4,DISABLE);//失能定时器}void TIM4_IRQHandler(void)//中断服务函数(判断是否发生中断)
{if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET){TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//清除中断标志位mscount++;}}int GetEcho_time(void)//获取定时器的数值
{uint32_t t=0;t=mscount*1000;//中断时间t+= TIM_GetCounter(TIM4);//得到定时器计数时间TIM4->CNT=0;//重装载值为0ms_delay(50);//延迟50msreturn t;}float Getlength(void)//获取距离长度
{int i=0;//定义次数iuint32_t t=0;//定义时间tfloat length=0; //定义长度lengthfloat sum=0;//距离求和while(i!=5)//发送5次超声波{TRIG_Send(1);//发送超声波us_delay(20);//发送20usTRIG_Send(0);//停止发送超声波while(ECHO_Reci==0);//当超声波发出后Open_Tim4();//打开定时器i=i+1; //次数加一while(ECHO_Reci==1);//当收到超声波返回信号Close_Tim4();//关闭定时器t=GetEcho_time();//获取定时器计数数值length=((float)t/58.0);//计算出距离长度sum=sum+length;//距离长度求和}length=sum/5.0;//计算距离平均值return length;//返回距离长度}

HC_SR04.h

#include "stm32f10x.h"
#ifndef _HC_SR04_H
#define _HC_SR04_Hvoid HC_SR04Config(void);
void Open_Tim4(void);
void Close_Tim4(void);
int GetEcho_time(void);
float Getlength(void);#define TRIG_Send(a)   if(a)\GPIO_SetBits(GPIOB,GPIO_Pin_11);\else\GPIO_ResetBits(GPIOB,GPIO_Pin_11)#define ECHO_Reci GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)                #endif

usart.c

#include "stm32f10x.h"
#include "usart.h"
#include <stdio.h>void usart_init(void)
{GPIO_InitTypeDef gpioinstructure;//GPIO结构体初始化函数USART_InitTypeDef usartinstructure;//USART结构体初始化函数NVIC_InitTypeDef  nvicinstructure;//中断控制器结构体初始化函数NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置中断控制器优先抢占级组//1.配置GPIO、USART、引脚复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//配置引脚复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//配置USART时钟//2.配置GPIO结构体//配置PA9 TX 输出引脚gpioinstructure.GPIO_Mode  =  GPIO_Mode_AF_PP;//复用推挽输出gpioinstructure.GPIO_Pin   =  GPIO_Pin_9 ;//引脚9gpioinstructure.GPIO_Speed =  GPIO_Speed_50MHz;//速度为50MhzGPIO_Init(GPIOA,&gpioinstructure);//GPIO初始化//配置PA10 RX 接收引脚gpioinstructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输出gpioinstructure.GPIO_Pin   = GPIO_Pin_10;//引脚10GPIO_Init(GPIOA,&gpioinstructure);//GPIO初始化//3.配置串口的结构体usartinstructure.USART_BaudRate = 115200;//波特率为115200usartinstructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流配置usartinstructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx ;//接收模式usartinstructure.USART_Parity = USART_Parity_No;//无校验位usartinstructure.USART_StopBits = USART_StopBits_1;//一个停止位usartinstructure.USART_WordLength = USART_WordLength_8b;//有效数据位为8位USART_Init(USART1,&usartinstructure);//初始化串口1USART_Cmd(USART1,ENABLE);   //使能串口1USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//串口中断配置//4.配置中断控制器的结构nvicinstructure.NVIC_IRQChannel  =  USART1_IRQn;//中断通道nvicinstructure.NVIC_IRQChannelCmd = ENABLE; //通道使能nvicinstructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级配置为1nvicinstructure.NVIC_IRQChannelSubPriority = 1;//子优先级配置为1NVIC_Init(&nvicinstructure);//中断控制器初始化}//发送字符
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)
{USART_SendData(USARTx, Data);while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);
}//发送字符串
void USARTSendStr(USART_TypeDef* USARTx, char *str)
{uint16_t i=0;do{USARTSendByte(USARTx,*(str+i));i++;}while(*(str+i)!='\0');while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);}//printf函数的重映射
int fputc(int ch,FILE *f)
{USART_SendData(USART1,(uint8_t)ch);//发送while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//发送数据寄存器空标志位判断return (ch);}int fgetc(FILE *f)
{while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);//接收数据寄存器非空标志位判断return (int)USART_ReceiveData(USART1);//返回接收到的字符
}

usart.h

#include "stm32f10x.h"
#include <stdio.h>void usart_init(void);
void USARTSendStr(USART_TypeDef* USARTx, char *str);

main.c

#include "stm32f10x.h"
#include "main.h"
#include "LED.h"
#include "usart.h"
#include "relay.h"
#include "shake.h"
#include "exti.h"
#include "tim.h"
#include "motor.h"
#include "systick.h"
#include "hc_sr04.h"void delay(uint16_t time)//延迟函数
{uint16_t i=0;while(time--){i=12000;while(i--);}
}int  main()
{// int pwmval=195;float Length=0;usart_init();//串口初始化HC_SR04Config();//超声波初始化while(1){//pwmval=155;Length=Getlength();//获取距离长度printf("%.3f\r\n",Length);//打印距离长度ms_delay(500);//延迟500ms/*if(Length<5){for(pwmval=195;pwmval>=155;pwmval-=15){TIM_SetCompare2(TIM3,pwmval-20);}}*/}}

基于STM32F103C8T6的超声波测距应用相关推荐

  1. 基于STM32和超声波测距传感器的测距功能设计

    基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...

  2. 创意发明: 基于STC51单片机超声波测距(精简设计只需三个元件)

    基于STC51单片机超声波测距精简设计只需三个元件(测距模块暂且算做是一个元件吧) 1.所需元件:STC单片机+超声波模块+4位共阳数码管 2.原理:单片机向测距模块trig脚发送20us的高电平触发 ...

  3. 2022-4-15 基于单片机的超声波测距报警

    基于单片机的超声波测距报警 系统设计软件:Proteus8.10和keil4 .proteus8.10版本安装包可在微信公众号下载 系统源代码和仿真等资料可在文末的链接中下载 系统组成:单片机最小系统 ...

  4. 基于51单片机超声波测距液位检测-温度检测

    [毕设课设]基于51单片机超声波测距液位检测-温度检测 ​效果图 Proteus仿真: 功能简介: 文件内容: 程序框架: 网盘链接: ​效果图 更多内容请关注@WENJIE电子科技 ​ 基于51单片 ...

  5. 基于51单片机 超声波测距 倒车雷达

    基于51单片机 超声波测距 倒车雷达 51单片机最小系统电路+LCD1602+蜂鸣器报警电路+按键电路+超声波模块+电源电路 实现液晶显示距离 超设置数值报警 按键可修改数值 可加蓝牙模块 用户可以通 ...

  6. 基于STM32F103C8T6的超声波模拟雷达设计。【C8T6最小系统板+标准固件库+1.8‘TFT-LCD屏】

    前言: 之前为做毕设一直在网上浏览关于STM32单片机的DIY项目,大多数设计都是关于智能家居方面的应用,通过浏览不同平台的内容发现了一个采用超声波测距并通过屏幕反馈障碍物位置的模拟雷达设计,感觉很有 ...

  7. 基于单片机的超声波测距

    设计简介: 本设计是基于单片机的超声波测距系统,主要实现以下功能: 可通过LCD1602显示温度.距离和最小距离: 可通过按键设置最小距离: 可通过蜂鸣器和LED进行不同频率的声光报警: 标签:51单 ...

  8. C51学习笔记:基于STC89C52的超声波测距与LCD1602显示

    最近需要拿超声波写一个避障的部分,打算拿arduino来写但是板子还在路上,用51单片机来写就需要拿液晶来显示,于是就在网上找了一大堆资料来学,也参考了很多前人的代码,最后把在这过程中查阅读一部分资料 ...

  9. 基于HC-SR04的超声波测距模块

    目录 前言: HC-SR04硬件概述: HC-SR04引脚介绍: HC-SR04的超声波测距模块工作原理: 软件设计: 超声波初始化函数:(代码如下) 超声波测距模块:(代码如下) 前言: 2022. ...

最新文章

  1. C# winform combobox默认选中项方法
  2. python编程经典案例-一个非常适合Python新手的编程案例——投票小程序
  3. 利用opencv中的类FileStorage生成和读取XML和YAML文件
  4. vts传感器采取船舶的_【火炬高企】船舶通讯导航设备专家新诺航科
  5. Elasticsearch5.X IN Windows 10 系列文章(1)
  6. 我犯了一个错误,您能指出吗?
  7. 03SkypeForBusiness2015--Lync2010-2013共存部署Lync2013前端
  8. Vincross孙天齐:人机界面的突破将引发科技革命
  9. UVa10779 - Collectors Problem(最大流)
  10. 问答丨如何理解哈希表的工作原理?
  11. 英特尔为 Kubernetes 推出分布式深度学习平台:Nauta
  12. stateflow被激活问题探究
  13. ZYNQ PS端输出无效时钟供PL使用
  14. 深入理解JVM(6)——JVM性能调优实战
  15. 浅谈估值模型:回报率r的进阶玩法——Fama-French及PSM(Pastor Stambaugh Model)
  16. 实习期间的一些思考整理(2)2018.4.10~4.11
  17. MT6753和MT6737 4G和以太网同时使用问题,测试记录
  18. 【vue3】vue3+ts+vite项目设置路径别名
  19. 支付宝门店码,全面助力商家快速实现数字化经营
  20. oracle 02315,02315 血眼

热门文章

  1. 怎么制作支持UEFI启动Win10系统安装U盘
  2. 未来智安入围《2022年中国数字安全百强报告》,威胁检测与响应领域唯一XDR厂商
  3. Python|游邮APP技术路线
  4. 调节阀故障一般都是什么原因呢?
  5. 如何相互实现阀门定位器的正反作用
  6. 【思特奇杯·云上蓝桥-算法集训营】第1周 猴子分香蕉 java
  7. Linux 下中文字体安装
  8. 教你认识水货手机翻新手机14天机的鉴别和选购
  9. CAS:169501-65-9,4-arm-PEG-NH2,四臂-PEG-氨基可用于修饰蛋白质
  10. 2019_AAAI_Multi-Interactive Memory Network for Aspect Based Multimodal Sentiment Analysis