摘 要
电子秤是我们生活中经常用到的一种衡器,是传统衡器的替代产品。它在生产、销售及商品流通领域得到了普遍的应用。但电子秤大多具有数量读取不方便、易被人为作弊、称量工具运行不稳定、精确度不够高、零部件易损坏、体积大、重量高、电能消耗高等缺点,从而给使用带来了诸多不便。因此,有针对性的开发设计一种方便、快捷、稳定、高效的电子秤势在必行。
为了拥有一款便于日常使用的电子秤,本设计设计了以单片微型计算机为核心,利用称重传感器将重力信号转变为电压信号,键盘、液晶显示器作为人机交互接口配合对应的软件组成的电子秤。本系统主控芯片选用STC89C52单片机,以应变片式传感器作为信号采集模块,报警采用声光模式,显示采用液晶显示器,信号转换采用专用模块,从而使系统可以实现称重、金额计算、声光报警电路等功能。
本设计不仅反映了应用单片机最小系统的灵活性,而且实现了电子秤的多功能性。实现了轻便便携、测量误差小、集价格计算和重量测量功能于一体,基本可以满足商业和居民家庭生活中的基本使用需求。
关键词:传感器采集;数模转换; 单片机; 电子秤
1 系统总体设计方案
精确的电子秤在日常生活中既可以称出去皮后的重量,也可以存储基本产品的单价,只要拥有一样商品的单价,秤就会迅速计算出价格,而且最终也会对所有物品进行合计,并且计算出来的结果非常正确。
在设计系统时,根据要执行的功能,设计电子秤有两种选择:
方案一:由时钟电路、复位电路、数据采集电路、LCD信号显示电路、A/D信号转换电路、单片机以及过载声光报警装置等电路组成。被测物体的重量由应变片将重力转换成电阻的变化,再由电桥将其变成电压信号,此时的电压很小。电压信号被送到信号处理模块中,信号处理模块先对电压信号进行放大,然后将它变成数字信号,再然后将转换的结果传送给单片机,单片机将数字信号转换成显示器所需要的代码使被测物体的重量在显示屏上显示出来。如果需要显示物品价格,我们还可以通过键盘对物品的单价进行设置,以便单片机计算出物品的金额,电路设计有相应的过载声光报警装置,在设备工作异常时报警。其整体设计方案如图1.1所示。
图1.1 方案一设计思路框图
2 软件电路设计
3.1 软件程序设计
单片机上电后,开始初始化,初始化单片机中每个模块的设置以及A/D转换器的功能设置,初始化后运行主程序[17]。
在嵌入式单片机的过程控制数据处理系统中,主要工作模式有过程控制和数据处理两种工作模式。其中数据处理工作模式包括数据的收集、数字处理、数据的转换和图像显示等数据的处理。过程控制的程序主要是通过根据特定方法计算然后输出信号来控制生产。
在设计软件以执行上述任务时,任务被分解为几个部分,并将每个部分称为模块。所谓的“模块”本质上是一个执行特定功能的相对独立的程序段。模块化的编程语言和方法的优点很多,比如说单个的模块比一个完整的应用程序更易编写及运行和调试、模块之间可以共存等等。
3.2 系统程序流程图
软件由一个主程序和若干个子程序组成,这样能够极大的方便程序编写和程序调试。如图3.1所示。
3.2.1 显示模块流程图
单片机应用系统中通常需要有人机之间的对话功能,其中包括人对设备进行数据录入以及对设备运行过程实现控制等,也包括人从设备读取运行过程和结果的各种。人们获取设备运行的信息的主要器件就是显示器。
液晶显示模块是一种常用的显示设备,它的工作速度很慢,不能跟上CPU的速度,所以在对单片机送显示数据之前必需要确认显示模块是否处于空闲状态,液晶显示器的闲忙状态用忙标志位来表示,低电平,表示闲,可以执行操作。在液晶显示过程中我们要先传送显示地址然后再传送要显示的内容。如图3.2所示。
图3.1 主程序流程图
原理图
源程序清单
主程序:
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
bit bdata flag_key;
#include “main.h”
#include “LCD1602.h”
#include “HX711.h”
#include “keyboard.h”
#include “eeprom52.h”
//#include “wannianli.h”
//#include “yyxp.h”
unsigned long HX711_Buffer = 0;
unsigned long Weight_Maopi = 0;
unsigned long Weight_Maopi_0 = 0;
int qupi=0;
long Weight_Shiwu = 0;
//键盘处理变量
unsigned char keycode;
unsigned char DotPos; //小数点标志及位置
uint GapValue,GapValue1;
unsigned long idata price; //单价,长整型值,单位为分
unsigned long idata danjia[8]={11,22,33,44,100,200,300,400};
unsigned char count_danjia;
unsigned long idata money,total_money; //总价,长整型值,单位为分
//定义标识
volatile bit FlagTest = 0; //定时测试标志,每0.5秒置位,测完清0
volatile bit FlagKeyPress = 0; //有键按下标志,处理完毕清0
//校准参数
//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很更准确。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
//该值可以为小数
//#define GapValue 349
sbit LED=P3^6;
sbit Buzzer = P2^0;
volatile bit ClearWeighFlag = 0; //传感器调零标志位,清除0漂