基于单片机的智能电子秤设计

基于单片机的智能电子秤设计

目录

1 绪论

1.1 选题的背景和意义 ................................................................................................... 1

1.2 研究现状 ................................................................................................................... 1

1.3 论文主要研究内容 ................................................................................................... 1

2 总体方案设计 ...................................................................................................................... 2

2.1 电子秤整体方案 ....................................................................................................... 2

2.2 主控制器的方案 ....................................................................................................... 2

2.3 称重传感器的方案 ................................................................................................... 3

2.4 放大器的方案 ........................................................................................................... 5

2.5 模数转换器的方案 ................................................................................................... 6

2.6 键盘部分的方案 ....................................................................................................... 7

2.7 显示部分的方案 ....................................................................................................... 8

2.8 过载报警部分的方案 ............................................................................................... 8

3 电子秤的硬件设计 .............................................................................................................. 8

3.1 系统设计的总体思路 ............................................................................................... 8

3.2 单片机AT89S51最小系统 ...................................................................................... 8

3.3 放大电路 ................................................................................................................... 9

3.4 模数转换器与单片机接口电路 ............................................................................. 10

3.5 显示电路与单片机接口电路 ................................................................................. 11

3.6 键盘电路与单片机接口电路 ................................................................................. 12

3.7 报警电路 ................................................................................................................. 13

3.8 电源电路 ................................................................................................................. 13

4 电子秤系统的软件设计 .................................................................................................... 15

4.1 主程序的设计 ......................................................................................................... 15

4.2 子程序的设计 ......................................................................................................... 16

4.2.1 模数转换子程序的设计 .............................................................................. 16

4.2.2 键盘扫描子程序的设计 .............................................................................. 17

4.2.3 显示子程序的设计 ...................................................................................... 18

4.2.4 价格计算子程序的设计 .............................................................................. 29

4.2.5 报警子程序的设计 ...................................................................................... 20

5 系统调试 ............................................................................................................................ 22

5.1 软件调试 ................................................................................................................. 22

5.2 硬件调试 ................................................................................................................. 23

结论 ........................................................................................................................................ 24

致谢 ........................................................................................................................................ 25

参考文献 ................................................................................................................................ 26

附录A .............................................................................................................................. 27

附录B .............................................................................................................................. 28

附录C .............................................................................................................................. 29

1 绪论

1.1 选题的背景和意义

电子秤是日常生活中常用的称重器材,广泛应用于超市、大中型商场、物流配送中心。电子秤在结构和原理上取代了以杠杆平衡为原理的传统机械式称量工具。相比传统的机械式称量工具,电子秤具有称量精度高、装机体积小、应用范围广、易于操作使用等优点,在外形布局、工作原理、结构和材料上都是全新的计量衡器。电子秤的设计首先是通过压力传感器采集到被测物体的重量并将其转换成电压信号。经放大后的模拟电压信号经A/D转换电路转换成数字量被送入到主控微处理器中,再经过单片机控制译码显示器,从而显示出被测物体的重量。

1.2 研究现状

电子秤不仅要向高精度、高可靠方向发展,而且更需向多种功能的方向发展。据悉,目前电子秤的附加功能主要有以下几种:1.电子秤附加了处理机构计算机信息补偿装置,可以进行自诊断、自校正和多种补偿计算和处理。2.具有皮重、净重显示等特种功能。电子秤有些已具备了动物称量模式,即通过进行算术平均、积分处理和自动调零等方法,消除上述的误差。3.附加特殊的数据处理功能。目前的电子秤有附加多种计算和数据处理功能,以满足多种使用的要求。今后,随着电子高科技的飞速发展,电子秤技术的发展定将日新月异。同时,功能更加齐全的高精度、高智能的先进电子秤将会不断问世,其应用范围也会更加拓宽。

1.3 论文主要研究内容

本文主要是设计的内容是简易电子秤,它用单片机作为处理核心,信号由压力传感器感受后经放大器放大和模数转换后输入到单片机处理,同时该电子秤具有LCD显示和键盘输入。

该电子秤具体实现的功能是能够测量一定质量内物体的质量,能够利用键盘输入价格,具有清零,可以计算总价,并能通过LCD直接显示出来,超过所测重量时能够报警。

2 总体方案设计

2 电子秤整体方案

电子秤设计的整体方案是:传感器采集到因压力变化产生的电信号,但是一般这样产生的电信号很小,需要利用放大电路将其放大,放大的电信号通过模数转换器转换为数字信号后送入到微处理器中处理,微处理器处理后输出信号控制显示器显示出来。同时还需要键盘对物品单价等信息输到微处理器内部,还需要有过载报警装置。

