基于51单片机的超声波避障小车设计-毕业论文_第1页
基于51单片机的超声波避障小车设计-毕业论文_第2页
基于51单片机的超声波避障小车设计-毕业论文_第3页
基于51单片机的超声波避障小车设计-毕业论文_第4页
基于51单片机的超声波避障小车设计-毕业论文_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

内蒙古科技大学本科生毕业设计说明书(毕业论文)题目:基于单片机的超声波避障小车设计学生姓名:祝伟泰学号:1267112115专业:测控技术与仪器班级:测控2012-1指导教师:燕芳副教授内蒙古科技大学毕业设计说明书(毕业论文)大于给定的40cm时,单片机退出报警中断执行主函数的程序,此时小车将正常行驶。总体方案框图如图2.1所示。图2.1系统的总体方案框图2.1.1具体设计思路本设计采用两驱车模,实质上小车有三个车轮,第三个车轮为活动轮,活动轮不参与小车驱动只作从动和支撑作用。以单片机STC15为控制芯片,借用超声波模块进行测距,光电码盘模块进行速度测量,蜂鸣器进行报警预告,PWM软件控制系统进行调速,LCD1602进行显示。具体实现过程:硬件方面小车的主板最终选用的是洞洞板焊接,当然小车的PCB板也有绘制,只是最终选型选择的是洞洞板,洞洞板的连线是根据小车的原理图连接的[12]。主板包括几个部分:第一部分就是供电部分,因为要驱动两个5V的电机,需要一个供电路,同时加入稳压电路以保证电压的稳定。第二部分是小车的驱动电路,驱动电路是自行绘制并焊接的电路板。第三部分超声波电路和测速电路,因为用的是现成的模块,所以焊接电路的时候只需要用排针把单片机的IO口引出来即可。第四部分是显示电路,这部分的电路在LCD模块中会详细的介绍。软件方面也就是程序部分,软件的思路也分为两个部分:第一部分就是小车的主程序,主程序的中包含了定时器程序、超声波采集程序、显示程序。第二部分就是中断程序:中断程序中含有调速程序,报警程序,这样的设计思路方便了程序的编写。总的来说在写程序的时候只需要考虑两个方面,第一方面就是小车在正常情况下能按照给定的速度运行和实现显示。第二方面就是小车在触发中断后立即执行中断程序,中断程序中包含小车调速程序和报警程序。中断是一个较为复杂的程序,中断程序要涉及到中断标志和中断优先级问题[13]。2.2系统各模块的设计方案2.2.1控制核心模块的选择方案论证方案一:选用普通的51系列单片机,该系列的单片机是有51单片机公司最早推出的,这一型号的单片机网上有很多的历程可以用,因此用起来比较容易上手。其中P0可作为地址和数据的三态双向口,P1是多功能的复用接口,P2可作为地址总线的输出P3口的第一功能跟P1口相似,第二功能可作为特殊功能的输入输出线线[14]。方案二:选用增强型51系列单片机,它比普通的51单片机多了一些外设,功能上更加丰富强大了,增大了ROM和RAM,运算速度是普通的51单片机的8-10倍,I/O口的驱动能力大概是20mA,8051系列的在10mA左右,增强型51系列单片机与嵌入式芯片如AVR、ARM等很像,但其内部框架依旧是8051。方案三:选用15系列单片机,该系类的单片机是STC最新推出的单片机,除了增大了ROM和RAM外。芯片的封装也改为贴片式占用的面积小,除此之外15最大的优势在于在他内部装有可配置的时钟电路所以外接晶振[15]。起初在选择方案的时候就是本着简单易懂的心态去选的,所以首选的是方案一,考虑到程序的占用的内存问题于是选择了增强型的51.但是通过学习和绘制电路板之后渐渐的发现用最新的15单片机的优势所在,而且15单片机的历程从没有接触过,这是一次挺好的挑战机会,于是最终选定的方案是方案三。除此之外15不用外加晶振而且其的封装采用的是贴片式极大的节省了电路板的面积,普通的51单片机用的功能15都已经具备,32个IO口的15单片机也足以满足本次课设对单片机管脚的需求,加之15拥有与PWM波形相关的特殊功能寄存器[16],为此最终选定了STC15单片机作为本次课题的核心控制器。2.2.2主电路板的方案论证目前电路图的制作方式主要有两种:第一种是绘制电路原理图然后根据电路原理图制作绘制PCB板,第二种就根据相关的电路知识在洞洞板上自行搭建电路图,电路中的线路一般是用焊锡焊接出来的。方案一:PCB电路板,在制作PCB板之前首先要绘制电路原理图,需要用的软件是AltiumDesigner10简称AD10.AltiumDesigner10.作为新一代的板卡级设计软件,以WindowXP的界面风格为主,同时,Altium公司独一无二的DXP技术集成平台也为设计系统提供了所有工具和编辑器的相容环境[17]。AD10操作起来十分的简单,但是需要有一定的英文基础,绘制电路图主要分为两个部分,第一部分是电路的原理图,第二部分是PCB图,电路原理图可以生成未布线的PCB电路图,经过布线处理之后就是完整的PCB电路图了。用AD绘制电路图的优点在于软件自带检测功能,可以检查电路中的错误。方案二:自行搭建洞洞板;洞洞板顾名思义就是有很多个小洞组成的板子,这种板子一般有塑料制成,在每个小洞的的周围镀上焊盘。使用的时候将器件插上,用焊锡焊接固定即可,至于需要用线连接的器件可以用焊锡将两个器件间的一列焊盘连接在一起。洞洞板的搭建的优点在于,比较灵活,需要增加硬件可以自行拓展电路,其缺点在于相对PCB板的焊接较为复杂[18]。综合了两个方案的优缺点之后,在主板的制作上最终采用了洞洞板的,但是前期的调试采用的是PCB电路板。PCB电路板如图2.2图2.2主板PCB图2.2.3测距避障传感器的方案论证测距传感器是本次课题的核心传感器,测距传感器的选用关乎到小车的实际避障和测距情况,因此测距传感器的选型至关重要。目前测距传感器种类繁多,其中应用最广泛的莫过于声光测距传感器。常见的声光测距传感器有、超声波传感器、雷达测距、激光测距传感器、光电管、CCD图像传感器、光钎传感器和光栅传感器[19]。通过查阅相关资论文中给出两种种测距方案进行论述。方案一:超声波测距,超声波测距的原理是利用声反射的原理通过声速传播的时间来计算距离。需要注意的是超声波传感器不能直接测量距离,只能测量超声波传播的时间,距离可以根据声速传播的公式进行计算。声波抗高压能力强,不易受到可见光,外界温度的干扰,但是超声波检测存在盲区,其检测盲区为小于2CM[20]。方案二:红外对管,红外对管是一种十分常用的传感器其集发射与接收于一体的光电传感器[21],检测范围:3-80CM。因其安装方便,价格低廉,操作简单被应用于各行各业。红外对管的主要用了测距测温,测距的原理也很简单,就是利用光反射的原理,这个跟超声波测距很相似。因为光具有穿透性,因此红外对管不能用来检测透明物体,这也是其检测的局限性。通过分析和具体的实践最终选定方案一的超声波传感器为测距传感器,选用的原因如下。(1)超声波传的抗干扰能力比红外对管的强,小车在行驶过程中易受到可见光的干扰,降低了传感器的精度。红外对管属于光电传感器,其在检测自身发出的红外线时易受外界光线的影响。(2)红外对管在检测障碍物的时候具有局限性,因为光线具有一定的穿透性,当前方的障碍物为可穿透的物体时,红外线是无法检测出的,这给小车的自动避障带来了局限性[22]。综合上面分析的原因,最终选定了超声波传感器为智能避障小车的测距传感器。2.2.4测速模块的选择方案论证测速模块选用的的是光电编码测速器,又称光电码盘。其因具有测量精度高,价格便宜,抗干扰能力强,可靠性高的特点而被广泛的使用。目前常用的光电编码测速器主要有两种类型,一种是透光型光电编码测速器,一种是反光型编码测速器。根据编码器的型号本文给出了两种方案,并分析论述得出最终的方案。方案一:透光式光电编码器,透光式光电编码器有两个部分组成第一部分是一个带有光栅的圆盘,在使用时这个圆盘被安装在直流电机的转轴上。第二部分是由光电二极管和光敏原件组成测量模块。透光式的测量原理是基于光是沿直线传播的原理,当光栅和光电二极管处于同一直线上时光线穿过光栅[21],此时光敏原件检测到发光源,则此时发出高电平,反之则为地低电平。当圆盘旋转一周时记下此时发出的高电平数,在通过圆盘的周长就可以算出小车的转速。例如:圆形旋转物体半径为R,码线数为M,单位时间内(1s)扫过N个码线,则该旋转体的速度为V=M/N*π*2R。方案二:反射式光电编码测速器,反射式光电编码器也是有两部分组成,第一部分也是一个圆盘,但是这个圆盘是一个能反射光线的圆盘,圆盘上均匀的分布着反光面,当圆盘旋转到合适的位置后就能反射由光电二极管发出的光线,光电管将感受的光变化转换为电信号变化,第二部分则是将反光材料粘贴于被测轴的测量部位上构成反射面。常用的反射材料为专用测速反射纸带(胶带),也可用铝箔等反光材料代替,有时还可以在被测部位涂以白漆作为反射面。投光器与反射面需适当配置,通常两者之间距离为5-15M。当被测轴旋转时,光电元件接受脉动光照,并输出相应的电信号送人电子计数器,从而测量出被测轴的转速[22]。通过具体的对分析以及结合小车车模的实际情况做种选定方案一,得出方案一的原因如下:小车的车模空间有限,在安装了圆盘后已经没有合适的位置安装反射式光电编码器的反射纸带。相反透光式的光电编码器需要的空间相对较小,不需要在车模上安装其他的硬件。透光式编码器虽然易容机械震动的干扰,但是圆盘式安装在直流电机的转轴上的,几乎不会产生太过剧烈的震动,因此这对于透光式编码器不会产生干扰。2.2.5电机驱动选择方案论证智能车常用驱动有两种:L298N和L293D。两者均为的电机为5V直流电机的常用驱动模块。方案一:L298N是专用驱动集成电路,属于H桥集成电路,与L293D的差别是起输出电流增大,功率增强。其输出电流为2A,最高电流4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,步进电机,线圈等感性负载[23],特别是其输入端可以与单片机直接相连,从而很方便地受单片机控制。驱动直流电机时是通过控制IN1--IN4四个输入端的高低电平,只要有电平差就会驱动电机旋转。方案二:L293D支持两路直流电机或一路步进电机的驱动,最高工作电压25V,最大驱动电流1.2A。工作时控制引脚与核心控制芯片的IO口相连。其驱动直流电动机的方式与L298N相同。在综合考虑后期的调试中可能要加入电机的正反转或者,紧急停车系统,为此选用性能更加稳定,但是价格相对贵的L298N驱动模块。2.2.6显示装置的选型方案论证显示装置主要是用来显示小车当前的速度值和超声波采集到的数值,字符数在6到8位左右。在电子系统领域中跟单片机配套使用的显示装置主要有LED数码管,LCD1602液晶显示屏和12864液晶显示屏。方案一:LED数码管显示,数码管一般有7段或者8段字段码,每段字段码其实就是一个发光二极管。数码管一般有两种,一种是共阴极数码,共阴极数码就是将数码管的一端接地,给高电平时数码管点亮,反之则不点亮。共阳极数码管则是将数码管的一端与电源的正极相接,给低电平时数码管点亮,反之则不点亮[24]。数码管的显示方式也分为两种,一种是静态显示,一种是动态扫描。所谓的静态显示是指将数码管的一端与单片机具有锁存功能的IO口连接,当给数码管合适电平时数码管点亮,只要一直给电平数码段就会一直点亮。动态扫描相对来说比较复杂,其原理就是将数码管的位段码和字段码分别接在单片机的不同IO口上,由单片机控制位段码和字段码的显示。由于单片机的扫描频率很高,人眼是无法识别数码管在扫描过程中的字符变换的,因此在人眼的观察下数码管是无变化的。图2.3LED原理图方案二:LCD1602显示,顾名思义1602的意思就是16*2也就是说LCD1602能显示16*2个字符。在1602的字符寄存器中含有192个字符,除了平假名外其他的均是常用的字符。用户在使用字符时只需要调出相应的字符代码便可让其显示,操作是十分方便的。通过对比分析LCD1602方案较为合适,原因如下:LED数码管显示一个字符需要一位数码管,而要显示速度和距离至少需要8位的数码管,加之如果要在前后分别加上被测量的公式符号和单位则需要至少16位的数码管,这种显示太繁琐了[25]。选用LCD1602在安装时只需要在洞洞板上焊接上排母,再将LCD插入排母内即可,而LED需要焊接在板子上,需要的占用空间大,焊接繁琐。从视觉角度分析,LCD相对美观,显示也方便。图2.21602模型图2.3本章小结本章主要论述了课题的总体思路和各个模块的选型方案,以及在选型过程中会遇到的问题。这些问题有些可以通过查阅资料解决,有些必须要通过实践才能得出结论。当遇到两个方案都适用的时候此时应该从节约成本的角度出发,尽可能的减少成本。小车核心控制器的选型以及测距传感器的选型是本次课题的关键点,其关乎着本次课题的成功与否,因此在核心控制器以及测距传感器的选型上应该做出充分的论证。第三章硬件电路设计上文主要论述了小车的设计的整体思路和各个模块的选型,关于小车的硬件电路也做了简单的介绍。小车的硬件电路并不复杂,主要包括供电电路,驱动电路和LED显示电路。下文会逐一对各个部分的硬件及电路进行详细的论述。3.1STC15单片机简介本次课题采用的STC15W4K系类单片机是STC公司生产的推出的新一代单时钟周期/机器周期(1T)的单片机。其代码完全兼容传统的51单片机,在KeilC的开发环境中,选择Intel8052编译,头文件包含<reg51.h>即可完成程序的编译[26]。除此外15单片机还具有一下特点:增强型8051CPU,1T,单时钟/机器周期,速度比普通的8051快8-12倍。不需要外部晶振和外部复位电路这是其最大的优势和特点,还可对外输出时钟和低电平复位信号。封装比传统的51小,本次课设用的15其封装为QFN32(5m*5m),将其引脚由排针引出来后也比传统单片小的多。3.1.1引脚说明本次课题用到的引脚功能及其用法如表3.1所示:引脚功能外接备注PO.0-PO.7数据总线接口与LCD的D0-D7口相接P1.6-P1.7晶振接口/普通IO口其他IO口与传统51差别不大其中3.03.1可做下载器的接口下载器可用RS232或者USB转TTL表3.1STC15部分引脚说明图3.1STC15单片机引脚图3.1.2特别管脚说明STC15系列单片机的所有I/0口上电复位后均为准双向口/弱上拉模式,但是由于P1.7和P1.6口还可以分别作外部品体或时钟电路的引脚XTAL1和XTAL2,所以P1.7/XTAL1和P1.6/XTAL2上电复位后的模式不一定就是准双向口/弱上拉模式[27]。当P1.7和P1.6口作为外部晶体或时钟电路的引脚XTAL1和XTAL2使用时,P1.7/XTAL1和P1.6/XTAL2上电复位后的模式是高阻输入.每次上电复位时,单片机对P1.7/XTAL1和P1.6/XTAL2的工作模式按如下步骤进行设置:1.首先,单片机短时间(十个时钟)内会将P1.7/XTAL1和P1.6/XTAL2设置成高阻输入[27]。2.然后,单片机会白动判断上一次用户ISP烧录程序时是将P1.7/XTAL1和P1.6/XTAL2设置成普通I/0口还是XTAL1/XTAL2。3.如果上一次用户ISP烧录程序时是将P1.7/XTAL1和P1.6/XTAL2设置成普通I/0口,则单片机会将P1.7/XTAL和P1.6/XTAL2上电复位后的模式设置成准双向口/弱上拉。4.如果上一次用户ISP编程时是将P1.7/XTAL1和P1.6/XTAL2设置成XTAL1/XTAL2,则.単片机会将P1.7/XTAL1和P1.6/XTAL2.上电复位后的模式设置成高[27]。3.1.3中断说明STC15w4K32s4系列単片机提供了21个中断请求源它们分别是:外部中断0(INT0)、定时器0中断、外部中断1(INT1)、定时器1中断、中口1中断、A/D转换中断、低压检测(LVD)中断、CCP/PWM/PCA中断、中口2中断、SPI中断、外部中断2(INT2)、外部中断3(NT3)、定时器2中断、外部中断4(NT4)、中口3中断、串口4中断定时器3中断、定时器4中断、比较器中断、PWM中断及PWM异常检测中断,除外部中断2(INT2)、外部中断3(INT3)、定时器2中断、串口3中断、串口4中断、定时器3中断、定时器4中断及比救器中断固定是最低优先级中断外,其它的中断都具有2个中断优先级[28]。3.2时钟电路和复位电路在传统的51单片机中,需要加入时钟电路和复位电路,这两个电路组成了单片机的最小系统。在15单片机中因其内部含有时钟电路和复位电路,所以本次课题就不加入时钟电路和复位电路。3.3电源电路部分本次课题所采用的是电池盒供电,电池盒中有6节1.5V的干电池,在满电状态下能为小车提供9V的电压,下面具体分析一下小车的供电电路,供电电路如图3.2所示。电源模块由一个电源插孔,一个六角自锁开关和一块7805稳压芯片组成。当开光按后,电路接通,的电源指示灯被点亮,9V的电压经过7805稳压后变成5V。驱动L298N的工具电压为9V电压,单片机、LCD、超声波传感器等的供电使用的是5V电压,这也是图中出现两个输出电压的原因,这是前期调试用到的电路图,到后期小车成型后巧妙的运用了L298N中的稳压芯片获取5V电压,因此只需要输入9V电压即可。图3.2小车电源电路图3.4超声波传感器超声波传感器是小车的核心传感器,本次课题采用的传感器为HC-SR04超声波测距模块。主要技术参数如表3.2所示:表3.2超声波技术参数表电气参数HC-SR04超声波模块工作电压DC5V工作电流15mA工作频率40kHz最远射程4m最近射程2cm测量角度15度输入触发信号10us的TTL脉冲输出触发信号输出TTL电平信号,与射程成比例规格尺寸45*20*15mm3.4.1超声波测距的物理性质超声波是频率大于2万Hz的机械振动在弹性介质中传播而形成的一种机械波[]。它具有能量大、穿透力强且在异动界面易产生反射、折射及波形转换等特点,超声波测距的物理基础如下:(1)障碍物引发超声场的变化(反射和折射),测距正是利用反射这一点。(2)传感器能采集到超声场的变化。3.4.2超声波测距的原理超声波测距的原理正是基于其物理基础,当超声波模块产生超声波后,单片机的计时器开始计时。超声波在遇到障碍物后会被反射,超声波模块接收到反射波后,单片机的计时器停止计时。根据收发超声波所产生的时间差,便可计算出超声波模块与障碍物的距离。超声波模块在接收超声波时存在能量转化,当超声波接收到反射波后,声信号转换为电信号,从而使单片机的停止计时。设超声波的声速为v,时间差为t0则超声波的测距公式如式3.1:S=×t0/2式(3.1)图3.3超声波测距原理图P’图3.4超声波测距时序图3.4.3超声波测距过程分析超声波避障的主要部分如表3.2所示:表3.2超声波主要组成部分序号简介1供应电能的脉冲发生器(发射电路);2转换电能为声能,且将声能透射到介质中的发射传感器;3接收反射声能(回波)和转换声能为电信号的接收传感器;4接收放大器可以使微弱的回声放大到一定幅度,并使回声激发记录设备;5记录/控制设备,通常控制发射到传感器中的电能,并控制声能脉冲发射到记。6录回波的时间,存储所要求的数据,并将时间间隔转换成距离在超声波测量系统中,频率取得过高或是过低都不合适,最常使用40KHz的超声波。发射部分包含两个组成部分:振荡和功放,主要负责向传感器输出一个有一定宽度的高压脉冲串,并由其内部结构模块转换成声能发出去;接收放大器用来放大回声信号,收/发隔离则使接收装置避开强大的发射信号[29];记录/控制部分启动或关闭发射电路并记录发射的瞬时及接收的瞬时,并将时差换算成距离读数并加以显示或记录。3.5电机驱动电路驱动电路采用的是L298N驱动电路,其电路原理图如图3.5所示:3.5L298N驱动原理图实物图如图3.6所示图3.6L298N实物图3.5.1电机驱动电路分析L298N其内部含有桥式电路,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载[10];控制原理采用采逻辑电平信号进行控制具有ENA和ENB两个使能控制端,在无信号信号影响的情况下只允许或禁止器件由一个电源信号输入,在使用LN298的时候通常需要将8个二极管并联到电路中,这8个二极管可做续流保护的作用,电机在断电后由于惯性作用会产生有可能会发生自感,为了防止电源关闭时自感电压击穿开关元件,同时也是防止电机受外力作用运转时发电造成芯片损坏。电路中L298N有4个输出端,两两一组分别跟两个直流电机的正负极相接,两个使能控制端分别跟单片机的两个PWM调速口连接。表3.3直流电机控制表电机旋转方式控制端IN1控制端IN2控制端IN3控制端IN4PWM信调速ABM1正转高低//高/反转低高//高/停止低低//高/M2正转//高低/高反转//低高/高停止低低///高3.5.2PWMD调速分析PWM即脉冲宽度调制(PulseWidthModulation),固定了一个输出信号的时间周期,通过调整基本周期内工作时间的大小来调整脉冲的占空比[29],在课题中PWM由单片机完成。在固定的周期高电平和低电平分别作用于直流电机,如果高电平左右的时间长,低电平作用的短则电机转速相对较高,反之则转速较慢。图3.7PWM控制原理图设电机始终接通电源时,电机转速最大为Vm,设占空比为D=t/T,则电机的平均速度为[30]:Vd=Vm·D(3.2)式中:Vd表示电机的平均速度;Vm表示电机全通电时的最大速度;D=t/T表示占空比。由公式(3.2)可见,当改变占空比D时,就可以得到不同的电机平均速度,从而达到调速的目的。PWM调速工作方式有2种:一种是单极性工作制一种是双极性工作制。两种工作方式都是根据电压差来工作,单极性就是只有一端接PWM,另一端接GND。而双极性就是接2路PWM信号。由于单极性工作制电流的最大波动比双极性工作制的小,古采用了单极性工作制。3.6LCD1602显示电路设计3.6.1LCD1602显示液晶显示器利用的是液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示。具有显示质量高、数字式接口、体积小、重量轻、功耗低等优点。字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD。本设计用的是16*2的模块。其实物如图3.9所示。图3.8LCD1602实物图3.6.2LCD1602引脚功能说明LCD1602采用的16脚(带背光)的封装接口,各个引脚的功能说明如表3.5所示。表3.5引脚接口说明表编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极其中VL为背光调节引脚,高电平时对比度最弱,反之最强。RS为寄存器选择引脚,高电平选择数据寄存器、反之选中指令寄存器。R/W为读写引脚,高电读取,反之写入。D0—D7是数据引脚[14]。3.6.31602LCD的指令说明及时序:1602液晶模块内部的控制器共有11条控制指令,如表3.6所示。表3.6控制命令表序号指令R/SR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L**6置功能00001DLNF**7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容对LCD1602进行诸如读写操作、光标的操作时都是通过指令编程来实现的。(说明:1为高电平、0为低电平)各指令具体含义如下表所示。表3.7指令含义表指令1清显示,指令码01H,光标复位到地址00H位置。指令2光标复位,光标返回到地址00H。指令3光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。指令6功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符.指令7字符发生器RAM地址设置。指令8DDRAM地址设置。指令9读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10读数据。指令113.7光电测速模块光电测速模块的信号线接在外部中断口,其原理如图3.9所示。图3.9光电测速模块模块参数:1.供电电压:5V。2.输出信号:TTL电平,当检测到码盘无缝隙时输出高电平,反之低电平,转一周输出的脉冲数由码盘线数决定。3.接线说明:红色接+5V,黑色接GND,蓝色接OUT。20线光码盘如3.11图所示。图3.10光码盘码线数决定了测速的精度,一般常用码线为100的码盘,这里采用20码线的码盘进行测速,精度相对较低,但已经满足本系统的需求。3.8报警电路设计报警采用的是声光报警,声报警就是在单片机指定的引脚上接一个蜂鸣器。通过实践发现将蜂鸣器直接接在电路中时蜂鸣器不能发声,原因在于电流太小无法驱动蜂鸣器,解决方案6是串联一个三级管。三极管是模拟电子技术中一个非常重要的电子元件,其作用是将电路中的微弱信号进行放大[31]。要实现光报警只需要在蜂鸣器的电路上并联一个发光二极管即可,需要注意的是二极管要串联一个电阻从而起到限流保护的作用[31]。原理图如图3.12所示。图3.11报警电路设计第四章软件设计部分小车程序的编写时整个课题的重点也是难点,程序的编写采用的是模块化结构,就是将整个大程序模块化的划分开。首先将程序分成两大部分,第一部分是主程序,第二部分是中断程序。主程序是指小车在正常行使的情况下所执行的程序,中断程序是指小车受到中断的触发后跳入中断程序,待中断程序结束后再执行主程序。通过整体的思路分析主程序中应该含有几个部分的程序,分别为小车测距程序,小车测速程序,显示程序,中断程序中包含的程序为:小车报警程序,小车避障程序。当小车进入中断后是否还显示小车的车速要在具体的调试中进行对比分析,还有小车的中断程序应该加入中断保护程序,所谓的中断保护是指:当中断触发时,中断前一时刻所执行的程序受到保护,当中断接收程序从进入中断前的那个程序开始执行[9]。在用流水灯模拟生产流水线时用到的就是中断保护,当故障发生时暂定作业,当故障排除后流水线要从故障发生前的那一步继续进行,而不是重新开始执行流水线。4.1主程序的设计 本设计采用了STC15系列的单片机,其程序的编写跟传统的51单片机没有太大的区别。因此完全可以参照51的一些典型的学习例程对程序进行编写,主程序部分包括距离,速度的测量以及显示,其中超声波的采集需要用到中断程序,因此在主程序中应该加入定时器中断。具体编写时通过定义定时器T1中断来确定超声波传感器的采集周期和测速的采集周期,这两个周期可以使一致的,定时器是一个非常重要的程序,因为15没有外接时钟电路,所以通过查阅15单片机的用户手册可了解其内部的机械周期。除此以外定时器还用作计算超声波从发射到返回的需要的时间;定时器T1用于产生计算并显示PWM;外部中断INT0用于累计光电码盘扫过的码线数,将传感器采集回来的参数通过单片机运算处理后的结果与给定值进行对比,当超声波采集到的值小于给定值时,单片机通过PWM使能端控制LN298n进而控制两个个驱动轮的动作,小车的整个运行过程中超声波的采集值和光电编码器的采集值通过LCD来显示[10]。小车的主程序虽然包含了很多程序,但是只要通过模块化的调试,最终将小车的程序整合到一起便可实现小车的测速、测距、避障报警灯功能。小车主程序流程如图4.1所示。图4.1主程序流程图4.2超声波测距程序设计本课题是采用超声波模块进行测距,在编写超声波程序时先要从超声波模块的硬件出发,超声波模块一共四个引脚,上面分别标有GND、VCC、Echo和Trig。VCC和GND是给超声波模块供电的,Echo和Trig分别是超声波信号的收发引脚,因此需要给单片机相连。通过给控制Echo电平来控制数据的采集,当Echo为零是等待并开启计数,当Echo为1计数并等待,关闭计数,最后调用计算距离函数,得出所测距离。具体设计如图4.2所示图4.2超声波测距流程图4.3避障程序设计避障程序时基于超声波测距程序,当超声波采集到的距离小于程序中的预设值时,触发单片机的中断,因此超声波避障的程序应该放在中断程序中。超声波避障的程序可以用一个if语句设定距离的预设值(阈值)当检测到的距离小于阈值执行进行避障操作(转弯)。超声波传感器发射超声波测量障碍物距离,决定电机的输出状态。4.3超声波避障流程图4.4PWM程序设计PWM输出的信号接在驱动板L298N的ENA和ENB上,ENA和ENB的管脚从而实现调速。PWM脉冲的周期是通过定时器实现的,设置定时器T1的TH1和TL1的初值[14];在实际编程设定一个50ms的周期,具体实现过程:每到1ms进一次定时器中断服务程序[14],在用函数定义一个变量,这个函数用于累加进定时器T1中断的次数,h变量用来表示高电平次数,同样用if来设置阈值,当累加到的次数达到阈值时就会给相应的电机管脚高电平,否则给低电平,就能输出方波从而达到脉宽调制的目的。经过反复的调式,调节高电平占用PWM的周期可以便得到最优的占空比。需要注意的是PWM调速程序也需要在避障中发挥左右,因为我用的车模是两驱车,因此需要通过两轮的速度差来进行转弯,从而实现避障功能。4.5显示子程序设计在对LCD1602进行程序编写前首先要清楚RS,RW,和EN引脚的用法。这个在硬件部分已经做了详细的介绍。在编写程序的时候要围绕这三个引脚展开,其编写步骤如下;定义1602的相关引脚,包括RS,RW和EN。显示的初始化(显示初始化包括设置显示方式、延时、清缓存和设置模式等)设置显示地址(写显示字符的位置)写显示字符的数据LCD显示流程图如图4.4所示。图4.4LCD显示流程图4.7报警程序设计报警程序放入到中断程序中,只要超声波测得的距离小于阈值,单片机立即执行声光报警程序,此时只要将高电平输出给指定的IO口,蜂鸣器就能发声,二极管也会随之被点亮。蜂鸣器的的声音频率是可调的,这个在下文的调试部分会做详细的介绍。程序流程图如图4.5所示。图4.5报警程序流程图

