基于单片机超声波测距系统设计实验报告-重

合集下载

基于单片机超声波测距系统的设计和实现

基于单片机超声波测距系统的设计和实现

基于单片机超声波测距系统的设计和实现超声波测距系统是利用超声波传播速度较快的特性,通过发射超声波并接收其回波来测量距离的一种常见的测距方式。

在本文中,我们将介绍基于单片机的超声波测距系统的设计和实现。

一、系统设计原理超声波测距系统主要由超声波发射器、超声波接收器、单片机和显示器组成。

其工作原理如下:1.发送超声波信号:超声波发射器通过单片机控制,向外发射超声波信号。

超声波的发射频率通常在40kHz左右,适合在空气中传播。

2.接收回波信号:超声波接收器接收到回波信号后,将信号经过放大和滤波处理后送入单片机。

3.距离计算:单片机通过测量超声波发射和接收的时间差来计算距离。

以声速343m/s为例,超声波的往返时间与距离之间的关系为:距离=时间差×声速/2、通过单片机上的计时器和计数器来测量时间差。

4.数据显示:单片机将计算得到的距离数据通过显示器显示出来,实时展示被测物体与超声波传感器之间的距离。

二、系统设计步骤1.系统硬件设计:选择合适的超声波模块,其具有超声波发射器和接收器功能,并可通过接口与单片机连接。

设计好电源电路以及超声波传感器与单片机之间的连接方式。

2.系统软件设计:根据单片机的型号和编程语言,编写相应的程序。

包括超声波信号的发射和接收控制,计时和计数功能的编程,距离计算和数据显示的实现。

3.硬件连接和调试:将硬件连接好后,对系统进行调试。

包括超声波模块与单片机的连接是否正确,超声波信号的发射和接收是否正常,计时和计数功能是否准确等。

5.优化和改进:根据实际测试结果,对系统进行优化和改进。

如增加滤波和放大电路以提高信号质量,调整超声波模块的发射频率,改进显示方式等。

三、系统实现效果完成以上设计和实施后,我们可以得到一个基于单片机的超声波测距系统。

该系统使用简单,测距精度高,响应速度快,适用于各种距离测量的应用场景。

同时,该系统还可根据具体需求进行各种改进和扩展,如与其他传感器结合使用,增加报警功能等。

基于stm32单片机的超声波测距仪设计报告

基于stm32单片机的超声波测距仪设计报告

基于stm32单片机的超声波测距仪设计报告【文章标题】基于STM32单片机的超声波测距仪设计报告【引言】超声波测距是一种常见且有效的测量方法,被广泛应用于工业控制、自动化、智能家居等领域。

本文将深入讨论基于STM32单片机的超声波测距仪的设计原理、硬件搭建和软件编程,并分享对该设计的观点和理解。

【简介】1. 超声波测距原理简介(可使用子标题,如1.1)- 超声波的特性与应用- 超声波传感器原理及工作方式2. 设计方案(可使用子标题,如2.1)- 系统框图:硬件模块与连接方式- 所需材料清单及器件参数选择【正文】1. 超声波传感器的选型与特性比较(可使用子标题,如1.1)1.1 超声波传感器的种类与特点1.2 STM32单片机与超声波传感器的配合选择理由与原则2. 硬件电路设计与搭建(可使用子标题,如2.1)2.1 超声波发射电路设计与实现2.2 超声波接收电路设计与实现2.3 STM32单片机与超声波传感器的连接方法及引脚映射3. 软件编程实现(可使用子标题,如3.1)3.1 STM32单片机开发环境配置与准备3.2 程序框架和流程设计3.3 超声波信号处理与距离计算算法【总结】1. 设计成果总结与优缺点评价- 设计成果与功能实现总结- 设计过程中的挑战与解决方案- 设计的优点与改进空间2. 对基于STM32单片机的超声波测距仪设计的观点和理解- 本设计在硬件搭建和软件编程方面充分利用了STM32单片机的性能与功能- 超声波测距仪在工业自动化和智能家居等领域具有广阔应用前景 - 未来可以进一步提升设计的灵活性和可扩展性【参考资料】- 张三: 《超声波测距原理与应用技术》,出版社,2018年- 李四: 《STM32单片机与嵌入式系统设计》,出版社,2019年以上是本文基于STM32单片机的超声波测距仪设计报告,对这个主题的观点和理解。

希望这篇文章内容全面、深入,并能帮助您对超声波测距仪设计有更深刻的理解。

基于stm32单片机的超声波测距仪设计报告

基于stm32单片机的超声波测距仪设计报告

基于stm32单片机的超声波测距仪设计报告1. 引言超声波测距仪(Ultrasonic Distance Sensor)是一种常用的测距设备,通过发送超声波脉冲并接收其反射信号来测量目标与测距仪之间的距离。

本报告将详细介绍基于stm32单片机的超声波测距仪的设计过程。

