超声波模块工作原理分析及程序

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_40603235/article/details/78219231


       模块发出一定频率的超声波,超声波遇到物体发生反射,返回到发射处可以被模块检测到

通过x=v*t,可得distance=x/2

模块工作原理:

   以常见的HY-SRF05模块为例介绍,其它型号的工作原理与此模块大相径庭。

   5个引脚分别为vcc、trig、echo、out、gnd,5v供电,采用io引脚trig触发测距,给至少10us的高电平,即可开启测距功能。如果自动检测到有信号返回时,通过io引脚echo输出一个高电平。

  由上面的工作原理结合单片机的中断定时器可以确定如下的工作方案,我以51单片机为例进行说明:

       开始给trig一个大于10us的脉冲,使模块开始工作,同时开启定时器开始计时,将外部中断接到echo引脚上,当模块检测到回波时echo被置高电平,这时外部中断被触发,进入中断程序,因此我们可以在中断程序中将时间读出来,有了时间就可以根据distance=v*t/2,计算出距离,距离值就可以用于进一步的工作

以51为控制,数码管显示距离的代码:

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

int time,flag;

uchar timeL,timeH;

uint distance;                                                                                                                                                                                                                                                                                           sbittrig=P2^0;                                                                                                                                                                                                                                                                                           sbit echo=P3^2;

uchar codeduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,                                                                          

0x7f,0x6f}; //数码管段选

uchar code wei[]={0xfe,0xfd,0xfb,0xf7};//数码管位选

uchar shuju[4];

//延时函数

void delay(uint a)

{

         uintb;

 while(a--)

                   for(b=113;b>0;b--);

}

 

//延时20微秒

void delay20us()

{

 uchar c;

         for(c=0;c<100;c++);

}

 

void shujuxuan ()//确定送的数据

{

 shuju[3]=distance/1000;

 shuju[2]=distance/100%10;

 shuju[1]=distance/10%10;

 shuju[0]=distance%10;

}

void xianshi()//显示函数

{

 uchar i;

         for(i=0;i<4;i++)

         {

                   P0=wei[i];//送位码

                   P1=duan[shuju[i]];//送段码

                   delay(4);

                   //j=10;

                   //while(j--);

         }

}

void main()

{

 //uint distance;

         trig=0;//拉低脉冲输入引脚

         EA=1;//打开总中断

         TMOD=0x10;//定时器1,16位工作方式

         while(1)

         {

          EA=0;//关总中断

          trig=1;//超声波输入端

          delay20us();//延时20微秒

          trig=0;//产生一个20微秒的脉冲

          while(echo==0);//等待echo回波引脚变高电平

  flag=0;//清测量成功标志

  EA=1;

  EX0=1;//打开外部中断0

  TH1=0;

  TL1=0;//定时器清零

  TF1=0;//计数器溢出标志清零

  TR1=1;//启动定时器1

  delay(20);//等待测量的结果

  TR1=0;//关闭定时器1

  EX0=0;//关闭外部中断0

  if(flag==1)

   {

   time=timeH*256+timeL;

           distance=time*0.172;//毫米

   }

  if(flag==0)

   {

    distance=0;//没有回波则清零

   }

          

          shujuxuan();

          xianshi();

         }      

}

 

//外部中断0,用做判断回波电平

void zhongduan() interrupt 0

{

 timeH=TH1;

         timeL=TL1;//取出定时器1的值

         flag=1;//置位测量成功的标志

         EX0=0;//关闭外部中断

}

 

//定时器1中断,用作超声波测距计时

void timer1() interrupt 3

{

 TH1=0;

 TL1=0;

}

 

 

 

 

 

 

展开阅读全文

没有更多推荐了,返回首页