HC-SR04超声波模块驱动(STM32)

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

一、前期准备

单片机:STM32F103C8T6

开发环境:MDK5.14

库函数:标准库V3.5

HC-SR04模块:淘宝有售

在这里插入图片描述


二、实验效果

在这里插入图片描述
在这里插入图片描述

三、驱动原理

触发信号Tirig维持10Us以上的高电平即可等待Echo的返回,这里是用EXTI检测俩个跳变信号,去打开和关闭定时器,最后一次测量计算结果后清除定时器计时,并等待下一个循环开始。需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。


四、驱动代码

US-020.h


#ifndef __US_020_H__

#define __US_020_H__

#include "stm32f10x.h"

#include "gpio.h"

#include "delay.h"


#define Trig PAout(0)

#define Trig_Pin GPIO_Pin_0

#define Trig_Port GPIOA

#define Trig_CLKLine RCC_APB2Periph_GPIOA

#define Echo PAin(1)

#define Echo_Pin GPIO_Pin_1

#define Echo_Port GPIOA

#define Echo_CLKLine RCC_APB2Periph_GPIOA


extern uint32_t US_Count;

extern void US_020Configuration(void);

extern void US_SendStartSignal(void);

extern float US_DataConversion(uint32_t *count);

#endif


US-020.c


#include "US-020.h"


uint32_t US_Count = 0;

void US_020Configuration(void)

{

GPIO_InitTypeDef    GPIO;

    NVIC_InitTypeDef MyNVIC;

EXTI_InitTypeDef MyEXTI;

    //Enable APB2 Bus

    RCC_APB2PeriphClockCmd(Trig_CLKLine | Echo_CLKLine, ENABLE);

    

    //Register IO 

    GPIO.GPIO_Pin   = Trig_Pin;

    GPIO.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO.GPIO_Mode  = GPIO_Mode_Out_PP;

    GPIO_Init(Trig_Port, &GPIO);

Trig = 0;

//Register IO 

    GPIO.GPIO_Pin   = Echo_Pin;

    GPIO.GPIO_Mode  = GPIO_Mode_IN_FLOATING;

    GPIO_Init(Echo_Port, &GPIO);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级组为1,优先组(可设0~4位)

MyNVIC.NVIC_IRQChannel = EXTI1_IRQn; //设置中断向量号

MyNVIC.NVIC_IRQChannelPreemptionPriority = 0; //设置抢先优先级

MyNVIC.NVIC_IRQChannelSubPriority = 1; //设置响应优先级

MyNVIC.NVIC_IRQChannelCmd = ENABLE; //使能NVIC

NVIC_Init(&MyNVIC);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);

MyEXTI.EXTI_Line = EXTI_Line1;

MyEXTI.EXTI_Trigger = EXTI_Trigger_Rising_Falling;

MyEXTI.EXTI_Mode = EXTI_Mode_Interrupt;

MyEXTI.EXTI_LineCmd = ENABLE;

EXTI_Init(&MyEXTI);

}


void US_SendStartSignal(void)

{

Trig = 1;

DelayUs(20);

Trig = 0;

}

float US_DataConversion(uint32_t *count)

{

float result = 0;

result = (float)((float)(*count * 340) / 2000.0);

*count = 0;

return result;

}


void EXTI1_IRQHandler(void)

{

if (EXTI_GetITStatus(EXTI_Line1) != RESET) 

EXTI_ClearITPendingBit(EXTI_Line1);

if (Echo == 1)

{

TIM_Cmd(TIM3, ENABLE);  

LED = 0;

}

if (Echo == 0)

{

TIM_Cmd(TIM3, DISABLE);  

LED = 1;

}

}

}


关键字:HC-SR04  超声波模块驱动  STM32 引用地址:HC-SR04超声波模块驱动(STM32)

上一篇:DS18B20温度模块驱动(STM32)
下一篇:JSN-SR04T超声波模块驱动(模式三、STM32)

推荐阅读最新更新时间:2024-11-09 17:21

