基于单片机的红外测距仪设计

目 录

摘 要 I

Abstract II

引 言 1

1 控制系统设计 3

1.1 主控制器选择 3

1.2 项目总体设计 3

2 项目硬件设计 5

2.1 单片机控制模块 5

2.2 测距模块设计 9

2.3 液晶显示模块 10

2.4 报警模块 11

3 项目软件设计 12

3.1 软件开发环境 12

3.2 系统主程序设计 13

3.3 LCD显示程序设计 14

4 系统调试 16

4.1 系统硬件测试 16

4.2 系统软件测试 16

结 论 18

参考文献 19

附录1 源程序清单 21

附录2 总体接线图 29

致 谢 30

摘 要

红外测距系统是一种无线测量系统,用于测量任务中的设备,它是提高工厂测量效率的必要设备之一。为了满足测量近距离且高精度的需求,本文设计了一款操作简单、可靠性高、可以保证完成测量的红外测距系统。

本设计主要采用单片机作为系统处理器,并将红外传感器、液晶显示模块、蜂鸣器模块结合起来,完成红外测距功能。系统可以随时进行测量,可以把测量到的距离数值在液晶屏上显示出来。该系统的测量距离一般在几十厘米之内,超出极限测量范围则会发生报警。

硬件设计介绍了实现红外测距的一般想法,并制作了红外电路原理图,说明了工作原理,报警模块,液晶显示模块,STC89C51单片机的红外测距传感器的引脚分布。软件设计描述了整个程序流的设计和每个程序的功能。最后,总结了整体设计,证明了红外测距的可能性。然后,可以逐步形成设计,改进软件和硬件开发平台,进一步扩展和开发。

关键词:红外测距; STC89C51单片机; 液晶显示

Abstract

An infrared ranging system is a kind of wireless measurement system which is used to measure equipment in a task. It is one of the necessary equipment to improve the measurement efficiency of the factory. We have designed an infrared ranging system with simple operation, high reliability and ability to complete measurements to meet close and high accuracy requirements.

In this design, a single chip microcomputer is used as a system processor, and an infrared ray sensor, a liquid crystal display module and a buzzer module are combined to complete an infrared ranging function. The system can be measured at any time, and the measured distance can be displayed on the LCD screen. The measurement distance of the system is generally within several tens of centimeters and an alarm occurs when the measurement range exceeds the limit.

In the hardware design, the general idea of infrared ranging is introduced, and infrared circuit diagram which explains the operation principle, alarm module, A / D conversion module, liquid crystal display module, and pin distribution of STC89C51 microcontroller infrared distance sensor is made. The software design describes the design of the whole program flow and the functions of each program. Finally, the whole design was summarized, and the possibility of infrared ranging was proven. And, the design evolves, and the software and hardware development platform can be improved, developed and developed.

Keywords: Infrared distance; STC89C51microcontroller;LCD

引 言

单片机在我们的生活中占有非常重要的地位,它的发展速度非常快,因为单片机具有可靠性,低电压和低功耗的明显优势,人们愿意大范围的推广。它在日常消费类产品、玩具、工业控制系统、智能设备和通信系统等范围中有许多应用。因此,基于单片机的红外测距系统具有很大的研发价值。通过红外测距相比于通过尺度测距等测距方式有很大的优势,因为红外测距更方便快捷,它对测量效率具有决定性影响。

回想这几年,我国对于无线测量在技术上的庞大需求,国家也希望有越来越多的新技术和新产品走入无线测量这个领域,然而红外测距扩展了该领域的领土,并朝着更高的智能迈进。有些工业测量任务中,由于没有高效率的完成测量,导致测量任务没有及时完成,造成时间的浪费和生产上的损失。红外测距系统是一种用于近距离、高准度的无线测量设备,它是提高测量效率的必要设备之一。

如今是智能化的时代,利用红外测距系统可以极大的提高测距的效率和精度,同时也降低了人工的成本。红外测距设备是当前工业自动化测距的主流产品,在自动化技术的推动下,红外测距在国内无线测量的核心领域占有一定的地位,无论是性能的体现还是产品的形态方面都具有一定的优势。在信息化、智能、开放的时代,我国红外线的开发和应用促进了产业自动化的发展,形成了产业动向。从可靠性和安全性的角度来看,红外测距仪在可靠的干扰防控能力的实例中得到强调,并且可以保证在任何环境下的测量。

