HC-SR04超声波模块传感器

HC-SR04超声波模块传感器
HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。

主要技术参数:
1:使用电压:DC5V 2:静态电流:小于2mA
3:电平输出:高5V 4:电平输出:底0V
5:感应角度:不大于15度 6:探测距离:2cm-450cm
7:高精度:可达0.3cm

板上接线方式
VCC、 trig(控制端)、 echo(接收端)、 out(空脚)、 GND
注:TRIP引脚是内部上拉10K的电阻,默认为高电平,用单片机的IO口拉低TRIP引脚,然后给一个10us以上的脉冲信号。
这里写图片描述
OUT脚为此模块作为防盗模块时的开关量输出脚,测距模块不用此脚!
注:模块应先插好在电路板上再通电,避免产生高电平的误动作,如果产生了,重新通电方可解决。

模块工作原理:
(1)采用IO触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是
超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;
这里写图片描述

以上时序图表明你只需要提供一个10uS 以上脉冲触发信号,该模块内部将
发出8 个40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。
回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号
时间间隔可以计算得到距离。公式:uS/58=厘米或者uS/148=英寸;或是:距离=
高电平时间*声速(340M/S)/2;建议测量周期为60ms 以上,以防止发射信号对
回响信号的影响。
注:1、此模块不宜带电连接,若要带电连接,则先让模块的GND端先连接,否则会影响
模块的正常工作。
2、测距时,被测物体的面积不少于0.5平方米且平面尽量要求平整,否则影响测量的
结果。

TMOD寄存器
TMOD是定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)。
定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。
其格式为:
这里写图片描述
工作原理
其中低四位(即D0 ~ D3)定义定时器/计数器T0,高四位(即D4 ~ D7)定义定时器/计数器T1。
折叠Ⅰ,GATE–门控制。
●GATE=1时,”与门”的输出信号K由INTx输入电平和TRx位的状态一起决定(即此时K=TRx•INTx),当且仅当TRx=1,INTx=1(高电平)时,计数启动;否则,计数停止。
当INT0引脚为高电平时且TR0置位,TR0=1;启动定时器T0;
当INT1引脚为高电平时且TR1置位,TR1=1;启动定时器T1。
●GATE=0时,”或门”输出恒为1,”与门”的输出信号K由TRx决定(即此时K=TRx),定时器不受INTx输入电平的影响,由TRx直接控制定时器的启动和停止。
当TR0=1,启动定时器T0。
当TR1=1,启动定时器T1。
●C/T–功能选择位
C/T=0时为定时功能: 加1计数器对脉冲f进行计数,每来一个脉冲,计数器加1,直到计时器TFx满溢出;
C/T=1时为计数功能: 加1计数器对来自输入引脚T0(P3.4)和T1(P3.5)的外信号脉冲进行计数,每来一个脉冲,计数器加1,直到计时器TFx满溢出;
折叠Ⅲ,M0、M1–方式选择功能
MCS-51的定时器T0有4种工作方式:方式0,方式1,方式2,方式3。
MCS-51的定时器T1有3种工作方式:方式0,方式1,方式2。
M1 M0 工作方式 功能说明
0 0 方式0 13位定时器/计数器
0 1 方式1 16位定时器/计数器
1 0 方式2 自动重载8位定时器/计数器
1 1 方式3 T0分为2个8位独立计数器,T1无方式3
在使用定时器时,两个定时器中THx,TLx,中的值都是在累加的,当累加到最大值时,在51单片机中就是65535时,就是要溢出了,工作方式2可以自动装载,而其它工作方式不行,就需要手动进行装载。

51单片机测试程序
/* 超声波模块的TRIG管脚接在单片机的P20口,ECHO管脚接在单片机的P21口 其他的电源管脚接在单片机
开发板上电源口即可。 */

#include"reg51.h"
#include <intrins.h>

//--定义数码管使用的IO--//
#define GPIO_DIG P0

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit RX=P2^1;      //超声波模块引脚定义   ECHO管脚接在单片机的P21口
sbit TX=P2^0;      //TRIG管脚接在单片机的P20口


unsigned int  time=0;
unsigned int  timer=0;
unsigned char posit=0;
unsigned long S=0;
bit  flag =0;
//--定义全局变量--//
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char disbuff[4]       ={ 0,0,0,0,};
/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能         : 使用数码管显示
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DigDisplay()
{
    unsigned char i;
    unsigned int j;
    for(i=0;i<8;i++)
    {
        switch(i)    //位选,选择点亮的数码管,
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//显示第3位
            case(4):
                LSA=0;LSB=0;LSC=1; break;//显示第4位
            case(5):
                LSA=1;LSB=0;LSC=1; break;//显示第5位
            case(6):
                LSA=0;LSB=1;LSC=1; break;//显示第6位
            case(7):
                LSA=1;LSB=1;LSC=1; break;//显示第7位    
        }
        GPIO_DIG=disbuff[i];//发送段码
        j=10;                        //扫描间隔时间设定
        while(j--); 
        GPIO_DIG=0x00;//消隐
    }
}
/********************************************************/
void Conut(void)
{
     time=TH0*256+TL0;                                  //求出计时长
     TH0=0;
     TL0=0;

     S= (long)(time*0.17 );     //算出来是MM
     if((S>=4000)||flag==1) //超出测量范围显示“ERR0”
     {   
          flag=0;
          disbuff[0]=0x3f;     //“-”
          disbuff[1]=0x50;     //“-”
          disbuff[2]=0x50;     //“-”
          disbuff[3]=0x79;     //“-”
     }
     else
     {
          disbuff[3]=DIG_CODE[S%10000/1000];
          disbuff[2]=DIG_CODE[S%1000/100];
          disbuff[1]=DIG_CODE[S%100/10];
          disbuff[0]=DIG_CODE[S%10/1];
     }
}
/********************************************************/
 void zd0() interrupt 1          //T0中断用来计数器溢出,超过测距范围   //65.535ms定时
{
    flag=1;                          //中断溢出标志
}
/********************************************************/
 void  zd3()  interrupt 3        //T1中断用来扫描数码管和计800MS启动模块           //2ms定时   65535-63536=1999
 {
     TH1=0xf8;            //手动装载计数器初值
     TL1=0x30;
     DigDisplay();
     timer++;
     if(timer>=100)    //100*2=200ms
     {
      timer=0;
      TX=1;                         //给Trig端一个10us以上的高电平,触发HC_SR04返回8个40KHZ的方波, 800MS  启动一次模块
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_();
      _nop_(); 
      _nop_(); 
      _nop_(); 
      _nop_();
      TX=0;
     } 
 }
