编程语言应用

注册

 

发新话题 回复该主题

基于单片机的电子秤设计 [复制链接]

1#

目录

摘要.5

第一章绪论.7

1.1研究课题背景.7

1.2国内外发展概况.9

1.3课题研究的目的.10

1.4课题的研究内容及章节安排.11

第二章智能电子秤控制系统的设计方案.12

2.1设计任务及要求.12

2.2方案选择.12

2.3方案的论证与分析.13

2.4对设计方案进行对比分析.14

第三章系统硬件部分设计.14

3.1总体设计.14

3.2主控制器设计.15

3.2.1芯片介绍.15

3.2.2时钟电路设计.17

3.2.3复位电路设计.18

3.3信号采集模块.19

3.4数据转换模块.20

3.4.1A/D转换器的选择.20

3.4.2ADC的介绍.21

3.4.3单片机对ADC的控制原理的介绍.21

3.5声光报警电路.22

3.6显示电路.23

3.7整机电路.24

第四章系统硬件部分设计.24

4.1主程序流程图.24

4.2主程序流程图.26

4.3报警程序设计.27

4.4报警程序设计.27

第五章系统软件设计部分.29

5.1软件研发的背景.29

5.2软件程序设计.30

5.3基于Proteus电路图绘制.31

第六章结束语.33

参考文献.34

致谢.35

附录.36

摘要

随着我国微型电子技术和嵌入式系统的发展,目前行业内相对比较传统的电子称重器无法满足客户的需求。为了改进传统电子秤在称重计量上得短板问题,在本次毕业设计中,将使用相对先进、快捷、智能的控制机制。该系统的控制大脑为核心部件51系列嵌入式开发系统,采用51单片机作为主要控制核心,在使用电子秤称重过程中主要通过电阻应变式压力传感器采集信号,通过数模转换将对称重电压信号进行数模转换和测量,最终将信号传送给显示器部分,蜂鸣报警等。该电子秤设计具有智能称重、数字显示、报警等功能,而且性价比高、度准确、能耗较低、制作简易、称重方便快捷等特点,给人民生活带来了很大的影响,在市场上很受欢迎。

该智能控制系统设计主要从国内外发展状况,硬件控制部件选择,根据控制原理绘制硬件电路,控制系统软件程序设计开发,软硬件联调仿真,焊接主板电路五个方面进行详细讲解。该控制系统使用AT89C51嵌入式开发系统、传感器信号采集电路、声光报警模块、电路显示部分、数据转换电路等组成智能电子秤系统。智能控制系统使用的数模转换电路是市场上专用的ADC芯片,将传感器采集到的模拟信号转换成单片机能够识别的数字信号,并且将数字信号在单片机上进行相应的处理,LML液晶显示器将将信号稳定的显示出来,并且无闪烁现象。

关键词:单片机;传感器采集;液晶屏显示;信号转换

Abstract

Withthedevelopmentofmicro-electronictechnologyandembeddedsysteminChina,thetraditionalelectronicweighersintheindustryareunabletomeettheneedsofcustomers.Inordertoimprovetheshortboardproblemofthetraditionalelectronicscaleintheweighingandmetering,inthisgraduationproject,willusetherelativelyadvanced,fast,intelligentcontrolmechanism.Controlthebrainofthesystemasthecore
  早在20世纪40年代我国的称重技术还很落后,主要以机械杠杆式为主,由于逐渐意识到落后和精度的缺失,渐渐开始向机电混合式的方向发展。直到50年代左右,市场上开始涌现出一批压力传感器,慢慢的市场上的秤主要以电子类为主。但由于国内外各类称重压力传感器的功能和性能方面有了重大的革新,这也为我国智能电子秤的革新奠定了坚实的基础。而国外的水平相对比较先进,一些欧洲国家在20世纪六七十年代电子秤技术已经有了先进的水平,精度可达0.1%,到了70年代中期市场上大多数的机械式杠杆秤被机电一体化的电子秤多取代。现如今,智能电子秤的发展方向掌握在我们新一代青年中,要朝着智能控制、程序控制、人性化的方向迅猛向前。
  我们的电子秤技术在20世纪70年代中期也取得了前所未有的进步,因为称重传感器技术的革新。不同的电子秤,如春季雨后的青笋,逐渐应用于国家的所有部门。作为生产过程冶金从事材料称重和钢水包灌溉铸件的混合物称重、轻纺期间从事生产技术称重和测量、包装,其中煤炭能源行业连续称重核算材料和能源、称重测量消耗品行业材料称重,自动检查和分离从食物从事饲料原料称重,权衡产品组件中的电子被称重,在计数测量的日常生活在没有电子技术人员的情况下变成了一片区域。此外,运输部门也离不开使用电子技术、轴和设备过载来提升建筑。在医学领域,如果没有电子测量装置来研究新陈代谢和调节体内的热量,身体连续减重曲线,如汗水和心跳,也无法获得。这只是在国家经济中应用电子秤技术的几个方面,从这些事例中我们能够看出智能电子秤的使用和发展至关重要。

欧美等发达国家在智能电子秤制造方面有先进的水平,他们在20世纪60年代开始对智能电子秤控制系统方面展开深入的研究,在年之后,研究人员就基本实现了对电子秤的智能控制,在20世纪末期,开始对智能电子秤的控制模块进行批量生产,但因为生产成本过高,这种最新的研发项目只用在了少数专用电子秤上,其他电子秤仍然需要依靠人为去操作电子秤控制系统。然而现如今,智能电子秤控制系统已经成功地与电子技术相结合,而且逐渐走向成熟,由于购买成本有所减少,越来越多的人开始购买智能电子秤控制系统。

