AT89c2051制作的超声波测距源程序

合集下载

基于AT89C51单片机超声波测距仪的设计

基于AT89C51单片机超声波测距仪的设计

图书分类号:密级:毕业设计(论文)基于AT89C51单片机超声波测距仪的设计BASED ON AT89C51 ULTRASONIC RANGEFINDER DESIGN学生姓名严海波学院名称信电工程学院专业名称电子信息工程技术指导教师高玉芹2009年 5 月15日摘要超声波是一种在弹性介质中的机械振荡,它是由与介质相接触的振荡源所引起的,其频率在20000Hz以上。

由于它有指向性强、方向性好、传播能量大、传播距离较远等特点,因此常用于测量物体的距离。

本文介绍了基于AT89C51单片机的超声波测距仪的软硬件设计,整个系统分为单片机控制模块、发射模块和接收模块组成。

程序采用模块化设计,由主程序、预置子程序、发射子程序、接收子程序、显示子程序等模块组成。

超声探头接收的信号经单片机综合分析处理后,实现了超声波测距仪的各种功能。

关键词超声波 AT89C51 测量距离目录1绪论 (1)1.1研究背景 (1)1.2研究内容 (1)2 相关知识 (2)2.1超声波发生器 (2)2.2.单片机的任务 (2)2.3AT89C51单片机主要特性和引脚功能 (2)3理论分析与计算 (5)3.1测量与控制方法 (5)3.3超声波测距误差分析 (6)4系统硬件电路设计 (8)4.1单片机系统及显示电路 (8)4.1.1 74LS244的简介 (9)4.2超声波发射电路 (9)4.3超声波监测接收电路 (10)4.4显示电路原理 (11)5系统软件设计 (12)5.1主程序 (12)5.2超声波发生子程序和接收子程序 (13)5.3超声波的接收与处理 (13)6单片机系统的可靠性 (15)6.1测试单片机系统的可靠性 (15)6.2单片机的抗干扰性 (15)7软硬件调试 (16)7.1调试 (16)7.2提高精度的方案及系统设计 (16)8系统的扩展 (18)8.1DS18B20的简介 (18)8.11DS18B20的主要特性 (18)8.12 DS18B20的外形和内部结构 (18)8.13 DS18B20的工作原理 (19)8.14 DS18B20有4个主要的数据部件 (19)8.2DS18B20与单片机的连接 (20)8.3DS18B20与51单片机的连接程序 (21)结论 (27)致谢 (28)参考文献 (29)附录 (30)附录1电路原理图 (30)附录2程序源代码 (31)1 绪论1.1 研究背景由于社会不断进步发展,许多传统的测距方法已经无法满足我们的需求,例如在井深,液位,管道长度等场合。

基于AT89C2051的超声波测距系统

基于AT89C2051的超声波测距系统

信息技术与信息化开发与应用2006年第5期131 基于AT89C2051的超声波测距系统U ltras onic Ranging System Based on AT89C2051朱爱红3 朱宁文ZHU A i -hong ZHU N ing -w en摘 要 本文介绍了一种基于AT89C2051单片机控制的超声测距系统的工作原理、系统构成和误差分析。

文章详细叙述了系统的硬件设计,并给出了系统软件设计程序流程图,通过误差分析,说明了其应用的实用性。

关键词 超声波测距 单片机 视觉系统 Abstract This paper intr oduces the operati onal p rinci p le,syste m structure and err or analysis of ultras onic ranging syste m based on AT89C2051.It describes the hard ware design of the syste m in detail,and p r ovices the p r ocedural fl ow chart of s oft w are design .It can exp lain the app lied functi on of the syste m thr ough the err or analy 2sis .Keywords U ltras onic ranging MCU V isual syste m3山东神思电子技术有限公司 济南 2501001 引言测距现状:目前一般都采用波在介质传播速度和时间关系进行测量。

常用的技术主要有激光测距、微波雷达测距和超声波测距三种。

激光测距。

这是利用激光的单色性和相干性好、方向性强等特点,以实现高精度的计量和检测,如测量长度、距离、速度、角度等等。

手持式和便携式测距仪,作用距离为数百米至数十千米。

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

基于AT89C51单片机的超声波测距系统
MIAN
不同形状和位置的对象物,其回波波形大致相同,只是 波幅不同。于是,该系统采用了变阈值鉴幅固定补偿法:a.采 用微处理器闭环控制自动改变阈值。b.在超声回波中鉴别其包 络峰附近少于6个波的第一个波,形成关闭定时器的触发信 号,并同时设置检测窗口。c.计数检测窗口内的鉴别回波格式 n(鉴别回波=窗口内鉴别回波数+1)个。d.判断n的大小,若 n>5,则减小鉴别规定阈值,转到b.重新检测,若≤5,则 从先验的固定补偿值表中取出与n相对应的补偿值进行修正。 其鉴别回波提取及补偿时间表示如图2所示。
超声波测距原理
超声测距从原理上可分为共振式、脉冲反射式两种。由 于共振法的应用要求复杂,在这里使用脉冲反射式。超声波 测距原理是通过超声波发射器向某一方向发射超声波,在发 射时刻的同时开始计时,超声波在空气中传播,途中碰到障 碍物就立即反射来,超声波接收器收到反射波就立即停止计 时。超声波在空气中的传播速度为c,而根据计时器记录的测 出发射和接收回波的时间差t,就可以计算出发射点距障碍物 的距离S,即:S=ct / 2。这就是所谓的时间差测距法。
t′

Δt


初始化 采样回放峰值 加权给定鉴别阈值 采样温度计算声速
增大鉴别 阈值给定

等待开始计时标志 按时间自动改变增益
减小鉴别 阈值给定
收到回波?


n > 5?
N 补偿值修正数据处理
计算距离输出显示
T0
到5 s?




图3 主程序框图
图2 鉴别回波的提取与补偿时间表示 1—超声回波 2—鉴别阈值 3—鉴别窗口 4—鉴别回波
由于超声波也是一种声波,其声速c与温度有关,附表 列出了几种不同温度下的声速。在使用时,如果温度变化不 大,则可认为声速是基本不变的。如果测距精度要求很高,则 应通过温度补偿的方法加以校正。

基于AT89C2051单片机的超声波测距系统设计

基于AT89C2051单片机的超声波测距系统设计

基于AT89C2051单片机的超声波测距系统设计作者:舒秀兰来源:《数字技术与应用》2013年第06期摘要:本文从超声波原理、硬件设计、软件设计方面介绍一个超声波测距系统的实现,并通过串口调试助手及示波器等辅助设备得到和验证实验结果。

经实验结果分析得出,该测距系统实现简单、成本低,具有较高的测距精度,有一定的社会使用价值关键词:超声波单片机物距测量中图分类号:TN802.4 文献标识码:A 文章编号:1007-9416(2013)06-0159-021 超声波测距简介当音频的频率高于2KHZ超出人耳所能接受的声音频率范围时,我们称之为超声波。

超声波在空气中传播向性好,穿透能力强,不受光波、电磁波等的干扰,因此它常用于空气或水中进行物距测量、速度探测或是某些特殊功能如清洗消毒等,其在工程学、医学、生物学科等多个领域都有广泛应用。

在工程学中,利用超声波进行汽车防撞、液位测量、移动机器人定位和避障等方面物距的探索及测量的需求都很普遍。

2 超声波原理和测距方法2.1 压电式超声波传感器原理超声波发生器的工作原理通常被分为机械式和电气式作用产生二种。

本设计采用压电式(电气式)作用原理,具体步骤:首先发射器向外发射超声波,接着超声波在空气或水等介质中传播,当遇到障碍物后反射,形成回波,最后由接收器感测接收回波。

2.2 超声波测距方法3 超声波测距方案的实现3.1 硬件设计本文使用渡越时间法进行超声波测距,测控芯片选用的是89c2051单片机。

系统主要硬件设计包括稳压电路、超声波发射电路、超声波接收电路、以及测距显示电路。

另外还有一个串口调试电路,主要用作超声波测距的数据调试和显示。