/*********************************************************/
void  main(  void  )
{  
    TMOD=0x11;         //设T0为方式1,GATE=0;设T1为方式1,GATE=0;

    TH0=0;             //65.535ms定时
    TL0=0;          

    TH1=0xf8;          //2ms定时    65535-63536=1999
    TL1=0x30;

    ET0=1;             //允许T0中断
    ET1=1;             //允许T1中断
    TR1=1;             //开启定时器1,但是没开启定时器0
    EA=1;              //开启总中断

    while(1)
    {
         while(!RX);        //当RX为零时等待
         TR0=1;             //开启计数
         while(RX);         //当RX为1计数并等待
         TR0=0;             //关闭计数
         Conut();           //计算
    }
}
### CH-SR 超声波模块电路图设计原理 CH-SR系列超声波模块(如HC-SR04、AJ-SR04M-T-X等)通常由超声波发射器、接收器以及控制芯片组成。其核心功能是通过发送和接收超声波信号来测量距离。以下是关于该类模块的设计原理及其典型电路图的关键点: #### 1. **模块结构概述** CH-SR超声波模块主要分为两部分:超声波发射单元和接收单元。其中,触发信号由外部控制器发出,经过内部处理后驱动超声波探头发射高频脉冲[^1]。 #### 2. **电路组成部分** - **电源管理** 模块一般采用5V供电电压,需注意输入电源的稳定性以防止干扰。对于某些型号,可能还需要额外的稳压电路来保护敏感元件[^2]。 - **触发接口 (Trig)** 外部微控制器向模块的Trigger端口提供至少10μs的高电平信号即可启动一次测距操作。 - **回响接口 (Echo)** 当检测到障碍物反射回来的超声波时,Echo引脚会输出一个与其往返时间成正比的高电平脉宽信号。 #### 3. **典型电路连接方式** 以下是基于HC-SR04的一个简单示例电路配置: ```plaintext +-------------------+ | | | HC-SR04 |---- Trig -----> MCU GPIO Pin X | |---- Echo ------> MCU GPIO Pin Y | |---- VCC -------> +5V Power Supply | |---- GND -------> Ground +-------------------+ ``` 此设置适用于大多数单片机平台,例如STM32F407或经典8位MCU如STC/ATmega系列。 #### 4. **硬件设计要点** 为了提高精度并减少噪声影响,在实际布局PCB板时应注意以下几点: - 尽量缩短信号线长度尤其是高频路径; - 使用独立的地平面隔离模拟与数字区域; - 添加去耦电容器靠近IC电源脚位置以滤除纹波波动。 #### 示例代码片段用于验证接线正确性 下面给出一段基础测试程序供参考(针对STM32架构): ```c #include "stm32f4xx_hal.h" #define TRIG_PIN GPIO_PIN_9 #define ECHO_PIN GPIO_PIN_10 #define TRIG_GPIO_PORT GPIOA #define ECHO_GPIO_PORT GPIOA void delay_us(uint32_t us){ __HAL_TIM_SET_COUNTER(&htim2, 0); // Reset counter to zero. while (__HAL_TIM_GET_COUNTER(&htim2) < us); } float getDistance(){ uint32_t duration; HAL_GPIO_WritePin(TRIG_GPIO_PORT, TRIG_PIN, GPIO_PIN_RESET); delay_us(2); HAL_GPIO_WritePin(TRIG_GPIO_PORT, TRIG_PIN, GPIO_PIN_SET); delay_us(10); HAL_GPIO_WritePin(TRIG_GPIO_PORT, TRIG_PIN, GPIO_PIN_RESET); while(HAL_GPIO_ReadPin(ECHO_GPIO_PORT,ECHO_PIN)==GPIO_PIN_RESET); __HAL_TIM_SET_COUNTER(&htim2, 0); while(HAL_GPIO_ReadPin(ECHO_GPIO_PORT,ECHO_PIN)==GPIO_PIN_SET); duration=__HAL_TIM_GET_COUNTER(&htim2); return ((float)(duration*0.034)/2); // Speed of sound is approx. 340m/s -> 0.034cm/us * half the time since it's round trip distance. } ``` 上述函数实现了基本的距离计算逻辑,并假设定时器已经初始化完成以便精确捕捉ECHO脉宽变化情况。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值