模块详细信息就不贴了
整体流程就是初始化IO口和定时器
然后等待响应然后开启定时器使能,统计定时器的时间,然后计算距离

#include "sr04.h"
#include "delay.h"
#include "usart.h"
u32 Count_update,Distance1;//超声波模块Trig、Echo初始化
void Ultras_GPIO_Init(void)
{//设置Trig引脚GPIO的输出模式为推挽输出
//设置Echo引脚GPIO的输入模式为浮空输入
//并打开相应GPIO的时钟GPIO_InitTypeDef GPIO_InitStructure;/* Configure TRIG Button */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //设置成推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_TRIG_Pin;    //配置TRIG的引脚是PB1GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      GPIO_Init(GPIO_TRIG_PORT, &GPIO_InitStructure);   //端口  B/* Configure ECHO Button */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //模式设置成浮空输入GPIO_InitStructure.GPIO_Pin = GPIO_ECHO_Pin; //PB0GPIO_Init(GPIO_ECHO_PORT, &GPIO_InitStructure);
}//定时器TIM3初始化
void Ultras_TIM3_Init(void)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;/* 开启定时器3的时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   //定时时间 1us   计数一次//这个就是自动装载的计数值,计数器的值从零开始TIM_TimeBaseStructure.TIM_Period = 65535;  //计数值记一次 1us// 这个就是预分频系数,当由于为0时表示不分频所以要减1TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1);// 使用的采样频率之间的分频比例TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//向上计数TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//初始化定时器3TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_ClearFlag(TIM3, TIM_FLAG_Update);                                       /* 清除溢出中断标志 *///  TIM_Cmd(TIM3, ENABLE);  //计数器使能,开始工作  先关闭时钟  等待使用
}//超声波模块初始化
void Ultrasonic_Init(void)
{Ultras_GPIO_Init();Ultras_TIM3_Init();
}
void GetDistance(void)//根据定时器的值计算距离
{u8 i;u32 UltrasonicWave_Distance,s_Distance=0;//这里取六次的数据的平均值for(i=0;i<6;i++){GPIO_SetBits(GPIO_TRIG_PORT,GPIO_TRIG_Pin);          //送>10US的高电平delay_us(15);                            //延迟15usGPIO_ResetBits(GPIO_TRIG_PORT,GPIO_TRIG_Pin);while(GPIO_ReadInputDataBit(GPIO_ECHO_PORT,GPIO_ECHO_Pin) ==RESET);                 //等待高电平TIM_Cmd(TIM3, ENABLE);                                             //开启时钟while(GPIO_ReadInputDataBit(GPIO_ECHO_PORT,GPIO_ECHO_Pin) !=RESET);                    //等待低电平TIM_Cmd(TIM3, DISABLE);                                          //定时器3关闭使能UltrasonicWave_Distance=TIM_GetCounter(TIM3)*170/10000;          //计算距离TIM_SetCounter(TIM3,0);//清空TIM3的值s_Distance+=UltrasonicWave_Distance;}s_Distance=s_Distance/6;printf("Distance:%d cm\r\n",s_Distance);delay_ms(200);
}
#ifndef __SR04_H
#define __SR04_H
#include "sys.h"
#include "stm32f10x.h"
#define GPIO_TRIG_PORT GPIOB
#define GPIO_ECHO_PORT GPIOB
#define GPIO_TRIG_Pin  GPIO_Pin_1
#define GPIO_ECHO_Pin  GPIO_Pin_0
void Ultrasonic_Init(void);
void GetDistance(void); void Ultras_GPIO_Init(void);
void Ultras_TIM3_Init(void);void TIM3_IRQHandler(void);
u32 calculer(u32 count);
void Display(u32 Distance);#endif
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "oled.h"
#include "timer.h"
#include "sr04.h"
int main(void)
{delay_init();           //延时函数初始化    uart_init(115200);        //串口初始化为115200LED_Init();               //初始化与LED连接的硬件接口OLED_Init();OLED_ShowString(0,0,"Welcome To STM32",16);Ultrasonic_Init();printf("I'm ok!\r\n");//TIM3_Int_Init(1999,7199);//Tout= (arr+1)(psc+1)/TCLK;//TIM3_PWM_Init(1999,719);//PWM周期为20ms = (7200*200)/72000000while(1){GetDistance();}
}

串口显示如下

