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

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

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471636.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S学习01——SPI&IIC

1、温习IIC总线协议1)I2C 总线的一些特征1> 只要求两条总线线路 一条串行数据线 SDA 一条串行时钟线 SCL2> 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机 从机关系软件设定地址 主机可以作为主机发送器或主机接收器3> 它是一个真正的多主机总线 如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁,防止数据被破坏4> 串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s 快速模式下可达 400kbit/s 高速模式下可达 3.4Mbit/s5> 片上的滤波器可以滤去总线数据线上的毛刺波 保证数据完整6> 连接到相同总线的 IC 数量只受到总线的
发表于 2019-09-16

STM8S学习02——ADC

一、ADC_转换模式1、ADC支持5种转换模式:单次模式,连续模式,带缓存的连续模式,单次扫描模式,连续扫描模式。2、单次模式在单次转换模式中, ADC仅在由ADC_CSR寄存器的CH[3:0]选定的通道上完成一次转换。该模式是在当CONT位为0时通过置位ADC_CR1 寄存器的ADON位来启动的。一旦转换完成,转换后的数据存储在ADC_DR寄存器中, EOC(转换结束)标志被置位,如果EOCIE被置位将产生一个中断。3、连续和带缓存的连续模式在连续转换模式中,ADC在完成一次转换后就立刻开始下一次的转换。当CONT位被置位时即将ADC设为连续模式,该模式是通过置位ADC_CR1寄存器的 ADON 位来启动的。(1)如果缓冲功能没有
发表于 2019-09-16

STM8S学习05——EEPROM读写操作C语言程序

/*这两天项目开发中,用到STM8的EEPROM功能,几个数据要掉电保存,在网上也查了一下EEPROM操作,发现网上出现的问题主要有两点:1、EEPROM读写不成功;2、EEPROM读写的时间太长;看了一下ST的库函数,自己测试了一下,没有发现什么问题,比较正常;在读写EEPROM期间,也有动态扫描LED数码管,没有发现数码管有闪烁。操作过程中:1、开发平台:STM8S105K4T6 IAR6.3 ST库版本 V2.1.02、操作EEPROM,使用到的库函数:  FLASH_Unlock(FLASH_MEMTYPE_DATA);  while (FLASH_GetFlagSt
发表于 2019-09-16

STM8S学习04——网关学习

连接到另一个网络的“关口”。也就是网络关卡。网关(Gateway)又称网间连接器、协议转换器。默认网关在网络层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连。说明:由于历史的原因,许多有关TCP/IP的文献曾经把网络层使用的路由器称为网关,在今天很多局域网采用都是路由来接入网络,因此通常指的网关就是路由器的IP!在OSI中,网关有两种:一种是面向连接的网关,一种是无连接的网关。当两个子网之间有一定距离时,往往将一个网关分成两半,中间用一条链路连接起来,我们称之为半网关。(OSI是Open Syst
发表于 2019-09-16

STM8S学习03——寄存器版本的一些程序

();while(1){GPIO_WriteReverse(GPIOG, GPIO_PIN_0);Delay(50000);}}void Delay(unsigned int t){while(t--);}#ifdef USE_FULL_ASSERT;void assert_failed(u8 *file, u32 line){while(1){}}#endif/* stm8s_it.c 中的代码如下: *//*...INTERRUPT_HANDLER(CLK_IRQHandler,2){//清除中断标志位CLK_ClearITPendingBit(CLK_IT_SWIF);//完成切换CLK_ClockSwitchCmd(ENABLE
发表于 2019-09-16

解决stm8会卡在串口中断的问题

原因串口进入了OR(过载错误)中断解决方法必须添加if(UART1_GetITStatus(UART1_IT_RXNE )!= RESET),若不添加,会导致UART1->DR被异常读取,不断进入中断处理函数若UART的RXNE状态位已经被置1,串口又收到数据,将会进入OR(过载错误)中断,需要先读取UART_SR,再读取UART_DR才可把OR位中断状态清零,调用UART1_GetITStatus(UART1_IT_RXNE )即是读取UART_SR在调用UART1_ReceiveData8()读取了UART1->DR后即可清除中断UART1_IT_RXNE标志位INTERRUPT_HANDLER
发表于 2019-09-16

小广播

何立民专栏

单片机及嵌入式宝典

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

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