我国在智能电子秤控制系统方向的研发力度不够,而且很晚,然而随着近几年来我国电子秤行业的蓬勃发展,电子秤数量也在快速增加,同样的对电子秤智能化的需求量也急剧增加。即使国外在智能电子秤控制方面研究比较突出,但我国的实际需求情况比较复杂,并不能完全的应用此项技术,电子秤种类较多,没有一致规范,而且消费习惯也不一样,达到智能电子秤控制还有一定的距离,但是智能电子秤控制系统在国内的还是有宽广的未来。

1.3课题研究的目的

在本次毕设研究当中,主要是针对智能电子秤控制系统这一方向进行学习的。本次智能电子秤控制系统主要控制器是使用Flash存储器的AT89C51单片机,使用几种传感器来收集数据,进而传输给单片机,单片机对数据进行分析和处理,让电子秤能够智能测量重量、制定价格、数据归零、自动去皮、显示数据等功能,同时增加报警电路,达到超重报警的需求为最终目标,能够做到控制电子秤的智能化和准确化。电路中主要的控制部分主要由时钟电路、数据转换电路、复位电路、报警电路、信号采集电路、显示电路等组成,从而达到设计要求,在方便操作人员的基础上,还提高了操作人员的快捷性。

电子秤是目前市场上至关重要的测量设备,准确性、快速性逐渐成为智能电子秤的显示要求,更要方便用户实时监控和实时测量,从而有效的将市场上比较落后的机械式测量装置,同时逐步成为电子秤行业的佼佼者。在此次智能电子秤设计开发工程中主要用编程为主进行软件开发,以嵌入式开发系统为核心,硬件电路主要采用电阻式称重传感器,该传感器精度较高,测量范围为0~10千克,同时可依据设计要求来手动修改智能电子秤的最高限值,当测量物体的重量超过所设置的上限值,蜂鸣电路就会报警,来提醒用户,方便智能。但因为传感器输出的信号是模拟值,并且电量值很小,不能满足数模转换电路接收的电压范围。因此需要对信号通过滤波电路滤波,放大器放大处理,然后将转换的数据发送给单片机进行相关的处理,并通过LCD显示屏将数据呈现出来,设计成本相对较低,并且可以满足实际的需求。该智能电子秤设计的优势主要体现在以下几点:1、满足对数据的实时测量存储;2、对上限值可进行修改或者重新设置;3、当测量数据超过限制值电路会发出报警提醒;4、测量精度比较高、5、数据传输显示速率高,准确性高。

本文设计的电子秤虽然是一个极其简单的智能仪器,但是通过它可以更深入的了解智能仪器的工作原理以及其优异的性能。

1.4课题的研究内容及章节安排

此次课题研究是针对当前电子秤行业电子技术的发展和状况进行一个初步的了解而确立的,它的总体设计思路符合目前的社会需求,将微控制器技术和智能电子秤控制系统紧密的结合在一起,做成了一系列成本低、性价比高、实用性高的智能电子秤控制系统。本文一共分为五个章节:

第1章是绪论部分,就是简明的表述了这次设计的研究背景、研究条件以及研究它的目的。

第2章是智能电子秤控制系统的设计方案,对设计任务与目标的详细表述和系统控制模块设计思路的论证与分析。

第3章是系统硬件设计部分,简明的陈述了AT89C51嵌入式开发系统控制电子秤的硬件电路模块设计方案,其中就包括单片机控制的各类传感器也有相关的介绍。

第4章是系统软件设计部分,编写主程序流程图、数模转换子程序流程图、报警子程序流程图等,使用C语言编程的方法将各种数据和系统控制模块以程序的形式编写出来,从而能够做到控制电子秤的目的,同时根据硬件要求去调试,在相对准确的前提下,达到对智能电子秤控制系统的完美控制。

第5章是系统仿真调试部分,采用keil软件对集成代码进行调试,用Proteus绘制电路图并通过程序进行仿真。

第6章是总结部分,这次设计本人认真的总结了在做这个课题研究时碰到的各种困难以及自己去克服它的方法,并且证明了我的设计方案的可行性和实用性。

第二章智能电子秤控制系统的设计方案

2.1设计任务及要求

通过智能电子秤控制系统,利用单片机设计一个电子秤重平台,通过传感器将重量转换成电信号,转换器采集后由单片机处理。具有称重、定价、归零、累加、去皮、显示的功能,同时还具有超载报警功能为目的。

智能电子秤的工作原理:当被测对象放置在秤盘上时,将检测到的重力传给传感器,传感器内部因受压而发生变形,同时传感器内部电路的阻抗也会随之改变,七通过激励电压方式给数模转换电路一路模拟值,数模转换电路将模拟值转换成数字量传送给嵌入式开发系统,经过其内部处理逻辑将测量的数据通过显示器显示出来,使用户方便的看到被测对象的重量。

2.2方案选择

在设计开发该控制系统时,有两种方案可达到智能电子秤的设计要求:

