当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 基于STM32F103ZET6 HC_SR04超声波测距模块

基于STM32F103ZET6 HC_SR04超声波测距模块

2019年04月13日  | 移动技术网IT编程  | 我要评论

狙击涨停板,上海嘉定韵达快递,环球极限下载

这是最后的实验现象,改变不同的角度即可测得距离

板子 pz6806l 超声波模块 hc_sr04

hc_sr04模块讲解

通过该超声波模块说明书,可明白供电需vcc 5v  还需gnd  echo(回响信号)  trig(触发信号)

也就是说总共需要4根线,其中vcc和gnd只需要接到开发板上的5v电源和gnd即可

这是我的接线图

 

 echo 使用的是pc3引脚,trig 使用的是pc2引脚

pc3和pc2只是普通的引脚,没任何特殊性,可凭自己想法配置不同的引脚

 

从超声波时序图看出,若想能够使用该模块,

1 使用你要触发信号拉高10us以上

 

2 接着模块内部自己发出8个40khz脉冲,不需要管,接着模块会输出回响信号,而回响信号高电平的

脉冲宽度,与距离成正比

 

以上知道这些就可以正常使用,至于距离公式后面会再解释

注意

 

接着就是代码部分,主函数最后再介绍

hc_sr04配置函数及echo高电平时间

首先是头文件

配置一个变量 time,用于存储回响信号高电平的时间

void hc_sr04_init(void); 该函数是引脚的配置函数

float  get_hcsr04length(void);该函数是用来发送触发信号,并得到回响信号的高电平时间

 

 

void hc_sr04_init(void)
{

gpio_inittypedef gpio_initstructure;

rcc_apb2periphclockcmd(rcc_apb2periph_gpioc ,enable);//打开gpioc的时钟

gpio_initstructure.gpio_pin = gpio_pin_2;//配置引脚2,trig触发信号
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_initstructure.gpio_mode = gpio_mode_out_pp;//配置为推挽输出
gpio_init(gpioc, &gpio_initstructure);
gpio_resetbits(gpioc,gpio_pin_2);//触发信号,首先把它拉低,避免额外影响

gpio_initstructure.gpio_pin = gpio_pin_3;//配置引脚3,echo回响信号
gpio_initstructure.gpio_mode = gpio_mode_in_floating;//配置为模拟输入
gpio_init(gpioc, &gpio_initstructure);//echo信号
gpio_resetbits(gpioc,gpio_pin_3);//也同样拉低
}

 

 

 

float get_hcsr04length(void)
{
gpio_setbits(gpioc,gpio_pin_2);
delay_us(20);
gpio_resetbits(gpioc,gpio_pin_2); //trig发送触发信号,延时10us以上就可以了

while(pci(3)==0) //当echo一直是低电平的时候,就清空,并且关闭计时器
{
tim_setcounter(tim2, 0);
tim_cmd(tim2,disable);
}
while(pci(3)==1)//一旦echo被拉高了,就说明模块传需要的数据回来了,打开计时器
{
tim_cmd(tim2,enable);
}
time=tim_getcounter(tim2);//当被拉高的echo再次变回低电平时,将计时器的值赋给time
return time;//返回time
}

 

计时器函数的配置

 

void tim_counter(void)
{
tim_timebaseinittypedef tim_timebasestructure;
rcc_apb1periphclockcmd(rcc_apb1periph_tim2,enable);//使能tim2的时钟

tim_timebasestructure.tim_period = 65535;
tim_timebasestructure.tim_prescaler = 71;//72mhx/72=1us,
tim_timebasestructure.tim_clockdivision = 0x0;
tim_timebasestructure.tim_countermode = tim_countermode_up;//向上计数模式
tim_timebaseinit(tim2, & tim_timebasestructure);
tim_cmd(tim2,disable);//关闭,需要的时候再打开
}

 

部分主函数

 

int main(void)
{

float distance=0;//存储距离
delay_init(72); //配置滴答计时器
rcc_configuration();//时钟配置
gpio_configuration();//gpio配置,只是pc0(led0),用来提示系统正常运行
tim_counter();//计时器的配置
usart1_configuration();//串口配置,
hc_sr04_init();//hc_sr04初始化配置好(即pc2,pc3的配置)


  while(1)
  {
gpio_resetbits(gpioc,gpio_pin_0);//提示系统正常运行进该循环

 


distance =(get_hcsr04length()*340/2/1000);//从函数得到距离值,340是声音的速度,除于2,是因为声波发出到接收,是一次来回,除于1000,是将距离定为mm(毫米),该函数返回的就是之前time的值
printf("距离是%.2f\r\n",distance);
delay_ms(1000);//延时1秒钟,这样不会输出太过频繁
  }
}

 

这是我的工程文件

 

百度网盘  密码 v3y7

https://pan.baidu.com/s/1mnvf70_gnz5aqsm6xinrma

 

如有需要,可结合自己板子修改下代码即可使用,欢迎交流,咱们共同进步

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网