超声波测距 订阅
由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移动机器人研制上也得到了广泛的应用。 展开全文
由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移动机器人研制上也得到了广泛的应用。
信息
外文名
Ultrasonic ranging
领    域
测绘科学与技术
用    于
距离的测量
中文名
超声波测距
特    征
指向性强
应    用
移动机器人研制
超声波测距引言
为了使移动机器人能自动避障行走,就必须装备测距系统,以使其及时获取距障碍物的距离信息(距离和方向)。介绍了三方向(前、左、右)超声波测距系统,就是为机器人了解其前方、左侧和右侧的环境而提供一个运动距离信息。在超声波测距中,通常因温度和时间检测的误差,使得测距的精度不高。 [1] 
收起全文
精华内容
参与话题
问答
  • 利用LCD1602显示超声波测距

    千次阅读 2020-04-11 12:17:46
    二、超声波测距及主程序 。。。。。。 XianShi[4]=dis%10;//厘米的小数点后一位 XianShi[5]=11;//显示‘C’ XianShi[6]=12;//显示'M' Lcd1602_init(); //初始化函数 Lcd1602_WriteCom(0x80); //0x80是第一行的...

    介绍

    一、需要的器件

    1. 51单片机:任意一款都可以,我这里使用的是STC89C52
    2. LCD1602显示屏:我这里使用的是LCD1602A不带转接板的八位显示屏,是比较正常的一款。
    3. 超声波测距模块:根据价钱的不同有很多可供选择,我这里推荐使用HC-SR04,因为便宜。。。
    4. 杜邦线若干:在这里使用母对母杜邦线。

    二、原理

    LCD1602显示屏的使用原理在我的这篇博客里有很详细的介绍。LCD1602介绍
    超声波模块的原理和使用方法在这篇博客有介绍。超声波测距模块介绍
    当然,我在下面的代码中,会有很多的注释,便于大家理解。

    工程代码

    一、 LCD1602

    在这里我们可以把LCD1602的使用放在一个头文件里,这样以后每次使用,我们都可以直接调用,就不用我们自己每次都要编写了。

    #ifndef __LCD1602_H_
    #define __LCD1602_H_
    #include<reg52.h>
    #include<intrins.h>  //其中有nop函数的定义
    
    /*对于延时很短的,要求在us级的,采用“_nop_”函数,
    这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,
    可由晶振频率算出延时时间,对于12M晶振,延时1uS。*/
    #define uchar unsigned char
    #define uint unsigned int
    
    #define LCD1602_DATA P0
    sbit RS=P2^6;  //定义数据命令选择端
    sbit RW=P2^5;  //定义读写选择端
    sbit E=P2^7;   //定义使能端
    //注意:具体为哪一个IO口由你自己的接线来定,并不是一定要这样写!
    
      void delay_ms(uint z)  //毫秒级延时函数
        {
           uint i,j;
           for(i=z;i>0;i--)
              for(j=110;j>0;j--);
        }
        //为什么要判忙?
      /*因为LCD1602控制芯片也是一个CPU,
     它在处理上位机发来的某些指令的时候,耗时较长。
     如复位命令,全屏清除命令等。
     另外,LCD1602的CPU速度较慢,上位机较快时,
     LCD1602CPU来不及完成上条命令,会对后续命令不予理睬,
     这样就造成了命令序列不能正确完整地到达LCD1602CPU,以至于显示不正常。*/
     uchar Lcd1602_ReadBusy()   //判断lcd1602是否处于忙的状态,即读忙
        {
           uchar temp;
           RS=0;  //命令
           RW=1;  //读
           _nop_();
           P0=0xff;     //读某IO口数据前,先将该口置为1
           
           /*原因:电路中存在的一个普遍的现象:
       高电平很容易被低电平拉低,而低电平一般不可能被高电平拉高。
       所以在读数据之前将单片机IO口拉高才不会影响原来数据线上的数据!*/
           _nop_();
           E=1;
           _nop_();
           temp=P0;   //读取此时lcd1602的状态字
           _nop_();
           E=0;
           return (temp&0x80);  //如果忙
           /*状态字为temp(8位2进制数)的最高位,
     最高位为1表示禁止读写,
     为0表示允许读写,即temp&0x80
     得1表示忙 ,
     得0表示不忙*/
     }
     /*在lcd1602的资料中,读写操作都有对应的时序图,
     想要理解lcd1602的具体工作流程还得认真研究时序图!*/
      void Lcd1602_WriteCom(uchar com)  //写命令
        {
           while(Lcd1602_ReadBusy());  //判忙
           RS=0;   //命令
           RW=0;   //写
           _nop_();
           LCD1602_DATA=com;   //准备发送命令
           _nop_();//等待命令稳定
           E=1;      //由时序图知,使能端为高电平时才允许数据交换
           _nop_();
           _nop_();
           E=0;      //由时序图知,使能端在完成数据交换后要拉低
           _nop_();
           _nop_();   
        }
        void Lcd1602_WriteData(uchar dat)  //写数据
        {
           while(Lcd1602_ReadBusy());   //判忙
           RS=1;   //数据
           RW=0;   //写
           _nop_();
           LCD1602_DATA=dat;
              _nop_();
           E=1;
           _nop_();
           _nop_();
           E=0;
           _nop_();
           _nop_();   
        }
        void Lcd1602_init()   //初始化函数
        {
           delay_ms(15);
           Lcd1602_WriteCom(0x38);   //显示模式设置
           delay_ms(5);
           Lcd1602_WriteCom(0x38);
           delay_ms(5);
           Lcd1602_WriteCom(0x38);
           Lcd1602_WriteCom(0x0c);  //显示开(开显示不显示光标)
           Lcd1602_WriteCom(0x01);  //显示清屏
           Lcd1602_WriteCom(0x06);  //显示光标(写一个指针加1)
       // Lcd1602_WriteCom(0x80);         //0x80是第一行的第一个字符的地址
       // Lcd1602_WriteCom(0x80+0x40);   //0xc0是第二行的第一个字符的地址
        }
    uchar lcd1602_readData()//读数据
    {
       uchar lcddata;
        LCD1602_DATA = 0xff;   //很重要,不写则读失败          
        E = 0;
        _nop_();
        RS = 1;
        RW = 1;
        E = 1;
        _nop_();
        lcddata = LCD1602_DATA;
        _nop_();
        E = 0;
        return lcddata;
    }
    #endif

    二、超声波测距及主程序

    /*
    主程序:主程序的核心在于中断.这点很重要,超声波测距模块的重点就是在于中断,
    定时器/计数器这部分需要有一定的理解。
    首先对于单片机的IO口进行初始化,LCD1602液晶显示器的初始化,超声波模块的初始化。
    初始化的同时打开了定时器,同时内部中断打开并开始计数操作,
    待超声波的输入端接收到返回波之后关闭内部中断,
    停止计数,接下来通过记到的时间计算被测物的距离(s=time*340/2m)
    */

    //1、定义引脚
    #include<reg52.h>
    #include<LCD1602.h>
    sbit Trig = P2^0;//为了方便大家理解,我直接把名称定义为模块的引脚名
    sbit Echo = P2^1;
    unsigned char BiaoTi[]=" Juli:   ";
    unsigned char code ShuZiBiao[15] = {'0','1','2','3','4','5','6','7','8','9','.','C','M'};//这可以减少很多出错,大家可以理解一下
    unsigned char XianShi[7]    ={ 0,0,0,0,0,0,0};
    //2、设定发送时间
    void Delay10us()
    {
     TMOD |= 0x1;
     TH0 = 0xFF;
     TL0 = 0xF6;
     TR0 = 1;
     while(!TF0);
     TF0 = 0;
    }
    void Rstart()  //启动超声波模块,初始化
    {
     Trig=0;
     Trig=1;
     Delay10us();
     Trig=0;
    }
    //3、获取时间和距离
    int gettime()//获取时间
    {
     unsigned int time = 0;
     time = TH0<<8 | TL0;  //TH0*256+TL0
     return time;
    }
    int Getdis(unsigned int time)  //获取距离 
    {
     unsigned int distance;//整型的原因是方便后续LCD1602屏显示
     distance = (int)time * 0.17;
     TH0=0;
     TL0=0;//清空计时器·
     return distance;
    }
    void star()
    {
     TH0 = 0;
     TL0 = 0;
     TR0 = 1;
    }
    void end()
    {
     TR0 = 0;
    }
    void GetOnce()  //获取一次超声波测距模块的距离
    {
     Rstart();
     while(!Echo);//当Echo为零时等待
     star();
     while(Echo);//当Echo为1计数并等待
     end();
    }
    void delay()
    {
     int i;
     int j;
     for(i=0;i<100;i++)
      for(j = 0;j<2000;j++);
    }
    void main()
    {
     unsigned int time = 0;
     unsigned int i,j;
     unsigned int dis;
     while(1)
     {  
      GetOnce();
      time = gettime();
      dis = Getdis(time);//单位毫米,后面会用厘米显示
      XianShi[0]=dis/1000;//厘米的百位
      XianShi[1]=(dis/100)%10;//厘米的十位
      XianShi[2]=(dis/10)%10;//厘米的个位
      XianShi[3]=10;//显示小数点
      XianShi[4]=dis%10;//厘米的小数点后一位
      XianShi[5]=11;//显示‘C’
      XianShi[6]=12;//显示'M'
      Lcd1602_init();   //初始化函数
      Lcd1602_WriteCom(0x80);  //0x80是第一行的第一个字符的地址
        for (i=0;i<7;i++)
        {
         Lcd1602_WriteData(BiaoTi[i]);
        }
        Lcd1602_WriteCom(0x80+0x40);   //0xc0是第二行的第一个字符的地址
        for (j=0;j<7;j++)
        { 
         Lcd1602_WriteData(ShuZiBiao[XianShi[j]]);
        }
        delay();
        }
     }

    运行图

    运行图

    展开全文
  • 基于51单片机的超声波测距

    万次阅读 多人点赞 2018-12-16 13:45:01
    1.超声波测距原理 超声波是利用反射的原理测量距离的,被测距离一端为超声波传感器,另一端必须有能反射超声波的物体。测量距离时,将超声波传感器对准反射物发射超声波,并开始计时,超声波在空气中传播到达障碍物...

    1.超声波测距原理
    超声波是利用反射的原理测量距离的,被测距离一端为超声波传感器,另一端必须有能反射超声波的物体。测量距离时,将超声波传感器对准反射物发射超声波,并开始计时,超声波在空气中传播到达障碍物后被反射回来,传感器接收到反射脉冲后立即停止计时,然后根据超声波的传播速度和计时时间就能计算出两端的距离。
    在这里插入图片描述
    2.超声波模块
    此次采用的是市面上常用的超声波模块HC-SR04;
    在这里插入图片描述
    HC-SR04参数:

    1. 工作电压:DC5V
    2. 静态电流:小于2mA
    3. 电平信号输出:高5V ,低0V
    4. 感应角度:不大于15度
    5. 探测距离:2cm-450cm

    超声波模块工作原理:
    在这里插入图片描述
    (1)采用IO触发测距,给至少10us的高电平信号;
    (2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
    (3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.
    (4)单片机将得到的数据进行处理计算,公式如下

    测试距离 = (高电平时间 * 声速(340M / S)) /2

    3.系统总体硬件图
    在这里插入图片描述
    硬件组成:单片机最小系统+LCD1602显示屏+超声波模块+DC5V电源

    4.程序分析

    1.超声波模块控制程序
    (1)触发信号发送

    void  StartModule() 		         //启动模块
      {
    	  TX=1;			                     //启动一次模块
    	  _nop_();  _nop_(); _nop_(); _nop_(); _nop_(); 
    	  _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
    	  _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
    	  _nop_(); _nop_();_nop_(); _nop_(); _nop_(); 
    	  _nop_();
    	  TX=0;
      }
    

    TRIP引脚是内部上拉10K的电阻,用单片机的IO口拉低TRIP引脚,然后给一个10us以上的脉冲信号。

    (2)接收回波并计算

    void Conut(void)
    {
    	 time=TH0*256+TL0;
    	 TH0=0;
    	 TL0=0;
    	
    	 S=(time*1.7)/100;     //算出来是CM
    	 if((S>=700)||flag==1) //超出测量范围显示“-”
    	 {	 
    	  	flag=0;
    	  	DisplayOneChar(0, 1, ASCII[11]);
    	  	DisplayOneChar(1, 1, ASCII[10]);	//显示点
    	  	DisplayOneChar(2, 1, ASCII[11]);
    	  	DisplayOneChar(3, 1, ASCII[11]);
    	  	DisplayOneChar(4, 1, ASCII[12]);	//显示M
    	 }
    	 else
    	 {
    	  	disbuff[0]=S%1000/100;
    	  	disbuff[1]=S%1000%100/10;
    	  	disbuff[2]=S%1000%10 %10;
    	  	DisplayOneChar(0, 1, ASCII[disbuff[0]]);
    	  	DisplayOneChar(1, 1, ASCII[10]);	//显示点
    	  	DisplayOneChar(2, 1, ASCII[disbuff[1]]);
    	  	DisplayOneChar(3, 1, ASCII[disbuff[2]]);
    	  	DisplayOneChar(4, 1, ASCII[12]);	//显示M
    	 }
    }
    

    一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值

    (3) 主程序

    void main(void)
    {
    	unsigned char TempCyc;
    	Delay400Ms(); //启动等待,等LCM讲入工作状态
    	LCMInit(); //LCM初始化
    	Delay5Ms(); //延时片刻(可不要)
    	DisplayListChar(0, 0, mcustudio);
    	DisplayListChar(0, 1, email);
    	ReadDataLCM();//测试用句无意义
    	for (TempCyc=0; TempCyc<10; TempCyc++)
    	Delay400Ms(); //延时
    	DisplayListChar(0, 1, Cls);	
    	while(1)
    	{
    	 	TMOD=0x01;		   //设T0为方式1,GATE=1;
    	 	TH0=0;
    	 	TL0=0;          
    	 	ET0=1;             //允许T0中断
    	 	EA=1;			   //开启总中断			
    		while(1)
    	  	{
    	     	StartModule();
    			// DisplayOneChar(0, 1, ASCII[0]);
    	     	while(!RX);		//当RX为零时等待
    	    	TR0=1;			    //开启计数
    	     	while(RX);			//当RX为1计数并等待
    	     	TR0=0;				//关闭计数
             	Conut();			//计算
             	delayms(80);		//80MS 
    	    }
    	}
    }
    

    注意事项:
    1:此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响
    模块工作。
    2:测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。

    源码+AD电路图 下载:关注公众号,首页回复“超声波测距”获取资料
    在这里插入图片描述

    展开全文
  • 超声波测距原理与实现

    万次阅读 多人点赞 2018-02-10 22:06:21
    这是我在学校做的超声波测距系统,那时候是我刚刚接触半年的51,就想着弄点什么小东西出来吧。起码得做点什么东西出来,所以自行设计了超声波测距系统/倒车系统测距系统,也来分享一下给大家,本作品以STC12C5A60S2...
    这是我在学校做的超声波测距系统,那时候是我刚刚接触半年的51,就想着弄点什么小东西出来吧。起码得做点什么东西出来,所以自行设计了超声波测距系统/倒车系统测距系统,也来分享一下给大家,本作品以STC12C5A60S2作为核心,以某宝上买的超声波模块作为检测模块,以oled屏幕作为显示文字、数字、英文、等等、用有源蜂鸣器作为报警器,红色直插LED顺便作为提示,兼容5——12V供电,引出io口,方便以后当做最小系统使用,方便兼容多个其他模块,(自行脑补)。。。。带复位,下载口,,正常工作时候oled显示:“xxx超声波测距,距离xxxCM”,蜂鸣器不响,绿色LED亮,红色灭,当距离小于xxxCM时,蜂鸣器象棋警报,红色LED亮起,绿色灭,大致就是这样。系统为本人亲自制作,单层板,上图。还有pcb,原理图等,代码等;代码有点乱,提供一部分看看。
    这是我的第一个作品吧,之前搞了个4*4*4的光立方,没有成功,只怪我当初太菜,还急躁了,不过现在做这个还是挺成功的,因为是超声波,距离精确到cm吧,反正就是能测距就行,主要的问题就是oled显示的问题,当时我怎么弄都没显示的,但是改了一下,把显示的函数封装起来,然后调用,就突然好了,我也是奇怪。。。。也有运气的成分在吧。。。。先解说下超声波工作原理吧:


    简单来说就是单片机控制超声波发射模块发出一系列超声波,遇到障碍物反弹回来,被超声波接收模块接收到,然后计算这段时间(声音在空气中传播的速度为340m/s),通过计算,得出距离,然后再oled上显示出来,程序对距离数值产生判断,小于5mm就触发蜂鸣器响,红色led闪烁。这就是基本的思路。
    先来看看超声波模块长什么样:
    其实模块的外围电路很简单,都已经搭建好了,引出4个排针,连接到单片机的vcc,io口,io口,gnd,用到2个io口,然后我们就可以模拟时序来使超声波模块工作了;

    我们知道采用 IO (Trig(控制端))触发测距,给至少 10us 的高电平信号;就是10us的TTL;我是直接让他延时个10多us;
    模块就会自动发送 8 个 40khz 的方波,自动检测是否有信号返回;操作简单方便;假如有信号返回,超声波模块就会通过 IO(Echo(接收端)) 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.那么测试距离=(高电平时间*声速(340M/S))/2;
    那么问题来了,怎么真的时间是多少呢,这就是要我们用定时器来计时了;

    没有超声波回来的时候,(Echo(接收端)就是RX=0;就在等待,
    当有接收到超声波的时候,就开始计时,TR0=1;;因为上文说了,超声波模块就会通过 IO(Echo(接收端)) 输出一高电平。
    (Echo(接收端)高电平持续的时间就是超声波从发射到返回的时间.所以等待高电平的时间,就是定时器计时的时间。(while(RX));//在等待
    然后关闭定时器,通过算法就能计数了。

    void Conut(void)
            {
             time=TH0*256+TL0;
             TH0=0;
             TL0=0;
            
             S=(time*1.7)/100;   
    }

    具体对数据做什么要求请各位自行发挥。
    我就是简单的显示下数据就ok了:

             qian=S%1000/100;
              bai=S%1000%100/10;
              shi=S%1000%100 %10;
    得出结果是cm;共有3位数字;比如006cm;
    然后就是如何显示的问题了,因为我用的是库函数,显示字符要取模,我就不教大家了,可以百度一下取模的问题,而且我调用的是库函数,就简单看看我的代码吧;
    void display()
    {
            
            WriteChinese16x16(0,0,"杰杰号超声波测距");

             PrintNum_8x16(2,60,qian);
             PrintNum_8x16(2,70,bai);
             PrintNum_8x16(2,80,shi);

            WriteMixStrXx16(2,10,"距离");
            WriteMixStrXx16(2,97,"CM");

            bee=1;
            d1=0;
            d2=1;

    if(S<5)
    {
            delay(5);
            if(S<5)//小于5cm,蜂鸣器响,红灯亮。
    {
            d1=1;
            bee=0;
            d2=0;
    }
    }
    这是在oled上显示的。有比较多的库函数,我也没仔细研究,但是会调用就行了,因为用到的oled时候不是很多,花时间在这上面不值得,反正我会用,用不用管他的底层的东西。

    需要代码的话找我拿就好,其实原理很简单的,动动手,按照我上一篇的推送画个最小系统板就ok了,但是要注意的地方是,oled,最好用3.3v供电,所以加入了ams117稳压芯片,
    看下效果图是怎样的:


    原理图和pcb都是开源的,全自创,仅供学习。

    请到

    http://bbs.21ic.com/icview-2408582-1-1.html?fromuid=1875788

    下载




    展开全文
  • 基于STM32F103C8T6的超声波测距示例

    万次阅读 多人点赞 2018-05-13 11:27:39
    需要以下源码工程请扫码关注大海电子,回复“基于STM32F103C8T6超声波测距源码及接线”,建议直接复制双引号里面的内容。(免费) 整个工程文件及整体套件(淘宝购买): ...id=60656061503...

     

     

    需要以下源码工程请扫码关注大海电子,回复“基于STM32F103C8T6超声波测距源码及接线”,建议直接复制双引号里面的内容。(免费)

    整个工程文件及整体套件(淘宝购买):

    https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-22156600417.12.64b73961pgTEXp&id=606560615033

     

    一、所需材料:

    1、面包板:

    https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-17409464480.12.942e3961LSzalG&id=566952992749

    2、STM32F103C8T6核心板

    https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-17409464480.12.69693961YaTulR&id=567200541464

    3、超声波模块

    https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-17409464480.12.306c3961DPKmG1&id=567318723493

    4、串口工具

    https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4002-17409464480.21.7dd33961iRVAkv&id=567201073239

    5、STlink 下载程序,或用串口下载亦可

    二、超声波原理分析

    网上一大堆,以后待补

    备注:HC-SR04在距离3cm内无法准确测量,近处3CM外测量误差0.7cm左右。

    三、硬件连接

    实际效果图:

     

    四、源码分析

    #include "delay.h"
    #include "sys.h"
    #include "usart.h"  
    /***************************************************
    大海电子专营各种电子模块,欢迎光临
    硬件连接
    串口1:RX PA10  TX PA9
    超声波:Trig PB11    ECHG PB10
    备注:以下代码非原创,只是经过修改适配成C8T6
    若侵权,请告知。


    ***************************************************/


    //超声波硬件接口定义
    #define HCSR04_PORT     GPIOB
    #define HCSR04_CLK      RCC_APB2Periph_GPIOB
    #define HCSR04_TRIG     GPIO_Pin_11
    #define HCSR04_ECHO     GPIO_Pin_10


     


    //超声波计数
    u16 msHcCount = 0;


    //定时器4设置
    void hcsr04_NVIC()
    {
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;             
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
    NVIC_Init(&NVIC_InitStructure);
    }


    //IO口初始化 及其他初始化
    void Hcsr04Init()
    {  
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;      
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
        GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
         
        GPIO_InitStructure.GPIO_Pin =   HCSR04_ECHO;     
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);  
        GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);    
         
              
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);   
         
        TIM_DeInit(TIM2);
        TIM_TimeBaseStructure.TIM_Period = (1000-1); 
        TIM_TimeBaseStructure.TIM_Prescaler =(72-1); 
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);          
            
        TIM_ClearFlag(TIM4, TIM_FLAG_Update);  
        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);    
        hcsr04_NVIC();
        TIM_Cmd(TIM4,DISABLE);     
    }




    //打开定时器4
    static void OpenTimerForHc()  
    {
       TIM_SetCounter(TIM4,0);
       msHcCount = 0;
       TIM_Cmd(TIM4, ENABLE); 
    }


    //关闭定时器4
    static void CloseTimerForHc()    
    {
       TIM_Cmd(TIM4, DISABLE); 
    }


    //定时器4终中断
    void TIM4_IRQHandler(void)  
    {
       if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  
       {
           TIM_ClearITPendingBit(TIM4, TIM_IT_Update  ); 
           msHcCount++;
       }
    }
     


    //获取定时器4计数器值
    u32 GetEchoTimer(void)
    {
       u32 t = 0;
       t = msHcCount*1000;
       t += TIM_GetCounter(TIM4);
       TIM4->CNT = 0;  
       delay_ms(50);
       return t;
    }
     
    //通过定时器4计数器值推算距离
    float Hcsr04GetLength(void )
    {
       u32 t = 0;
       int i = 0;
       float lengthTemp = 0;
       float sum = 0;
       while(i!=5)
       {
          TRIG_Send = 1;      
          delay_us(20);
          TRIG_Send = 0;
          while(ECHO_Reci == 0);      
          OpenTimerForHc();        
          i = i + 1;
          while(ECHO_Reci == 1);
          CloseTimerForHc();        
          t = GetEchoTimer();        
          lengthTemp = ((float)t/58.0);//cm
          sum = lengthTemp + sum ;
            
        }
        lengthTemp = sum/5.0;
        return lengthTemp;
    }
     
    //测试主函数
    int main(void)
     {  
    float length;
    delay_init();     //延时函数初始化  
    NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(9600); //串口初始化为9600
    Hcsr04Init();
    printf("大海电子串口测试\r\n");  
        
       Hcsr04Init();    
       printf("超声波初始化成功!\n");

       while(1) 
    {  
         length = Hcsr04GetLength();
         printf("距离为:%.3fcm\n",length);
    delay_ms(1000);    
    }
     }

     

    展开全文
  • C51:超声波测距

    千次阅读 2019-05-19 23:32:35
    前言 每次把标题写成C51都有点心虚,之前还想着全TM都用汇编写。但是有一次看了别的学校的家伙的微机原理实验报告才知道。我学的汇编一点皮毛啊。也许微机原理是单片机课程的进阶版,下次去图书...超声波测距模块 ...
  • 使用keil 的建的工程,c语言编的。根据网上的资料改写的。自己亲自试过,至少可以测两米的距离。
  • 超声波传感器测距原理

    万次阅读 2015-06-15 09:12:07
    超声波 ultrasonic (waves): 人类耳朵能听到的声波频率为20HZ~20KHz。当声波的振动频率大于20KHz或小于20Hz时,我们便听不见了。因此,我们把频率高于20000赫兹的声波称为“超声波”。因其方向性好,穿透能力强...
  • 超声波测距

    2020-07-13 18:24:55
    模块型号HC-RS04 代码如下: /*Echo接P20,Trig接P21*/ #include<reg52.h> #include<intrins.h > 、、、 typedef unsigned char uchar; typedef unsigned int uint;...uchar code SMGwe[]={0xfe,0xfd,0
  • 超声波测距

    万次阅读 2018-07-11 19:50:12
    超声波是一种频率高于20000赫兹的声波,它的方向性好,穿透能力强,易于获得较集中的声能,在水中...超声波测距原理:单片机发出超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收...
  • 超声波测距

    千次阅读 2019-03-15 22:33:27
    上学期做过的开始实验就是关于超声波的……虽然自己拿单片机没搞出来,但好在队友给力,换了主板搞了出来,不过主要还是当时的水平确实太菜了,现在大概知道当时的AD转换混乱的原因了,应该是没有加延时。...
  • STM32超声波测距

    千次阅读 多人点赞 2019-05-11 10:39:06
    基于STM32超声波测距 采用STM32F1系列的开发板,配合HC-SR04模快实现超声波测距,将距离显示在TFTLCD上,精度为小数点后两位,单位厘米,并可实现当距离小于某一个设计值时自动报警。 测距原理 HC-SR04超声波测距...
  • 超声波测距 Python代码

    2017-12-23 10:48:07
    树莓派超声波测距代码 Python ,有兴趣的看看。import RPi.GPIO as gpio import time 超声波测距部分 Python代码 def distance(measure='cm'): gpio.setmode(gpio.BOARD) gpio.setup(12, gpio.OUT) gpio.setup...
  • 51单片机超声波测距程序

    万次阅读 多人点赞 2018-08-03 17:15:08
    51单片机超声波测距程序。
  • 超声波测距

    2019-11-18 10:26:36
    待续 参考网址: stm32与HC-SR04超声波传感器测距 - Andrew_qian - 博客园 ...超声波测距原理 http://www.360doc.com/content/15/0930/00/12109864_502347442.shtml STM32F103关于输入捕获以及控制超声波测距...
  • //超声波测距模块Trig sbit echo=P1^1; //超声波测距模块Echo sbit trig2=P1^3; //超声波测距模块2Trig sbit echo2=P1^4; //超声波测距模块2Echo sbit in1=P2^1; sbit in2=P2^2; sbit in3=P2^3; sbit in4=P2^4; ...
  • 超声波测距模块的使用 超声波测距模块: 超声波测距模块有好多种类型,目前比较常用的有URM37超声波传感器默认是232接口,可以调为TTL接口,URM05大功率超声波传感器测试距离能到10米,算是目前来说测试距离比较远的一...
  • 本资源为STM32F407-四路超声波测距代码,测试绝对可用 我所使用的测距模块是HC-SR04,HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测 距精度可达高到3mm; HC-SR04基本工作原理: (1)采用IO口TRIG...
  • 代码实现使用超声波测距模块(HC_sr_04)实现测距,距离显示在数码管上,只保留两位小数,默认单位为(cm)
  • STM32的超声波测距程序

    万次阅读 多人点赞 2016-03-02 21:59:43
    我所使用的测距模块是HC-SR04,C-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测 距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。 HC-SR04基本工作原理: (1)采用IO口TRIG触发测距,...
  • 超声波测距

    2019-03-27 20:27:20
    超声波模块位于开发板数码管上方,使用之前要把J2跳线组设置 按照sonic连接1-3,2-4。 2原理 如图所示,P10口时发射,P11口接收 流程: TX发送8个40KHZ的超声波信号 启动定时器 检查RX == 0(超声波返回...

空空如也

1 2 3 4 5 ... 20
收藏数 3,906
精华内容 1,562
关键字:

超声波测距