方案一:此控制系统主要由数据采集电路、时钟控制电路、数据显示电路、功能复位电路、嵌入式开发系统及超限报警装置等五部分构成,是在该控制系统工作原理的基础上对单片机数据进行了扩展,同时引入外界设备对嵌入式开发系统的内部数据进行标定,能够让电子秤达到智能测量的功能。这种方案,硬件设计电路比较简易,同时接口设计电路比较容易实现,并且在代码量上很大程度减少了代码。具体设计框图如图2-1所示:

图2.1:方案一框图

方案二:该方案一共由七部分组成,控制系统主要由时钟控制电路、功能复位电路、数据采集电路、数据显示电路、数模转换电路、嵌入式开发系统以及超限报警电路组成。而且在控制系统的前部加入了数据采集处理、数模转换等设计方案,尤其是在显示电路部分使用了LCD液晶显示器,它具有字符、文字、图像显示的功能。这种方案不仅加强了人机交换的能力,而且显示位数全面。其方框图如图2-2所示:

图2.2:方案二框图

2.3方案的论证与分析

方案一:

该方案设计的智能电子秤,可以达到智能称重的目标,但由于电子数码管有一定的局限性,在数据显示方面不能达到足够的精度。在称重过程中,若数码管的位数较低,不能达到要求,则测量的物体重量在精度方面不够准确,从而需要很多的数码管集成到电路中去。这样也要求系统的输入输出端口时增加更多的I/O接口,才能满足数码管的需求,相对较繁琐。

方案二:

我们所用的单片机其实就是一个具有集成电路的微型计算机芯片,它用集成电路的方法将处理器、I/O端口、RAM和ROM和许多种存储器合并到一个硅片上。并且单片机的作用比较全,原理简易、操作便捷、控制电路速率快、可靠性高、芯片处理机制快、效率高、成本相对较低、使用比较灵活等优势。并且采用LCD液晶显示器能够很大程度上节省I/O接口的运使用,可以现实的位比较多,足够使用,同时测量精度也达到需求,符合本次设计。

2.4对设计方案进行对比分析

针对这次毕业设计,我想设计出一个智能电子秤控制系统的相关实物。方案二可靠性强,容易编程,运行较快,成本相对较低,结构简单,可靠性高,处理性能强,并且单片机的功能不断升级,在使用时只要考虑周到,也能很好的满足要求。另一方面,方案一在前端信号处理不足,而方案二在前端信号处理时,增加了数模转换方案,能够有效地处理信号,常符合设计要求。

经过我和老师的考虑,最后我们选择了用方案二作为该系统的控制器。在制作中,本人使用的是一款AT89C51系列芯片,后面会讲解详细的的芯片种类和相关介绍。

第三章系统硬件部分设计

3.1总体设计

在本次设计过程中,本人打算在选择系统控制模块时使用AT89C51系列的单片机,通过自己和老师的努力,完成智能电子秤控制系统,用自己的程序实现对它的智能控制。该设计以AT89C51嵌入式开发系统为控制大脑,主要作用是进行实时数据分析,并且控制电子秤装置;单片机和它所连接的设备是由电源模块供电的,同时也使用了时钟电路,它用来控制系统的时序,保证各电路同步工作;众所周知复位电路用来复位单片机或系统中部件处于某种初始状态;压力传感器便是用在秤盘上,采集压力,输出模拟信号。

智能电子秤系统是由嵌入式开发最小系统、数据处理电路、数据采集电路、超限报警电路、数据显示电路等构成,智能电子秤控制系统硬件电路原理图见附录1所示。

3.2主控制器设计

本次智能电子秤控制系统的设计中所用到的控制芯片是AT89C51嵌入式开发系统,AT89C51的最小系统组成该系统的主控制模块,该最小系统有3部分基本电路组成,其中有AT89C51嵌入式开发系统的微处理器、时钟电路模块、复位电路模块等。它是控制系统中最为基础的控制模块,所有基于单片机的控制系统都需要它。

3.2.1芯片介绍

这次毕业设计中所用到的AT89C51嵌入式开发系统是一种性能高、成本低、电压低、利用价值高的开发系统,而且功能方面也很丰富。这种嵌入式开发系统起始于51系列单片机,随后单片机技术的发展,最后形成了较为先进的AT89C51系列单片机。AT89C51具有很多优势的地方:性能较高;运行速度较快;集成度较高,一块芯片能当几块芯片使用;功耗较低,能够使用很长时间;相比其他同种系列单片机成本较低、外部设备足够使用,不用在电路中安装其他的外部设备;它很好开发利用,因为有自己的专用数据库等。而且我们做的很多产品都是在51的基础上完成,对51系列的单片机相对来说较为熟悉。上述所说的AT89C51嵌入式开发系统各种优点足能够实现对智能电子秤的控制。

在本次设计中用到的嵌入式开发系统主要由七大部分组成,分别是中央控制单元、定时器、计数器、程序代码存储单元、信号存储单元、串并行端口和断点控制单元等;总线主要包含三种,信号数据总线、控制信号总线、地址存储总线等,总线、接口和控制单元能够实现设计需求。

设计中用到的控制系统中央控制单元是嵌入式开发系统的核心控制大脑,满足对控制策略及算法的计算和控制功能。中央控制单元主要由两大部分组成,一个是运算器,另一个是控制电路,而且完全达到8位信号长度的中央控制单元,同时可以进行8位二进制信号的计算和程序运算,中央控制单元完全控制、协调和调度整个控制系统得完美运行,最终通过计算和控制系统的输入输出功能等操作。