在商业市场的需求中,红外测距仪有着巨大的投资机会,也面临着各种各样的产业。近年来,红外测距仪不仅可以简单操作,而且具有小尺寸,高精度,轻量,性能稳定,因此在我国对这种产品的需求很大。而且随着无线测距技术在不断的发展,逐渐的应用到工业设备上。红外测距系统是一套自动化的无线测距系统,此类设备可以更高效快捷准确的进行距离上的无线测量。在设计、制造和使用设备时,要便于使用单位,维护人员的便捷可靠性以及设备运行的稳定性。同时,也要符合市场发展和用户的需求以及未来拓展功能,系统的通用性和可扩展性也非常重要。

据统计,工厂里的员工们每天要完成很多的由工厂委派的测量任务,并要将这些任务精确、高效、准时完成交工。一名工厂员工每天需要完成的测量任务数量可达几十到几百个。由此可见,红外测距系统将会成为工业测量成本、节省时间、创新并提升员工测量效率的重点之一。

目前来看,红外测距系统在建材、机械、电力、轻工等基础的工业领域都可以有广泛的应用。一个正确的测量方法对于工厂员工去高效地完成任务来说一般有很大影响,基于单片机的红外测距仪能快速完成测量任务主要体现在该设备利用红外线进行测距,这种无线测量相比于员工的手动尺度测量要便捷,而且红外线在测距的途中不会因为受到环境的影响而出现误差,反观尺度测量就非常容易遭受环境因素的影响而无法完成测量任务。如果测量的距离出现错误,那么不仅给工厂员工自身带来麻烦,而且可能会导致某个器件的出产以及整个生产的进度,甚至进而损害工厂的利益。因此,为了便于测量任务的高效完成,特别是保证测距的便捷准确,在进行测量任务的时候一定要使用红外测距仪进行测距,记录距离的时候必须要精准,这也是生产中的一项重要技术指标。

因此,本文设计的是一款红外测距系统,采取单片机作为主控制器,该系统简化了外围设计,使操作更加流畅。本篇文章共分为四个章节,具体的介绍了这种基于单片机的红外测距系统:

第一章介绍了主控制器的选择,以及项目的总体设计分成的几个模块,做出了系统的结构框图。

第二章介绍了红外测距系统的硬件设计,包括部分硬件型号的选择;各个模块工作原理以及电路原理图。

第三章介绍了系统软件设计,描述了系统开发环境和流程图以及显示程序流程图。

第四章介绍了系统的调试部分,分别为电路焊接、硬件调试以及软件调试。

1 控制系统设计

1.1 主控制器选择

基于单片机的红外测距系统设计需要通过一个主控制器来实现,通过查找资料和学习,提出了两种可供选择的主控制器,分别为单片机控制和DSP控制,具体方案如下:

方案一:采用DSP作为主控制器,DSP即数字信号处理器,是一种研究用数字对信号进行分析,转换,滤波,检测,调制,解调和高速算法的元件[3]。数字处理器是用来保证各模块之间的通信,主要包括开机引导、信号读取和液晶屏初始化,以及液晶屏显示数字编解码芯片的运行状态。音频数字信号存储在闪存中。

方案二:系统可以使用单片机作为主控制器,单片机是一种虽然小但很完整的芯片,应用在集成电路中,也可以称之为微型计算机系统。芯片中包含随机储存器RAM、中央处理器处理器、只读存储器ROM、中断、定时器以及若干个I/O口等模块[2]。有些芯片中还包括脉宽调节模块、驱动模块、多路模拟转换等电路。单片机大量运用在工业环境中。采用单片机作为本设计的控制部分,系统主要由单片机、红外传感器、蜂鸣器及液晶显示器构成。红外传感器接收到信号后,模数转换器将好的数字信号转换到单片机上,再由单片机进行数字信号处理,最后由软件计算出数据发送到LCD。综上,与单片机相比,DSP主要是针对一些应用程序需要更高的计算能力,DSP的运行速度很快,但其控制算法相对复杂。而单片机的系统的控制方法相对简单,且可靠性高、价格较低、功耗低,不过单片机相比DSP功能比较简单,但是完全满足本设计需求,同时单片机来实现红外测距有着非常大的研究价值。因此本设计选用单片机作为主控制器。

1.2 项目总体设计

本设计基于单片机的红外测距系统设计由:STC89C51、红外传感器、LCD1602液晶显示器以及报警装置组成。按下红外测距系统的启动按键,可以进行预测值的设置,接着红外传感器进行测距,信号通过单片机处理转变为数据,将数据显示在LCD1602液晶显示器上,构成完整的红外测距系统。由如下模块组成:

(1)测距模块:红外传感器,发射并接收被反射的红外线进行测距,将所测得的模拟信号信息传入单片机中。

(2)最小系统模块:STC89C51单片机作为系统的主控制器,接收红外传感器所传递的的模拟信号信息[1],经过处理后再传递到液晶显示模块上。

(3)报警模块:有源蜂鸣器,如若测距范围超出装置的预设测量范围,则蜂鸣器发生报警。

