写在前面:制作整理不易,多多点赞
代码仿真文件:【免费】基于51单片机的智能电子秤系统设计(含代码仿真及论文)无需积分!资源-CSDN文库
演示视频【开源】基于51单片机的智能电子秤设计(含论文仿真及代码等)_哔哩哔哩_bilibili
摘 要
随着科技的发展和市场需求的不断提高,智能电子秤在商业、家庭和实验室等领域得到了广泛应用。本文主要研究了一种基于51单片机的智能电子秤系统设计,旨在提高电子秤的性能和实用性。
本设计以STC89C52RC单片机为主控单元,使用8 位AD转换芯片 ADC0832对采集到的模拟量进行A/D转换,转换后的数据送到单片机进行处理显示,数据显示由 LCD12864 液晶实现。具有以下特点:称重范围为0~5Kg,误差不大于±0.005Kg;具备测量物体质量并通过显示模块显示的功能;能够通过物体的单价计算出物体数量的总价格;具备去皮功能,方便计算物体的实际重力;当测量重量超出报警阈值时,蜂鸣进行过载报警。
通过实验验证,本文设计的基于51单片机的智能电子秤系统具有较高的精度和稳定,满足了商业、家庭和实验室等领域的需求,具有较强的实用价值和广阔的应用前景。
关键词:51单片机;智能电子秤;称重传感器;误差分析
目 录:
1 设计任务
1.1 设计任务要求
1.2 需求分析
2 系统硬件设计
2.1 系统总体设计方案
2.2 单片机最小系统模块
2.3 压力传感器模块
2.4 显示模块
2.5 A/D转换模块
3 系统程序设计
3.1 主控程序设计
3.2 A/D转换子程序设计
3.3 LCD驱动子程序设计
3.4 按键轮询子程序设计
4 系统调试
4.1仿真调试
4.2实物调试
4.4调试心得
附 录
附录A 电路原理图
附录B 程序代码
1 设计任务
一、设计一台电子秤,可实现电子秤基本的称重功能,当放上物体时,能够显示重量,称重范围为0~5Kg,且误差不大于±0.005Kg。
二、电子称具有输入单价的功能,并且具有计算总价的功能,单价和总价金额的单位为元,最大金额数值为999.99元,金额误差不大于0.01元。
三、系统超出最大测量范围5Kg时,具有报警指示功能。
四、电子秤设计同时具备去皮功能和重量校准功能。
1.2 需求分析
功能需求:系统应能准确测量物体的重量,量程范围为0~5Kg,误差不大于±0.005Kg;并且具备液晶显示屏,实时显示物体的重量、单价和总价。系统应允许用户输入商品的单位价格,以便计算总价;当测量重量超过最大量程时,应发出报警提示;并且应具备低功耗设计,以延长电池使用寿命。
性能需求:主控芯片时钟频率需要在几十MHz到几百MHz之间,以保证足够的计算能力和数据处理能力。控制需求:系统应具备清晰的控制逻辑,实现重量测量、显示、报警等功能的协调和顺畅运行。有高精度的控制能力和快速的控制响应能力,确保重量测量结果的准确性,能在短时间内完成重量测量、显示和报警等功能。
系统可靠性需求:系统应具备快速响应能力,能在短时间内完成重量测量和显示,操作界面应简洁明了,方便用户快速上手;同时具备一定的可扩展性,以便后期增加新功能或升级。
系统安全性需求:系统应具备电气安全保护措施,防止短路或触电事故的发生;应加入防篡改功能,防止被不法商家利用,缺斤少两;具备过载保护功能,防止因测量重量超过最大量程而导致的损坏。
兼容性需求:系统应具备通用的通信接口,便于与其他设备或系统进行数据交互。系统应具备广泛的电源兼容性,能适应不同电源环境的需求。
成本需求:系统在保证系统性能的前提下,选择了尽量选择性价比高的材料,降低成本。优化系统设计,降低制造难度和制造成本。使硬件成本不高于70元。软件成本和维护成本较低,便于用户进行长期使用。
2 系统硬件设计
本设计采用了Proteus软件进行仿真调试,在实际制作之前就可以发现和解决潜在的问题,从而减少后续实物制作和调试时现的问题。这种方法可以提高设计的可靠性,节省成本和减少浪费。在仿真成功运行后再进行元器件的采购和实物的制作,可以确保设计的正确性和可行性。
2.1 系统总体设计方案
智能电子秤主要工作原理:称盘上放有物品时,会对传感器形成一压力,使得传感器随之产生力-电效应,将物体的重量转换成与被称物体重量成一定函数关系的模拟电信号,经电路放大,模数(A/D)转换,送处理器处理得到对应的物品重量。
本系统采用 STC89C52 单片机作为核心控制硬件,由称重传感器、A/D 转换芯片、处理器芯片、LCD 显示器和蜂鸣报警器等组成。通过称重传感器实现数据的采集转化为电压值传递给 A/D 转换器进一步传递给具有计算处理功能的 STC89C52 单片机,单片机扫描按键状态和引脚电平,判断按键输入信息、功能按键开关状态,同时将收到的信息进行运算后,通过蜂鸣报警器和显示器传递给外界,以达到控制高精度的测量、报警、单价调节和去皮重等功能。
本系统采用模块化设计原则,硬件与软件相结合的方式。硬件部分,由单片机、传感器等组成的电路,完成系统的硬件设计;软件部分,把采集到的压力传感器数据上传到LCD显示器,从而实现对物体的质量测量、价格计算及超重报警。
系统整体设计如图2.1所示,分为六个部分:单片机最小系统、传感器模块、按键模块、显示模块、蜂鸣器报警模块以及A/D转换模块。
2.2 单片机最小系统模块
方案一:STM32单片机
STM32单片机具有低功耗、高性能和稳定等特点。
但STM32是运行指令的,合适运行算法,但对于多路信号处理,须要很多DSP进行并行处理。并且芯片成本较高,易受市场影响,波动较大。
方案二:STC89C52单片机
STC89C52单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机。STC89C52 是一个低电压,高性能 CMOS8 位单片机,片内含 8k bytes 的可反复擦写的 Flash 只读程序存储器和 256bytes 的随机存取数据存储器(RAM),兼容标准 MCS-51 指令系统,片内置通用 8 位中央处理器和 Flash 存储单元。 STC89C52 有 40 个引脚,32 个外部双向输入/输出(I/O)端口,同时内含 2 个外中断口,3 个 16 位可编程定时计数器,2 个全双工串行通信口,2 个读写口线,STC89C52 可以按照常规方法进行编程。其将通用的微处理器和 Flash 存储器结合在一起,特别是可反复擦写的 Flash 存储器可有效地降低开发成本。
STC89C52 单片机最小系统主要有晶振电路、复位电路、和电源电路等组成, 如图 2.2 所示。
图2.2 单片机最小系统
相较于STM32单片机,STC89C52单片机是一种非常便宜的微控制器,因此在一些低成本的应用中非常受欢迎,易于学习和使用,资源消耗低。并且由于51单片机已经存在了很长时间,因此有很多成熟的开发工具和库可供使用。所以本设计选用方案二。
2.3 压力传感器模块
方案一:压电传感器
压电传感器是一种典型的有源传感器,又称自发电式传感器。其工作原理是基于某些材料受力后在其相应的特定表面产生电荷的压电效应。
压电传感器体积小、重量轻、结构简单、工作可靠,适用于动态力学量的测量,不适合测频率太低的被测量,更不能测静态量。目前多用于加速度和动态力或压力的测量。压电器件的弱点:高内阻、小功率。功率小,输出的能量微弱,电缆的分布电容及噪声干扰影响输出特性,这对外接电路要求很高。
方案二:电阻应变式传感器
电阻应变式传感器是一种利用电阻应变效应,将各种力学量转换为电信号的结构型传感器。电阻应变片式电阻应变式传感器的核心元件,其工作原理是基于材料的电阻应变效应,电阻应变片即可单独作为传感器使用,又能作为敏感元件结合弹性元件构成力学量传感器。
导体的电阻随着机械变形而发生变化的现象叫做电阻应变效应。电阻应变片把机械应变信号转换为△R/R后,由于应变量及相应电阻变化一般都很微小,难以直接精确测量,且不便处理。因此,要采用转换电路把应变片的△R/R变化转换成电压或电流变化。其转换电路常用测量电桥。
直流电桥的特点是信号不会受各元件和导线的分布电感及电容的影响,抗干扰能力强,但因机械应变的输出信号小,要求用高增益和高稳定性的放大器放大。
图2.3为一直流供电的平衡电阻电桥,接直流电源E:
图2.3 传感器内部连接图
当电桥输出端接无穷大负载电阻时,可视输出端为开路,此时直流电桥称为电压桥,即只有电压输出。
当忽略电源的内阻时,由分压原理有:
(2.1)
当满足条件R1R3=R2R4时,即
应变片测量电桥在测量前使电桥平衡,从而使测量时电桥输出电压只与应变片感受的应变所引起的电阻变化有关。
若差动工作,即R1=R-△R,R2=R+△R,R3=R-△R,R4=R+△R,按式(2.1),则电桥输出为
电阻应变片式传感器有如下特点:
(1)应用和测量范围广,应变片可制成各种机械量传感器。
(2)分辨力和灵敏度高,精度较高。
(3)结构轻小,对试件影响小, 对复杂环境适应性强,可在高温、高压、强磁场等特殊环境中使用,频率响应好。
(4)商品化,使用方便,便于实现远距离、自动化测量。
通过对压力传感器与电阻应变式传感器比较分析,最终选择了第二种方案。题目要求称重范围0~5Kg,满量程量误差不大于正负0.005Kg,考虑到秤台自重、振动和冲击分量,还要避免超重损坏传感器,所以传感器量程必须大于额定称重5Kg。我们选择的是电阻应变片压力传感器,量程为5Kg,精度为0.01% ,满足本系统的精度要求。
表2.1 传感器参数说明
综合误差(%F.S) |
0.05 |
额定输出温度漂移(%F.S/10℃) |
≤0.15 |
灵敏度(mv/v) |
1.0±0.1 |
零点输出(mv/v) |
±0.1 |
非线性(%F.S) |
0.05 |
输入电阻(Ω) |
1000±50 |
重复性(%F.S) |
0.05 |
输出电阻(Ω) |
1000±50 |
滞后(%F.S) |
0.05 |
编缘电阻(MΩ) |
≥2000(100VDC) |
蠕变(%F.S/3min) |
0.05 |
推荐激励电压(V) |
3~12 |
零点漂移(%F.S/1min) |
0.05 |
工作温度范围(℃) |
-10~+50 |
零点温度漂移(%F.S)/10℃ |
0.2 |
过载能力(% F.S) |
150 |
传感器信号输出说明:
传感器输出量为模拟电压量,电压值由激励电压(工作电压/决定,例如:激励电压为DC5V,则压力传感器的满量程输出电压值为:5V*1.0mv/ V =5mV;即信号电压输出范围为0-5mV,施加的压力越大,对应输出的电压值越大。
2.4 显示模块
方案一:数码管显示
数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
数码管显示信息有限,当显示信息较多时需要多个数码管级联方可,这样会造成硬件连接复杂,成本增加;数码管对大部分字符不能很好的显示,动态扫描时处理不好易出现闪烁现象。
方案二:LCD12864显示
LCD12864 是显示分辨率为 128×64, 内置 128 个 16*8 点 ASCII 字符集的点阵图形液晶显示模块。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示 8×4 行 16×16 点阵的汉字。也可完成图形显示。低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶。显示模块相比,硬件电路结构或显示程序都要简洁得多。
LCD12864 在显示字母和数字时,是 4*16 的显示字符模块,即可以显示 4 行, 每行可以显示 16 个字母或数字;在显示汉字时,是 4*8 的汉字显示模块,即可以显示 4 行,每行可以显示 8 个汉字。下面介绍并行通信的显示方式。
LCD12864 共有 20 个引脚,其引脚具体功能如表 2.2 所示,由表可得 LCD12864引脚组成为 8 位数据传输端口(DB0-DB7);两个电源引脚(VCC,GND);两个电源背光引脚(BLK,BLA),控制 LCD 的背景亮度;一个 VO 引脚,外接一个上拉电阻(控制 LCD12864 的字符对比度,让字符更加的清晰可见);RST 复位引脚, 低电平有效,此处直接接高电平;第 16、17 位空引脚,不用管;剩下的 RS,RW, EN 和 PSB 四个引脚则跟 LCD12864 的写入息息相关,通过 PSB 可以控制 LCD12864 跟单片机的通信方式,输入高电平,则 LCD12864 跟单片机的通信模式为并行通信,低电平则为串行通信。单片机对 RS,RW,EN 端口的写入控制,则可以控制LCD12864 的数据传输模式,决定单片机写入 LCD12864 数据端口 DB 的是命令还是数据。写入命令可以控制 LCD 的模式和工作状态,然后写入数据,让 LCD 显示需要的界面。
表2.2 LCD12864 引脚功能表
引脚号 |
引脚名称 |
方向 |
功能简介 |
1 |
GND |
— |
模块的电源的接地引脚 |
2 |
VCC |
— |
模块的电源的正极引脚 |
3 |
VO |
— |
LCD驱动电压输入端口 |
4 |
RS(CS) |
H/L |
并行的指令/数据选择信号;串行的片选信号 |
5 |
R/W(SID) |
H/L |
并行的读写选择信号;串行的数据口 |
6 |
EN(CLK) |
H/L |
并行的使能信号;串行的同步时钟 |
7 |
DB0 |
H/L |
数据端口0 |
8 |
DB1 |
H/L |
数据端口1 |
9 |
DB2 |
H/L |
数据端口2 |
10 |
DB3 |
H/L |
数据端口3 |
11 |
DB4 |
H/L |
数据端口4 |
12 |
DB5 |
H/L |
数据端口5 |
13 |
DB6 |
H/L |
数据端口6 |
14 |
DB7 |
H/L |
数据端口7 |
15 |
PSB |
H/L |
串/并行接口选择端口 H-并行 L -串行 |
16 |
NC |
空脚 |
|
17 |
/RST |
H/L |
复位引脚,低电平有效 |
18 |
VOUT |
倍压输出脚(VDD =+3.3有效) |
|
19 |
LED_A |
— |
背光电源正极+5V |
20 |
LED_B |
— |
背光电源负极 0V |
2.5 A/D转换模块
ADC0832 是 8 脚双列直插式双通道 A/D 转换器,能分别对两路模拟信号实现模—数转换,可以用在单端输入方式和差分方式下工作。ADC0832 采用串行通信方式,通过 DI 数据输入端进行通道选择、数据采集及数据传送。8 位的分辨率(较高分辨可达 256 级),可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在 0~5V 之间。具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入, 使多器件挂接和处理器控制变的更加方便, 芯片接口如图 2.4 所示。
表2.3ADC0832各引脚及其功能
编号 |
名称 |
功能 |
1 |
CS_ |
片选使能,低电平芯片使能 |
2 |
CH0 |
模拟输入通道0,或作为IN+/-使用 |
3 |
CH1 |
模拟输入通道1,或作为IN+/-使用 |
4 |
GND |
芯片参考电压零电位(地) |
5 |
DI |
数据信号输入,选择通道控制 |
6 |
DO |
数据信号输出,转换数据输出 |
7 |
CLK |
芯片时钟输入 |
8 |
VCC |
电源输入及参考电压输入(复用) |
正常情况下 ADC0832 与单片机的接口应为 4 条数据线,分别是 CS、CLK、DO、DI。但由于 DO 端与 DI 端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将 DO 和 DI 并联在一根数据线上使用。
ADC0832 时序图如图2.5所示。
在时序图中可以看到,CS 作为选通信号,从 CS 置为低电平开始,一直到置为高电平结束。CLK 提供时钟信号。当 ADC0832 未工作时其 CS 输入端应为高电平,此时芯片禁用,CLK 和 DO/DI 的电平可任意。当要进行 A/D 转换时,须先将CS 使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端 CLK 输入时钟脉冲,DO/DI 端则使用 DI 端输入通道功能选择的数据信号。在第 1 个时钟脉冲的下沉之前 DI 端必须是高电平,表示启始信号。在第 2、3 个脉冲下沉之前 DI 端应输入 2 位数据(SGL、Odd) 用于选择通道功能,当此 2 位数据为“1”、“0”时,只对 CH0 进行单通道转换。当 2 位数据为“1”、“1”时,只对 CH1 进行单通道转换。当 2 位数据为“0”、“0”时,将 CH0 作为正输入端 IN+,CH1 作为负输入端 IN-进行输入。当 2 位数据为“0”、“1”时,将 CH0 作为负输入端 IN-,CH1 作为正输入端 IN+ 进行输入。在完成输入启动位、通道选择之后,到第 3 个脉冲的下沉之后 DI 端的输入电平就失去输入作用,此后 DO/DI 端则开始利用数据输出 DO 进行转换数据的读取。从第 4 个脉冲下沉开始由 DO 端输出转换数据最高位 DATA7,随后每一个脉冲下沉 DO 端输出下一位数据。直到第 11 个脉冲时发出最低位数据 DATA0, 一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第 11 个字节的下沉输出 DATA0。随后输出 8 位数据,到第 19 个脉冲时数据输出完成,也标志着一次 A/D 转换的结束。最后将 CS 置高电平禁用芯片,此时就可以开始读出数据,转换得到的数据会被送出二次,一次高位在前传送,一次低位在前传送,连续送出。
3 系统程序设计
整个软件程序设计分为四个部分,包括主程序模块、ADC0832 处理子程序模块、LCD 驱动子程序模块和按键轮询子程序模块。主程序循环读取 ADC0832 的数据并控制 LCD 屏幕的显示, ADC0832 处理子程序模块实现 ADC 芯片的初始化和读取操作并封装成函数,方便主函数直接调用,LCD 驱动子程序初始化所需的 GPIO 及其时钟,按键中断子程序中处理按键按下事件。在本设计中,主要是实现对物体质量的检测以及价格的计算,并将质量和价格显示在LCD屏上。
3.1 主控程序设计
STC89C52主控流程图如图3.1所示。
主程序中,循环读取ADC0832芯片中的模拟信号,并将转换后的数字信号通过LCD显示出来。
在主函数中,程序首先进行LCD的初始化和显示。然后,程序进入一个无限循环中,不断读取ADC数据,根据ADC数据计算相应的重量、单价和总价,并将计算结果显示在LCD上。
在每个循环中,程序首先调用Adc0832函数读取ADC数据,并将读取的数据存储在变量ad_data中。接着,程序调用其他函数,如data_pro、weight_alarm、total等,根据读取到的ADC数据计算相应的重量、单价和总价,并将计算结果显示在LCD上。
3.2 A/D转换子程序设计
A/D转换子程序程序使用了单片机的IO口来模拟SPI接口,通过控制IO口的状态和时序来与ADC0832进行通信,并完成模拟信号转换。程序先将通道号转化为ADC0832芯片需要的通道编码,并将控制命令发送给ADC0832芯片。然后,程序通过模拟SPI接口向ADC0832芯片传输数据,并从芯片中读取转换后的数字信号。
在函数中,程序首先将通道号转化为ADC0832芯片需要的通道编码,并发送控制命令给芯片。然后,程序通过模拟SPI接口向芯片传输数据,并从芯片中读取转换后的数字信号。程序使用两个for循环来读取芯片传输的数据,将两个字节合并成一个16位的数字信号,并返回该数字信号。
3.3 LCD驱动子程序设计
LCD驱动子程序包括了一些函数用于控制LCD的显示效果。
checkbusy函数用于检测LCD是否处于忙状态,如果是,则等待LCD完成当前操作后再继续下一步操作。
writecode函数用于向LCD发送命令,它会先调用checkbusy函数进行忙状态检测,然后设置RS为0,表示写入的是命令,最后将命令数据写入LCD中。
writedata函数用于向LCD发送数据,它也会先调用checkbusy函数进行忙状态检测,然后设置RS为1,表示写入的是数据,最后将数据写入LCD中。
displayzifu函数用于显示一个字符串,它会将字符串中每个字符的字模取出来,按照8×16的格式分别显示在左右两页中。
clear函数用于清除LCD指定区域的显示内容,它的实现方式与displayzifu函数类似,只不过这里显示的是空格字符。
displayhanzi函数用于显示汉字,它的实现方式与displayzifu函数类似,
lcdinti函数用于初始化LCD,它会发送一系列命令来设置LCD的显示参数和起始地址。
3.4 按键轮询子程序设计
按键中断子程序是一个在定时器1计数器溢出时被调用的定时器1中断函数。该函数主要是用来处理按键输入的,包括涨价按键1、涨价按键2、降价按键1、降价按键2、去皮按键、去皮清零按键、报警值增加按键和报警值减少按键。
当这些按键中的任意一个被按下时,按键中断子程序会对相应的变量进行递增或递减,并等待按键释放后才返回。为了确保程序能够正确地响应按键输入,按键中断子程序使用了一些while循环来等待按键释放。这些循环会一直执行,直到检测到按键已经释放,并且相应的变量已经得到更新。
在按键中断子程序中,单价、皮重和报警值都可以被调整。单价和皮重是用来计算净重的,而报警值用于判断是否超过了设定的重量范围。如果超过了报警值,程序会触发相应的报警机制,提醒用户进行相应的处理。
按键中断子程序在电子秤的控制中起着非常重要的作用。它能够实时响应用户的输入,并对相应的变量进行递增或递减,从而实现对电子秤的精准控制。
4 系统调试
在本章中,我们将进行实验验证,以检查系统是否具备设计任务书中要求功能和精度指标。
系统的功能与精度指标如表4.1所示:
表4.1 系统的功能与性能指标
序号 |
实验 |
测试内容 |
预期指标 |
1 |
系统整体功能验证 |
称重、计价、LCD显示等功能 |
功能良好 |
2 |
质量检测精度测试 |
质量测量精度 |
偏差小于±0.005Kg |
3 |
超重报警功能测试 |
蜂鸣器报警 |
功能良好 |
4 |
去皮及重量校准测试 |
按键去皮,重量校准功能 |
功能良好 |
4.1仿真调试
在Proteus绘制出原理图后,将程序导入,然后按下开始键,仿真开始运行,AT89C52 单片机可以读取到 ADC0832 的数据,并在 LCD 屏幕上显示出重量、单价、报警值和总价,如图 4.2 所示。
点击单价调节对应的按键可以调节物品的单价,单片机计算出的总价也会随着实时改变,如图 4.3 所示。
点击报警调节对应的按键可以调节报警值,物体重量超出报警值时,报警电路会开始工作,如图 4.4 所示。
点击去皮操作对应的按键可以将当时的物体重量算作皮重去除,之后再增加的重量为净重,如图 4.5 所示。
4.2实物调试
本次实验的目的是验证本文所设计的智能电子称系统的信号采集、参数测量、LCD显示等整体功能。实验设备为本文所设计的智能电子秤一台,包括单片机最小系统模块、压力传感器模块、A/D转换模块、显示模块。
4.2.1系统整体功能验证
实验步骤如下:首先选择需要测量的物体,将被测量物体放在置物盘正中央,(放置置物盘边缘上会影响测量精度),等待测量结果。如需要计算总价,首先通过按键调整商品单价,系统会自动计算总价,显示于LCD屏幕上。当物体质量超过设定好的值时,系统会自动报警;若需调整报警值,则需要按下报警值调整按键,调整报警数值。
接入5V直流电源,系统开机,初始显示如图4.6所示,此时重量自动归零,单价默认为12元/Kg,按下去皮键即可去皮。
将被测物体放上置物盘后,系统显示物体质量,并根据已设置的单价自动计算总价,并显示于LCD屏幕上,如图4.7所示,此时重量为0.072Kg,单价为12元/Kg,总价为0.072*12=0.864元,显示总价为0.86元。
按下报警值设置键,即可调整报警重量,如图4.8所示。当物体质量超过设置的报警重量时,蜂鸣器持续报警。
4.2.2 压力传感器模块验证
本次实验目的是验证系统测量质量的精度是否符合系统指标要求。实验共测量五种不同质量的物体,多次测量,将物体置于标准秤置物盘上,待读数稳定后记录数据;再将被测物体置于压力传感器上方置物盘上,测量结束后查看LCD显示屏上的数据并记录,对比两组数据验证测温精度。为避免因温度的不同而引起的误差,实验时需在同一温湿度环境下测量。对比结果如表4.2所示。
表 4.2系统测量结果与标准秤测量结果对照表
编号 |
测量结果/Kg |
对照结果/Kg |
误差/Kg |
1 |
0.051 |
0.051 |
0.000 |
2 |
0.052 |
0.051 |
+0.001 |
3 |
0.341 |
0.343 |
-0.002 |
4 |
0.342 |
0.343 |
-0.001 |
5 6 7 8 9 10 |
0.836 0.837 1.565 1.567 2.530 2.532 |
0.837 0.837 1.565 1.565 2.531 2.531 |
-0.001 0.000 0.000 +0.002 -0.001 +0.001 |
根据表中数据可以得知,在10次的测量值,本系统对质量测量的最大误差为0.002Kg,满足小于或等于0.005Kg的测量精度要求。在测量过程中,还发现了当物体放在置物盘边时,测量数值会不准确,误差也会迅速增加。所以,可以通过尽量使被测物体置于置物盘中央来提高测量精度。
4.4调试心得
调试是将设计理论转化为实际的过程,对于这一阶段,我们需要具备扎实的理论知识和实践经验。调试过程中存在大量未知,稍有疏忽就可能导致连锁反应,影响整个结果,因此我们需要谨慎对待每一个细节,并不断改进调试方法。在调试过程中,我们往往会遇到各种问题,需要进行仔细排查和多方尝试,不要轻易放弃,总会找到解决方法。同时,记录和总结每次尝试的结果也是非常重要的,可以帮助我们更好地发现问题和避免同样的错误。
在调试的过程中,我遇到了许多问题,其中LCD12864显示模块的调试让我非常困扰,因为显示屏无法正常显示。我进行了一遍遍的引脚检查和代码检查,但是没有发现错误,这导致我的课程设计停滞了很长时间。最后,我进行了更加仔细的排查,发现其中一个地方虚焊了,才解决了问题。在软件调试时,我在尝试利用LCD12864显示中文汉字的过程中也遇到了很多困难,但是通过学习和搜集资料,我最终成功实现了这个功能。
调试的过程虽然可能会让人感到枯燥,但是在每一次尝试中,无论是失败还是成功,都能够激起我内心的激动和感动。在这次毕设的调试过程中,我深刻地体会到了失败是一件正常的事情,关键在于我们要从每次失败中吸取经验,不断地尝试,相信总会有一次属于自己的成功。因此,不断地坚持和努力才是最终走向成功的道路。同时,我们也要保持乐观的心态,对于每一次失败都要有信心和勇气去面对,相信自己能够克服困难,最终取得成功。因为每一次失败都是一次宝贵的经验积累,在未来的工作和学习中,这些经验也将会成为我们前进的强大支撑。
在调试这个过程中,我也发现了自己的不足之处。只有不断发现自己的不足并进行改进,才能不断提高自己的能力和水平。
当调试单片机电子秤时,以下是一些重要的注意事项和建议:
(1)确保电子秤的传感器与单片机正确连接,并且连接线路没有松动或错误。检查传感器和电源供应电路是否正确。
(2)在程序中使用合适的校准算法,以确保秤的读数准确。这通常涉及到将已知重量放在秤上,并将读数与期望值进行比较,然后进行校准。
(3)在进行校准时,应确保在秤上放置的物品是均匀分布的,并且不会造成传感器的过载。过载会导致读数不准确,甚至可能损坏传感器。
(4)在使用ADC0832时,需要注意接线和程序的编写,以确保正确读取和处理ADC0832的输出。
(5)在调试过程中,可以使用调试工具(如示波器、万用表)来检查信号和电路的正确性,以及确认程序的正确性。
(6)最后,应该对整个系统进行全面测试,以确保读数准确、响应速度快,并且能够稳定工作。
总之,调试单片机电子秤需要仔细检查硬件和软件,并进行适当的校准和测试,以确保其准确性和稳定性。同时也需要我们耐心和细心,只有不断改进和提高自己的调试能力,才能够取得最终的成功。
5 总结与展望
本设计基于51单片机的电子称,旨在设计一款高精度、高稳定性的电子称,以满足实际生产和生活中对于称重精度和稳定性的需求。本设计采用了传统的电桥式称重方案,在此基础上,结合了51单片机的特点,实现了高精度、高稳定性的称重功能,并通过LCD12864显示模块实时显示称重结果。
本设计具有一定的学术意义和应用价值。在学术方面,本设计结合了传统的电桥式称重方案和现代的单片机技术,实现了高精度、高稳定性的称重功能,为电子称的研究和开发提供了一种新的思路和方法。在应用方面,本设计可以广泛应用于各种需要精确称重的场合,如实验室、工业生产、商业等领域,具有非常广泛的应用前景。
本设计具有以下优点、创新和特色:
(1)高精度、高稳定性:本设计采用了传统的电桥式称重方案,在此基础上结合了51单片机的特点,实现了高精度、高稳定性的称重功能。
(2)实用性强:本设计采用了LCD12864显示模块实时显示称重结果,操作简单、直观,使用方便。
(3)设计灵活:本设计的硬件和软件设计相对独立,可以方便地进行组合和改进。
(4)成本低廉:本设计采用的硬件器件成本较低,易于制作和推广。
目前本设计已经达到了较高的水平,但仍存在一些问题和改进方向:
(1)称重范围有限:本设计的称重范围较窄,需要进一步扩大称重范围,以满足更多的实际需求。
(2)数据处理能力不足:本设计采用的51单片机处理数据的能力较为有限,需要进一步提高数据处理的能力,以满足更高的精度和稳定性要求。
(3)可靠性有待提高:本设计在实际使用中,可能会出现一些故障,需要进一步提高其可靠性和稳定性。
综上所述,本设计基于51单片机的电子称课设具有一定的学术意义和应用价值,具有高精度、高稳定性、实用性强、设计灵活、成本低廉等优点和特色。但仍存在一些问题和改进方向,未来可以继续改进和完善该系统,以满足不同场合的需求。
参考文献
附 录
附录A 电路原理图
附录B 程序代码
Main.c:
#include
#include
#include
#define LCD P0
#define GPIO_KEY P1
sbit price_add1=P1^0;
sbit price_reduce1=P1^1;
sbit price_add2=P1^2;
sbit price_reduce2=P1^3;
sbit weight_reduce=P1^4;
sbit weigth_clear=P1^5;
sbit warning_add=P1^6;
sbit warning_reduce=P1^7;
sbit EN=P2^0;
sbit RW=P2^1;
sbit RS=P2^2;
sbit CS1=P2^3;
sbit CS2=P2^4;
sbit BUSY=P0^0;
sbit beep=P2^7;
sbit ADCS =P3^5;
sbit ADDI =P3^7;
sbit ADDO =P3^7;
sbit ADCLK =P3^6;
unsigned char a,i,j,k,ad_data;
float press=0.0,press_r=0.0;
float warning=2.5;
int b;
int num=1,num_t=0;
float sum=0;
float price1=10;
float weight_temp=0;
void delay(unsigned char a)
{
unsigned char i,j;
for(i=0;iwarning)
{
beep=0; //则启动报警
}
else
beep=1;
}
//采集并返回
unsigned char Adc0832(unsigned char channel) //AD转换返回结果
{
unsigned char j,i=0,ndat=0;
unsigned int dat=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端
_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<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
void data_pro(void)
{
if(0=0X80)
{
CS1=0;
CS2=1;
lineaddress=lineaddress-0X40;
}
b=table[j]-0X20;
for(k=0;k<16;k++)
{
temp[k]=ch2[b][k];
}
writecode(page);
writecode(lineaddress);
for(i=0;i<8;i++)
{
writedata(temp[i]);
}
writecode(page+1);
writecode(lineaddress);
for(i=8;i<16;i++)
{
writedata(temp[i]);
}
lineaddress+=8;
}
}
void clear(unsigned char page,unsigned char lineaddress,int n, unsigned char table[])
{
unsigned char temp[16];
if(lineaddress<0X80)
{CS1=1;
CS2=0;}
for(j=0;j=0X80)
{
CS1=0;
CS2=1;
lineaddress=lineaddress-0X40;
}
b=table[j]-0X20;
for(k=0;k<16;k++)
{temp[k]=ch2[b][k];}
writecode(page);
writecode(lineaddress);
for(i=0;i<8;i++)
{ writedata(temp[i]);}
writecode(page+1);
writecode(lineaddress);
for(i=8;i<16;i++)
{ writedata(temp[i]);}
lineaddress+=8;
}
}
void displayhanzi(unsigned char page,unsigned char lineaddress,int n, unsigned char table[][16])
{
unsigned char temp[32];
if(lineaddress<0X80)
{
CS1=1; //left
CS2=0;
}
for(j=0;j=0X80)
{
CS1=0; //right
CS2=1;
lineaddress=lineaddress-0X40;
}
for(k=0;k<16;k++)
{
temp[k]=table[j][k];
}
j+=1;
for(k=0;k<16;k++)
{
temp[16+k]=table[j][k];
}
writecode(page);
writecode(lineaddress);
for(i=0;i<16;i++)
{
writedata(temp[i]);
}
writecode(page+1);
writecode(lineaddress);
for(i=16;i<32;i++)
{
writedata(temp[i]);
}
lineaddress+=16;
}
}
void lcdinti()
{
writecode(0X3f);//显示开关关
writecode(0XC0);//修改显示起始行
writecode(0XB8);//修改页地址,x地址
writecode(0X40);//修改列地址,y地址
}
void main()
{
unsigned char t[3]={'/','K','G'};
char m=':';
EA=1;
EX1=1;
lcdinti();//LCD初始化
/*LCD清屏*/
clear(0XB8,0X40,16,&table2);
clear(0XBa,0X40,16,&table2);
clear(0XBc,0X40,16,&table2);
clear(0XBe,0X40,16,&table2);
displayhanzi(0XB8,0X40,8,&TITLE);
/*显示报警值*/
turn(warning);
displayzifu(0XB8,0X78,5,&t1[1]);
displayzifu(0XB8,0xB0,2,&t[1]);
displayhanzi(0XBa,0X40,4,&WEIGHT);
displayzifu(0XBa,0X60,1,&m);
displayhanzi(0XBc,0X40,4,&PRICE);
displayzifu(0XBc,0X60,1,&m);
displayhanzi(0XBE,0X40,4,&TOTAL);
displayzifu(0XBe,0X60,1,&m);
while(1)
{
/*读取ADC,并显示*/
ad_data =Adc0832(0); //采样值存储单元初始化为0
data_pro();
press_r=press-weight_temp;
/*根据ADC数据,判断是否报警*/
weight_alarm();
turn(warning);
displayzifu(0XB8,0X78,5,&t1[1]);
delay(100);
turn(press_r);
displayzifu(0XBa,0X68,5,&t1[1]);
displayzifu(0xba,0xB0,2,&t[1]);
delay(100);
/*显示单价*/
turn(price1);
displayzifu(0XBc,0X68,6,&t1[0]);
displayhanzi(0xbc,0x98,2,&YUAN);
displayzifu(0XBc,0XA8,3,&t);
delay(100);
/*计算单价,并显示*/
total(press_r,price1);
turn(sum);
displayzifu(0XBe,0X68,6,&t1);
displayhanzi(0xbe,0xB0,2,&YUAN);
delay(100);
}
}
ZM.h:
#ifndef __ZM_H__
#define __ZM_H__
char point='.';
char table2[16]={" "};
unsigned char code ch2[95][16]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00},
{0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00},
{0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00},
{0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00},
{0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00},
{0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00},
{0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00},
{0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00},
{0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00},
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00},
{0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00},
{0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00},
{0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00},
{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00},
{0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00},
{0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00},
{0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00},
{0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20},
{0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00},
{0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00},
{0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00},
{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00},
{0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00},
{0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00},
{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20},
{0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},
{0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00},
{0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00},
{0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00},
{0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00},
{0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00},
{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00},
{0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00},
{0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00},
{0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20},
{0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00},
{0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},
{0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},
{0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00},
{0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00},
{0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20},
{0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},
{0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00},
{0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00},
{0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00},
{0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00},
{0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80},
{0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20},
{0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00},
{0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00},
{0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20},
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00},
{0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},
{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00},
{0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},
{0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},
{0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00},
{0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00},
{0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},
{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F},
{0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20},
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00},
{0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00},
{0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80},
{0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00},
{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00},
{0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00},
{0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20},
{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00},
{0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00},
{0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00},
{0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00},
{0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00},
{0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40},
{0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00},
{0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00},
{0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
};
unsigned char code TITLE[8][16]={
//报(0)警(1)值(2):(3)
{0x10,0x10,0x10,0xFF,0x10,0x90,0x00,0xFE,0x82,0x82,0x82,0x92,0xA2,0x9E,0x00,0x00},
{0x04,0x44,0x82,0x7F,0x01,0x00,0x00,0xFF,0x80,0x43,0x2C,0x10,0x2C,0x43,0x80,0x00},/*"报",0*/
/* (16 X 16 , 宋体 )*/
{0x12,0xEA,0xAF,0xAA,0xEA,0x0F,0xFA,0x02,0x88,0x8C,0x57,0x24,0x54,0x8C,0x84,0x00},
{0x02,0x02,0xEA,0xAA,0xAA,0xAB,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xEA,0x02,0x02,0x00},/*"警",1*/
/* (16 X 16 , 宋体 )*/
{0x00,0x80,0x60,0xF8,0x07,0x04,0xE4,0xA4,0xA4,0xBF,0xA4,0xA4,0xE4,0x04,0x00,0x00},
{0x01,0x00,0x00,0xFF,0x40,0x40,0x7F,0x4A,0x4A,0x4A,0x4A,0x4A,0x7F,0x40,0x40,0x00},/*"值",2*/
/* (16 X 16 , 宋体)*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",3*/
/* (16 X 16 , 宋体)*/
};
unsigned char code WEIGHT[4][16]={
{0x10,0x10,0x14,0xD4,0x54,0x54,0x54,0xFC,0x52,0x52,0x52,0xD3,0x12,0x10,0x10,0x00},
{0x40,0x40,0x50,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00},/*"重",0*/
{0x20,0x20,0x20,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBE,0x20,0x20,0x20,0x00},
{0x00,0x80,0x80,0xAF,0xAA,0xAA,0xAA,0xFF,0xAA,0xAA,0xAA,0xAF,0x80,0x80,0x00,0x00},/*"量",1*/
};
unsigned char code PRICE[4][16]={
{0x00,0x00,0xF8,0x49,0x4A,0x4C,0x48,0xF8,0x48,0x4C,0x4A,0x49,0xF8,0x00,0x00,0x00},
{0x10,0x10,0x13,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x13,0x10,0x10,0x00},/*"单",0*/
{0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x90,0x0C,0x03,0x0C,0x90,0x20,0x40,0x40,0x00},
{0x01,0x00,0x00,0xFF,0x00,0x80,0x60,0x1F,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00},/*"价",1*/
};
unsigned char code TOTAL[4][16]={
{0x00,0x00,0x00,0xF1,0x12,0x14,0x10,0x10,0x10,0x14,0x12,0xF1,0x00,0x00,0x00,0x00},
{0x40,0x30,0x00,0x03,0x39,0x41,0x41,0x45,0x59,0x41,0x41,0x73,0x00,0x08,0x30,0x00},/*"总",0*/
{0x00,0x80,0x60,0xF8,0x07,0x40,0x20,0x90,0x0C,0x03,0x0C,0x90,0x20,0x40,0x40,0x00},
{0x01,0x00,0x00,0xFF,0x00,0x80,0x60,0x1F,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00},/*"价",1*/
};
unsigned char code YUAN[2][16]={
{0x20,0x20,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x20,0x20,0x00},
{0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00},/*"元",0*/
};
#endif