嵌入式最小开发系统的接口定义和引脚介绍:89C51系列嵌入式开发系统的引脚主要使用40Pin封装结构的双列直接DIP,该单片机的引脚介绍见下图,一共拥有40个引脚,电源正和接地两路,外部配有石英振荡器的时钟接口两路,一共拥有32个I/O引脚,都是8位数据宽度的,中断接口和P3接口主要以复用为主。该单片机的引脚介绍如图3-1所示:

图3.1:方案二框图

控制引脚介绍:

(1)ALE:当控制系统扩展时,P0接口是8位信号接口和低8位地址先复用引脚,ALE主要将P0接口的低8位地址输出锁存,以实现低八位地址和数据的隔离。

(2)PSEN:主要对单片机内的ROM模块进行读取,前提是输入信号为低电平时,才会读取信号。

(3)EA:主要用于当输入信号为低电平时,限制对ROM模块的读取外设的代码存储器;当输入信号为高电平时,限制对ROM模块的读取单片机内部的代码存储器,而且能够延伸到外设的代码存储器。

(4)RST:当输入的复位信号延续两个机器周期以上的高电平时即为有效,主要用来实现嵌入式开发系统的初始化。

(5)XTAL1和XTAL2:主要用于将晶振电路接入系统中。

控制系统中并行的I/O接口是重要部分,P0接口的[P0.0-P0.7]是一种八位的双向I/O接口,当接口输入置为1时,当做高阻抗接口实用。用来控制8个TTL输出。P1端口[P1.0-P1.7]P1是一个带有内部上拉电阻的8位双向I/0端口。输出时可驱动4个TTL。而且接口置为1时,电路输入端上拉电阻将输出为高电平。当单片机内部的Flash代码存储器编译时,接收低8位地址信息。P2接口的[P2.0-P2.7]是一种带有上拉电阻的八位的双向I/O接口,输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash程序存储器编程时,接收高8位地址和控制信息。在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。P3端口[P3.0-P3.7]是一个带有内部上拉电阻的8位双向I/0端口。输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。除此之外P3端口还用于一些专门功能,如表3-1所示:

表3-1P3引脚的第二功能说明

3.2.2时钟电路设计

嵌入式开发系统是相对繁琐的同时序控制电路,同时满足电路的同步工作,控制系统必须在同一个时钟电路信号下进行有序的控制下按时序进行执行。时钟电路主要在嵌入式开发系统工作时生成需要的时钟信号。同时时钟能够由内部或者外部任意一方产生。89C51系列嵌入式开发系统内部形式的时钟电路,是在XTAL1和XTAL2两个引脚接口接一个定时器件,这也就组成了自激振荡控制电路。定时器件一般使用石英晶体和电容构成的并联谐振电路。电路中的电容器C1和C2主要起频率微调作用,电容值一般使用30pF或者40pF的。89C51嵌入式开发系统外部方式的时钟电路是XTAL1接外部振荡器,XTAL2悬空。而外部的振荡电路输出信号并无要求,目前能够满足脉冲宽度,主要使用方波信号,频率要尽量低于12MHz。在此次设计中所使用的内部时钟电路是石英晶体的,具体如图3-2所示。

图3.2:方案二框图

3.2.3复位电路设计

复位是使单片机或系统中的其他部件处于某种确定的初始状态。单片机的工作就是从复位开始的,当在单片机的RST引脚引入高电平并保持2个机器周期时,单片机内部就执复位操作。实际应用中,复位操作有两种基本的形式:一种是上电复位,另一种是按键复位。由于本次设计采用的是上电复位,这里只介绍上电复位,如图3-3所示。

图3.3:方案二框图

上电复位上电瞬间,电容充电电流最大,电容相当于短路,RST端为高电平,自动复位;电容俩端的电压达到电源电压时,电容充电电流为零,电容相当于开路,RST端为低电平,程序正常运行。RST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。该电路典型的电阻和电容参数为:晶振为12MHz时,C1为10uF,R1为8.2kΩ,晶振为6MHz时,C1为22uF,R1为1kΩ。

3.3信号采集模块

当被测对象放置在电子秤上,重量迫使出啊干起发生形变,也使得其内部的阻值时刻改变,激励电压也会随之改变,最终输出给数模转换电路一个变化的模拟值数据,最终将该信号传送给嵌入式开发系统进行相关逻辑处理。

MPX系列为压阻传感器是国家的最先进的单片硅压力传感器设计用于广泛的应用范围,特别是那些采用微控制器或微处理器与A/D输入。这种传感器结合先进的微机械加工技术,薄膜金属化和两极处理,以提供成比例的一个准确的,高层次的模拟输出信号所施加的压力。小型化和片上集成的高可靠性是工程师最合适的打算。

MPX系列为压阻传感器提供差分和仪表应用;最大误差为1.4%;温度补偿在-40°到+°C;是优惠减少重量和体积比现有混合动力模块;有耐用的环氧Unibody的元素、专利的硅剪应力应变计。其管脚说明如表2-2所示:

表3-2P3引脚的第二功能说明

如图3-4所示,该设计中将压阻传感器的前两个引脚连接到ADC芯片的CH0与CH1引脚,主要来采集电路中的模拟信号,4、5引脚连接到电路中数字端的地端,3引脚连接电源+5V电。当我们在控制过程中改变传感器输入的模拟电压值时,它相应的传送给嵌入式开发系统的数字量信号也会发生改变,最终在LCD显示器中显示出来给用户观看。

