基于单片机的电子秤设计.docx
《基于单片机的电子秤设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子秤设计.docx(25页珍藏版)》请在冰豆网上搜索。
基于单片机的电子秤设计
多功能数字电子称
摘要
电子称是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。
它与我们日常生活紧密结合息息相关。
电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成。
电子称不但计量准确、快速方便,更重要的自动称重、数字显示,对人们生活的影响越来越大,广受欢迎。
本系统的设计主要从硬件电路设计,软件编程调试,实物焊接调试三部分进行详细阐述。
硬件电路主要是基于单片机STC89S52为核心的控制单元实现数据的处理,采用压力传感器对数据进行采集,电子称专用24位AD转换芯片HX711对传感器采集到的模拟量进行AD转换,转换后的数据送到单片机进行处理显示,数据显示由LCD1602液晶实现,液晶显示效果稳定无闪烁。
关键字:
STC89S52单片机;电子称;压力传感器;HX711。
目录
1绪论...................................................................................3
2方案设计..........................................................................4
2.1系统总体设计方案比较与论证....................................4
3硬件的方案设计..............................................................6
3.1传感器...........................................................................6
3.2单片机选型....................................................................7
3.3显示模块.......................................................................8
3.4AD模块.........................................................................8
3.5键盘输入......................................................................10
4电路设计..........................................................................10
4.1电源电路.......................................................................10
4.2单片机控制电路...........................................................11
4.3显示电路.......................................................................12
4.4系统原理图与PCB电路图..........................................12
4.5实物图展示...................................................................13
5原件清单..........................................................................14
6系统程序..........................................................................15
7参考文献..........................................................................20
8总结..................................................................................21
1绪论
称重技术自古以来就被人们所重视,作为一种计量手段,广泛应用于工农业、科研、交通、内外贸易等各个领域,与人民的生活紧密相连。
随着社会的进步、科学的发展,我们对其要求操作方便、易于识别。
随着计量技术和电子技术的发展,传统纯机械结构的杆秤、台秤、磅秤等称量装置逐步被淘汰,电子称量装置电子秤、电子天平等以其准确、快速、方便、显示直观等诸多优点而受到人们的青睐。
电子秤向提高精度和降低成本方向发展的趋势引起了对低成本、高性能模拟信号处理器件需求的增加。
通过分析近年来电子衡器产品的发展情况及国内外市场的需求,电子衡器总的发展趋势是小型化、模块化、集成化、智能化;其技术性能趋向是速率高、准确度高、稳定性高、可靠性高;其功能趋向是称重计量的控制信息和非控制信息并重的“智能化”功能;其应用性能趋向于综合性和组合性。
电子秤与机械秤比较有体积小、重量轻、结构简单、价格低、实用价值强、维护方便等特点,可在各种环境工作,重量信号可远传,易于实现重量显示数字化,易于与计算机联网,实现生产过程自动化,提高劳动生产率。
从世界水平看,衡器技术已经经历了四个阶段,从传统的全部由机械元器件组成的机械称到用电子线路代替部分机械元器件的机电结合秤,再从集成电路式到目前的单片机系统设计的电子计价秤。
我国电子衡器从最初的机电结合型发展到现在的全电子型和数字智能型。
现今电子衡器制造技术及应用得到了新发展:
电子称重技术从静态称重向动态称重发展;计量方法从模拟测量向数字测量发展;测量特点从单参数测量向多参数测量发展。
常规的测试仪器仪表和控制装置被更先进的智能仪器所取代,使得传统的电子测量仪器在远离、功能、精度及自动化水平定方面发生了巨大变化,并相应的出现了各种各样的智能仪器控制系统,使得科学实验和应用工程的自动化程度得以显著提高。
2方案设计
2.1系统总体设计方案比较与论证
在设计系统时,针对各个模块实现的功能来设计电子秤的方案有以下几种:
方案一数码管显示:
图1数码管显示方案
此方案利用数码管显示物体重量,简单可行,可以采用内部带有模数转换功能的单片机。
由此设计出的电子秤系统,硬件部分简单,接口电路易于实现,并且在编程时大大减少程序量,在电路结构上只有简单的输出输入关系。
缺点是:
硬件部分简单,虽然可以实现电子称基本的称重功能,但是不能实现外部数据的输入,无法根据实际情况灵活地设定各种控制参数。
由于数码管只能实现简单的数字和英文字符的显示,不能显示汉字以及其他的复杂字符,不能达到显示购物清单的要求。
又因为采用了具有模数转换功能的单片机,系统电路过于简单,系统硬件的扩展必受到限制,电子秤的功能过于单一,达不到设计的标准。
方案二在前一种方案的基础上进行扩展,增加一键盘输入装置,增加外界对单片机内部的数据设定,使电子称实现称重计价的功能。
结构简图如图2所示:
图2带有键盘输入的结构简图
此方案设计的电子秤,可以实现称物计价功能,但是局限于数码管的功能,在显示时只能显示单价、购物总额以及简单的货物代码等。
在显示重量时,如果数码管没有足够的位数,那么称量物体重量的精度必受到限制,所以此方案需要较多的数码管接入电路中。
这样在处理输入输出接口时需要另行扩展足够多的I/O接口供数码管使用,比较麻烦。
方案三前端信号处理时,选用放大、信号转换等措施来增加信号采集强度但会增加相应的设计成本;显示方面采用具有字符图文显示功能的LCD显示器。
这种方案不仅加强了人机交换的能力,而且满足设计要求,可以显示购物清单、所称量的物体信息等相关内容,当需要增加扩展功能时可以通过切换液晶显示界面的方式来实现。
结构简图如下图3所示:
图3带有键盘输入及液晶显示的结构简图
鉴于上述三种方案的优缺点,本系统在设计时充分考虑到系统的实用性及成本的可行性的前提下,设计完成了最终的电子称方案,最终的硬件设计方案图如图4所示,该方案增加了电子日历功能,从而使本系统的设计功能得到了很好的扩展与应用。
图4系统设计硬件框图
3硬件的方案设计
3.1传感器
传感器的变形量是很微小的,在安装、使用过程中要特别注意,不要超载。
如果在外力撤除后不能恢复原形状,发生塑性变形,则传感器就损坏了。
传感器有四根线连接外电路,红线为电源正极输入,黑线为电源负极输入,白线为信号输出1,绿线信号输出2。
为保正精度,一般不要随意调整线长。
图5
3.2单片机选型
单片机的选择在整个系统设计中至关重要,要满足大内存、高速率、通用性、价格便宜等要求,鉴于以上考虑本课题选择AT89S52作为整个系统的主控芯片。
AT89S52是一个低功耗,高性能CMOS8位单片机,片内含8kBytesISP(In-systemprogrammable)的可反复擦写10000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构[1],芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S52单片机的40个引脚中有2个专用于主电源引脚,2个外接晶振的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出I/O引脚。
AT89S52单片机引脚图如图4所示:
图6
3.3显示模块
采用点阵字符型LCD液晶显示,液晶显示模块具有体积小、功耗低、显示内容丰富等特点,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件LCD1602可以显示2行16个字符,有8位数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节和背光[4]。
LCD1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
图7
3.4AD模块
简介:
HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。
与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。
降低了电子秤的整机成本,提高了整机的性能和可靠性。
该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。
输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。
通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。
通道B则为固定的32增益,用于系统参数检测。
芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。
芯片内的时钟振荡器不需要任何外接器件。
上电自动复位功能简化了开机的初始化过程。
特点:
两路可选择差分输入
片内低噪声可编程放大器,可选增益为64和128
片内稳压电路可直接向外部传感器和芯片内A/D转换器提供电源
片内时钟振荡器无需任何外接器件,必要时也可使用外接晶振或时钟
上电自动复位电路
简单的数字控制和串口通讯:
所有控制由管脚输入,芯片内寄存器无需编程
可选择10Hz或80Hz的输出数据速率
同步抑制50Hz和60Hz的电源干扰
耗电量(含稳压电源电路):
典型工作电流:
<1.7mA,断电电流:
<1μA
工作电压范围:
2.6~5.5V
工作温度范围:
-20~+85℃
16管脚的SOP-16封装
图8
3.5键盘输入
矩阵式键盘又叫行列式键盘。
用I/O口线组成行、列结构,按键设置在行列的交点上。
例如,用2×2的行列结构可构成4个键的键盘,4×4行列结构可构成16个键的键盘。
因此,在按键数量较多时,可以节省I/O口线。
相对于专用芯片式可以节省成本,且更为灵活。
图94×4矩阵键盘
4.电路设计
4.1电源电路
由于该系统中51单片机及AD转换芯片及液晶显示器所需供电电压均为5V电压,所以要保证系统稳定可靠的工作,需要设计一个可以稳定提供5V电压的供电系统。
本设计采用双电源接口供电方式,USB接口供电方便程序调试,也可采用外置电源作为系统的供电电源,但是需另加三端稳压器件LM7805作为系统电源的稳压器件以保证系统电压为稳定的直流5V电压,同时外置电源的输出电压要高于5V输出,系统电源输入接口要加滤波电容以确保工作电压稳定。
电源输出接口加上LED电源指示灯,用来判定电源是否正常工作。
该系统电源电路设计如图11所示。
C1,C2实现对电源滤波,以滤除可能存在的高频杂波对电源的影响,C4实现对电源电压的平滑稳定作用[10],当USB接口输出电压高时C4用来储能,当后续电路负载过高USB供电不足时电解电容C4通过释放储存的电能来保证电源电压不跌落。
LED0用作电源指示,其亮灭代表电源工作与否,R0用来限流,
图10
4.2单片机控制电路
图11
系统主控电路由AT89S52单片机及晶振电路和复位电路组成,晶振和电容在电路中当作一个高Q值的电磁谐振回路。
复位电路是用来让单片机返回到初始状态的辅助电路,其作用是当单片机程序跑飞或系统出现死机状态时可以让系统从新恢复工作。
本系统复位电路的设计具有上电复位和手动按键复位两种复位方式。
4.3显示电路
显示部分采用LCD1602液晶显示模块,
1脚和2脚为液晶1602地和电源引脚,3脚为背光调节引脚,通过10K电位器接地,背光可通过电位器来调节亮度;4脚、5脚、6脚为液晶片选控制引脚,分别连接到单片机的P2.0、P2.1、P2,2端口,7~14脚为数据接口,与单片
机的P0口相连实现数据的传输,15、16、脚为液晶的背光控制脚,分别接到电源和地[9]。
图12
4.4系统原理图与PCB电路图
图13PCB图
图14系统原理图
4.5实物图展示
图15
5.原件清单
器件名称
器件型号
对应PCB位号
数量
1/4W电阻
0欧姆(代替跳线)
R7,R8,R9
3
1/4W电阻
1K
R0,R3,R4
3
1/4W电阻
2.2K
R6
1
1/4W电阻
10K
R1,R2,R5
3
10K排阻(103)
10K
RP1
1
整流二极管
1N4007
D0
1
电解电容
10u/16v
C6
1
电解电容
47U/25V
C4
1
电解电容
220U/16V
C1
1
陶瓷电容
30P
C7,C8
2
稳压芯片
78L05
U1
1
陶瓷电容
104
C2,C5,C14,C15,C16,C17,C18
7
三极管
S8550
Q1
1
AT24C02存储器带IC座
8PIC座
U3
1+1
蜂鸣器
5V有源蜂鸣器
BZ1
1
电源插头DC-005
CON2
J1
1
HX711模块插口
CON6
J4
1
4*4矩阵键盘
CON8
J6
1
晶振
12M
Y1
1
串口接口
DB9
J0
1
LCD1602液晶+排针
LCD1602
LCD1
1
LED发光二极管
LED
LED0
1
电平转换芯片
MAX232加座子
U2
1+1
单片机
STC89S52加座子
U4
1+1
5KG压力传感器带螺丝
带螺丝
1+4
8P弯排针
1
16P液晶底座
LCD1
1
秤盘
1
轻触按键
SO
1
PCB板子
1
按键开关
SW1
SW1
1
6.系统程序
#include"main.h"
#include"LCD1602.h"
#include"HX711.h"
unsignedlongHX711_Buffer=0;
unsignedlongWeight_Maopi=0;
longWeight_Shiwu=0;
charPrice_Count=0;
unsignedcharKEY_NUM=0;
unsignedcharPrice_Buffer[3]={0x00,0x00,0x00};
unsignedlongMoney=0;
bitFlag_OK=0;
//校准参数
//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
//该值可以为小数
#defineGapValue430
//****************************************************
//主函数
//****************************************************
voidmain()
{
chark=20;
Init_LCD1602();//初始化LCD1602
LCD1602_write_com(0x80);//指针设置
LCD1602_write_word("Welcometouse!
");//开机画面第一行
Get_Maopi();
Delay_ms(2000);//延时2s
loop:
Price_Count=0;
Price_Buffer[0]=0;
Price_Buffer[1]=0;
Price_Buffer[2]=0;
Flag_OK=0;
LCD1602_write_com(0x80);//指针设置
LCD1602_write_word("+WEI|PRI|MON");
LCD1602_write_com(0x80+0x40);//指针设置
LCD1602_write_word("0.000|.|.");
Get_Maopi();//称毛皮重量
while
(1)
{
if(Flag_OK==0)
{
if(k==0)
Get_Weight();
k--;
if(k<0)
{
k=20;
}
//显示当前重量
LCD1602_write_com(0x80+0x40);
LCD1602_write_data(Weight_Shiwu/1000+0x30);
LCD1602_write_data('.');
LCD1602_write_data(Weight_Shiwu%1000/100+0x30);
LCD1602_write_data(Weight_Shiwu%100/10+0x30);
LCD1602_write_data(Weight_Shiwu%10+0x30);
}
KEY_NUM=KEY_Scan();
if(KEY_NUM!
=0x55)//当返回的不是初值时候,确认按键按下。
{
if(KEY_NUM==16)//数字A键,去皮功能
{
Get_Maopi();//去皮
}
if(KEY_NUM==15)//数字B键清除键,二次测量
{
gotoloop;
}
if(KEY_NUM==12)//数字C输入单价错误时返回上一步
{
Price_Count--;
if(Price_Count<0)
{
Price_Count=0;
}
Price_Buffer[Price_Count]=0;//清除上一个输入的数据
switch(Price_Count)
{
case0:
LCD1602_write_com(0x80+0x40+6);
LCD1602_write_data('');
break;
case1:
LCD1602_write_com(0x80+0x40+7);
LCD1602_write_data('');
break;
case2:
LCD1602_write_com(0x80+0x40+9);
LCD1602_write_data('');
break;
default:
break;
}
}
if(KEY_NUM==13)//数字D键,计算总价
{
Money=Price_Buffer[0]*100+Price_Buffer[1]*10+Price_Buffer[2];
Money=Money*Weight_Shiwu/1000;
LCD1602_write_com(0x80+0x40+11);
LCD1602_write_data(Money/1000+0x30);
LCD1602_write_data(Money%1000/100+0x30);
LCD1602_write_data(Money%100/10+0x30);
LCD1602_write_data('.');
LCD1602_write_data(Money%10+0x30);
Flag_OK=1;
}
if(KEY_NUM>=0&&KEY_NUM<=9)//显示输入的价格值
{
Price_Buffer[Price_Count]=KEY_NUM;
switch(Price_Count)
{
case0:
LCD1602_write_com(0x80+0x40+6);
LCD1602_write_data(Price_Buffer[0]+0x30);
break;
case1:
LCD1602_write_com(0x80+0x40+7);
LCD1602_