第五章系统调试5.1概述在调试时的软件调试平台借助的是Keil软件,作为C语言开发环境本次运用的keil软件是keil51的升级版keil4,其比前者拥有更加完善的编译功能。Keil作为美国Software公司推出的兼容51系列单片机的C语言开发环境,其为用户提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案[32]。硬件方面选用了功能较为完善的开发板去进行调试,因为调试的过程中是按模块化方法去调试的,用51开发板可以很好地解决这个问题。51开发板由1602模块和蜂鸣器以及二极管,同时也可以机上直流电机进行PWM调速,为此选用开发板对模块进行调试最为方便和效率。5.2各模块的调试5.2.1LCD的调试在进行LCD调试的时候需要进行硬件检查,可导入51开发板的预先编写好的程序进行检查。除此之外对LCD硬件进行安装的时候需要接入可调电阻(电位器),其作用是调节LCD显示屏的对比度,让LCD能更清楚的显示字符,这个是硬件调试中需要解决的问题。将51开发板的液晶测试程序导入后,l602能正常的显示字符,即硬件无问题。图5.1LCD测试图5.2.2光电码盘调试 光电码盘模块与超声波一样也是四根线,一个VCC,一个GND,还有两个信号线,分别测正反转的,这里为了简洁只取了一个方向进行工作测量。按原理图接好线,最终测试结果如图5.2。图5.2测速的效果图5.2.3蜂鸣器报警调试 在开发板上用一根跳线将蜂鸣器连接起来,然后通再并联一个发光二极管构成小车所需的声光报警系统。报警器的调试主要是调试蜂鸣器的声音频率,这个就需要调试延时程序来解决。调试蜂鸣器声音频率时可以加入发光二级的程序。这两个程序相对简单,蜂鸣器只需要给高电平然后延时一段时间后再给低电平,这样蜂鸣器就能发出声音了。二级管的程序就更为简单了,只需要给蜂鸣器高电平的同时给二极管的IO一个高电平就能将其点亮。图5.3蜂鸣器测试程序5.2.4电机及驱动调试在测试电机驱动电路前,需要保证两个5v的直流电机是能正常使用的,因此可以将两个直流电机接在5v电压上检测。当测试电机能使用后可以将两个电机分别接入L298N的四个输出口中,此时不加入PWM调速,因此应将L298N的驱动的两个使能端ENA和ENB接入5V的高电平,如果两个直流电机能正常转动则证明驱动电路是没有问题的,如果不能也可以采用自行排查的方法来查找问题所在。可以用万用表的导通档来检测是否存在断线,也可以用20V电压档检测各个输入断是否有异常电压存在,当然实际调试中的L298N的驱动电路是没有问题的,两个直流电机都能正常使用。5.2.5超声波模块调试超声波的调试也是在开发板上进行调试的,在调试的过程中遇到不少问题,有些通过查阅相关资料已经得到解决有些至今没有找到很好的解决办法。在调试的过程中遇到的问题主要有超声波的采集距离更新慢,超声波模块移动了好几地方,检测的距离也变化了好几次,可是液晶屏的数据却没有变化。通过检查程序发现超声波的周期存在问题,修改了程序后问题得以解决,数据采集到一定的时间后就会停止,必须要通过单片机复位才能继续采集。通过反复的修改程序也解决不了问题,因为能力有限这个问题还是得不到解决。图5.4超声波调试图 总结本文从智能车的研究意义和智能车的发展出发,充分的论述这次课题的目的和意思。汽车作为21世纪最重要的交通工具,其发挥着的作用是不言而喻的,而智能汽车作为未来汽车发展的一个新思路和新方向,因此在智能车的研究成为了世界各国重点关注的问题[1]。智能车拥有巨大的商业价值,这注定成为未来工业发展的一个重点领域[2]。正是基于这样的研究背景本次课题对智能车的知识进行论述,最终制作出了超声波避障小车。本次课题中的超声波避障小车是一15单片机为控制器,一超声波传感器为主要传感元件,制作成的一台多功能智能车。超声波避障小车的主要功能有自动测速,自动测距自动避障。通过上诉这些功能以模拟未来智能车的发展思路和方向,通过对课题遇到的问题进行反复的思考和论证,最终得出解决方案。作为本科的毕业课题,其技术含量相对较低但是其对个人的帮助和影响是很大的。通过这次课题的制作,对硬件的认识和对有关于智能车领域的认识是很大的。关于校车硬件带来的收获也是很大的,校车的硬件电路中包括了供电电路,驱动电路,显示电路等传统的基本电路知识[31],这对于大学本科所学的专业知识是一次很好地巩固机会。除此之外,通过对智能校车各个模块的程序调试,对C语言的认识上升了一个层次,有关于数组与指针方面的学习是在课本上很难学习到的。总的来说智能车测距和测速模块的调试时这次课题的难点很重点,在程序的调试中用的化整为零和化零为整思想是一个很好的思路。关于本次课题中尚未解决的问题:超声波采集有时候会突然停止,需要进行复位操作才能解决。直到最后这个问题也没有得到解决,这也是这次课设一个较大的遗憾,不过通过以后再工作中的总结和学习一定会有所收获,解决这个问题是迟早的事。参考文献[1].贾玉花与薛蓉娜,基于产业成长理论的中国汽车电子信息产业发展研究[J].西安邮电学院学报,2005(04):11-15.[2]胡海峰,史忠科与徐德文.智能汽车发展研究[J].计算机应用研究,2004.21(6):20-23.[3]晏磊,刘岳峰.关于GPS技术在智能交通系统中的应用分析[J].测绘通报,2005.8:15-18[4]PomerleauD,JochemT.Rapidlyadaptingmachinevisionforautomatedvehiclesteering[J],IEEEexpert,1996,11(2):19-27.[5]UmsonC,AnhaltJ,BagellD,etal.Autonomousdrivinginurbanenvironments:Bossandtheurbanchallenge[J].JornalofFiedRobotics,2008,25(8):425-466.[6]BroggiA,BertozziM,FascioliA.Architecturalissuesonvision-basedautomaticvehicleguidance:theexperienceoftheARGOproject[J].Real-TimeImaging,2000,6(4):313-324.[7]BroggiA,BertozziM,FascioliA.etal.TheARGOautomaticvehiclevisionandcontrolsystems[J].InternationalJournalofIntelligentControlandSystems,1999,3(4):409-441.[8]MaurerM,BehringerR,FurstS,etal.Acompactvisionsystemforroadvehicleguidance:PatternRecognition,1996,Proceedingofthe13thInternationalConferenceon,1996[C].IEEE.[9]何晔.基于AT89S52单片机自动避障自动追光小车新设计[J].科技致富向导,2011,(9):130-131[10]蔡卓凡.基于多超声波传感器避障机器人小车的设计[J].仪器仪表与检测技术,2014,33(5):88[11]潘永雄.

