我所使用的测距模块是HC-SR04,C-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测

距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。

HC-SR04基本工作原理:
(1)采用IO口TRIG触发测距,给最少10us的高电平信呈。
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回, 通过IO口ECHO输出一个高电平, 高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2。

程序编写思路是:1、配置好使用到的GPIO以及定时器;
2、给模块TRIG端口发送大于10us的高电平信号,当收、收到ECHO回响信号是,打开定时器开始定时;
3、当回响信号消失,关闭定时器;
4、通过定时器 定时时间来确定距离。
上时序图表明你只需要提供一个 10uS以上脉冲触发信号,该模块内部将发出8个 40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。 由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。 公式: uS/58=厘米或者uS/148=英寸; 或是: 距离=高电平时间*声速( 340M/S) /2; 建议测量周期为 60ms以上, 以防止发射信号对。
回响信号的影响
具体程序如下:
#include "cs.h"
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"

/*记录定时器溢出次数*/
uint overcount=0;


/*设置中断优先级*/
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructer;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructer.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructer.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructer);
}

/*初始化模块的GPIO以及初始化定时器TIM2*/
void CH_SR04_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructer;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/*TRIG触发信号*/
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8;
GPIO_Init(GPIOB, &GPIO_InitStructer);

/*ECOH回响信号*/
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9;
GPIO_Init(GPIOB, & GPIO_InitStructer);

/*定时器TIM2初始化*/
TIM_DeInit(TIM2);
TIM_TimeBaseInitStructer.TIM_Period=999;//定时周期为1000
TIM_TimeBaseInitStructer.TIM_Prescaler=71; //分频系数72
TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//不分频
TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启更新中断
NVIC_Config();
TIM_Cmd(TIM2,DISABLE);//关闭定时器使能

}

float Senor_Using(void)
{
float length=0,sum=0;
u16 tim;
uint i=0;
/*测5次数据计算一次平均值*/
while(i!=5)
{
PBout(8)=1; //拉高信号,作为触发信号
delay_us(20); //高电平信号超过10us
PBout(8)=0;
/*等待回响信号*/
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET);
TIM_Cmd(TIM2,ENABLE);//回响信号到来,开启定时器计数

i+=1; //每收到一次回响信号+1,收到5次就计算均值
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);//回响信号消失
TIM_Cmd(TIM2,DISABLE);//关闭定时器

tim=TIM_GetCounter(TIM2);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间

length=(tim+overcount*1000)/58.0;//通过回响信号计算距离

sum=length+sum;
TIM2->CNT=0; //将TIM2计数寄存器的计数值清零
overcount=0; //中断溢出次数清零
delay_ms(100);
}
length=sum/5;
return length;//距离作为函数返回值
}

void TIM2_IRQHandler(void) //中断,当回响信号很长是,计数值溢出后重复计数,用中断来保存溢出次数
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  {
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志
overcount++;

}
}

2017年6月9日
这篇文章已经很久了,很多同学问了问题,我没有来得及回,是在抱歉。上面的代码是超声波测距的代码,cs.h是头文件,内容如下:

#ifndef _CS_H
#define _CS_H

#include "sys.h"
#define uint unsigned int
#define TRIG_Send  PBout(8)
#define ECHO_Reci  PBin(9)

void CH_SR04_Init(void);
float Senor_Using(void);
void NVIC_Config(void);
#endif

这些代码已经能够测距了,Senor_Using()返回值就是距离。具体如何把测得数据显示,就按照各自需求来做就行了。

STM32的超声波测距程序相关推荐

  1. STM32F1系列超声波测距程序

    STM32F1系列超声波测距程序 因为自己做毕设的缘故,用到超声波HCSR04模块,在网上查找了相关的代码,发现关于超声波测距大体上有两种写法.在自己调试改进后,想把这两种方法都贴出来,和大家一起讨论 ...

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

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

  3. 最简单的51超声波测距程序

    文章目录 前言 一.51超声波测距是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 最简单的51超声波测距程序,注释相当详细,测量出来的值直接显示在数码管上,距离超过20cm就显示三个A, ...

  4. STM32用超声波测距模块实现测距

    STM32用超声波测距模块实现测距 通过超声波测距模块可以实现超声波反射型距离测试.市面上的超声波测距模块主要有两种.一种是分体式模块(HC-SR04等),由超生波发射头和接收头组成,一种是一体式模块 ...

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

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

  6. stm32控制超声波测距模块HC-SR04

    引脚:PB15 TRIG,PB0 ECHO: 不同距离,LED对应不良.闪烁.亮状态,并通过串口发送到PC; TIM3定时中断,测出脉宽长度,没有像野火一样使用捕捉功能: 1.HS-SR04模块实物图 ...

  7. 基于STM32的超声波测距

    一.HC-SR04模块介绍 HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可高达3mm:模块包括超声波发射器.接收器.与控制电路. 模块的基本工作原理为: (1) ...

  8. STM32基础——超声波测距+OLED显示+蜂鸣器报警

    此代码的格式可以直接烧录到STMF03C8T6最小系统中,烧录在其它芯片需要自己进行代码移植,功能是使用超声波模块进行测距,距离会显示在OLED屏幕上,并且当测量到的数据小于设定的范围是,蜂鸣器报警, ...

  9. 超声波测距 c语言程序流程图,超声波测距程序(详细C语言数码管显示)

    #include<reg52.h> //头文件 #include<intrins.h>// _nop_() 函数延时1US用 #include <stdio.h> ...

最新文章

  1. Yahoo为啥赚不到钱
  2. vue脚手架项目打包成app_React和Vue脚手架项目打包编译后如何打开
  3. Lombok(1.14.8) - @Log
  4. 003 HandlerMapping
  5. C#点滴 – 内建基本类型
  6. Clone()方法C#
  7. spring-beanFactory二
  8. CSS使图像等比例缩放兼容IE6、IE7、FF
  9. Fluent批处理及.jou和.scm文件编写的相关操作
  10. php方法-------将汉字转为拼音或者提取汉字首字母
  11. IT服务器台账系统,it项目管理信息系统
  12. 机器人动力学(雅克比)
  13. QT之信号和槽机制详解
  14. swfupload ajax,swfupload ajax无刷新上传图片实例代码
  15. [转]一淘网是如何实现系统架构的
  16. 因果图测试用例设计方法
  17. std::equal 用法
  18. 苹果cms模板_苹果CMS提示“模板文件不存在”怎么办?
  19. lerna 常用命令
  20. 动物识别系统c语言编程,人工智能期末论文-简单动物识别系统的知识表示.doc

热门文章

  1. Metacat实现原理解析
  2. 使用str.split (“\\.“)分割文件前后缀
  3. Python学习随笔:使用xlwings读取和操作Excel文件
  4. 古月居《ROS入门21讲》零基础学习笔记
  5. 5分钟NLP-知识问答(KBQA)两种主流方法:基于语义解析和基于信息检索的方法介绍...
  6. cocosjs游戏前端大厅源码分析之启动场景
  7. 5.5-6.5机考屠鸭历程
  8. 解决在JS中阻止定时器“重复”开启问题、Vue中定时器的使用
  9. DJ9-3 DMA 方式
  10. 谷歌的广告业务是如何赚钱的?