(4)液晶显示模块:LCD1602液晶显示屏,接收单片机所处理好的数字信号信息,显示最终测得的数据值。

系统总体结构图如图1.1所示:

图1.1 系统总体框图

2 项目硬件设计

2.1 单片机控制模块

2.1.1 单片机型号选择

基于单片机的红外测距系统设计,对单片机的要求较高,要选用带有4K字节EEPROM存储空间的单片机,其次为了保证系统更好的运行,应选用性价比高、可靠性高、低功耗的控制器,以防止器件的损坏,影响系统的运行。基于此有以下两种方案可供选择:

方案一:采用STC89C51作为主控制器。STC89C51是系统中的可编程芯片。它使用8051内核,工作频率高达80MHz。该设备包含4K字节的只读程序内存,可进行擦除1000次,单片机指令与MCS-51完全兼容该设备。该芯片由8位通用处理器和ISP闪存单元组成。STC89C51单片机是一个时钟/机器周期的速度很快、能量消耗较低的新型单片机,它具有的开发简单、可在线编程下载、成本低的特点是非常不错的选择。

方案二:使用MSP430单片机作为主控制器。它被叫做混合信号处理器,它可以使许多功能各异的模块和微处理器集成在一个芯片上,MSP430系列单片机具有16位能量消耗超低和精简指令集[5]。一般来说,需要使用电池供电的设备仪表使用该系列的单片机。但是开发难度相对比较大、价格昂贵。

综上所述,与MSP430单片机相比,STC89C51单片机开发难度较低、稳定性高,而且价格合适,结合设计所需要的性能,最终选用STC89C51单片机作为主控制器。

2.1.2单片机的引脚说明

STC89C51单片机有两种封装形式,分别是PDIP(40引脚)和PLCC(44引脚)。在本设计中,直接插入PDIP(40个引脚)。为了方便更换芯片,避免芯片在高温焊接时损坏,焊接时可采用集成电路插座进行焊接,焊接完成后可将芯片插入集成电路插座,STC89C51所拥有的40个引脚中可以控制的有P0、P1、P2、P3各32个。这些引脚可以单独或同时在特定位的I/O端口进行控制,不需要定义输入和输出就可以很方便地进行控制。当将值赋给I/O时,I/O端口将自动转换为输出,当读取I/O端口时,I/O端口将自动转换为输入。如图2.1所示,引脚相对应的功能如表2.1所示。

表2.1 单片机引脚功能

引脚 功能

P0.0~0.7 普通I/O口,与LCD1602相连

P1.0~1.3 普通I/O口输入,与按键相连

P1.4~P1.6 普通I/O口,与LCD1602相连

P2.5 P2.7 普通I/O口输出,与led灯相连

P3.0 RXD,串行输入

P3.1 TXD,串行输出

P3.4~P3.7 普通I/O口,与ISD4004相连

图2.1 STC89C51单片机引脚图

2.1.3 单片机的最小系统

单片机最小系统有三个部分,分别为:电源电路、晶振电路以及复位电路。在本设计中,STC89C51单片机可以在4.5~5.5V的电压范围中正常工作。电源部分采用USB电源线,可连接手机充电插头或5V移动电源,为系统供电。单片机的最小系统如图2.2所示:

图2.2为STC89C51单片机最小系统的电路图

在晶振电路中有两个独立的反向放大器,它们不仅可以与石英晶振配合,作为单片机的内部振荡器。而且能够单独作为一个元器件,需要被外部时钟驱动来使用。也就是说,晶振电路的输入端着连接两个电容,输出端着连接一个石英晶体振荡器,这样就产生了一个内部振荡器,从而起到调节频率的作用。如图2.3所示:

图2.3 晶振电路

在本设计中,单片机系统是否稳定直接取决于复位电路的完好程度。如果单片机没有立即投入运行,就说明单片机的电源电压不稳定,需要先进行一段时间的复位。电源稳定后,单片机将开始工作。复位电路通常包括手动钥匙复位、电源复位和整体复位。在这种设计中,由于微控制器的电容效应,启动时间将在工作开始后延迟一段时间。复位电路如图2.4所示:

图2.4 复位电路

2.2 测距模块设计

2.2.1 传感器的选择

本设计中的传感器要实现对信号发送与接收的功能,可将接收的信号传递到模数转换模块中进行处理,并且适用于STC89C51单片机,与其组合能体现出更好的发挥,以下为本模块的方案选择:

方案一:基于红外传感器的设计,红外传输,使用红外传输管发送信号,通过障碍物反射信号,红外接收管接收反射信号。并且,根据信号强度,是显示模块中显示的对应的电压值以及此时的记录的距离。红外传感器用于测距,所接收的模拟量通过模数转换器转换成单芯片微计算机处理的数字量。通过处理来自模数转换器的数字量,可以在显示模块上显示与由红外线接收管接收的信号强度对应的距离值。