图3.4:信号采集电路

3.4数据转换模块

信号采集转换电路在整个系统中的作用是至关重要的,主要把输入端的模拟电压信号转换成单片机能够识别处理的数字信号,然后传输给单片机系统进行相关操作。

3.4.1A/D转换器的选择

根据系统的精度要求以及综合的分析其优点和缺点,本设计采用了12位A/D转换器ADC。ADC为8位分辨率A/D转换芯片,其最高分辨可达级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。

3.4.2ADC的介绍

ADC为8位分辨率A/D转换芯片,其最高分辩可达级,可以适应一般的模拟量转换要求。芯片转换时间仅为32US,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。

其独立的芯片使能输入,使处理器控制更加方便。通过DI数据输入端,可轻易实现通道功能的选择。其引脚功能如表3-3所示:

表3-3P3ADC引脚功能

3.4.3单片机对ADC的控制原理的介绍

正常情况下ADC与单片机的接口应为4条数据线,分别是CS、CLK/DO/DI,但由于DO端DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时我们将DO和DI并联在一根数据线上使用。

当ADC未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能。其通道控制表3-4所示:

表3-4P3ADC引脚功能

到第3个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATA0。随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。其接口电路如图3-5所示/p>

图3.5:ADC的接口电路

3.5声光报警电路

智能仪器一般都有报警功能,报警主要用于系统运行出错、当测量的数据超过仪表量程或者是超过用户设置的上下限时为提醒用户而设置。本系统中,设置报警的目的是在超出电子秤测量范围不能正常显示时,发出声光报警信号,提示用户,防止损坏仪器。

声光报警电路是由单片机的I/O口来控制的,当称重物体重量超过系统设计所允许的重量,通过程序使单片机的I/O值为低电平,则发光二极管导通,二极管发光,蜂鸣器LS1发出报警声。声光报警电路如图3-6所示:

图3.6:声光报警电路

3.6显示电路

显示电路的作用是显示被称物体的重量。通过第一章方案论证讨论得出本设计采用LML液晶显示,其优点是显示位数更多,精度也更高。其接口电路如图3-7所示:

图3.7ML液晶接口电路

LML模块采用HD控制器,hd具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LML与单片机MCU通讯可采用8位或4位并行传输两种方式,hd控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC)。其引脚功能表如所示表3-5所示:

表3-4P3ADC引脚功能

3.7整机电路

电子秤系统原理是:当物体放在秤盘上,压力施给传感器产生传感器内部平行四边形形变,由这4片应变片接成的惠斯通(Wheatstone)电桥在供桥电压的激励下随重量不同而输出不同的电压信号后送给A/D转换电路,转换成便于处理的数字信号输出至单片机;单片机进行处理、运算后将结果送至显示器进行显示。整机电路图详见附录1。

第四章系统硬件部分设计

本次设计软件系统采用模块化设计方法,不仅易于编程和调试,也可减小软件故障率和提高软件的可靠性。本设计主要包括主程序模块、LCD显示模块、超量程报警模块、AD转换模块等。

4.1主程序流程图

当单片机上电复位后,系统电路开始运行程序,首先利用压力传感器检测所称物体重量,之后启动AD转换,将转换完成的数字信号送入单片机进行处理,之后判断其值是否达到设定值,若达到设定值,则使P3.0为0,从而启动报警,同时显示重量;若小于设定值,则使P3.0为1,并显示重量。其流程图如图4-1所示:

Y

图4.1:主程序设计流程图

4.2主程序流程图

A/D转换子程序主要是指在系统开始运行时,把称重传感器传递过来的模拟信号转换成单片机易于处理的数字信号,并将数字信号传递到单片机,便于单片机进行处理的程序设计。

当主程序调用AD转换子程序时,AD转换便开始初始化,等待初始化完成后,MCU便通过拉低CS、拉高CLK来启动ADC进行外部压力传感转换后的电压信号进行采样,每产生8个CLK脉冲,DATA就获得一位完整的8bit数据,所以我们需要判断DATA右移8位是否完成,若未完成则继续转换,若完成,则拉高CS、拉低CLK,返回数据DATA,将数据存储并送入单片机。其流程图如图4-2所示:

N

图4.2:AD转换子程序设计流程图

4.3报警程序设计

报警子程序主要是指在称重过程中,为了防止所称物过重导致仪器损坏设置的超量程报警电路,一但所称物体超过设定量程,则启动报警,否则不启动。

当单片机接收到采集的重量值后,立即与程序所设量程值进行比较,若采样值大于设定量程,则启动报警,也就是将P3.0置为0,从而使发光二极管点亮,蜂鸣器发声;若采样值小于设定量程,则关闭报警或者不报警,也就是将P3.0置为1,从而使发光二极管灭,蜂鸣器停止发声。其流程图如图4-3所示。

N

图4.3:报警子程序设计流程图

4.4报警程序设计

显示子程序主要是来判断是否需要显示,以及如何去显示,也是十分重要的程序之一。通过其他主程序会调用显示子程序,所以,该程序在计开发过程中是很重要的,因此编写过程中一定要细心。

本次设计采用的LCD显示器是ML液晶显示屏,ML液晶能够显示比较复杂的汉字和图形对它的操作主要将一些固定的字符写入寄存器中,当需要显示时调用即可,以达到在液晶屏上显示的效果。

