找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 34500|回复: 28
打印 上一主题 下一主题
收起左侧

基于AT89C51单片机的超声波测距仪的系统

  [复制链接]
跳转到指定楼层
楼主
ID:333699 发表于 2018-5-19 15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

河南机电高等专科学校


毕业设计论文
论文题目:基于AT89C51单片机的超声波测距仪的系统设计



系    部
专    业
班    级
学生姓名
学    号
指导教师
2012年5月 1 日


摘  要
本设计介绍了基于单片机控制的超声测距仪的原理:由AT89C51控制定时器产生超声波脉冲并计时,计算超声波自发射至接收的往返时间,从而得到实测距离。并且在数据处理中采用了温度补偿的调整,用四位LED数码管切换显示距离和温度。
整个硬件电路由超声波发射电路、超声波接收电路、电源电路、显示电路等模块组成。各探头的信号经单片机综合分析处理,实现超声波测距仪的各种功能。在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。相关部分附有硬件电路图、程序流程图,给出了系统构成、电路原理及程序设计。此系统具有易控制、工作可靠、测距准确度高、可读性强和流程清晰等优点。实现后的作品可用于需要测量距离参数的各种应用场合。

关键词AT89C51,超声波,温度补偿,测距

Abstract
The design introduces theprinciple of the ultrasonic distance measurement instrument based onSCMC-controlled: AT89C51 controls timers to produce the ultrasonic wave pulseand  time,count the time of ultrasonicwave spontaneous emission to receive round-trip,thus obtains the measureddistance.And the temperature compensation adjustment is used in the dataprocessing, with four LED nixie tubes display distance or temperature byswitching.
The entire hardware circuitis composed by ultrasonic transmitter circuit, ultrasonic receiver circuit, thepower circuit, display circuit, and other modules. The probe signals areintegrated analysised by SCMC to achieve the various functions of ultrasonic distancemeasurement instrument. Based on this has designedsystem's overall concept, final adoption of hardware and software to achievethe various functional modules. The relevant parts have the hardware schematicsand process flow chart.It has given the system constitution, the circuitry andthe programming. The instrument system has features: ease of control, stabilityof operation, highness of precision and distinctness of programme process ,etc.After the realization of the works can be used for needs of the variousparameters measured distance applications.
Keywords:AT89C51, Ultrasonic wave, Temperaturecompensation, Measuredistans  


目  录
摘  要... I
Abstract. II
目  录... 1
第1章  引言... 1
1.1  课题研究的背景... 1
1.2  课题研究的意义... 1
1.3  论文结构... 2
第2章  超声波测距原理... 3
2.1  超声波简介... 3
2.2  超声波测距原理... 3
第3章  方案论证... 5
3.1  设计思路... 5
3.2  系统结构设计... 6
第4章  主要元件介绍... 7
4.1  单片机AT89C51. 7
4.2  超声波传感器T40、R40. 9
4.3  温度传感器DS18B20. 10
第5章  硬件电路设计... 11
5.1  超声波发射电路... 11
5.2  超声波接收电路... 11
5.3  显示电路... 12
5.4  电源电路... 13
5.5  复位电路... 13
第6章  软件设计... 14
6.1  主程序流程... 14
6.2  子程序设计... 15
6.2.1  超声波发送子程序及超声波接收中断子程序... 15
6.2.2  测温子程序... 17
6.2.3  距离计算子程序... 17
6.2.4  显示子程序和键盘扫描子程序... 18
第7章  软件调试及系统仿真... 19
7.1  软件编译调试环境——Keil 19
7.2  系统仿真环境——Proteus. 19
7.3  系统仿真... 19
7.4  误差及特性分析... 22
结  论... 23
致  谢... 24
参考文献... 25
附录1整体电路图... 26
附录2 程序... 27

第1章  引言
1.1  课题研究的背景
人们生活水平的提高,城市发展建设加快,城市给排水系统也有较大发展,其状况不断改善。但是,由于历史原因合成时间住的许多不可预见因素,城市给排水系统,特别是排水系统往往落后于城市建设。因此,经常出现开挖已经建设好的建筑设施来改造排水系统的现象。城市污水给人们带来了困扰,因此箱涵的排污疏通对大城市给排水系统污水处理,人们生活舒适显得非常重要。而设计研制箱涵排水疏通移动机器人的自动控制系统,保证机器人在箱涵中自由排污疏通,是箱涵排污疏通机器人的设计研制的核心部分。控制系统核心部分就是超声波测距仪的研制。
随着科学技术的快速发展,超声波将在传感器中的应用越来越广。但就目前技术水平来说,人们可以具体利用的传感技术还十分有限,因此,这是一个正在蓬勃发展而又有无限前景的技术及产业领域。展望未来,超声波传感器作为一种新型的非常重要有用的工具在各方面都将有很大的发展空间,它将朝着更加高定位高精度的方向发展,以满足日益发展的社会需求,如声纳的发展趋势基本为:研制具有更高定位精度的被动测距声纳,以满足水中武器实施全隐蔽攻击的需要;继续发展采用低频线谱检测的潜艇拖曳线列阵声纳,实现超远程的被动探测和识别;研制更适合于浅海工作的潜艇声纳,特别是解决浅海水中目标识别问题。毋庸置疑,未来的超声波传感器将与自动化智能化接轨,与其他的传感器集成和融合,形成多传感器。随着传感器的技术进步,传感器将从具有单纯判断功能发展到具有学习功能,最终发展到具有创造力。
1.2  课题研究的意义
在现实生活中,一些传统的距离测量方式在某些特殊场合存在不可克服的缺陷,例如,液面测量就是一个距离测量,传统的电极法是采用差位分布电极,通过给电或脉冲检测液面,电极长期浸泡在水中或其它液体中,极易被腐蚀、电解,从而失去灵敏性。而利用超声波测量距离可以很好地解决这一问题。目前市面上常见的超声波测距系统不仅价格昂贵,体积过大而且精度也不高等种种因素,使得在一些中小规模的应用领域中难以得到广泛的应用。为解决这一系列难题,本文设计了一款基于AT89C51单片机的低成本、高精度、微型化的超声波测距仪。
1.3  论文结构
第 1 章首先对课题的背景和意义进行阐述,并概述了论文结构。
第2 章先就超声波测距的原理进行介绍,并提出了提高测距的精度的方案——温度补偿,且描述了其具体补偿方式。
第3章针对本文采用的设计方案进行了可行性的论证,并得出了系统结构框图。
第4章介绍了设计中需要用到的主要器件,且因其在本设计的作用不同而详尽程序亦不同。
第 5 章从整体硬件设计出发,对各部分电路进行了详细说明。
第6章先给出了软件设计的整体流程图,并且对关键部分软件设计做了进一步的解释。
第 7 章介绍了软件的调试及系统仿真
程序编译及系统仿真也是本文的一个要点,所以特别分出一章来详细介绍了程序编译的环境和编译的步骤以及仿真的环境和部分仿真的效果图。

