超声波测距的 软件调试 超声波测距仪的设计
发布日期:2020-09-08摘要:用AT89C51单片机做超声波测距我贴一个测试成功的51程序,试了多个超声波模块,可以测试0到5米距离。测试结果从串口反馈到PC,也有从数码管显示的。有疑问欢迎Q我。QQ号在最后: include ...
用AT89C51单片机做超声波测距
我贴一个测试成功的51程序,试了多个超声波模块,可以测试0到5米距离。
测试结果从串口反馈到PC,也有从数码管显示的。
有疑问欢迎Q我。
QQ号在最后: #include #include "stdio.h"#include "MCU_UART.H"#define uchar unsigned char#define uint unsigned intsbit Trig = P1^0 ;sbit Echo = P3^2 ;/*下一行你可以试着把 code 去掉看看试验结果。
去掉后 table[] 会被存到 RAM 中,因为单片机的 RAM 比 ROM 小的多*//*所以,对于不会改变的值应该用 code 或者 #define 去定义,让这些固定值存到 ROM 中去*//*其16个值分别对应,0-9和a-f*/uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*下一行的数组可以显示数值外,还可以显示数码管的点*/uchar code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};//int timeH = 0;int timeL = 0;int succeed_flag;void delay(uint z){ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}//void delay_20us() { uchar a ; for(a=0;.../,y; P2 = 5.h> P0 = table[bai];a++);90000) display(minDistance);sbit Echo = P3^2 ;//:#include <,0xf1};uchar code table_d[16] = {0xbf;//reg52;/.34mm; { TH0=0;100.172*1;/,还可以显示数码管的点*/ /,0x87; } } if(succeed_flag==0) { distance=0; if (distance / dula=1;MCU_UART;/n",每个机器周期是1us,用做超声波测距计时void timer0() interrupt 3 / delay(1),0x5e;}/取20次的最小值作为结果 { discount++ .H"定时器0中断.34mm;Begin Ceju; P0=0xdf; init_uart();至成功测量的标志 EX0=0;; delay(1); / //,0x86;// ge=temp%10;定时器1清零 TF0=0;/x>/超声波输入端 delay_20us(),0-9和a-f*/ / int wela; dula=0,单位应该是毫米 声速340m/ /#define uchar unsigned char#define uint unsigned intsbit Trig = P1^0 ; qian=temp//// delay(1); /for(a=0; /,0xdb,0x5b;/,0x39; /****************************************************************/***************************************************************/12MHz晶振;s;最小距离是90000米 float distforeachcyle = 0;关位码 dula=0; / wela=0,0xfc;int timeH = 0; /5;***************************************************************/,0xfd; bai=(temp%1000)/ TH0=0; /延时20us Trig=0;/。
去掉后 table[] 会被存到 RAM 中,dula;uchar code table[16] = {0x3f;/关闭外部中断 }//,qian; P0 = table[shi];/.085;关闭定时器1 EX0=0;// /测试灯变化 } //清测量成功标志 EA=1; wela=0;distance=time*0; P0=table[ge],0x71}; /,让这些固定值存到 ROM 中去*/启动定时器1 delay(40),0x7f; /,0xcf; delay(1); dula=0,0x77; P0=table[shi];*下一行的数组可以显示数值外;0; /void delay(uint z){ uint x;*其16个值分别对应; }/,1us单程距离是0;/a< }//。
有疑问欢迎Q我;没有回波则清零 test = ; int minDistance = 90000; P2 = 7;等待测量的结果 TR0=0,0x79,0x4f;//显示数据转换程序void display(uint temp) { uchar ge;产生一个20us的脉冲 while(Echo==0);取出定时器的值 succeed_flag=1,0xde,0x66.0592MHz晶振; shi=(temp%100)/ / wela=0;等待Echo回波引脚变高电平 succeed_flag=0; / */,0xf7,16位工作方式 printu("r\,0x6d,0xef; / // for(x=z,bai;/ int MaxCount = 10,0x7d;/ dula=1; test =0;取一段时间的最小距离作为测距结果;定时器0; P0=table[bai];外部中断0;打开总中断0 TMOD=TMOD|0x01;/取出定时器的值 timeL =TL0;// P0 = table[qian]; P0=0xef,0xed,每个机器周期是1us;/ minDistance = 90000; dula=0; 外部中断0是0号 { timeH =TH0;//10,0xff,0xb9;***************************************************************void main() { uint distance; P2=0x07; wela=1;display(distance);计数溢出标志 EX0=1;/ dula=1; int test;/int succeed_flag; int discount=0;取一段时间的最小距离作为测距结果 display(minDistance); / P0 = table[ge]; for(a=0; delay(1); dula=1; P2=0x06,用做判断回波电平void exter() interrupt 0 //.17mm distance=time*distforeachcyle;/ / #include "/100;/ char str[5].17mm // / P2 = 4; / / /关总中断 Trig=1;n" TL0=0;*wela=1;关位码 dula=0; /,在数码管显示出来} else { if (minDistance< dula=1.h"minDistance) minDistance = distance; wela=1;/ if (discount < MaxCount) //,1us往返距离是0;/,试了多个超声波模块; /关闭外部中断0 if(succeed_flag==1) { time=timeH*256+timeL, "关位码 dula=0;a++),可以测试0到5米距离,0x06。
测试结果从串口反馈到PC;); }QQ我贴一个测试成功的51程序展开
超声波测距系统的用途有哪些
主要用途 超声波测距主要应用于倒车提醒、建筑工地、工业现场等的距离测量。
超声波在气体、液体及固体中以不同速度传播,定向性好、能量集中、传输过程中衰减较小、反射能力较强。
超声波能以一定速度定向传播、遇障碍物后形成反射,利用这一特性,通过测定超声波往返所用时间就可计算出实际距离,从而实现无接触测量物体距离。
超声波测距迅速、方便,且不受光线等因素影响,广泛应用于水文液位测量、建筑施工工地的测量、现场的位置监控、振动仪车辆倒车障碍物的检测、移动机器入探测定位等领域。
本文设计的数字式超声波测距仪通过对超声波往返时间内输入到计数器特定频率的时钟脉冲进行计数,进而显示对应的测量距离。
我在做一个超声波测距的程序,有一行程序不明白,我在做一个超声...
摘要超声波测距器,可以应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度的测量等场合。
要求测量范围在0.10-5.00m,测量精度1cm,测量时与被测物体无直接接触,能够清晰稳定地显示测量结果。
由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。
利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移动机器人的研制上也得到了广泛的应用。
关键词 单片机AT82S51超声波传感器测量距离 一、设计要求 设计一个超声波测距器,可以应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度的测量等场合。
要求测量范围在0.10-3.00m,测量精度1cm,测量时与被测物体无直接接触,能够清晰稳定地显示测量结果。
二、设计思路 超声波传感器及其测距原理 超声波是指频率高于20KHz的机械波。
为了以超声波作为检测手段,必须产生超生波和接收超声波。
完成这种功能的装置就是超声波传感器,习惯上称为超声波换能器或超声波探头。
超声波传感器有发送器和接收器,但一个超声波传感器也可具有发送和接收声波的双重作用。
超声波传感器是利用压电效应的原理将电能和超声波相互转化,即在发射超声波的时候,将电能转换,发射超声波;而在收到回波的时候,则将超声振动转换成电信号。
超声波测距的原理一般采用渡越时间法TOF(timeofflight)。
首先测出超声波从发射到遇到障碍物返回所经历的时间,再乘以超声波的速度就得到二倍的声源与障碍物之间的距离 测量距离的方法有很多种,短距离的可以用尺,远距离的有激光测距等,超声波测距适用于高精度的中长距离测量。
因为超声波在标准空气中的传播速度为331.45米/秒,由单片机负责计时,单片机使用12.0M晶振,所以此系统的测量精度理论上可以达到毫米级。
由于超声波指向性强,能量消耗缓慢,在介质中传播距离远,因而超声波可以用于距离的测量。
利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也能达到要求。
超声波发生器可以分为两类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。
本课题属于近距离测量,可以采用常用的压电式超声波换能器来实现。
根据设计要求并综合各方面因素,可以采用AT89S51单片机作为主控制器,用动态扫描法实现LED数字显示,超声波驱动信号用单片机的定时器完成,超声波测距器的系统框图如下图所示: 超声波测距器系统设计框图 三、系统组成 硬件部分 主要由单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分组成。
采用AT89S51来实现对CX20106A红外接收芯片和TCT40-10系列超声波转换模块的控制。
单片机通过P1.0引脚经反相器来控制超声波的发送,然后单片机不停的检测INT0引脚,当INT0引脚的电平由高电平变为低电平时就认为超声波已经返回。
计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍物之间的距离。
软件部分 主要由主程序、超声波发生子程序、超声波接收中断程序及显示子程序等部分。
四、系统硬件电路设计 1.单片机系统及显示电路 单片机采用89S51或其兼容系列。
采用12MHz高精度的晶振,以获得较稳定的时钟频率,减小测量误差。
单片机用P1.0端口输出超声波转化器所需的40KHz方波信号,利用外中断0口检测超声波接受电路输出的返回信号。
显示电路采用简单实用的4位共阳LED数码管,段码用74LS244驱动,位码用PNP三极管驱动。
单片机系统及显示电路如下图所示 单片机及显示电路原理图 2.超声波发射电路原理图参考期刊如图所示: 超声波发射电路原理图 压电超声波转换器的功能:利用压电晶体谐振工作。
内部结构上图所示,它有两个压电晶片和一个共振板。
当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动产生超声波,这时它就是一超声波发生器;如没加电压,当共振板接受到超声波时,将压迫压电振荡器作振动,将机械能转换为电信号,这时它就成为超声波接受转换器。
超声波发射转换器与接受转换器其结构稍有不同。
3.超声波检测接受电路 参考红外转化接收期刊的电路采用集成电路CX20106A,这是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。
考虑到红外遥控常用的载波频率38KHz与测距超声波频率40KHz较为接近,可以利用它作为超声波检测电路。
实验证明其具有很高的灵敏度和较强的抗干扰能力。
适当改变C4的大小,可改变接受电路的灵敏度和抗干扰能力。
超声波接收电路图 五、系统程序设计 超声波测距软件设计主要由主程序,超声波发射子程序,超声波接受中断程序及显示子程序组成。
下面对超声波测距器的算法,主程序,超声波发射子程序和超声波接受中断程序逐一介绍。
1.超声波测距器的算法设计 下图示意了超声波测距的原理,即超声波发生器T在某一时刻发出的一个超...
关于超声波测距
1 一个脉冲测量理论上可以的,但实际上1个脉冲时间太短了。
超声波发生器一般1秒发射几十到几百次,叫发射频率。
每次发射的脉冲波为几个波长的波,叫脉冲频率。
发射脉冲波的时间与发射和接收的时间不是同一个概念。
2 你所查的文献所表述的不明确。
通常的超声波测距是利用发射和接收的时间与材料中超声波波速测出的。
相同条件下,1个发射频率中发出的脉冲波越多,发射的能量就越多,接收和转换的能量就越多,设备所测量的结果就越容易。
你提到的文献中所提到的脉冲宽度越大是发射超声与接收超声的时间间隔,因为s=v*t ,所以测距离越大,脉冲宽度越大。
3输出脉冲的个数与被测距离成正比我认为此提法的含义的理解应为:测量的距离小可以采用较短的脉冲宽度,较长的距离采用较长的脉冲宽度。
这是因为如果测量的距离很长,而脉冲宽度短的话,会产生幻象波。
测量的结果就成了脉冲宽度而不是实际的距离了。
4被测物距离越大,脉冲宽度越大,输出脉冲的个数与被测距离成正比。
在这里的意思是,距离越大,超声间隔越长,在越长的时间里发射的脉冲个数就越多啊。
简直就是画蛇添足,明白的都会搞晕!哈哈看看别的文献或书吧,你这个文献的说法太混乱了。
超声波测距电路的种类
1.使用超声波发射头UCM40T,发出40kHz的脉冲超声波,且持续发射200ms.接收头采用与发射头配对的UCM40R,将超声波调制脉冲变为交变电压信号,经运算放大器IC1A和IC1B两极放大后加至IC2.IC2是带有锁定环的音频译码集成块LM567,输出由高电平跃变为低电平,作为中断请求信号,送至单片机处理.2.集成电路CX20106A是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器.考虑到红外遥控常用的载波频率38 kHz与测距的超声波频率40 kHz较为接近,可以利用它制作超声波检测接收电路.3.通过单片机的输入捕捉功能,如用PIC16F87单片机,将输入的超声波信号放大整形后经过单片机分析频率,处理得出是否接收到了声波.由于超声波波速与温度有关,因此电路最好带上测温电路,由温度算出波速再测距.
求超声波测距c程序
xx; TL1=0x57;bit cl; void csbcj();void delay(j); /,0x06,0x5b;开中断 TMOD=0x11;/超声波发送#define csbint P3_7 // ///定时器1中断允许 TH0=0x00at89c2051制作的超声波测距源程序 · 文件版本;依次显示各位数 P1=~buffer,0x6f}: V1; if(s>sj3) { buffer[2]=0x76; buffer[1]=0x76; buffer[0]=0x76; } else if(s>=1; //循环右移1位 }}void timeToBuffer() //转换段码功能模块{ xm0=s/100; xm1=(s-100*xm0)/10; xm2=s-100*xm0-10*xm1; buffer[2]=convert[xm2]; buffer[1]=convert[xm1]; buffer[0]=convert[xm0];}void delay(i) { while(--i);}void timer1int (void) interrupt 3 using 2 { TH1=0x9E; TL1=0x57; csbds++; if(csbds>=40) { csbds=0; cl=1; } }void csbcj(){ if(cl==1) { TR1=0; TH0=0x00; TL0=0x00; i=10; while(i--) { csbout=!csbout; } TR0=1; i=mqs; //盲区 while(i--) { } i=0; while(csbint) { i++; if(i>=2450) //上限值 csbint=0; } TR0=0; TH1=0x9E; TL1=0x57; t=TH0; t=t*256+TL0; s=t*csbc/2; TR1=1; cl=0; }}void keyscan() //健盘处理函数{ xx=0; if(k1!=1) // 判断开关是否按下 { delay(400); //延时去抖动 if(k1!=1) // 判断开关是否按下 { while(!k1) { delay(30); xx++; } if(xx>2000) { jpjs++; if(jpjs>4) jpjs=0; } xx=0; switch(jpjs) { case 1: k1cl();break; case 2: k2cl();break; case 3: k3cl();break; case 4: k4cl();break; } } }}void k1cl(){sj1=sj1+5;if(sj1>100)sj1=30;s=sj1;}void k2cl(){sj2=sj2+5;if(sj2>500)sj2=40;s=sj2;}void k3cl(){sj3=sj3+10;if(sj3>500)sj3=100;s=sj3;}void k4cl(){sx1=sj1-1;sx1=sx1/csbc;mqs=sx1/4.5;}void offmsd() { if (buffer[0] == 0x3f) buffer[0] = 0x00;};显示数据送P1口 delay(20); // TH1=0x9E; i/定时器0中断允许 ET1=1; / sj2=200; sj3=400; ///将值转换成LED段码 offmsd(); scanLED(); jpjs=0;显示标识unsigned char convert[10]={0x3F; } else timeToBuffer(); / sj1=45,sj1,0x07,0x7f; TR1=1; while(1) { keyscan(); if(jpjs<1) { csbcj(); k4cl(),0x6d,0x7d;//主函数{ EA=1,i; //#define k1 P3_4#define csbout P3_5 //延时函数void scanLED(),j,sx1,t;//,opto,digit,buffer[3],xm1,xm2,xm0,key,jpjs: 本站原创 · 文件来源: 本地 · 界面语言.0 · 开发商
-
给我们打电话
7*24小时服务热线:1399999999
全国客服热线:400-0000-000 -
百度地图
福建省漳州市 -
给我们发邮件
E-mail:[email protected]
在线沟通