显示子程序包括显示液晶显示初始化、字符定位函数、输出字符函数、显示函数、转换函数、写数据函数、写命令函数等组成。当主程序调用液晶显示函数时,首先调用延时子程序,然后LCD开始初始化,等待初始化完成后便对其写入控制操作字,包括图形的显示方式,字体的模式等,然后,写入数据,再在其内部输出字符函数。最后将字符显示出来,也就是显示出所称物体的重量,之后调用延时显示重量。最后其流程图如图4-4所示:

图4.4:显示子程序流程图

第五章系统软件设计部分

5.1软件研发的背景

本人这次设计的智能电子秤控制系统用软件程序来控制控制器从而达到自己的设计目的,并且在所做的实物模型上运行编写的程序来实现的。本次设计所用到的软件程序集成开发环境是由Keil软件公司发布的KeiluVision4的KeilMDK-ARM版,简称MDK4。MDK4是与ARM公司合作研发的集成开发软件,其中包括编辑器、编译器和调试跟踪器等,与ARM相关器件和ARM-Cortex内核处理器是十分匹配的。本人做好实物后,先进行检测硬件模块,然后依据自己的要求和目的编写自己的程序。把程序编写好后进行相关测试生成文件,然后下载到实物模型中进行测试。

Keil软件在当前嵌入式软件开发过程中很普遍,它是集成代码测试环境,可提供软件在线模拟,提供整个项目实时观察窗口,目前的数据类型基本都可实现,功能十分强大。左侧的树状结构目录,很方便用户观察。该软件支持ASM(汇编)、C语言,并且可以将多种语言或多种模块源程序进行混合,在Keil中进行调试,支持在线实时修改、编译、调试源程序,对一些错误指令进行精准定位,功能很强大,目前主要用在对代码的调试和编辑。Keil软件调试情况如图5-1所示:

图5.1:keil软件调试图

5.2软件程序设计

在本次设计开发中,本人所调用的函数都是固件库中已经编写好的,相应的就能设置AT89C51嵌入式开发系统中的相对应的外部设备和相应的管脚了。在MDK4的开发环境中添加相应的固件库,以便于我们快捷的使用这些固件函数。

在明确自己这次毕业设计需要用到的方案和需要完成的功能之后,就要依据自己所要达到的详细功能来设计软件程序,然后经过软件程序对硬件电路的控制来完成智能电子秤控制系统设计。本次设计本人需要对压力传感器等进行数据信息的收集和处理,并且完成对电子称的智能控制,本次所需要的软件函数程序包含很多,其中主要有主程序、ADC数据收集与程序转换、GPIO端口初始化程序和延时程序等。完成相关数据收集和电子秤控制和AT89C51嵌入式开发系统的GPIO管脚进行设置,在本次设计中所用到的主要GPIO引脚设置以及它的功能介绍如表5-1所。

表5-1GPIO引脚设置及功能

本人明确了自己所使用的的引脚,学习使用的相关函数程序,然后进行相关程序编写和设计。设计软件程序主要分为4个步骤:第一步就是要明确自己软件设计的目的和详细的实现功能;第二步是挑选适合的软件开发环境,然后依据自己实际所需要的嵌入式开发系统型号进行相应的设置,本次设计用到的软件开发环境是MDK4;第三步就开始编写自己的程序来完成详细的控制功能;第四步把编写好的程序先进性编译,然后下载到实物模型中并进行相关调试。

我们的程序设计在初始化结束后,会把把各传感器收集到的数据进行分析和处理,看是否达到规定要求,然后控制各种被控对象。我们在这就不表述详细的程序源代码了。

5.3基于Proteus电路图绘制

用Proteus绘制电路仿真图主要分为以下步骤:

(1)根据设计原理查找此次设计所需要的电路元器件,并根据需求罗列出电器元器件清单;

(2)根据设计要求和工作原理绘制电路图;

(3)将写完的程序下载下来;

(4)将下载的C程序进行仿真。

通过以上操作,达到对智能电子秤的仿真测试。

状态一:如图5-2所示,该控制电路属于正常工作状态,电阻式称重传感器的测量值小于.8,由于没有超出限制蜂鸣器不报警,同时发光二极管处于灭的状态,LCD液晶显示屏显示出测量数据,精度0.5g。

图5.2:电路仿真调试图

状态二:如图5-2所示,该控制电路属于正常工作状态,电阻式称重传感器的测量值大于.8,由于超出限制蜂鸣器报警,同时发光二极管处于亮的状态,LCD液晶显示屏显示出测量数据,精度0.5g。

图5.3:电路仿真调试图

第六章结束语

近年来随着科技的进步,各行各业都向智能控制方向发展,人们越来越离不开智能电子秤,制作智能电子秤控制系统成为这个时代的发展方向。目前市场上的主控制器还比较先进,功能很丰富,各种传感器收集数据的能力很强,实现电子秤智能控制系统是完全可行的。

本设计中我们以AT89C51单片机系统为控制核心,连接相关的传感器和数模转换器和显示器等,成功制作一个简易的智能电子秤控制系统。这次毕业设计不是那么复杂,因此我们使用Proteus软件制作详细的电路图和PCB板图,并且从网上查找了相关元器件的控制原理和设计要求。该智能控制系统主要包含:AT89C51嵌入式开发系统的最小系统、供电模块、各种传感器和报警器等。然后将编译好的程序下载到单片机中,进而达到智能电子秤控制系统设计。