第2章  超声波测距原理
2.1  超声波简介
我们知道,当物体振动时会发出声音。科学家们将每秒钟振动的次数称为声音的频率,它的单位是赫兹。我们人类耳朵能听到的声波频率为20~20000赫兹。当声波的振动频率大于20000赫兹或小于20赫兹时,我们便听不见了。因此,我们把频率高于20000赫兹的声波称为“超声波”。通常用于医学诊断的超声波频率为1~5兆赫。超声波具有方向性好,穿透能力强,易于获得较集中的声能,在水中传播距离远等特点。可用于测距,测速,清洗,焊接,碎石等。在医学,军事,工业,农业上有明显的作用。
理论研究表明,在振幅相同的条件下,一个物体振动的能量与振动频率成正比,超声波在介质中传播时,介质质点振动的频率很高,因而能量很大。在我国北方干燥的冬季,如果把超声波通入水罐中,剧烈的振动会使罐中的水破碎成许多小雾滴,再用小风扇把雾滴吹入室内,就可以增加室内空气湿度。这就是超声波加湿器的原理。对于咽喉炎、气管炎等疾病,药品很难血流到打患病的部位。利用加湿器的原理,把药液雾化,让病人吸入,能够疗效。利用超声波巨大的能量还可以使人体内的结石做剧烈的受迫振动而破碎。
2.2  超声波测距原理
超声波是利用反射的原理测量距离的,被测距离一端为超声波传感器,另一端必须有能反射超声波的物体。测量距离时,将超声波传感器对准反射物发射超声波,并开始计时,超声波在空气中传播到达障碍物后被反射回来,传感器接收到反射脉冲后立即停止计时,然后根据超声波的传播速度和计时时间就能计算出两端的距离。测量距离D为
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif                             (2.1)
式中    c——超声波的传播速度;
           file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image004.gif——超声波发射到接收所需时间的一半,也就是单程传播时间。
由上式可风,距离的测量精度主要取决于计时精度和传播速度两方面。计时精度由单片机定时器决定,定时时间为机器周期与计数次数的乘积,可选用12MHz的晶振,使机器周期为精确的1μs,不会产生累积误差,使定时间达到1μs。超声波的传播速度c并不是固定不变的,传播速度受空气密度、温度和气体分子成分的影响,关系式为
                    file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image006.gif                    (2.2)
式中  γ——气体定压热容与定容热容的比值,空气为1.40。
      R——气体普适常数,为8.314kg/mol。
T——气体势力学温度,与摄氏温度的关系是T=273K+t。
M——气体相对分子质量,空气为28.8×10-3kg/mol。
c0——0℃时的声波速度,为331.4m/s。
由上式可见,超声波在空气中传播时,受温度影响最大,由表达式可计算出波速与温度的关系,如表2.1所示。温度越高,传播速度越快,而且不同温度下传播速度差别非常大,例如0℃时的速度为332m/s,30℃时的速度为350m/s,相差18m/s。因此,需要较高的测量精度时,进行温度补偿是最有效的措施。对测量精度要求不高时,可认为超声波在空气中的传播速度为340m/s。



  
        
表2.1 超声波传播速度与温度关系表
   
   
   
   



  
项目
  
数值
温度
-30
-20
-10
0
10
20
30
40
50
60
100
声速/( m•s)
313
319
325
332
338
344
350
356
361
367
388

第3章  方案论证
3.1  设计思路
测量距离方法有很多种,短距离可以用尺,远距离有激光测距等,超声波测距适用于高精度中长距离测量。因为超声波在标准空气中传播速度为331.45米/秒,由单片机负责计时,单片机使用12.0M晶振,所以此系统测量精度理论上可以达到毫米级。
目前比较普遍的测距的原理:通过发射具有特征频率的超声波对被摄目标的探测,通过发射出特征频率的超声波和反射回接受到特征频率的超声波所用的时间,换算出距离,如超声波液位物位传感器,超声波探头,适合需要非接触测量场合,超声波测厚,超声波汽车测距告警装置等。  
由于超声波指向性强,能量消耗缓慢,在介质中传播距离远,因而超声波可以用于距离测量。利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也能达到要求。由于超声波易于定向发射、方向性好、强度易控制、与被测量物体不需要直接接触的优点,是作为液体高度测量的理想手段。在精密的液位测量中需要达到毫米级的测量精度,但是目前国内的超声波测距专用集成电路都是只有厘米级的测量精度。通过分析超声波测距误差产生的原因,提高测量时间差到微秒级,以及用温度传感器进行声波传播速度的补偿后,我们设计的高精度超声波测距仪能达到毫米级的测量精度。
目前超声波测距已得到广泛应用,国内一般使用专用集成电路根据超声波测距原理设计各种测距仪器,但是专用集成电路的成本较高、功能单一。而以单片机为核心的测距仪器可以实现预置、多端口检测、显示、报警等多种功能,并且成本低、精度高、操作简单、工作稳定、可靠。以8051为内核的单片机系列,其硬件结构具有功能部件齐全、功能强等特点。尤其值得一提的是,出8位CPU外,还具备一个很强的位处理器,它实际上是一个完整的位微计算机,即包含完整的位CPU,位RAM、ROM(EPROM),位寻址寄存器、I/O口和指令集。所以,8051是双CPU的单片机。位处理在开关决策、逻辑电路仿真、过程测控等方面极为有效;而8位处理则在数据采集和处理等方面具有明显长处。
根据设计要求并综合各方面因素,可以采用AT89C51单片机作为主控制器,它控制发射触发脉冲的开始时间及脉宽,响应回波时刻并测量、计数发射至往返的时间差。利用软件产生超声波信号,通过输出引脚输入至驱动器,经驱动器驱动后推动探头产生超声波;超声波信号的接收采用锁相环LM567对放大后的信号进行频率监视和控制。一旦探头接到回波,若接收到的信号频率等于振荡器的固有频率(此频率主要由RC值决定),则其输出引脚的电平将从“1”变为“0”(此时锁相环已进入锁定状态),这种电平变化可以作为单片机对接收探头的接收情况进行实时监控。可对测得数据优化处理,并采用温度补偿,使测量误差降到更低限度;AT89C51还控制显示电路,用动态扫描法实现LED数字显示。
3.2  系统结构设计
超声波测距仪系统结构如图3.1所示。它主要由单片机、超声波发射及接收电路、超声波传感器、温度传感器、键盘、LED显示电路及电源电路组成。系统主要功能包括:
1)     超声波的发射、接收,并根据计时时间计算测量距离;
2)     检测空气温度用于距离计算的补偿;
3)     LED显示器显示距离、温度;
4)     键盘接收用户命令并处理;
5)     当系统运行不正常时,用电平式开关与上电复位电路复位。
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image007.gif



   
         