新编单片机原理与应用[M].西安:西安电子科技大学出版社,2007.[12]付家才.传感器与检测技术原理及实践[M].北京:中国电力出版社,2008.[13]杨虹,单片机测速系统的一种新方法.天津职业技术师范学院学报[J],2009(03):25-27.[14]王洪涛,王永亮,禹海阔,马乐岩,张志明.基于89S51单片机的智能运载车设计[J].滨州学院学报,2011,27(6):99-100[15]刘映群与丁向荣,基于STC15系列单片机多功能开发板[J],2013.(8):6-7.[16]朱嵘涛,徐爱钧,叶传涛.基于STC15单片机的无线遥控智能小车的设计[J].电脑知识与技术,2014,10(14):34-46[17]王渊峰,戴旭辉AltiumDesigner10电路设计教程[M]:科学出版社2012.[18]郭亚娟,秦襄培与章秀华,基于最小二乘拟合的PCB板焊点定位[J].计算机与数字工程,2014(11):2181-2184.[19]靳展,刘铮与林玉池,光电传感器特性参数测试系统的设计[J].传感技术学报,2012(12):1678-1683.[20]刘升平,王剑与葛红,超声波测距系统的开发与研究[J].计算机工程与应用,2009(25):78-81[21]范文利等,基于PLC和光学传感器的角焊缝跟踪系统[J].机电产品开发与创新,2009(05):122-123.[22]董胡,马振中.基于单片机的智能玩具小车设计[J].微型电脑应用,2014,30(9):16[23]孙绪才.