同时由于自身的能力有限和各种现实因素的不允许,在这次毕业设计制作中,有很多缺点和粗心的地方,方方面面不能够完全的考虑,和现实中的还是没法比的,但是本人的设计思路是十分清楚的,总的来说与智能电子秤控制系统的设计方案基本一致。如今很多电子秤已经达到了对自身的自动控制,但仍然有一些电子秤由于各种因素还不能达到对自身的自动控制,未来还需要很长的路需要我们去发掘,去实现。

同时,通过本次毕业设计,本人学到了很多书本以外的知识,只有在实际动手操作过程中才会发现,这也磨练了我遇到问题独立思考的习惯,最后自己通过设计结果拥有了自信,这对我以后的学习和工作又会有很大的启发会帮助。虽然毕业设计仍然有不足的地方,但在设计制作过程中所学习到的知识和经验,使我终身受益。

参考文献

[1]谢兴红,林凡强,吴雄英.MSP单片机基础与实践[M].北京航空航天大学出版社,:84-85.

[2]靳达.单片机应用系统开发实例导航[M].北京:人民邮电出版社,:-.

[3]沈建华.MSP系列16位超低功耗单片机原理与实践[M].北京航空航天大学出版社,:-.

[4]余妍熹,吴颖.分析电子秤自动检定装置机械结构设计[J].科学与财富,(5):.

[5]张天宇..计量检定电子秤的误差及改进措施[J].科学与财富,(14):69.

[6]童菲.电子秤检定中存在的问题及应对的措施[J].科技风,(12):+.

[7]葛笑寒.基于单片机的电子秤硬件系统设计[J].湖南农机,(2):-+.

[8]*晟.动态电子秤误差及改进研究[J].黑龙江冶金,,39(2):74-75.

[9]江天亮.基于单片机和传感器的电子秤系统教学设计与实现[J].电子测试,(10):8-9+15.

[10]王佳.多功能电子秤设计[J].电子质量,(4):24-29.

[11]徐燕燕,*磊,戴姣丽.基于单片机的商用电子秤设计与仿真[J].电电子制作,(11):75-76+30.

[12]张波,王晨阳,徐传旭等.基于STC89C52和HX的电子秤设计[J].现代信息科技,,3(8):42-43+46.

致谢

经过这几个月的努力设计,这次的毕业论文终于完成了,在这圆满完成之际,我首先要向我的指导老师表示最真挚的谢意,感谢您这几个月来的精心辅导和陪伴。

在论文写作期间,老师给予了本人细心的讲解和热情帮助,并且进行了详细认真的审阅。在我撰写论文的过程中,从选题报告到最终的论文定稿,教授给本人提出了许多珍贵的意见和建议,并且在学校实验室为本人提供了很好的学习环境和条件,在这里再次向他表示衷心的感谢;与此同时,还要十分感谢我的所有同学和组员,在论文的编写期间,每当本人遇到任何技术上或经验上的困难时,他们都会及时的帮助和指导我。正是因为在老师和同学们的精心帮助和热心鼓励下,我才能够顺利的完成这次论文的设计工作。

在论文的编写过程中,本人参考学习了许多作者编写的国内外著作、期刊杂志和自己所学的相关书籍,在这里我想对他们说一声谢谢。因为本人学识资源的限制,再加上设计时间较短,论文中可能会有一些错误的地方和需要改善的地方,热情的希望各位老师、学长给与本人珍贵的建议。

附录

附录1整机电路图

附录2程序清单

#includereg51.h

#includeintrins.h

#includeabsacc.h

#includemath.h

#defineucharunsignedchar

#defineuintunsignedint

#defineBUSY0x80//常量定义

#defineDATAPORTP0

sbitADCS=P3^5;

sbitADDI=P3^7;

sbitADDO=P3^7;

sbitADCLK=P3^6;

sbitLCM_RS=P2^0;

sbitLCM_RW=P2^1;

sbitLCM_EN=P2^2;

uintx1,y1,z1=0,w1,temp1;

ucharad_data,k,n,m,e,num,s;//采样值存储

sbitbeep=P3^0;

charpress_data;//标度变换存储单元

unsignedcharad_alarm;//报警值存储单元

unsignedcharpress_ge=0;

unsignedcharpress_shifen=0;

unsignedcharpress_baifen=0;

unsignedcharpress_qianfen=0;

ucharcodestr0[]={"Weight:Kg"};

voiddelay(uint);

voidlcd_wait(void);

voiddelay_LCM(uint);//LCD延时子程序

voidinit_LCM(void);//LCD初始化子程序

voidlcd_wait(void);//LCD检测忙子程序

voidWriteCommandLCM(ucharWCLCM,ucharBusyC);//写指令到ICM子函数

voidWriteDataLCM(ucharWDLCM);//写数据到LCM子函数

voidDisplayOneChar(ucharX,ucharY,ucharDData);//显示指定坐标的一个字符子函数

voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//显示指定坐标的一串字符子函数

voidweishu(uintm);

voidweishu1(uintm);

voiddisplay(void);

ucharAdc(unsignedcharchannel);

voidalarm(void);

voiddata_pro(void);

/**********mainfuncation************/

voidmain(void)