方案二:经由激光发射二极管对障碍物发射激光信号,激光射达障碍物表面后,其向各个方向发散,当激光接收器接收到反射回的光时,其中的光学系统对其进行接收后,然后对检测到的微弱光信号进行放大,进而转化成相应的电信号传送回单片机中通过程序进行分析,最终得出结果。

综上考虑,虽然方案二中的激光传感器具有远距离测量、速度快,精度高等优点,但是其所检测到的数据会变得复杂,并且使用的成本也升高许多,反观方案一中的红外传感器不仅操作结构简明,实现方便,而且在成本上很节约,反应也十分灵敏,因为抗干扰能力强,不会因为周围环境的差别而影响最终的测试结果,所以便于用在近距离情况的检测。故选用方案一。

在该设计中,红外传感器VCC连接到电源GND和GND接地线。已知红外传感器的测量范围为10cm~80cm,测量误差不大于0.5cm。形成位置感测检测器和红外LED,是范围测量传感器单元和PSD的集成组合。在这个设计中,使用三角测量方法将红外发射器从特定角度发射到红外。当光线接触对象时,对象会反射光线。此时,可以检测反射的红外光,并且可以获得偏移L。可以使用三角关系和滤波器的出射角、偏移距离L、中心矩X和焦距F来确定传感器和目标之间的距离D。如图2.6所示:

图2.6红外传感器

2.3 液晶显示模块

2.3.1液晶显示模块选择

对于基于设计的显示模块,显示器应当具有方便和灵活的接口。可以通过简单的编码、简洁、明确的信息在接口上显示。工作电压和电源必须低于同一类型的光栅模块。硬件电路和程序相对简单。

方案一:作为系统的显示装置使用LED。LED或数字管适合低成本显示数字和文字。但是,在与本系统的主控制装置连接的情况下,LED动态扫描方法占据更多的I/O端口,主控制端口的电流输出不足,因此驱动模块还需要放大电流以控制数字管。另外,数字管显示器的内容选择增加了焊接的难度,容易发生焊接错误。

方案二:LCD1602屏幕用作系统的显示设备。LCD1602液晶还被称为文字液晶,可以同时显示16×2或32个字符,包括数字、字符、符号或自定义字符。LCD1602由多个位图字符组成,每一个位图可以分别显示字符、字符和各条线的各个位,这被称为字符间隔和线条间隔。

基于以上说明,液晶画面控制相对简单,画面尺寸适当,没有发生资源废弃物,满足设计的功能要求。因此,使用LCD1602作为系统的显示装置。

2.3.2 LCD1602模块设计

LCD1602可以通过执行读取状态操作、写入命令操作、读取数据操作和轻数据操作来控制。

LCD1602共计11个指示,SCM向液晶显示器发送了这些指示。然后,您可以完成某些特定功能(例如,开启、关闭、屏幕清除等)。如果LCD1602本身不能直接调用出该字库,则需要使用自定义字符写到CGRM中,挪用的方法与自定义字符的写入,显示字符的方法相同,将自定义字符字模写入LCD的CGROM中即可。

LCD1602已经非常普遍,可以很容易地适用于市场上大部分的显示需求。字符型LCD通常有14针线或16针线LCD,多余的2条是背光线VCC(15针)和接地GND(16针),原则上与14针LCD相同。如图2.7所示:

图2.7液晶显示模块原理图

2.4 报警模块

2.4.1蜂鸣器选择

基于本设计要求在测量距离超出最大可测范围之后,系统会发出声音进行报警,为了实现这一功能,需要选取一种程序控制方便的蜂鸣器。

方案一:有源报警器。有源蜂鸣器是一种简单的振荡电路,用于将恒定直流电流转换为某个频率的脉冲信号,并交替来自表面的磁场来驱动钼片的振动和声音的电子结构。蜂鸣器只需电平即可驱动。

方案二:无源蜂鸣器。属于一种被动蜂鸣器。无源蜂鸣器内没有振荡电路。使用DC信号的话,因为不能发出声音,所以必须用2K~5K的方波来驱动。DC可以连续按振膜而不发出声音。

综上,相比于无源蜂鸣器,有源蜂鸣器控制方便,功能更多,所以最终选用带有震荡源的5V有源蜂鸣器来实现设计的报警功能。如图2.8所示:

图2.8 报警模块原理图

3 项目软件设计

3.1 软件开发环境

