超声波测距模块+程序
DL-51单片机入门系列教程之七《超声波测距模块编程》

51入门系列教程超声波测距模块编程Revision0.01(2011-10-18)刚好这次做机器人用到了超声波,才开始看它的工作原理,感觉还很简单,但是调试到最后,发现了很多问题,该碰到的都碰到了,趁着写单片机入门教程的机会,写出来分享给大家。
先把超声波的工作原理贴出来:从超声波的工作原理可以知道,其实只要单片机的两个引脚就足够,一个引脚接发送端,一个引脚接接收端即可。
工作时,发送端引脚置高电平10us时间的脉冲,这将激发超声波模块发送8个40khz周期的电平信号,然后模块的收端开始检测回波(实际上,两个眼睛,一个是发送的,一个是用来接收的)。
一旦发现有回波信号,就会输出一个响应给接收端引脚,这个响应是一个高电平脉冲。
所以,我们只要在接收端去检测是否有高电平脉冲即可。
但从程序编写与调试的过程来看,并没有那么简单。
因为超声波第一次发送40KHZ的信号出去后反射回来,有可能又被反弹回去,这样以来,相当于超声波在两个障碍物之间不断地来回反弹,导致接收端不断地收到”回波信号“——实际上第一次反弹回来的才是回波信号,其他的都是二次、三次...的反弹回波信号。
如果每次检测到回波就让蜂鸣器响一次,那么,我们程序运行时,可能会听到蜂鸣器不断地响,可能就是这个原因。
另外,需要关注的是,超声波如果前面没有障碍物,也会在接收端引脚上故意输出140us的电平,以”防止发射信号对回响信号的影响“。
从上面的分析看来,不管超声波前面有无障碍物,接收端引脚肯定都会出现高电平脉冲。
所以我们在编程时,必须过滤掉这140us。
讲完超声波的工作原理,我们来看下编写程序的思路。
由于超声波可能会连续收到回响信号,导致接收端不断出现高电平脉冲,而实际上,我们有用的仅仅是第一次反射回来的回响信号,因此,使用”查询接收端引脚是否出现高电平“的方法行不通。
可以使用外部中断,只检测第一次反射回来的信号,后续的反射信号全部丢弃不管。
下面看下140us的处理。
超声波测距C语言源程序代码

/*{HZ即单位s的倒数}本晶振为12MHZ,因此外部的时钟频率为12MHZ,所以部的时钟频率为(12MHZ)/12=1MH即1000000HZ,而机械频率为1/(1MHZ),即每完成一次计算(即定时器的值加一)用时0.000001s,即1us(微秒).*//***********************************************************************************///具有模式选择.*include<reg52.h>*define UC unsigned char*define UI unsigned intvoid delay(UI); //延时9.56us程序sbit beep = P1^3; //用于声音报警sbit Lv = P1^7; //用于光报警sbit Hong = P1^6;sbit QD = P3^7;//K8 //P3^7口(K8)为确定键,sbit G* = P3^1;//K7 //P3^3口(K2)为修改键,sbit S* = P3^6;//K6 //P3^2(K3)为测量键.sbit B* = P3^0;//K5 //个(K7),十(K6),百(K5),三位修改键sbit a = P1^2;//百位//数码管位选sbit b = P1^1;//十位sbit c = P1^0;//个位sbit trig = P1^4; //方波发射端sbit echo = P1^5; //超声波接收端void IntConfiguration(); //用来"设置中断"的函数,P3^3口(K2)为修改键,P3^2(K3)为测量键.void TimeConfiguration(); //用来"设置定时器"的函数sbit K1 = P3^4;//动态sbit K4 = P3^5;//静态//用于进展模式切换(K1、K4键)void *ia*ian(); //修改函数,用来修改下限void shang*ian(); //修改函数,用来修改上限UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位UI ma*[3]={3,0,0}; //MIN,MA* 用来存储最大和最小值void MIN*ianshi(UI); //最小围和最大围的显示void MA**ianshi(UI);UC code CharacterCode[10] = {0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f};//数码管数字字符(P2口)/********************************主函数*********************************************/ void main(){TimeConfiguration(); //设置定时器0IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键while(1){MIN*ianshi(40); //1.50169000sMA**ianshi(40); //1.50098300s}}/*******************************超声波测距函数********************************************/void zhongduan_0() interrupt 0 //测量中断函数(外部中断0){UI moshi = 0;UI juli = 0;UI time = 0;UI MA*, MIN;UI TT = 0;//用于第一次测量时给P1^5口置一,以便正确读取数值UI t1, t2, t3;UI GE = 0, SHI = 0, BAI = 0; //先定义三个变量,用来显示测量的距离.a = 0;b = 0;c = 0;P2 =~ 0*00; //防止最后显示的那个数码管一直亮MA* = ma*[0]*100 + ma*[1]*10 + ma*[2]; //计算最大与最小值MIN = min[0]*100 + min[1]*10 + min[2];while(1)//下面进展测量{while(1) /*先进展模式判断*/{if(0 == K1){moshi = 1;break; //模式1为动态测量}if(0 == K4){moshi = 2;break; //模式2为静态测量}if(0 == QD)return; //完毕测量函数}/********************************************计算距离************************************************/loop: beep = 1;//关掉定时器Lv = 1;Hong = 1;//关掉灯a = 0;b = 0;c = 0;P2 =~ 0*00;//防止最后显示的那个数码管一直亮if( (0 == QD)&&(1 == moshi) )break;if( (0 == QD)&&(2 == moshi) ){delay(55500);if(0 == QD){delay(55500);if(0 == QD)break;}}t1 = 35,t2 = 35;t3 = 35;trig = 0;echo = 0;delay(2); //初始化拉低两个端口trig = 1;delay(2);trig = 0; //输出端输出27us的高电压,并将输出端口拉低while(echo == 0); //判断是否有回波返回,有则开启定时器TR0 = 1; //当有高电平输出时,开启定时器while(echo == 1);TR0 = 0; //当高电平变成低电平时,关闭定时器++TT; //测量值加一,记录测量次数if(1 == TT){delay(55500);TH0 = 0*00;TL0 = 0*00; //定时器的初值,定时器的定时为65536us.goto loop;}time = TL0 + TH0*256; //接下来显示测量的距离TH0 = 0*00;TL0 = 0*00; //定时器的初值,定时器的定时为65536us.juli = ( int )( (time*0.034)/2 );BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 );/******************************************两种模式的距离显示********************************************/if(juli > MA*){Hong = 0;Lv = 1;while( t1-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(400);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(400);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(390);beep = 0;if( (1 == moshi)&&(0 == t1) )goto loop;if(moshi == 2){t1 = 2;if(0 == QD)goto loop;}}}else if(juli < MIN){Lv = 0;Hong = 1;while( t2-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(400);beep = 0;delay(100);beep = 1;if( (1 == moshi)&&(0 == t2) )goto loop;if(2 == moshi){t2 = 2;if(0 == QD)goto loop;}}}else{beep = 1;Lv = 1;Hong = 1;while( t3-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(600);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(600);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(600);if( (1 == moshi)&&(0 == t3) )goto loop;if(2 == moshi){t3 = 2;if(0 == QD)goto loop;}}}//显示完毕}}/***********************************************************************************/ void zhongduan_1() interrupt 1 //定时器溢出时的中断,显示测得的距离(定时器中断0){TH0 = 0*00;//定时器的初值,定时器的定时为65536us,TL0 = 0*00;}/***********************************************************************************/ void zhongduan_2() interrupt 2 //修改键(K4)的中断函数(外部中断1){*ia*ian();while(QD==0);shang*ian();}/**********************************************************************************/ void MIN*ianshi(UI TT) //显示最小距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(500);}P2 =~ 0*00;delay(55500);}void MA**ianshi(UI TT) //显示最大距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[ma*[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[ma*[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[ma*[2]];delay(500);}P2 =~ 0*00;delay(55500);}/***********************************************************************************/ void delay(UI T) //延时程序{while(T--);}/***********************************************************************************/ void IntConfiguration() //设置中断函数{//优先级设置PT2 = 0;PS = 0;PT1 = 0;P*1 = 0;PT0 = 1;P*0 = 0;IT1 = 1; //外部中断0为跳变沿触发E*1 = 1; //P3^3口(K4键)修改键,中断允许开启IT0 = 1; //外部中断1为跳变沿触发E*0 = 1; //P3^2口(K1键)测量键,中断允许开启ET0 = 1; //定时器0的中断允许开启EA = 1;}void TimeConfiguration() //设置定时器,以及定时器的初值{TMOD = 0*01;//设定只使用0号定时器; 模式:定时器; 工作方式:1号工作方式.//下面是定时器的初始值, TR0,TR1是用来开启定时器的TH0 = 0*00;//定时器的初值,定时器的定时为50us.TL0 = 0*00;/*1号定时器不用,所以没有TH1,TL1*/}/***********************************************************************************/ void *ia*ian() //修改下限{while(1){if(B*==0)//百位{P2=~0*00;min[0]++;if(min[0]==10)min[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(100);if(S*==0)//十位{P2=~0*00;min[1]++;if(min[1]==10)min[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(100);if(G*==0)//个位{P2=~0*00;min[2]++;if(min[2]==10)min[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(100);if(QD==0){a = 0;b = 0;c = 0;P2 = 0*ff;break;}}}void shang*ian() //修改上限{while(1){if(B*==0)//百位{P2=~0*00;ma*[0]++;if(ma*[0]==10)ma*[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[ma*[0]];delay(100);if(S*==0)//十位{P2=~0*00;ma*[1]++;if(ma*[1]==10)ma*[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[ma*[1]];delay(100);if(G*==0)//个位{P2=~0*00;ma*[2]++;if(ma*[2]==10)ma*[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[ma*[2]];delay(100);if(QD == 0){a = 0;b = 0;c = 0;P2 = 0*ff;while(QD == 0);break;}}}/************************************************************************************/。
PIC18F4520单片机超声波测距主要部分程序