基于STM32的软件定时器设计
1 什么是软件定时器 软件定时器是用程序模拟出来的定时器,可以由一个硬件定时器模拟出成千上万个软件定时器,这样程序在需要使用较多定时器的时候就不会受限于硬件资源的不足,这是软件定时器的一个优点,即数量不受限制。 但由于软件定时器是通过程序实现的,其运行和维护都需要耗费一定的CPU资源,同时精度也相对硬件定时器要差一些。 2 软件定时器的实现原理 在Linux,uC/OS,FreeRTOS等操作系统中,都带有软件定时器,原理大同小异。典型的实现方法是:通过一个硬件定时器产生固定的时钟节拍,每次硬件定时器中断到,就对一个全局的时间标记加一,每个软件定时器都保存着到期时间。 程序需要定期扫描所有运行中的软件定时器,将各个到期时间
[单片机]
基于<font color='red'>STM32</font>的软件定时器设计
STM32】HAL库-备份寄存器(BKP)
简介 备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。 他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。 当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。 使能对备份寄存器和RTC的访问 复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操作。执行以下操作可以使能对备份寄存器和RTC的访问。 通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟 电源控制寄存器(PWR_CR)的DBP位来使能对后备寄存器和RTC的访问。 使用电池或其他电源连接到VBAT脚上,当VDD断电时,可以保存
[单片机]
【<font color='red'>STM32</font>】HAL库-备份寄存器(BKP)
stm32下载方式之串口ISP\swd
1.首先看一下stm32启动模式 stm32的启动模式由32芯片的boot0与boot1引脚决定。分为内嵌flash启动模式(正常启动模式)、内存启动模式、rom启动模式 启动方式与引脚高低电平的对应关系如下,芯片复位的四个时钟周期内会去读取boot0和boot1引脚的电平情况确定芯片的运行模式。 boot0=0,boot1=x ----------------内嵌flash启动模式 boot0=1,boot1=1 ----------------内存启动模式 boot0=1,boot1=0----------------rom启动模式(串口isp下载程序) 2.串口isp下载方式 isp串口下载HEX
[单片机]
STM32小白入门(第12天)-------I2C协议
一、概述 二、信号概念 三、AT24C02(EEPROM电可擦除ROM)--配合单片机存贮掉电前需要保存的数据,类似单片机的硬盘 1、写时序 2、读时序 思考题2:在24c02控制时钟的时候,为什么要进行5us的延时,小于5us延时或许大于5us的延时是否可以,示例代码如下: //设置SCL高电平 SCL=1; delay_us(5); //设置SCL低电平 SCL=0; delay_us(5); 回答:大于5us是可以的,如果使用5ms是可以的。但是延时是不能低于1.2us,详细描述如下图。 3、起始信号和停止信号 //sda输
[单片机]
<font color='red'>STM32</font>小白入门(第12天)-------I2C协议
工作问题笔记-----STM32休眠问题
STM32低功耗分三种: SLEEP: 电压调节器开启,Cortex-M3内核停止运行,外设保持运行态; STOP: 电压调节器可选择性开启,所有外设时钟、PLL、HSI和HSE被关闭,Cortex-M3内核和所有外设停止运行,保留SRAM和寄存器的内容; STANDBY: 待机模式Standby:电压调节器关闭、整个1.8v区域断电。除了备份区域和待机电路的寄存器以外,SRAM和寄存器的内容全部丢失。 在休眠状态下,MCU的代码并不会继续执行,而是进入休眠状态,等待唤醒,唤醒的过程会先执行IRQ中断服务函数,然后再执行WFI后的函数。 省电级别由低到高,standby休眠后会让我们的数据丢失,而SLEE
[单片机]
STM32单片机的重映射与地址映射的使用方法及步骤
重映射 STM32中对于一些端口的外设已经被其他引脚所使用,这是就需要用端口重映射来解决了,很方便。 以USART1为例 重映射的步骤为: 打开重映射时钟和USART重映射后的I/O口引脚时钟, RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE); I/O口重映射开启。 GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE); 配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置。 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;GPIO_InitS
[单片机]
<font color='red'>STM32</font>单片机的重映射与地址映射的使用方法及步骤
ARM嵌入式开发--STM32时钟设置
大家都知道在使用单片机时,时钟速度决定于外部晶振或内部RC振荡电路的频率,是不可以改变的。而ARM的出现打破了这一传统的法则,可以通过软件随意改变时钟速度。这一出现让我们的设计更加灵活,但是也给我们的设计增加了复杂性。为了让用户能够更简单的使用这一功能,STM32的库函数已经为我们设计的更加简单方便。 在比较靠前的版本中,我们需要向下面那样设置时钟: ErrorStatus HSEStartUpStatus; /************************************************************************************** * FunctionName : R
[单片机]
理解STM32的中断优先级
STM32提供68个中断通道,每一个中断通道对应一个中断源,这里的中断源是指引发中断的外设(例如,I2C,UART,EXTI等等)。每一个中断源又可以包括多种中断发生情况,例如UART发送数据完毕,接收到数据等情况均可能引起UART中断源向STM32内核提出中断处理请求。 STM32的中断优先级可以分为抢占式优先级和非抢占式优先级控制两部分。 为了符合COTEX-M3标准,STM32的中断源优先级寄存器采用8位的方式存储,但是只是用了高4位,低4位保留未用。高4位又被分为了两段:抢占式优先级控制段和非抢占式优先级控制段。STM32提供了一个函数 NVIC_PriorityGroupConfig(NVIC_PriorityGrou
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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