图3.1   超声波测距仪系统结构框图
     
     
     
   




    第4章  主要元件介绍   
4.1  单片机AT89C51
单片机即单片微型计算机SCMC(Single ChipMicroComputer)。它把构成一台计算机的主要功能部、器件,如CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)、中断系统、定时/计数器等集中在一块芯CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)制功能,所以又称为微控制器MCU(MicrocontrollerUnit)。相对于普通微机,单片机的体积要小得多,一般嵌入到其他仪器设备里,实现自动检测与控制,因此也称为嵌入式微控制器EMCU(EmbeddedMicrocontroller Unit)。
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image009.jpg本设计的MCU采用的是DIP(Dual In-linePackage塑料双列直插式)封装的AT89C51高性能8位单片机。AT89C51是一个低电压,高性能CMOS 8位单片机,片内含4k bytes的可反复擦写的Flash只读程序存储器和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机的AT89C51提供了高性价比的解决方案。
  
        
图4.1  AT89C51的引脚图
   
   
   
   
AT89C51是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,216位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。其引脚图如右图4.1                          
AT89C51的引脚功能有:                          
1)
主电源引脚
VSS——第20脚,电路接地电平。
VCC——第40脚,正常运行和编程校验+5V电源。
2) 时钟源
XTAL1——第19脚,一般外接晶振的一个引脚,它是片内反相放大器的输入端口。当直接采用外部信号时,此引脚应接地。
XTAL1——第18脚,接外部晶振的另一个引脚,它是片内反相放大器的输出端口。当采用外部振荡信号源泉时,此引脚为外部振荡信号的输入端口,与信号源相连接。
3) 控制、选通或复用
RST/VPD——第9脚,RESET复位信号输入端口。当单片机正常工作时,由该引脚输入脉宽为2个以上机器周期的高电平复位信号到单片机。在VCC掉电期间,此引脚(即VPD)可接通备用电源,以保持片内RAM信息不受破坏。
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image011.gif——第30脚,输出允许地址锁存信号。当单片机访问外部存储器时,ALE信号的负跳变将P0口上的低8位地址送入锁存器。在非访问外部存储器期间,ALE仍以1/6振荡频率固定不变地输出,因此它可对个输出或用于定时目的。要注意的是:每当访问外部存储器时将跳过一个ALE脉冲。file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image013.gif为第二功能,当对片内程序存储器编程写入时,此引脚作为编程脉冲输入端。
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image015.gif——第29脚,访问外部程序存储器选能信,低电平有效。当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image015.gif有效,即输出两个脉冲。在此期间,当访问外部数据存储器,这两次有效的 file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image015.gif信号不出现。
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image019.gif:外部访问允许。欲使CPU公访问外部程序存储器(地址0000H-FFFFH),file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image021.gif端必须保持低电平(接地)。需注意的是:如果加密位LBI被编程,复位时内部会锁存file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image021.gif端状态。Flash存储器编程时,该引脚加上+12V的编程允许电源VPP,当然这必须是该器件是使用12V编程电压VPP。
4) 多功能I/O端口
P0口——第32~39脚,8位漏极开路双向I/O端口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。在访问数据存储器或程序存储器时,这组口线分时转换地址和数据总线复用,在访问期间激活内部上拉电阻。
P1口——第1~8脚,具有内部上拉电路的8位准双向I/O端口。在对片内程序存储器(EPROM型)进行程序编程和校验时,用做低8位地址总线。
P2口——第21~28脚,具有内部上拉电路的8位准双向I/O端口。当单片机访问存储器时,用做高8位地址总线;在对片内程序存储器(EPROM型)进行程序编程和校验时,亦用做高8位地址总线。
P3口——第10~17脚,具有内部上拉电路的8位准双向I/O端口。它还提供特殊的第二功能。它的每一位均可独立定义为第一功能的I/O口或第二功能。第二功能的具体含义如表4.2:



  
        
表4.2  P3口的第二功能
   
   
   
   



  
端口引脚
  
