资源描述
课 程 设 计 课程名称单片机课程设计题目名称超声波测距系统专业班级11电子信息工程本科3班学生姓名尹津学 号指引教师刘国永二一四年三月二十八日目 录摘 要1第一章 设计任务书21.1 基于单片机的超声波测距系统2第二章 系统总体设计32.1 超声波发生器3第三章各部分功能设计53.1 超声波测距系统构成53.2 单片机系统及显示电路63.3 串口通信模块73.4 超声波发射电路73.5 超声波接受电路83.6 语音播报模块8第四章 系统软件设计94.1 编程软件及语言的选择94.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 声速与温度的关系温度()3020100102030100声速(m/s)3133193253233383443493862.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.0P0.7、RST、P3.0P3.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 超声波接受电路CX6A是采用一款红外线检波接受的专用芯片,常用于电视机红外遥控接受器。考虑到红外遥控常用的载波频率38Hz与测距的超声波频率40Hz较为相近因此可以运用它来制作超声波检测接受电路。J31中插入CX6A,使用CX6A集成电路对接受探头收到的信号进行放大、滤波。其总放大增益为80db。图3.6 超声波接受电路3.6 语音播报模块WT588D有三种控制模式,分别是按键控制模式、一线串口控制模式及三线串口控制模式,按键控制模式触发方式灵活,可随意设立任意按键为脉冲可反复触发、脉冲不可反复触发、无效按键、电平保持不可循环、电平保持可循环、电平非保持可循环、上一曲不循环、下一曲不循环、上一曲可循环、下一曲可循环、音量+、音量-、播放/暂停、停止、播放/停止等 15 种触发方式。一线串口控制模式及三线串口控制模式可通过单片机来控制WT588D的语音播放、停止、循环播放和音量大小,或者直接触发 0219 地址位的任意语音。图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的超声波换能器TCT4010F1(T发射)和TCT4010S1(R接受),中心频率为40KHz,安装时应保持两换能器中心轴线平行并相距48cm,其他元件无特殊规定。若能将超声接受电路用金属壳屏蔽起来,则可提高抗干扰性能。根据测量范畴规定不同,可合适地调节与接受换能器并接的滤波电容C4的大小,以获得合适的接受敏捷度和抗干扰能力。硬件电路制作完毕连接并调试好后,便可用Keil uVision3将程序编译好下载到单片机试运营。根据实际状况可以修改超声波发生子程序每次发送的脉冲宽度和两次测量的间隔时间,以适应不同距离的测量需要。根据所设计的电路参数和程序,测距仪能测的范畴为0.105.00m,测距仪最大误差不超过1cm。系统调试完后应对测量误差和反复一致性进行多次实验分析,不断优化系统使其达到实际使用的测量规定。当调用超声波测距子程序后,一方面由单片机产生4个频率为38.46kHz超声波脉冲,加载的超声波发送头上。超声波头发送完送超声波后,立即启动内部计时器T0进行计时,为了避免超声波从发射头直接传送到接受头引起的直射波触发,这时,单片机需要延时约1.5 -2ms时间(这也就是超声波测距仪会有一种最小可测距离的因素,称之为盲区值)后,才启动对单片机P3.5脚的电平判断程序。当检测到P3.5脚的电平由高转为低电平时,立即停止T0计时。由于采用单片机采用的是12 MHz的晶振,计时器每计一种数就是1s,当超声波测距子程序检测到接受成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按式(2)计算,即可得被测物体与测距仪之间的距离。其中当障碍物与超声波模块的距离Scm时,语音播报提示为“安全距离”,当500S1000cm时,语音播报提示为“保持距离”,当100S500cm时,语音播报提示为“请注意”,当S100时,语音播报提示为“危险距离”。开始系统初始化发送超声波等待反射计算距离S属于m语音播报液晶显示结束y图4.1主程序图开始初始化检查忙函数yn写命令函数写数据函数延时结束图4.2 1602显示程序开始获取语音数据WT588D初始化开始播报所有播报完结束ny图4.3 语音播报第五章 系统调试一方面检测串口能否通,先串口线或者USB转串口线插到计算机上,再打开串口调试助手,接着选择串口,串口线和USB转串口的端标语查看途径:计算机右键设备管理器端口(COM和LPT),点开查看即可。接着设立串口调试助手,选择端标语,发送的字符/数据中随便输入2位数字,其他设立默认,短接串口线或者USB转串口线9针中的2和3,短接完毕后,用鼠标左键点击串口调试助手中的手动发送,每点击一次可以收到一次数据,阐明串口和串口线正常。调好后再下载已经编写好的程序,然后在超声波发射接口放置障碍物,通过1602液晶显示屏可以观测到所测的距离。同步通过移动障碍物,变化距离,此时超过一定距离时,会通过语音来提示此时的距离与否处在安全距离,从而达到警戒作用。实物图如下:图5.1 超声波测距系统实物图第六章 结 论本次设计使我学会了单片机的某些实际应用实例。我们广泛借鉴了多种实际的长处,充足考虑了整个设计中的各个环节。涉及产生40KHZ的方波,在接受电路中,对所接受方波进行滤波、放大、整形等环节。在我们为期二周的设计中,我们用到了此前学到的诸多知识,例如电工、单片机、和C语言等。这使我意识到,任何一件产品的产生,都不是单一知识所能实现的。并且在电路板焊接过程中,浮现某些意想不到的错误,这让我措手不及,有些其实很容易避免。但这让我受益匪浅。这次单片机课程设计时长2个星期时间非常充足,第一周重要熟悉并且会使用某些画图软件及程序编程仿真软件。自己亲自用DXP软件把主系统图和功能电路图画出来,并且用Keil uVision3编写程序及仿真。第二周我们重要进行焊接51单片机电路板及超声波测距系统电路板并调试。通过这两周的课程设计,我学到了诸多在课堂上学不到的东西即动手能力。对于我们这个电子信息工程专业的学生来说,动手实际操作能力是非常重要的,诸多在课堂上学的理论都是要靠我们做实验来验证的,而做实验就是锻炼我们的实际操作能力。在画电路图的过程中,遇到了诸多阻碍。一开始DXP画图软件不会用(大二学过的,但时间长了又忘了),后来又重新学了一遍,付出诸多时间。因此我们学过的东西要常常拿出来用,学以致用。电路图画好后,又用keil软件编写某些简朴的程序并调试,练习使用软件。在这次实习中学到了诸多知识,例如电工,51单片机,汇编语言等。这使我们意识到,任何一件产品的产生,都不是单一知识所能实现的。并且在电路的设计和程序的编程过程中,浮现了诸多意想不到的错误,让我们措手不及,有些甚至是某些非常低档的错误,但是这些错误也同样让我们获益非浅,它使我们意识到,研究是一种非常严肃的过程,来不得半点马虎。必须有一种严谨的态度,加上100的努力才有也许获得成功的喜悦总之,在本课题的设计过程中在教师的指引和协助下少走了诸多弯路,但还是学到了不少知识。理解了超声波传感器的原理,学会了电路板焊接技能、和多种电路的设计与分析。动手能力与自学能力得到了锻炼与提高。理论总是不开实践的,设计制作过程中,盲目的追求理论知识主线局限性以解决任何问题,一味的死研究课本是不会真正掌握单片机的。只有实际去真正动手做才干发现问题,解决问题,提高自身能力。附录一: 单片机超声波测距系统原理图附录二: PCB图附录三: 单片机超声波测距系统C语言原程序超声波测距系统程序设计/*涉及头文献*/#include#include#define NOP _nop_();_nop_();_nop_()#define uchar unsigned char#define uint unsigned int#define ulong unsigned long/*位定义*/sbit csb=P34;sbit green=P23;sbit yellow=P24;sbit red=P25;bit flag_1=0; uchar vo_vo=0xe7;uint speed=340;#includedelay.c#includesound.c#include12864.c#includedisplay.c#includeDS18B20.c#includeSOUND.c#definenop_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_43;/*函数名: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_170)&(dis_10;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;i0;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;i0;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) 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_s500)&(dis_s100)&(dis_s500) 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_sdis) dis=dis_40;if(dis_41dis) dis=dis_41;/*函数名: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;i16;i+) write(1,DIS10i);/lcd_wdat(DIS3i); delay(2); for(i=0;i3;i+) tran();if(dis=0)tran1(); if(dis=0) tran2(); dis=do_s(dis); dis_4i=dis;fit_1();if(dis4000) time=time-1000;elseif(time-dis)2500) time=dis;else time=time-100; elsetime=dis; dis_all(time); if(tc_say=4) soundplay(time); tc_say=0; temp_all(); tc_say+; lcd_pos(1,6);for(j=0;j4;j+)write(1,space4j);lcd_pos(1,6);for(j=0;j0)&(temp0;i-) ;void delay(int ms) while(ms-) uchar i; for(i=0;i246;i+) _nop_(); _nop_();_nop_();_nop_(); void delay1(int ms) while(ms-) uchar y; for(y=0;y100;y+) ; /*函数名:show(ulong ss)功能:显示测试数据*/void show(ulong ss) uchar data_s2,i;data_s0=ss/10000; /数据的解决if(data_s0=0)/测量数据的十米位为0 data_s0=0x20; else data_s0=data_s+0x30; data_s1=ss%10000/1000+0x30; lcd_pos(3,5); /第三行,第七个(2*n+1)字节位置显示 write(1,data_s1);for(i=0;i2;i+) write(1,data_si);lcd_wdat(data_si); /显示米位数据 delay(1); data_s0=ss%1000/100+0x30; data_s1=ss%100/10+0x30; lcd_pos(3,6); for(i=0;i2;i+) write(1,data_si);/lcd_wdat(data_si); /显示分米和厘米位数据 delay(1); write(1,ss%10+0x30);/lcd_wdat(ss%10+0x30);/显示毫米位数据 delay(1);/*常量定义*/#definecircle0xf2/循环播放#definestop_play 0xfe/停止播放#definevo_00xe0/音量1#definevo_10xe1/音量2#definevo_20xe2/音量3#definevo_30xe3/音量4#definevo_40xe4/音量5#definevo_50xe5/音量6#definevo_60xe6/音量7#definevo_70xe7/音量8/*延时n个ms函数*/void delay_nms(uint ms) /delay ms function uchar i; while(ms-) for(i = 0; i 0;j-);/*位定义*/sbit rst=P23;sbit CS=P25;/片选端sbit CLK=P26;/时钟sbit sda=P24;/数据位sbit busy=P27;/忙信号/*函数名:void send_com(uchar add)功能:发码播放,add为语音地址*/void send_com(uchar add) uchar i;RST=1;RST=0;delay_nms(3);RST=1;delay_nms(20);CS=0;delay_nms(5);for(i=0;i1;CS=1;void delayus(uint z) uint x,y; for(x=z;x0;x-) for(y=10;y0;y-);void send_oneline(uchar add) uchar i; rst=0; delay(1); rst=1; delay(17); /*复位延时 17MS*/ rst=1; delay(6); /* delay 6ms */ sda=0; delay(5); /* delay 5ms */ for(i=0;i=1; sda=1; /*函数名:void sound(ulong soud)功能:播报测距距离*/void sound(ulong soud)uchar i,j,k,l;send_oneline(vo_vo);while(!busy); i=soud/1000;j=soud%1000/100;k=soud%100/10;l=soud%10;send_oneline(i);delay_nms(300);while(!busy);send_oneline(10);/播放“点”delay_nms(300);while(!busy);send_oneline(j);delay_nms(300);while(!busy);send_oneline(k);delay_nms(300);while(!busy);if(l!=0)send_oneline(l);delay_nms(300);while(!busy);send_oneline(11);/播放米delay_nms(300);while(!busy);/*函数名:void soundplay(uint dis_say)功能:播放“测量距离”*/void soundplay(uint dis_say)/if(busy!=0)sound(dis_say);/播放“测量距离”sbit DQ = P37;/定义DS18B20端口DQ uchar presence ;uchar temp_data2=0x00,0x00;uchar display5=0x00,0x00,0x00,0x00,0x00;uchar code ditab16=0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04, 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09;bit flash=0; /显示开关标记/*
展开阅读全文