其整体设计方案如图2-1所示:

图2-1 电子秤整体设计方案图

2.2 主控制器的方案

主控制器是电子秤的核心部分,它需要接受转换后的传感器信号,同时也能扫描接受到键盘的输入信号,计算价格后控制显示器的输出,当超过称重量量程时还要控制报警装置报警。主控制器的选择有两个如下两个方案。

方案一:单片机作为主控制器

单片机控作为主控制器其优点有:可以做成专用的控制系统,程序被固化,可靠性较高,操作简单,易于维护,并且成本低。在比较小型的控制系统中,最适合的应是单片机作为控制核心。但在大型的控制系统中,控制系统各方面性能要求很高,或者工作环境很恶劣,有很强的电噪声、电磁干扰、机械振动、极端温度和湿度很大的环境中,如果利用单片机作为控制系统,其性能会受到相应的影响。

方案二:PLC作为主控制器

PLC作为主控制器应用广泛,它具有接线简单,通用性好,编程简单,使用方便,可连接为控制网络系统,易于安装,便于维护,其主要应用在准确、精密、快速、稳定和多点控制的系统中,但是其价格昂贵。

本文设计的简易电子秤精度不需要很高,它需要控制器及程序被固化,并且工作环境适宜。单片机作为处理器完全能够满足要求,并且单片机价格低廉,体积小,最终我选择了市面上常见的51系列的单片机AT89S51作为主控制器。

2.3 称重传感器的方案

称重传感器按转换方法分为光电式、液压式、电磁力式、电容式、磁极变形式、振动式、陀螺仪式、电阻应变式等8类,我选择应用最广泛的电阻应变式传感器。

电阻应变式称重传感器是利用电阻应变片变形时其电阻也随之改变的原理工作的,根据传感器理论可知,设长为L、截面积为S、电阻率为ρ的电阻丝,已知其阻值为:

RL(2-1) S

当电阻丝两端有机械应力F时,ρ、L、S都会发生变化,从而导致电阻发生变化。 这种应变片式传感器是基于材料的电阻应变效应,电阻应变片即可单独作为传感器使用,又能作为敏感元件结合弹性元件构成力学量传感器。电阻应变片把机械应变信号转换为△R/R后,由于应变量及相应电阻变化一般都很微小,难以直接精确测量,且不便处理。因此,要采用转换电路把应变片的△R/R变化转换成电压或电流变化。其转换电路常用测量电桥[4]。如图2-2所示为常见的直流供电的平衡差动测量电桥:

Eout

图2-2 直流供电的平衡差动测量电桥

图中,为供桥电源电压,当初始有时,则电桥输出电压或电流为零,这时电桥处于平衡状态。其测量原理:用应变片测量时,将其粘贴在弹性体上。当弹性体受力变形时,应变片的敏感栅也随同变形,其电阻值发生相应变化,通过转换电路转换为电压或电流的变化。由于内部线路采用惠更斯电桥,当弹性体承受载荷产生变形时,输出信号电压可由下式给出:

EoutR2R4R1R2R3R4Ein(2-2) (R2R4)R1R2R3R4

本文的目的是设计一简易电子秤,最大称重约为2.5千克,重量误差不大于±0.01千克;考虑到与其相配置的各种电路的设计的难易程度和设计性价比,最终选择了CZAF-605[8]电阻应变式称重传感器,其称重规模为5kg。

2.4 放大器的方案

压力传感器感受重力转换后输出的信号一般电平较低;经由电桥等电路变换后的信号亦难以直接用来显示、记录、控制或进行模数转换。为此,测量电路中需要模拟放大环节。这一环节目前主要依靠由集成运算放大器的基本元件构成具有各种特性的放大器来完成。

所采用的传感器输出电压振幅范围0~10mV。而模数转换的输入电压要求为0~2V,因此放大环节至少200倍的增益,此处我们需要放大500倍。根据本设计的实际情况增列出了两种方案。

方案一:由高精度低漂移运算放大器构成差动放大器。

差动放大器具有高输入阻抗,增益高的特点,可以利用普通运放 ( 如 OP07) 做成一个差动放大器,其内部电路如图2-3所示。

图2-3 差动放大器内部电路

电阻 R1、R2电容C1、C2、C3、C4用于滤除前级的噪声,C1、C2为普通小电容,可以滤除高频干扰,C3、C4为大的电解电容,主要用于滤除低频噪声。