第二功能
P3.0
RXD  (串行输入口)
P3.1
TXD  (串行输出口)
P3.2
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image024.gif (外中断0)
P3.3
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image026.gif (外中断1)
P3.4
T0    (定时/计数器0)
P3.5
T1    (定时/计数器1)
P3.6
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image028.gif  (外部数据存储器写选通)
P3.7
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image030.gif  (外部数据存储器读选通)
4.2  超声波传感器T40R40
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image032.gif本设计采用的是发送超声波传感器T40及接收超声波传感器R40,其外观如图4.3。
超声波在恒定环境条件下的传播速度不变。超声波传感器主要材料有压电晶体(电致伸缩)及镍铁铝合金(磁致伸缩)两类。电致伸缩的材料有锆钛酸铅(PZT)等。压电晶体组成的超声波传感器是一种可逆传感器,它可以将电能转变成机械振荡而产生超声波,同时它接收到超声波时,也能转变成电能,所以它可以分成接收器和发送器。超声波传感器由两个压电晶片和一个共振板组成,当压电晶片的两极加上频率等于其固有谐振频率的脉冲信号时,压电晶片产生共振,并带动共振板产生振动,同时带动压电晶片也一起振动,将机械能转换为电能,称为超声波接收器。超声波传感器利用压电效应进行电能和超声波机械能的相互转换,也称为超声波换能器。超声波发射换能器与接收换能器在结构上稍有不同,使用时应分清器件上的标志,但外观基本一致。有的超声波传感器既作发送,也能作接收。这里仅涉及小型超声波传感器,发送与接收略有差别,它适用于在空气中传播,工作频率一般为23-25KHZ及40-45KHZ。这类传感器适用于测距、遥控、防盗等用途。该种有T/R-40-16,T/R-40-12等(其中T表示发送,R表示接收,40表示频率为40KHZ,16及12表示其外径尺寸,以毫米计)。
4.3  温度传感器DS18B20
温度传感器主要由热敏元件组成。热敏元件品种教多,市场上销售的有双金属片、铜热电阻、铂热电阻、热电偶及半导体热敏电阻等。以半导体热敏电阻为探测元件的温度传感器应用广泛,这是因为在元件允许工作条件范围内,半导体热敏电阻器具有体积小、灵敏度高、精度高的特点,而且制造工艺简单、价格低廉。半导体热敏电阻按温度特性热敏电阻可分为正温度系数热敏电阻(电阻随温度上升而增加)和负温度系数热敏电阻(电阻随温度上升而下降)。
本设计采用的是美国Dallas 半导体公司的不锈钢封装的DS18B20数字温度传感器。DS18B20是采用专门设计的不锈钢外壳,仅有0.2mm的壁厚,具有很小的蓄热量,采用导热性高的密封胶,保证了温度传感器的高灵敏性,极小的温度延迟。DS18B20支持“一线总线”接口(1-Wire),测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
DS18B20采用3脚PR-35封装(图4.4):            
DS18B20数字化温度传感器的主要性能如下:
1)     适用电压为3V~5V;
2)     9~12位分辨率可调,对应的可编程温度分别为0.5℃、0.25℃、0.125℃、0.0625℃;
3)     TO-92、SOIC及CSP封装可选;
4)     测温范围:-55℃~125℃;
5)     精度:-10℃~85℃范围内±0.5℃;
6)     无需外部元件,独特的一线接口,电源和信号复合在一起;
7)     每个芯片唯一编码,支持联网寻址,零功耗等待。
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg


  
        
图4.4  PR-35封装图
   
   
   
                  
第5章  硬件电路设计
5.1  超声波发射电路
超声波发射电路原理图如图5.1所示。发射电路主要由反相器74LS04和超声波发射换能器T40构成,单片机P1.0端口输出的40kHz的方波信号一路经一级反向器后送到超声波换能器的一个电极,另一路经两级反向器后送到超声波换能器的另一个电极,用这种推换形式将方波信号加到超声波换能器的两端,可以提高超声波的发射强度。输出端采用两个反向器并联,用以提高驱动能力。上位电阻R1、R2一方面可以提高反向器74LS04输出高电平的驱动能力,另一方面可以增加超声波换能器的阻尼效果,缩短其自由振荡时间。
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg






  
        
图5.1     超声波发射电路原理图
   
   
   
   


5.2  超声波接收电路
超声波接收电路由超声波传感器、两级放大电路和锁相环电路组成。超声波传感器接收到的反射波信号非常微弱,两级放大电路用于对传感器接收到的信号进行放大。锁相环电路接收到频率符合要求的信号后向单片机发出中断请求。锁相环LM567内部压控振荡器的中心频率为file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image038.gif,锁定带宽与C3有关。由于发送的超声波频率为40kHz,帮调整相关元件使锁相环的中心频率为40kHz,只响应该频率的信号,避免了其他频率信号的干扰。
当超声波传感器接收到超声波信号后,送入两级放大器放大,放大后的信号进入锁相环检波,如果频率为40kHz,则从8脚发出低电平中断请求信号送单片机P3.3端,单片机检测到低电平后停止定时器的工作。超声波接收电路如图5.2file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image040.jpg所示。

  
        
图5.2  超声波接收电路
   
   
   
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image041.gif            
5.3  显示电路
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image043.jpg显示电路如图5.3,四位LED组成动态扫描电路,由AT89C51的P0口输出。动态扫描时,由P2口控制LED的当前显示位。当距离测量结束并调用显示程序,就会显示距离大小,显示两位小数。当按下按键k2时,将会显示温度值,延时5s后恢复显示距离值。



  
        
图5.3     显示电路
   
   
   
   



5.4  电源电路
电源电路如图5.4所示。为方便起见,本设计采用的是9V电池供电,直流电送入三端稳压器LM7805稳压,输出+5V稳恒直流电,作为电路的电源。LED是电源指示灯,通电后发光。
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image045.jpg






  
        
图5.4  电源电路
   
   
   
   


5.5  复位电路
AT89C51复位有一个专用的外部引脚RESET,外部可通过此引脚输入一个正脉冲使单片机复位。所谓复位,就是强制单片机系统恢复到确定的初始状态,并使系统重新从初始状态开始工作。本设计采用的是电平式开关与上电复位电路,为了能使运行中的系统,经人工干预,强制系统进行复位。其电路如图5.5所示:




   
         
图5.5  复位电路
     
     
     
   
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image047.jpg





第6章  软件设计
6.1  主程序流程
我们知道C语言程序有利于实现较复杂的算法,汇编语言程序则具有较高的效率且容易精细计算程序运行的时间,而超声波测距仪的程序既有较复杂的计算(计算距离时),又要求精细计算程序运行时间(超声波测距时),所以控制程序可采用C语言和汇编语言混合编程。
因为本设计对时间要求精度较高的部分全部由单片机内部的定时器完成,而虽然温度传感器的读写对时间精度要求也高,但经详细计算所得出的C程序已被广泛应用,故直接借用已有程序也能作到对温度的准确读取,所心本设计全部使用C语言编程,这样能使设计中所用到的公式能方便快捷的体现和实现,又缩短了论文的篇幅。
软件采用模块化设计方法,由主程序、超声波发生子程序、超声波接收中断子程序、温度测量子程序、距离计算子程序、显示子程序、键盘扫描处理程序等模块组成。
系统上电后,首先系统初始化,不断扫描按键k1,若按键k1按下,则开始测量空气温度,然后将P1.0置位,使定时器T0开始定时,控制超声波传感器发出超声波,同时使定时器T1开始定时。CPU循环检测P3.3引脚,当P3.3为低电平时接收到回波,立即使T1停止工作,保存定时器的计数值。
然后根据温度和传输时间计算距离,温度补偿措施使测量精度有了明显提高,计算出距离后调用距离显示子程序,LED显示距离。
最后检测按键k2,若k2闭合,则调用温度显示子程序,LED显示温度(温度并非测量距离时用于补偿的温度,而是当前温度)5s后恢复显示本次测量距离;若按键k2没有闭合,则显示器恒定显示最新一次的测量结果;若要进行下一次测量,则先要按下k3重新开始,再按下按键k1才执行新一次测量。由于不需输入数据,键盘只设置了3个按键,用于开始测量距离并显示温度功能设置等。
图6.1为主程序流程图。




