便携式测距仪系统设计与实现_第1页
便携式测距仪系统设计与实现_第2页
便携式测距仪系统设计与实现_第3页
便携式测距仪系统设计与实现_第4页
便携式测距仪系统设计与实现_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

便携式测距仪系统设计与实现摘要随着技术的发展,对距离测量仪器的精度和便携性提出了越来越多的要求。虽然超声波测量系统能够在生活中精确的测量距离,但超声波测距仪因为低能耗、方便等一些特点,在日常生活里也能够经常用到。基于此,本首先通过文献法收集相关文献,制定测距超声波技术为前提的系统,以STC89C52移动超声波最后主要是以超声波测距仪的传感器,即采用STC89C52超声波芯片模块单元,通过超声波探测器信号采集,计算超声波传感器对距离的测量以及单片机的相对应,产生结果。系统设计从软件和硬件进行设计与实现,采用不同模块之间的组合,进行测试和仿真,设计了一种符合测量精度和测量范围相关规定的便携式距离测量系统。关键词:便携式测距仪;超声波测距;单片机AbstractWiththedevelopmentofscienceandtechnology,peoplehavehigherrequirementsforthemeasurementaccuracyandconvenienceofdistancemeasuringinstruments.Ultrasonicrangingsystemscanaccuratelymeasureaccuratedistancesinlife.Ultrasonicwaveshavelowenergyconsumptionandeasypropagation,sotheyarewidelyusedinlife.Underthisbackground,thistime,aportablerangefindersystembasedonultrasonicrangingtechnologywasdesigned.ThesystemmainlyusesSTC89C52singlechipasthecoreandultrasonicsensortocompletetheproductionofthisultrasonicrangefinder.TheSTC89C52ismainlyused.Thecontrolchip,thetransmittingmoduletransmitsultrasonicwaves,thereceivingmodulereceivestheultrasonicwavessentback,andusestheultrasonicsensortomeasurethedistanceandtheoperationandprocessingofthesinglechiptoobtainacorrespondingdistance,anddisplaytheresult.Thesystemsolutionofthisdesignisrealizedbythecooperationofsoftwareandhardwareandeachmodule.Finally,theportablerangefindersystemdesignedinthisdesigncanbeobtainedthroughsimulation,whichhasagoodbalancebetweenmeasurementaccuracyandmeasurementrange.Keywords:Portablerangefinder;ultrasonicranging;singlechipmicrocomputer目录TOC\o"1-3"\h\z\u246121引言 系统的仿真与调试6.2基于Proteus软件的仿真Proteus是一种功能很先进。全面的软件,可以进行模拟,特别是对于微处理器,我们使用Proteus来模拟我们的设计,从而来证明我们的设计原理和设计目的,并分析设计的有效性。首先,我们在软件中找到我们设计的元素,然后将电路图连接起来,设置不同元素的参数值,并特别考虑到屏幕连接需要牵引力的情况。在用Proteus绘制电路图后,导入程序文件(用Keil编译的HEX文件),就能够完成并执行模拟。在Proteus软件里用“激励源”里的“SINE”是超声波发射信号所使用的,具体可以看下图:图16超声波模拟发射信号设置用“虚拟仪器”里的简易示波器用作是接收正弦波然后仔细了解并观察;下面的“虚拟示波器”里面,其中蓝色的波是用作于模拟超声波发射的正弦波,然后黄色的波是用作于接收到的波。图17便携式超声波测距仪超声波测距电路仿真结果6.3电路调试首先对单片机最小系统做出进一步的检测,检测的目的是观察单片机能不能顺利地运转;就像晶体振荡器被激活或不被激活一样,重新初始化电路可以连接到对原理图中的各个模块做出进一步的检测。(1)显示电路的调试显示电路的启动主要是根据程序所写的内容和数字管显示之间的相同性。如果不相同就要把数码管的长短进行调试。第一步是要调试电路,这样做的目的是为了在之后的程序中能够更便捷。(2)发射模块调试在进行上电后,在单片机P1.0脚处将示波器进行深度检测,观察示波器能不能出现有波的现象,第二步再在超声波换能器TCT40-10F1连接处检测后,仔细观察波的具体情况;TCT40-10F1的连接一定要观察引脚的高低电平。(3)接收模块调试模块单元接收并不简单不容易,由于无法判断何时能够收到波,所以我的参数,以便张贴在数码管方案数字不是“0000”;tct40-10s1也可以说,如果接收到波,tct40-10s1的高水平脚就会变弱。想要比以前更好地发射和探测波,在此处采用了两组超声波传感器,都从P1.0中取出,并由P3.2接收。图18发射波形图19接收波形结论本次设计与研究的便携式测距仪系统是通过超声波测距技术来作为前提,使用到更便携的电子元器件和一些材料把软件和硬件进行完美的配合,在整个过程中还采用了AT89S52单片机和AT89S52单片机的外围接口,目的是用做于完成超声波测距系统,记数原理是采用了单片机的定时和单片机的计数器一起相互之间进行配合才实现的。所以在我此次设计的便携式测距仪系统的所有性能都是比较好的,又因为便携式测距仪系统比较人性化、以及便携式测距仪系统的可靠性很好,这样一来才慢慢地达到了使用方便容易的效果,在此期间还满足了可视化控制的可理解性。经过了查阅大量的文献资料和相关的书籍,广泛征求有关书目和文件方面做了一些书籍和随机检查的次数已经对一些产品市场上的便携式测距仪系统的发展情况和便携式测距仪系统所自带的一些特性。根据这次设计让我的自学和实践等方面的能力得到了很大程度的提升。参考文献[1]吴政江.单片机控制红外线防盗报警器[J].锦州师范学院学报,2015.[2]宋文绪.传感器与检测技术[M].北京:高等教育出版社,2016.[3]余锡存单片机原理及接口技术[M].西安:西安电子科技大学出版社,2015.[4]唐桃波,陈玉林.基于AT89C51的智能无线安防报警器[J].电子设计应用,2015,5(6):49~51.[5]李全利.单片机原理及接口技术[M].北京:北京航空航天大学出版社,2016.[6]薛均义张彦斌.MCS-51系列单片微型计算机及其应用[M].西安:西安交通大学出版社,2017.[7]徐爱钧,彭秀华.单片机高级语言C51应用程序设计[M].北京:北京航空航天大学出版社,2017.[8]康华光.电子技术基础(模拟部分)[M].北京:高等教育出版社,2016.[9]李戈,孟祥杰,王晓华,王重秋.国内超声波测距研究应用现状[J]2015.(04):1-2[10]阎石.数字电子技术基础[M],第四版.北京:高等教育出版社,2015.[11]PeterHauptmann,RalfLucklum,BerndHenning.UltrasonicSensorsforProcessControl.SensorsUpdate.2015,3:163-207[12]秦旭.用LM92温度传感器补偿的高精度超声波测仪.电子产品世界.2015,6:58-59[13]苏炜,龚壁建,潘.超声波测距误差分析.传感器技术.2016,23(6):8-11.[14]沙占友.集成化智能传感器原理与应用[M].北京:电子工业出版社,2014.[15]吴研.超声波倒车雷达系统设计[J].北京:北京理工大学,2015.[16]肖景和,赵健.红外线热释电与超声波遥控电路[M].北京:人民邮电出版社,2013.[17]史谚宾.基于AT89C2051的超声波测距仪设计[J].北京:航空航天出版社,2016[18]路锦正,王建勤.超声波测距仪的设计[M].成都:成都理工大学,2013.[19]邱关源.电路[M].北京:高等教育出版社,2014.[20]尤一鸣.单片机总线扩展技术第一版[M].北京:北京航空航天大学出版社,2013附录#include<reg52.h>#include<intrins.h>#include"eepom52.h"#defineucharunsignedchar#defineuintunsignedint//数码管段选定义012345 6 7 8 9 ucharcodesmg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //断码//数码管位选定义ucharcodesmg_we[]={0xe0,0xd0,0xb0,0x70};uchardis_smg[8]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};sbitsmg_we1=P3^4; //数码管位选定义sbitsmg_we2=P3^5;sbitsmg_we3=P3^6;sbitsmg_we4=P3^7;sbitc_send=P3^2; //超声波发射sbitc_recive=P3^3; //超声波接收ucharflag_hc_value;//超声波中间变量sbitbeep=P2^3;//蜂鸣器IO口定义bitflag_key_b_en,flag_key_set_en;//按键蜂鸣器使能ucharsmg_i=3;//显示数码管的个位数bitflag_300ms;bitkey_500ms;longdistance; //距离uintset_d; //距离bitflag_csb_juli;//超声波超出量程uintflag_time0;//用来保存定时器0的时候的//按键的IO变量的定义ucharkey_can; //按键值的变量ucharzd_break_en,zd_break_value;//自动退出设置界面ucharmenu_shudu=10;//用来控制连加的速度bitflag_lj_en; //按键连加使能bitflag_lj_3_en; //按键连3次连加后使能加的数就越大了ucharkey_time,flag_value;//用做连加的中间变量ucharmenu_1;//菜单设计的变量uchara_a;/***********************1ms延时函数*****************************/voiddelay_1ms(uintq){ uinti,j; for(i=0;i<q;i++) for(j=0;j<120;j++);}/***********************处理距离函数****************************/voidsmg_display(){ dis_smg[0]=smg_du[distance%10]; dis_smg[1]=smg_du[distance/10%10]; dis_smg[2]=smg_du[distance/100%10]&0x7f; }/******************把数据保存到单片机内部eepom中******************/voidwrite_eepom(){ SectorErase(0x2000); byte_write(0x2000,set_d%256); byte_write(0x2001,set_d/256); byte_write(0x2058,a_a); }/******************把数据从单片机内部eepom中读出来*****************/voidread_eepom(){ set_d=byte_read(0x2001); set_d<<=8; set_d|=byte_read(0x2000); a_a=byte_read(0x2058);}/**************开机自检eepom初始化*****************/voidinit_eepom(){ read_eepom(); //先读 if(a_a!=1) //新的单片机初始单片机内问EEPOM { set_d=100; a_a=1; write_eepom(); } }/****************独立按键处理函数********************/voidkey(){ staticucharkey_new=0,key_old=0,key_value=0; if(key_new==0) { //按键松开的时候做松手检测 if((P2&0x07)==0x07) key_value++; else key_value=0; if(key_value>=5) { key_value=0; key_new=1; flag_lj_en=0; //关闭连加使能 flag_lj_3_en=0; //关闭3秒后使能 flag_value=0; //清零 key_time=0; write_eepom(); } } else { if((P2&0x07)!=0x07) key_value++;//按键按下的时候 else key_value=0; if(key_value>=5) { key_value=0; key_new=0; flag_lj_en=1; //连加使能 zd_break_en=1;//自动退出设置界使能 zd_break_value=0;//自动退出设置界变量清零 flag_key_b_en=1;//按键蜂鸣器使能 } } key_can=20; if(key_500ms==1) //连加 { key_500ms=0; key_new=0; key_old=1; zd_break_value=0; } if((key_new==0)&&(key_old==1)) { switch(P2&0x07) { case0x06:key_can=3;break; //得到k2键值 case0x05:key_can=2;break; //得到k3键值 case0x03:key_can=1;break; //得到k4键值 }// dis_smg[3]=smg_du[key_can%10]; } key_old=key_new; }voidsmg_we_switch(uchari){ switch(i) { case0:smg_we1=0;smg_we2=1;smg_we3=1;smg_we4=1;break; case1:smg_we1=1;smg_we2=0;smg_we3=1;smg_we4=1;break; case2:smg_we1=1;smg_we2=1;smg_we3=0;smg_we4=1;break; case3:smg_we1=1;smg_we2=1;smg_we3=1;smg_we4=0;break; } }/***********************数码显示函数*****************************/voiddisplay(){ staticuchari; i++; if(i>=smg_i) i=0; // P1=0xff; //段选 // P3=0xf0|(P3&0x0f);//位选// P3=smg_we[i]|(P3&0x0f);//位选 smg_we_switch(i); P1=dis_smg[i]; //段选 }voiddelay(){ _nop_(); //执行一条_nop_()指令就是1us _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();}/*********************超声波测距程序*****************************/voidsend_wave(){ c_send=1; //10us的高电平触发 delay(); c_send=0; TH0=0; //给定时器0清零 TL0=0; TR0=0; //关定时器0定时 flag_hc_value=0; while(!c_recive); //当c_recive为零时等待 TR0=1; while(c_recive) //当c_recive为1计数并等待 { flag_time0=TH0*256+TL0; if((flag_hc_value>1)||(flag_time0>65000))//当超声波超过测量范围时,显示3个888 { TR0=0; flag_csb_juli=2; distance=888; flag_hc_value=0; break; } else { flag_csb_juli=1; } } if(flag_csb_juli==1) { TR0=0; //关定时器0定时 distance=TH0; //读出定时器0的时间 distance=distance*256+TL0; distance+=(flag_hc_value*65536);//算出超声波测距的时间 得到单位是ms distance*=0.017;//0.017=340M/2=170M=0.017M算出来是米 if(distance>350) //距离=速度*时间 { distance=888; //如果大于3.8m就超出超声波的量程 } }}/*********************定时器0、定时器1初始化******************/voidtime_init() { EA=1; //开总中断 TMOD=0X11; //定时器0、定时器1工作方式1 ET0=1; //开定时器0中断 TR0=1; //允许定时器0定时 ET1=1; //开定时器1中断 TR1=1; //允许定时器1定时 }/****************按键处理数码管显示函数***************/voidkey_with(){ if(key_can==1) { menu_1++; if(menu_1>=2) { menu_1=0; } if(menu_1==0) { menu_shudu=20; dis_smg[0]=smg_du[distance%10]; dis_smg[1]=smg_du[distance/10%10]; dis_smg[2]=smg_du[distance/100%10]&0x7f; smg_i=3; } if(menu_1==1) { menu_shudu=1; dis_smg[0]=smg_du[set_d%10]; dis_smg[1]=smg_du[set_d/10%10]; dis_smg[2]=smg_du[set_d/100%10]&0x7f; dis_smg[3]=0x88; smg_i=4; } } if(menu_1==1) //设置高温报警 { if(flag_lj_3_en==0)//三次连加加快 menu_shudu=10;//500ms加减一次 else menu_shudu=1;//250ms加减一次 if(key_can==2) { set_d++; //按键按下未松开自动加三次 if(set_d>350) set_d=350; dis_smg[0]=smg_du[set_d%10]; //取小数显示 dis_smg[1]=smg_du[set_d/10%10];//取个位显示 dis_smg[2]=smg_du[set_d/100%10]&0x7f;//取十位显示 dis_smg[3]=0x88; //a } if(key_can==3) { set_d--; //按键按下未松开自动加三次 if(set_d<=1) set_d=1; dis_smg[0]=smg_du[set_d%10]; //取小数显示 dis_smg[1]=smg_du[set_d/10%10];//取个位显示 dis_smg[2]=smg_du[set_d/100%10]&0x7f;//取十位显示 dis_smg[3]=0x88; }// write_eepom(); } }/****************报警函数***************/voidclock_h_l(){ staticucharvalue; if(distance<=set_d) { value++;//消除实际距离干扰 if(value>=5) { beep=~beep; //蜂鸣器报警 } } else { value=0; beep=1; //取消报警 } }/****************按键按下蜂鸣器响下**********************/ voidkey_beep(){ staticuintvalue; if((flag_key_b_en==1)&&(flag_key_set_en==1)) { beep=0;//打开蜂鸣器 value++; if(value>800) { value=0; flag_key_b_en=0; beep=1;//关闭蜂鸣器 } } }voidmain(){ send_wave(); //测距离函数 smg_display(); //处理距离显示函数 time_init(); init_eepom();//读eepom数据 while(1) { if(flag_300ms==1) { flag_300ms=0; clock_h_l();//报警函数 send_wave(); //测距离函数 if(menu_1==0) sm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论