2. 设计原理超声波测距仪的基本原理是利用超声波在空气中的传播速度和反射特性来计算目标物体与测距仪之间的距离。

其中,stm32单片机作为测距仪的控制核心,通过发射超声波脉冲并测量接收到的回波时间来计算距离。

2.1 超声波传播速度超声波在空气中的传播速度约为340m/s,可以通过测量超声波往返的时间来计算出距离。

2.2 超声波反射信号当超声波遇到障碍物时,会产生反射信号,测距仪接收到这些反射信号并测量其时间差,再通过计算即可得到距离。

3. 硬件设计本设计使用stm32单片机作为核心控制器,并搭配超声波发射器和接收器模块。

3.1 超声波发射器超声波发射器负责产生超声波脉冲,并将脉冲信号发送到待测物体。

3.2 超声波接收器超声波接收器负责接收从物体反射回来的超声波信号,并将其转换为电信号。

3.3 stm32单片机stm32单片机作为测距仪的核心控制器,负责发射超声波脉冲、接收反射信号并计算距离。

4. 软件设计本设计涉及的软件设计包括超声波信号发射、接收信号处理和距离计算等。

4.1 超声波信号发射使用stm32单片机的GPIO口控制超声波发射模块,产生一定频率和周期的脉冲信号。

4.2 接收信号处理通过stm32单片机的ADC模块,将超声波接收器接收到的模拟信号转换为数字信号,并对信号进行处理和滤波。

4.3 距离计算根据接收到的超声波反射信号的时间差,结合超声波的传播速度,使用合适的算法计算出距离。

5. 实验结果与分析经过实际测试,基于stm32单片机的超声波测距仪达到了预期的效果。

能够精确测量目标与测距仪之间的距离,并显示在相关的显示设备上。

基于单片机的超声波测距课程设计报告

基于单片机的超声波测距课程设计报告

基于单片机的超声波测距课程设计报告课程设计说明书题目:超声波测距院(系):电子工程与自动化专业:学生姓名:学号:指导教师:年 11 月 7 日目录一、绪论二、对本课程的设计分析2.1 总体设计方案介绍2.1.1 超声波测距原理2.1.2 超声波测距原理框图2.2 系统硬件设计方案2.2.1 51系列单片机的功能特点及测距原理2.2.1.1 51系列单片机的功能特点2.2.1.2 单片机实现测距原理三、主要电路模块的实现方案比较及选择3.1 超声波发射电路3.2 超声波检测接收电路3.3 超声波测距系统的硬件电路设计3.4 系统电路图及其PCB图四、系统的软件设计4.1 主程序流程图4.2超声波发射子程序和超声波接收中断程序五、测试数据以及结论六、课程设计过程中遇到的主要问题以及解决办法七、心得体会一、绪论随着社会的发展,人们对距离或长度测量的要求越来越高。

超声波测距由于其能进行非接触测量和相对较高的精度,越来越受到人们的重视。

超声波测距离的一个最重要的功能就是作用于倒车系统上。

要实现倒车系统的准确精度,就得把超声波和单片机相结合,利用单片机的控制系统和精确的运算使超声波测距离更加快速和精确。

从而,减少事故的发生。

经过该实验学习利用单片机和超声波探测元件测试距离的基本方法,进一步熟悉单片机定时器技术、中断技术在数据采集和数据处理过程中的综合运用方法,提高综合应用程序的编程方法与技巧。

发射器发出的40KHz超声波以速度v在空气中传播,在到达被测物体时被反射返回,由接收器接收,其往返时间为t,由s=vt/2即可算出被测物体的距离。

报告内容包括:单片机控制主程序、中断子程序、延时子程序和超声波发射、接收电路、数码管驱动显示电路以及主电路。

二、对本课程设计的分析2.1总体设计方案介绍2.1.1超声波测距原理发射器发出的超声波以速度v在空气中传播,在到达被测物体时被反射返回,由接收器接收,其往返时间为t,由s=vt/2即可算出被测物体的距离。

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

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

基于单片机控制的超声波测距系统的设计一、概述。

超声波测距技术是一种广泛应用的测距技术,它能够非常精确地测量物体到传感器的距离。

本文介绍的基于单片机控制的超声波测距系统主要由控制模块、信号处理模块和驱动模块三部分组成。

其中,控制模块主要实现超声波信号的发射与接收,信号处理模块主要实现对测量结果的处理和计算,驱动模块主要实现对LED灯的控制。

二、硬件设计。

1.超声波发射模块:采用 SR04 超声波发射传感器,并通过单片机的PWM 输出控制 SR04 的 trig 引脚实现超声波信号的发射。

2.超声波接收模块:采用SR04超声波接收传感器,通过单片机的外部中断实现对超声波信号的接收。

3.控制模块:采用STM32F103单片机,通过PWM输出控制超声波发射信号,并通过外部中断接收超声波接收信号。