优点:输入级加入射随放大器,增大了输入阻抗,中间级为差动放大电路,滑动变阻器 R6 可以调节输出零点,最后一级可以用于微调放大倍数,使输出满足满量程要求。输出级为反向放大器,所以输出电阻不是很大,比较符合应用要求。

缺点:此电路要求 R3、R4相等,误差将会影响输出精度,难度较大。实际测量,每一级运放都会引入较大噪声,对精度影响较大。

方案二:采用专用仪表放大器[12],如:INA128,INA129等。

此类芯片内部采用差动输入,共模抑制比高,差模输入阻抗大,增益高,精度也非常好,且外部接口简单。

以INA128为例,引脚图如2-4所示:

图2-4 INA128引脚图

放大器增益G=1+50k/Rg,通过改变Rg的大小来改变放大器的增益。因为放大的倍数是500,所以大致选用100欧姆的电阻就可以了。

基于以上分析,采用专用仪表放大器能跟好的满足要求,我最终选择了INA128。

2.5 模数转换器的方案

称重传感器采集的压力信号是模拟量,单片机系统内部运算时用的都是数字量,即0和1,因此对于单片机而言我们无法直接操作模拟量,必须将模拟量转换为数字量。这就需要在单片机前段加上模数转换器,模数转换器就是将输入的模拟信号转换成数字信号。而模数转换器的数字信号提供给微处理器处理。

现在模数转换的基本方法有十几种,常用的有计数法、逐次比较法、双斜积分法和并行转换法。由于逐次比较法模数转换具有速度快、分辨率高等特点,而且采用这种方法的ADC芯片成本较低,所以我们选用逐次比较型模数转换集成芯片ADC0832,ADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道模数转换芯片,其输入输出电平与TTL/CMOS相兼容,电源供电时输入电压在0~5V之间,工作频率为250KHZ转换时间为32μS,一般功耗仅为15mW;由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。图2-5为AD0832双列直插式封装引脚图。

图2-5 ADC0832引脚图

2.6 键盘部分的方案

键盘部分有两个可行的方案,第一是采用3×4的矩阵键盘结构的键盘接口电路,第二是采用4×4的矩阵键盘结构的键盘接口电路。

由于电子秤需要设置单价(十个数字键),还具有确认、清零等功能,总共需设置13个键(包括一个复位键),其中复位可以单独拿出来。所以我们采用3×4的矩阵键盘结构的键盘接口电路。

3×4矩阵式键盘的特点是把检测线分成两组,一组为行线,一组列线,按键放在行线和列线的交叉点上。图2-6给出了一个3×4的矩阵键盘结构的键盘接口电路,图中的每一个按键都通过不同的行线和列线与主机相连这。3×4矩阵式键盘共可以安装12个键,但只需要7条测试线。

图2-6 3×4矩阵式键盘图

显示部分的方案:

数据显示是电子秤的一项重要功能,是人机交换的主要组成部分,它可以将测量电路测得的数据经过微处理器处理后直观的显示出来。数据显示部分可以有以下两种方案供选择:一是 LED数码管显示,二是LCD液晶。LED显示每一个数码管只能显示一个数字,电子秤系统需要许多数码管,会使线路变得复杂化。LCD液晶显示器是一种极

低功耗显示器,其能够多行显示,并且能够显示汉字或英文字母,应用于电子秤中能够更人性化,更容易操作。所以最终选择了两行显示的LCD1602,LCD1602的引脚图如2-7所示。

图2-7 液晶显示器LCD1602

2.8 过载报警部分的方案

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

超限报警电路是由单片机的I/O口来控制的,当称重物体重量超过系统设计所允许的重量时,通过程序使单片机的I/O值为高电平,从而三极管导通,使蜂鸣器SPEAKER发出报警声,同时使二极管发光。

3 电子秤的硬件设计

3.1 系统设计的总体思路

物体放在压力传感器上,传感器发生形变,阻抗就发生变化,产生一个变化的模拟信号,该信号需要有放大电路放大后输入到模数转换器,转换为数字信号后输入到微处理器处理。微处理器根据键盘命令以及程序将结果输出到显示器,直到显示结果。如下图所示3-1所示。

图3-1 硬件设计的总体思路

3.2 单片机AT89S51最小系统

AT89S51是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,128字节RAM,32个双向I/O 口线,两个16位定时器/计数器,5个中断源,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

AT89S51的P0口为一个8位漏级开路双向I/O口,P1、P2和P3口是一个内部提供上拉电阻的8位双向I/O口,同时P3口还作为AT89S51的一些特殊功能口[16]。

