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以上的脉冲信号。
HC-SR04超声波模块传感器_第1张图片
OUT脚为此模块作为防盗模块时的开关量输出脚,测距模块不用此脚!
注:模块应先插好在电路板上再通电,避免产生高电平的误动作,如果产生了,重新通电方可解决。

模块工作原理:
(1)采用IO触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是
超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;
HC-SR04超声波模块传感器_第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 

//--定义数码管使用的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();           //计算
    }
}

你可能感兴趣的:(学习笔记)