请问为什么我的arduino超声波测距距模块只能测2cm-4cm呢

Arduino&Uno&+&HY-SRF05&超声波测距模块详细讲解演示实验
一、首先我们来了解一下什么叫超声波?
答:声波的频率范围很大(从零以上到几百万以上),而人的听力灵敏度却有限,故科学家们将听力灵敏度很低的20Hz以下的声波定义为次声波,将20KHz以上的声波定义为超声波;将听力灵敏度还可以的声波范围(20Hz--20KHz)定义为音频声波(听力灵敏度最高的频率是1KHz)。超声波的指向性很强(频率越高,越接近光波),故人们利用超声波这一特性发明了超声探伤、B超等应用。
二、超声波测距的原理:
通过超声波发射装置发出超声波,根据接收器接到超声波时的就可以知道距离了。这与测距原理相似。
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。(超声波在空气中的传播速度为340m/s,根据记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2)。
本模块性能稳定,测度距离精确。能和国外的SRF05,SRF02等超声波测距模相媲美。模块高精度,盲区(2cm)超近,稳定的测距是此产品成功走向市场的有力根据!
三、超声波的特点:
超声波指向性强,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物
位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移
动机器人的研制上也得到了广泛的应用。
  为了使移动机器人能自动避障行走,就必须装备测距系统,以使其及时获取距障碍物的距离信息(距离和方向)。本文所介绍的三方向(前、左、右)系统,就是为机器人了解其前方、左侧和右侧的环境而提供一个运动距离信息。