AT89S51是片内有ROM/EPROM的单片机,其最小系统简单、可靠,仅由时钟电路、复位电路、电源电路构成。如图3-2所示。

1、 时钟电路

AT89S51虽然有内部振荡电路,但要形成时钟,必须外部附加电路。AT89S51单片机的时钟产生方法有两种。内部时钟方式和外部时钟方式。

本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。振

荡晶体可在1.2MHZ到12MHZ之间选择。电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度有少许影响,可在20pF到100pF之间取值。所以本设计中,振荡晶体选择12MHZ,电容选择22pF[11]。

图3-2 AT89C52最小系统的设计

1、复位电路

AT89S51的复位电路是由外部的复位电路来实现的。只需给复位引脚RST加上大于2个机器周期的高电平就可使其复位。复位电路通常采用上电自动复位和按键复位两种方式。本设计就是用的按键手动复位。其中电平复位是通过RST端经电阻与电源Vcc接通而实现的。

2、电源电路

AT89S51的电源脚分别为20脚Vss和40脚Vcc(图中已默认连接,未显示出来)。这两个脚分别接地和+5V直流电源,31脚EA为内外存储器的控制端,接+5V允许访问外部存储器。

3.3 放大电路

传感器检测电路的功能是把电阻应变片的电阻变化转变为电压输出,本设计中选用的是CZAF-605电阻应变式称重传感器,因为通过其得到的电压信号很小,为所以还需要放大器放大信号。考虑到干扰的作用,对传感器的信号进行了滤波处理,最终设计如

图3-3所示。

图3-3 传感器与放大器的接口电路

INA128的2和3脚为信号输入端,4、5和7脚为电源引脚。微弱信号放大后从INA128的第6脚输出。通过调节Rg的阻值可以来改变放大倍数,使得输出电压在A/D转换的基准电压要求范围之内。

根据要求,A/D转换器的输入电压变化范围是0V~4.999V,传感器的输出电压信号在0~10mv,G4.999499.9500因此取放大器的放大倍数500。因此代入公式0.01

G150k50K,Rg100.2。 499Rg

3.4 模数转换器与单片机接口电路

ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择[21]。

正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI 并联在一根数据线上使用。当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI端则使用DI端输入

通道功能选择的数据信号。在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能[9]。

作为单通道模拟信号输入时ADC0832的输入电压是0~5V且8位分辨率时的电压精度为19.53mV。如果作为由IN+与IN-输入的输入时,可是将电压值设定在某一个较大范围之内,从而提高转换的宽度。但值得注意的是,在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。ADC0832与单片机的接口电路如图3-4所示。

图3-4 ADC0832与单片机的接口电路图

3.5 显示电路与单片机接口电路

本设计采用的是LCD1602显示,LCD1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5×7或者5×11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。1602LCD是指显示的内容为16×2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

1602采用标准的16脚接口,其中1和2脚为电源正负极,3脚为对比度调整端,4脚RS为寄存器选择,5脚RW为读写信号线,6脚为使能端,7到14脚为8为双向数据端。15和16脚为电源背光极。

LCD1602与单片机的连接如图3-5所示。

3脚VEE接一个滑动变阻器,滑动变阻器两端接电源和地。调试欢动变阻器的值可以改变LCD的对比度。因为LCD为共阳极,所以D0到D7有加入上拉电阻。

图3-5 单片机与LCD1602接线图

3.6 键盘电路与单片机接口电路

矩阵式键盘的结构与工作原理:在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成3×4=12个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成16键的键盘,而直接用端口线则只能多出一键。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵式键盘的按键识别方法:确定矩阵式键盘上何键被按下介绍一种“行扫描法”。行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的3个按键之中。若所有列线均为高电平,则键盘中无键按下。判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

在本系统中键盘采用矩阵式键盘并采用中断工作方式。键盘为3×4键盘,包括0、1、2、3、4、5、6、7、8、9、十个数字及确认和清除键。采用中断工作方式提高了CPU的利用效率,没键按下时没有中断请求,有键按下时,向CPU提出中断请求,CPU响应后执行中断服务程序,在中断程序中才对键盘进行扫描。下图就是键盘电路与

AT89S52单片机接口电路图。

图3-6 键盘电路与单片机的连接图

3.7 报警电路

当电路检测到称重的物体超过仪器的测量限制时,将产生一个信号给报警电路。使报警电路报警从而提醒工作人员注意,超限报警电路如下图所示。

图3-7 报警电路图