4.信号处理模块:采用MAX232接口芯片,将单片机的串口输出转换成RS232信号,通过串口与上位机进行通信实现测量结果的处理和计算。

5.驱动模块:采用LED灯,通过单片机的GPIO输出控制LED灯的亮灭。

三、软件设计。

1.控制模块:编写程序实现超声波信号的发射与接收。

其中,超声波发射信号的周期为 10us,超声波接收信号的周期为 25ms。

超声波接收信号的处理过程如下:(1)当 trig 引脚置高时,等待 10us。

(2)当 trig 引脚置低时,等待 echo 引脚为高电平,即等待超声波信号的回波。

(3)当 echo 引脚为高电平时,开始计时,直到 echo 引脚为低电平时,停止计时。

(4)根据计时结果计算物体到传感器的距离,将结果通过串口输出。

2.信号处理模块:编写程序实现接收计算结果,并将结果通过串口与上位机进行通信。

具体步骤如下:(1)等待串口接收数据。

(2)当接收到数据时,将数据转换成浮点数格式。

(3)根据测量结果控制LED灯的亮灭。

以上就是基于单片机控制的超声波测距系统的设计。

该系统能够通过精确测量物体到传感器的距离并对测量结果进行处理和计算,能够广泛应用于各种实际场合。

(完整版)基于51单片机的超声波测距系统设计

(完整版)基于51单片机的超声波测距系统设计

完满 WORD 格式整理1设计任务本文采纳超声波传感器 ,IAP15 单片机以及 LCD显示模块设计了一种超声波测距显示器,能够实现丈量物体到仪器距离以及显示等功能。

是一种构造简单、性能稳固、使用方便、价钱便宜的超声波距离丈量器,拥有必定的适用价值。

2设计思路超声波测距超声波超声波是指频次在 20kHz 以上的声波,它属于机械波的范围。

最近几年来,跟着电子丈量技术的发展,运用超声波作出精准丈量已成可能。

跟着经济发展,电子丈量技术应用愈来愈宽泛,而超声波丈量精准高,成本低,性能稳固则备受喜爱。

超声波也按照一般机械波在弹性介质中的流传规律,如在介质的分界面处发生反射和折射现象,在进入介质后被介质汲取而发生衰减等。

正是因为拥有这些性质,使得超声波能够用于距离的丈量中。

跟着科技水平的不停提升,超声波测距技术被宽泛应用于人们平时工作和生活之中。

一般的超声波测距仪可用于固定物位或液位的丈量,合用于建筑物内部、液位高度的丈量等。

超声在空气中测距在特别环境下有较宽泛的应用。

利用超声波检测常常比较快速、方便、计算简单、易于实现及时控制,并且在丈量精度方面能达到工业适用的指标要求,所以为了使挪动机器人能够自动闪避阻碍物行走,就一定装备测距系统,以使其及时获得距阻碍物的地点信息(距离和方向)。

所以超声波测距在挪动机器人的研究上获得了宽泛的应用。

同时因为超声波测距系统拥有以上的这些长处,所以在汽车倒车雷达的研制方面也获得了宽泛的应用。

超声波测距原理最常用的超声测距的方法是回声探测法,超声波发射器向某一方向发射超声波,在发射时辰的同时计数器开始计时,超声波在空气中流传,途中遇到阻碍物面阻拦就立刻反射回来,超声波接收器收到反射回的超声波就立刻停止计时。

超声波在空气中的流传速度为340m/s,依据计时器记录的时间 t ,就能够计算出发射点距阻碍物面的距离s,即:s=340t/2 。

因为超声波也是一种声波,其声速 V 与温度有关。

课程设计实验报告-超声波测距仪的设计

课程设计实验报告-超声波测距仪的设计

超声波测距仪的设计一、设计目的本设计利用超声波传输中距离与时间的关系,采用STC51单片机进行控制和数据处理,设计出能够精确测量两点间距离的超声波测距仪。

同时了解单片机各脚的功能,工作方式,计数/定时,I/O口的相关原理,并稳固学习单片机的相关内容知识。

二、设计要求1.设计一个超声波测距仪,能够用四段数码管准确显示所测距离2.精度小于1CM,测量距离大于200CM三、设计器材元器件数量STC51单片机 1个超声波测距模块URF-04 1个电阻〔1K 200 4.7K〕 3 个晶振〔12MHz〕 1 个共阳极四位数码管 1 个极性电容〔33pF〕 2 个非极性电容〔22uF〕 1 个四、超声波测距系统原理331.45米/秒,由单片机负责计时,单片机使用12.0M晶振,所以此系统的测量精度理论上可以到达毫米级。

超声波测距的算法设计: 超声波在空气中传播速度为每秒钟340米〔15℃时〕。