PIC18F4520单片机超声波测距主要部分程序测试环境:MPLAB IDE v8.73a单片机型号:PIC18F4520所需器件:超声波模块电路连接图如下:超声波测距子函数:unsigned int chaosheng(){unsigned int temp1,temp2;//定义两个无符号整型的变量用于存储距离值INPUT = 1;delay(50);//延时INPUT = 0;while(!OUTPUT);//当超声波的输出引脚输出高电平时,打开定时器0,开始计时TMR1ON = 1;while(OUTPUT);//当超声波的输出引脚输出低电平时,关闭定时器0,停止计时TMR1ON = 0;//计算超声波测出的距离temp1 = TMR1L;//将TMR1的低8位赋值给temp1变量temp2 = TMR1H;//将TMR1的高8位赋值给temp2变量temp2 = (temp2 << 8) + temp1;//temp2左移8位,加上temp1TMR1H = 0;//TMR1的高8位清零,为下一次测距做准备TMR1L = 0;//TMR1的低8位清零,为下一次测距做准备//距离 = 时间/2 * 速度//距离:distance;时间:temp2/2单位为μs;速度:340m/s//这里注意下单位,需要进行换算让最终距离的单位为cm/sdistance = temp2 * 1.7/100;//有一定的误差,可以软件填补误差,根据实测值,在右侧的表达式上加减一误差数值。
return distance;//返回超声波测得的距离值,这里的distance为全局变量,可以在其他程序中用到,例如液晶显示部分,可以作为实参传递给其对应程序,用于显示。
}最后:很欣赏Google的面试题:用3句话向老太太讲清楚什么是数据库。
乔布斯说:“最好的东西就是关注简单”,因为简单的东西比复杂的东西更难做到。
超声波测距论文(含原理图、程序)