L298N在直流电机PWM调速系统中的应用[J].

潍坊学院学报,2009,04:19-21[24]安晓莉.

AT89S51单片机并行I/O端口扩展[J].电子设计工程,2009(08),66-67+70[26]余锡存,曹国华.单片机原理及接口技术[M].西安:西安科技大学出版社,2007.[27]朱嵘涛,徐爱钧与叶传涛,STC51单片机和nRF2401的无线门禁系统设计[J].单片机与嵌入式系统应用,2014(06):57-60.[28]李文胜,基于STC15F2K60S2智能多路温度巡检仪设计[J].电子世界,2014(08):第166-167页.[30]吴赛燕与杨辉,超声波测距信号处理算法研究.福建电脑[J],2009(03):73-75.[31]梁红,电工学中模拟电子的电路分析.高师理科学刊[J],2007(03):107-108.附录A实物图附录B源程序main/************************************** 超声波避障小车程序*** MCUIAP15W4K61S4************************************/#include"stc15f2k60s2.h"#include"math.h"#include<intrins.h>#defineuintunsignedint#defineucharunsignedchar#defineCYCLE0x1000L//定义PWM周期(最大值为32767)#defineDUTY10L//定义占空比为10%#defineAVOID_DIS20#definePI3 //简化PI3.14为3#defineNUM30 //栅格数#defineR3 //轮子半径sbitLED=P0^0;sbitRX=P0^2; //超声波接收端sbitTX=P0^1; //超声波发送端staticbitflag=0; //超声波超时标志位intiDis=0;uintflag_count=0,speed=0;voidDelay_l(uinti) { uintx,j; for(j=0;j<i;j++) for(x=0;x<=148;x++); }voidDelay10us() //@11.0592MHz{ unsignedchari; _nop_(); _nop_(); _nop_(); i=24; while(--i);}//触发一个高电平时间staticvoidStartModule(void) //启动模块{ TX=1; //启动一次模块 Delay10us();// _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();// _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();// _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); TX=0;}/********************************************************************************FunctionName:CsbInit*Description:超声波初始化函数*Input:None*Output:None*Return:None*Attention :调用的函数有:Timer0Init,只调用了一个定时器初始化*******************************************************************************/voidCsbInit(void){ TMOD&=0xf0; TMOD|=0x01; //设T0为方式1, TH0=0; TL0=0; ET0=1;//允许T0中断 EA=1; //开启总中断}/********************************************************************************FunctionName:Conut*Description:取出定时器的值,并通过计算得到距离,返回距离到调用函数*Input:None*Output:None*Return:计算得到的距离*Attention :当距离大于5m时,返回3个8,表示超出量程*******************************************************************************/staticintConut(void){ uintS,time; time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.7)/100;//算出来是CM if((S>=500)||flag==1)//超出测量范围,亲测可以达到6M多一点点,不过 {//跳动的很厉厉害,现改为5M flag=0; S=888; } returnS;}/********************************************************************************FunctionName:GetDis*Description:发出一个10us的高电平脉冲,得到超声波测出的距离*Input:None*Output:None*Return:S测得的距离,Uint型变量,比如返回124,则表示为1.24M*Attention :调用的函数有:StartModule,Conut*******************************************************************************/intGetDis(void){ StartModule();//给一个高电平触发脉冲 while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0; returnConut(); //计算}/*********************************************************************名称:bitBusy(void)*功能:这个是一个读状态函数,读出函数是否处在忙状态*输入:输入的命令值*输出:无***********************************************************************/bitBusy(void){ bitbusy_flag=0; P27=0; P26=1; P25=1; Delay_l(10); busy_flag=(bit)(P1&0x80); P25=0; returnbusy_flag;}/*********************************************************************名称:wcmd(uchardel)*功能:1602命令函数*输入:输入的命令值*输出:无***********************************************************************/voidwcmd(uchardel){ while(Busy()); P27=0; P26=0; P25=0; P1=del; Delay_l(10); P25=1; Delay_l(10); P25=0;}/*********************************************************************名称:wdata(uchardel)*功能:1602写数据函数*输入:需要写入1602的数据*输出:无***********************************************************************/voidwdata(uchardel){ while(Busy()); P27=1; P26=0; P25=0; P1=del; Delay_l(10); P25=1; Delay_l(10); P25=0;}/*********************************************************************名称:L1602_char(ucharhang,ucharlie,charsign)*功能:改变液晶中某位的值,如果要让第一行,第五个字符显示"b",调用该函数如下 L1602_char(1,5,'b')*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidL1602_char(ucharhang,ucharlie,charsign){ uchara; if(hang==1)a=0x80; if(hang==2)a=0xc0; a=a+lie-1; wcmd(a); wdata(sign);}/*********************************************************************名称:L1602_string(ucharhang,ucharlie,uchar*p)*功能:改变液晶中某位的值,如果要让第一行,第五个字符开始显示"abcdef",调用该函数如下 L1602_string(1,5,"abcdef;")*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidL1602_string(ucharhang,ucharlie,uchar*p){ uchara,b=0; if(hang==1)a=0x80; if(hang==2)a=0xc0; a=a+lie-1; while(1) { wcmd(a++); if((*p=='\0')||(b==16))break; b++; wdata(*p); p++; }}/*********************************************************************名称:display(uinttemp)*功能:显示数据*输入:temp要显示的数据*输出:无***********************************************************************/voiddisplay(uinttemp){uintbai,shi,ge; bai=temp/100+48; shi=temp%100/10+48; ge=temp%100%10+48; L1602_char(1,9,bai); L1602_char(1,10,shi); L1602_char(1,11,ge);}voiddisplay_s(uinttemp){uintbai,shi,ge; bai=temp/100+48; shi=temp%100/10+48; ge=temp%100%10+48; L1602_char(2,9,bai); L1602_char(2,10,shi); L1602_char(2,11,ge);}/*********************************************************************名称:LDC_Init(void)*功能:LCD1602初始化程序***********************************************************************/voidLDC_Init(void){ P25=0; wcmd(0x38); wcmd(0x08); wcmd(0x0c); wcmd(0x04); wcmd(0x01); L1602_string(1,1,"space:cm"); L1602_string(2,1,"Speed:cm/s"); }/*********************************************************************名称:pwm_init()*功能:PWM初始化程序***********************************************************************/voidpwm_init(){P_SW2|=0x80;//使能访问XSFRPWMCFG=0x00;//配置PWM的输出初始电平为低电平PWMCKS=0x00;//选择PWM的时钟为Fosc/(0+1)PWMC=CYCLE;//设置PWM周期PWM2T1=0x0000;//设置PWM2第1次反转的PWM计数PWM2T2=CYCLE*1/100;//占空比为(PWM2T2-PWM2T1)/PWMCPWM2CR=0x00;//选择PWM2输出到P3.7,不使能PWM2中断 PWM3T1=0x0000;//设置PWM2第1次反转的PWM计数PWM3T2=CYCLE*1/100;//占空比为(PWM2T2-PWM2T1)/PWMCPWM3CR=0x00;//选择PWM2输出到P3.7,不使能PWM2中断 PWM4T1=0x0000;//设置PWM2第1次反转的PWM计数PWM4T2=CYCLE*1/100;//占空比为(PWM2T2-PWM2T1)/PWMCPWM4CR=0x00;//选择PWM2输出到P3.7,不使能PWM2中断 PWM5T1=0x0000;//设置PWM2第1次反转的PWM计数PWM5T2=CYCLE*1/100;//占空比为(PWM2T2-PWM2T1)/PWMCPWM5CR=0x00;//选择PWM2输出到P3.7,不使能PWM2中断PWMCR=0x0f;//使能PWM信号输出PWMCR|=0x80;//使能PWM模块P_SW2&=~0x80;}/***********************小车后退函数************************/voidback(){ P_SW2|=0x80; PWM2T2=CYCLE*1/100; PWM3T2=CYCLE*50/100; PWM4T2=CYCLE*50/100; PWM5T2=CYCLE*1/100; P_SW2&=~0x80; }/***********************小车前进函数************************/voidgo(){P_SW2|=0x80; PWM2T2=CYCLE*80/100; PWM3T2=CYCLE*1/100; PWM4T2=CYCLE*1/100; PWM5T2=CYCLE*80/100; P_SW2&=~0x80; }/***********************小车左转函数左边轮子后退右边轮子前进************************/voidleft_s(){ P_SW2|=0x80; PWM2T2=CYCLE*80/100; PWM3T2=CYCLE*1/100; PWM4T2=CYCLE*80/100; PWM5T2=CYCLE*1/100; P_SW2&=~0x80; }/***********************小车停下函数************************/voidstop(){ P_SW2|=0x80; PWM2T2=CYCLE*1/100; PWM3T2=CYCLE*1/100; PWM4T2=CYCLE*1/100; PWM5T2=CYCLE*1/100; P_SW2&=~0x80;;}/***********************小车右转函数左边轮子前进右边轮子后退************************/voidright_s(){ P_SW2|=0x80; PWM2T2=CYCLE*1/100; PWM3T2=CYCLE*80/100; PWM4T2=CYCLE*1/100; PWM5T2=CYCLE*80/100; P_SW2&=~0x80; }/*************************避障函数*********************************/voidAvoid(void){ staticunsignedcharDir=0; if(iDis>AVOID_DIS||iDis<5)//大于避障距离,则前进 { LED=1; go(); } else//否则转弯 {LED=0; Dir++; if(Dir%2) { back(); Delay_l(1000); right_s();//右转 Delay_l(1000); } // else // { ////back(); //// ////Delay_l(1000); //// left_s();//左转 Delay_l(1000); // } }}/*************************定时器初始化*********************************/voidtimer_Init(void){ AUXR|=0x40; //定时器时钟1T模式 TMOD&=0x0F; //设置定时器模式 TL1=0xCD; //设置定时初值 TH1=0xD4; //设置定时初值 TF1=0; //清除TF1标志 ET1=1;//使能定时器1中断 TR1=1; //定时器1开始计时 IT0=1;//设置INT0的中断类型(1:仅下降沿0:上升沿和下降沿)EX0=1;//使能INT0中断EA=1; }/*************************速度计算函数*********************************/voidspeed_act(uintsp){ speed=(2*R*PI*sp)/NUM;}/*************************主函数*********************************/voidmain(void){ P0M1=0; P0M0=0; P1M1=0; P1M0=1; P2M1=0; P2M0=0; P3M1=0; P3M0=0; CsbInit(); LDC_Init(); pwm_init(); timer_Init(); while(1) { LED=0; iDis=GetDis(); Avoid(); display(iDis); Delay_l(1000); display_s(speed); } }//外部中断服务程序voidexint0()interrupt0//INT0中断入口{ flag_count++; }/**************************定时器0中断服务函数*******************************/voidzd0()interrupt1 //T0中断用来计数器溢出,超过测距范围{ flag=1; //中断溢出标志}voidzd1()interrupt3 //T0中断用来计数器溢出,超过测距范围{ staticflag_t=0; TF1=0;//清除TF1标志 flag_t++; if(flag_t==1000) { flag_t=0; speed_act(flag_count); flag_count=0; LED=~LED;致谢这次课题足足花了我三个多月的时间,很多的知识在刚开始的时候完全不了解,通过不断的学习和请教同学,慢慢的

温馨提示

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

评论

0/150

提交评论