基于STM32的超声波HC-SR04历程

发布者:Tapir最新更新时间:2019-08-19 来源: eefocus关键字:STM32  超声波  HC-SR04 手机看文章 扫描二维码
随时随地手机看文章

HC-SR04基本工作原理:


(1)采用IO口TRIG触发测距,给最少10us的高电平信呈。

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

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

程序编写思路是:1、配置好使用到的GPIO以及定时器;

2、给模块TRIG端口发送大于10us的高电平信号,当收、收到ECHO回响信号是,打开定时器开始定时;

3、当回响信号消失,关闭定时器;

4、通过定时器定时时间来确定距离。

/*Systick延时函数

  Systick 延时初始化*/

 

void SysTick_Delay_Us( unsigned int us)   //1微妙延时

{

uint32_t i;

SysTick_Config(SystemCoreClock/1000000);

for(i=0;i {

       //当计数器的值减小到0的时候,CRTL寄存器的为16置1,当置1的时候该位清0

while( !((SysTick->CTRL)&(1<<16)) );

}

// 关闭定时器

SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;

}

 

 

//1毫秒延时

void SysTick_Delay_Ms( unsigned int  ms)

{

uint32_t i;

SysTick_Config(SystemCoreClock/1000);

for(i=0;i {

while( !((SysTick->CTRL)&(1<<16)) );

}

SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;

}

 

/*TIM2定时器初始化

    一些宏定义再次不多过说明 */

 

void Timer_Config()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   

TIM_DeInit(TIM2);

TIM_TimeBaseInitStructer.TIM_Period=65535;//定时周期  这里没开启定时中断,这个周期最大到2米距离

TIM_TimeBaseInitStructer.TIM_Prescaler=72-1; //  分频系数

TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//不分频

TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;

/*定时器初始化完成*/

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);.

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

TIM_Cmd(TIM2,DISABLE);//¹关闭定时器使能

 

 

}

 

 

/*超声波距离函数*/

 

#include "Chao.h"

 

#include "Systick.h"

extern char dis[];    //存储转换后的值

int Val=0;

extern int Length;

 

/*初始化超声波IO*/

void HS_GPIO_Config()

{

GPIO_InitTypeDef GPIO_InitStruct;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);  //´ò¿ªGPIOʱÖÓ

//Trig

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  

GPIO_InitStruct.GPIO_Pin = Trig;   

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(HC_SR04_Port,&GPIO_InitStruct );

 

//Echo

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStruct.GPIO_Pin = Echo; 

GPIO_Init(HC_SR04_Port,&GPIO_InitStruct );

}

 

char  *Convert()  //将整型数据转换后存储到字符数组里

{

int tmp=0,i=0;

Length=0;   //数据长度

Val=UltraSonic();

//Val=26;

tmp=Val;

while(tmp)

{

tmp=tmp/10;

Length++;

}

 

for(i=Length-1;i>=0;i--)

{

dis[i]=Val%10+'0';

Val=Val/10;

}

return dis;

}

 

int UltraSonic()   //超声波距离

{

unsigned int length=0;

GPIO_ResetBits(HC_SR04_Port, Trig);  //先拉低

GPIO_SetBits(HC_SR04_Port, Trig);  //拉高电平信号

SysTick_Delay_Us(20);   //拉高电平超过10US

GPIO_ResetBits(HC_SR04_Port, Trig); //拉高够了就拉低

      /*等待回响信号*/

while(GPIO_ReadInputDataBit(HC_SR04_Port,Echo)==0);  //高电平就是接收到了

TIM_Cmd(TIM2,ENABLE);//使能TIM2定时器

while(GPIO_ReadInputDataBit(HC_SR04_Port,Echo)==1);//回响信号消失了

TIM_Cmd(TIM2,DISABLE);//关闭定时器

length=TIM_GetCounter(TIM2)/58;

if(length<=0) length=0;

       TIM_SetCounter(TIM2,0);  //取出TIM2定时器counter寄存器里的值

SysTick_Delay_Ms(200);  

return length;

}

 

/*    主函数  */

 

#include "stm32f10x.h"

#include "Chao.h"

#include "Systick.h"

#include "Timer.h"

 

int distence = 0;   

char dis[4];    

int Length=0;

int main()

{

char *Tmp;

HS_GPIO_Config();   

Timer_Config();      

while(1)

{

Tmp=Convert();

Speed_Arr(Tmp);

Speed_Byte(' ');

Speed_Byte('C');

Speed_Byte('M');

Speed_Byte('n');

SysTick_Delay_Ms(300);

}

}


关键字:STM32  超声波  HC-SR04 引用地址:基于STM32的超声波HC-SR04历程

上一篇:STM32F103 时钟系统明晰
下一篇:STM32F103 USART1串口重映射功能的实现

推荐阅读最新更新时间:2024-10-31 14:14