1 绪论之阿布丰王创作以后社会经济的不竭发展和工业科学技术的不竭提高,汽车已逐渐进入很多苍生家.汽车使用数量的不竭增加,从而由此招致的倒车交通平安问题也非常严重,路途交通压力增加,交通平安问题也是面临严峻挑战.在面临如此严峻的交通平安问题,许多涉及平安问题的汽车辅助系统也纷纷现世.而本设计就是利用单片机知识、传感器知识等,进行的汽车防撞装置的设计,在汽车倒车时,这种装置可以在驾驶员对车尾与障碍物体的距离远近无法目测和判断时进行报警.1.1 课题布景及意义我国社会经济的不竭发展,人们对汽车这种交通工具的依赖性也越来越年夜,招致了车辆的日益增加在给城市交通不竭施加压力的同时,也引发了非常多行车的平安问题.一些由驾驶员反应不够迅速而招致的汽碰擦,还有很多时候是由于驾驶员对离障碍物的距离判断禁绝确而造成的,如果驾驶员能提前知道障碍物的存在而且知道障碍物的距离,那么驾驶员就能及时地采用办法,从而能防止事故的发生.因此,许多平安系统也应运而生,诸如为了防止交通事故发生的主动平安系统和在发生事故时的防护平安的主动平安系统,而主动平安系统对汽车交通事故的发生能起到防止的作用,所以,主动平安系统的研究更为重要.随着汽车数量的增加,停车场的数量也急剧增加,停车车辆密集,停车人多,所以汽车碰撞亦逐渐增多.而本设计的汽车防撞装置就是主动平安系统,通过对汽车与障碍物之间距离的提示报警防止汽车与障碍物之间的擦碰.本设计要求设计的汽车防撞装置能减少驾驶员的驾驶压力和判断毛病,使驾驶员停车倒车更加平安方便,本设计将对提高交通平安起到重要作用.本设计基于单片机实现汽车防撞,将超声波测距和传感器联系在一起,利用单片机的实时控制和数据处置功能丈量并显示汽车与障碍物之间的距离,并在分歧距离利用蜂鸣器分歧频率发出分歧声音及时报警.这样驾驶员就能通过测距的显示甚至分歧的声音来直接判断汽车玉障碍物之间的距离.本设计的设计简易,虽然精度不高,还不能丈量过远的距离,但规模小,外围电路简单,调试也方便,本钱也不高,器件更换容易,灵活性高,而且能完全满足驾驶员停车时的需要,可以完全解除驾驶员在倒车过程中的顾虑和困扰,提高停车的平安.汽车防撞装置这种汽车平安辅助装置能年夜年夜减少汽车驾驶员在倒车的时候顾虑和对距离判断的失误,从而能够防止倒车的平安问题的发生,故此装置对提高交通平安将起到重要的作用.所以,本课题所要求设计的基于单片机的汽车防撞装置将具有极年夜的现实意义和市场.1.2 国内外研究现状本汽车防撞装置包括有单片机控制电路、超声波测距传感器、蜂鸣器报警电路及数码管显示部件等,装置将各部件有机地结合起来,实现超声波测距及蜂鸣器报警提示的功能.倒车雷达系统的开始是以蜂鸣器报警为标识表记标帜的.汽车离障碍物距离越近,蜂鸣器报警声越急,蜂鸣器报警虽然使驾驶员知道有障碍物的存在,但却不能确定汽车车尾离障碍物有多远,所以,蜂鸣器报警对驾驶员帮手不是很年夜;之后一个质的飞跃就是液晶屏显示的呈现,特别是液晶显示开始呈现静态显示系统,驾驶员就是只要发动车辆,而且不用挂倒挡,液晶显示器上就会呈现汽车图案以及汽车与周围的障碍物的距离,液晶显示是静态显示,液晶显示器的外表美观,显示的色彩也很清晰,而且可以直接粘贴在仪表盘上,装置也很方便[1].不外由于液晶显示的灵敏度比力高,而且它的抗干扰能力也不是很强,所以误报的情况也较多.现在市面上的魔幻镜倒车雷达应该算是比力先进的倒车雷达了,它结合了前几代产物的优点,并采纳了最新仿生超声雷达技术,并用高速电脑控制,可全天准确地进行探测2m以内的障碍物,并以分歧的声音提示和直观的距离显示来提醒驾驶员;魔幻镜倒车雷达把后视镜、倒车雷达、免提德律风、温度显示和车内空气温度显示等多项功能整合在一起[1],并设计了语音功能,因为其外形就是一块倒车镜,所以可以不占用车内空间,可以直接装置在车内倒视镜的位置,而且它样式种类繁多,可以依照个人需求和车内装饰选配,固然它的价格也是比力贵的[1].最新的一代倒车雷达是整合影音系统,除具备前几代倒车雷达的功能外还兼有影音系统[1].随着科学技术水平的迅速发展,相关电子技术也是飞跃前进,固然,汽车电子财富也获得飞速发展,电子财富的飞速发展使得车载电子平顺产物有很年夜的发展前景.倒车雷达固然是每辆车必备的电子平顺产物,如今市面上的主流的汽车倒车雷达基本都是以单片机芯片为控制核心的智能测距报警系统.这些的倒车雷达能够连续测距并显示汽车与障碍物之间的距离,而且采纳蜂鸣器的分歧频率的鸣叫声进行报警提示和距离显示提示,从而能够尽量不占用驾驶员的视觉空间[1].另外,汽车电子系统的网络化的发展还要求作为汽车行驶平安辅助系统的倒车雷达要具有通信功能,并能够把数据发送到汽车总线上去[2].就目前市面上的产物来讲,目前的汽车倒车雷达主要是具备数码管或者液晶屏的距离显示而且带有蜂鸣器的语音报警为主的汽车平安系统.这些系统主要采纳的是以单片机为控制核心的智能超声波测距传感器和蜂鸣器报警系统,这种汽车平安辅助系统廉价耐用,而且达到了汽车电子系统网络化的发展需求.1.3 课题研究内容及章节安插本文所介绍的超声波测距报警系统在测距的时候采纳的是两个超声波探头分别进行超声波发射和接收来进行距离的丈量的.本设计的汽车防撞系统能丈量出倒车方向的障碍物与汽车之间的距离, 并通过数码管显示单位模块显示两者之间的距离,然后通过蜂鸣器发出分歧频率的声响, 从而起到提示和报警的作用.本系统利用一片89S51单片机对超声波信号循环不竭地进行收集.系统包括超声波测距单位(超声波集成模块)、89S51单片机控制、蜂鸣器报警模块和数码管显示模块.这个设计的汽车倒车雷达要能够连续测距,数据经过单片机的处置后,用4位数码管显示所丈量获得的距离,并利用分歧频率使蜂鸣器发出分歧的鸣叫声进行语音报警.论文构成主要由以下部份组成:第1章主要介绍了本课题的布景意义和相关技术在国内外的研究现状.第2章介绍的是汽车防装系统的总体方案设计.首先介绍汽车防撞系统的设计要求,然后分别对测距传感器的选择和显示报警系统的方案设计做了介绍,最后提出本系统的总体的设计方案,为硬件系统的设计打下了基础.第3章对硬件系统的设计进行了介绍.首先对超声波传感器的工作原理进行了分析,然后具体讨论了超声波测距模块中的超声波发射电路和超声波接收电路的硬件设计,最后介绍了显示模块电路和蜂鸣器报警电路的设计.第4章主要是对系统的软件设计进行了介绍.在软件设计中采纳分歧模块分歧编程进行设计的,本设计分别对系统的主法式模块、中断子法式模块、超声波测距模块、蜂鸣器报警模块和数码管的显示模块的各个法式进行了设计.第5章是硬件的组装及其性能进行分析.首先对实物进行硬件排版组装和焊接,然后讨论了系统的性能发生的误差.第6章是对本设计的总结和展望.最后一章对全文进行了总结,并指明了系统设计的缺乏之处,最后也对本系统的倒车雷达报警系统的发展前景进行了展望.2 总体方案论证本章从系统方案等一些方面来进行论证.本设计主要是进行距离的丈量和报警,设计中涉及到的内容较多,主要是将单片机控制模块、超声波测距模块、蜂鸣器报警模块、4位数码管显示模块这几个模块结合起来.而本设计的核心是超声波测距模块,其他相关模块都是在测距的基础上拓展起来的,测距模块是利用超声波传感器,之后选择合适单片机芯片,以下就是从相关方面来论述的. 2.1 设计方案论证2.1.1 测距传感器(1)激光测距传感器激光传感器利用激光的方向性强和传光性好的特点,它工作时先由激光传感器瞄准障碍物发射激光脉冲,经障碍物反射后向各个方向散射,部份散射光返回到接受传感器,能接受其微弱的光信号,从而记录并处置光脉冲发射到返回所经历的时间即可测定距离,即用往返时间的一半乘以光速就能获得距离.其优点是丈量的距离远、速度快、丈量精确度高、量程范围年夜,缺点是对人体存在平安问题,而且制作的难度年夜本钱也比力高[3].(2)红外线测距传感器红外线测距传感器利用的就是红外线信号在遇到障碍物其距离的分歧则其反射的强度也分歧,根据这个特点从而对障碍物的距离的远近进行丈量的.其优点是本钱昂贵,使用平安,制作简单,缺点就是丈量精度低,方向性也差,丈量距离近[3].(3)超声波传感器超声波是一种超越人类听觉极限的声波即其振动频率高于20kHz的机械波.超声波传感器在工作的时候就是将电压和超声波之间的互相转换,当超声波传感器发射超声波时,发射超声波的探头将电压转化的超声波发射出去,当接收超声波时,超声波接收探头将超声波转化的电压回送到单片机控制芯片.超声波具有振动频率高、波长短、绕射现象小而且方向性好还能够为反射线定向传布等优点,而且超声波传感器的能量消耗缓慢有利于测距[4].在中、长距离丈量时,超声波传感器的精度和方向性都要年夜年夜优于红外线传感器,但价格也稍贵.从平安性,本钱、方向性等方面综合考虑,超声波传感器更适合设计要求.根据对以上三种传感器性能的比力,虽然能明显看出来激光传感器是比力理想的选择,可是它的价格却比力高,而且平安度不够高.而且汽车在行驶的过程中超声波传感器测距时应具有较强的抗干扰能力和较短的响应时间,因此选用超声波传感器作为此设计方案的传感器探头.2.2 系统方案此方案选择51单片机作为控制核心,所测得的距离数值由4位共阳极数码管显示,与障碍物之间的分歧距离利用蜂鸣器频率的分歧报警声提示,超声波发射信号由51单片机的P0.1口送出到超声波发射电路,将超声波发送出去,超声波接收电路由CX20106A芯片和超声波接收探头组成的电路构成,报警系统由蜂鸣器电路构成.本设计中将收发超声波的探头分离这样不会使收发信号混叠,从而能防止干扰,可以很好的提高系统的可靠性.本设计的汽车防撞装置的系统框图如图2.1所示.图2.1 汽车防撞装置的系统框图本设计由Keil编程软件对51单片机进行编程,51单片机在执行法式后由P0.1端口发生40kHz的脉冲信号通过74LS04电路进行放年夜并送到到超声波发射探头,发生超声波.在超声波发射电路启动的同时单片机启动中断按时器,利用其计数的功能记录超声波发射超声波到接收到超声波回波的时间.当接收回射的超声波时,接收电路的输出端发生负跳变输出到单片机发生中断申请,执行外部中断子法式计算距离.结合各方面的因素考虑,依据设计的要求,查阅相关数据资料,选择了超声波测距传感器TR40-16Q(其中T暗示超声波发射探头,R暗示超声波接收探头),综合考虑设计的要求出于简便角度,选用了HC-SR04超声波集成模块.此超声波模块的最年夜探测距离为 5 m,精度可以达到0.3cm,盲区为2cm,而且发射扩散角不年夜于15°,更有利于测距的准确性.而且,此模块的工作频率范围为39 kHz~41 kHz左右,完全能在40 kHz工作频率工作.由于超声波的发射和接收是分开发送和接收的,所以发射探头和接收探头必需在同一条水平行直线上,这样才华准确地接收反射的回波.而由于丈量的距离分歧和发射扩散角所引起的误差以及超声波信号在空气中传布的过程中的超声波衰减问题,发射探头和接收探头距离不成以太远,而且还要防止发射探头对接收探头在接收信号时发生的干扰,所以二者又不能靠得太近.根据对相关资料查阅,将两探头之间的距离定在5cm~8cm最为合适.本设计所用的HC-SR04模块的超声波探头之间的距离年夜约在6 cm左右.3 硬件电路设计本设计的汽车防撞装置由51单片机、超声波发射探头、超声波接收探头、4位共阳极数码管、蜂鸣器组成.汽车防撞系统的测距是利用超声波测距的原理,在单片机内部法式的控制下,由超声波发射探头发射超声波,在超声波遇到障碍物时反射到超声波接收探头,由此回应到单片机,由单片机进行中断处置和数据的处置,计算出距离,由数码管显示距离,并由蜂鸣器报警提示.本设计的硬件电路分为五部份:单片机最小系统、超声波发射和接收电路、蜂鸣器报警电路和数码管显示电路.3.1 单片机系统设计3.1.1 单片机的选择一般在系统的设计傍边,能否完成设计任务最重要的就在于系统的核心器件是否选择合适,而单片机更是是系统控制的核心,所以对单片机的选择更是异常重要.如果选择了一个合适的单片机不单可以最年夜地简化系统的把持,而且其功能可能是最好的,可靠性也比力高,对整个系统来说更方便.目前,市面上的单片机的种类繁多,而且他们在功能方面也是各自有各自的特点.在一般的情况下来讲,在选择单片机时要需要考虑的几个方面有[5]:(1)单片机最基赋性能参数指标.例如:执行一条指令的速度、法式存储器的容量,I/O口的引脚数量等.(2)单片机的某些增强的功能.(3)单片机的存储介质.例如:对法式存储器来说,最好选用的是Flash的存储器.(4)单片机的封装形式.封装的形式多种多样,例如:双列直插封装、PLCC封装及概况贴附等.(5)单片机对工作的温度范围的要求.例如:在进行设计户外的产物时,就必需要选用工业级的芯片,以达到温度范围的要求.(6)单片机的功耗.例如,如果信号线取电只能提供几mA的电流,所以为了能满足低功耗的要求这个时候选用STC的单片机是最合适的.(7)单片机在市面上的销售渠道是否疏通、其价格是否廉价.(8)单片机技术的支持网站如何,卖家提供的芯片资料是否足够完善,是否包括了用户手册,设计方案举例,相关范例法式等.(9)单片机的保密性是否很好,单片机的抗干扰的性能如何等.51系列单片机它在指令系统、硬件结构和片内资源等方面与标准的52系列的单片机可以完全的兼容.51系列的单片机执行速率快(最高时钟频率为90MHz),功耗低,在系统、在应用可编程,不占用用户的资源[5].根据本系统设计的实际要求,选择AT89S51单片机做为本设计的单片机使用,它是由ATMEL公司生产的高性能、低功耗的CMOS 8位单片机.89S51单片机具有以下几个性能特点:4 k字节的闪存片内法式存储器,128字节的数据存储器,32个外部输入和输出口,2个全双工串行通信口,看门狗电路,5个中断源,2个16位可编程按时计数器,片内震荡和时钟电路且全静态工作并由低功耗的闲置和失落电模式[5].单片机的引脚功能图如图3.1所示.图3.151单片机的引脚功能图3.1.2 单片机引脚功能(1)电源引脚Vcc(40脚):正电源的引脚,工作电压是5V.GND(20脚):接地端.(2)时钟电路的引脚XTAL1和XTAL2为了发生时钟信号,在89S51单片机的芯片内部已经设置了一个反相放年夜器,其中XTAL1端口就是片内反相放年夜器的输入端,XTAL2端则是片内振荡器反相放年夜器的输出端 [5].单片机使用的工作方式是自激振荡的方式,XTAL1和XTAL2外接的是12MHz 的石英晶振,使内部振荡器依照石英晶振的频率频率进行振荡,从而就可以发生时钟信号.时钟信号电路如图3.2所示.图3.2 时钟信号电路(3)复位RST(9脚)当振荡器运行时,只要有有两个机器周期即24个振荡周期以上的高电平在这个引脚呈现时,那么就将会使单片机复位,如果将这个引脚坚持高电平,那么51单片机芯片就会循环不竭地进行复位[5].复位后的P0口至P3口均置于高电平,这时法式计数器和特殊功能寄存器将全部清零[5].本课题设计的单片机复位电路如图3.3所示.图3.3 单片机复位电路图(4)输入输出口(I/O口)引脚P0口是一个三态的双向口,既可以作为数据和地址的分时复用口,又可以作为通用输入输出口[5].P0口在有外部扩展存储器时将会被作为地址/数据总线口,此时P0口就是一个真正的双向口;而在没有外部扩展存储器时,P0口也可以作为通用的I/O接口使用,但此时只是一个准双向口;另外,P0口的输出级具有驱动8个LSTTL负载的能力即输出电流不小于800uA[5].P1口是一个带内部上拉电阻的8位双向I/O口,而P1口只有通用I/O接口一种功能,而且P1口能驱动4个LSTTL负载;在使用时通常不需要外接上拉电阻就能够直接驱动发光二极管;在端口置1时,其内部上拉电阻将端口拉到高电平,作输入端口用[5].对输出功能,在单片机工作的时候,可以通过用法式指令控制单片机引脚输出高电平或低电平[5].例如:指令CLR是清零的意思,CLR P1.0的意思就是让单片机的P1.0端口输出低电平;而指令SETB是置1的意思,SETB P1.0的意思就是让单片机P1.0端口输出高电平[5].P2口是一个带内部上拉电阻的8位双向I/O口,而且P2口具有驱动4个LSTTL负载的能力[5].P2端口置1时,内部上拉电阻将端口的电位拉到高电平,作为输入口使用;在对内部的Flash法式存储器编程时,P2口接收高8位地址和控制信息,而在访问外部法式和16位外部数据存储器时,P2口就送出高8位地址[5].在访问8位地址的外部数据存储器时,P2引脚上的内容在此期间不会改变[5].P3口也是一个带内部上拉电阻的8位双向I/O口,P3口能驱动4个LSTTL负载,这8个引脚还用于专门的第二功能[5].P3口作为通用I/O口接口时,第二功能输出线为高电平.P3口置1时,内部上拉电阻将端口电位拉到高电平,作输入口使用;在对内部Flash法式存储器编程时,此端接控制信息[5].P3口的第二功能,如表3.1所示[5].表3.1 P3口第二功能表(5)其它控制或复用引脚(a)ALE/PROG(30脚):地址锁存有效信号输出端.在访问片外存储器时,ALE(地址锁存允许)以每机器周期两次进行信号输出,其下降沿用于控制锁存P0口输出的低8位地址;在不访问片外存储器的时候,ALE端仍以不变的频率输出脉冲信号(此频率是振荡器频率的1/6),而在访问片外数据存储器时,ALE脉冲会跳空一个,此时是不成以做为时钟输出[5].对片内含有EPROM的机型在编程时,这个引脚用于输入编程脉冲/PROG的输入端[5].(b)/PSEN(29脚):片外法式存储器读选通信号输出端,低电平时有效.当89S51从外部法式存储器取指令或常数时,每个机器周期内输出2个脉冲即两次有效,以通过数据总线P0口读回指令或常数.但在访问片外数据存储器时,/PSEN将不会有脉冲输出[5].(c)/EA/Vpp(31脚):/EA为片外法式存储器访选用端.当该引脚访问片外法式存储器时,应该输入的是低电平,要使89S51只访问片外法式存储器,这时该引脚必需坚持低电平;而在对Flash存储器编程时,用于施加Vpp编程电压[5].3.1.3单片机最小系统单片机最小系统是其他拓展系统的最基本的基础,单片机最小系统是指一个真正可用的单片机最小配置系统即单片机能工作的系统.对80S51单片机,由于片内已经自带有了法式存储器,所以只要单片机外接时钟电路和复位电路就可以组成了单片机的最小系统了.单片机的最小系统如图3.4所示.图3.4 单片机最小系统原理图3.2 超声波发射和接收电路设计超声波是一种振动频率超越20 kHz的机械波,它可以沿直线方向传布,而且传布的方向性好,传布的距离也较远,在介质中传布时遇到障碍物在入射到它的反射面上就会发生反射波[6].由于超声波的以上几个特点,所以超声波被广泛地应用于物体距离的丈量、厚度等方面[6].而且,超声波的丈量是一种比力理想的的非接触式的测距方法[6].当进行距离的丈量时,由装置在同一水平线上的超声波发射器和接收器完成超声波的发射与接收,而且同时启动按时器进行计数[7].首先由超声波发射探头向倒车的方向发射超声波并同时启动按时器计时,超声波在空气中传布的途中一旦遇到障碍物后就会被反射回来,当接收探头收到反射波后就会给负脉冲到单片机使其立刻停止计时[6.7].这样,按时器就能够准确的记录下了超声波发射点至障碍物之间往返传布所用的时间t(s)[7].由于在常温下超声波在空气中的传布速度年夜约为340m/s[7],所以障碍物到发射探头之间的距离为:S=340×t/2=170×t因为单片机内部按时器的计时实际上就是对机器周期T的计数,而本设计中时钟频率fosc取12MHz,设计数值N,则:T=12/f osc=1μst=N×T=N×0.000001(s)S=170×N×T=170×N/1000000(m)在法式中按式S=170×N×T=170×N/1000000计算距离.3.2.1 超声波发射电路设计超声波发射电路是由超声波探头和超声波放年夜器组成.超声波探头将电信号转换为机械波发射出去,而单片机所发生的40 kHz的方波脉冲需要进行放年夜才华将超声波探头驱动将超声波发射出去,所以发射驱动实际上就是一个信号的放年夜电路,本设计选用74LS04芯片进行信号放年夜,超声波发射电路如图3.5所示.图3.5 超声波发射电路。
超声波测距仪C语言程序.txt

while(1)
{
keyscan();
if(jpjs<1)
{
csbcj();
if(s>sj3)
void scanLED(); //显示函数
void timeToBuffer(); //显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
}
}
}
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()
unsigned int s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1;
bit cl;
void csbcj();
void delay(j); //延时函数
if((P3&0x10)==0) //判断3位是否显示完
key=0;
digit>>=1; //循环右移1位
}
}
void timeToBuffer() //转换段码功能模块
}
void delay(i)
{
while(--i);
}
void timer1int (void) interrupt 3 using 2
{
TH1=0x9E;
超声波测距程序

#include <r eg52.h>//8052内核单片机#include <intrins.h>//调用_nop_()单周期延时//柳州市第一职业技术学校欧福强unsigned char L ED_SEG[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,0xf7,0 xff};unsigned char D1,D2,D3,D4;//数码管显示变量unsigned long j u_li;//距离变量unsigned int s hi_cha,haomi;//时差,以毫米为单位的长度unsigned char x un_huan_ci_shu;//记录主循环循环的次数unsigned char sqys,sdbxgs;//死区延时,设定波形输出个数sbit huibo=P1^7;//接收电路的回波信号sbit k ey1=P2^0;//调整死区时间sbit k ey2=P2^1;//调整波形个数void C SB_SC(unsigned char geshu)//超声波输出子程序,传递参数:超声波个数{//子程序开始P1=P1&0XFE;//准备输出do//do-while循环{//循环开始P1=P1^0X03;//P1.0和P1.1取反_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();//2µS延时,连同取反2µS共13µSP1=P1^0X03;//P1.0和P1.1取反_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();_nop_();//3µS延时_nop_();_nop_();//2µS延时}while(--geshu);//循环结束,跳转回开始需要2µS,共12µSP1=P1|0X03;//结束输出}//子程序结束void y an_shi(unsigned int shuju)//延时,地球人都知道{//延时开始while(--shuju);//延时主体,不断减1,耗时}//延时结束void chushihua(void)//初始化子程序{//开始TMOD=0x01;//定时器0工作于16位模式(0-65535)sqys=200;//死区延时开机设定为200sdbxgs=20;//初始化时设定每次发送20个周期波形}//结束void c e_ju(void)//测距主程序(科技含量在这){//开始T H0=0X00;//定时器计数清零(高八位)T L0=0X00;//定时器计数清零(低八位)T F0=0;//清溢出标志T R0=1;//启动定时器开始计时C SB_SC(sdbxgs);//立即按传来的参数输出超声波y an_shi(sqys);//延时一段时间,防止发射波干扰while(huibo && (T F0==0));//等待回波信号及溢出信号//即如果没有收到回波就一直等待下去//但也不能死等,等待超过65535µS后仍然没有回波就放弃T R0=0;//收到回波或超时,停止定时器,冻结定时器的值if(T F0)//判断是否超时(定时器是否溢出){//如果条件成立(确实超过65535µS未收到回波)D1=D2=D3=D4=10;//超时未收到回波,显示"----"}//成立时处理完毕else//未超时并收到回波{//未超时,确实在发出超声波65535µS内收到回波s hi_cha=T H0*256+T L0;//从定时器中取出计时值,即往返时差j u_li=170L*s hi_cha;//距离=声速×往返时间÷2,即距离=170×往返时差//得到的距离单位是µM,因为定时器计得的时间为微秒haomi=j u_li/1000;//把得到的距离除以1000,得到以毫米为单位的长度数据D1=haomi/1000;//除以1000,得到米D2=haomi%1000/100;//模1000,剩下几百几百的数,除以100,得到分米D3=haomi%100/10;//模100,剩下几十几十的数,除以10,得到厘米D4=haomi%10;//直接模10,剩下几的数,得到毫米}//未超时处理完毕}//测距子程序处理完毕void L ED_SCAN(void)//数码管扫描子程序{//扫描程序开始P2=P2|0XF0;//通过或操作将P2高四位置1,关闭数码管①P0=0XdF&L ED_SEG[D1];//输出段码在P0口②P2=P2&0xBF;//通过与的方式将P2.6变成低电平,打开D1③y an_shi(500);//延时一段时间④P2=P2|0XF0;//同①P0=L ED_SEG[D2];//同②P2=P2&0xDF;//类似③y an_shi(500);//同④P2=P2|0XF0;//同①P0=L ED_SEG[D3];//同②P2=P2&0xEF;//类似③y an_shi(500);//同④P2=P2|0XF0;//同①P0=L ED_SEG[D4];//同②,但还要跟0X7F进行与运算,将小数点位变0 P2=P2&0x7F;//类似③y an_shi(500);//同④}//扫描程序结束void main(void)//主程序{//主程序开始chushihua();//初始化,设置定时器工作模式while(1)//主循环{//主循环开始L ED_SCAN();//扫描数码管x un_huan_ci_shu++;//主循环每循环一次,变量加一if(x un_huan_ci_shu>=5)//每循环5次,就进行一次测距,控制测距间隔时间 {//已达5次主循环P2=P2|0XF0;//关闭数码管,避免某个数码管长时间被点亮ce_ju();//调用测距子程序进行测距xun_huan_ci_shu=0;//循环计数变量清零}//测距间隔时间控制处理完毕if(!k ey1)//死区延时按钮被按下{//按键处理开始sqys=sqys+5;//死区延时增加if(sqys>250){sqys=0;}//越界检测并抓回D1=11;//关闭第一个数码管D2=sqys/100;//获得百位D3=sqys%100/10;//获得十位D4=sqys%10;//获得各位while(!k ey1)//按键是否持续按下{//循环开始,等待按键松开L ED_SCAN();//如果没有松开,扫描数码管,显示死区延时}//循环尾}//按键处理结束,按键已松开if(!k ey2)//波形个数按钮被按下{//按键处理开始sdbxgs=sdbxgs+1;//输出波形数量增加if(sdbxgs>100){sdbxgs=0;}//越界检测并抓回D1=11;//关闭第一个数码管D2=sdbxgs/100;//获得百位D3=sdbxgs%100/10;//获得十位D4=sdbxgs%10;//获得各位while(!k ey2)//按键是否持续按下{//循环开始,等待按键松开L ED_SCAN();//如果没有松开,扫描数码管,显示发波个数}//循环尾}//按键处理结束,按键已松开}//主循环结束}//主程序结束。
超声波测距程序(LCD1602液晶显示)

#include<reg52.h>#include<intrins.h>#define uint unsignedint#define uchar unsigned char#define NOP() {_nop_();_nop_();_nop_();_nop_();}//------LCD引脚-----sbit LCD_RS=P2^6;sbit LCD_RW=P2^5;sbit LCD_EN=P2^7;//------超声波引脚-------sbitTx=P3^3; //触发控制信号输入Trigsbit Rx=P3^2; //回响信号输出Echouchar code table[]={"Distance Test:"}; //LCD第一行显示uchartemp_dis[]= {"000.0 cm"}; //LCD第二行longintt,distance;uchar cache[4]={0,0,0,0};//--------延时-------void delay(uintms){uint t;while(ms--)for(t=0;t<120;t++);}//-------读LCD状态-------ucharread_lcd_state(){uchar state;LCD_RS=0;LCD_RW=1;LCD_EN=1;_nop_();state=P0;LCD_EN=0;_nop_();return state;}//-------忙等待------voidlcd_busy_wait(){while((read_lcd_state() & 0x80)==0x80);NOP();}//----------LCD写指令----------voidlcd_write_com(uchar com){lcd_busy_wait();LCD_RS=0; //RS为0时,写指令,RS为1时,写数据LCD_RW=0;P0=com;NOP();LCD_EN=1;NOP();LCD_EN=0;}//----------LCD写数据----------voidlcd_write_data(uchardat){lcd_busy_wait();LCD_RS=1;LCD_RW=0;P0=dat;NOP();LCD_EN=1;NOP();LCD_EN=0;}//-------LCD初始化-------voidlcd_init(){LCD_EN=0;lcd_write_com(0x38); //LCD显示模式设置lcd_write_com(0x0c); //LCD显示开/关及光标设置lcd_write_com(0x06); //当写一个字符后地址指针加1,且光标加1 lcd_write_com(0x01); //显示清屏}//---------设置液晶显示位置-----------voidset_lcd_pos(uchar p){lcd_write_com(p|0x80);}//---------液晶显示程序----------voidlcd_print(ucharp,uchar *s,uint low){uintnum;set_lcd_pos(p);for(num=0;num<low;num++){lcd_write_data(s[num]);delay(1);}}void HC05_Init(){Tx=1; //触发脉冲NOP();NOP();NOP();NOP();Tx=0;distance=0.17*t; //距离计算}voiddistance_convert(long intdat){cache[0]=dat/1000;cache[1]=dat/100%10;cache[2]=dat/10%10;cache[3]=dat%10;temp_dis[0]=cache[0]+'0';temp_dis[1]=cache[1]+'0';temp_dis[2]=cache[2]+'0';temp_dis[4]=cache[3]+'0';}//------------主程序-----------void main(){lcd_init();delay(5);TMOD=0x19;EA=1; //开总中断TR0=1; //启动定时器EX0=1; //开外部中断IT0=1; //设置为下降沿中断方式while(1){HC05_Init();distance_convert(distance);lcd_print(0x01,table,14);lcd_print(0x44,temp_dis,8);}}//外部中断0void int0() interrupt 0{t=(TH0*256+TL0); //计算高电平持续的时间,上升沿到来时候开始计时,下降沿到来进入外部中断,关闭计时器,停止计时TH0=0;TL0=0;}。
nano 超声波测距 例程

nano 超声波测距例程Arduino Nano可以使用超声波传感器进行测距。
下面是一个简单的测距例程:```c// 初始化HC-SR04模块pinMode(trigPin, OUTPUT); // 设置 Trig 引脚为输出模式pinmode(echoPin, INPUT); // 设置 Echo 引脚为输入模式void setup() {Serial.begin(9600); // 初始化串口通信}void loop() {// 发送超声波信号digitalWrite(trigPin, LOW);delayMicroseconds(2);digitalWrite(trigPin, HIGH);delayMicroseconds(10);digitalWrite(trigPin, LOW);// 等待反射信号int duration = pulseIn(echoPin, HIGH);// 计算距离float distance = duration * 0.034 / 2; // 0.034 为声速(m/s)// 输出距离Serial.print(distance);Serial.println(" cm");delay(200);}```在这个例程中,我们使用了Arduino Nano、HC-SR04超声波测距模块和电位器。
通过设置Trig引脚为输出模式,Echo引脚为输入模式,我们可以发送超声波信号,并等待反射信号。
通过计算信号往返的时间,我们可以得到目标物体与传感器之间的距离。
最后,我们将距离通过串口输出。
你可以根据自己的需求修改代码中的参数和函数,以满足不同的测距需求。
在实际应用中,你还需要考虑传感器的安装、信号干扰等问题,以确保测距的准确性。
KS103超声波测距模块说明书

损坏电路。超过 3 秒钟的电路反接将可能导致不可恢复的损坏。
具体连线如下图所示(20 个):
VCC VCC
R1
R2
4.7K
4.7K
VCC SDA SCL GND
2
修改 I C 地址时序:
地 址
2 0x9a
延时 1ms
地 址
2 0x92
延时 地 1ms 址
2
0x9e
延时 1ms
地 2 新地
址
址
延时 100ms
修改 I2C 地址须严格按照时序来进行,时序中的延时时间为最小时间。对于 51 单片机主机,
其可调用附件 3 所示的 change_i2c_address(addr_old,addr_new)函数来实现。
制指令唤醒。
1
在 KS101B/KS103/KS103S 上连线引脚上标识有:VCC、SDA/TX(简称 SDA)、SCL/RX(简 称 SCL)、GND 及 MODE。MODE 引脚为 I2C 模式与 TTL 串口模式设置引脚,该引脚悬空时, KS101B/KS103/KS103S 工 作 于 I2C 模 式 ; 在 上 电 之 前 MODE 引 脚 接 0V 地 时 , KS101B/KS103/KS103S 工作于 TTL 串口模式。此处的 TTL 串口不是 232 串口,TTL 电平可以 与单片机的 TXD/RXD 直接相连,但不能与 232 串口直接相连(直接连将烧坏本模块),需要一个 MAX232 电平转换将 TTL 电平转换为 232 电平才可以。
HC-SR04超声波测距模块介绍

HC-SR04超声波测距模块介绍超声波简介超声波是由机械振动产生的, 可在不同介质中以不同的速度传播, 具有定向性好、能量集中、传输过程中衰减较小、反射能力较强等优点。
超声波传感器可广泛应用于非接触式检测方法,它不受光线、被测物颜色等影响, 对恶劣的工作环境具有一定的适应能力, 因此在水文液位测量、车辆自动导航、物体识别等领域有着广泛的应用。
超声波测距原理超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波, 从而测出发射和接收回波的时间差Δt , 然后求出距离S 。
在速度v 已知的情况下,距离S 的计算,公式如下:S = vΔt/ 2在空气中,常温下超声波的传播速度是334 米/秒,但其传播速度V 易受空气中温度、湿度、压强等因素的影响,其中受温度的影响较大,如温度每升高1 ℃, 声速增加约0. 6 米/ 秒。
因此在测距精度要求很高的情况下, 应通过温度补偿的方法对传播速度加以校正。
已知现场环境温度T 时, 超声波传播速度V 的计算公式如下:V = 331. 5+0.607T这样, 只要测得超声波发射和接收回波的时间差Δt 以及现场环境温度T,就可以精确计算出发射点到障碍物之间的距离。
HC-SR04超声波测距模块简介HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。
HC-SR04超声波测距模块实物图HC-SR04超声波测距模块特点1、典型工作用电压:5V2、超小静态工作电流:小于5mA3、感应角度(R3 电阻越大,增益越高,探测角度越大):R3 电阻为392,不大于15 度R3 电阻为472, 不大于30 度4、探测距离(R3 电阻可调节增益,即调节探测距离):R3 电阻为392 2cm-450cmR3 电阻为472 2cm-700cm5、高精度:可达0.3cm6、盲区(2cm)超近HC-SR04超声波测距模块管脚VCC(5V)、 Trig(控制端)、 Echo(接收端)、地(GND)使用方法:控制口发一个10US 以上的高电平,就可以在接收口等待高电平输出。
HC-SR04超声波测距模块及程序(坤)

char Del20us=0;//延时变量,在超声波脉冲引脚中产生 20us 的方波 char RxBack=1;//超声波返回标志位
TMOD=0x01;//定时器工作方式 1:16 位,初值不能重装
Tx=0;//将超声波脉冲引脚电位拉低 Th0=0;//初始化变量值 Tl0=0;//初始化变量值 TimeUp=0;//初始化
程序:
#include<reg52.h>
#define uint unsigned int #define uchar unsigned char
sbit Tx=P3^2;//产生脉冲引脚,延时 20us sbit Rx=P3^3;//回波引脚,进入外部中断 1。这些引脚可随意改ቤተ መጻሕፍቲ ባይዱ。
bit TimeUp=0;//定时器溢出标志位 long Th0,Tl0; unsigned long time0=0; uint Measureresult=0;
函数中调用了单片机的定时器所以单片机的一个定时器资源已经被占用但是没有使用外部中断而是软件查询引脚电平的方式判断回波信号目的是方便于再接入几个超声波模块因为单片机的外部中断资源有限
超声波模块 HC-SR04 简介以及编程
说明:我编写了一个超声波测距模块(HC-SR04)的程序,主 要把测距的程序写成函数形式,函数的返回值为所测的距离(为十进 制数),单位为毫米(mm)。便于大家嵌入自己开发的主程序中,方 便随时调用。函数中调用了单片机的定时器,所以单片机的一个定时 器资源已经被占用,但是没有使用外部中断,而是软件查询引脚电平 的方式判断回波信号,目的是方便于再接入几个超声波模块,因为单 片机的外部中断资源有限。
效果:可在 3CM-90CM 范围内测量,但是远距离误差较大 (1cm-2cm),但近距离误差较小。可以根据不同的模块作简单的修 正。
超声波测距程序_代码全

/*----------------------------------超声波子程序1、采用定时器0产生40KHZ的方波,同时也进行时间计数,等待中断;2、若超过30ms后,重新发送方波,重新计数,直到有中断(接收到返回信号)再做显示或其它处理。
3、在处理之后又后重新初始化定器0和中断0,又执行第一步------------------------------------*/#include <reg52.h>//1602已定义了#include "1602.h"#include "delay.h"#include <stdio.h>//包含sprintf函数sbitpwm=P3^7;//40KHZsbit led=P1^3;//接收到后亮灯unsigned intnum=0;//计数float s; //测出的距离bit flag=0;//中断0标志位unsigned char out_time=0;//超时标志位/*---------------------------------------定时器0用于产生40KHZ频率初始化---------------------------------------*/void T0_init(){TMOD=0X02; //定时器0工作在方式2,自动重装数据TL0=256-12; //产生40KHZTH0=256-12; //T=1/40k*1000000=25us即12.5us取反一次EA=1;ET0=1;TR0=1;}/*--------------------------------定时器0中断服务程序//用于工作计时、同时产生40KHZ方波---------------------------------*/void T0_time() interrupt 1{num++;if(num<30) pwm=~pwm;//产生15个40KHZ的方波if(num==2500) {num=0;out_time++;}//30ms后清除标志,同时}/*-----------------------------外部中断0初始化------------------------------*/void INT0_init(){IT0=1;//低电平触发方式EX0=1;//打开外部中断// PX0=1;//外部中断0为高优先级}/*-----------------------------外部中断0中断服务程序------------------------------*/void INT0_d() interrupt 0{EX0=0; //当中断了,证明接收到信号,关闭外断中断TR0=0; //关闭定时器0flag=1; //标志外部中断0产生}/*-------------------------------超声波测距函数//s的值为返回测距值--------------------------------*/void measure(){if(flag==1) //中断0标志,进入{flag=0; //清除标志位out_time=0; //清除超时标志位led=~led; //观察DelayMs(100); //延时,**适用STC12C5A60S2,低速单片机,要减少延时**s=(num*12)/2*0.34*0.001;//测距返回值TH0=256-12; //定时器0重新初始化TL0=256-12;TR0=1; //运行定时器0INT0_init(); //启动外部中断0}}/*-------------------------------超声波显示部分--------------------------------*/void display(){char displaytemp[16];//定义显示区域临时存储数组if(out_time==33) //大约1s的超时时间,再将显示为0.000{out_time=0; //清除标志位s=0; //显示0}sprintf(displaytemp,"distance:% 6.3f",s);//将数字转成字符串LCD_Write_String(0,1,displaytemp);//显示}//*********************主程序***********************//void main(){LCD_Init(); //1602初始化LCD_Clear(); //清屏T0_init(); //定时器0初始化INT0_init(); //启动外部中断0while(1){measure(); //超声波测距函数display(); //显示}}附链接文件程序:/* 1602.c *//*-----------------------------------------------名称:LCD1602引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>#include "1602.h"#include "delay.h"sbit RS = P2^6; //定义端口sbit RW = P2^5;sbit EN = P2^7;#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------判忙函数------------------------------------------------*/ bitLCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort& 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ voidLCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ voidLCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/voidLCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*//* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}*//*------------------------------------------------初始化函数------------------------------------------------*/voidLCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/* 1602.h *//*-----------------------------------------------名称:LCD1602.h引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK ------------------------------------------------*/#ifndef __1602_H__#define __1602_H__bitLCD_Check_Busy(void) ;voidLCD_Write_Com(unsigned char com) ;voidLCD_Write_Data(unsigned char Data) ;voidLCD_Clear(void) ;voidLCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ; voidLCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ; voidLCD_Init(void) ;#endif/* delay.c*/#include "delay.h"/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/* delay.h*/#ifndef __DELAY_H__#define __DELAY_H__/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned int t);/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/voidDelayMs(unsigned int t);#endif。
超声波测距程序流程

超声波测距程序流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 初始化初始化超声波传感器,设置相关参数,如触发引脚、接收引脚等。
超声波测距程序

超声波测距仪源程序代码:#include <AT89X51.H>#include <intrins.h>#include <STDIO.H>#include <absacc.h>#define uchar unsigned char#define uint unsigned int#define L_W_D XBYTE[0X9Fff]#define L_W_C XBYTE[0X1Fff]#define L_R_C XBYTE[0X5Fff]sbit RX=P1^2 ;sbit TX=P1^3;sbit beep=P1^0;sbit en=P3^2;sbit d=P1^7;char table[]="cmX";char name[]="ZhangFengJun";unsigned char flag1=1;unsigned int time=0;unsigned int timer=0;float S=0;bit flag =0;void wait();/***********************1602写命令程序******************************************************/void send_command(uint command){wait();L_W_C=command;}/***************************1602********************************* *************/void delay(){uint i,j;for(i=0;i<50;i++)for(j=0;j<50;j++);}/**************************读忙程序**************************************************/void wait(){uchar x;do{x=L_R_C;}while(x&0x80);delay();}/*************************1602写数据程序*****************************************************/void send_data(uint sdata){wait();L_W_D=sdata;}/********************************************************/void Conut(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.87)/100; //算出来是CMif(flag==1) //超出测量{beep=!beep;delay();delay();delay();delay();delay();beep=!beep;}}/********************************************************/void delayms(unsigned int ms){unsigned char i=100,j;for(;ms;ms--){while(--i){j=10;while(--j);}}}/********************************************************/void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{flag=1; //中断溢出标志}/********************************************************/ void StartModule() //T1中断用来扫描数码管和计800MS启动模块{TX=1; //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 key(){en=1;if(en==0){flag1=0;send_command(0x01);while(!en);}}/********************************************************/ void main(void){uchar OUT_PUT,i;flag=0;TMOD=0x21; //设T0为方式1,GATE=1;SCON=0x50;TH1=0xFD;TL1=0xFD;TH0=0;TL0=0;TR0=1;ET0=1; //允许T0中断TR1=1; //开启定时器TI=1;EA=1; //开启总中断send_command(0x38);send_command(0x0c);send_command(0x06);send_command(0x01);for(i=0;i<12;i++){send_command(0x80+i);send_data(name[i]);}while(1){key();if(flag1==0){StartModule();while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数Conut(); //计算delayms(100); //100MSif(flag==0){OUT_PUT=S;send_command(0x82);send_data(OUT_PUT/100+0x30);send_command(0x83);send_data((OUT_PUT%100)/10+0x30);send_command(0x84);send_data(OUT_PUT%10+0x30);send_command(0x85);send_data(table[0]);send_command(0x86);send_data(table[1]);}else if(flag==1){send_command(0x82);send_data(table[2]);send_command(0x83);send_data(table[2]);send_command(0x84);send_data(table[2]);}flag=0;}}}。
超声波测距模块说明

最近做超声波测距,就是简单的测量引脚高电平的时间。
思路是这样的1.使用8MHZ时钟,不分频初始化Timerx_Init(235,1);//8Mhz的计数频率,计数到235为1cm距离2. PA0高电平时,打开定时器,测量时间while(PAin(0)){TIM3->CR1|=0x01; //使能定时器3}TIM3->CR1|=0x00; //关闭定时器3S=temp/2 //测量距离为总路程一半temp=0;//计数值清零3.计数到235时,产生中断,进入中断函数。
执行temp++操作void TIM3_IRQHandler(void){if(TIM3->SR&0X0001)//溢出中断{temp++;}TIM3->SR&=~(1<<0);//清除中断标志位}4.得出距离值S初学定时器,这样测距思路对吗实际测试后,S值一直为0,为什么超声波测距模块说明1.模块引脚从左到右(见图)模块引脚分别为:VCC、trig(控制端)、echo(接收端)、out(空脚)、GND2.主要技术参数:1:使用电压:DC5V2:静态电流:小于2mA3:电平输出:高电平VCC-0.2V 低<0.2V4:感应角度:不大于15 度5:探测距离:0.02m-5m6:探测精度:3mm(既然探测精度精确到毫米,就是说数据可以显示到毫米级,也就是四位数了!)板上接线方式:VCC、trig(控制端)、echo(接收端)、out(空脚)、GND。
OUT 脚为防盗模块时的开关量输出脚,测距模块不用此脚!3.使用方法:(1)采用IO 触发测距,给TRIG 至少10us 的高电平信号(实际上25us 最佳);此处通过IO口给一个高电平就行了。
(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回;(3)有信号通过ECHO 返回,ECHO 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.此处用定时器定时看看到底多长时间!这里要检测高电平信号,本产品使用方法简单,用单片机IO 口控制TRIG 发一个10us以上(25us最佳)的高电平,就可以在接收口(ECHO)等待高电平输出.当ECHO 从低变到高就可以开定时器计时,当ECHO 变为低电平时就可以读定时器的值,此时就为此次测距的时间,据公式:测试距离=(高电平时间*声速(340m/s))/2,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了!在程序编写上应该注意的问题:第一个问题:基于SPI通信方式的一片74CH595驱动的四个数码管的显示的实现。
数模模块做超声波测距

数模模块可以用来进行超声波测距。
使用数模转换器(DAC)和HC-SR04超声波测距模块,可以构建一个非接触式的距离测量系统。
以下是实现该功能的主要步骤:
1. 硬件连接:将HC-SR04模块的Vcc接至5V电源,Trig接口连至单片机的IO口,Echo 接口也连至单片机的另一个IO口。
这样设置可以让单片机通过Trig接口发送触发信号,然后从Echo接口接收回波信号。
2. 软件编程:编写程序来控制单片机,使其能够通过Trig接口发送至少10微秒的高电平信号以触发HC-SR04模块开始测距。
模块会自动发送8个40kHz的方波并等待回波。
一旦检测到回波,Echo接口会输出一个高电平信号,其持续时间与声波往返时间成正比。
通过这个时间差,结合声速(340m/s),就可以计算出物体与模块之间的距离。
3. 数据处理:在单片机中处理Echo接口收到的时间数据,将其转换为距离值。
这通常涉及到一些简单的数学运算,如乘法和除法。
此外,还可以将计算得到的距离值通过OLED屏幕或其他显示设备展示出来,便于用户读取和分析。
总的来说,数模模块结合HC-SR04超声波测距模块和适当的编程,可以实现精确的非接触式距离测量。
这种技术广泛应用于机器人避障、汽车倒车雷达、工业自动化等领域。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <intrins.h>
#define RX P0_1
#defineTX P0_2
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
TH0=0;
TL0=0;
TH1=0xf8;//2MS定时
TL1=0x30;
ET0=1; //允许T0中断
ET1=1;//允许T1中断
TR1=1;//开启定时器
EA=1;//开启总中断
while(1)
{
while(!RX);//当RX为零时等待
TR0=1;//开启计数
while(RX);//当RX为1计数并等待
bit flag =0;
unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsigned charconst positon[3]={ 0xdf,0xef,0xf7};
unsigned char disbuff[4]={ 0,0,0,0,};
/********************************************************/
void Display(void)//扫描数码管
{
if(posit==0)
{P1=(discode[disbuff[posit]])&0x7f;}
//程序QQ:517535000
//taobao店铺:
//接线:模块TRIG接P0.2 ECH0接P0.1
//数码管:共阳数码管P1接数据口,P2.5 P2.4 P2.3接选通数码管
/***********************************************************************************************************/
{
flag=1;//中断溢出标志
}
/********************************************************/
void zd3() interrupt 3//T1中断用来扫描数码管和计800MS启动模块
{
TH1=0xf8;
TL1=0x30;
Display();
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
}
/********************************************************/
void zd0() interrupt 1//T0中断用来计数器溢出,超过测距范围
发射电路
接收电路
显示程序
/***********************************************************************************************************/
//hc-sr04超声波测距模块DEMO程序
//晶振:11。0592
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是CM
if((S>=700)||flag==1) //超出测量范围显示“-”
{
flag=0;
disbuff[0]=10;//“-”
disbuff[1]=10;//“-”
disbuff[2]=10;//“-”
}
else
{
disbuff[0]=S%1000/100;
timer++;
if(timer>=400)
{
timer=0;
TX=1;//800MS启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
else
{P1=discode[disbuff[posit]];}
P2=positon[posit];
if(++posit>=3)
posit=0;
}
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
_ቤተ መጻሕፍቲ ባይዱop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
/*********************************************************/
void main( void )
{
TMOD=0x11;//设T0为方式1,GATE=1;
TR0=0;//关闭计数
Conut();//计算
}
}