STM32F103:二.(5)控制HC-SR04超声波相关推荐

  1. STM32F103:二.(4)控制SG90舵机

    先展示下定时器通道表: 参考正点原子PWM,端口号为PB5 //TIM3 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM3_PWM_Init ...

  2. hc sr04流程图_超声波传感器HC-SR04完整应用以及程序讲解

    带有Arduino的超声波传感器HC-SR04完整应用指南 本文是有关流行的超声波传感器HC – SR04的应用指南.我们将解释其工作原理,向您展示其某些功能,并分享一个您可以遵循的Arduino项目 ...

  3. STM32F103:二.(3)DHT11温湿度

    STM32F103:二.(3)DHT11温湿度 模块介绍 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠 ...

  4. Oracle使用手册(二)---流程控制

    Oracle使用手册(二)---流程控制 --流程控制 --1. if..then..end if  set serveroutput on  declare  i integer:=60; j in ...

  5. 提出了一种新的基于一致性算法的直流微电网均流和均压二级控制方案 关键词:一致性算法;直流微电网;下垂控制;分布式二次控制

    关键词:一致性算法;直流微电网;下垂控制;分布式二次控制;电压电流恢复与均分;非线性负载;MATLAB/Simulink;顶刊复现, 主题:提出了一种新的基于一致性算法的直流微电网均流和均压二级控制方 ...

  6. 基于横向轨迹误差法(Cross-track Error)P 导航二维控制 实现无人机水平面导航控制

    基于横向轨迹误差法(Cross-track Error)P 导航二维控制 实现无人机水平面导航控制 算法核心思想 算法实现方法 实现无人机水平面导航控制 算法优化方向 算法核心思想 首先我们的目的是控 ...

  7. STM32控制3路超声波传感器

    使用STM32定时器输入捕获模块控制3路超声波传感器 本次使用的超声波传感器是常见HC-SR04,该传感器常常使用在小型机器人和智能小车的避障系统中. 在上图中,5v和GND为模块提供电能,Trig用 ...

  8. 微电网分布式电源逆变器DROOP控制二次调频模型,加入二次控制实现二次调频控制,及二次调压控制

    微电网分布式电源逆变器DROOP控制二次调频模型,加入二次控制实现二次调频控制,及二次调压控制,程序可实现上图功能,工况有所改变. 需要matlab2021A版本 ID:545596735172708 ...

  9. ArcBall二维控制三维旋转

    ArcBall二维控制三维旋转 由于目前大多的显示器是二维的,要控制三维物体的旋转就显得不那么直接了.ArcBall是一种将二维鼠标位置的变化映射到三维物体旋转的方法,让用户通过很直观的方法控制物体旋 ...

最新文章

  1. shell中竖线的作用_如何在 Linux 中安装、配置和使用 Fish Shell?
  2. 特斯拉撞了警车:辅助系统Autopilot全程开启,连撞两车还没自动停下
  3. 音视频编解码: YUV采样格式中的YUV444,YUV422,YUV420理解
  4. 2021年炼丹笔记最受欢迎的10篇技术文章
  5. 蚂蚁金服 3 个项目进入 CNCF 云原生全景图 | 开源
  6. 48 SD配置-定价配置-定义条件表
  7. iptables总结--理解四表五链/snat/dnat/redirect/synproxy/性能
  8. linux系统oracle监听启动,linux下启动与关闭oracle监听与实例
  9. 一个优秀数据分析师的准则
  10. Alkman Euclidean Sequencer PRO Mac - 复合节奏音序器
  11. 「Linux」- 修改鼠标滚轮的滚动方向 @20210315
  12. C语言表示欧拉常数算法,计算li(x)的两个级数的C语言实现
  13. 原生js编写学生信息管理系统——添加学生信息
  14. 真空灾难:物理学最著名的未解难题之一
  15. Linux下的流量控制(TC)和服务质量(QoS)
  16. ZUCC_操作系统原理实验_实验九 消息队列
  17. DexPathList在真机环境下闪退的两种解决方案。
  18. 关于小梅哥ADC128S022驱动设计的思考
  19. 数据分析入门必知--数据分析流程
  20. 布隆过滤器原理及实践

热门文章

  1. c语言 为什么in 1,C语言i++和++i的区别
  2. html 点击选择变色,JS实现菜单点击后变色
  3. mysql数据库被远程连接_如何让mysql数据库准许被远程连接访问
  4. C语言学习及项目开发所遇问题总集(一)---Mr.Zhang
  5. php7 mysql json 小程序_微信小程序JSON数组递交PHP服务端解析处理
  6. 分子动力学aimd_研究人员在沸石分子筛活性调控研究方面取得新进展
  7. android 仿快递步骤_Android开发-类似物流快递进度效果
  8. pymysql使用变化的变量,构造SQL语句
  9. 无界面chrome + selenium爬虫
  10. android 拖拽gridview,Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换