file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image048.gif
























  
        
图6.1  主程序流程图
   
   
   
   


6.2  子程序设计6.2.1  超声波发送子程序及超声波接收中断子程序
超声波发生子程序的作用是通过P1.0端口发送左右超声波脉冲信号(频率约40kHz的方波),脉冲宽度为12μs左右,同时把计数器T1打开进行计时,定时器T1工作在方式0。
超声波测距仪主程序利用外中断1检测返回超声波信号,一旦接收到返回超声波信号(即file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image026.gif引脚出现低电平),立即进入中断程序。进入中断后就立即关闭计时器T1停止计时,并将测距成功标志字赋值1。如果当计时器溢出时还未检测到超声波返回信号,则定时器T1溢出中断将外中断1关闭,并将测距成功标志字赋值0表示此次测距不成功。
T0中断服务程序如下:
sbit send=P1^0;
void timer0(void)interrupt 1
{   send=!send;
    TH0=0x1f;
    TL0=0xf4;
}
超声波接收(外部中断1)程序:
void int1(void)interrupt 2
{  if(TH1!=0x00&&TH0!=0x00)
      {   b=1;
          TR1=0;
          TR0=0;
          t=TH1*256+TL1;
       t=t/1000000;
       TH0=0x1f;
       TL0=0xf4;
       TH1=0x00;
       TL1=0x00;
      }
      else
      {   b=0;
          TR1=0;
          TR0=0;
       TH0=0x1f;
       TL0=0xf4;
       TH1=0x00;
       TL1=0x00;
}   }
6.2.2  测温子程序
测温的主要器件是DS18B20,现场温度直接以“一线总线”的数字方式传输,DS18B20中有两个存测得的温度值的两个8位存贮器RAM,用11位存贮温度值,最高位(5位)为符号位。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,再计算十进制值。图6.2为DS18B20的温度存储方式:
      bit7   bit6     bit5    bit4   bit3    bit2    bit1    bit0
  
23
  
22
21
20
2-1
2-2
2-3
2-4
      bit15   bit14   bit13   bit12   bit11  bit10    bit9    bit8
  
  S
  
S
S
S
S
26
25
24
  
        
图6.2  DS18B20的温度存储方式
   
   
   
   


负温度时S=1,正温度时S=0。因此我们只需要逐位读出它的温度就可以了。读出一个字节C代码如下:
uchar readbyte(void)         //直接读一字节程序
{  uchar i,k;
      i=8;
      k=0;
      while(i--)
      {     tem_in=1;
             delay_us(1);
             tem_in=0;
             k=k>>1;
             tem_in=1;
             NOP;
             if(tem_in)k |= 0x80;     //tem_in为1时,则该位也为1
             delay_us(4);
}
      return(k);
}
6.2.3  距离计算子程序
当前温度和超声波往返时间均测量出来后,用C语言根据公式计算距离来编程是比较简单的算法。
根据测量距离file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image051.gif,而其中file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image006.gif,故可简化为:file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image054.giffile:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image056.gif,其实现程序算法如下:
#include<math.h>
void distance(void)
{
double radical,dist,t;
radical=sqrt(1+(temnum+273)/273);
dist=165.7*t*radical;
return(dist);
}   
6.2.4 显示子程序和键盘扫描子程序
显示电路由四位LED组成动态扫描电路,编程非常简单。又虽然本设计共有四个按键,k0控制电源输入,不需软件编程;而k3为手动复位按键,亦不需软件编程;只有k1 、k2分别测距开始按键和距离与温度切换显示按键,级易实现。显示子程序和键盘扫描子程序,详情可见附录二。
第7章  软件调试及系统仿真
7.1  软件编译调试环境——Keil
单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
7.2  系统仿真环境——Proteus
Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件具有如下特点:①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。④具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。
7.3  系统仿真
由于Proteus里没有超声波传感器,也没有能够完全代替它功能元件,所以本设计只叙述其能仿真出来一部分。
1)    源程序的录入
先右击AT89C51,再左击AT89C51,会出现如图7.1所示的对话框,点击file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image058.jpg,选择所需要的HEX文件。然后单击OK。
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image060.jpg

















  
        
图7.1  录入源程序对话框
   
   
   


2)    仿真的实现
一切准备就绪后,点击file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image062.jpg,就开始仿真了。
图7.2为本设计的系统仿真原理图。

























file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image064.jpg

















  
        
图7.2  系统仿真原理图
   
   
   



7.4  误差及特性分析
虽说在仿真时温度传感器DS18B20是可视调节,且全为整数,但LED显示时当温度达到一定范围便会出现小数误差。例如当DS18B20显示是28℃时,而LED显示是28.4℃;而当DS18B20显示是25℃时,而LED显示仍是25℃;而仿真表明随着温度的升高其误差大小也并不一致,且全都控制在1℃以内。说明这并不是固有误差,很难避免,可以忽略,其对距离测量的影响也微乎其微,并不会使距离测量精度明显降低。
根据超声波的特性,距离测量时必须满足条件:①被测目标必须垂直于超声波测距仪。②被测目标表面必须平坦。③测量时在超声波测距仪周围没有其他可反射超声波的物体。因此在测量过程中稍不小心就会接收不到超声波,而导致没有测量结果。
由于超声波的往返时间由单片机AT89C51的定时器T1来记,定时器T1工作在方式1,其最大定时时间为65.536ms,可得出在常温下最大的测量距离在10m以内。且因为发射功率有限,测距仪也无法测量10m外的物体。