本设计使用Keil μVision来实现。Keil是一个软件开发系统,其中兼容C语言。对于汇编来说,C语言具备可移植、易于维护和修改、方便调用模块、简单易学。Keil提供了完整的开发计划,包括C编译器,库管理,宏程序集,连接器以及将这些组件组装到集成开发环境(Vision)中的非常强大的模拟器调试器[9]。而使用它则因为其集成环境很方便,并且适用于STC89C51单片机。,该软件开发界面如图3.1所示 。

图3.1 软件开发界面图

具体的操作步骤为:开发时首先需要建立"Project"工程,选择"New μVision Project",为新建的工程命名后点击保存,选择本设计选取的单片机型号"STC89C51";成功建立工程后,选择"Source Group"按键,可添加文件,如果想编辑文件,可以点击"Add"。如图3.2所示:

图3.2 Keil μVision软件开发流程图

3.2 系统主程序设计

在整个系统运行过程中,当红外测距系统被启动后,首先,在装置进行预测值设定,接着红外传感器开始进行测距,将测得的信号传入单片机中,单片机开始判断所测距离是否超出预测范围,如果超过了预测范围,则蜂鸣器开始报警,此时应该对单片机进行复位操作,并且重新设定预测值;如果所测距离没有超过预测范围,则单片机将数据送至液晶显示屏上进行距离显示,随后对距离进行记录并关闭红外测距装置。在软件设计中,主程序不宜放太多的代码,可以采用函数将具体的代码封装后,在主函数中调用,这样修改起来也很方便。如图3.3所示。

图3.3 系统主程序设计流程图

3.3 LCD显示程序设计

这里采用8位并行接口来操作LCD1602。D0-D7与单片机的P0.0至P0.7相连。采用89C51的P0口作为LCD1602显示器的数据输入口,需要严格按照产品的时序要求进行编程。LCD1602的液晶显示器首先需要设计显示数据的地址,然后通过命令按顺序写入数据。当地址写入后显示第一个内容时,地址自动递增一。如图3.4所示。

图3.4 LCD显示程序流程图

4 系统调试

4.1 系统硬件测试

根据该系统的设计,焊接电路应注意是否有短路电路、开放电路、故障方向的部件、电路设计误差。部件的焊接误差和错误方向的检测方法是将物理电路基板与电路图的电路图进行比较,检查各部件和导线是否出现在物理对象上。如果发现没有或及时的重新需要,则不能进行比较,确定焊接的及时修理。在短路电路中,电路破坏、虚拟焊接等情况需要使用数字多仪表检测。在蜂鸣器文件中放入数字万用表。红笔和黑笔如果短路的话,万用表会发出蜂鸣声。根据这个原理,可以用来检测短路、故障电路和虚拟焊接。如果蜂鸣器响的话,线是正常的;如果听不到报警的话,那表示电路有什么错误。测试后,物理电路板与电路图一致,所有组件均正确连接,系统最终实现了所有硬件功能。

在这种设计中,显示模块是非常重要的部分,因为它不仅在硬件核心上,而且在硬件调试中也遇到了问题,如果连接到电源上,则显示画面不亮,不显示,这是为什么呢?我开始寻找原因,检查电源是否通电,确认指示器灯是否接通,编程后将P1降低,确认P1输出低,最终P0端口未连接到拉电阻。连接后,显示画面亮灯。在硬件调试中,虽然遇到了可以显示的显示画面,但是显示器上存在大问题。调整距离后,显示器没有变化。检查后发现红外传感器和VCC连接不好,与单片机接触不良。最小的系统板调试SCM软件确保了正常工作和硬件系统。最后,组合模块进行测试以实现系统整体的功能。

4.2 系统软件测试

基于硬件调试,C语言编号的程序将通过下载器下载到单片机。根据设计的电路参数和步骤,取景器的范围从10cm到80cm,范围取景器的最大误差在0.5cm以下。调试系统后,测量了好几次距离,与预设值进行比较,多次分析测量误差。修改程序以满足实际测量要求,调整设备并获得更完整的程序。设计软件的调试步骤如下。

(1)首先在Keil μVision中创建新的项目。单击菜单栏中的"porject",为新工程命名,并命名保存。

(2)新的用户源文件:首先,创建一个新的空白文本来书写程序的源代码。写入和保存后,创建新文件,文件扩展名为"设计名.a"。

(3)程序编译和调试:单击"编译"按钮启动系统。操作中输出窗口中显示反馈信息。如果看到错误信息,可以根据错误进行修改。

但是,程序调试不能成功,首先是单片机的微型计算机,要写入实验,是由固定距离记录的信号强度收集的,然后在程序中添加相应的数据最后,通过红外测量模块可以显示相应的数据距离,主程序是整个程序的基础,也是核心。

最后按照以上软件步骤进行软件调试,循序渐进,检查出程序并没有错误,且可以正常运行,从而得到正确的测试结果,可知软件方面的调试也顺利完成。如图4.1所示:

图4.1 程序调试成功显示图

结 论

本篇论文针对工厂维修人员在需要完成测量任务的情况下,无法及时准确得测量出距离,导致任务不能有效的完成这一问题,设计出一种基于单片机的红外测距系统。维修人员使用红外测距仪根据任务的需求来进行测量,从而快速有效的完成测量任务。

本设计是由STC89C51单片机、测距模块、LCD显示模块等组成的红外测距系统。也利用Keil μVision软件编写C语言程序,使各个模块实现相应功能。本设计经过了硬件以及软件的测试,各部分均达到预期功能:实现了对10cm-80cm范围内的距离测量,如果超出测量范围会进行报警。该红外测距系统操作简单,准确性高,抗干扰能力较强。

该系统实现了为工厂维修人员提供测量便利,同时对于各个行业需要进行小范围测量的工作人员可以快速完成工作中的测量任务,使用测量起来方便快捷、简单准确,而且该设计成本不高,在材料上 也很节约,与其他的测量装置相比,此测量仪器性价比方面可以说是很高,而且能很快的融入人群当中所使用,更迅速的贴近生活,也能满足工业生产的测量要求,随需随用,使用起来也是简单实用。应用本设计产品,可以提高工厂维修人员完成测量任务的效率,促进企业的进一步发展。

参考文献

[1] 张明峰. PIC单片机入门与实战[M]. 北京:航空航天大学, 2003.5: 55-60

[2] 窦振中. PIC单片机应用设计与实例[M]. 北京:航空航天大学, 2002.3: 118-120

[3] 谢自美. 电子线路综合设计[M]. 华中科技大学, 2006.6: 34-40

[4] 康华光. 电子技术基础:模拟部分第五版[M]. 电子技术, 2003.9: 55-110

[5] 潘永雄. 电子线路CAD实用教程[M]. 西安:电子科技大学, 2007.7: 115-123

[6] 苗振腾. 基于单片机控制系统设计[J]. 电子世界, 2018,56(23):196+198

[7] 徐斌. 低频射频识别技术研究[D]. 西安:电子科技大学, 2013.4: 66-68

[8] 刘莹. 基于单片机控制的红外测距设计与实现[J]. 电子技术与软件工程, 2014,92(03):158-159

[9] 黄庆华. 单片机开发技术与实训[M]. 北京:北京电子工业出版社, 2011.4: 108-145

[10] 杨新. 电子设计从零开始[M]. 北京:北京清华大学出版社, 2005.7: 155-262

[11] 刘坤. 51单片机典型应用开发范例大全[M]. 机电工程技术, 2018.3: 85-88

[12] 鲁刚强. 基于液晶显示器的单片机系统设计[J]. 科技资讯, 2008,27(08):35-70

[13] 谭浩强. C程序设计[M]. 北京:清华大学出版社, 1999.5: 88-100

[14] 胡学海. 单片机原理及应用系统设计[M]. 电子工业出版社, 2007.6: 112-135

[15] 耿永刚. 单片机技术与应用[M]. 上海:科学技术出版社, 2012.9: 88-100

[16] 张振荣. 单片机原理及实用技术[M]. 北京:人民邮电出版社, 2000.3: 10-13

[17] 沈红卫. 基于单片机的智能系统设计与实现[M]. 北京:电子工业出版社, 2005.7: 30-35

[18] 温宗周. 单片机原理及接口技术[M]. 北京:中国电力出版社, 2009.4: 89-110

[19] 薛纪文. C语言程序设计教程[M]. 电脑知识与技术, 2003.6: 40-66

[20] 曲波. 工业常用传感器选型指南[M]. 北京:清华大学出版社, 2002.6: 22-28

[21] 陈鸿茂. 常用电子器件简明手册[M]. 中南矿业大学出版社, 2001.8: 88-103

[22] 朱华光. LCD1602的编程技巧[J]. 电脑知识与技术, 2010, 22(13):14-18

附录1 源程序清单

#include <reg52.h>

#include <intrins.h>

#include <stdio.h>

#include <math.h>

#include "delay.h"

#include "i2c.h"

sbit RS = P2^4;

sbit RW = P2^5;

sbit E = P2^6;

sbit RES = P2^3;

sbit PSB = P2^1;

sbit PAUSE = P3^0;

unsigned char temp[8];

float num,i;

float a,b;

double data3;

#define DataPort P0 //MCU P0<------> LCM

#define AddWr 0x90 //写数据地址

#define AddRd 0x91 //读数据地址

sbit key1=P1^2;

sbit key2=P1^3;

sbit key3=P1^4;