它是有AT89C52的RXD口来控制的,RXD本来为低电平,当超过设置的重量时(5Kg),通过程序使RXD口值为高电平,从而使三极管导通,报警电路接通,使蜂鸣器SPEAKER发出报警声,同时使报警灯LED发光。这一任务的实现主要靠程序来完成。

3.8 电源电路

一般电网电压为交流220V,而本文设计的电子秤系统需要的电压是直流5V,显然不能满足实际要求,所以需要设计一个直流稳压电源。

直流稳压电源一般由电源变压器、整流电路、滤波电路和稳压电路组成。基本框图如3-8所示。

交流5V

图3-8直流稳压电源框图

电源变压器T将220V的交流电源变换成整流滤波电路所需要的5V交流电压。5V交流电压通过整流电路变换成5V的脉动电压,滤波电路滤除较大的波纹成分,输出较小的波纹成分到稳压电路,稳压电路输出稳定的5V电压。

根据上述介绍,电源电路包括变压器、整流电路、滤波电路、稳压电路等模块组成,这里加入LED进行电源工作状态指示。稳压部分用LM7805三端稳压IC来组成稳压电源,其优点是所需的外围元件极少,电路内部还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜。具体的5V电源电路如图3-9所示。

图3-9 5V直流稳压电源图

4 电子秤系统的软件设计

程序设计是一件复杂的工作,为了把复杂的工作条理化,就要有相应的步骤和方法。其步骤可概括为以下三点:

首先需要分析系统控制要求,确定算法:对复杂的问题进行具体的分析,找出合理的计算方法及适当的数据结构,从而确定编写程序的步骤。这是能否编制出高质量程序的关键。

其次是根据算法画流程图:画程序框图可以把算法和解题步骤逐步具体化,以减少出错的可能性。

最后就是编写程序:根据程序框图所表示的算法和步骤,选用适当的指令排列起来,构成一个有机的整体,即程序。

程序数据的一种理想方法是结构化程序设计方法。结构化程序设计是对利用到的控制结构类程序做适当的限制,特别是限制转向语句(或指令)的使用,从而控制了程序的复杂性,力求程序的上、下文顺序与执行流程保持一致性,使程序易读易理解,减少逻辑错误和易于修改、调试。

根据系统的控制任务,监控软件采用模块技术设计,根据系统功能,将软件分为若干个功能相对独立的模块,为每一个模块设计程序流程图。该电子秤功能程序模块包括:A/D转换启动及数据读取程序设计、显示子程序设计、键盘扫描子的程序设计、价格计算子程序设计、以及报警子程序设计等。

4.1 主程序的设计

主程序是系统信息处理的关键,主程序模块主要完成编程芯片的初始化及按需要调用各模块(子程序),在系统初始化过程中,初始化程序将RAM的30H到5FH单元清零,RXD引脚置成低电平,防止误报警,同时将系统设置成2.5Kg量程,并写2.5Kg量程标志。设计流程图如图5-1所示。

主程序主要完成编程芯片的初始化及按需要调用各子程序,上电启动后,系统初始化,单片机读取模数转换器的数据,然后调用显示子程序显示重量,同时扫描键盘子程序,调用价格计算子程序计算价格并显示出来。

图4-1电子秤系统程序设计流程图

4.2子程序的设计

主程序按需要调用各子程序。系统子程序主要包括A/D转换启动及数据读取程序设计、显示子程序设计、键盘扫描子的程序设计、价格计算子程序设计、以及报警子程序设计等。

4.2.1 模数转换子程序的设计

A/D转换启动及数据读取子程序设计主要是上电运行后,ADC0832完成初始化,把经放大的称重传感器传递过来的模拟信号转换成数字信号并传递到单片机所涉及到的程序设计设计流程图如图4-2所示。

ADC0832进行模数转换时,须现将CS是能端置于低电平并且保存低电平直到完全结束。芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO和DI端则使用DI端输入通道功能选择的数据信号。在第1 个时钟脉冲的下沉之前DI

端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能,到第3 个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。从第11个字节的下沉输出DATA0。随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D转换的结束[23]。最后将CS置高电平禁用芯片。

图4-2 A/D转换启动及数据读取程序流程图

4.2.2 键盘扫描子程序的设计

键盘扫描子程序主要是扫描键盘的输入,调用显示子程序显示,输出输入的参数,计算总价是调用价格计算子程序计算总价格。

键盘电路设计成3×4矩阵式,由键盘编码方式可以得出1、2、3、4、5、6、7、8、9、0及清零和计价各键对应的键值:0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,

0x39,0x3d,0x30,0x2e。在程序中可以先判断按键编码,然后根据编码将键盘代表的数值送到相应的存储单元,再进行功能选择或数据处理。