工作过程描述:单片机的P3.3作为超声波发射控制端口,用于发射相关信号使发射电路起振从而发出超声波;超声波发出的同时、启动定时器计数,开始测量渡越时间;P3.2作为超声波接受控制端口,用于接收经障碍物反射的回波;一旦接收到有效回波信号,单片机的定时器立即停止计数得计数脉冲个数N并通过串口调试助手显示在电脑屏幕上,代入公式(2)计算可得出预测距离s,换算后的距离经由LCD1602实时显示。

基于AT89S51单片机的超声波测距仪设计

基于AT89S51单片机的超声波测距仪设计

基于AT89S51单片机的超声波测距仪设计学生姓名:所在系:专业名称:班级:学号:指导教师:基于AT89S51单片机的超声波测距仪设计学生:指导教师:内容提要:咱们明白,当物体振动时会发作声音。

科学家们将每秒钟振动的次数称为声音的频率,它的单位是赫兹。

咱们人类耳朵能听到的声波频率为20~20000赫兹。

当声波的振动频率大于20000赫兹或小于20赫兹时,咱们便听不见了。

咱们把频率高于20000赫兹的声波称为“超声波”。

超声和可闻声本质上是一致的,它们的一起点都是一种机械振动。

其不同点是超声频率高,波长短,具有方向性强、能量集中、不受光和电磁波和粉尘等外界因素的干扰等优势。

因此,超声波可用于非接触测量,利用计算超声波在被测物体和超声波探头之间的传输来测量距离的,对被测目标无损害。

而且超声波传播速度在相当大范围内与频率无关。

正由于如此,目前关于超声波精准测距的需求也愈来愈大,在机械制造,电子冶金,航海,宇航,石油化工,交通等工业领域具有普遍地应用。

另外,在材料科学,医学,生物科学等领域中也占具重腹地位。

本文要紧介绍基于AT89S51单片机,辅助以CX20206A红外接收专用放大电路,TCT40-10超声波传感器和数字化的温度传感器DS18B20设计的超声波测距仪。

测距原理采纳一样的方式:渡越时刻法TOF(time of flight)来测量物体与发声源的距离。

测量距离可能5m,测量精度约为0.01m。

关键字:超声波渡越时刻法 AT89S51 CX20206A TCT40-10 DS18B20AT89S51 MCU-BASED DESIGN OF ULTRASONICRANGE FINDERAbstract:We know that objects will sound when they vibrate. Scientists call the number of vibrations per second frequency of sound, its unit is the Hertz. Our human ears can hear the sound frequency between 20 ~ 20,000 Hz. When the sound wave frequency is greater than 20000 Hz or less than 20 Hz, we can’t listen it. We have higher than 20000 Hz frequency sound waves known as "Ultrasonic". The sound wave which we can listen and ultrasonic have the same essence, they are also a mechanical vibration. Their difference is that the ultrasonic have a high-frequency and a short wavelength, furthermore it is high directivity, concentrated energy, and free form light and dust, such as electromagnetic interference from external factors, etc. Therefore, ultrasound can be used for non-contact measurement, the use of ultrasound in the calculation of the measured objects and the transmission between the ultrasonic probe to measure the distance of the measured target without damage.This paper mainly introduces single-chip based on the AT89S51, auxiliary CX20206A infrared receiver to a dedicated amplifier and TCT40-10 ultrasonic sensor designed ultrasonic range finder. Ranging general principle of the method used: transit-time method TOF (time of flight) to measure objects with the sound source distance. Measuring the distance about 5m, the measurement accuracy of about 0.01m.Key words:ultrasonic time of flight ultrasonic-sensor AT89S51 CX20206A TCT40-10 DS18B20目录一、引言............................................................................................................ 错误!未定义书签。

基于89C51单片机小车超声波测距毕业设计打印版

基于89C51单片机小车超声波测距毕业设计打印版

摘要89C51单片机是一款八位单片机,他的易用性和多功能性受到了广大使用者的好评。

本系统以设计题目的要求为目的,采用89C51单片机为控制核心,利用超声波检测道路上的障碍,控制电动小汽车的自动避障,快慢速行驶,以及自动停车,并可以自动记录时间、里程和速度,自动寻迹和寻光功能。

整个系统的电路结构简单,可靠性能高。

采用的技术主要有:(1)通过编程来控制小车的速度;(2)传感器的有效应用;(3)新型显示芯片的采用;关键词89C51单片机、光电检测器、PWM调速、电动小车Design and create an intelligence electricity motive small carAbstract89C51 is a 8 bit single chip computer.Its easily useing and multi-function suffer large users. This article introduce the CCUT graduation design with the 89C51 single chip copmuter.This design combines with scientific research object. This system regard the request of the topic, adopting 89C51 for controling core,super sonic sensor for test the hinder.It can run in a high and a low speed or stop automatically.It also can record the time ,distance and the speed or searching light and mark automatically The electric circuit construction of whole system is simple, the function is dependable. Experiment test result satisfy the request, this text emphasizes introduced the hardware system designs and the result analyse.The adoption of technique as:(1)Reduce the speed by program the engine;(2)efficient application of the sensor;(3)The adoption of the new display chip.Keywords89C51 single chip computer、light electricity detector、PWM speed adjusting目录1引言 (1)2系统的总体设计方案 (2)2.1直流调速系统的设计 (2)2.2小车检测系统的设计 (3)2.2.1行车起始、终点及光线检测 (3)2.2.2行车距离检测 (6)图2.4 行车距离检测电路 (6)2.3显示电路 (7)2.4系统原理图 (7)3 硬件设计 (8)3.1单片机89C51硬件结构 (8)3.2最小应用系统设计 (10)3.3前向通道设计 (12)3.3.1传感器的选择 (12)3.3.2单片机测距原理 (12)3.3.3超声波发射电路 (13)3.3.4 超声波检测接收电路 (13)3.3.5超声波测距仪的算法设计 (14)3.4后向通道设计 (14)3.4.1脉宽调制原理: (16)3.4.2逻辑延时环节: (17)3.4.3 电源的设计 (17)3.5显示电路设计 (17)4 软件设计 (19)4.1主程序设计 (20)4.2显示子程序设计 (23)4.3避障子程序设计 (24)4.4软件抗干扰技术 (25)4.4.1数字滤波技术: (25)4.4.2开关量的软件抗干扰技术: (25)4.4.3指令冗余技术: (26)4.4.4软件陷阱技术: (26)4.5“看门狗”技术 (27)4.6可编程逻辑器件 (28)5结论 (29)致谢 (30)参考文献 (31)附录A 程序清单 (32)附录B 硬件原理图 (40)1引言随着汽车工业的迅速发展,关于汽车的研究也就越来越受人关注。

基于AT89C2051的超声波测距系统

基于AT89C2051的超声波测距系统