extern bit ack;

unsigned char ReadADC(unsigned char Chl);

bit WriteDAC(unsigned char dat);

/------------------------------------------------
检测忙位
------------------------------------------------
/

void Check_Busy()

{

RS=0;

RW=1;

E=1;

DataPort=0xff;

while((DataPort&0x80)==0x80);//忙则等待

E=0;

}

/------------------------------------------------
写命令
------------------------------------------------
/

void Write_Cmd(unsigned char Cmd)

{

Check_Busy();

RS=0;

RW=0;

E=1;

DataPort=Cmd;

DelayUs2x(5);

E=0;

DelayUs2x(5);

}

/------------------------------------------------
写数据
------------------------------------------------
/

void Write_Data(unsigned char Data)

{

Check_Busy();

RS=1;

RW=0;

E=1;

DataPort=Data;

DelayUs2x(5);

E=0;

DelayUs2x(5);

}

/------------------------------------------------
液晶屏初始化
------------------------------------------------
/

void Init_ST7920()

{

DelayMs(40); //大于40MS的延时程序

PSB=1; //设置为8BIT并口工作模式

DelayMs(1); //延时

RES=0; //复位

DelayMs(1); //延时

RES=1; //复位置高

DelayMs(10);

Write_Cmd(0x30); //选择基本指令集

DelayUs2x(50); //延时大于100us

Write_Cmd(0x30); //选择8bit数据流

DelayUs2x(20); //延时大于37us

Write_Cmd(0x0c); //开显示(无游标、不反白)

DelayUs2x(50); //延时大于100us

Write_Cmd(0x01); //清除显示,并且设定地址指针为00H

DelayMs(15); //延时大于10ms

Write_Cmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动

DelayUs2x(50); //延时大于100us

}

/------------------------------------------------
显示用户自定义字符
------------------------------------------------
/

void DisplayCGRAM(unsigned char x,unsigned char y)

{

switch(y)

{

case 1: Write_Cmd(0x80+x);break;

case 2: Write_Cmd(0x90+x);break;

case 3: Write_Cmd(0x88+x);break;

case 4: Write_Cmd(0x98+x);break;

default:break;

}

Write_Data(00);

Write_Data(00);

}

/------------------------------------------------
显示字符串
x:横坐标值,范围0~8
y:纵坐标值,范围1~4
------------------------------------------------
/

void LCD_PutString(unsigned char x,unsigned char y,unsigned char a[8])

{ unsigned char k=0;

switch(y)

{

case 1: Write_Cmd(0x80+x);break;

case 2: Write_Cmd(0x90+x);break;

case 3: Write_Cmd(0x88+x);break;

case 4: Write_Cmd(0x98+x);break;

default:break;

}

while(k<9)

{

Write_Data(a[k]);

k++;

DelayUs2x(50);

}

}

/------------------------------------------------
清屏
------------------------------------------------
/

void ClrScreen()

{

Write_Cmd(0x01);

DelayMs(15);

}

/------------------------------------------------
显示图片
------------------------------------------------
/

void LCD_PutGraphic(unsigned char code *img)

{

int i,j;

//显示上半屏内容设置

for(i=0;i<32;i++)

{

Write_Cmd(0x80 + i); //SET 垂直地址 VERTICAL ADD

Write_Cmd(0x80); //SET 水平地址 HORIZONTAL ADD

for(j=0;j<16;j++)

{

Write_Data(*img);

img++;

}

}

//显示下半屏内容设置

for(i=0;i<32;i++)

{

Write_Cmd(0x80 + i); //SET 垂直地址 VERTICAL ADD

Write_Cmd(0x88); //SET 水平地址 HORIZONTAL ADD

for(j=0;j<16;j++)

{

Write_Data(*img);

img++;

}

}

}

/------------------------------------------------
设置到绘图模式
------------------------------------------------
/

void SetGraphicMode()

{

Write_Cmd(0x36); //选择8bit数据流 图形模式

DelayUs2x(20);

}

/------------------------------------------------
主程序
------------------------------------------------
/

main()

{

unsigned char i,j;

Init_ST7920();

while(1)

{ LCD_PutString(0,1,"长 ");

LCD_PutString(0,2,"宽 ");

LCD_PutString(0,3,"S ");

while(key1)

{ i=ReadADC(0);

if(i>=20&&i<=31)

{num=-2.5i+130;}
else if(i>=31&&i<=39)
{num=-1.428
i+95.714;}

else if(i>=39&&i<=48)

{num=-1.111i+83.333;}
else if(i>=48&&i<=54)
{num=-0.833
i+70;}

else if(i>=54&&i<=69)

{num=-0.357i+44.286;}
else if(i>=69&&i<=90)
{num=-0.227
i+35.455;}

else if(i>=90&&i<=126)

{num=-0.147i+28.235;}
a=num;
num=num
100;

temp[0]='0';

temp[1]=(int)num/1000+'0';

temp[2]=(int)num/100%10+'0';

temp[3]='.';

temp[4]=(int)num/10%10+'0';

temp[5]=(int)num%10+'0';

temp[6]='c';

temp[7]='m';

temp[8]=' ';

LCD_PutString(2,1,temp);

DelayMs(50);

}

while(key2)

{ i=ReadADC(0);

if(i>=20&&i<=31)

{num=-2.5i+130;}
else if(i>=31&&i<=39)
{num=-1.428
i+95.714;}

else if(i>=39&&i<=48)

{num=-1.111i+83.333;}
else if(i>=48&&i<=54)
{num=-0.833
i+70;}

else if(i>=54&&i<=69)

{num=-0.357i+44.286;}
else if(i>=69&&i<=90)
{num=-0.227
i+35.455;}

else if(i>=90&&i<=126)

{num=-0.147i+28.235;}
b=num;
num=num
100;

temp[1]=(int)num/1000+'0';

temp[2]=(int)num/100%10+'0';

temp[3]='.';

temp[4]=(int)num/10%10+'0';

temp[5]=(int)num%10+'0';

temp[8]=' ';

LCD_PutString(2,2,temp);

DelayMs(50);

}

data3=ab10;

temp[0]=(int)data3/10000+'0';

temp[1]=(int)data3/1000%10+'0';

temp[2]=(int)data3/100%10+'0';

temp[4]='.';

temp[3]=(int)data3/10%10+'0';

temp[5]=(int)data3%10+'0';

temp[6]='c';

temp[7]='m';

temp[8]='2';

while(key3)

{

LCD_PutString(2,3,temp);

DelayMs(50);

}

ClrScreen();

}

}

unsigned char ReadADC(unsigned char Chl)

{

unsigned char Val;

Start_I2c(); //启动总线

SendByte(AddWr); //发送器件地址

if(ack0)return(0);
SendByte(0x40|Chl); //发送器件子地址
if(ack0)return(0);

Start_I2c();

SendByte(AddWr+1);

if(ack==0)return(0);

Val=RcvByte();

NoAck_I2c(); //发送非应位

Stop_I2c(); //结束总线

return(Val);

附录2 总体接线图

致 谢

经过历时三个多月的努力,终于完成了这次的毕业设计作品,在这次毕业设计中我明白了理论和实际之间有着巨大的差距,理论成立但毕竟只是原理上,一旦做起来就会发现现实中有着各种各样的因素影响着你,只看理论是不会发现这些的,只有实践中你才会发现自己的不足。经过历时三个多月的努力,终于完成了这次的毕业设计作品,在这次毕业设计中我明白了理论和实际之间有着巨大的差距,理论成立但毕竟只是原理上,一旦做起来就会发现现实中有着各种各样的因素影响着你,只看理论是不会发现这些的,只有实践中你才会发现自己的不足。

本论文的顺利完成离不开各位老师、同学和朋友的关心与帮助。在这里我要感谢我的指导老师沈洪洋老师和台闯老师。从课题确定开始,查阅资料,开题报告确定和修改,中期检查,后期详细设计,甚至最后论文编写和完成答辩稿,整个过程中都给予了我悉心的指导。在论文的写作过程中,每当我有所疑问,老师总会放下繁忙的工作,孜孜不倦地指点我,他们为了指导我的毕业论文,放弃了自己的休息时间,这种无私奉献的精神令人敬佩。其次,我还要感谢我的任课老师及系主任,正是因为有了他们严格、无私、高质量的教导,我才能在这几年的学习过程中汲取专业知识和迅速提升潜力。我还要感谢我的班主任谢老师这几年来对我的关心、帮忙与支持。另外,我要感谢参与我论文评审和答辩的各位老师,他们给了我一个审视四年来学习成果的机会,让我能够明确今后的发展方向。最后,我要感谢我的学校,创造了如此好的学习环境,丰富多彩的校园生活也即将在我的脑海里留下美好的记忆,我深深感谢所有关心、爱护、教育和帮助过我的每一个人,我将在今后的工作中加倍努力,提升自己,完善自己,谢谢你们。

相关推荐
所待.38312 分钟前
JavaEE之线程初阶(上)
java·java-ee
Winston Wood16 分钟前
Java线程池详解
java·线程池·多线程·性能
手握风云-20 分钟前
数据结构(Java版)第二期:包装类和泛型
java·开发语言·数据结构
喵叔哟40 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生1 小时前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
不是二师兄的八戒1 小时前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生1 小时前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰2 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study2 小时前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言