结  论
利用51系列单片机设计的测距仪便于操作、读数直观。经实际测试证明,该类测距仪工作稳定,能满足一般近距离测距的要求,且成本较低、有良好的性价比。由于该系统中锁相环锁定需要一定时间,测得的距离有误差,在汽车雷达应用中可忽略不计;但在精度要求较高的工业领域如机器人自动测距等方面,此误差不能忽略,可以通过改变一些硬件的应用实现对超声波的快速锁定或根据自己的需要在程序中加入测距软件补偿的代码,使误差进一步减小,可以满足更高要求。
本设计完整地做出之后可测量十米以内的距离。因为超声波的特性,测距时保证传感器与被测物间,以及测量轴线上没有障碍物;且要尽量保证传感器轴线与被测物表面垂直;实际测距范围与被测物表面材料等因素有关,一般不要测量表面为毛料的物体表面。

致  谢
从开始做论文到论文基本完成,经历了很长一段时间,从开始的一知半解到现在的全面了解算是经历了一个漫长的过程。在这个过程中有很多人给了我莫大的帮助。
首先要感谢的是我的指导老师李老师,在论文的整体设计给我很大的帮助,还有在我论文都定稿前认真的审阅了我的论文,指出我的错误和不足的地方,在这里深表感谢!其次我要感谢和我度过大学生活的同学,因为没有你们的帮助我是无法顺利地完成这个课题的!当然还有个别同学的专业知识让我深表佩服,以及他助人为乐的精神让我无法忘却,深深感谢!
还有我的母校,它给我提供了良好的学习环境,使我可以在这里学习自己想学习和自己要掌握的知识和技能。学校是个令人难忘的地方,在这里的时间是我无法忘记的。一定要谢的还有我的父母,他们总是竭尽所能的给我提供更好的环境,让我心里充满感激,感谢之情无法言言喻!大学给我留下了我人生不可磨灭的印象,给我留下了美好的回忆。最后祝愿我的母校祝越来越美丽。祝福老师们身体健康,工作顺利!同学们都能找到称心的工作!

参考文献
[1]林伟, 梁家宁,李才安. 便携式多功能超声波测距仪的设计与实现[J]. 电子测量技术,2008, (01): 29-31.
[2]罗庆生, 韩宝玲.一种基于超声波与红外线探测技术的测距定位系统[J]. 计算机测量与控制, 2005,(04):1-3.
[3]高飞燕. 基于单片机的超声波测距系统的设计[J]. 信息技术, 2005,(07):43-45.
[4]赵海鸣,卜英勇,王纪婵, 周知进. 一种高精度超声波测距方法的研究[J]. 湖南科技大学学报(自然科学版), 2006,(03):8-10.
[5]路锦正, 王建勤,杨绍国, 赵珂, 赵太飞.超声波测距仪的设计[J] .传感器技术, 2002,(08):9-11.
[6]牛余朋, 成曙.基于单片机的超声波测距系统[J]. 兵工自动化, 2005, (04):44-46.
[7]张健, 李钢.超声波测距系统的研究与设计[J]. 合肥工业大学学报(自然科学版), 2004,(06):13-15.  
[8]阮成功, 蓝兆辉,陈硕. 基于单片机的超声波测距系统[J]. 应用科技, 2004, (07):8-10.
[9]童峰, 许水源,许天增. 一种高精度超声波测距处理方法[J]. 厦门大学学报(自然科学版), 1998,(04):8-10.
[10]孙育才,孙华芳,王荣兴. 单片机原理及其应用[M]. 北京:电子工业出版社,2006:1-287.
[11]胡大可,李培弘,方路平. 基于单片机8051的嵌入式开发指南[M].北京:电子工业出版社,2003:1-150.
[12]求是科技. 单片机通信技术与工程实践[M]. 北京:人民邮电出版社,2005:1-191.
[13]潭浩强. C程序设计[M]. 北京:清华大学出版社,2005:1-378.
[14]林志琦,郎建军,李会杰,佟大鹏. 基于Proteus的单片机可视化软硬件仿真[M].北京:北京航空航天大学出版社,2006:1-93.

附录1 整体电路图
file:///C:/Users/Du/AppData/Local/Temp/msohtmlclip1/01/clip_image066.jpg