{

delay();//ad_data=0;

initLCM();

WriteCommandLCM(0x01,1);

DisplayListChar(0,0,str0);

while(1)

{

ad_data=Adc(0);//采样值存储单元初始化为0

alarm();

data_pro();

display();

DisplayListChar(0,0,str0);

}

/***延K*1ms,12.mhz**********/

voiddelay(uintk)

{

uinti,j;

for(i=0;ik;i++);

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

}

/******写指令到ICM子函数*****/

voidWriteCommandLCM(ucharWCLCM,ucharBusyC)

{

if(BusyC);

lcd_wait();

DATAPORT=WCLCM;

LCM_RS=0;//选中指令寄存器

LCM_RW=0;

LCM_RW=0;//写模式

LCM_EN=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

LCM_EN=0;

}

/*****写数据到LCM子函数******/

voidWriteDataLCM(ucharWDLCM)

{

lcd_wait();

DATAPORT=WDLCM;

LCM_RS=1;

LCM_RW=0;

LCM_EN=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

LCM_EN=0;

}

/*****LCM内部等待函数********/

voidlcd_wait(void)

{

DATAPORT=0xff;

LCM_EN=1;

LCM_RS=0;

LCM_RW=0;LCM_RW=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();while(DATAPORTBUSY)

{

LCM_EN=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

LCM_EN=1;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

LCM_EN=0;

}

/*****LCM初始化子函数*********/

voidinitLCM()

{

LCM_EN=0;

DATAPORT=0;

delay(15);

WriteCommandLCM(0x38,0);

delay(5);

WriteCommandLCM(0x38,0);

delay(5);

WriteCommandLCM(0x38,0);

delay(5);

WriteCommandLCM(0x38,1);

WriteCommandLCM(0x08,1);

WriteCommandLCM(0x01,1);

WriteCommandLCM(0x06,1);

WriteCommandLCM(0x0c,1);

TMOD=0x11;

EA=1;

ET1=1;

TR1=1;

k=0;

x1=0;

y1=0;

z1=0;

}

/****显示指定坐标的一个字符子函数****/

voidDisplayOneChar(ucharX,ucharY,ucharDData)

{

Y=0x01;

X=0x0f;

if(Y)

X

=0x40;//若y为1(显示第二行),地址码+0X40

X

=0x80;//指令码为地址码+0X80

WriteCommandLCM(X,1);

WriteDataLCM(DData);

}

/*******显示指定坐标的一串字符子函数*****/

voidDisplayListChar(ucharX,ucharY,ucharcode*DData)

{

ucharListLength=0;

Y=0x01;

X=0x0f;

while(X16)

{

DisplayOneChar(X,Y,DData[ListLength]);

ListLength++;X++;

}

}

/*****************系统显示子函数*****************/

voiddisplay(void)

{

WriteCommandLCM(0x0c,1);

DisplayListChar(0,0,str0);//DisplayListChar(0,1,str2);

DisplayOneChar(8,0,press_ge+0x30);

DisplayOneChar(10,0,press_shifen+0x30);

DisplayOneChar(11,0,press_baifen+0x30);

DisplayOneChar(12,0,press_qianfen+0x30);

delay(1);

}

/************读ADC函数************/

//采集并返回

ucharAdc(unsignedcharchannel)//AD转换,返回结果

{

uchari=0;

ucharj;

uintdat=0;

ucharndat=0;

if(channel==0)channel=2;

if(channel==1)channel=3;

ADDI=1;

_nop_();

_nop_();

ADCS=0;//拉低CS端

_nop_();

_nop_();

ADCLK=1;//拉高CLK端脉冲

_nop_();

_nop_();

ADCLK=0;//拉低CLK端,形成下降沿1

_nop_();

_nop_();

ADCLK=1;

ADDI=channel0x1;

_nop_();

_nop_();

ADCLK=0;//拉低CLK端,形成下降沿2

_nop_();

_nop_();

ADCLK=1;//拉高CLK端

ADDI=(channel1)0x1;

_nop_();

_nop_();

ADCLK=0;//拉低CLK端,形成下降沿3

ADDI=1;//控制命令结束

_nop_();

_nop_();

dat=0;

for(i=0;i8;i++)

{

dat

=ADDO;//收数据

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;//形成一次时钟脉冲

_nop_();

_nop_();

dat=1;

if(i==7)dat

=ADDO;

}

for(i=0;i8;i++)

{

j=0;

j=j

ADDO;//收数据

ADCLK=1;

_nop_();

_nop_();

ADCLK=0;//形成一次时钟脉冲

_nop_();

_nop_();

j=j7;

ndat=ndat

j;

if(i7)ndat=1;

}

ADCS=1;//拉低CS端

ADCLK=0;//拉低CLK端

ADDO=1;//拉高数据端,回到初始状态

dat=8;

dat

=ndat;

return(dat);//returnadk

}

voiddata_pro(void)

{

unsignedint;

floatpress;

if(0ad_data)

{

intvary=ad_data;

press=(0.*vary);

temp1=(int)(press*1);//放大1倍,便于后面的计算

press_ge=temp1/1;//取压力值百位

press_shifen=(temp1%1)/;//取压力值十位

press_baifen=((temp1%1)%)/10;//取压力值个位

press_qianfen=((temp1%1)%)%10;//取压力值十分位

}

}

/*****************报警子函数*******************/

voidalarm(void)

{

if(ad_data=)

beep=0;//则启动报警

else

beep=1;

}

附录3元器件清单

分享 转发
TOP
发新话题 回复该主题