图4-3 键盘扫描子程序流程图

4.2.3显示子程序的设计

单片机应用系统通常都需要进行人—机对话。其中包括人对应用系统的状态干预与数据输入,应用系统必须向操作者显示状态与运行结果等信息。显示器是单片机应用系统中最常用的人—机交互设备。

显示子程序是字符显示,首先初始化,输出一些基本信息,然后调用事先编好的键盘显示子程序,输出显示命令,显示过程中还需要调用延时子程序。当输入通道采集了

一个信号,或人为的键入一个值,或系统与仪表出现异常情况显示管理软件应及时调用显示驱动程序模块,用来更新当前数据显示符号。

设计显示子程序的流程图如下图4-4所示:

图4-4 显示子程序流程图

4.2.4 价格计算子程序的设计

价格计算子程序由键盘计价键控制,当输入单价后,在没有清零的情况下,点计价键,计算出总价后,调用显示子程序显示出中重量。

该子程序中利用各工作寄存器2组,数据存在以40H单元为首址的连续单元中。价格计算公式总价=单价×重量。这个程序需要两次的数制转换,输入单价后需要将单价转化为二进制后才能与二进制的重量进行计算。计算后的结果必须转换为十进制数显示出来。

图4-5 价格程序流程图

4.2.5 报警子程序的设计

因为压力传感器的所受压力有极限,所以称重量必须有在一定范围内,超过重量时必须有报警程序。

主程序初始化设定阈值为2.5Kg,报警子程序将设定的阈值与实时显示的值进行比较,先比较高位,若高位大,即设定值小于实时显示的值,这时将RXD置为1,将发光二极管点亮,且使蜂鸣器发出声音。若高位相等,就比较低位,同理若设定值低位小于实际显示值,将RXD置为1,将发光二极管点亮,且使蜂鸣器发出声音。这就需要一段比较程序以及一小段置1清0程序。

图4-6 报警子程序流程图

5系统调试

5.1 软件调试

在设计电子秤的过程中,先在软件中仿真,仿真成功后,再制作出实物。仿真采用的是proteus软件,是一专门基于单片机的及其外围电路的仿真软件。仿真的第一步是先进行软件调试,是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正错误的过程。软件调试的方法是先分块后组合。

在编出完整的程序并确保无误后进行综合调试。在调试程序之前,先检查各硬件模块间的连接是否无误,有无断路现象。确认连接无误后就给系统通电进行调试。

正式调试时,首先进行总体调试,即观察系统的运行情况以便快速地发现存在的问题。然后进行各硬件模块调试,主要针对有问题的硬件模块及其程序进行调试,以便准确地查出问题的原因并解决问题。

我在实际仿真的时候出现了LCD无显示,最终找出原因是LCD是共阳极的需要接上拉电阻。同时还发现蜂鸣器超重后都不报警但是LED发亮,最后发现是蜂鸣器的响应时间设置太大产生的。软件调试如图5-1所示。

图5-1软件调试图

5.2硬件调试

按照设计好的电子秤系统原理图,计算出各个元器件的参数,选择相应的器件,制

作出了实际的电子秤系统后。首先检查连线是否与逻辑图一致,用万用表检查有无短路、虚焊等现象。器件的型号、规格、规格、极性是否有误,插接方向是否正确。检查完毕,可用万用表检测仪下电路板正负电源之间的电阻,排除电源短路的可能。 之后将生成的hex文件烧到单片机中,得到响应的实物,观察现象,并排除问题。 刚开始通电后,发现LCD显示画面不理想,之后调节上拉电阻后达到了满意的效果。 同时出现报警装置没有用,之后检查发现是因为实际买的三极管极性与理论图不一样。 换了正负极方向就可以了。同时测量的重物质量与实际相比严重偏大,之后修改程序中的转换倍数后正常了。

结论

本论文主要研究的是简易电子秤的设计,主要是基于超市的电子秤,在小重量范围

的称量。具有如下的功能:

1、能用简易键盘设置单价,能够同时显示重量和金额;

2、重量显示:单位为千克;最大称重为2.5千克,重量误差不大于±0.01千克; 3、具有清零功能和复位功能。 4、超出所测的重量时能够报警。

此电子秤采用LCD1602显示,能够同时显示重量价格,并且具有很高的性价比,能够广泛的应用少于2.5kg重量的范围的交易。

致谢

经过两周的努力终于完成了本次设计,其中由于经验的匮乏,难免有许多考虑不周全的地方,但由于同学及老师的帮助大多都得以解决,真是辛苦大家了。