附录2 程序
#include<reg51.h>
#include<stdio.h>
#include<math.h>
#include<intrins.h>
#define unint unsigned int
#define uchar unsigned char
#define LED P1                             //际温度值输出端口定义      
#define NOP _nop_()
sbit tem_in=P1^1;
sbit k1=P3^7;
sbit k2=P3^6;
sbit k3=P3^5;
sbit send=P1^0;
sbit recieve=P3^2;
uchar temp_h,temp_l;                   //温度值变量
float temnum;                //当前温度值
float t;                      //超声波往返所占用的时间
bit   setb;                     
bit   b;                    //测距成功标志位,当b=1时标志测距成功
uchar flag1;                               //正负标志位
uchar codeledcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//数码显示数据:0,1,2,3,4,5,6,7,8,9,-,消隐
uchar dispbuf[4]={0,0,0,0},tembuf[4]={0,0,0,0};
///////////////////////////////////////////////////////////////
void delay(unsigned int count)         
{
      unint i;
      while(count)
      {
             i=38;
             while(i>0)i--;
             count--;
      }
}
///////////////////////////////////////////////////////////////
void delay10ms(unsigned int n)     
{
   unsigned int j,k;
        while(n--!=0)
        {
                    for(j=0;j<10;j++)
                           for(k=0;k<72;k++)
                                  ;
        }   
}
///////////////////////////////////////////////////////////////
void delay_us(uchar n)                    
{
uchar i;
      i=0;
      while(i<n)
      {i++;}
      return;
}
///////////////////////////////////////////////////////////////
void dsreset(void)        //DS18B20重设
{
      unsigned int i;
      tem_in=0;
      i=103;
      while(i>0)i--;
      tem_in=1;
      i=4;
      while(i>0)i--;
}
///////////////////////////////////////////////////////////////
uchar readbyte(void)         //直接读一字节程序
{
      uchar i,k;
      i=8;
      k=0;
      while(i--)
      {     
             tem_in=1;
             delay_us(1);
             tem_in=0;
             k=k>>1;
             tem_in=1;
             NOP;
             if(tem_in)k |=0x80;      //tem_in为1时,则该位也为1
             delay_us(4);
      }
      return(k);
}
///////////////////////////////////////////////////////////////
void tmpwrite(unsigned char dat)  //函数功能:向B20写一字节
{    unsigned int i;
      unsigned char j;
      bit testb;
      for(j=1;j<=8;j++)
      {     testb=dat&0x01;
             dat=dat>>1;
             if(testb)
             {     tem_in=0;i++;i++;
                    tem_in=1;
                    i=8;while(i>0)i--;
             }
             else
             {
                    tem_in=0;
                    i=8;while(i>0)i--;
                    tem_in=1;i++;i++;
             }
      }
}
//////////////////////////////////////////////////////////////
void tmpchange(void)                  
{
      dsreset();                                         //复位
      delay(1);
      tmpwrite(0xcc);                              //跳过序列号命令
      tmpwrite(0x44);                             //转换命令
}
////////////////////////////////////////////////////////////
void tmp(void)                 //温度采集及转换
{   
       int m,n=0;
       float temnum1=0;               
     dsreset();
       delay(1);
       tmpwrite(0xcc);
       tmpwrite(0xbe);
       temp_l=readbyte();          //低位在前                           
       temp_h=readbyte();          //高位在后                                                                        
       flag1=temp_h&0xf8;
       if(flag1)
       {   n=flag1;
             temp_h=~temp_h;
             if(temp_l==0)temp_h++; //若低8位全为0且温度为负,取补时就要向高位进1
             temp_l=~temp_l+1;  
       }
       temnum1=(temp_h*256+temp_l)/16;
     if(temnum1<10)
       {   tembuf[3]=11;
             tembuf[2]=11;
             tembuf[1]=(uchar)temnum1;
             tembuf[0]=(uchar)(temnum1*10)%10;
       }   
       if(temnum1>=100)
       {
     tembuf[3]=(uchar)temnum1/100;
        m=(int)temnum1%100;
      tembuf[2]=(uchar)m/10;
        tembuf[1]=(uchar)m%10;
        tembuf[0]=(uchar)(temnum1*10)%10;           
       }
     if(temnum1<100&&temnum1>=10)   
       { tembuf[3]=11;
             tembuf[2]=(uchar)temnum1/10;
             tembuf[1]=(uchar)temnum1%10;
             tembuf[0]=(uchar)(temnum1*10)%10;
       }
       if(n==0xf8)tembuf[3]=10;
       temnum=temnum1;              
       }
//////////////////////////////////////////////////////////
void dis(void)             //温度显示
{
      uchar i;
   uchar j=0xfe;
             for(i=0;i<4;i++)                        //输送显示数据     
             {            
                 P0=0xff;
                    P0=ledcode[tembuf];
                    if(i==1)P0=ledcode[tembuf]+0x80;     //小数点显示
                    P2=j;
                    delay(15);
                    j=(j<<1)+0x01;                                      
             }
}
///////////////////////////////////////////////////////
void distance(void)                //计算测量得到的距离
{
   double radical,dist;
   if(b!=0)
   {
   radical=sqrt(1+(temnum+273)/273);
    dist=165.7*t*radical;
    dist=dist+0.005;  //四舍五入并留两位小数
      if(dist>0&&dist<10)
      {     dispbuf[3]=11;
             dispbuf[2]=(uchar)dist;
             dispbuf[1]=(uchar)(dist*10)%10;
             dispbuf[0]=(uchar)(dist*100)%10;
      }     
      if(dist>=10&&dist<=0)   //测量距离大于10米或小于0显示"----",也有出错的意思
      {
     dispbuf[3]=10;
       dispbuf[2]=10;
       dispbuf[1]=10;
       dispbuf[0]=10;           
         }
   if(dist<100&&dist>=10)  
      {   dispbuf[3]=(uchar)dist/10;
             dispbuf[2]=(uchar)dist%10;
             dispbuf[1]=(uchar)(dist*10)%10;
             dispbuf[0]=(uchar)(dist*100)%10;
      }
   }
      else                 
      {                        //当T1溢出时,则测量时间无效
        dispbuf[3]=10;
          dispbuf[2]=10;
          dispbuf[1]=10;
          dispbuf[0]=10;            
      }
}   
///////////////////////////////////////////////////////
void dis1(void)                        //距离显示
{
      uchar i;
    uchar j=0xfe;
             for(i=0;i<0;i++)                        /*输送显示数据*/     
             {            
                 P0=0xff;
                    P0=ledcode[dispbuf];
                    if(i==2)P0=ledcode[dispbuf]+0x80;     //小数点显示
                    P2=j;
                    delay10ms(1);
                    j=(j<<1)+0x01;                                      
             }
}
///////////////////////////////////////////////////////////////
void dis2(void)  
{
      uchar i;                 
    uchar j=0xfe;
       dispbuf[3]=11;
          dispbuf[2]=11;
          dispbuf[1]=11;
          dispbuf[0]=0;     
             for(i=0;i<4;i++)                         /*输送显示数据*/     
             {            
                 P0=0xff;
                    P0=ledcode[dispbuf];
                    P2=j;
                    delay10ms(1);
                    j=(j<<1)+0x01;                        
             }
}
///////////////////////////////////////////////////////////////
void timer1(void)interrupt 3
{  
   TR1=0;
   TH1=0x00;
   TL1=0x00;
}
///////////////////////////////////////////////////////////////
void timer0(void)interrupt 1
{
    send=!send;
    TH0=0x1f;
    TL0=0xf4;
}
///////////////////////////////////////////////////////
void int1(void)interrupt 2
{
      if(TH1!=0x00&&TH0!=0x00)
      {
         b=1;
         TR1=0;
         TR0=0;
         t=TH1*256+TL1;
       t=t/1000000;
       TH0=0x1f;
       TL0=0xf4;
       TH1=0x00;
       TL1=0x00;
      }
      else
      {
         b=0;
         TR1=0;
         TR0=0;
       TH0=0x1f;
       TL0=0xf4;
       TH1=0x00;
       TL1=0x00;
    }
}
///////////////////////////////////////////////////////
main()
{   
       unint i;
       EA=1;                                //开中断
     TMOD=0x10;     //设定时器0、定时器1都工作在定时状态,T0方式0,T1方式1
     ET0=1;                              //定时器0中断允许
     ET1=1;                              //定时器1中断允许
       IT1=0;                               //外部中断1低电平有效
     TH0=0x1f;
     TL0=0xf4;
     TH1=0x00;
     TL1=0x00;
     send=1;
     receive=1;
     k1=1;
     k2=1;
////////////////////////////////////////////////////////////////
   while(1)
   {
     dis2();
   if(k1!=1)    //判断k1是否按下,按下则开始执行温度转换和测距操作
   {
      delay(100);                     //消抖
      if(k1!=1)
      {
       tmpchange();                                //启动温度转换
       tmp();
       EX1=1;                         //外部中断1中断允许
       TR0=1;                         //T0定时开始  
     TR1=1;                         //T1定时开始
       delay10ms(7);
     distance();
       EX1=0;
   while(1)
   {
     dis1();
      if(k2!=1)
      {  
         delay(100);
         if(k2!=1)                       
            {
           for(i=0;i<200;i++)
          {
                    tmpchange();                           
              tmp();
                 dis();
                    }
                 }
       }
      if(k3!=1)
      {
         delay(100);
         if(k3!=1)
         break;
                }
         }
         }
         }
       }
      }