X2是声波返回的时刻,X1是声波发声的时刻,X2-X1得出的是一个时间差的绝对值,假定X2-X1=0.03S,那么有340m×0.03S=10.2m。

由于在这10.2m 的时间里,超声波发出到遇到返射物返回的距离如下:图1 测距原理超声波测距器的系统框图如下列图所示:图2 系统框图五、设计方案及分析〔包含设计电路图〕4.1硬件电路设计4.1.1 单片机最小系统控制模块设计与比拟方案二:采用STC51单片机控制。

STC51单片机是一种低功耗、高性能CMOS8位微控制器,具有 8KB的系统可编程Flash 存储器。

AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路,能够满足题目设计的所有要求,而且我们对STC51单片机也比拟熟悉,因此我们选择方案二。

最小系统电路图如图3所示图3 单片机最小系统显示模块设计采用四位共阳极数码管显示,连接电路简单,显示电路连接图如图4所示图4 数码管显示电路超声波测距模块a.本系统采用超声波模块URF04进行测距,该模块使用直流5V供电,理想条件下测距可达500cm,广泛应用于超声波测距领域,模块性能稳定,测度距离精确,盲区〔2cm〕超近。

基于单片机的超声波测距系统实验报告

基于单片机的超声波测距系统实验报告

基于单片机的超声波测距系统实验报告一、引言超声波测距系统是一种基于超声波工作原理的测距技术,主要通过发送超声波信号并检测回波信号来测量目标物体与传感器之间的距离。

本实验旨在通过使用单片机搭建一个基于超声波的测距系统,通过实际测量和数据分析来验证其测距的准确性和可靠性。

二、原理超声波测距系统主要包括超声波发射器、超声波接收器和单片机控制系统三部分。

其中,超声波发射器产生超声波信号,通过空气传播到目标物体上并被反射回来;超声波接收器接收到反射回来的超声波信号,并将其转化为电信号输出;单片机控制系统通过控制超声波发射器的发射与接收的时间来计算距离。

三、实验步骤1.搭建硬件连接:将超声波发射器和接收器分别连接到单片机的GPIO引脚,并通过电阻和电容进行滤波处理。

2.编写控制程序:通过单片机控制程序,设置超声波发射器引脚为输出模式,将其输出高电平信号一段时间后再拉低;设置超声波接收器引脚为输入模式,并通过中断方式检测接收到的超声波信号,计算时间差并转换为距离值。

3.进行实际测量:将超声波发射器和接收器对准目标物体,启动测量程序并记录距离值。

4.多次实验并计算平均值:为了提高测距的准确性,进行多次实验并计算多次测量结果的平均值。

四、实验结果和讨论通过多次实验测量,我们得到了如下结果:测量1距离为30cm,测量2距离为31cm,测量3距离为29cm。

将这些结果进行平均,得到最终距离结果为30cm。

通过与实际测量的距离进行对比,我们发现测量结果基本与实际距离相符,误差控制在可接受范围内。

这表明我们搭建的基于超声波的测距系统具有较好的测距准确性和可靠性。

然而,我们也发现在一些特殊情况下,例如目标物体表面有较强的吸收或反射能力时,测量结果可能会出现误差。

这是因为超声波在传播过程中会受到传播介质和目标物体的影响,从而引发信号衰减或多次反射等现象。

在实际应用中,我们需要根据具体情况进行系统的优化和调整,以提高测距的精确度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

指导教师评定成绩:审定成绩:自动化学院计算机控制技术课程设计报告设计题目:基于单片机的超声波测距系统设计单位(二级学院):学生姓名:专业:班级:学号:指导教师:负责项目:设计时间:二〇一四年五月自动化学院制目录一、设计题目 0基于51单片机的超声波测距系统设计 0设计要求 0摘要 (1)二、设计报告正文 (2)2.1 超声波测距原理 (2)2.2系统总体方案设计 (3)2.3主要元件选型及其结构 (4)2.4硬件实现及单元电路设计 (9)2.5系统的软件设计 (12)三、设计总结 (17)四、参考文献 (17)五、附录 (18)附录一:总体电路图 (18)附录二:系统源代码 (18)一、设计题目基于51单片机的超声波测距系统设计设计要求1、以51系列单片机为核心,控制超声波测距系统;2、测量范围为:2cm~4m,测量精度:1cm;3、通过键盘电路设置报警距离,测出的距离通过显示电路显示出来;4、当所测距离小于报警距离时,声光报警装置报警加以提示;5、设计出相应的电子电路和控制软件流程及源代码,并制作实物。

摘要超声波具有传播距离远、能量耗散少、指向性强等特点,在实际应用中常利用这些特点进行距离测量。

超声波测距具有非接触式、测量快速、计算简单、应用性强的特点,在汽车倒车雷达系统、液位测量等方面应用广泛。