在这里要感谢我的老师牛月兰老师平常的悉心教导,正是由于她的辛勤教导才能有足够的知识完成这份设计,老师为人和蔼可亲,经常给我们解决一些难题,她治学严谨和科学研究的精神也是我永远学习的榜样,并将积极影响我今后的学习和工作。

最后还要感谢之前指导过我们的所有的老师,正是由于他们,我们才能打好专业知识的基础;同时还要感谢所有的同学们,正是因为有了你们的支持和鼓励。此次课程设计才会顺利完成。

参考文献

[1] 张毅刚.单片机原理及应用[M].北京:高等教育出版社,2010. [2] 彭介华.电子技术课程设计指导[M].北京:高等教育出版社,2008. [3] 常健生.检测与转换技术[M].北京:机械工业出版社,2004.

[4] 何立民.单片机应用技术选编[M].北京:北京航空航天大学出版社,2007 [5] 梁瑞林.传感器实用电路设计与制作[M].北京:科学出版社,2007.

附录A 系统原理图

第27页

附录B 仿真图

附录C 程序清单

.#include #include #include #include

#define uchar unsigned char #define uint unsigned int

#define BUSY 0x80 //常量定义 #define DATAPORT P0

sbit ADCS =P3^5; sbit ADDI =P3^7; sbit ADDO =P3^7; sbit ADCLK =P3^6; sbit LCM_RS=P2^0; sbit LCM_RW=P2^1; sbit LCM_EN=P2^2;

uint x1,y1,z1=0,w1,j,temp1;

uchar ad_data,k,n,m,e,num,s; //采样值存储 sbit speaker=P3^0;

char press_data; //标度变换存储单元 unsigned char ad_alarm; //报警值存储单元 unsigned char press_ge=0; //显示值百位 unsigned char press_shifen=0; //显示值十位 unsigned char press_baifen=0; //显示值个位 unsigned char press_qianfen=0; //显示值十分位

uchar code str0[]={"Weight: . Kg "}; uchar code str2[]={"Price: "}; uchar code str3[]={"Total: "};

uchar code table2[]={0x37,0x38,0x39,0x34,0x35,0x36, 0x31,0x32,0x33,=0x3d,0x30,0x2e }; //键盘码

void delay(uint); void lcd_wait(void);

void delay_LCM(uint); //LCD延时子程序

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

void lcd_wait(void); //LCD检测忙子程序 void WriteCommandLCM(uchar WCLCM,uchar BusyC); //写指令到ICM子函数 void WriteData LCM(uchar WDLCM); //写数据到LCM子函数 void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示指定坐标的一个字符子函数

void DisplayListChar(uchar X,uchar Y,uchar code *DData); //显示指定坐标的一串字符子函数

void weishu(uint m);

void weishu1(uint m); void display(void);

uchar Adc0832(unsigned char channel); void alarm(void); void data_pro(void);

/**********主程序************/

void main(void) {

delay(500); //系统延时500ms启动 //ad_data=0; //采样值存储单元初始化为0 initLCM( ); WriteCommandLCM(0x01,1); //清显示屏 DisplayListChar(0,0,str0); DisplayListChar(0,1,str2); while(1) { ad_data =Adc0832(0); //采样值存储单元初始化为0 alarm(); data_pro(); display(); if(k==1) {

DisplayOneChar((s+7),1,table2[num-1]); x1=m; y1=n; y1=y1*10+x1; }

if(k=='*') {

data_pro(); WriteCommandLCM(0x01,1); weishu(z1); k=0; }