/////////////////////////////////////////////////
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:415885 发表于 2018-10-26 16:47 | 只看该作者
楼主可以发一份到我的邮箱吗?820680749@qq.com 谢谢
回复

使用道具 举报

板凳
ID:338343 发表于 2018-10-30 11:17 来自手机 | 只看该作者
麻烦楼主发一份资料1533806225@qq.com
回复

使用道具 举报

地板
ID:413816 发表于 2018-11-6 08:10 | 只看该作者
可以共享一下么
回复

使用道具 举报

5#
ID:422055 发表于 2018-11-27 23:09 | 只看该作者
楼主可能发一份资料
回复

使用道具 举报

6#
ID:448741 发表于 2018-12-18 11:20 | 只看该作者
楼主可以发一份到我的邮箱吗?794253266@qq.com  万分谢谢
回复

使用道具 举报

7#
ID:448741 发表于 2018-12-18 11:21 | 只看该作者
楼主可以发一份到我的邮箱吗?794253266@qq.com  非常 谢谢
回复

使用道具 举报

8#
ID:458913 发表于 2019-1-1 03:00 | 只看该作者
楼主可以发一份到983343655@qq.com吗,谢谢
回复

使用道具 举报

9#
ID:460779 发表于 2019-1-3 11:45 | 只看该作者
楼主可以发一下邮箱吗?374825675@qq.com   顺便附加一下购买清单
回复

使用道具 举报

10#
ID:461770 发表于 2019-1-7 16:12 | 只看该作者
楼主很棒很优秀
回复

使用道具 举报

11#
ID:458993 发表于 2019-1-18 22:30 | 只看该作者
楼主可以发一份到我邮箱吗1203220507@qq.com万分感谢
回复

使用道具 举报

12#
ID:508630 发表于 2019-4-11 16:15 | 只看该作者
能把这份资料发给邮箱吗 1255271146@qq.com 谢谢楼主
回复

使用道具 举报

13#
ID:508630 发表于 2019-4-15 12:21 | 只看该作者
能把这份资料发给邮箱吗 1255271146@qq.com 谢谢楼主
回复

使用道具 举报

14#
ID:521841 发表于 2019-5-6 12:42 | 只看该作者
能发一份资料给邮箱吗?  1711416709@qq.com  谢谢楼主
回复

使用道具 举报

15#
ID:528642 发表于 2019-5-6 20:36 | 只看该作者
#在这里快速回复# 楼主可以发一份到我的邮箱吗?1757945247@qq.com  非常 谢谢
回复

使用道具 举报

16#
ID:530335 发表于 2019-5-8 09:49 | 只看该作者
楼主,求发一份1363445327@qq.com
回复

使用道具 举报

17#
ID:537953 发表于 2019-5-14 14:39 | 只看该作者
楼主麻烦发一份到843337000@qq.com呗,谢谢
回复

使用道具 举报

18#
ID:538834 发表于 2019-5-15 14:36 | 只看该作者
楼主发一份可以吗谢谢了1571413163@qq.com
回复

使用道具 举报

19#
ID:529995 发表于 2019-5-22 12:58 | 只看该作者
楼主大大发一份 谢谢 741320452@qq.com
回复

使用道具 举报

20#
ID:547838 发表于 2019-5-26 20:37 | 只看该作者
楼主能把这份报告发我邮箱吗?1393616275@qq.com  拜托了( •̥́ ˍ •̀ू )
回复

使用道具 举报

21#
ID:547838 发表于 2019-5-26 20:41 | 只看该作者
楼主能把这份资料发我一份吗?1393616275@qq.com拜托了( •̥́ ˍ •̀ू )
回复

使用道具 举报

22#
ID:558772 发表于 2019-6-11 15:56 | 只看该作者
楼主能把这份资料发我一份吗?1172856120@qq.com拜托了( •̥́ ˍ •̀ू )
回复

使用道具 举报

23#
ID:560408 发表于 2019-6-11 22:13 | 只看该作者
楼主能把这份报告发我邮箱吗?529447492@qq.com  拜托了( •̥́ ˍ •̀ू )
回复

使用道具 举报

24#
ID:573965 发表于 2019-7-3 18:00 来自手机 | 只看该作者
楼主求一份资料  568950581@qq.com
回复

使用道具 举报

25#
ID:611879 发表于 2019-11-12 14:58 | 只看该作者
麻烦楼主大大发一份 谢谢  1015783190@qq.com
回复

使用道具 举报

26#
ID:646715 发表于 2019-11-21 18:53 | 只看该作者
麻烦楼主大大能够发我一份谢谢1148219767@qq.com
回复

使用道具 举报

27#
ID:660643 发表于 2019-12-10 15:18 | 只看该作者
麻烦楼主大大可以发我一份么  1289409611@qq.com  谢谢
回复

使用道具 举报

28#
ID:660643 发表于 2019-12-25 10:12 | 只看该作者
同求啊,谢谢
回复

使用道具 举报

29#
ID:734945 发表于 2020-4-30 11:29 | 只看该作者
为啥看不到图片啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表