资源描述
课 程 设 计
课程名称
单片机课程设计
题目名称
超声波测距系统
专业班级
11电子信息工程本科3班
学生姓名
尹津
学 号
51101033009
指导教师
刘国永
二○一四年三月二十八日
目 录
摘 要 1
第一章 设计任务书 2
1.1 基于单片机的超声波测距系统 2
第二章 系统总体设计 3
2.1 超声波发生器 3
第三章各部分功能设计 5
3.1 超声波测距系统构成 5
3.2 单片机系统及显示电路 6
3.3 串口通信模块 7
3.4 超声波发射电路 7
3.5 超声波接收电路 8
3.6 语音播报模块 8
第四章 系统软件设计 9
4.1 编程软件及语言的选择 9
4.2 程序设计 9
第五章 系统调试 11
第六章 结 论 12
附录一: 单片机超声波测距系统原理图 13
附录二: PCB图 14
附录三: 单片机超声波测距系统C语言原程序 14
附录四: 元件清单 24
参 考 文 献 25
摘 要
本设计介绍了基于单片机控制的超声测距仪的原理:由AT89C52控制定时器产生超声波脉冲并计时,计算超声波自发射至接收的往返时间,从而得到实测距离。并且在数据处理中采用了温度补偿的调整,用四位LED数码管切换显示距离和温度。
整个硬件电路由超声波发射电路、超声波接收电路、电源电路、显示电路等模块组成。各探头的信号经单片机综合分析处理,实现超声波测距仪的各种功能。在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。相关部分附有硬件电路图、程序流程图,给出了系统构成、电路原理及程序设计。此系统具有易控制、工作可靠、测距准确度高、可读性强和流程清晰等优点。实现后的作品可用于需要测量距离参数的各种应用场合。目前在近距离测量方面较为常用的是压电式超声波换能器。根据设计要求并综合各方面因素,本例决定采用AT89C52单片机作为主控制器,用动态扫描法实现LED数字显示,声波驱动信号用单片机的定时器完成。本文所设计的超声波测距仪主要由AT89S52单片机、超声波发射电路、超声波接收放大电路、显示电路. 首先由单片机驱动产生12MHZ晶振,由超声波发射探头发送出去,在遇到障碍物反射回来时由超声波接收探头检测到信号,然后经过滤波、放大、整形之后送入单片机进行计算,把计算结果输出到LED液晶显示屏上。超声波发生器可以分为两大类:一类是用电气方式产生超声波;另一类是用机械方式。产生超声波。电气方式包括压电型、电动型等;机械方式有加尔统笛、液和气流旋笛等。它们所产生的超声波的频率,功率和声波特性各不相同,因而用途也各不相同。目前在近距离测量方面较为常用的是压电式超声波换能器。根据设计要求并综合各方面因素,本例决定采用AT89C52单片机作为主控制器,用动态扫描法实现LED数字显示,声波驱动信号用单片机的定时器完成。超声波测距器系统设计如图1.1所示
图1.1 整体框图
第一章 设计任务书
1.1 基于单片机的超声波测距系统
基于单片机的超声波测距系统,是利用单片机编程产生频率为40kHz的方波,经过发射驱动电路放大,使超声波传感器发射端震荡,发射超声波。超声波波经反射物反射回来后,由传感器接收端接收,再经接收电路放大、整形,控制单片机中断口。其系统框图如图2-1所示。
数字显示
功能键
单片机
发射驱动
接受处理
图1-1 基于单片机的超声波测距系统框图
本系统利用单片机控制超声波的发射和对超声波自发射至接收往返时间的计时。系统定时发射超声波,在启动发射电路的同时启动单片机内部的定时器,利用定时器的计数功能记录超声波发射的时间和收到反射波的时间。这种以单片机为核心的超声波测距系统通过单片机记录超声波发射的时间和收到反射波的时间。通过超声波发射器向某一方向发射超声波,单片机在发射时刻同时开始计时,超声波在空气中传播,途中碰到障碍物就立即反射回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为V,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离。
当收到超声波的反射波时,接收电路输出端产生一个负跳变,在单片机的外部中断源输入口产生一个中断请求信号,单片机响应外部中断请求,执行外部中断服务子程序,读取时间差,计算距离,结果输出给LED显示。
利用单片机准确计时,测距精度高,而且单片机控制方便,计算简单。许多超声波测距系统都采用这种设计方法。
第二章 系统总体设计
超声波是由机械振动产生的,可在不同介质中以不同的速度传播。由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。特别是应用于空气测距,由于空气中波速较慢,其回波信号中包含的沿传播方向上的结构信息很容易检测出来,具有很高的分辨力,因而其准确度也较其它方法为高;而且超声波传感器具有结构简单、体积小、信号处理可靠等特点。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求。
超声波测距的方法有多种,如相位检测法、声波幅值检测法和渡越时间检测法等。相位检测法虽然精度高,但检测范围有限; 声波幅值检测法易受反射波的影响。
本测距系统采用超声波渡越时间检测法。其原理为: 检测从超声波发射器发出的超声波,经气体介质的传播到接收器的时间,即渡越时间。渡越时间与气体中的声速相乘,就是声波传输的距离。超声波发射器向某一方向发射超声波,在发射时刻的同时单片机开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。再由单机计算出距离,送LED数 码管显示测量结果。
超声波在空气中的传播速度随温度变化,其对应值如表2-1 ,根据计时器记录的时间t (见图2-1),就可以计算出发射点距障碍物的距离( s ) ,即: s = v t / 2 。
表2-1 声速与温度的关系
温度(℃)
-30
-20
-10
0
10
20
30
100
声速(m/s)
313
319
325
323
338
344
349
386
2.1 超声波发生器
为了研究和利用超声波,人们已经设计和制成了许多超声波发生器。总体上讲,超声波发生器可以分为两大类: 一类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等; 机械方式有加尔统笛、液哨和气流旋笛等。它们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。目前较为常用的是压电式超声波发生器。压电型超声波传感器的工作原理:它是利用压电效应的原理,压电效应有逆效应和顺效应,超声波传感器是可逆元件,超声波发送器就是利用压电逆效应的原理。所谓压电逆效应如图2-2所示,是在压电元件上施加电压,元件就变形,即称应变。若在图a所示的已极化的压电陶瓷上施加如图b所示极性的电压,外部正电荷与压电陶瓷的极化正电荷相斥,同时,外部负电荷与极化负电荷相斥。由于相斥的作用,压电陶瓷在厚度方向上缩短,在长度方向上伸长。若外部施加的极性变反,如图c所示那样,压电陶瓷在厚度方向上伸长,在长度方向上缩短。
图2-2压电逆效应图
单片机AT89S51发出短暂的40kHz信号,经放大后通过超声波换能器输出;反射后的超声波经超声波换能器作为系统的输入,锁相环对此信号锁定,产生锁定信号启动单片机中断程序,读出时间t,再由系统软件对其进行计算、判别后,相应的计算结果被送至LED数码管进行显示。
限制超声波系统的最大可测距离存在四个因素:超声波的幅度、反射物的质地、反射和入射声波之间的夹角以及接收换能器的灵敏度。接收换能器对声波脉冲的直接接收能力将决定最小可测距离。
开始测量
超声波信号
开定时器
关定时器
数据运算
显示器
接收检测
电声换能器
电声换能器
驱动电路
图2-2 超声波测距系统框图
第三章各部分功能设计
按照系统设计的功能的要求,初步确定设计系统由单片机主控模块、显示模块、超声波发射模块、接收模块共四个模块组成。
单片机主控芯片使用51系列AT89S51单片机,该单片机工作性能稳定,同时也是在单片机课程设计中经常使用到的控制芯片。发射电路由单片机输出端直接驱动超声波发送。
接收电路使用三极管组成的放大电路,该电路简单,调试工作小较小硬件电路的设计主要包括单片机系统及显示电路、超声波发射电路和超声波接收电路、报警输出电路、供电电路等几部分。单片机采用AT89S51,系统晶振采用12MHz高精度的晶振,以获得较
单片机用P2.7端口输出超声波换能器所需的40kHz的方波信号,P3.5端口监测超声波接收电路输出的返回信号。显示电路采用简单实用的3位共阳LED数码管,段码输出端口为单片机的P2口,位码输出端口分别为单片机的P3.4、P3.2、P3.3口,数码管位驱运用PNP三极管S9012三极管驱动。
3.1 超声波测距系统构成
本系统由单片机AT89S51控制,包括单片机系统、发射电路与接收放大电路和显示电路几部分组成,如图3-1 。硬件电路的设计主要包括单片机系统及显示电路、超声波发射电路和超声波接收电路三部分。单片机采用AT89S51。采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。单片机用P2.7端口输出超声波换能器所需的40kHz的方波信号,P3.5端口监测超声波接收电路输出的返回信号。显示电路采用简单实用的3位共阳LED数码管,段码输出端口为单片机的P2口,位码输出端口分别为单片机的P3.4、P3.2、P3.3口,数码管位驱运用PNP三极管S9012三极管驱动。
超声波接收模
超声波发射模
单片机控制统
(AT89S51)
显示模块
键盘模块
供电单元
图3-1:系统设计框
超声波接收头接收到反射的回波后,经过接收电路处理后,向单片机P3.5输入一个低电平脉冲。单片机控制着超声波的发送,超声波发送完毕后,立即启动内部计时器T0计时,当检测到P3.5由高电平变为低电平后,立即停止内部计时器计时。单片机将测得的时间与声速相乘再除以2即可得到测量值,最后经3位数码管将测得的结果显示出来。
3.2 单片机系统及显示电路
1. 单片机系统
单片机采用89S51或其兼容系列。采用12MHz高精度的晶振,以获得较稳定的时钟频率,减小测量误差。单片机用P1.0端口输出超声波转化器所需的40KHz方波信号,利用外中断0口检测超声波接受电路输出的返回信号。显示电路采用简单实用的4位共阳LED数码管,段码用74LS245驱动,位码用PNP三极管驱动。单片机系统如下图所示
图3-2:单片机系统
2. 显示电路原理
通过单片机的P0.0——P0.7、RST、P3.0——P3.7、X1、X2、GND与跳线帽连接控制液晶显示器的显示。12864液晶显示器可显示32个汉字或64个字母可满足要求输出的内容。显示电路原理图如下所示:
图3-3:显示电路
3.3 串口通信模块
串口通信电路是TTL和RS232电平互换的电路,串口通信电路是使用MAX232芯片实现,该芯片有电源接口和两组串口通信转换端口。C4、C5、C7、C8组成电荷泵,提供单片机内部升压;C6是滤波电容,其作用是滤除电路的杂波是芯片工作稳定及防止外部电源不稳定烧坏单片机。MAX232芯片的作用是将单片机输出的TTL电平转换成PC机能接受的RS232电平。5、6引脚的功能是为了产生正负12V的电源,提供给MAX232的点评需要,7、8、9、10、11、12、13、14构成两个数据通道。
图3.4 超声波发射电路
3.4 超声波发射电路
单片机P36端输出的40kHZ方波信号一路经一级反向器后送到超声波换能器的一个电极。另一级经过两级反向器送到超声波换能器的另一个电极。用这种推挽形式将方波信号加到超声波换能器两端。可以提高超声波发射强度。输出端采用两个反向器并联。用以提高驱动能力。上拉电阻R27、R30一方面提高反向器74HC04输出高电平的驱动能力。另一方面可以增加超声波换能器的阻尼效果缩短其自由振荡的时间。如图
图3.5 超声波发射电路
3.5 超声波接收电路
CX20106A是采用一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。考虑到红外遥控常用的载波频率38Hz与测距的超声波频率40Hz较为相近所以可以利用它来制作超声波检测接收电路。J31中插入CX20106A,使用CX20106A集成电路对接收探头收到的信号进行放大、滤波。其总放大增益为80db。
图3.6 超声波接收电路
3.6 语音播报模块
WT588D有三种控制模式,分别是按键控制模式、一线串口控制模式及三线串口控制模式,按键控制模式触发方式灵活,可随意设置任意按键为脉冲可重复触发、脉冲不可重复触发、无效按键、电平保持不可循环、电平保持可循环、电平非保持可循环、上一曲不循环、下一曲不循环、上一曲可循环、下一曲可循环、音量+、音量-、播放/暂停、停止、播放/停止等 15 种触发方式。一线串口控制模式及三线串口控制模式可通过单片机来控制WT588D的语音播放、停止、循环播放和音量大小,或者直接触发 0~219 地址位的任意语音。
图3.7 语音播报
第四章 系统软件设计
4.1 编程软件及语言的选择
51编程软件可以使用Keil uVision3或Keil uVision4进行程序编程及仿真。Keil C 51软件是众多单片机应用开发的优秀软件之一。它集编辑,编译,仿真于一体。支持汇编,PLM语言和C语言的程序设计,界面友好,易学易用,具体用法在实训过程中已详细讲述及学习。
编程语言一般都是用C语言编程。C语言是编译型程序设计语言,兼顾高级语言的特点,并具备汇编语言的功能。C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外,C语言程序具有完善的模块程序结构。C语言执行效率没有汇编语言高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好的可重用性,可移植性等特点。基于C语言的众多优点本设计选择此语言来编程。此外,还可以使用汇编语言,C++等语言来进行编程。
4.2 程序设计
超声波测距的软件设计主要由主程序、超声波发生子程序、超声波接收程序及显示子程序组成。超声波测距的程序既有较复杂的计算(计算距离时),又要求精细计算程序运行时间(超声波测距时),所以控制程序可采用C语言编程。
主程序首先是对系统环境初始化,设定时器0为计数,设定时器1定时。置位总中断允许位EA。进行程序主程序后,进行定时测距判断,当测距标志位ec=1时,测量一次,程序设计中,超声波测距频度是4-5次/秒。测距间隔中,整个程序主要进行循环显示测量结果。超声波测距器的制作和调试都较为简单,其中超声波发射和接收采用ø15的超声波换能器TCT40—10F1(T发射)和TCT40—10S1(R接收),中心频率为40KHz,安装时应保持两换能器中心轴线平行并相距4~8cm,其余元件无特殊要求。若能将超声接收电路用金属壳屏蔽起来,则可提高抗干扰性能。根据测量范围要求不同,可适当地调整与接收换能器并接的滤波电容C4的大小,以获得合适的接收灵敏度和抗干扰能力。
硬件电路制作完成连接并调试好后,便可用Keil uVision3将程序编译好下载到单片机试运行。根据实际情况可以修改超声波发生子程序每次发送的脉冲宽度和两次测量的间隔时间,以适应不同距离的测量需要。根据所设计的电路参数和程序,测距仪能测的范围为0.10~5.00m,测距仪最大误差不超过1cm。系统调试完后应对测量误差和重复一致性进行多次实验分析,不断优化系统使其达到实际使用的测量要求。
当调用超声波测距子程序后,首先由单片机产生4个频率为38.46kHz超声波脉冲,加载的超声波发送头上。超声波头发送完送超声波后,立即启动内部计时器T0进行计时,为了避免超声波从发射头直接传送到接收头引起的直射波触发,这时,单片机需要延时约1.5 -2ms时间(这也就是超声波测距仪会有一个最小可测距离的原因,称之为盲区值)后,才启动对单片机P3.5脚的电平判断程序。当检测到P3.5脚的电平由高转为低电平时,立即停止T0计时。由于采用单片机采用的是12 MHz的晶振,计时器每计一个数就是1μs,当超声波测距子程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按式(2)计算,即可得被测物体与测距仪之间的距离。
其中当障碍物与超声波模块的距离S>2000cm时,语音播报提示为“安全距离”,当500<S<1000cm时,语音播报提示为“保持距离”,当100<S<500cm时,语音播报提示为“请注意”,当S<100时,语音播报提示为“危险距离”。
开始
系统初始化
发送超声波
等待反射
计算距离
S属于m
语音播报
液晶显示
结束
y
图4.1主程序图
开始
初始化
检查忙函数
y
n
写命令函数
写数据函数
延时
结束
图4..2 1602显示程序
开始
获取语音数据
WT588D初始化
开始播报
全部播报完
结束
n
y
图4.3 语音播报
第五章 系统调试
首先检测串口能否通,先串口线或者USB转串口线插到计算机上,再打开串口调试助手,接着选择串口,串口线和USB转串口的端口号查看路径:计算机—右键—设备管理器—端口(COM和LPT),点开查看即可。接着设置串口调试助手,选择端口号,发送的字符/数据中随便输入2位数字,其余设置默认,短接串口线或者USB转串口线9针中的2和3,短接完毕后,用鼠标左键点击串口调试助手中的手动发送,每点击一次可以收到一次数据,说明串口和串口线正常。调好后再下载已经编写好的程序,然后在超声波发射接口放置障碍物,通过1602液晶显示屏可以观察到所测的距离。 同时通过移动障碍物,改变距离,此时超过一定距离时,会通过语音来提示此时的距离是否处于安全距离,从而达到警戒作用。实物图如下:
图5.1 超声波测距系统实物图
第六章 结 论
本次设计使我学会了单片机的一些实际应用实例。我们广泛借鉴了各种实际的优点,充分考虑了整个设计中的各个环节。包括产生40KHZ的方波,在接收电路中,对所接收方波进行滤波、放大、整形等步骤。
在我们为期二周的设计中,我们用到了以前学到的很多知识,比如电工、单片机、和C语言等。这使我意识到,任何一件产品的产生,都不是单一知识所能实现的。而且在电路板焊接过程中,出现一些意想不到的错误,这让我措手不及,有些其实很容易避免。但这让我受益匪浅。这次单片机课程设计时长2个星期时间非常充足,第一周主要熟悉并且会使用一些画图软件及程序编程仿真软件。自己亲自用DXP2004软件把主系统图和功能电路图画出来,并且用Keil uVision3编写程序及仿真。第二周我们主要进行焊接51单片机电路板及超声波测距系统电路板并调试。通过这两周的课程设计,我学到了很多在课堂上学不到的东西即动手能力。对于我们这个电子信息工程专业的学生来说,动手实际操作能力是非常重要的,很多在课堂上学的理论都是要靠我们做实验来验证的,而做实验就是锻炼我们的实际操作能力。在画电路图的过程中,遇到了很多阻碍。一开始DXP2004画图软件不会用(大二学过的,但时间长了又忘了),后来又重新学了一遍,付出很多时间。所以我们学过的东西要经常拿出来用,学以致用。电路图画好后,又用keil软件编写一些简单的程序并调试,练习使用软件。在这次实习中学到了很多知识,比如电工,51单片机,汇编语言等。这使我们意识到,任何一件产品的产生,都不是单一知识所能实现的。而且在电路的设计和程序的编程过程中,出现了很多意想不到的错误,让我们措手不及,有些甚至是一些非常低级的错误,但是这些错误也同样让我们获益非浅,它使我们意识到,研究是一个非常严肃的过程,来不得半点马虎。必须有一个严谨的态度,加上100%的努力才有可能获得成功的喜悦
总之,在本课题的设计过程中在老师的指导和帮助下少走了很多弯路,但还是学到了不少知识。了解了超声波传感器的原理,学会了电路板焊接技能、和各种电路的设计与分析。动手能力与自学能力得到了锻炼与提高。理论总是不开实践的,设计制作过程中,盲目的追求理论知识根本不足以解决任何问题,一味的死研究课本是不会真正掌握单片机的。只有实际去真正动手做才能发现问题,解决问题,提高自身能力。
附录一: 单片机超声波测距系统原理图
附录二: PCB图
附录三: 单片机超声波测距系统C语言原程序
超声波测距系统程序设计
/**************************************
包含头文件
****************************************/
#include<intrins.h>
#include<reg52.h>
#define NOP _nop_();_nop_();_nop_()
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/***************************************
位定义
****************************************/
sbit csb=P3^4;
sbit green=P2^3;
sbit yellow=P2^4;
sbit red=P2^5;
bit flag_1=0;
uchar vo_vo=0xe7;
uint speed=340;
#include"delay.c"
#include"sound.c"
#include"12864.c"
#include"display.c"
#include"DS18B20.c"
#include"SOUND.c"
#define nop _nop_()
float distance;
uint count=0;
uchar high_time,low_time,flag=0,tc=2;
uchar flag_2=0;
uchar tc_say=0;
ulong dis,dis_4[3];
/***************************************
函数名:float Distance_count()
功能:距离计算函数
****************************************/
float Distance_count()
{
float temp;
temp=high_time*256+low_time;
temp=(temp*10/9216)/2;
temp*=speed;
return temp;
}
/***************************************
函数名:ulong do_s(ulong dis_1)
功能:距离补偿
****************************************/
ulong do_s(ulong dis_1)
{
uchar n;
if((dis_1>70)&(dis_1<100))
{n=dis_1/10;switch(n) {
case 7:dis_1-=40;break;
case 8:dis_1-=22;break;
case 9:dis_1-=26;break;
}
return(dis_1);
}else
{
n=dis_1/100;
switch(n)
{
case 1:dis_1-=46;break;
case 2:dis_1-=48;break; case 3:dis_1-=50;break;
case 4:dis_1-=53;break;
case 5:dis_1-=7;break;
case 6:dis_1-=60;break;
case 7:dis_1-=65;break;
case 8:dis_1-=72;break;
case 9:dis_1-=80;break;
case 10:dis_1-=84;break;
case 11:dis_1+=30;break;
case 12:dis_1-=87;break;
case 13:dis_1+=27;break;
case 14:dis_1+=34;break;
case 15:dis_1+=38;break;
case 16:dis_1+=45;break;
case 17:dis_1+=49;break;
case 18:dis_1+=53;break;
case 19:dis_1+=50;break;
case 20:dis_1+=55;break;
case 21:dis_1+=56;break;
case 22:dis_1+=60;break;
case 23:dis_1+=72;break;
case 24:dis_1+=78;break;
case 25:dis_1+=84;break;
case 26:dis_1+=92;break;
case 27:dis_1+=95;break;
case 28:dis_1+=98;break;
case 29:dis_1+=101;break;
case 30:dis_1+=114;break;
case 31:dis_1+=110;break;
case 32:dis_1+=103;break;
case 33:dis_1+=114;break;
case 34:dis_1+=120;break;
case 35:dis_1+=119;break;
case 36:dis_1+=119;break;
case 37:dis_1+=120;break;
case 38:dis_1+=122;break;
case 39:dis_1+=124;break;
case 40:dis_1+=125;break;
case 41:dis_1+=150;break; case 42:dis_1+=155;break;
case 43:dis_1+=155;break;
case 44:dis_1+=155;break;
case 45:dis_1+=160;break;
case 46:dis_1+=175;break;
case 47:dis_1+=185;break;
case 48:dis_1+=195;break;
case 49:dis_1+=175;break;
case 50:dis_1+=175;break;
}
return(dis_1);
}
}
/***************************************
函数名:void tran(),void tran1(),void tran2()
功能:超声波的发射
****************************************/
void tran()
{
uchar i;
TH0=0;
TL0=0;
TR0=1;
for(i=4;i>0;i--)
{
csb=!csb;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
}
csb=1;
delay_ms(2);
EX1=1;
delay_ms(30);
if(flag==1)
{
distance=Distance_count();
dis=(ulong)distance ;
flag=0;
}
else dis=0;
}
void tran1()
{
uchar i;
TH0=0;
TL0=0;
TR0=1;
for(i=8;i>0;i--)
{
csb=!csb;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
}
csb=1;
delay_ms(2);
EX1=1;
delay_ms(30);
if(flag==1)
{
distance=Distance_count();
dis=(unsigned long)distance;
flag=0;
}
else dis=0;
}
void tran2()
{
uchar i;
TH0=0;
TL0=0;
TR0=1;
for(i=16;i>0;i--)
{
csb=!csb;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
}
csb=1;
delay_ms(2);
EX1=1;
delay_ms(40);
if(flag==1)
{ distance=Distance_count();
dis=(unsigned long)distance;
flag=0;
}
else dis=0;
}
/***************************************
函数名:void dis_all(ulong dis_s)
功能:控制LED指示灯和语音播报
****************************************/
void dis_all(ulong dis_s)
{
show(dis_s);
if(dis_s>2000)
{
show_one(DIS4,2);
green=0;red=1;yellow=1;
if(flag_2!=1)
{
send_oneline(12);//安全距离
delay_nms(50);
while(!busy);
} flag_2=1;
}
else
{
if((dis_s>500)&(dis_s<1000))
{
show_one(DIS5,2);
green=1;red=1;yellow=0;
if(flag_2!=2)
{
send_oneline(14); //保持距离
delay_nms(50);
while(!busy);
}
flag_2=2;
}
else
{
if((dis_s>100)&(dis_s<500))
{ show_one(DIS6,2); green=1;red=0;yellow=1;
if(flag_2!=3)
{
send_oneline(15); //请注意 delay_nms(50); while(!busy); send_oneline(13); //危险距离 delay_nms(50); while(!busy);
}
flag_2=3;
}
else
{ show_one(DIS8,2);
yellow=1;
if(dis_s<100) { red=!red;green=1;}
else {green=!green;red=1;}
}
}
}
}
/***************************************
函数名:void fit_1(void)
功能:取最大值
****************************************/
void fit_1(void)
{
dis=dis_4[2];
if(dis_4[0]>dis) dis=dis_4[0];
if(dis_4[1]>dis) dis=dis_4[1];
}
/***************************************
函数名:void main(void)
功能:主函数
****************************************/
void main(void)
{
ulong data time;
uchar i,j;
P0 = 0xFF;
P1 = 0xff;
P2 = 0xff;
TMOD=0x01;
TH0=0;
TL0=0;
EA=1;
IE=0x80;
displayall();
while(1)
{
lcd_pos(4,0); //设置显示位置为第三行
for(i=0;i<16;i++)
{
write(1,DIS10[i]); //lcd_wdat(DIS3[i]);
delay(2);
}
for(i=0;i<3;i++)
{
tran();
if(dis==0)
{
tran1();
if(dis==0)
{tran2();}
}
dis=do_s(dis);
dis_4[i]=dis;
}
fit_1();
if(dis<time)
{
if((time-dis)>4000) time=time-1000;
else
{
if((time-dis)<2500) time=dis;
else time=time-100;
}
}
else
time=dis;
dis_all(time);
if(tc_say==4)
{
soundplay(time);
tc_say=0;
tem
展开阅读全文