本次课设利用超声波传播中距离与时间的关系为基本原理,以STC89C52单片机为核心进行控制及数据处理,通过外围电源、显示、键盘、声光报警等电路实现系统供电、测距显示、报警值设置及报警提示的功能。

软件部分采用了模块化的设计,由系统主程序及各功能部分的子程序组成。

超声波回波信号输入单片机,经单片机综合分析处理后实现其预定功能。

关键词:STC89C52单片机; HC-SR04;超声波测距二、设计报告正文2.1 超声波测距原理常用的超声测距的方法是回声探测法,超声波发射器向某一方向发射超声波,在发射时刻的同时计数器开始计时,超声波在空气中传播,途中碰到障碍物面阻挡就立即反射回来,超声波接收器收到反射回的超声波就立即停止计时。

设超声波在空气中的传播速度为340m/s (不计介质温度变化对速度的影响),根据计时器记录的时间t ,就可以计算出发射点距障碍物面的距离s ,即:s=340t/2。

如图2-1所示:超声波发射障碍物超声波接收图2-1 超声波的测距原理θcos S H = (2-1))(H L arctg =θ (2-2)式中: L —两探头中心之间距离的一半;又知道超声波传播的距离为:vt S =2 (2-3)式中: v —超声波在介质中的传播速度;t —超声波从发射到接收所需要的时间;将式2-1、2-2、2-3联立得:]cos[21H L arctg vt H = (2-4)其中,超声波的传播速度v 在一定的温度下是一个常数(例如在温度T=30度时,V=349m/s);当需要测量的距离H 远远大于L 时,上式变为: vt H 21= (2-5) 所以,只要需要测量出超声波传播的时间t,就可以得出测量的距离H.2.2系统总体方案设计本超声波测距系统由系统硬件电路及软件程序实现两部分构成。

其中由STC89C52单片机最小系统、HC-SR04超声波模块、电源接口电路、4位共阳极数码管显示电路、三极管驱动电路、蜂鸣器声光报警电路及键盘电路构成硬件系统。

以STC89C52单片机为核心,通过触发信号控制HC-SR04超声波测距模块发射超声波并接收回波,测算出前方障碍的距离,输入单片机进行运算,与预设报警距离比较后判断是否启动蜂鸣器声光报警装置。

根据系统功能要求及模块划分可绘制出系统硬件框图,如图2-2所示:图2-2 系统硬件框图2.3主要元件选型及其结构2.3.1 STC89C52芯片STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。

工作电压:5.5V~3.3V。

STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。

在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。

另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

最高运作频率35MHz,6T/12T可选。

其引脚图如图2-3所示:a引脚图b实物图图2-3 STC89C52引脚图2.3.2 HC-SR04超声波模块HC-SR04超声波模块具有性能稳定、测度距离精确、模块高精度、盲区小等特点,使用简单易操作,常用于距离测量。

其原理图及实物图如图2-4、图2-5所示:图2-4 HC-SR04超声波模块原理图图2-5 HC-SR04超声波模块实物图(1)接线方式:VCC(接电源)、Trig(控制端)、Echo(接收端)、GND(接地)(2)基本工作原理:a.采用I/O口TRIG触发测距,给至少10us的高电平信号;b.模块自动发送8个40kHz的方波,自动检测是否有信号返回;c.有信号返回,通过I/O口ECHO输出一个高电平,同时开始计时直到此口变为低电平,高电平持续的时间就是超声波从发射到返回的时间。

测试距离=(高电平时间*声速(340M/S))/2。

(3)电气参数表1 HC-SR04电气参数表(4)超声波时序图图2-6 超声波时序图(5)操作:初始化时将trig和echo端口都置低,首先向给trig发送至少10 us 的高电平脉冲(模块自动向外发送8个40kHz的方波),然后等待,捕捉echo 端输出上升沿,捕捉到上升沿的同时,打开定时器开始计时,再次等待捕捉echo 的下降沿,当捕捉到下降沿,读出计时器的时间,这就是超声波在空气中运行的时间,按照测试距离=(高电平时间*声速(340M/S))/2就可以算出超声波到障碍物的距离。

2.3.3 4位共阳数码管(1)共阳数码管的实物图、原理图如图2-7、图2-8所示:图2-7 4位共阳数码管实物图图2-8 4位共阳数码管原理图(2)工作原理:共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。

共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。

当某一字段的阴极为高电平时,相应字段就不亮。

(3)动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。

在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。

2.4 硬件实现及单元电路设计(1)单片机最小系统单片机系统由电源、晶振电路、复位电路组成。

如图2-9所示:图2-9 单片机最小系统(2)电源接口电路设计电源部分的设计采用3节5号干电池4.5V供电,如图2-10所示:图2-10 电源接口电路(3)超声波模块接口HC-SR04超声波模块接口如图2-11所示:图2-11 HC-SR04超声波模块接口(4) 4位共阳极数码管显示电路及三极管驱动电路显示电路如图2-12所示:图2-12 4位共阳数码管显示电路当I/O口输出低电平时,相应段被选通,反之则不然。

三极管驱动电路如图2-13所示:图2-13 三极管驱动电路当I/O口输出低电平时,相应位被选通,反之则不然。

(5)声光报警电路的设计声光报警电路如图2-14所示:图2-14 声光报警电路声光报警电路由一个蜂鸣器、一个三极管、一个发光二极管、两个电阻构成。

其中电阻起限流的作用,当I/O口输出低电平时,三极管饱和导通,蜂鸣器报警、LED亮,反之则不报警。

(6)键盘电路的设计键盘电路如图2-15所示:图2-15 键盘电路2.5系统的软件设计(1)各主要模块①超声波测距模块。

给超声波Trig口至少10us的高电平,启动测量,定时器T0计时,通过计算测得距离。

②显示模块。

包括数码管位选函数、段选函数及距离处理显示模块。

将超声波测距测量值、报警设定值显示在4位数码管上。

③键盘模块。

由键盘检测函数及键盘处理函数组成。

有设定键、加键、减键、复位键、开关键。

主要设置报警值。

④声光报警模块。

将测量值与设定报警值比较,若小于设定值,报警。

⑤特殊存储器eepom模块。

包括单片机eepom存储器读、写操作以及初始化。

其内存储设定报警值,掉电数据不丢失。

⑥定时器模块。

TO定时器用于超声波测距的计时。

T1定时器用于主程序扫描时间的控制。

(2)主程序源代码void main(){send_wave(); //测距离函数smg_display(); //处理距离显示函数time_init(); //定时器初始化init_eepom(); //初始化eepom(读取set_d)while(1){if(flag_300ms == 1) //300ms执行一次{flag_300ms = 0;clock_h_l(); //报警函数send_wave(); //测距离函数if(menu_1 == 0) //没有键按下时才给缓冲数组赋新值smg_display(); //处理距离显示函数if(zd_break_en == 1) //自动退出设置界面程序{zd_break_value ++; //每300ms加一次if(zd_break_value > 100) //30秒后自动退出设置界面{menu_1 = 0;smg_i = 3;zd_break_en = 0;zd_break_value = 0;}}}key(); //按键检测函数if(key_can < 4){key_with(); //按键处理函数,修改报警设定值}}}(3)主程序工作流程图图2-16 主程序流程图(4)超声波探测程序流程图图2-17 超声波探测程序流程图三、设计总结四、参考文献[1] C程序设计(第三版). 谭浩强 . 清华大学出版社 .[2] 新概念51单片机c语言教程 . 郭天祥 . 电子工业出版社[3] 传感器与检测技术 . 胡向东 . 机械工业出版社[4] 微控制其原理及应用 . 向敏 . 人民邮电出版社五、附录附录一:系统总体电路图图5-1 超声波探测程序流程图附录二:系统软件源代码/*****************************************************课设名称:基于51单片机的超声波测距系统设计*硬件平台: 超声波模块+51最小系统*显示模块:4个数码管*输入模块:3个按键*实现的功能:用超声波模块把距离测量出来,用数码管显示,可通过按键设置要报警的距离,低于设置* 的值则自动报警,一直按住调值的键会越加越快,超出量程(3.8m)则显示888 *接口说明:数码管位P3^4 P3^5 P3^6 P3^7* 超声波发射=>P3^2* 超声波接收=>P3^3按键用的接口是P2口*待改进的地方:温度补偿,提高精度*当前的缺陷:不能测出4m的距离*测量单位:米(m)****************************************************/#include <reg52.h>#include <intrins.h>#include <string.h>#include <eepom52.h>#define uchar unsigned char#define uint unsigned int//数码管段选定义设0 1 2 3 4 5 6 7 8 9uchar code smg_duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管位选uchar dis_smg[4] ={0,1,2,3};sbit smg_we1 = P3^4; //数码管位选端口sbit smg_we2 = P3^5;sbit smg_we3 = P3^6;sbit smg_we4 = P3^7;sbit c_send = P3^1; //超声波发射sbit c_recive = P3^0; //超声波接收uchar flag_hc_value; //超声波中间变量sbit beep = P2^3; //蜂鸣器IO口定义uchar smg_i = 3; //显示数码管的个数:3bit flag_300ms ; //主程序300ms处理一次的标识符bit key_500ms ; //按键程序500ms处理一次的标识符long distance; //定义测量距离uint set_d; //定义设定距离uchar flag_csb_juli; //超声波超出量程long flag_time0;//按键的IO变量的定义uchar key_can; //按键值的变量uchar zd_break_en,zd_break_value; //自动退出设置界面uchar menu_ljsd = 10; //用来控制连加的速度bit flag_lj_en; //按键连加使能bit flag_lj_3_en; //按键连3次连加后使能加的数就越大了uchar key_time; //定时器用,作为连加的中间变量,按键时间uchar flag_value; //定时器用,作为连加的中间变量uchar menu_1; //菜单设计的变量uchar a_a; //设定值写入单片机标志符/***********************数码管位选函数*****************************/ void smg_we_switch(uchar i){switch(i){case 3: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;case 2: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;case 1: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;case 0: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;}}/***********************数码管显示函数*****************************/ void display(){static uchar i;i++;if(i >= smg_i) //smg_i=3,i = 0;smg_we_switch(i); //调用位选函数P1 = dis_smg[i]; //段选}/******************把数据保存到单片机内部eepom中******************/void write_eepom(){SectorErase(0x2000);byte_write(0x2000, set_d % 256); //写入set_d值byte_write(0x2001, set_d / 256);byte_write(0x2058, a_a); //a_a标识符}/******************把数据从单片机内部eepom中读出来*****************/void read_eepom(){set_d = byte_read(0x2001); //读出set_d值set_d <<= 8;set_d |= byte_read(0x2000);a_a = byte_read(0x2058);}/******************开机自检eepom初始化****************************/void init_eepom(){read_eepom(); //先读if(a_a != 1) //新的单片机初始单片机内问EEPOM{set_d = 100;a_a = 1;write_eepom();}}/****************独立按键检测函数********************/void key(){static uchar key_new = 0,key_old = 0,key_value = 0;//key_new、key_old 按键标识符,key_new=0表示有键瞬间按下,//检测确认按键后,key_old=1. key_value按键检测中间变量if(key_new == 0) //初始有键按下{if((P2 & 0x07) == 0x07) //松手检测(5次)key_value ++;elsekey_value = 0;if(key_value >= 5) //确认无键按下{key_value = 0;key_new = 1; //置位key_new,表初始无键按下flag_lj_en = 0; //关闭连加的使能flag_lj_3_en = 0; //关闭3秒后连加的使能flag_value = 0; //连加变量清零key_time = 0;write_eepom(); //值(set_d)写入单片机}}else //初始无键按下{if((P2 & 0x07) != 0x07) //按键检测(5次)key_value ++;elsekey_value = 0;if(key_value >= 5) //确认按键{key_value = 0;key_new = 0;flag_lj_en = 1; //连加使能zd_break_en = 1; //自动退出设置界使能zd_break_value = 0; //自动退出设置界变量清零,30秒后退出设置界面}}key_can = 20;if(key_500ms == 1) //连按500ms,启动连加{key_500ms = 0;key_new = 0;key_old = 1;zd_break_value = 0; //自动退出设置界变量清零,30秒后退出设置界面}if((key_new == 0) && (key_old == 1)) //确认有键按下{switch(P2 & 0x07){case 0x06: key_can = 1; break; //得到k2键值(设定键)case 0x05: key_can = 2; break; //得到k3键值(加)case 0x03: key_can = 3; break; //得到k4键值(减)}}key_old = key_new; //初始化标识符}/*******************按键处理数函数***************************/void key_with(){if(key_can == 1) //得到k2键值(设定键){menu_1 ++;if(menu_1 >= 2){menu_1 = 0;}if(menu_1 == 0) //退出设定界面{menu_ljsd = 10; //连加速度控制变量(复位为500ms)dis_smg[0] = smg_duan[distance % 10]; //测量值显示用dis_smg[1] = smg_duan[distance / 10 % 10] ;dis_smg[2] = smg_duan[distance / 100 % 10] & 0x7f;smg_i = 3;}if(menu_1 == 1) //设置界面{menu_ljsd = 1; //连加速度变量(50ms)dis_smg[0] = smg_duan[set_d % 10]; //设定值显示用dis_smg[1] = smg_duan[set_d / 10 % 10];dis_smg[2] = smg_duan[set_d / 100 % 10] & 0x7f ;dis_smg[3] = 0x88;smg_i = 4; //A,设定值修改标识符}}if(menu_1 == 1) //设置报警值{if(flag_lj_3_en == 0) //三次连加之后速度加快menu_ljsd = 10 ; //500ms 加减一次elsemenu_ljsd = 1; //50ms 加减一次if(key_can == 2) //得到k3键值(加){set_d ++ ;if(set_d > 350)set_d = 350;dis_smg[0] = smg_duan[set_d % 10]; //设定值显示dis_smg[1] = smg_duan[set_d / 10 % 10] ;dis_smg[2] = smg_duan[set_d / 100 % 10] & 0x7f;dis_smg[3] = 0x88;}if(key_can == 3) //得到k4键值(减){set_d -- ;if(set_d <= 1)set_d = 1;dis_smg[0] = smg_duan[set_d % 10]; //设定值显示dis_smg[1] = smg_duan[set_d / 10 % 10] ;dis_smg[2] = smg_duan[set_d / 100 % 10] & 0x7f ;dis_smg[3] = 0x88; //a}}}/*********************定时器0、定时器1初始化******************/void time_init(){EA = 1; //开总中断TMOD = 0X11; //定时器0、定时器1工作方式1ET0 = 1; //开定时器0中断TR0 = 1; //允许定时器0定时ET1 = 1; //开定时器1中断TR1 = 1; //允许定时器1定时}/****************延迟函数(10us,超声波发射需要)********************/void delay(){int i=10;for(i;i>=0;i--){_nop_(); //执行一条_nop_()指令就是1us}}/*********************超声波测距程序*****************************/void send_wave(){long temp = 888;c_send = 1; //10us的高电平触发delay();c_send = 0;TH0 = 0; //给定时器0清零TL0 = 0;TR0 = 0; //关定时器0定时flag_hc_value = 0;while(!c_recive); //当c_recive为零时等待TR0=1;while(c_recive) //当c_recive为1计数并等待{flag_time0 = TH0 * 256 + TL0;if((flag_hc_value > 1) || (flag_time0 > 21000)) //当超声波超过测量范围时,显示3个888{TR0 = 0;flag_csb_juli = 2;temp = 888;flag_hc_value = 0;break ;}else{flag_csb_juli = 1;}}if(flag_csb_juli == 1) //距离处理{TR0=0; //关定时器0定时EA = 0;temp = TH0; //读出定时器0的时间temp = temp * 256 + TL0;temp /= 59; //HC-SR04超声波模块距离(厘米)=T*uS/58.823EA = 1;if(temp > 380) //如果大于3.8m就超出超声波的量程{temp = 888;}}EA = 0;distance = temp; //距离EA = 1;}/****************冒泡排序(最大值沉底)**************************/int iBuff[5];void choise(int *a,int n) //选择法排序{int i,j,k,temp;for(i=0;i<n-1;i++) {k=i; //给记号赋值for(j=i+1;j<n;j++)if(a[k]>a[j]) k=j; //是k总是指向最小元素*/if(i!=k) { //当k!=i是才交换,否则a[i]即为最小temp=a[i];a[i]=a[k];a[k]=temp;}}}/*******************测量距离处理及显示函数**********************/void smg_display(){int Buff[5];char i;if(distance == 95)return; //95去掉iBuff[4] = iBuff[3];iBuff[3] = iBuff[2];iBuff[2] = iBuff[1];iBuff[1] = iBuff[0];iBuff[0] = (int)distance;for(i = 0; i<5; i++)Buff[i] = iBuff[i];choise(Buff,5); //调用choise函数,冒泡排序distance = (long)Buff[2]; //取得排序后5值的中间值,以消弱误触,稳定测量结果EA = 0; //关中断dis_smg[0] = smg_duan[distance % 10]; //取百分位(厘米级)dis_smg[1] = smg_duan[distance / 10 % 10]; //取十分位(分米级)dis_smg[2] = smg_duan[distance / 100 % 10] & 0x7f; //取个位(米级)EA = 1; //开中断}/*********************报警函数****************************************/void clock_h_l(){static uchar value;if(distance <= set_d){value ++; //多次检测,消除实际距离在设定距离左右变化时的干扰if(value >= 5){beep = ~beep; //蜂鸣器报警}}else{value = 0;beep = 1; //取消报警}}void main(){send_wave(); //测距离函数smg_display(); //处理距离显示函数time_init(); //定时器初始化init_eepom(); //初始化eepom(读取set_d)while(1){if(flag_300ms == 1) //300ms执行一次{flag_300ms = 0;clock_h_l(); //报警函数send_wave(); //测距离函数if(menu_1 == 0) //没有键按下时才给缓冲数组赋新值smg_display(); //处理距离显示函数if(zd_break_en == 1) //自动退出设置界面程序{zd_break_value ++; //每300ms加一次if(zd_break_value > 100) //30秒后自动退出设置界面{menu_1 = 0;smg_i = 3;zd_break_en = 0;zd_break_value = 0;}}}key(); //按键函数if(key_can < 4){key_with(); //按键处理函数}}}/************定时器0中断服务程序用做超声波测距的******************/ void time0_int() interrupt 1{}/**************定时器1中断服务程序,用作主程序********************/ void time1_int() interrupt 3{static uchar value;TH1 = 0xf8;TL1 = 0x30; //定时2msdisplay(); //数码管显示函数value++;if(value >= 150) //300ms中断一次{value = 0;flag_300ms = 1;}if(value % 25 == 0){if(flag_lj_en == 1) //按下按键使能50ms{key_time ++;if(key_time >= menu_ljsd) //500ms{key_time = 0;key_500ms = 1; //500msflag_value ++;if(flag_value >= 3){flag_value = 10;flag_lj_3_en = 1; //3次后1.5秒后连加大些}}}}}。

相关文档
最新文档