if(k=='=') { z1=z1*temp1; WriteCommandLCM(0x01,1); DisplayListChar(0,1,str3); s=0; weishu1(temp1*n);

k=0; j=temp1; } if(k==' ') { WriteCommandLCM(0x80+0x40,1); WriteCommandLCM(0x01,1); z1=0; s=0; //防止清零时指针后移动 } } }

/*********延时程序K*1ms,12.000mhz**********/

void delay(uint k) {

uint i,j;

for(i=0;i

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

void WriteCommandLCM(uchar WCLCM,uchar BusyC) {

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子函数************/ void WriteDataLCM(uchar WDLCM) {

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内部等待函数*************/ void lcd_wait(void) {

DATAPORT=0xff; //读LCD前若单片机输出低电平,而读出LCD为高电平, //则冲突,Proteus仿真会有显示逻辑黄色 LCM_EN=1;

LCM_RS=0; LCM_RW=0; LCM_RW=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

while(DATAPORT&BUSY) { 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初始化子函数***********/

void initLCM( ) {

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); //8bit数据传送,2行显示,5*7字型,检测忙信号 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; }

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

void DisplayOneChar(uchar X,uchar Y,uchar DData) {

Y&=0x01; X&=0x0f; if(Y) X|=0x40; //若y为1(显示第二行),地址码+0X40 X|=0x80; //指令码为地址码+0X80 WriteCommandLCM(X,1); WriteDataLCM(DData); }

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

void DisplayListChar(uchar X,uchar Y,uchar code *DData) {

uchar ListLength=0; Y&=0x01; X&=0x0f; while(X

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

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

void display(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(1000); //稳定显示 }

/************ 读ADC0832函数 ************/

//采集并返回

uchar Adc0832(unsigned char channel) //AD转换,返回结果 {

uchar i=0; uchar j; uint dat=0; uchar ndat=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;//拉高CLK端 ADDI=channel&0x1; _nop_(); _nop_();

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

ADCLK=1;//拉高CLK端 ADDI=(channel>>1)&0x1; _nop_(); _nop_();

ADCLK=0;//拉低CLK端,形成下降沿3 ADDI=1;//控制命令结束 _nop_(); _nop_(); dat=0;

for(i=0;i

dat|=ADDO;//收数据 ADCLK=1; _nop_(); _nop_();

ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); dat

if(i==7)dat|=ADDO; }

for(i=0;i

j=0;

j=j|ADDO;//收数据 ADCLK=1; _nop_(); _nop_();

ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); j=j

ndat=ndat|j; if(i>=1;

}

ADCS=1;//拉低CS端 ADCLK=0;//拉低CLK端

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

return(dat); //return ad k }

void data_pro(void) {

unsigned int; float press; if(0

/*****************报警子函数*******************/ void alarm(void) { if(ad_data>223)

speaker=0; //则启动报警 else speaker=1; }

void weishu(uint m) {

uchar wei4,wei3,wei2,wei1,wei0; wei4=m/10000; wei3=m%10000/1000; wei2=m%1000/100; wei1=m%100/10;

wei0=m%10;

DisplayOneChar(7,1,0x30+wei4); DisplayOneChar(8,1,0x30+wei3); DisplayOneChar(10,1,0x30+wei2); //DisplayOneChar(10,1,'.'); DisplayOneChar(11,1,0x30+wei1); DisplayOneChar(12,1,0x30+wei0); }

void weishu1(uint m) {

uchar wei5,wei4,wei3,wei2,wei1,wei0; wei5=m/100000;

wei4=m%100000/10000; wei3=m%10000/1000; wei2=m%1000/100; wei1=m%100/10; wei0=m%10;

DisplayOneChar(7,1,0x30+wei4); DisplayOneChar(8,1,0x30+wei3); DisplayOneChar(9,1,'.');

DisplayOneChar(10,1,0x30+wei2); //DisplayOneChar(10,1,'.');

DisplayOneChar(11,1,0x30+wei1); DisplayOneChar(12,1,0x30+wei0); }

/*****************键盘扫描子程序*******************/ void temer1() interrupt 3 { uchar temp; EX1=0; P1=0xfe; temp=P1;

temp=temp&0xf0; if(temp!=0xf0) {

delay(5); temp=P1;

temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case 0xee:num=1;n=7;k=1,s++;break; case 0xde:num=2;n=8;k=1,s++;break; case 0xbe:num=3;n=9;k=1,s++;break; case 0x7e:num=4;k='/',s++;break; }

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

//DisplayOneChar((s+6),1,table2[num-1]); }

}

P1=0xfd;

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xed:num=5;n=4;k=1;s++;break; case 0xdd:num=6;n=5;k=1;s++;break; case 0xbd:num=7;n=6;k=1;s++;break; case 0x7d:num=8;k='*';s++;break; }

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

//DisplayOneChar(k+6,1,table2[num-1]); }

}

P1=0xfb;

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xeb:num=9;n=1;k=1;s++;break; case 0xdb:num=10;n=2;k=1;s++;break;

case 0xbb:num=11;n=3;k=1;s++;break; case 0x7b:num=12;k='-';s++;break; }

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

// DisplayOneChar(k+6,1,table2[num-1]); }

}

P1=0xf7;

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(5);

temp=P1;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xe7:num=13;k=' ';break;

case 0xd7:num=14;n=0;k=1;s++;;break; case 0xb7:num=15;k='=';s++;break; case 0x77:num=16;k='+';s++;;break; }

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

//DisplayOneChar(k+6,1,table2[num-1]); }

}

EX1=1;

}


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn