超声波测距模块+程序
- 格式:doc
- 大小:106.50 KB
- 文档页数:5
51入门系列教程超声波测距模块编程Revision0.01(2011-10-18)刚好这次做机器人用到了超声波,才开始看它的工作原理,感觉还很简单,但是调试到最后,发现了很多问题,该碰到的都碰到了,趁着写单片机入门教程的机会,写出来分享给大家。
先把超声波的工作原理贴出来:从超声波的工作原理可以知道,其实只要单片机的两个引脚就足够,一个引脚接发送端,一个引脚接接收端即可。
工作时,发送端引脚置高电平10us时间的脉冲,这将激发超声波模块发送8个40khz周期的电平信号,然后模块的收端开始检测回波(实际上,两个眼睛,一个是发送的,一个是用来接收的)。
一旦发现有回波信号,就会输出一个响应给接收端引脚,这个响应是一个高电平脉冲。
所以,我们只要在接收端去检测是否有高电平脉冲即可。
但从程序编写与调试的过程来看,并没有那么简单。
因为超声波第一次发送40KHZ的信号出去后反射回来,有可能又被反弹回去,这样以来,相当于超声波在两个障碍物之间不断地来回反弹,导致接收端不断地收到”回波信号“——实际上第一次反弹回来的才是回波信号,其他的都是二次、三次...的反弹回波信号。
如果每次检测到回波就让蜂鸣器响一次,那么,我们程序运行时,可能会听到蜂鸣器不断地响,可能就是这个原因。
另外,需要关注的是,超声波如果前面没有障碍物,也会在接收端引脚上故意输出140us的电平,以”防止发射信号对回响信号的影响“。
从上面的分析看来,不管超声波前面有无障碍物,接收端引脚肯定都会出现高电平脉冲。
所以我们在编程时,必须过滤掉这140us。
讲完超声波的工作原理,我们来看下编写程序的思路。
由于超声波可能会连续收到回响信号,导致接收端不断出现高电平脉冲,而实际上,我们有用的仅仅是第一次反射回来的回响信号,因此,使用”查询接收端引脚是否出现高电平“的方法行不通。
可以使用外部中断,只检测第一次反射回来的信号,后续的反射信号全部丢弃不管。
下面看下140us的处理。
/*{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单片机超声波测距主要部分程序测试环境: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 超声波发射电路。
#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();//如果没有松开,扫描数码管,显示发波个数}//循环尾}//按键处理结束,按键已松开}//主循环结束}//主程序结束。
#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 超声波测距例程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引脚为输入模式,我们可以发送超声波信号,并等待反射信号。
通过计算信号往返的时间,我们可以得到目标物体与传感器之间的距离。
最后,我们将距离通过串口输出。
你可以根据自己的需求修改代码中的参数和函数,以满足不同的测距需求。
在实际应用中,你还需要考虑传感器的安装、信号干扰等问题,以确保测距的准确性。
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 以上的高电平,就可以在接收口等待高电平输出。