四、本模块主要技术参数:
:使用电压::静态电流:小于:电平输出:高4:电平输出:底:感应角度:不大于度:探测距离:20cm&
7:高精度可达0.2cm&&&
五、模块工作原理:
(1)采用IO触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;&&
我们公司测试主要是用arduino uno与HY-SRF05&链接进行测试的。效果还是很不错的,公司只是提供简单的测试程序,如需进行其他的开发请自行深入研究,谢谢合作!
六、实物规格:
九、再来看一下与Arduino
Uno连接的实物图:
截图如下:
如果您想购买实验所需要的模块,请到此淘宝链接查看:&谢谢!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
超声波测距模块_HC-SR04_ 用户手册-V20
下载积分:1000
内容提示:超声波测距模块_HC-SR04_ 用户手册-V20
文档格式:PDF|
浏览次数:32|
上传日期: 20:57:16|
文档星级:
该用户还上传了这些文档
超声波测距模块_HC-SR04_ 用户手册-V20
官方公共微信查看: 12297|回复: 19
关于超声波测距模块的问题
其几天在淘宝网买了个超声波测距的模块,掌柜给的资料不怎么多,我想问下测试程序中的&&定时器1所得的时间为什么还要乘以12?按照说明书的说法,ECHO引脚输出的高电平时间就是声波走一个来回所用的时间。晕了。
这是程序:
//超声波模块ME007显示程序
//MCU=STC10F04XE
//P0.0-P0.6共阳数码管引脚
//Trig&&= P1^0
//Echo&&= P3^2
#include &reg52.h&& &&&//包括一个52标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint&&unsigned int
#define ulong unsigned long
//***********************************************
sfr&&CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频
& && && && && && && &//为STC单片机的IO口设置地址定义
sfr& &P0M1& &= 0X93;
sfr& &P0M0& &= 0X94;
sfr& &P1M1& &= 0X91;
sfr& &P1M0& &= 0X92;
sfr& & & & P2M1& &= 0X95;
sfr& & & & P2M0& &= 0X96;
//***********************************************
sbit Trig&&= P1^0; //产生脉冲引脚
sbit Echo&&= P3^2; //回波引脚
sbit test&&= P1^1; //测试用引脚
uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
uint distance[4];&&//测距接收缓冲区
uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i;&&//自定义寄存器
bit succeed_&&//测量成功标志
//********函数声明
void conversion(uint temp_data);
void delay_20us();
//void pai_xu();
void main(void)& &// 主程序
{&&uint distance_data,a,b;
& &uchar CONT_1;& &
& &CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页)
& &&&P0M1 = 0;& &//将io口设置为推挽输出
& &&&P1M1 = 0;
& &&&P2M1 = 0;
& &&&P0M0 = 0XFF;
& &&&P1M0 = 0XFF;
& &&&P2M0 = 0XFF;
& &flag=0;
& & & & test =0;
& & & & Trig=0;& && & //首先拉低脉冲输入引脚
& & & & TMOD=0x11;& & //定时器0,定时器1,16位工作方式
& & & & TR0=1;& & & && && &//启动定时器0
& && &&&IT0=0;& && &&&//由高电平变低电平,触发外部中断
& & & & ET0=1;& && &&&//打开定时器0中断
& && &&&//ET1=1;& && &&&//打开定时器1中断
& & & & EX0=0;& && &&&//关闭外部中断
& & & & EA=1;& && && &//打开总中断0& & & &
while(1)& && && &//程序循环
& & & && && &Trig=1;
& && &&&delay_20us();
& && &&&Trig=0;& && && &//产生一个20us的脉冲,在Trig引脚&&
& && &&&while(Echo==0); //等待Echo回波引脚变高电平
& & & && && &succeed_flag=0; //清测量成功标志
& & & & EX0=1;& && && & //打开外部中断
& & & & TH1=0;& && && & //定时器1清零
& && &&&TL1=0;& && && & //定时器1清零
& & & & TF1=0;& && && & //
& && &&&TR1=1;& && && & //启动定时器1
& && &&&EA=1;
& && &&&while(TH1 & 30);//等待测量的结果,周期65.535毫秒(可用中断实现)&&
& & & & TR1=0;& && && & //关闭定时器1
& && &&&EX0=0;& && && & //关闭外部中断
& & if(succeed_flag==1)
& & & && && &{ & & & &
& & & & & & & && & distance_data=outcomeH;& && && && && & //测量结果的高8位
& && && && && && & distance_data&&=8;& && && && && && & //放入16位的高8位
& & & & & & & && & distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
& && && && && && & distance_data*=12;& && && && && && &//因为定时器默认为12分频
& && && && && && & distance_data/=58;& && && && && && & //微秒的单位除以58等于厘米
& && && && & }& && && && && && && && && && && && &&&//为什么除以58等于厘米,&&Y米=(X秒*344)/2
& & & & & & & & & & & && && && && && && && && && && && && && & // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
& & if(succeed_flag==0)
& & & & & & & && & {
& && && && && && && && &distance_data=0;& && && && && && &&&//没有回波则清零
& & & & & & & && & & & & & test = !& && && && && && && &&&//测试灯变化
& && && && && && & }
& &&&///& && & distance=distance_ //将测量结果的数据放入缓冲区
& &&&///& && &&&i++;
&&& & & && &///& & & &&&if(i==3)
& & & && &///& & & && && &{
& & & && &///& & & && && &&&distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
& &&&///& && &&&pai_xu();
& &&&///& && &&&distance_data=distance[1];
& & & && & a=distance_
& && && &&&if(b==a) CONT_1=0;
& && && &&&if(b!=a) CONT_1++;
& && && &&&if(CONT_1&=3)
& & & && && & { CONT_1=0;
& & & && && && &b=a;
& & & && && && &conversion(b);
& & & && && & }& && &
& & & && &///& & & & & & & &&&i=0;
& & & && &///& & & & & & & & }& & & && && &
& & & &&&}
//***************************************************************
//外部中断0,用做判断回波电平
INTO_()&&interrupt 0& &// 外部中断是0号
& &&&outcomeH =TH1;& & //取出定时器的值
& &&&outcomeL =TL1;& & //取出定时器的值
& &&&succeed_flag=1;& &//置成功测量的标志
& &&&EX0=0;& && && && &//关闭外部中断
//****************************************************************
//定时器0中断,用做显示
timer0() interrupt 1&&// 定时器0中断是1号
& & & &&&TH0=0& & //写入定时器0初始值
& & & &&&TL0=0x77;& & & &&&& & & &
& & & &&&switch(flag)& &
& && && &&&{case 0x00:P0= P2=0flag++;
& & & && &&&case 0x01:P0=P2=0flag++;
& & & && &&&case 0x02:P0=P2=0flag=0;
& && && &&&}
//*****************************************************************
//定时器1中断,用做超声波测距计时
timer1() interrupt 3&&// 定时器0中断是1号
& && & TH1=0;
& && & TL1=0;
//******************************************************************
//显示数据转换程序
void conversion(uint temp_data)&&
& & uchar ge_data,shi_data,bai_
& & bai_data=temp_data/100 ;
& & temp_data=temp_data%100;& &//取余运算
& & shi_data=temp_data/10 ;
& & temp_data=temp_data%10;& &//取余运算
& & ge_data=temp_
& & bai_data=SEG7[bai_data];
& & shi_data=SEG7[shi_data];
& & ge_data =SEG7[ge_data];
& & bai = bai_
& & shi = shi_
& & ge&&= ge_
& & & &&&EA=1;
//******************************************************************
void delay_20us()
& & for(bt=0;bt&100;bt++);
void pai_xu()
&&if (distance[0]&distance[1])
& & {t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交换值
&&if(distance[0]&distance[2])
& & {t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交换值
&&if(distance[1]&distance[2])
& & {t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交换值& & & &&&
点击此处下载
(原文件名:超声波模块说明.pdf)
(原文件名:波形图.JPG)
(原文件名:QQ截图未命名11.jpg)
请问楼主,这个模块买过来你测距成功了没?我也买了这个模块,但我用的单片机是avr,自己写程序,还没成功。定时器1中系统时钟12分频,分频后,计数一次所用的时间是原先的12倍,所以计数值要乘以12。掌柜给的资料确实少,连硬件电路都没有,真有种被骗的感觉,期待和你继续讨论。
公益广告:本论坛不得使用、宣传Q群。 有讨论请在论坛里进行。 违者将封锁ID.
#include&iom16.h&
#include&intrinsics.h&
#define uint unsigned int
#define uchar unsigned char
uint distanc,predistanc,j;
uchar outcomeH,outcomeL;
uint succeed_
__flash uchar SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
__flash uchar ACT[4]={0xfe,0xfd,0xbf,0x7f};
//*********延时程序**********
void Delay_us(unsigned long m)
&&for(i=0;i&m;i++)
//*********端口初始化********
void port_init(void)
&&PORTA=0x00;
&&PORTC=0x00;
&&PORTB=0x00;
&&DDRB=0& && && &//PB0口设为输出口,
&&PORTD=0x00;
&&DDRD=0& && &&&//PD2口设为输入口,
//*********定时计数器初始化****
void timer_init(void)
&&TCCR1B=0x00;
&&TCNT1L=0x00;
&&TCNT1H=0x00;
&&TCNT2=0x00;& && && && && && &&&
&&TCCR2=0x00;& && && && && && && &
&&TIMSK=0x00;
//***********外部中断0************************
#pragma vector=INT0_vect
__interrupt void int0_isr(void)
&&outcomeH=TCNT1H;
&&outcomeL=TCNT1L;
&&succeed_flag=1;
&&GICR=0x00;
//***********显示程序(T/C2中断程序)*********
#pragma vector=TIMER2_OVF_vect
__interrupt void timer2_ovf_isr(void)
&&TCNT2=0x83;
&&if(j++&3)j=0;
&&switch(j)
&&case 0:PORTA=SEG7[distanc%10];PORTC=ACT[0];
&&case 1:PORTA=SEG7[(distanc/10)%10];PORTC=ACT[1];
&&case 2:PORTA=SEG7[(distanc/100)%10];PORTC=ACT[2];
&&case 3:PORTA=SEG7[distanc/1000];PORTC=ACT[3];
&&default:
//*******主程序**************
void main(void)
&&port_init();
&&timer_init();
&&TCNT2=0x83;& && && && && && && &//t/c2 1ms定时初值
&&TCCR2=0x04;& && && && && && && &//64分频
&&TIMSK=0x40;
&&SREG=0x80;
&&while(1)
& & SREG=0x00;
& & PORTB=0x08;& && && && & //
& & Delay_us(20);
& & PORTB=0x00;& && && && && &&&//从PB3口发射20us的高电平
& & while((PIND&0x04)==0)& && &//等待接收端变为高电平
& & succeed_flag=0;
& & MCUCR=0x02;
& & GICR=0x40;& && && && && && &//开外部中断0,下降沿触发中断
& & TCNT1L=0x00;
& & TCNT1H=0x00;
& & TCCR1B=0x02;& && && && && &//开定时计数器1,8分频
& & SREG=0x80;& && && && && &&&//开总中断
& & while(TCNT1H&2);& && &&&//在65.535ms的计数时间内等待中断
& & TCCR1B=0x00;
& & GICR=0x00;
& & if(succeed_flag==1)
& && &predistanc=outcomeH;
& && &predistanc&&=8;
& && &predistanc=predistanc|outcomeL;
& && &predistanc=predistanc/5.8139;
& && &distanc=(uint)
& & if(succeed_flag==0)
& && &distanc=0;
顺便传一个我根据商家提供的原理编写的avr程序,还没调出来,不知道错在哪,困惑~~
公益广告:发表招聘帖子需要缴费,有需要可以联系网站工作人员王小姐:.
回复【3楼】ouravrwoai
-----------------------------------------------------------------------
没人回复哦,我调试的过程中发现,外部中断一直有,定时器1的计数值没法读出来,显示一直为零。这样问题请高手指教,avr编程初学。。。。。。。。
公益广告:广告只能发在本论坛的广告区,否则将封锁ID。
回复【4楼】ouravrwoai
-----------------------------------------------------------------------
好久没上来了。
那个模块我用AT89S52单片机控制的。看那个源代码是用的STC的单片机,并且把接TRIG的那个IO口设置成推挽输出。是不是这个地方的问题呢。我刚自学单片机不到一个半月,很多地方不是很明白。。。
回复【5楼】wudideai
-----------------------------------------------------------------------
那天用那模块做实验,不小心把模块上的一个芯片给烧了,三十几块rmb就给没了,还伤心了老一会,还没研究透咧,那学生商家给的资料比较少,有问题他和你商量着,弄半天给不出个解决方案,也怪自己单片机没学好,程序还没搞出来,芯片冒烟了。。。。。
楼主能不能把此模块的资料传上来分析下,把模块的清晰图片也传上来,也想学习下.另外能探测多远?
记号。关于超声波测距模块的问题
楼主,我也买了一个和你一样的模块。不知道你实现功能没有?我的结果出不来。我想知道怎么解决,我总觉得是超声模块的问题。
希望和楼主进一步交流
超声测距模块非要用两个定时器?
这个模块我用89S51驱动成功了,但精度不高.而且最远时80CM.只调试了半天,明天继续.
最新进展:精度很高了.原因是 predistanc=outcomeH;
& && &predistanc&&=8;
& && &predistanc=predistanc|outcomeL;
& && &predistanc=predistanc/5.8139;
& && &distanc=(uint)
大家把算法改一下就可以了.
目前最远距离是1.3M.
可能电压电流供给不足,改天我用实验室的电源供下电.
回复【14楼】wolfdong7&&
最新进展:精度很高了.原因是 predistanc=
& && &predistanc&&=8;
& && &predistanc=predistanc|
& && &predistanc=predistanc/5.8139;
& && &distanc=(uint)
大家把算法改一下就可以了.
目前最远距离是1.3m.
可能电压电流供给不足,改天我用实验室的电源供下电.
-----------------------------------------------------------------------
号称5米的,实际最远才1.3?探测的是什么物体?这个电压不就是5v吗?
有没有原理图呢???
这个模块我做过实验 最远测到2.1米
各位,为什么我的波形输出是没有问题的可是串口输出数据却极不稳定呢?我用定时器计算的高电平时间算出距离的...
阿莫电子论坛, 原"中国电子开发网"查看: 560|回复: 0
超声波测距模块程序1602显示
/*============================================================
//HC-SRO4 超声波测距模块 DEMO 程序
==============================================================
SMC)模拟口线接线方式
& && & ---------------------------------------------------
& && & |LCM_RS--P3_3 | LCM_RW--P3_4 |& &LCM_E--P3_5& & |
& && & --------------------------------------------------|
& && & |DB0-----P1.0 | DB4-----P1.4 | RW-------P3.4& & |
& && & |DB1-----P1.1 | DB5-----P1.5 | RS-------P3.3& & |
& && & |DB2-----P1.2 | DB6-----P1.6 | E--------P3.5& & |
& && & |DB3-----P1.3 | DB7-----P1.7 | VLCD接1K电阻到GND|
& && & ---------------------------------------------------
接线:模块TRIG接 P2.6&&ECH0 接P2.7
[注:AT89x51使用12M或11.0592M晶振,实测使用11.0592M]
=============================================================*/
#include &AT89x51.H&&&//器件配置文件
#include &intrins.h&
#define uint unsigned int
#define uchar unsigned char
#define&&RX&&P2_7
#define&&TX&&P2_6
#define LCM_RW&&P3_4 //定义LCD引脚
#define LCM_RS&&P3_3
#define LCM_E& &P3_5
#define LCM_Data&&P1
#define Busy& & 0x80 //用于检测LCM状态字中的Busy标识
unsigned char code mcustudio[] ={&&&The distance&&&};
unsigned char code Cls[] =& && &{&& && && && && & &};
unsigned char code ASCII[15] =& & {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
static unsigned char DisNum = 0; //显示用指针& && &
uint&&time=0;
unsigned long S=0;
bit& &flag =0;
uchar disbuff[4]={ 0,0,0,0,};
/*********************5ms延时************/
void delay5Ms(void)
uint TempCyc = 5552;
while(TempCyc--);
/***********400ms延时******************/
void delay400Ms(void)
uchar TempCycA = 5;
uint TempCycB;
while(TempCycA--)
& &TempCycB=7269;
& &while(TempCycB--);
/*********************延迟****************/
void delayms(uint ms)
unsigned char i=100,j;
for(;ms--)
&&while(--i)
& &while(--j);
/**************读状态**********************************/
uchar readStatusLCM(void)
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while(LCM_Data & Busy); //检测忙信号
return(LCM_Data);
/*****************读数据***************************************/
/*uchar readDataLCM(void)
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
/******************写数据*********************************/
void writeDataLCM(uchar WDLCM)
readStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
LCM_E = 0; //延时
LCM_E = 1;
/*****************写指令*********************************/
void writeCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
if (BuysC)
&&readStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
/*************初始化*************************************/
void LCMInit(void) //LCM初始化
writeCommandLCM(0x38,0); //显示模式设置,不检测忙信号
delay5Ms();
writeCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
writeCommandLCM(0x08,1); //关闭显示
writeCommandLCM(0x01,1); //显示清屏
writeCommandLCM(0x06,1); // 显示光标移动设置
writeCommandLCM(0x0c,1); // 显示关及光标设置
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
X &= 0xF; //限制X不能大于15,Y不能大于1
& &X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
writeCommandLCM(X, 1); //发命令字
writeDataLCM(DData); //发数据
/**************显示字符*************************************/
//按指定位置显示一串字符
void displayListChar(uchar X, uchar Y, uchar code *DData)
uchar ListL
& &ListLength = 0;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]&0x19) //若到达字串尾则退出
& &if (X &= 0xF) //X坐标应小于0xF
& &&&DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
& &&&ListLength++;
/************计数*****************************/
void count(void)
&&time=TH0*256+TL0;
&&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%;
& & disbuff[1]=S%;
& & disbuff[2]=S%;
& & DisplayOneChar(4, 1, ASCII[disbuff[0]]);
& & DisplayOneChar(5, 1, ASCII[10]); //显示点
& & DisplayOneChar(6, 1, ASCII[disbuff[1]]);
& & DisplayOneChar(7, 1, ASCII[disbuff[2]]);
& & DisplayOneChar(8, 1, ASCII[12]); //显示M
/*************************中断**************************/
void timer0() interrupt 1& & //T0中断用来计数器溢出,超过测距范围
& & flag=1;& && &&&//中断溢出标志
/******************启动模块*********************************/
void&&startModule()& && && && &//启动模块
& &TX=1;& && && && && && && && &//启动一次模块
& &for(i=0;i&20;i++)& &&&//延迟 以便于进行传送数据
& & _nop_();
/*****************主函数***********************************/
void main()
LCMInit(); //LCM初始化
delay5Ms(); //延时片刻(可不要)
displayListChar(0, 0, mcustudio);
displayListChar(0, 1, Cls);
TMOD=0x01;& &&&//设T0为方式1,GATE=1;
TL0=0;& && && &
ET0=1;& && && && & //允许T0中断
EA=1;& && &//开启总中断& &
& && &startModule();
& &while(!RX);&&//当RX为零时等待
& &TR0=1;& && & //开启计数
& && &while(RX);& &//当RX为1计数并等待
& &TR0=0;& & //关闭计数
& && &count();& &//计算
& &delayms(80);&&//80MS
Powered by}

我要回帖

更多关于 子宫肌瘤从2cm涨到4cm 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信