一 绪论
1.1 课题研究的背景及意义
随着科技的高速发展,一种新的、有蓬勃生命力的智能机器人已经出现,正在给人们的生活带来越来越多的惊喜,同时也使人们的生活变得越来越舒适和安逸。智能机器人越来越受到企业和商业界的重视,这主要因其广大市场和巨大利润所至。智能机器人的出现主要有两个原因:一是劳动成本的上升;另一个是人们想摆脱令人烦恼枯燥的工作;如超市定点巡逻,可以利用机器人代替人们自身对整个超市进行定时定点巡逻监测。要想机器人在移动过程中的路径准确,就必须将其安装测距系统,以使其及时获取距障碍物的距离信息(距离和方向)。[15]
本课题设计是基于ATC52单片机进行的。单片机技术的应用,是许多领域的技术水平和自动化程度得以大大提高。当今世界也正面临着一场以单片机技术为标志的新,人们渴望迅速进入单片机应用与开发的大门。随着人们物质文化的丰富,各种电子产品开发也越来越先进,越来越迅速。在超声波测距领域,为缩短开发周期、提高测距精度,单片机因为具有集成度高、运算速度快、体积小、运行速度快、体积小、运行可靠、工耗低等无与伦比的优势,以得到了广泛的应用。当前,微型控制器正向两个方向发展,一个是高功能,多功能方向。从这个方向取得的成就使得微型控制器逐步代替了价格昂,功能优越的中小型机;另一个是价格低廉,功能单一的方向,这个方
1
向的发展是微型控制器在生产领域、服务部门和日常生活得到越来越广泛的应用。[1][11]
目前我国的机器人避障的测距的研究和开发还处于起步阶段,还没有产业化。另外,本课题的研究内容也适用于无人自动化工厂的自动导航小车以及移动机器人的路径规划。由于机器人应用从制造业向非制造业的扩展,自主移动机器人智能机器人在诸如野外作业、深海探测、以及一些人类本身所不能进入的有毒或高温环境的作业中,有着广泛的应用前景,因此,近年来,有关移动机器人导航避障及路径规划的研究越来越多,就此而言,本课题的研究也是很有意义的。[16]
1.2 机器人超声波测距的发展现状和应用
人类采用仿生学,人工发射出超声波。目前,超声波已在民用及国防工业中。例如:用超声波探测海洋潜艇位置、鱼群以及确定海底暗礁等障碍物形状和位置。利用超声波在固体里传播的时间确定物体的长度以及超声波在固体里遇到障碍物界面上的反射来确定物体的内部损伤(如裂缝、气孔及杂质等)位置,称之为无损探伤。利用超声波测距辅助机器人确定机器人自身位置和环境识别,从而准确避开障碍物按照预先规划好的行进方向行进来完成预定任务。在汽车防撞雷达中,由于超声波测距具有高数据率,能快速显示行驶汽车与障碍物之间距,提醒司机注意减速刹车,保证行驶安全。另外,还应用于矿井探测、液面探测、大地测量以及水利工程等领域。超声波是一种非接触式检测方式,和红外、激光及无线电测距相比,超声波具有不
2
受光线影响,结构和操作简单,成本低等特点。采用高精度视觉识别环境技术需要复杂的信息处理,且体积大,价格昂贵。对于体积较小成本较低的机器人,这些特点尤为突出,相比之下,超声波测距的特点弥补了以上不足,在许多情况下能很好的完成探测任务。因此超声波测距得以广泛的推广。另外用超声波阵列来识别反射物的类型(如平面、边缘和墙角)为其新应用。[3]
超声波虽然被大量用于各种工业领域,但它在低信噪比下测距精度较低,多个超声波测距条件下会产生相互影响,另外测距的盲区较大,这些固有的特点也其进一步广泛应用。
国外在提高超声波测距性能方面做了大量的研究,国内一些学者也做了相关研究。对超声波的研究主要集中在提高超声波精度,减小多超声波测距时相互影响这两个方面。超声波测距的精度主要取决于所测的超声波传输时间的精度和超声波在介质中的传输速度,两者中以传输时间的精度影响较大,所以大部分文献采用降低传输时间的不确定来提高测距精度。目前相位探测法和声谱轮廓分析法或将两者结合起来的方法是主要降低探测传输时间不确定的方法。
国内厦门大学的童风研究了一种回波轮廓分析法。该方法在测距中通过两次探测求取回波包络曲线来得到回波的起点,通过这样处理后超声波的传输时间的精度得到了很大的提高。不过因为需要经过两次探测后才能得到回波的包络,且计算包络需要一些信息处理时间,这样盲区较大为2.5m,日本三菱电器公司的Tomonori等人是采用两种不同的发射频率来发射超声波,通过比较两种回波的相位来决定回
3
波的起点,也提高了传播时间的精度,从而提高了超声波的测量精度。意大利的Carullo等人介绍了一种自适应系统,采用特殊的发射波形来获得好的回波包络,同时采用对环境的噪声进行估测,设置一定的回波开门电平,且采用自动增益的控制放大器,通过这些措施来提高超声波的探测精度。另外也有大量的文献研究采用数字信号处理技术和小波变换理论来提高超声波传播时间的精度,这些方法都取得了较好的效果,但是这些技术都是以牺牲实时性,增长处理时间同时增加传感器成本和体积为代价的,所以体积较大,价格较高。在某些应用场合,不需要非常高的精度,但需要较小的体积和小的盲区且成本较低。
1.3 本课题内容
本课题的内容按章节大致可以分四个方面:
(1)了解机器人避障超声波测距的研究背景,提出课题的研究意义,指出了用超声波测距比其他测距方法相比有其自身的优势:技术难度相对不太大、指向性强、能量消耗缓慢、在介质中传播的距离较远、不受光线和被测对象颜色等的影响。另外还指出了机器人超声波测距国内外的发展现状及应用。
(2)对测距技术进行研究,就当前比较流行的激光测距技术和超声波测距技术的原理进行探讨,比较两种测距的优缺点,针对本课题的实际,提出采用超声波测距的优势所在。提出系统硬件设计方案。 (3) 简单介绍了单片机的编程语言—C51语言。然后针对本课题提
4
出软件编程方案:采用模块化设计,整个程序的编写分主程序、发射子程序、中断接收子程序、定时子程序等模块进行。并给出主程序、外部中断和定时内部中断的程序流程图。同时根据模块化的设计方案,编写出主程序、发射子程序、中断接收子程序、定时子程序的源代码。还对数字滤波以及C52的通信编程进行一些探讨。
5
二 方案论证
目前,用于机器人移动过程中的测距技术主要有两种,即激光测距技术和超声波测距技术。本章就两种常用的测距技术进行比较,然后选取针对本课题的最佳测距技术。 2.1 激光测距方案
一个典型的激光测距系统应具备以下几个单元:激光发射单元,激光接收单元,距离计算与显示单元,准直与聚焦单元,如图2—1所示。系统工作时,激光由发射单元发射,以光速到达目标物后反射回来,被接收单元接收,通过距离计算与显示单元得到目标物距离。
图2—1 激光测距系统原理图
根据激光测距的基本原理,激光测距技术可以分为激光飞行时间测距和非飞行时间激光测距两类,其中飞行时间测距根据所发射激光状态的不同,可分为脉冲激光测距和连续波激光测距,后者根据起止时刻标识的不同又分为相位激光测距和调频激光测距。非飞行时间激光测距技术是指在测距时并不像飞时测距法直接或者间接获得激光
6
飞行时间,而是通过光子计数或者数学统计的方法来得到目标物距离。激光测距方法中被广泛应用的是脉冲激光测距和相位激光测距,其他测距方法的应用范围较为有限,仅在特定条件下应用。[14] 2.2 超声波测距方案
超声波测距技术是一种有源非接触性测距技术, 是利用超声波在空气中的定向传播和固体反射特性(纵波),通过接收自身发射的超声波反射信号,根据超声波发出及回波接收时间差及传播速度,计算出传播距离从而得到障碍物到机器人的距离。由于超声波传感器成本低廉、采集信号速度快、距离分辨率高、质量轻、体积小、易于装卸等优点。并且超声波传感器在采集环境信息时不存在复杂的图像匹配技术,不需要通过大量的计算而获得距离数据,因此其测距速度快,实时性好、同时超声波传感器不易受到天气条件、环境光照及障碍物阴影、表面粗糙度、裂缝等外界环境条件的影响。
超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差t,然后求出就可以计算出发射点距障碍物的距离:
S = Ct / 2
由于超声波也是一种声波,其声速C与温度有关,表2—1列出了几种不同温度下的声速。如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。
7
温度-30 -20 -10 0 10 20 30 100 (0C) 声速313 319 325 323 338 344 349 386 (米/秒)
表2—1 声速与温度关系表
超声波是一种一定频率范围的声波。它具有在同种媒介中以恒定速率传播的特性,而在不同的媒质的界面处,会产生反射现象。利用这一特性,就可以根据测量发射波与反射波之间的时间间隔,从而达到测量距离的作用。其主要有三种测距方法:
1.相位检测法
相位检测法虽然精度高,但检测范围有效。 2.声波幅值检测法
声波幅值检测法易受到反射波的影响。 3.渡越时间检测法(TOF)
渡越时间检测法的工作方式简单、直观,在硬件控制和软件设计上都非常容易实现。其原理为:检测从发射换能器发生的超声波,经气体介质传播到接收换能器的时间,即渡越时间。时间渡越式超声波传感器的工作原理为渡越时间与气体介质中的声速相乘,便可得到超声波发射器和接收器之间的距离。[12][14]
由于在设计机器人避障及超声波测距上主要考虑控制和实现的
8
简便性。从上面讨论可知:采用渡越时间检测法的超声波传感器是设计机器人避障及超声波测距的最佳选择。 2.3 设计方案的确定
激光测距技术可以达到极远的测程,但是由于技术难度较高,成本较高,因此被广泛应用于战术前沿测距、导弹运行轨道跟踪、以及人造卫星、地球到月球距离的测量等。超声波测距技术具有成本低、技术难度相对不太大、指向性强,能量消耗缓慢的优势,而且超声波不受天气条件、环境光照及障碍物阴影、表面粗糙度、裂缝等外界环境条件的影响,因而超声波也经常用于距离的测量。
结合本课题的实际应用和两种测距技术的优缺点,本课题最终决定采用超声波测距技术。
2.4 小结
本章主要介绍了激光测距和超声波测距的工作原理,并且分别比较了两种测距技术的优缺点。结合本课题的实际应用情况,由于机器人移动过程中面对的障碍物会局限于小范围内,因此本课题选择超声波测距技术,况且超声波测距技术可以达到课题需要的精度要求。
9
三 硬件电路设计
本部分主要由本组的另一位成员完成,这里仅进行概括性的论述。 3.1测距电路的硬件系统(总电路图见附件2)
图3—1所示 测距电路方框图
它主要由超声波发射与接收电路、多路选择开关电路、多级信号放大电路和以ATC52为主芯片的控制电路组成,详细内容见硬件部分。 3.2超声波发送电路
超声波发送电路包括超声波信号产生电路、多路选择开关电路及发送换能器等部分。超声波换能器振子频率为40 KHz,它与电路的振荡频率一致。电路由40KHz振荡电路与超声波激励电路组成,振荡电路采用74HC00中三个与非门与电容和电阻构。将信号产生电路与单片机的P1.4相连,控制发送脉冲宽度。振荡电路产生的超声波信号输出到三极管的基极,经三极放大及耦合升压后,送超声波换能
10
器向空间发射超声波,持续发射250us。耦合管原、副边的匝数比为1:20,当发射超声波的时候,换能器两端的Vp-p值接近100V,有效地增加了超声波换能器的发射能量。 3.3超声波接收电路
超声波接收电路由限幅、多路电子开关、放大、滤波、整流以及比较等几部分组成。
(1)限幅电路
当反射距离的远近程度相差很大时,超声波换能器产生的回波信号的幅度也相差甚大。为了能有效处理远距离的微弱回波信号,放大部分的总增益比较高。然而当反射距离很近时,回波信号幅度很大,如果直接传送到放大处理电路,可能使整个系统过渡饱和,因此在前端需加限幅电路。
(2)多路电子开关
因为有4路超声波信号,所以采用CD4052多路电子开关。CD4052有A0、A1两个二进制控制输入端和INH输入,当INH输入端为\"1\"时,所有通道截止。二位二进制输入信号选通4对通道中的一对通道,可连接该输入端至输出。CD4052的INH引脚连至ATC52的P1.3引脚,A0引脚连至ATC52的P1.6引脚,A1引脚连至ATC52的P1.7引脚.
(3)交流耦合放大电路
放大电路是超声波回波信号的处理电路中关键的部分之一。为了达到3米的有效测距范围,对远处返回的微弱的回波信号必须给予足
11
够的放大,因此整个系统的最大增益不小于1万倍。
(4)滤波电路
为了使整个系统的性能稳定,必须在中间级加有源带通滤波电路。滤波电路设计是最关键的一个环节,也是整个系统设计中最难的环节,此电路中各无源阻容参数的选取既要满足设计通带的要求,还要避免整个系统的自激振荡。
(5)运放精密整流电路
一般的整流电路采用两个二极管或四个二极管整流,这样要损失0.7或1.4伏的二极管压降。如果想把一个要测量的信号由交流变为直流,那么这压降会使测量变为毫无意义。或者想把一个要测量的小信号(小于0.3伏)由交流变为直流,即使使用锗二极管,都将得不到信号。按照设计要求,为了能够接受到经放大后的回波信号,应该采用运放进行精密整流。
(6)处理串扰问题的电路
由于发射与接收都是同一个传感器,发射超声波的时候,40kHz的方波直接经过电阻输送到接受信号处理电路,使单片机系统误认为已经接收到回波(虚拟反射波),这一现象称为“串扰问题”。“串扰问题”使单片机系统误认为已经接受到回波信号,导致系统不能正常工作,为了解决“串扰”问题,设计这样的电路。其工作原理是:在信号处理电路最后一级比较电路中,Vout为来自精密整流的输出端。当单片机外部引脚P1.4发射40kHz脉冲群时,单片机P1.5端保持15ms低电平,即运放的同相输入端保持+8V高电压,此电平高于运放反相端的
12
输入电压,可靠地保证运放输出为高电平,不会向CPU申请中断,这样解决了“串扰”问题。但从发射开始一直到“虚假反射波”结束这段时间,由于强制比较电路输出高电平,将引起了30cm的测距“盲区”。
13
四 软件程序设计
ATC52单片机和其开发应用系统具有语言简洁、可移植性好、表达能力强、表达方式灵活、可进行结构化设计、可以直接控制计算机硬件、生成代码质量高、使用方便等诸多优点。由于机器人策略算法复杂,为了便于上、下位机之间的通信,超声波测距系统软件采用C51语言编写。(总程序见附录1) 4.1 ATC52单片机的FLASH的编程
ATC52单片机内部有8K字节的FLASH PEROM。这个FLASH存储阵列出厂时已处于擦除状态,用户随时可以对它进行编程。编程接口可接收高电平或低电平的允许编程信号。低电压编程模式适合于用户在线编程系统,而高电平编程模式可与通用EPROM编程器兼容。其引脚图如下:
图4-1 ATC52引脚
ATC52单片机中,有些属于低电压编程方式,而有些则是高电
14
平编程方式,用户可从芯片上的型号和读取芯片内的签名字节获得该消息。ATC52的程序存储器阵列是采用字节写入方式编程的,每次写一个字节,要对整个芯片内的PEROM程序存储器写入一个非空字节,必须使用片擦除的方式将整个存储器的内容清除。编程前须按表4—1所示设置好数据及控制信号,ATC52编程方法如下:
① ② ③ ④ 压。
每对FLASH存储阵列写入一个字节或每写入一个程序加密位,加上一个ALE/PROG编程脉冲。每个字节写入周期是自身定时的,通常约为1.5MS。重复1—4步聚,改变编程单元的地址和写入的数据,直到全部程序编写完成。[1][3]
址线上加上要编程单元的地址信号。 在数据线上加上要写入的数据字节。 激活相应的控制信号。
在高电压编程方式时,将EA/VPP端加上+12V编程电
方 式 写代码数据 读代码数据 写加密位 BIT1 BIT2 BIT3 RST H H H H H PSEN EA/VPP P2.6 L L L L L H/12V H H/12V H/12V H/12V L L H H H P2.7 H L H H L P3.6 H H H L H P3.7 H H H L L 15
片 擦 除 读签名字节
H H L L H/12V H H L L L L L L L 表4—1 FLASH存储器编值表
4.2单片机C51语言的简介
用于单片机软件编程的语言有面向单片机的C语言和汇编语言。C是一种源于编写UNIX操作系统的语言,它是一种结构化语言,可产生紧凑代码,可以进行许多机器级函数控制。汇编语言是用操作内容的英文词的缩写符号代替二进制编码,用符号代替地址或操作的数据。与汇编相比,C语言有如下特点:
1.对单片机的指令系统不要求了解,仅要求对8051的存储器有初步了解;
2.寄存器分配,不同存储器的数据类型等细节可由编译器管理; 3程序有规范的结构,可分为不同的函数,这种方式可使程序结构化;
4.具有将可变的选择与特殊操作结合在一起的能力,改善了程序的可读性;
5.关键字与运算函数可用近似人的思维过程方式使用; 6.编程与程序调试时间显著缩短,从而提高效率;
7.提供的库包含许多标准子程序,具有较强的数据处理能力; 8.已编好程序可容易的植入新程序,因为它具有方便的模块化编程技术。
16
因此,用C语言进行8051单片机程序设计是单片机开发与应用的必然趋势。单片机教学中的程序设计也应该以C语言为主,汇编语言为辅。对汇编语言掌握到只要可以读懂程序,在时间要求比较严格的模块中进行程序的优化即可。采用C语言也不必对单片机和硬件接口的结构有很深入的了解,编译器可以自动完成变量的存贮单元的分配,编译者就可以专注于应用软件部分的设计,大大加快了软件的开发速度。
C语言是一种通用的计算机程序设计语言,在国际上十分流行,它既可用来编写计算机的系统程序,也可用来编写一般的应用程序。以前计算机的系统软件主要是用汇编语言编写的,对于单片机应用系统来说更是如此。由于汇编语言程序的可读性和可移植都较差,采用汇编语言编写单片机应用系统程序的周期长,而且调试和排错也比较困难。为了提高编制计算机系统和应用程序的效率,改善程序的可读性和可移植性,最好采用高级语言编程。一般的高级语言难以实现汇编语言对于计算机硬件直接进行操作(如对内存地址的操作、移位操作等)的功能。而C语言既具有一般高级语言的特点,又能直接对计算机的硬件进行操作,并且采用C语言编写的程序能够很容易地在不同类型的计算机之间进行移植,因此C语言的应用范围越来越广泛。
单片机C51语言有以下优点:
1、可进行结构化程序设计。C语言是以函数作为程序设计的基本单位的,C语言程序中的函数相当于一般语言中的子程序。C语言对于输入和输出的处理也是通过函数调用来实现的。各种C语言编译
17
器都会提供一个函数库,其中包含有许多标难函数,如各种数学函数、标准输入输出函数等。此外C语言还具有自定义函数的功能,用户可以根据自己的需要编制满足某种特殊需要的自定义函数。实际上 C语言程序就是由许多个函数组成的,一个函数即相当于一个程序模块,因此语言可以很容易地进行结构化程序设计。
2、可以直接操作计算机硬件。C语言具有直接访问机器物理地址的能力,美国FranMn公司的C51编译器可以直接对805l单片机的内部特殊功能寄存器和I/0口进行操作,可以直接访问片内或片外存储器,还可以进行各种位操作。
3、生成的目标代码质且高。众所周知,汇编语言程序目标代码的效率是最高的,这就是为什么汇编语言仍是编写计算机系统软件的主要工具的原因。但是统计表明,对于同一个问题,用C语言编写的程序生成代码的效率仅比用汇编语言编写的程序低10—20%,美国FrankltR软件公司的C51编译器,能够产生及其简洁形式、效率极高的程序代码,在代码质量上可以与汇编语言程序相媲美。[11]
4.3超声波测距系统的软件原理
基于ATC52单片机设计的超声波测距系统,采用模块化设计,由主程序、发射子程序、中断接收子程序、定时子程序(显示子程序)等模块组成。
主程序流程图如图4—2所示,先进行系统初始化,然后调用定时中断子程序、定时中断子程序的目的是控制发射和接收超声波,如
18
接收到回波信号则调用外部中断子程序得出超声波往返时间和环境温度,计算出距离信息,然后定时调用显示程序等。
单片机初始化 开 始 定时中断子程序 N
有回波吗 Y
图4—2 主程序流程图
调用显示程外部中断子程序 中断服务程序包括内部定时中断和外部INT0、INT1中断服务程序。定时设置为40ms中断一次,其任务是每隔40ms产生4个40kHz的方波作为超声脉冲并按顺序送到四个通道的超声换能器。
定时中断服务程序流程图如图4—3所示,当主程序调用定时中断程序时,定时程序开始初始化,定时程序初始化完成定时器工作方
19
式的设置。ATC52单片机有三个定时器:定时器0、定时器1、定时器2。定时器0和定时器1的工作方式与ATC51单片机相同。定时器2是一个16位定时/计数器,它即可以当定时器使用,也可以作为外部事件计数器使用,其工作方式由特殊功能寄存器T2CON的C/T2位选择。定时器2有三种工作方式:捕捉方式,自动重装(向上或向下计数)方式和波特率发生器方式,工作方式有T2CON的控制位来选择。本课题的选用的定时器2的自动重装方式,即定时器自动装载40MS的定时时间,在中断执行子程序的工程中自动向下计数。在完成定时器的初始化以后,发射超声波,然后判断三方是否发射完成,如果完成则停止发射,没有完成的话继续发射超声波。
定时中断入口 定时器初始化 N 外部中断入口 发射超声波 关外部中断 读取温度值 t 读取渡越时 三方均发 Y 停止发射 计算距离 结果输出 开外部中断 返 回 20 返 回
图4—3 定时中断服务程序流程图 图4—4 外部中断服务程序
外部中断服务程序(如图4—4所示)分INT1和INT0中断程序,INT1中断子程序读取温度传感器的A/D转换结果,并将相应数据换算为环境温度值t。INT0停止T1计数,根据T1读数计算渡越时间T,并进行距离的计算。先计算超声波在当前环境下传播速度:C=331.4
1t/273,再计算距离:D=CT/2,并将计算结果送入显示缓冲区。
当主程序调用外部时,进入外部程序入口,然后停止外部中断,根据INT1读取温度传感器的A/D转换数据,INT0使计数器计数停止,根据计数器的数值计算出渡越时间,然后调用函数完成距离的计算,将计算结果送给显示缓存器。
4.4 数字滤波
4.4.1 数字滤波必要性与优点
在工业过程控制系统中,由于工作环境比较恶劣,干扰源比较多,如环境温度、电场、磁场,所以在模拟系统中,为了消除干扰,常采用RC滤波电路。而在单片机组成的自动检测系统中,为了较少对采样值的干扰,提高系统的可靠性,则常常采用数字滤波的方法。
所谓数字滤波,即通过一定的计算程序,对采样信号进行平滑加工,提高其有用信号,消除或减少各种干扰和噪音,以保证单片机系统的可靠性。
数字滤波器与模拟RC滤波器相比,具有如下优点:
21
1、无需增加任何硬设备,只要在程序进入数据处理和控制算法之前,附加一段数字滤波程序即可。
2、由于数字滤波器不需增加硬设备,所以系统可靠性高,不存在阻抗匹配问题。
3、模拟滤波器通常是各通道专用,而数字滤波器则可多通道共享,从而降低了成本。
4、可以对频率很低的信号进行滤波,而模拟滤波器由于受电容容量的,频率不可能太低。
5、使用灵活、方便,可根据需要选择不同的滤波方法,或改变滤波器的参数。
正因为数字滤波器具有上述优点,所以在计算机控制系统中得到广泛的应用。 4.4.2 常用的数字滤波
(1)程序判断滤波
程序判断滤波的方法,是根据生产经验,确定出两次采样输入信号可能出现的最偏差△y。若出国此偏差值,则表明该输入信号是干扰信号,应该去掉;如小于此偏差值,可将信号作为本次采样值。当采样信号由于随即干扰,如大功率用电设备的启动或停止,造成电流的尖峰干扰或误检测,以及变送器不稳定而引起的严重失真等,可采用程序判断法进行滤波。
程序判断滤波中最常用的是限幅滤波,限幅滤波的作法是把两次相邻的采用值相减,求出其增量(以绝对值表示)。然后与两次采样
22
允许的最大差值(由被控对象的实际情况决定)△y进行比较,若小于或等于△y,则取本次采样值;若大于△y,则仍取上次采样值作为本次采样值,即:
Y(k)Y(k1)Y,则Y(k)Y(k),取本次采样值 Y(k)Y(k1)Y,则Y(k)Y(k1),取上次采样值
式中,Y(k)——第k次采样值;
Y(k1)—第(k-1)次采样值;
△Y—相邻两次采样值所允许的最大偏差,其大小取决于采样周期T及Y值的变化动态响应。
设计这种程序时,首先把允许的△Y值存入LIMIT单元,上次采样值存入DATA1单元,本次采用值存入DATA2单元,其流程图,如图4—5:
Y N Y(k)-Y(k-1)≥△Y吗? 求 补 Y(k)-Y(k-1)≥0吗? 程序判断滤波程序 保护现场 求Y(k)-Y(k-1) Y N
Y(k)=Y(k-1) 恢复现场 23 返 回
图4—5 程序判断滤波程序流程图
(2)中值滤波
所谓中值滤波是对某一参数连续采样N次(一般N为奇数),然后把N次的采样值从小到大,或从大到小排队,再取中间值作为本次采用值。
中值滤波对于去掉由于偶然因素引起的波动或采样器不稳定而造成的误差所引起的脉动干扰比较有效。若变量变化比较缓慢,采用中值滤波效果比较好,但对快速变化过程的参数,如流量,则不宜采用。
中值滤波程序设计的实质是,首先把N个采样值从小到大或从大到小进行排队,然后再取中间值,N个数据按大小顺序排队的具体作法是两两进行比较,设(R0)为数据存放区首地址,先将(R0)与((R0)+1)进行比较,若是((R0))<((R0)+1),则不交换存放位置,否则将两数位置对调。继而再取((R0)+1)与((R0)+2)比较,判断方法依然,直到最大数沉低为止。然后再重新进行比较,把最大值放在N-1位,如此做下去,则可将N个数从小到大顺序排列。设采用值从8位A/D转换器输入5次,存放在SAMP为
24
首的内存单元中,其流程图如图4—6所示
。
R(0)< R(0)+1吗? 中值滤波子程R(2)←大循环次数 R(3)←小循环次数 Y
R(0)换 R(0)+1 指向下一个数R(3)←R(3)-1 N Y
R(3)=0吗? R(2)←R(2)-1 N R(2)=0吗? Y
取中间值 返回 图4—6 中值滤波程序流程图
(3)算术平均值滤波
25
算术平均值滤波是要寻找一个Y(k),使该值与各采样值间误差的平方和为最小,即
N2Smine(i)i1
由一元函数求极值原理,得
1 Y(k)N X(i) (4—1)
i1N式中,Y(k)— 第k次N个采样值的算术平均值 X(i)— 第I次采样值 N — 采用次数
式(4-1)便是计算平均值数字滤波公式。由此可见,算术平均值法滤波的实质即把一个采样周期内N次采样值相加,然后再除以采样次数N,便得到该采用周期的采样值。
(4)滑动平均值滤波法
对于算术平均值滤波,需要连续采用N个数据,然后求算术平均值。这种方式适合于由脉动式干扰的场合。但由于必须采样N次,需要时间较长,故检测速度慢。为了克服这一缺点,可采用滑动平均值滤波法。即先在RAM中建立一个数据缓冲区,依顺序存放N次采样数据,每采进一个新数据,就将最早采集的那个数据丢掉,而后求包括新数据在内的N个数据的算术平均值。这样,每进行一次采用,就可计算出一个新的平均值,从而大大加快了数据处理的速度。
这种滤波程序设计的关键是,每采用一次,移动一次数据块,然
26
后求出新一组数据之和,再求平均值。 4.4.3 各种数字滤波器性能的比较
以上介绍了四种数字滤波的方法,每种滤波程序都有各自的特点,可根据具体的测量参数进行合理的选用。
(1) 滤波效果
一般说来,对于变化比较慢的参数,如温度,可选用程序判断滤波。对那些变化比较快的脉冲参数,如压力、流量等,则可选择算术平均值滤波法。至于要求比较高的系统,需选用复合滤波法。在算术平均值滤波中,其滤波效果与所选择的采用次数N有关。N越大,则滤波效果越好,但花费的时间也愈长。
(2) 滤波时间
在考虑滤波效果的前提下,应尽量采用执行时间比较短的程序,如果计算机的运算速度比较快,则可采用更好的复合滤波程序。本测距系统采用的数字滤波——复合滤波法
行走机器人一般都装有超声波测距系统,机器人在行走过程中,电机PWM调速必定对测距系统产生干扰。为了使测距系统稳定地工作,在硬件方面需加屏蔽罩,在软件方面则需对采集的数据进行数字滤波。
超声波测距是根据渡越时间长短来测量距离的远近,而声波的传输速度是340m/s。在最远测距范围是4M范围内,完成一次测量需要25ms。采集的数据变化是比较快的,程序判断滤波显然是不适合的,而采用平均值滤波也不能明显地反映出实际距离变化,最佳数字滤波
27
方法是选用中值数字滤波。即连续采样5次数据,把采样数据按从小到大顺序排列,取中间数据为采样值,这样将获得比较理想的结果。 数字滤波程序如下:
if(temp1[slen][0]==0) m=1; else m=0;
thdata[0]=temp1[slen][m]; tldata[0]=temp2[slen][m]; datadeal(); array[4]=thdata[0]; tldata[0]=tldata[0]&0xf0; array[5]=tldata[0];
Tlength=array[5]/16+(array[4]/16)*100+(array[4]%16)*10; if (Tlength==0||Tlength>0xff) ssbuf=0xff;
else ssbuf=Tlength; DISPLAY();
flgb=0; n=m=0; syma=1;
28
symb=0;
4.5 C52单片机编程的拓展
在单片机分布式测控系统中,主要采用串行通信方式进行数据传输。C52单片机自备串行接口,为机间通信提供了极为便利的条件。
双机通信也称点对点的通信,用于双机冗余控制单片机和单片机之间交换信息。在较大规模的测控系统中,一般采用多机系统构成分布式控制,主机主要进行管理。下位从机完成各种各样的检测控制,主机和从机间配备RS—232C、RS—422或RS—485等发送接收器以进行远距离传输。
4.5.1点对点的串行异步通信
按照图4—7的接口电路。假定A机SYSTEMl是发送者,B机SYSTEM2是接收者。当A机开始发送时,先送一个“AA”信号,B机收到后回答一个“BB”,表示同意接收。当A机收到“BB”后,开始发送数据,每发送一次求“校验和”,假定数据块长度为16个字节,数据缓冲区区为buf,数据块发送完后马上发送“校验和”。
B机接收数据并将其转贮到数据缓冲区buf,每接收到一个数据便计算一次“校验和”,当收齐一个数据块后,再接收A机发来的“校验和”,并将它与B机求出的校验和进行比较。若两者相等,说明接收正确,B机回答00H,若两者不等,说明接收不正确,B机回答0FFH,请求重发。
A机收到00H的回答后,结束发送。若收到的答复非零,则
29
将数据再重发一次。双方约定的传短波持率若为2400波特,查表可知,在双方的fosc=12.000MH2下,T1工作在定时器方式2,TH1=TL1=0F3H,PCON寄存器的SMOD位为0。 按照上述约定,发送和接收程序框图如下图4—7:
A机发送程序 B机接收程序
设串行口工作方式 等待A机联络 发请求’AA’设量波特率 设量波特率 设串行口工作方式 N 机请求发送? N N A B机允许发送? 指针初始化 发应答信号\"BB” 发送一个数据字指针初始化 N 数据块以发送完? 发送检查和 N 数据块收齐? 接收一个数据字节 N B站接收正确? 接收A机校验和并 返回 接收正确? Y N 发出错标志“FFH” 返回
30
图4—6 点对点通讯的程序框图
4.5.2多机通信的编程
机器人的控制系统由1个上位机和2个下位机组成,主控机完成机器人各个部分的协制、机器人运动策略的计算和分析,超声波测距下位机完成机器人在行走过程中对方障碍物的检测功能,以供机器人做出运动策略的分析,行走伺服下位机完成机器人行走伺服控制,包括机器人的行走、急停、转弯等。所有的处理器均采用C52单片机,各个部分通过串口多机通信来完成信息交换。
控制系统中主控机的主要任务是完成对各下位机的协制,因此其中关键的控制任务是多机通信控制,多机通信程序首先对串行口进行初始化,在需要进行通信的时候,发送需要通信的下位机的地址,由下位机确认上位机是否确实要与自己通信,然后进行软握手,就是首先由主控机再次发送一个字符串,下位机将接收到的字符串回送到上位机,当上位机接收到的字符与发送的字符一样的时候就停止发送,否则继续发送字符。[6][14]
当上位机要最新测距数据时,下位机以中断的方式向上位机发送数据。本系统在测距主程序中开串行口中断,进入中断程序后,仍采用查询方式发送数据
下面给出下位机响应串行中断程序: void rec(void) interrupt 4 using 2 { unsigned char temp;
31
static bit adr; if(RI)
{ RI=0;temp=SBUF;
If(temp==SLAVE) /*接收地址与本机相符*/ { SM2=0; /*取消监听状态*/ SBUF=temp; /*从机地址发回*/ adr=1; } else if(adr)
{ BUF=arrtl[temp]; /*向上位机发送所要求的数据*/ adr=0; SM2=1;} /*恢复监听状态*/ else {adr=0; SM2=1;}} if(TI) TI=0;} 4.6 小结
由于本课题是基于单片机开发的,所以本章一开始对单片机的编程语言进行了简单的介绍。然后针对本课题提出编程方案:采用模块化设计,整个程序的编写分主程序、发射子程序、中断接收子程序、定时子程序等模块进行。并给出主程序、外部中断和定时内部中断的程序流程图。同时根据模块化的设计方案,编写出主程序、发射子程序、中断接收子程序、定时子程序的源代码。(见附录1)。本章还对数字滤波以及C52的通信编程进行一些探讨。
32
五 机器人避障策略与路径规划
移动机器人测距的目的是为了能够有效的避开障碍物,当移动机器人在行走过程中测出障碍物距离并避开以后,机器人将不可避免的偏离原来的规划路线。怎样将实际行走路线和规划路线的误差作为反馈信号来控制机器人,使其回到规划路线上,是机器人避障策略与路径规划的重要研究内容。 5.1 常用的路径规划算法 (1)HOUGH变换
HOUGH
变换是一种特殊图像处理方法。使用HOUGH变换从
图像中提出直线形式的道路边界,并通过对比探测到的道路信息与机器人内部存储的地图,修正偏差,实现路径规划。也可以把图像分解成为目标、背景、平地、不平地等四种类型,根据分解后的结果,将环境信息归类于平原模式和目标模式(陆标形式),然后针对不同的模式采用不同的环境表示方法和导航方式,从而避免无用信息的运算。在室内环境中,可采用HOUGH变换从图像中提取墙壁等直线信息,然后通过对多个墙壁的距离实现自身的定位。在室外或环境不规整情况下,很难用墙壁或道路边界进行导航,因此HOUGH变换主要用于室内或道路的路径规划与路径控制。[17][14]
33
(2)势场法
势场法有多种形式,研究表明不管势场法以何种形式出现,其基本出发点总是把移动机器人在环境中的运动视为一种在抽象的人造受力场中的运动。目标点对移动机器人产生“引力”,障碍物对移动机器人产生“排斥力”,最后求出合力来控制移动机器人的运动。势场法实际上是对机器人运行环境的一种抽象描述。
势场法由于它的简单性和优美性一度受到很多学者的青睐,但是后来通过实验研究,发现势场法存在以下主要缺陷:存在陷阱区域,即可能产生局部极点,也就是运动过程存在合力为零的点;在相近障碍物间不能发现路径;在障碍物前震荡;在狭窄通道中摆动。 产生上述问题的原因是由于势场法(包括早期的虚力场法)把所有信息压缩为单个合力,这样就造成了把有关局部障碍物分布的有价值的信息抛弃掉的缺陷。 (3)栅格法
针对势场法的缺陷,J. Borenstein设计了一种称为VFH (Vector Field Histogram)的方法,该方法采用栅格(Grids)表示环境。由于VFH控制的移动机器人表现出良好的性能,栅格方法越来越得到人们的重视并表现出很好的发展前景。但J. Borenstein没有解决栅格方法存在着的环境分辨率与环境信息存储量大的矛盾,因此,在实用上受到一定的。 (4)遗传算法
遗传算法借用了生物遗传学的观点,通过自然选择、遗传、变异
34
等作用机制,实现各个个体的适应性的提高。这一点体现了达尔文进化论中“物竞天择、适者生存”的自然选择过程。遗传算法是建立在自然选择和群体遗传学基础之上的随机、迭代、进化,具有广泛适用性的搜索方法。所有的自然种类都是适应环境而得以生存的,这一自然适应性是遗传算法的主旋律。遗传算法结合了适者生存和随机信息交换,前者消除了解中不适应因素,后者利用了原有解中己有的知识,从而有力的加快了搜索和优化过程。
与传统的优化算法相比,遗传算法具有以下特点:处理的是参数集合的编码,而非参数本身,即其操作是在给定的字符串上进行的;遗传算法是同时搜索解空间中许多点,而不在一个单点上进行寻优,因而能够快速全局收敛;遗传算法只需一个适应性函数(性能指标),而不需要其它任何先决条件或辅助信息,因而具有极强的鲁棒性和广泛的适应性;遗传算法是采用概率规则来指导它的搜索方向,而非确定性规则,因而它能搜索离散的、有噪声的多峰值复杂空间;遗传算法具有并行计算的特点,因而可通过大规模并行计算来提高计算速度。[14][17]
根据对以上四种路径规划的比较,把遗传算法应用到机器人避障领域具有很大的应用价值。
5.2 模糊规则与遗传算法相结合的路径规划
首先,移动机器人按照规划系统所规定的路径,向目标点方向前进,假设移动机器人的起始点、目标点和障碍物的位置已知,当移动机器人遇到障碍物时,反馈系统,即以遗传算法设计的避障模糊控制
35
器,复杂做避障运动,等到避障成功后,继续执行规划系统预先规划的路径,并到达目标点为止。所以,规划系统预先规划移动机器人从起始点到目标点的路径,若中间没有障碍物,最短的路径为一条直线,而反馈系统提供适应性的行为模式,只能做区域的最佳化路径,而无法提供全局最优化路径。本章结合规划系统和反馈系统的优缺点,提出模糊规则与遗传算法相结合的路径规划算法。遗传算法通过调整避障模糊控制器的参数,包括模糊规则,模糊隶属函数的低端参数、范围,以及加入染色体遗传基因,并由适应度函数的计算,比较适应度,搜索最佳染色体,并得到最佳避障模糊控制器。 5.3 以遗传算法设计最佳避障模糊控制器
(1)遗传验算法参数编码
遗传算法,具有处理多目标或多变量最优化问题的能力,本文便依次理念来设计最佳模糊避障控制器,搜索参数包括:
②隶属函数的底端参数
首先,对于三角形模糊隶属函数25个底端参数进行编码,分别为(a)输入变量1:Dco(移动机器人前端到障碍物边缘的距离)-a1、a2、a3、a4、a5;(b)输入变量2:Ae(移动机器人分别与障碍物及目标点的角度差)-b1、b2、b3、b4、b5;(c)输出变量:(phi)(移动机器人的转角)-c1、c2、c3、c4、c5;图5—1(a)~(c)为隶属函数底端参数编码图。
36
Dco1MSSMLMLDco0a1a2a3a4a58
(a) 输入Dco
Ae1NBNSZOPSPBAe0-90b1b2b3b4b590
(b) 输入Ae
1GNBGNSGMGPSGPBphi0-45c1c2c3c4c5+45
输出量(phi)
图5—1模糊隶属函数底端参数编码图
②模糊控制器的规则库
为了突出遗传算法具有处理多目标或多变量最优化的能力,我们取25个不规则的数,以一个非对称的模糊规则表进行搜索和参数编码,表5—1为遗传算法初始调整模糊规则表
DcoAeMSSMLMLNBNSZOPSPBGMGNSGNBGNBGNBGPSGMGNSGNSGNBGPBGPSGMGNSGNBGPBGPSGPSGMGNSGPBGPBGPSGMGNB
37
其中定义NB=1、NS=2、ZO=3、PS=4、PB=5,所以表由左至右(MS到ML)由上到下(NB到PB)依序编码为[3 2 1 1 1 4 3 2 2 1 5 4 3 2 1 5 4 4 3 2 5 5 4 3 1]
③基因算子
基因算子分别为(a)输入变量1(Dco):移动机器人前端到障碍物的距离,定义为Sdco,(b)输入变量2(Ae):移动机器人分别与目标点,障碍物的角度,取其角度差,定义为SAe,(c)输出变量(phi):移动机器人的转角,定义为Stheta;以上三个基因算子的初始值设为1。 所以,调整参数(1)模糊规则25个 (2)模糊隶属函数底端参数15个 (3)基因算子3个,供有43个调整参数,即为遗传算法的染色体长度,遗传算法根据制定的适应函数,修正以上43个欲调整的参数。
[12][16]
模糊规则DcoAe基因算子255553
图 5-2 染色体调整参数编码图
(2)定义适应函数
利用遗传算法作路径规划,必须先决定适应度函数,这样才能评估子代的适应度,决定其被选择的概率。本文的路径规划要求机器人不能碰撞到障碍物,并使得路径越短越好,所以这个问题为路径最短问题,路径越短,其适应度越高。本文的基因的选择使用轮盘法来实现,适应度越高,被选择的概率越大;编码方式采用二进制码,将需学习的部分加以编码。定义的适应函数如下
38
fit100(dcobcow)
fit:适应度 d:总路径
cob:碰撞到障碍物的系数 cow:碰撞到墙的系数
适应函数说明:(a)为了说明最短路径问题,考虑总路径长d,作为选择路径的标准,总路径长越短时,适应度就越大,越符合设计要求。
考虑到障碍物,设定障碍物碰撞系数cob作为移动机器人撞到障碍物的判断方式,取障碍物半径ro作为碰撞的标准,当移动机器人与障碍物的距离(Dco)小于障碍物半径时,Dco 39 传算法本身的一些理论。首先就模拟规划与遗传算法相结合提出路径规划算法,用遗传算法设计最佳避障模糊控制器包括遗传算法的参数编码和定义其适应函数。 六 总结 本超声波系统设计是基于ATC52单片机开发的,利用单片机知识和电子电路知识相联系来实现整个系统。由于系统较大,本课题设计分两个方面进行,即软件方面和硬件方面,但两方面并不是进行的,只是侧重点不同,在本文中,对硬件电路的设计只是进行了简单的描述,着重进行软件编程和一些优化算法的研究。在软件实现上采取模块化进行,分别设计了主程序、发射子程序、中断接收子程序、定时子程序(显示子程序)等。为了使系统稳定,必须对接收的超声波进行数字滤波,本文分析了当前运用比较广泛的滤波方法如程序判断滤波、中值滤波、算术平均值滤波以及滑动平均值滤波法,比较几种滤波法的优缺点,结合本设计的运用情况最后决定本设计的滤波方法——复合滤波法。 由于设计是基于C52单片机进行的,在设计过程中查阅了大量的有关ATC52单片机的知识,因此,通过本设计使我对C52单片机的结构特点,引脚功能有了深刻的了解, 熟练了C51语言的编程。同时还学到了有关数字滤波,8051机间的通信编程。通过本次设计对还时间渡越法测距机理有了一定的了解即通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差t,然后根据计算得出距离信息。 40 在设计过程中,我们也遇到了很多困难,在硬件方面由于之前没有接触过超声波传感器,不知道其工作原理对于超声波的产生、发射和接收不了解。因而刚开始设计进程很慢,后来通过各种渠道比如到图书馆查阅相关资料、上网等才把其弄懂。后来由于超声波的发射与接收都是同一个传感器,发射超声波的时候,使单片机系统误认为已经接收到回波,即串扰问题,因此,也花了很长的时间和精力,在指导老师的精心指导下,得以把串扰问题解决。 在软件方面,程序的编写分模块进行,因而在中断响应之后调用子程序的调用过程中由于置位的不规范是程序很多次陷入死循环,后来在老师和同学的帮助下,对程序进行逐条运行调试,找出问题,从而得到了解决。而C语言又不能直接在伟福软件上编译,这样还得再对可以编译C语言的Keil软件进行学习,由于原来的程序内容稍大,在ATC51上产生溢出,C2051就更不用说了,所以只有采用ATC52芯片了,最后编写的C语言其编译还是成功的,只是和硬件的调试上出点误差罢了。 41 致谢 此次毕业设计是我大学四年的总结,也是我走出校门前的一次实战演习,我的感受也是很多的。在此首先谢谢学校给我这个锻炼的机会,让我对所学知识得到近一步巩固。但也让我认识到自己还有许多要努力改进的地方!这次设计也锻炼了我的自学能力,我懂得了在困难面前,不要轻易放弃,而是要去积极的面对。同时,我还学到了团队合作的重要性。 再则感谢我的指导老师,在整个设计的过程中我们遇到了很多的麻烦,杨老师都很有耐心的给我们讲解,帮我们分析对策,问题也大都迎刃而解。 最后感谢在设计过程中给我们以帮助的所有老师和同学! 42 参考文献 [1] 杰 .单片微机原理及应用[M] .上海:机械工业出版社,1999 [2] 房小翠 .单片微型计算机与机电接口技术[M].北京:国防工业出版社,2002 [3] 谭福年 .常用传感器应用电路[M].四川:电子科技大学出版社,1996 [4] 赵负图 .现代传感器集成电路[M].北京:人民邮电出版社,2000 [5] 赵守忠 夏勇 .传感器技术及其应用[M].合肥:中国科学技术大学出版社,1997 [6] 何希才 张薇 .传感器应用及其接口电路[M].北京:科学技术文献出版社,1996 [7] 徐爱钧.单片机高级语言C51Windows环境编程及应用[M] .北京:电子工业出版社,2001 [8] 谭浩强 . C语言程序设计[M] .北京:清华大学出版社,1999 [9] 谢剑英,贾青. 微型计算机控制技术[M]. 北京:国防工业出版社,2001 [10] 孙传友,孙晓斌等. 测控系统原理与设计[M]. 北京:北京航空航天大学出版社,2002 43 [11] 郑人杰等. 软件工程[M]. 北京. 清华大学出版社,1999 [12] 翟国富,刘茂恺. 一种实时高精度的机器人用超声波测距处理方法[J]. 应 用声学, 1990 [13] 崔小燕。AT系列高性能单片机系列及其应用。1996年出版。 [14] 孙传友,孙晓斌等. 测控系统原理与设计. 北京:北京航空航天大学出版社,2002年出版 [15] 苏长赞。红外线与超声波遥控。人民邮电出版社出版。2002年出版 [16] 王和明,刘嵘。AT系列单片机及其编程。1993出版 [17] 李华等。MCS-51系列单片机系统及其应用。北京高等教育出版社出版。2003年出版。 [18] 袁易全.近代超声原理及应用[M].南京:南京大学出版社,1996 [19] 严宏,宋进,陈敏贤. 超声波测距在智能机器人中的开发与应用[J]. 机电一体化, 2001(1) [20] Microcontroller Handbook . Intel Corporation . 1 [21] Ron Patton. Software Testing[M]. 北京. 机械工业出版社,2002 外文翻译文件: Christopher C. Yang, Jerome Yen, Hsinchun Chen. Intelligent internet searching agent based on hybrid simulated annealing[J], Decision Support Systems, 28(2000), 269–276 44 附录1 程序源代码 初始化主程序 #include #define address 0xf3//定义本机的地址为0xf3**************** sbit KEY=P0^0; sbit DATAB=P0^1; sbit WRPIN=P0^2; sbit CSPIN=P0^3; sbit OPCON1=P0^4; sbit INH1=P0^5; sbit SEL1B=P0^6; sbit SEL1A=P0^7; sbit VOLS=P1^0; sbit VOLL=P1^1; 45 sbit VOLM=P1^2; sbit VOLCON=P1^3; sbit output=P2^4; sbit SDA=P2^6; sbit SCL=P2^7; void datadeal(void); unsigned char MID(void); void storedata(void); void initialize(void); unsigned char recievemessage(void); unsigned char sendmessage(unsigned char ssbuf); unsigned int Tlength; unsigned char idata temp1[4][3],temp2[4][3]; bit flg,flga,flgb,flag1,syma,symb,flgnum,clrscr,symvol,symbig,fg1,fg2,fg3,fg4; uchar step,len,slen,bufvol,dis,voldata,keydata,ssbuf,n,m; //uchar TL; uchar i,j,k,a,b,c; uchar data array[6]={0x00,0x00,0x00,0x00,0x00,0x00}; uchar data thdata[4],tldata[4]; uchar data rhdata[4],rldata[4]; 46 uchar bdata rsbuf; sbit rsbuf0=rsbuf^0;sbit rsbuf1=rsbuf^1;sbit rsbuf2=rsbuf^2;sbit rsbuf3=rsbuf^3; sbit rsbuf4=rsbuf^4;sbit rsbuf5=rsbuf^5;sbit rsbuf6=rsbuf^6;sbit rsbuf7=rsbuf^7; ——————————————这里主要是对各位进行初始化设置和定义 数位左移循环自程序 void turn(uchar k,uchar RR7) /*数位左移循环子程序*/ {uchar i; for(i=k;i>0;i--) {if((RR7&0x80)==0x80) {DATAB=1;DATAB=1; } else {DATAB=0;DATAB=0; } WRPIN=0; WRPIN=0; WRPIN=0; WRPIN=1; RR7=RR7<<1; 47 } return;} void turn1(uchar k,uchar RR7) /*数位左移循环子程序1*/ {uchar i; for(i=k;i>0;i--) {if((RR7&0x80)==0x80) {DATAB=1;DATAB=1; } else {DATAB=0;DATAB=0; } WRPIN=0; WRPIN=0; WRPIN=0; WRPIN=1; WRPIN=1; WRPIN=1; RR7=RR7<<1; } return; } void turn2(uchar k,uchar RR7) 48 /*数位左移循环子程序2*/ {uchar i; for(i=k;i>0;i--) {if((RR7&0x80)==0x80) {DATAB=1;DATAB=1;DATAB=1;} else {DATAB=0;DATAB=0;DATAB=0;} WRPIN=0; WRPIN=0; WRPIN=0; WRPIN=1; WRPIN=1; RR7=RR7<<1; } return; } —————————————————— 液晶显示子程序 void LCDCM(uchar LCDMM) /*液晶显示命令传送子程序*/ {//uchar i; CSPIN=0; turn(3,0x80); turn1(8,LCDMM); 49 DATAB=0; DATAB=0; WRPIN=0; WRPIN=0; WRPIN=0; WRPIN=1; WRPIN=1; WRPIN=1; CSPIN=1; CSPIN=1; CSPIN=1; DATAB=1; return; } void WRCOM(uchar RR4,uchar RR5) using 3 /*液晶显示数据传送子程序*/ {uchar i; CSPIN=0; /*P2_0连接液晶的片选接口CSPIN*/ turn1(3,0xA0); RR4=RR4<<2; turn2(6,RR4); for(i=4;i>0;i--) 50 {if((RR5&0x01)==0x01) /*P2_2连接的是液晶接口DATAB*/ {DATAB=1;DATAB=1; } else {DATAB=0;DATAB=0;} WRPIN=0; WRPIN=0; /*P2_1连接的是液晶接口WRPIN*/ WRPIN=0; WRPIN=1; WRPIN=1; RR5=RR5>>1; } CSPIN=1; DATAB=1; return; } uchar DISSUB(uchar RR1,uchar RR2,uchar RR4,uchar j) /*显示内容译码子程序*/ {uchar RR5,RR6,LCDFLG; uchar arr1[17]={0xBE, 0x06, 0x7C, 0x5E, 0xC6, 0xDA, 0xFA, 0x0E, 0xFE, 0xDE, 0xEE, 0xF2, 0xB8, 0x76, 0xF8, 0xE8, 0x00}; /*数字0-9的显示字库*/ 51 uchar arr2[16]={0xBF, 0x07, 0x7D, 0x5F, 0xC7, 0xDB, 0xFB, 0x0F, 0xFF, 0xDF, 0xEF, 0xF3, 0xB9, 0x77, 0xF9, 0xE9 }; /*数字0-9的带点显示字库*/ if(RR1>4) /*R1>4时为无须译码的汉字和符号内容*/ { RR5=j&0x0F; /*将无须译码的数据送显示*/ WRCOM(RR4,RR5); /*R5为显示内容的低半字节*/ RR4+=1; RR6=j>>4; WRCOM(RR4,RR6); /*R6为显示内容的高半字节*/ RR4+=1; } else { if(RR2==0) { RR2=LCDFLG; if(RR2==0) { if(RR4<12) RR2=19; else { if(RR4>12) { LCDFLG=1;RR2=3; } else { LCDFLG=1;RR2=20;} } 52 } else {LCDFLG=1;RR2=2; if(RR4==12) RR2=20; else RR2=3; } } else {LCDFLG=1; RR2+=2; if(RR4==12) RR2+=18; else RR2+=1; } if(RR2<20) RR2=arr1[RR2-3]; else RR2=arr2[RR2-20]; RR5=RR2>>4; /*将已译码的数据送显示*/ WRCOM(RR4,RR5); RR4+=1; RR6=RR2&0x0F; WRCOM(RR4,RR6); RR4+=1; } return(RR4); } 53 /*---------------------------*/ void DISPLAY(void) /*显示子程序*/ {uchar RR0,RR1,RR2,RR3,RR4,j; /*R0为显示数组array的变量,R1为显示内容个数的类减值,R4为累加值*/ RR0=0; RR1=0x06; RR4=0; LCDCM(0x01); LCDCM(0x03); LCDCM(0x18); LCDCM(0x29); while(RR4<3) /*R4<3时显示的内容是符号和汉字*/ {j=array[RR0]; RR4=DISSUB(RR1,RR2,RR4,j); RR0+=1; RR1-=1; } while(RR1!=0) /*R4>3时显示的内容是数字*/ { j=array[RR0]; RR3=j&0x0F; /*R3为显示内容的低半字节*/ RR2=j>>4; /*R2为显示内容的高半字节*/ RR4=DISSUB(RR1,RR2,RR4,j); /*R2为显示的示 54 高半字节*/ RR2=RR3; /*再显示低半字节*/ RR4=DISSUB(RR1,RR2,RR4,j); RR0+=1; RR1-=1; } return; } 发波程序 void sendwave(){ IT1=1; ET1=1; EX1=0; TR0=0; TR1=0; flgb=0; OPCON1=0; TH0=TL0=0; TH1=0x80; TL1=0; TR0=1; TR1=1; 55 for(i=0;i<15;i++) { output=0; output=0; output=0; output=0; output=0; output=0; output=0; output=0; output=0; output=0; output=0; output=0; output=0; output=1; output=1; output=1; output=1; output=1; output=1; output=1; output=1; 56 output=1; output=1; //output=1; //output=1;} delay(16); IE1=0; EX1=1; OPCON1=1; return; //-----------------------------------------选择通道 void multi_sel() { if(step==2) { step=0;len++;} if( len==4 ) { len=0;} if(syma) { syma=0;step=0; } switch(len) { case 0: SEL1A=0;SEL1B=0; break; case 1:SEL1A=1;SEL1B=0; break; 57 case 2:SEL1A=0;SEL1B=1; break; case 3:SEL1A=1;SEL1B=1; break;} if(len==0&&step==1) symb=1; return; } 接收程序 //-----------------------接受到反射波进入int1 void int1() interrupt 2 using 2 { EX1=0; TR0=0; TR1=0; thdata[len]=TH0; tldata[len]=TL0; flgb=1; } //----------------------timer1定时0x8000 void timer1() interrupt 3 using 2 { TR0=0; TR1=0; TH0=0;TL0=0; 58 IE1=1;} //------------------------------------- void main() { initialize(); while(1) { multi_sel(); sendwave(); while(!flgb); flgb=0; storedata(); //temp1=thdata step++; if(symb) { m=MID();//找出中值 thdata[0]=temp1[slen][m]; tldata[0]=temp2[slen][m]; datadeal(); array[4]=thdata[0]; tldata[0]=tldata[0]&0xf0; array[5]=tldata[0]; Tlength=array[5]/16+(array[4]/16)*100+(array[4]%16)*10;//处理成 十进制数据传送到上位机 59 if (Tlength==0||Tlength>0xff)ssbuf=0xff; else ssbuf=Tlength; DISPLAY(); flgb=0; n=m=0; syma=1; symb=0;} } —————————— 数据处理程序 //数据处理程序,将时间转换成距离,并用码)输出 void datadeal(void) { unsigned long a1; a1=thdata[0]*256+tldata[0]; if (a1>0x8000) flga=1; a1=a1*34/20; a1=a1/10; thdata[0]=(a1/1000)*16+(a1%1000)/100; tldata[0]=((a1%100)/10)*16+(a1%10); } //--------------------------保存timer0的数据 60 进制(bcd16void storedata(void) { temp1[len][step]=thdata[len]; temp2[len][step]=tldata[len]; } 中值滤波处理程序 -----------------------中值滤波处理程序 unsigned char MID(void) { if(temp1[slen][0]==0) {return(1);} else{return(0);} } void initialize(void) {// SCON=0XB8; // PCON=0X80; INH1=0; TMOD=0x11; TCON=0; EA=1; flgb=0; flag1=0; fg3=0; 61 fg4=1; syma=1; slen=len=step=0; array[4]=0x02; array[5]=0x34; DISPLAY(); // PCON=0X80; SCON=0xe0; //SM0,SM1,SM2,REN,TB8,RB8,TI,RI 串口设置 T2CON=0x30; //TF2,EXF2,RCLK,TCLK,EXEN2,TR2,CT2,CP//串口波特率设置 TH2=RCAP2H=0xff; TL2=RCAP2L=0xfb; //设置波特率75k=12M/32/5 TR2=1; //启动定时器2,即波特率发生器 SM2=1; //开地址校验 REN=1; ES=1;} void int_serial() interrupt 4 using 1 { //serial interrupt if(RI){ //receive something //串口接收使能 RI=0; rsbuf=SBUF; if(RB8){ //地址码 62 } } if(rsbuf==0x10){ //my address TB8=1; SBUF=ssbuf;} if(TI){ //send something ok TI=0;}}/********** 63 附录2 硬件原理图 1234DDD5C1D1DIODEVin1Vin2D3DIODED4DIODED2DIODEC3C1ELECTRO1CAPU17808VinCIN4148Vout3VSSGNDC4ELECTRO1D6U27805IN4148GNDB12VinVout3VCCBC2CAPC5ELECTRO1A2A1234 4123+812S0DS143TRANS4R210k21R310kD1Re0D2+5DR410kJP1C110ufP1.0P1.1P1.2P1.3OUTPUT1P1.4OPCON1P1.5SEL1BP1.6SEL1AP1.7RSTP3.0P3.1P3.2INT1P3.3P3.4P3.5P3.6P3.7XTAL2XTAL1GND12345671011121314151617181920ATC524039383736353433323130292827262524232221+5VCC1kECR1T1B8050CON101+8C4S01S22R7S_com3S342kT2OUTPUT1S15B8050INH1678R54.7kR6560U3Y0Y2Y_CY3Y1INHVEEVSSCD4052VDDX2X1X_CX0X3AB161514131211109220u+8L1103Re2Re1Re_comRe0Re3SEL1ASEL1BECCC210pCRY212MCC310pR8BRe_com102C5675TL084R91kR101kC6220U1MU1BR112k102C8R12200C7102R22R1362kU1C98R192kTL084C10131410312102TL084C90.015R15R2010kC123TL084W120kU1DC11D72U1A1R232kR242kINT147C13100uC14104B10+8R17020k102R21D8120k4R1420k11C15R2547100uECR174.7kOPCON1+8R181M+8C16104AAT38050B1234
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务