第33卷第11期应用科技V o.l 33,l .112006年11月A pp lied Science and T echno l ogyN ov .2006文章编号:1009-671X (2006)11-0011-04基于AT89C2051的超声波测距系统高 川,谈振藩(哈尔滨工程大学自动化学院,黑龙江哈尔滨150001)摘 要:介绍了利用超声波传感器实现的非接触式距离检测系统.该系统可以用于汽车倒车时的报警、液位和物位的非接触式测量.介绍了超声波传感器原理及系统各单元的设计.系统中采用了AT89C2051型单片机作为主控制器.把一种直流电机P WM 调速芯片应用到此系统中,使得控制方法简便,应用范围增强,同时可以利用单片机设定距离值和输出控制信号.最终距离用串行方法在数码管上显示出来,可以直观地查看距离值,以实现测距、显示、输出控制信号的功能.关键词:单片机;超声波;L293;测距中图分类号:T P274.53 文献标识码:AAn ultrasonic distance m eas ure m ent syste mbased on AT 89C 2051m icroco mputerGAO Chuan ,TAN Zhen -fan(Co llege of A uto m ation ,H arb i n Eng i nee ri ng U niversity ,H arb i n 150001,Ch i na)Abst ract :A d istance m easure m ent dev ice usi n g ultrason ic sensors is presented wh ich can be used as astern alar m or non -contactm easuri n g dev i c e for liqu i d leve l and object position .The design of each unit o f the syste m and t h e pr i n ciple of ultrason ic sensors has been descri b ed i n deta i.l The syste m utilizesAT89C2051m icroco m puter asm a j o r contro ller .ADC m o tor P WM velocity regu lati o n ch i p is used i n this syste m,m aking the contr o lm ethod si m pler and app lication range w ider .The distance and outpu t control si g na l can be set up by M C U.The m easured distance can be d isplayed on LED.H ence ,the functions of d istance m easure m en,t d isp lay ,and control si g na l output have been achieved .K eywords :m icroco m puter ;ultrasonic sensor ;L293;distance m easure m ent 收稿日期:2006-06-26.作者简介:高 川(1983-),男,本科,主要研究方向:导航制导与控制;谈振藩(1942-),男,教授,主要研究方向:导航制导与控制,E-m ai:l tanzhen f an@h .非接触式的距离测量在工业中有广泛的应用:机器人视觉系统中对距离的测量,汽车倒车雷达系统及液位、物位的检测系统等.有鉴于此,设计了基于超声波传感器的测距控制系统,以实现距离的测量和显示,并能输出控制信号及实现和上位机的通信.与以往类似系统不同的是:本设计采用了一种直流电机P WM 调速芯片作为超声波发射驱动电路.其优点是:电路简单,易于控制,而且对于不同电压峰值要求的超声波传感器,可以改变其供电电压值.显示部分采用一种串行通讯芯片驱动数码管,以节约单片机I O 口的使用数量和提高数码的显示的质量.因此,系统应用灵活,实用性强,其模块化设计可嵌入到不同的系统中.1 超声波测距传感器超声波传感器是一种换能器,它把电能或机械能转换成声能.本设计采用压电式超声波换能器,它是利用压电晶体的谐振来工作的.该传感器有2个压电晶片和1个共振板,当其两极外加脉冲信号,且频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动产生超声波.如果两极间不加电压,当共振板接收到超声波时,声波将迫使压电晶片振动,使机械能转换为电信号,这时它就成为超声波接收器[1].每个传感器的中心频率都存在一定的误差,在40kH z 左右波动.而且超声波传感器发射波束时存在发散角问题,一般发散角都比较大,从而导致了方向性较差.同时,随着传播距离的增大,在不同的发散角上信号衰减的程度也有变化.它在空气中的发散角及耗散性如图1所示[2-3〗.图1 发散角与耗散性采用反射式超声波测距的原理是:当单片机控制超声波传感器向某一方向发射波束的同时,单片机内部开始计时.在传播过程中,超声波遇障碍物后反射回波.传感器接收到第一个反射波后,停止计时.由于超声波在空气中的传播速度是340m /s ,根据计时时间及公式S =340t /2,即可得到发射点距障碍物的距离S .2 系统总体方案设计超声波测距系统包括4个部分,即①发射电路中振荡器驱动控制电路;②接收电路中模拟放大、滤波、信号调制电路;③数码管显示电路;④单片机系统及其串口输出、控制信号输出、按键输入部分.其方框图如图2所示.图2 系统原理框图3 硬件电路设计3.1 超声波发射单元超声波发射单元包括振荡电路和驱动电路.振荡电路是由反相器CD4069组成的非对称式多谐振荡器,它产生40kH z 的方波脉冲电路如图3所示.电路中G 2输出的电压由于R f 的调节,可以改变输入到G 1输入端的相位.当相位达到同相时,G 1和G 2实现正反馈,G 1和G 2就成了稳定的振荡器.振荡周期公式为T =2.2@R f @C .因为CD4069为C MOS 结构,所以逻辑门前的电阻R p 为G 1的保护电阻.当R p 足够大时,G 1的输入电流可忽略不计.由于超声波换能器中心频率都有偏差,所以P f 采用电位计,可以调节到最佳谐振点,这也是不用单片机产生方波的原因.电路中Z 1,Z 2同时得到相位相反的2路控制脉冲,提供给驱动电路[2].驱动控制电路如图4所示.它采用了L293型直流电机P WM 调速芯片,它内部的H 桥电路可以产生相位相反的两路脉冲.驱动电路的直流电源电压可以改变,以适应不同传感器对电压的要求.振荡电路中产生方波的Z 1、Z 2端,分别接到驱动电路I N 1,I N 2端.控制输出电路中E N 端为输出使能端,它接到单片机的P1.7端口,该端口精确输出高电平时间来控制发射方波的个数.这在设计上使得控制和方波产生相对独立,从而使得电路简单、控制精确、易于调试.图3 振荡电路图4 驱动电路3.2 超声波接收单元超声波接收单元中包括:模拟放大、滤波电路、电平转换电路,如图5所示.模拟放大器选用高精度仪用放大器L M 318作为信号放大与滤波之用,它的单位增益带宽为15MH z ,超出音频范围能够满足40k H z 的要求[5].在放大电路的负反馈回路中接入电容C 1构成低通滤波器.电容的选择可由公式f =1/2P R f C 求出,式中f 0为采用的超声波频率,R f 为第一级的#12#应 用 科 技 第33卷反馈电阻.因为多谐振荡器中有高频分量噪声,所以通过低通滤波器将高频噪声滤掉.经过2极放大后,通过电容耦合,信号与参考电压比较产生高低电平,提供给单片机产生中断.参考电压设定为1V 左右,以提高灵敏度.第2个比较器仅起反相作用[6].图5 接收电路3.3 数码管显示电路数据显示采用串行接口LED 显示驱动管理芯片MC14489,它的输入端与系统CP U 之间只有3条I/O 口线相连.这3个端口是:使能端E NBLE 、时钟端CLOCK 、数据端DATA I N ,通过这3个端口写控制字和数据.更新显示寄存器的内容,需要传送3个字节的信息,更新配置寄存器的内容仅需要传送一个字节的信息.这种芯片可以显示5位数码管数据,本系统只用到了4位.驱动电压为5V,亮度调节通过Rx 端口与地之间连接的电阻来调节,电阻增大亮度减小.显示电路如图6所示.图6 显示电路3.4 单片机系统发射的超声波被调制成包含40kH z 方波的具有一定时间间隔的矩形波脉冲信号,其发射、接收脉冲工作时序图如图7所示.由单片机AT89C2051的P1.7口控制H 桥电路的使能端EN,送出40k H z 的超声波脉冲信号,其脉冲宽度及脉冲间隔均由软件控制.脉冲宽度约为125~200L s ,即在一个调制脉冲内包含5~8个40kH z 的方波.脉冲发送间隔取决于要求测量的最大距离.若在有效测距范围内有被测物体,则在后一次超声波束发出之前应当接收到前一次发射的反射波,否则认为前方无被测物体.因此,按有效测距范围可以估算出最短的脉冲间隔发送时间.例如:最大测距范围为10m 时,脉冲间隔时间t =2s /v =2@10/340U 60m s ,实际应取t \60m s .本系统为方便起见,选择脉冲间隔定时器为65m s [5].图7 发射和接收脉冲时序图3.5 串口输出MC14489可以通过和单片机串口进行通信,当显示面板离主控制板较远时,数据信号将会衰减,所以可通过串口来传输数据.3.6 按键输入本系统可以设定距离值,当大于或小于设定值时将发出控制信号.P1.5、P1.6输出高低电平,从而可以控制继电器等外部设备.由3个按键设定距离值:S 0的作用是进入和退出设定,S 1和S 2分别是向上加值和向下减值,每按一次加或减一厘米,由数码管输出显示.4 系统软件设计该系统软件采用8051汇编语言编写,主程序流程图如图8所示.AT89C2051单片机有2个外中断口,分别用于接收回波中断和按键输入中断,对应2个外中断子程序.此外,还用到了内部中断定时器T 0,它用于控制发送载波脉冲,如图9所示.T 0定时器65m s 产生中断一次,主要是发送载波脉冲和计数器清零.外中断0将在有下降沿触发时产生中断,用于读取定时器产生的计时值和使标志位置位.外中断1是按键输入中断,用于提供比较值来输出控制信号.S 0第一次触发为中断产生信号,再次触发则为输入确定信号.S 1和S 2按键是输入值增加和减少按键,它们通过判断对应的I O 口状态来确定是否输入[8].#13#第11期高 川,等:基于AT 89C2051的超声波测距系统图8主程序流程图图9 各中断子程序流程图5 测试结果与分析超声波测距系统调试完成后,对系统进行了测试.在超声波换能器与较大平面(如墙壁面)法线方向一致时,量程为0.04~10m,测距盲区为4c m,分辨率为0.01m,最大测量误差[0.02m.因为超声波具有一定发散角,所以当在正前方和斜前方都有物体时,会以距发射器最近的物体作为探测目标.误差分析:限制该系统最大可测距离的因素包括:超声波的幅度、反射面的质地、反射和入射声波之间的夹角以及接收换能器的灵敏度.接收换能器对声波脉冲的直接接收能力将决定最小的可测距离.测距误差主要来源于以下几个方面:①超声波波束对探测目标的入射角的影响;②超声波回波声强与待测距离的远近有直接关系;③超声波传播速度对测距是有影响的.稳定准确的超声波传播速度是保证测量精度的必要条件,传播媒质的特性,如温度、压力、密度对声速都将产生影响.因此,为了准确地计算距离,应对声速加以修正,系统程序中采用了软件补偿措施[9].6 结束语介绍了一种超声波测距系统,采用单片机及专门设计的驱动和接收电路,通过超声波换能器,可以测量和显示0.04~10m 内的物体距离,分辨率可达到0.01m.这种测距系统可用于物面和液面测量,汽车倒车报警装置.硬件采用模块化设计,可以嵌入到其他系统中.参考文献:[1]刘迎春,叶湘滨.传感器原理设计与应用[M ].长沙:国防科技大学出版社,2004.[2]HERR INGTON D R.U ltrason ic range finder uses fe w co m-ponents [J].EDN,1999(6):23-26.[3]S H I R LEY P A.A n introduc tion to u ltrason ic sensi ng[J].EDN,1989(11):15-l 8.[4]阎 石.数字电子技术基础[M ].北京:高等教育出版社,1998.[5]赵保经.中国集成电路大全集成运算放大器[M ].北京:国防工业出版社,1985.[6]谢 红.模拟电子技术基础[M ].哈尔滨:哈尔滨工程大学出版社,2001.[7]罗耀华,孟繁荣,姚绪梁,等.单片机原理及应用技术[M ].哈尔滨:哈尔滨工程大学出版社,2005.[8]吕淑萍,张子迎,于立君,等.微型计算机原理与应用[M ].哈尔滨:哈尔滨工程大学出版社,2004.[9]苏 炜,龚壁建,潘 笑.超声波测距误差分析[J].传感器技术,2004,23(6):8-11.[责任编辑:张晓京]#14#应 用 科 技 第33卷。

AT89C2051单片机结合温度补偿的超声波测距系统设计

AT89C2051单片机结合温度补偿的超声波测距系统设计

AT89C2051单片机结合温度补偿的超声波测距系统设计0 引言超声波是一种在弹性介质中的机械震荡,它是由与介质相接触的震荡源所引起的,其频率在20kHz以上。

由于超声波的速度相对于光速要小得多,其传播时间就比较容易检测,并且易于定向发射,方向性好,强度好控制,因而利用超声波测距在很多距离探测应用中有很重要的用途,包括无损检测、过程测量、机器人测量和定位,以及流体液面高度测量等。

利用单片机控制超声波检测往往比较迅速、方便、计算简单、易于实现,并且测量精度高。

1 系统设计超声波测距的最远距离和分辨能力,不仅需要良好的换能器,也需要合理的驱动电路及回波探测电路。

对发射而言,为了使电能到机械能的转换效益最大,换能器必须工作在它的共振频率处。

对接收电路而言,为了使机械能到电能的转换效率最大,最佳工作点必须取在反共振频率处,在传感器系统中,发射部分的共振频率要与接收部分的反共振频率相匹配。

同时,温度对声速有着较大的影响,温度补偿无疑是减少误差的很好方法。

本设计选用T40-16T/R超声波传感器,设计了一种以AT89C2051单片机为核心的低成本、高精度、微型化数字显示超声波测距仪。

为了进一步提高系统测量精度和系统稳定性,在硬件上增加了温度传感器测温电路,采取声速预置和媒质温度测量相结合的办法对声速进行修正,降低了温度变化对测距精度的影响。

有力提高了超声波测距系统的测量精度。

设计系统由单片机主控模块、显示模块、超声波发射模块、接收模块、温度测量补偿模块等五个模块组成,组成框图。

超声波发射电路由单片机输出端直接驱动超声波发送,超声波接收电路输出端与单片机相连接,单片机的输出端与显示电路输入端相连接。

单片机在TO时刻发射方波,同时启动定时器开始计时,当收到回波后,产生一负跳变到单片机中断口,单片机响应中断程序,定时器停止计数。

计算时间差即可得到超声波在媒介中传播的时间t,由此便可计算出距离。

2.1 超声波测距单片机控制系统单片机AT89C2051采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。

基于AT89C51单片机的超声波测距仪的设计2

基于AT89C51单片机的超声波测距仪的设计2

【摘要】 AT89C51是一个低功耗的并且高性能的 CMOS 8位单片机,片内包括4k Bytes ISP(In-system programmable)的可重复擦写1000次的Flash只可读的程序存储器,采用的器件是高密度的,不易丢失存储技术制造,MCS-51兼容的标准指令系统以及80C51引脚的结构,通用的8位中央处理器和ISP Flash存储单元在芯片内集成,AT89C51广泛应用在非常多的嵌入式控制应用系统中。

这次设计主要是利用AT89C51单片机、HC-SR04超声波传感器、蜂鸣器完成测距报警系统的制作,将AT89C51作为主控制芯片,利用超声波对物体的感应,将前方物体的距离探测出来,然后单片机处理运算,与设定的报警距离值进行比较判断,当测得距离小于设定值时,AT89C51发出指令控制蜂鸣器报警。

【关键词】:AT89C51单片机、HC-SR04超声波传感器、蜂鸣器一、绪论 1.1课题研究背景及意义随着社会的发展,人们对于距离的敏感度越来越高,生活上对距离的感知也越来越敏感,因此测距仪也受到了极大的欢迎。

它主要有三类,一类是激光测距仪,是根据光电元件接收目标反射的激光束来计算出测距者到目标的距离。

另一类是红外测距仪,利用红外线传播不扩散的原理进行测距,但方向性差。

还有一类是超声波测距仪,但也有局限性,传播需要介质,超声波发射器向某一方向发射超声波,在发射的同时开始计时,碰到障碍物后就立即返回来,超声波接收器收到反射波就立即停止计时。

超声波测距是一种非接触可直接检测技术,它对光线和被测对象的颜色等没有要求,与其它仪器相比更卫生,更耐高温、等恶劣环境,具有少维护、可靠性高、寿命长等优点。

利用超声波检测往往比较快捷、性能稳定、能够实现实时检测等优点,所以它广泛的应用在全自动机器人,汽车倒车雷达等研制方面。

二、总体设计方案及论证2.1 总体方案设计硬件设计和软件设计是本次设计主要部分。

按模块划分可以分为数据的采集、按键的控制、数码管的显示、蜂鸣器的报警这四个子模块。

用AT89C2051设计超声波测距仪

用AT89C2051设计超声波测距仪

用AT89C2051设计超声波测距仪
超声波测距主要应用于倒车雷达、建筑施工工地以及一些工业现场,例如:液位、井深、管道长度等场合。

目前国内一般使用专用集成电路设计超声波测距仪,但是专用集成电路的成本很高,并且没有显示,操作使用很不方便。

本文介绍一种以AT89C2051或GSM97C2051单片机为核心的低成本、高精度、
微型化数字显示超声波测距仪的硬件电路和软件设计方法。

实际使用证明该仪器工作稳定,性能良好。

 1 超声波测距原理
 超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差t,然后求出距离S=Ct/2,式中的C为超声波波速。

 由于超声波也是一种声波,其声速C与温度有关,表1列出了几种不同温度下的声速。

在使用时,如果温度变化不大,则可认为声速是基本不变的。

如果测距精度要求很高,则应通过温度补偿的方法加以校正。

声速确定后,只要测得超声波往返的时间,即可求得距离。

这就是超声波测距仪的机理。

其系统框图如图1所示。

 2 AT89C2051的功能特点
 AT89C2051是一个2k字节可编程EPROM的高性能微控制器。

它与工业标
准MCS-51的指令和引脚兼容,因而是一种功能强大的微控制器,它对很多嵌入式控制应用提供了一个高度灵活有效的解决方案。

AT89C2051有以下特点:2k字节EPROM、128字节RAM、15根I/O线、2 个16位定时/计数器、5个向量二级中断结构、1个全双向的串行口、并且内含精密模拟比较器和片内振
荡器,具有4.25V至5.5V的电压工作范围和12MHz/24MHz工作频率,同时。

基于89c51的超声波测距单片机课设

基于89c51的超声波测距单片机课设

基于89c51的超声波测距单片机课设
超声波测距技术是一种常见的测距方法,它利用超声波在空气中传播的速度和时间差来计算距离。

在单片机课设中,我们可以利用89c51单片机和超声波传感器来实现一个简单的超声波测距系统。

我们需要了解超声波测距的原理。

超声波传感器会发出一定频率的超声波信号,当这些信号遇到障碍物时,会被反射回来。

通过测量超声波信号的发射和接收时间差,我们可以计算出障碍物与传感器之间的距离。

接下来,我们需要准备一些材料和工具。

除了89c51单片机和超声波传感器外,还需要一块面包板、杜邦线、电容、电阻等元件。

我们可以根据电路图将这些元件连接起来,构建一个简单的超声波测距电路。

在编写程序时,我们需要先初始化串口和定时器,然后设置超声波传感器的引脚和中断。

当传感器发出超声波信号时,我们需要启动定时器并等待接收到反射信号。

当接收到反射信号后,我们可以通过计算时间差来计算距离,并将距离值通过串口输出。

我们需要进行实验验证。

将超声波传感器放置在一定距离内的障碍物前面,启动程序并观察串口输出的距离值。

通过比较实际距离和测量距离,我们可以验证超声波测距系统的准确性和稳定性。

基于89c51的超声波测距单片机课设是一项有趣的实践项目,它可以帮助我们深入了解超声波测距技术和单片机编程。

通过不断的实验和改进,我们可以进一步提高系统的性能和可靠性,为未来的科研和工程应用打下坚实的基础。

超声波测距C程序

超声波测距C程序

#include<AT89X51.H>#include<intrins.h>/***************************数码管为共阴数码管***************************/sbit s0=P2^7;//个位选通sbit s1=P2^6;//十位选通sbit s2=P2^5;//百位选通sbit s3=P2^4;//千位选通sbit dp=P0^7;//小数点sbit in=P3^2;//外部中断,接CX20106的脚sbit csb=P3^3;//40KHz方波输出脚#define seg P0 //数码管的数据口为P1口#define uchar unsigned char#define uint unsigned int#define nop _nop_()/****************************/void init(void);//初始化void delay_nms(uint n);//延时nmsvoid delay100us();//延时usvoid display(uint dat);//4位数码管显示函数,只用了位void tran(void);//超声波测量函数/***************************/uint dis,H=100,L=20;uchar flag=0,high_time,low_time,m=0;uchar leddata[]={0x3F, //"0"0x06, //"1"0x5B, //"2"0x4F, //"3"0x66, //"4"0x6D, //"5"0x7D, //"6"0x07, //"7"0x7F, //"8"0x6F, //"9"0x77, //"A"0x7C, //"B"0x39, //"C"0x5E, //"D"0x79, //"E"0x71, //"F"0x76, //"H"0x38, //"L"0x37, //"n"0x3E, //"u"0x73, //"P"0x5C, //"o"0x40, //"-"0x00, //熄灭0x00 //自定义};void delay100us(){uchar i;for(i=0;i<50;i++);}/********************************** 函数名称:主函数修改日期:入口参数:无返回值: 无**********************************/ void main(void){init();while(1) //循环测量并显示{tran();//发送超声波信号测距display(dis);//显示距离}}/********************************** 函数名称:初始化函数修改日期:入口参数:无返回值: 无**********************************/ void init(void){TMOD=0x01;//定时器方式用于计时TH0=0;TL0=0; /* 设定T0的工作模式为*/EA=1;IT0=1;//下降沿有效,左传感器}/********************************** 函数名称:延时函数修改日期:入口参数:n返回值: 无**********************************/ void delay_nms(uint n){uchar i;while(n--){for(i=123;i>0;i--);}}/********************************** 函数名称:显示函数修改日期:入口参数:data返回值: 无**********************************/ void display(uint dat){uchar i,j,k;//分别为百十个位的缓存i=dat/100;//百位j=dat%100/10;//十位k=dat%100%10;//个位s3=1;s2=0;s1=1;s0=1;seg=~leddata[i];dp=0;delay_nms(2);dp=1;s2=1;s3=1;s2=1;s1=0;s0=1;seg=~leddata[j];delay_nms(2);s1=1;s3=1;s2=1;s1=1;s0=0;seg=~leddata[k];delay_nms(2);s0=1;}/**********************************函数名称:超声波测量函数修改日期:入口参数:无返回值: 无**********************************/ void tran(void){uchar i;float temp;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_nms(1);EX0=1;//开中断if(flag==1) //中断标志位置,说明有回波{ //以下为路程计算temp=high_time*256+low_time;temp=(temp/1000)/2;temp*=340;temp=temp/10;dis=(unsigned int)temp;flag=0;}}/********************************** 函数名称:中断函数修改日期:入口参数:无返回值: 无**********************************/void TT() interrupt 0{uint tmp;TR0=0;//关定时器ET0=0;//关外部中断flag=1; //置位标志位tmp=TH0*256+TL0; //读取定时器的值if((tmp>0)&&(tmp<60000))//判断是否超出范围,此设置的范围为到米,实际不能达到米{high_time=TH0;//把计时值放入缓冲low_time=TL0;}else//超出范围则重新测量{high_time=0;low_time=0;}}。

超声波测距程序

超声波测距程序

//超声波测距程序include<reg52.h>include <intrins.h>define uint unsigned intdefine uchar unsigned charsbit rs=P2^6; //1602的数据/指令选择控制线sbit rw=P2^5; //1602的读写控制线sbit en=P2^7; //1602的使能控制线sbit trig=P2^0; //超声波测距模块Trigsbit echo=P2^1; //超声波测距模块Echobit flag1; //触发信号标志位//uchar count; //中断累加变量long int distance; //测量所得距离unsigned char code table ={"0123456789"};uchar code table1=" distance: " ; //定义字符数组显示数字void delayuint n{uint x,y;forx=n;x>0;x--fory=110;y>0;y--;}void delaytuint x{uchar j;whilex-- > 0{forj = 0;j < 125;j++{;}}}void lcd_wcomuchar com{rs=0; //选择指令寄存器rw=0; //选择写P0=com; //把命令字送入P0delay5; //延时一小会儿,让1602准备接收数据en=1; //使能线电平变化,命令送入1602的8位数据口,这点非常重要en=0;}/------------------------------------------------1602写数据函数------------------------------------------------/void lcd_wdatuchar dat{rs=1; //选择数据寄存器rw=0; //选择写P0=dat; //把要显示的数据送入P0delay5; //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要;en=1; //使能线电平变化,数据送入1602的8位数据口en=0;}void lcd_init{lcd_wcom0x38; //8位数据,双列,57字形,用到功能设定指令lcd_wcom0x0c; //开启显示屏,关光标,光标不闪烁,用到显示开关控制指令lcd_wcom0x06; //显示地址递增,即写一个数据后,显示位置右移一位,用到了写入模式设置指令lcd_wcom0x01; //清屏,用到了清屏指令}void lcd_xianshi{uchar i ;lcd_wcom0x80;fori=0;i<13;i++{lcd_wdat table1i ;}lcd_wcom0xcc;lcd_wdat'.';lcd_wcom0xce;//单位是厘米//lcd_wdat'c';lcd_wdat'm';}/------------------------------------------------定时器0初始化,用于计算响应信号时间------------------------------------------------/void init_t0{TMOD=0x01;TL0=0x66;TH0=0xfc; //1msET0=1;EA=1;}/------------------------------------------------超声波模块触发信号------------------------------------------------/ void trigger{trig=0;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;_nop_;trig=1;}/------------------------------------------------超声波模块相应端口初始化函数------------------------------------------------/void init_measuring{trig=1;echo=1;count=0;}/------------------------------------------------超声波模块距离测试函数------------------------------------------------/ void measuring{uchar l;uint h,y;TR0 = 1;whileecho==1{;}TR0 = 0;l = TL0;h = TH0;y = h << 8 + l;y = y - 0xfc66;//us部分distance = y + 1000 count;//计算总时间,单位是微秒TL0 = 0x66;TH0 = 0xfc;delayt30;distance = 3453 distance / 20000;//原始为:0.34毫米/us 时间/2//}/------------------------------------------------超声波模块测量结果显示函数------------------------------------------------/void displayuint x{uchar qian,bai,shi,ge;qian=x/1000;bai=x/100%10;shi=x/10%10;ge=x%10;lcd_wcom0x80+0x49;//单位是厘米//lcd_wdattableqian;lcd_wdattablebai;lcd_wdattableshi;lcd_wcom0x80+0x4d;lcd_wdattablege;}/------------------------------------------------主函数------------------------------------------------/void main{ lcd_init; //液晶初始化init_t0; //定时器0初始化init_measuring; //超声波相应端口初始化while1{lcd_xianshi; //液晶显示特定字符trigger; //触发超声波启动whileecho==0 //等待回声{;}measuring; //进行距离测量displaydistance; //对测量结果进行显示init_measuring; //超声波相应端口初始化delayt600; //每次测量间隔60ms}}//……………………………………………中断服务函数…………………………………………………//void T_0interrupt 1{TF0 = 0;TL0 = 0x66;TH0 = 0xfc;count++;ifcount==18{TR0 =0;TL0 = 0x66;TH0 = 0xfc;count = 0;}}。

基于AT89C51单片机的超声波测距仪的设计

基于AT89C51单片机的超声波测距仪的设计

基于AT89C51单片机的超声波测距仪的设计【摘要】AT89C51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写10000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,AT89C51在众多嵌入式控制应用系统中得到广泛应用。

这次设计主要是利用AT89C51单片机、HC-SR04超声波传感器、蜂鸣器完成测距报警系统的制作,将AT89C51作为主控制芯片,利用超声波对物体的感应,将前方物体的距离探测出来,然后单片机处理运算,与设定的报警距离值进行比较判断,当测得距离小于设定值时,AT89C51发出指令控制蜂鸣器报警。

【关键词】:AT89C51单片机、HC-SR04超声波传感器、蜂鸣器ABSTRACTAT89C51 is a low power consumption, high performance CMOS 8-bit microcontroller, tablet containing 4 k Bytes of ISP (In system programmable) can wipe again and again 1000 times of Flash memory read-only applications, device adopts high density of ATMEL company, nonvolatile storage technology, compatible with standard MCS - 51 structure, instruction system and 80 c51 pin chip integrates general 8-bit CPU and ISP Flash memory cell, AT89C51 is widely applied In many embedded control applications.This design is mainly made using AT89C51 SCM, HC-SR04 ultrasonic sensor, buzzer completed ranging alarm system,the AT89C51 as the main control chip,the use of ultrasonic sensing of object,the detected objects in front of the distance,then the MCU processing operations,and the set alarm distance to compare the value of judgment,when the measuring distance is smaller than the set value,AT89C51 sends out a command to control the buzzer alarm.【KEY WORDS】: AT89C51 Single chip microcomputer、HC-SR04 ultrasonic sensor、Buzzer目录一、绪论 (3)1.1课题研究背景及意义 (3)二、总体设计方案及论证 (3)2.1 总体方案设计 (3)三、硬件实现及单元电路设计 (4)3.1 主控制模块 (4)3.2 电源设计 (5)3.3 超声波测试模块 (6)3.4 超声波传感器原理 (6)3.5 测距分析 (7)3.6 时钟电路的设计 (8)3.7 复位电路的设计 (9)3.8 声音报警电路的设计 (10)3.9 显示模块 (10)四、软件设计 (10)4.1 主程序工作流程图 (10)五、总结 (12)六、参考文献 (13)附录 (14)附件1:原理图 (14)附件2:实物图 (15)一、绪论1.1课题研究背景及意义随着社会的发展,人们对于距离的敏感度越来越高,生活上对距离的感知也越来越敏感,因此测距仪也受到了极大的欢迎。

超声波测距_C程序

超声波测距_C程序

超声波测距 C程序本探头是自带晶振的那种,只需发出一个脉冲,探头发出方波,等待回波并计时,液晶显示。

能避免超出测量距离的死等待,请大家完善。

//超声波模块程序#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intunsigned int time;unsigned int S,s_false;unsigned long num1;bit flag ;sbit Trig =P3^6;//定义引脚sbit Echo=P3^7;sbit lcdrs=P2^0;//命令数据sbit lcdrw=P2^1;//读写sbit lcde=P2^2;//能sbit led=P3^5;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*void delay_20us(){uchar a ;for(a=0;a<100;a++);}*///***************************************************************void write_com(unsigned char com) {lcdrs=0;P0=com;delay(5);lcde=1;delay(5);lcde=0;}void write_data(unsigned char zifu) {lcdrs=1;P0=zifu;delay(5);lcde=1;delay(5);lcde=0;}void write_temp(uint t_emp){uchar qian,bai,shi,ge;qian=t_emp/1000;bai=(t_emp%1000)/100;shi=(t_emp%100)/10;ge=t_emp%10;write_com(0x80);write_data(0x30+qian);delay(1);write_data(0x30+bai);delay(1);write_data(0x30+shi);delay(1);write_data(0x30+ge); delay(1);delay(100);}/********************************************************/void T0_time() interrupt 1 //T0中断用来计数器溢出,超过测距范围 {flag=0; //中断溢出标志,失败TH0=0;TL0=0;TR0=0; //关闭计数}/********************************************************/void T1_timer() interrupt 3 //中断{TH1=(65536-50000)/256;TL1=(65536-50000)%256;num1++;if (num1==20){num1=0;led=~led;}}void StartModule() //启动模块{Trig=1; //启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Trig=0;}/********************************************************/void Count(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMif(((S<8)||(S>=600))||flag==0) //超出测量范围显示“-”失败 {// flag=1;s_false=1000;write_com(0x80);write_data('e');delay(5);write_data('r');delay(5);write_data('r');delay(5);write_data('o');delay(5);write_data('r');delay(5);// write_temp(s_false);else{write_temp(S);}}/********************************************************//********************************************************/void init(){lcde=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);lcdrw=0;}//*************************************************************** void main(){// unsigned char TempCyc;delay(500); //启动等待,等LCM讲入工作状态lcdrw=0;init(); //LCM初始化delay(500); //延时片刻(可不要)while(1){TMOD=0x11; //设T0为方式1,GATE=1;TH0=0;TL0=0;ET0=1; //允许T0中断ET1=1;TR1=1;EA=1; //开启总中断Trig=0;Echo=0;while(1){StartModule();flag=1;// while(!Echo); //当echo为零时等待while((!Echo)&&flag); //当echo为零时等待,中断flag跳出等待 TR0=1; //开启计数while(Echo&&flag); //当echo为1计数并等待TR0=0; //关闭计数Count(); //计算delay(120); //80MS}}}。

超声波测距C语言源程序代码

超声波测距C语言源程序代码

/*{HZ即单位s的倒数}本晶振为12MHZ,因此外部的时钟频率为12MHZ,所以内部的时钟频率为(12MHZ)/12=1MH即1000000HZ,而机械频率为1/(1MHZ),即每完成一次计算(即定时器的值加一)用时0.000001s,即1us(微秒).*//****************************************************************************** *****///具有模式选择.#include<reg52.h>#define UC unsigned char#define UI unsigned intvoid delay(UI); //延时9.56us程序sbit beep = P1^3; //用于声音报警sbit Lv = P1^7; //用于光报警sbit Hong = P1^6;sbit QD = P3^7;//K8 //P3^7口(K8)为确定键,sbit GX = P3^1;//K7 //P3^3口(K2)为修改键,sbit SX = P3^6;//K6 //P3^2(K3)为测量键.sbit BX = P3^0;//K5 //个(K7),十(K6),百(K5),三位修改键sbit a = P1^2;//百位//数码管位选sbit b = P1^1;//十位sbit c = P1^0;//个位sbit trig = P1^4; //方波发射端sbit echo = P1^5; //超声波接收端void IntConfiguration(); //用来"设置中断"的函数,P3^3口(K2)为修改键,P3^2(K3)为测量键.void TimeConfiguration(); //用来"设置定时器"的函数sbit K1 = P3^4;//动态sbit K4 = P3^5;//静态//用于进行模式切换(K1、K4键)void xiaxian(); //修改函数,用来修改下限void shangxian(); //修改函数,用来修改上限UI min[3]={0,5,0}; //报警极限,拆分为"百十个"三位UI max[3]={3,0,0}; //MIN,MAX 用来存储最大和最小值void MINxianshi(UI); //最小范围和最大范围的显示void MAXxianshi(UI);UC code CharacterCode[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管数字字符(P2口)/********************************主函数*********************************************/void main(){TimeConfiguration(); //设置定时器0IntConfiguration(); //设置中断允许,K4键为修改键,K8键为确定键while(1){MINxianshi(40); //1.50169000sMAXxianshi(40); //1.50098300s}}/*******************************超声波测距函数********************************************/void zhongduan_0() interrupt 0 //测量中断函数(外部中断0){UI moshi = 0;UI juli = 0;UI time = 0;UI MAX, MIN;UI TT = 0;//用于第一次测量时给P1^5口置一,以便正确读取数值UI t1, t2, t3;UI GE = 0, SHI = 0, BAI = 0; //先定义三个变量,用来显示测量的距离.a = 0;b = 0;c = 0;P2 =~ 0x00; //防止最后显示的那个数码管一直亮MAX = max[0]*100 + max[1]*10 + max[2]; //计算最大与最小值MIN = min[0]*100 + min[1]*10 + min[2];while(1)//下面进行测量{while(1) /*先进行模式判断*/{if(0 == K1){moshi = 1;break; //模式1为动态测量}if(0 == K4){moshi = 2;break; //模式2为静态测量}if(0 == QD)return; //结束测量函数}/********************************************计算距离************************************************/loop: beep = 1;//关掉定时器Lv = 1;Hong = 1;//关掉灯a = 0;b = 0;c = 0;P2 =~ 0x00;//防止最后显示的那个数码管一直亮if( (0 == QD)&&(1 == moshi) )break;if( (0 == QD)&&(2 == moshi) ){delay(55500);if(0 == QD){delay(55500);if(0 == QD)break;}}t1 = 35,t2 = 35;t3 = 35;trig = 0;echo = 0;delay(2); //初始化拉低两个端口trig = 1;delay(2);trig = 0; //输出端输出27us的高电压,并将输出端口拉低while(echo == 0); //判断是否有回波返回,有则开启定时器TR0 = 1; //当有高电平输出时,开启定时器while(echo == 1);TR0 = 0; //当高电平变成低电平时,关闭定时器++TT; //测量值加一,记录测量次数if(1 == TT){delay(55500);TH0 = 0x00;TL0 = 0x00; //定时器的初值,定时器的定时为65536us.goto loop;}time = TL0 + TH0*256; //接下来显示测量的距离TH0 = 0x00;TL0 = 0x00; //定时器的初值,定时器的定时为65536us.juli = ( int )( (time*0.034)/2 );BAI = ( (juli%1000)/100 ); SHI = ( (juli%100)/10 ); GE = ( juli%10 );/******************************************两种模式的距离显示********************************************/if(juli > MAX){Hong = 0;Lv = 1;while( t1-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(400);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(400);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(390);beep = 0;if( (1 == moshi)&&(0 == t1) )goto loop;if(moshi == 2){t1 = 2;if(0 == QD)goto loop;}}}else if(juli < MIN){Lv = 0;Hong = 1;while( t2-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(400);beep = 0;delay(100);beep = 1;if( (1 == moshi)&&(0 == t2) )goto loop;if(2 == moshi){t2 = 2;if(0 == QD)goto loop;}}}else{beep = 1;Lv = 1;Hong = 1;while( t3-- ){a = 0;b = 1;c = 1;P2 =~ CharacterCode[BAI];delay(600);a = 1;b = 0;c = 1;P2 =~ CharacterCode[SHI];delay(600);a = 1;b = 1;c = 0;P2 =~ CharacterCode[GE];delay(600);if( (1 == moshi)&&(0 == t3) )goto loop;if(2 == moshi){t3 = 2;if(0 == QD)goto loop;}}}//显示结束}}/****************************************************************************** *****/void zhongduan_1() interrupt 1 //定时器溢出时的中断,显示测得的距离(定时器中断0){TH0 = 0x00;//定时器的初值,定时器的定时为65536us,TL0 = 0x00;}/****************************************************************************** *****/void zhongduan_2() interrupt 2 //修改键(K4)的中断函数(外部中断1){xiaxian();while(QD==0);shangxian();}/****************************************************************************** ****/void MINxianshi(UI TT) //显示最小距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(500);}P2 =~ 0x00;delay(55500);}void MAXxianshi(UI TT) //显示最大距离{while(TT--){a = 0;b = 1;c = 1;P2 =~ CharacterCode[max[0]];delay(500);a = 1;b = 0;c = 1;P2 =~ CharacterCode[max[1]];delay(500);a = 1;b = 1;c = 0;P2 =~ CharacterCode[max[2]];delay(500);}P2 =~ 0x00;delay(55500);}/****************************************************************************** *****/void delay(UI T) //延时程序{while(T--);}/****************************************************************************** *****/void IntConfiguration() //设置中断函数{//优先级设置PT2 = 0;PS = 0;PT1 = 0;PX1 = 0;PT0 = 1;PX0 = 0;IT1 = 1; //外部中断0为跳变沿触发EX1 = 1; //P3^3口(K4键)修改键,中断允许开启IT0 = 1; //外部中断1为跳变沿触发EX0 = 1; //P3^2口(K1键)测量键,中断允许开启ET0 = 1; //定时器0的中断允许开启EA = 1;}void TimeConfiguration() //设置定时器,以及定时器的初值{TMOD = 0x01;//设定只使用0号定时器; 模式:定时器; 工作方式:1号工作方式.//下面是定时器的初始值, TR0,TR1是用来开启定时器的TH0 = 0x00;//定时器的初值,定时器的定时为50us.TL0 = 0x00;/*1号定时器不用,所以没有TH1,TL1*/}/****************************************************************************** *****/void xiaxian() //修改下限{while(1){if(BX==0)//百位{P2=~0x00;min[0]++;if(min[0]==10)min[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[min[0]];delay(100);if(SX==0)//十位{P2=~0x00;min[1]++;if(min[1]==10)min[1]=0;delay(60000);}a = 1;b = 0;c = 1;P2 =~ CharacterCode[min[1]];delay(100);if(GX==0)//个位{P2=~0x00;min[2]++;if(min[2]==10)min[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[min[2]];delay(100);if(QD==0){a = 0;b = 0;c = 0;P2 = 0xff;break;}}}void shangxian() //修改上限{while(1){if(BX==0)//百位{P2=~0x00;max[0]++;if(max[0]==10)max[0]=0;delay(60000);}a = 0;b = 1;c = 1;P2 =~ CharacterCode[max[0]];delay(100);if(SX==0)//十位{P2=~0x00;max[1]++;if(max[1]==10)max[1]=0;delay(60000);标准文档实用文案}a = 1;b = 0;c = 1;P2 =~ CharacterCode[max[1]]; delay(100);if(GX==0)//个位{P2=~0x00;max[2]++;if(max[2]==10)max[2]=0;delay(60000);}a = 1;b = 1;c = 0;P2 =~ CharacterCode[max[2]]; delay(100);if(QD == 0){a = 0;b = 0;c = 0;P2 = 0xff;while(QD == 0);break;}}}/****************************************************************************** ******/。

基于AT89C2051单片机的超声波测距系统设计

基于AT89C2051单片机的超声波测距系统设计

参 考 文 献
[ 1 ] 高洪志. M C S 一 5 1单片机原理及应用技术教程[ H ] . 北京: 人 民邮电
出版 社 。 20 0 9 .
[ 2 ] 赵亮, 侯国瑞. 单片机 C 语言编程与实例[ H ] . 北京: 人 民邮电出版
社, 2 0 0 3 . [ 3 1 1 6 0 2 数据 手 册 . [ 4 ] D S l 8 B 2 0数 据手 册 . [ 5 ] P C F 8 5 6 3数 据 手册 . [ 6 ] A T 2 4 C 6 4芯 片数据手册 .


上接第 1 5 9 页
超声波所测距离。 外部中断0 接收由 高到低的负脉冲, 以检测回波信
分 比 计 算 ; P 为 海 水 静 压 力 P a 【 2 】 。
3 超 声 波 测 距 方 案 的 实 现
3 . 1 硬 件 设计
号 并 采 取 相 应 动 作 。 系 统 主 程 序 流 程: 系 统 初 始 化 一 发 送 超 波 ’ 子
返 回1
4调 试
4 . 1 I I C总 线 调 试 系统中E E P RO M芯片和P C F 8 5 6 3 实时时钟芯片均采用I I C 总线 与单片机通信 , 在 电路设计时采用两条I / 0引脚分别与I I C 的S C L 和 S D A相连 , 在程序设计 时首先根据两个器件的特性选定 了总线的通 信速率范 围。 4 . 2按 键 调 试 本系统中设计 了4 个按键 。 按键的功 能在不同界面是复用的 , 这 在程序设计上带来了一定的复杂度 。 最初按照设计 阶段的方案进行 编码 , 程 序 运 行 时按 键 功 能 并 未 完 全 实 现 , 总 会 出现 按键 无 响 应 和

超声波测距程序

超声波测距程序

temp=high_time*256+low_time; //temp-2000; temp=(temp/1000)/2; temp*=344; temp=temp/10; return temp; } /************************************** 外部中断服务函数 **************************************/ void TT() interrupt 2 { ui tmp; TR0=0;//关定时器0 ET1=0;//关外部中断 flag=1;//外部中断标志位 tmp=TH0*256+TL0; if((tmp>0)&&(tmp<60000)) { high_time=TH0; low_time=TL0; } else { high_time=0; low_time=0*****************/ void delay100us() { uc j; for(j=50;j>0;j--); } /**************************************** 发码播放函数;add为语音地址 *****************************************/ void send_com(uc add) { uc i; RST=1; RST=0; delay_nms(3); RST=1; delay_nms(20); CS1=0; delay_nms(5); for(i=0;i<8;i++) { CLK=0; if(add&1) DAT=1; else DAT=0; delay100us(); CLK=1; delay100us(); add=add>>1; } CS1=1; } /****************************************** *****************************************/ void sound(ui soud) { ui i,j,k;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//at89c2051制作的超声波测距源程序晶振选用12M
#include <REG2051.H>
#define k1 P3_4
#define csbout P3_5 //超声波发送
#define csbint P3_7 //超声波接收
#define csbc=0.034
#define bg P3_3
unsigned char csbds,opto,digit,buffer[3],xm1,xm2,xm0,key,jpjs;//显示标识
unsigned char convert[10]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9段码unsigned int s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1;
bit cl;
void csbcj();
void delay(j); //延时函数
void scanLED(); //显示函数
void timeToBuffer(); //显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
void k4cl();
void offmsd();
void main() //主函数
{
EA=1; //开中断
TMOD=0x11; //设定时器0为计数,设定时器1定时ET0=1; //定时器0中断允许
ET1=1; //定时器1中断允许
TH0=0x00;
TL0=0x00;
TH1=0x9E;
TL1=0x57;
csbds=0;
csbint=1;
csbout=1;
cl=0;
opto=0xff;
jpjs=0;
sj1=45;
sj2=200;
sj3=400;
k4cl();
TR1=1;
while(1)
{
keyscan();
if(jpjs<1)
{
csbcj();
if(s>sj3)
{
buffer[2]=0x76;
buffer[1]=0x76;
buffer[0]=0x76;
}
else if(s<sj1)
{
buffer[2]=0x40;
buffer[1]=0x40;
buffer[0]=0x40;
}
else timeToBuffer();
}
else timeToBuffer(); //将值转换成LED段码
offmsd();
scanLED(); //显示函数
if(s<sj2)
bg=0;
bg=1;
}
}
void scanLED() //显示功能模块
{
digit=0x04;
for( i=0; i<3; i++) //3位数显示
{
P3=~digit&opto; //依次显示各位数
P1=~buffer[i]; //显示数据送P1口
delay(20); //延时处理
P1=0xff; //P1口置高电平(关闭)
if((P3&0x10)==0) //判断3位是否显示完
key=0;
digit>>=1; //循环右移1位}
}
void timeToBuffer() //转换段码功能模块{
xm0=s/100;
xm1=(s-100*xm0)/10;
xm2=s-100*xm0-10*xm1;
buffer[2]=convert[xm2];
buffer[1]=convert[xm1];
buffer[0]=convert[xm0];
}
void delay(i)
{
while(--i);
}
void timer1int (void) interrupt 3 using 2
{
TH1=0x9E;
TL1=0x57;
csbds++;
if(csbds>=40)
{
csbds=0;
cl=1;
}
}
void csbcj()
{
if(cl==1)
{
TR1=0;
TH0=0x00;
TL0=0x00;
i=10;
while(i--)
{
csbout=!csbout;
}
TR0=1;
i=mqs; //盲区
while(i--)
{
}
i=0;
while(csbint)
{
i++;
if(i>=2450) //上限值
csbint=0;
}
TR0=0;
TH1=0x9E;
TL1=0x57;
t=TH0;
t=t*256+TL0;
s=t*csbc/2;
TR1=1;
cl=0;
}
}
void keyscan() //健盘处理函数
{
xx=0;
if(k1!=1) // 判断开关是否按下
{
delay(400); //延时去抖动
if(k1!=1) // 判断开关是否按下
{
while(!k1)
{
delay(30);
xx++;
}
if(xx>2000)
{
jpjs++;
if(jpjs>4)
jpjs=0;
}
xx=0;
switch(jpjs)
{
case 1: k1cl();break;
case 2: k2cl();break;
case 3: k3cl();break;
case 4: k4cl();break;
}
}
}
}
void k1cl()
{
sj1=sj1+5;
if(sj1>100)
sj1=30;
s=sj1;
}
void k2cl()
{
sj2=sj2+5;
if(sj2>500)
sj2=40;
s=sj2;
}
void k3cl()
{
sj3=sj3+10;
if(sj3>500)
sj3=100;
s=sj3;
}
void k4cl()
{
sx1=sj1-1;
sx1=sx1/csbc;
mqs=sx1/4.5;
}
void offmsd()
{
if (buffer[0] == 0x3f)
buffer[0] = 0x00; }。

相关文档
最新文档