stm32学习之九
USART之实时显示电压值: 主要是adc.h和adc.c文件的编写(实验的时候写成了add.h和add.c) 调试一上午,出现一个不知道怎么搞的,时钟调错了,RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1,ENABLE); 调成了APB1,因此只能出现0v等。为戒为戒!!! add.h代码如下: #ifndef _ADD_H #define _ADD_H #include stm32f10x.h void ADC_Configure(); #endif add.c代码如下: #include add.h #define ADC1
[单片机]
<font color='red'>stm32</font>学习之九
stm32开发板开发笔记(5)-2.4寸26万色TFT触摸屏模块
因为产品要用到显示屏和触摸,就买了一个2.4寸的彩色触摸屏模块。 原理图: 显示屏的驱动芯片是ILI9325 ILI9325 is a 262,144-color one-chip SoC driver for a-TFT liquid crystal display with resolution of 240RGBx320 dots, comprising a 720-channel source driver, a 320-channel gate driver, 172,800 bytes RAM for graphic data of 240RGBx320 dots, and power supply
[单片机]
<font color='red'>stm32</font>开发板开发笔记(5)-2.4寸26万色TFT触摸屏模块
劳易测易学堂干货分享-超声波传感器的原理与应用
光学 传感器 是一种将光信号转换为电信号的装置,它在自动化生产中发挥着至关重要的作用。劳易测光学传感器以其卓越的性能和广泛的适用性,成为了该领域的专家,产品广泛运用在物流自动化、包装行业、汽车行业、电子行业、锂电行业等多个领域。今天,让我们一起来探索光学传感器的原理。 光电开关的组成 光电开关是光学传感器中最基本的一种形式,它主要由光源、光电探测器、开关电路等组成。当有物体挡住光线时,光电探测器接收到的光信号减弱,从而触发开关电路,输出电信号。劳易测光学传感器采用先进的光电探测技术,可以实现高精度的光信号检测,从而保证开关的准确性。 光谱及光源类型: 光谱是指光按照波长或频率分布的特性。劳易测光学传感器所在光谱有可见光
[机器人]
stm32笔记:Systick系统滴答定时器
Systick :系统心跳定时器,提供系统节拍 裸机程序中可作为独立的延时定时器 用途: 1.产生操作系统的时钟节拍 2.便于不同处理器之间程序移植 SysTick定时器被捆绑在NVIC中,异常号15 3.作为一个闹铃测量时间用于测量时间, 但当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作 它有四个寄存器 STK_CSR, 0xE000E010 -- 控制寄存器 STK_LOAD, 0xE000E014 -- 重载寄存器 STK_VAL, 0xE000E018 -- 当前值寄存器 STK_CALRB, 0xE000E01C -- 校准值寄存器 stm32的时钟源 选择外部时钟源时,则Sy
[单片机]
<font color='red'>stm32</font>笔记:Systick系统滴答定时器
STM32程序中使用printf打印中文字符乱码
前言: 相信同我一样,有一部分同学在写单片机程序的时候喜欢用printf打印相关信息到串口,然后在串口调试助手看数据变化。 但是我之前在使用printf去打印中文字符的时候,出现了乱码,这种问题以前也碰到过,只是没去深究为什么,往往都是重新建工程,写代码。 但是时隔很久,又再次碰到这个问题,就想好好把这个问题修改完, 我是使用的IAR平台,使用的keil的小伙伴也可以用这个方法解决,都是一样的。 1、首先看一下错误。串口打印中文,串口助手出现乱码。经检查不是波特率的问题 因为每次用CubeMX配置完之后生成代码,IAR都是以默认编码UTF-8编码的,所以导致了中文乱码,如果设置成系统设置,也会乱码,错误设置如下(同
[单片机]
<font color='red'>STM32</font>程序中使用printf打印中文字符乱码
STM32】寄存器位的操作方式
read / write (rw) 软件能读写此位。 read-only (r) 软件只能读此位。 write-only (w) 软件只能写此位,读此位将返回复位值。 read/clear (rc_w1) 软件可以读此位,也可以通过写’1’清除此位,写’0’对此位无影响。 read / clear (rc_w0) 软件可以读此位,也可以通过写’0’清除此位,写’1’对此位无影响。 read / clear by read (rc_r) 软件可以读此位;读此位将自动地清除它为’0’,写’0’对此位无影响。 read / set (rs) 软件可以读也可以设置此位,写’0’对此位无影响。 read-only write trigger
[单片机]
stm32 使用正点原子delay延时函数,主函数延时失效
最近在做一个东西时,发现一个现象。之前一直没有发现过,或者发现也没有仔细研究过,在此为大家分享。 在使用原子哥的延时函数时,发现主函数里面的延时函数失效了。没有起任何作用。下面简单分析一个整个过程。 先直接上代码,很简单的一个实例 int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init();
[单片机]
STM32简单的LED流水灯程序
//0x4002 1000 - 0x4002 13FF 复位和时钟控制(RCC) #define RCC_BASE 0x40021000 #define RCC_APB2ENR (RCC_BASE+0x18) //LED接在GPIOF上,是APB2上的外设,是RCC_APB2ENR寄存器的第7位 //APB20x4001 1c00 GPIO端口F #define GPIOF_BASE 0x40011c00 #define GPIOF_CHL (0x000+GPIOF_BASE) #define GPIOF_CHR (0x004+GPIOF_BASE) #defin
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved