基于单片机的应变电阻传感器的电子秤控制系统设计

摘 要

电子秤在日常生活中随处可见,随着市场化、商业化的发展,电子秤在生活中发挥的作用愈加明显,需求量日
益递增,但传统的秤不便携带,精度低,生产成本高,应用场所局限等缺点,已不满足现代的市场需求。为解决这
一困难,本文设计了一款小型高精度电子秤,称量范围为0-10Kg,精度为0.01g。以8051单片机为核心控制,采用应
变式电阻传感器进行数据采集、测量电路输出测量结果、电压信号放大、A/D转换、单片机处理、液晶显示等方法,
实现计价、除皮、超重报警等功能。
关键词:电子秤、应变式电阻传感器、单片机

第一章 绪 论

1.电子秤情况介绍:
  电子秤是衡器的一种,为计量器具,由承重、传力、示值三大部分组成,是一种进行称重操作和显示称量结果
的称重器具。如今,近代以来,社会呈现工业化、商业化发展态势,电子秤运用范围也随之越来越广,我国电子秤
需求量非常大,连续多年呈快速增长,致使电子秤技术得到迅速发展,取得重大突破。
  电子秤运用了现代传感器技术、电子技术和计算机技术,解决了生活中提出的“快速、准确、连续、自动”的
称量要求。电子秤的直接功能为测量物体质量,与传统的杆秤不同,电子秤在测重的基础上,还可以衍生其他特有
功能,如计价、扣重、累计等。
  电子秤因使用领域不同分为多种,分为一至四级。一级秤精度极高,常到达十万分之一以上,广泛应用于科研
实验室;二级秤主要为电子电平类产品。三级秤使用场合较多,如大、小地磅,电子台秤,电子吊秤等。四级秤运
用于商业且要求不高的场合,精度各方面要求配置都较为普通。不同的电子秤使用的传感器不同,一般常有电阻应
变式、压磁式、振弦式等。称重方式也有静态和动态之分。
  电子秤还因其能实现远距离操作,效率高,数字显示直观,减少人为因素造成的误差,精确度也高等优势特
点,受到人们的欢迎。
2.研究现状:
  日前,电子秤的研究已达到相对成熟的状态,技术、种类、规模等方面都具备较高的水准。国际上许多发达国
家在电子秤的准确性和可靠性方面的研究成果突出,产品结构和品种都有创新。
  回顾我国秤的发展历程,数百年来,我国都是以机械秤为主,国内电子秤起步晚,底子弱。呈现以下阶段发展特点:第一阶段始于20世纪60年代,开始研制和生产电子秤。第二阶段是20世纪80年代中后期,为数字式电子秤。
第三阶段是20世纪90年代末至21世纪初,初步研制出微机式产品,开始了数字式智能称重传感器的探索。认真吸取
和学习工业发达国家在电子秤领域的成功经验,有了质的飞跃,取得了许多可喜的成绩。近年来,在数字化称重传
感器的基础上,致力于智能化方面的研究。
  虽然我国目前技术与工艺不够先进,产品品种单一,功能不齐全,稳定性和可靠性不够,与世界工业发达国家
在数量和质量方面相比有一定的差距。但应该看到的是,有一些产品的技术也领先于国际水平。目前,我国正乘势
而上,提高市场核心竞争力,制造企业以技术为先导,加快新产品研发和着力于制造工艺水平的突破,努力使电子
秤技术含量达到更高水平。未来,将朝着小型化、模块化、集成化、智能化的趋势向前发展。
3.本设计研究内容:
  基于电子秤的现状,本次设计旨在在前人的基础上,综合考虑经济、环保、实用、功能实现等多重因素,在器
件的选择等方面下功夫,以实现设计出性价比更高的电子秤的初衷。
  本设计以分析应变式电阻传感器在电子秤中的应用为切入点,从应变片选择、设计测量电路、设计结构搭建等
多维度去研究,找到适合电子秤设计数据采集的最优方案。在完成传感器功能后,以计算机控制为总体方案,以数
据采集模块、控制器模块和人机交互模块为基础,研究设计一款称量范畴在0-10Kg,精度为0.01g,最大允许误差为
±2g,分度值e=2g的电子秤。本次设计研究用单片机进行控制的高精度电子秤,具备体积小、便于携带,计量准
确,操作简单的特点。可以实现称重、计价、除皮、超重报警等一系列功能。适用领域广,主要应用于黄金珠宝、
工业上精密零器件、药材称量等方面。
4.本文章节安排:
  为清晰的展现本设计过程及成果,本论文共分为七个大章节分板块介绍描述。其中第一章为绪论,介绍电子秤
的基本情况、研究现场、本设计的研究内容。第二章对应变式电阻传感器应用于电子秤设计中的具体分析。第三章
进行计算机控制总体方案的设计,确定结构框架和相应的最优器件。第四章进行系统硬件设计,又分7个小节的内容
进行一一介绍各个电路。第五章结合设计的硬件电路进行软件设计,分步阐述主程序和各子程序设计思路及方法。
第六章进行系统的仿真调试。第七章对本次设计及论文进行总结、展望。

第二章 应变电阻式传感器电子秤检测设计

2.1 传感器工作原理
  应变电阻传感器使用电阻应变计作为转换元件,弹性体在外部作用下产生弹性形变,使粘贴在弹性体表面上的
电阻应变片产生变形,从而导致阻值发生变化,经测量电路将电阻值的变化转换为电压信号,作为后续电路的输入
信号进行分析。
2.2 应变片的选型
为了使传感器的性能更好,在应变片的选择时,主要参考两个方面因素:应变片类型和敏感栅材料
  类型选择:金属电阻应变片有箔式和金属丝式。这里优选箔式应变片,其由敏感栅、引线、胶膜基底组成。主
要原因在于其散热性能好,允许通过电流大,可以提高相匹配的电桥电压,从而提高输出灵敏度等。
  敏感栅材料的选择:在分析材料时,基于灵敏度系数值大,而且在较大的应变范围内可以保持常数,电阻率
大,容易被拉丝和辗开,电阻温度系数小等多方面考虑,最终选定了镍铬合金作为敏感栅材料。
2.3 测量电路分析
  在传感器中,灵敏度、线性度是非常关键的两个静态特性,由于测量电路的设计不同,会导致不同的电压灵敏
度和非线性误差,从而影响测量结果。为了使输出结果更佳,所以在设计电路时需要分析不同电路时,灵敏度和线
性度的相关情况。
  电桥线路多种多样,这里选用直流电桥,将应变转换成电阻值的相对变化进一步转换成电压信号。测量电路又
分为单臂电桥、半桥差动、全桥差动。下面进行逐一分析,以选定最优方案(灵敏度尽量高,非线性误差尽量小为
宜)。
(1)单臂电桥:
将R1所在臂接上电阻应变片,其他桥臂固定不变,构成单臂电桥测量电路,如图所示。
根据以上电路,求得B点的电压:
=U (2-1)
同样,D点的电压:
= (2-2)
输出电压 为:
(2-3)
(2-4)
在上式中,设桥臂比n=R2/R1。在电桥平衡时,R2/R1=R4/R3。
因为 ,所以式中 /R1值忽略,故有:
= (2-5)
平衡时,桥臂比n=1。
由式2-5可计算得输出电压为:
= (2-6)
电压灵敏度Ku=
产生非线性误差为γ=
当R1=R2=R3=R4,即n=1时,γ=
若要减小非线性误差,则需提高桥臂比,但导致电压灵敏度减小,故需提高供电电压U。
(2)半桥差动:
将相邻的两个桥臂接入电阻应变片,构成半桥差动测量电路,如图所示。
根据以上电路,求得B点的电压:
=U
同求D点的电压为:
=U
若 = ,R1=R2=R3=R4
则输出电压 ==
(3)全桥差动:
将电压的四臂均接上电阻应变片,构成全桥差动测量电路,如图所示。
公式分析:
=U
=U
若 ;R1=R2=R3=R4
则输出电压 =
=U。
  基于以上分析,可以看出全桥差动测量电路的电压灵敏度最大,且无非线性误差。故最终选定用全桥差动测量
电路进行电压信号的采集。
2.4 电子秤传感结构设计
  基于前文分析,确定使用全桥差动测量电路,可以得出需要4个相同的电阻应变片(实际上,由于生产等原因,
没有绝对相同的两片,这里做近似处理)。
  电阻式力传感器的种类较多,有柱式、筒式、环式、梁式,各有各的特点。梁式传感器的设计结构简单,加工
方便,应变片容易被粘贴,灵敏度高,关键是适用于500N以下的载荷,最小可以测得零点几牛顿的力。由于本设计
为商用电子秤,其负荷较小(10kg),综合以上因素,选用了梁式传感器。然而,梁的形式也有多种:等截面梁、
等强度梁、双孔梁。双孔梁更多用于小量程电子秤,性能也更稳定,符合本题条件,故选用它。在这里插入图片描述

图2-4 双孔梁式力传感器测量原理
  结构原理分析:4个相同的应变片贴在周围,受力方向相同,串接形成了全桥差动电桥。传感器的输出与力的位
置没有关系,如果力的大小不变,那么传感器的输出几乎不变。在全桥测量电路中,力的作用位置改变引起的应变
分量在测量电路中相互抵消和补偿。作用于梁上的垂直压力P,使梁产生形变,电阻应变片R1、R3受压弯拉伸,阻值
增加;R2、R4受压缩,阻值减小。
  梁的材质及相关参数:在设计梁时,使用铝合金,其弹性模量较大。和其他材质相比,在灵敏度和应力状况都
相等的情况下,弹性体的刚度增加,使传感器更稳定。并且在加工生产过程中易加工。
本设计检测电压计算分析:
镍铬合金应变片的灵敏度系数为: =2.2
铝合金梁的弹性模量为:E=7× Pa
10Kg电子秤在满量程时承受压力为:F=98N
设计时梁的截面积为:S=2.5×
电源电为:U=5V
= =2.2 =
输出电压 = V

第三章 计算机控制总体设计

3.1 系统总体方案设计
  本设计系统总体分为三大模块,数据采集模块、控制器模块、人机交互界面模块。在数据采集时,首先使用应
变式电阻传感器,通过全桥差动测量电路对信号进行检测,将压力信号转换为微弱的电压信号。由于输入的电压信
号通常都非常小,所以需要通过信号放大电路将获得的电压信号放大一定的倍数,以符合后续需要。本设计以单片
机为主控制器,由于单片机只能处理数字信号,故需要将信号放大器输出的电压模拟信号通过A/D转换变为数字信
号,再传输给单片机进行数据处理。通过相应的程序最终实现既定功能。通过矩阵键盘和显示器进行数据的输入和
显示结果。称重物体超过量程时,报警电路开始作用。在这里插入图片描述

3.2 具体方案(器件)选择
3.2.1 信号放大器
  在信号放大器芯片的选择时不仅需要考虑到其放大倍数是否适宜,还要考虑其体积、功耗、噪声等基本特性。
放大器的选择情况多样,常见的有差动放大器和专用的测量放大器。
  前者比较常见,也是我们最为熟知的。其主要特点是:能够移除干扰共模信号,并补偿运放输入平均偏置电流
和漂移影响,但存在较大的测量误差,精密度较差,并且放大电路中需要两个相同的电阻,导致信号放大的精确度
受到影响。测量放大器是在传统的三运算放大器的基础上,内部结构由三个放大器组组成,使用时只需要接一个外
接电阻即可,按照一定的关系式调整阻值就可以使增益范围方便可调。主要特点是:其精度高(最大非线性度40 ppm),性能好、功耗低、集成度高、性价比高等特点。
  后者避免了差动放大器的缺点,基于保证增益较大且可调,外部接口相对简单,利于设计的考虑。这里选用在
电子秤中应用最多的AD620测量放大器
3.2.2 模数转换器
  经放大后的电压信号仍然是模拟信号,要将模拟量转换成数字量,以便后续处理,在此过程中,需进行A/D转
换。在选用A/D转换器的过程中,要考虑各种参数情况。其中分辨率、和转换速度是最关键因素,在选片时要首先考
虑。二者相互制约,所以在考虑时需折中选择。
本次设计需要将误差控制在0.01g以下,下面进行分析选型:
(1)20位A/D转换精度:10Kg/1048756=0.0095g<0.01g;
(2)22位A/D转换精度:10Kg/4194304=0.002g<0.01g,均能满足要求。
  这里采用精度更高的22位A/D转换器,选择具备低功耗、高分辨率等特点的Δ-Σ模数转换器——MCP3550。它有
自动的内部偏移和增益校准,可以减少设备误差,输出噪声低,仅有2.5μVrms,总不可调整误差小于10 ppm。适用
于需传感器的应用测量。
3.2.3 CPU
  单片机作为系统控制的核心器件,市面上的产品层出不穷,质量也参差不齐。要选好单片机,需要从以下几个
方面考量:根据性能、系统经济性、可靠性。在保证单片机的抗干扰性、稳定性的前提下,看运行速度、I/O数量、
定时/计数器(I/O)、工作电压范围、串行接口、模拟电路功能、技术是否成熟、是否方便购买。
  AT89C52单片机是一款低电压、高性能的CMOS8位单片机。片内含8KbyTES的可反复擦写的只读程序存储器
(PEROM)和256byTES的随机存取数据存储器(RAM)。采用了高密度、非易失性存储技术生产,功能强大。具有8字
节可重擦写FLASH闪速存储器,32个可编程I/0口线,3个16位定时/计数器8个中断源。功能齐全,可以有效的完成
电子秤系统的相关功能。同时,这也是我们学习中比较熟悉的单片机。以上特点与本次设计所需的对主控制器的要
求所契合,所以最后选用了AT89C52单片机。在这里插入图片描述

3.2.4 输出显示
常见的显示器件有数码管显示器和液晶显示器,下面进行对比分析:
  LED显示器使用电压低、在编程时更简单,并且在外界环境为强光时显示更加清晰,亮度高。但缺点也很明显,
显示的信息过于简单,无法满足电子秤显示需求,如单价、总额、时间等其他信息。如果要达到同样的功能效果,
就需要设计更复杂的电路,更复杂的编程。并且耗电快,结构尺寸大,使用寿命也相对较短。
LCD显示器刚好弥补了LED显示器的缺陷。显示信息更全面,结构简单,功耗低,抗干扰能力强。
  基于以上分析,本文选择了液晶显示器。LCD显示器的种类多,考虑到成本原因,性价比等因素,这里采用常见
的LCD1602液晶显示器。它的主要特点是:可以同时显示16×02即32个字符,能显示两行,每行16个字符(包括字
母、数字、符号等)。
3.2.5 键盘输入
  键盘输入是人机交互界面的一个重要部分,键盘又可以分为两类:独立式键盘和行列键盘。本设计的按键功能
需求较多,如果采用独立式按键,比较传统的做法是一个按键占用一个I/O口,随着按键数量的增加,被占用的I/O
口就会增加。为了节约I/O口资源,采用行列键盘,把按键排列成4×4矩阵,16个按键只占用8个I/O口。
3.2.6 超重报警装置
在报警装置中,主要涉及到两个器件的选择,下面进行逐一介绍。
  三极管的选择:当单片机通电后,I/O默认输出高电平,如果使用NPN型三极管驱动电路,则三极管的集电极和
发射极会因为受到基极的高电平而导通,蜂鸣器会持续响。若选用PNP型三极管,尽管有来自基极的高电平,也不会
导通,也就不会发声,如果需要发声,只需给基极一个低电平即可完成报警。
  蜂鸣器的选择:无源蜂鸣器便宜,声音频率可控,但需要接在音频输出电路中才可发声,直流信号无法使其鸣
叫。有源蜂鸣器内部有振荡源,通电即可发声,虽然更贵,但是使用方便,并且程序控制方便。
综上分析,选用PNP型三极管和有源蜂鸣器。

主程序:
#include <reg52.h>
#include "ConFig.h"
#include "LCD1602.h"
#include "keyboard.h"
#include "MCP.h"
#include "delay.h"
#define JIJIA 4
bit KeyPro_OK,num_flag;
unsigned long v,A,C;
unsigned int value;
uchar Key_Value,I;
unsigned char num1,num2;//单价数据 num1.num2
uchar NUM_code[]="0123456789.V";
void zroe(uchar x,uchar y)
{
LCD1602_Dis_OneChar(x++,y,'0');
LCD1602_Dis_OneChar(x++,y,'.');
LCD1602_Dis_OneChar(x++,y,'0');
LCD1602_Dis_OneChar(x++,y,'0'); 
}
void jijia()
{
uchar num_flag = 0;
uchar num_bit = 0;
LCD1602_Dis_OneChar(0,0,'V');//计价符号
LCD1602_Dis_Str(JIJIA+num_bit,0," ");
num1=0;
num2=0;
while(1)
{
21
Key_Value=KeyPro();
if(KeyPro_OK)
{
KeyPro_OK=0;
if(Key_Value>=0&&Key_Value<10)
{
if(!num_flag)
{
num1*=10;
num1+=Key_Value; //num1为单价整数部分
}
else
{ num2*=10;
num2+=Key_Value; //num2为单价小数部分
}
   LCD1602_Dis_OneChar((num_bit++)+JIJIA,0,NUM_code[Key_Value]);
}
else if(Key_Value==10)
{
   LCD1602_Dis_OneChar((num_bit++)+JIJIA,0,NUM_code[Key_Value]);
num_flag = 1;
}
else if(Key_Value==14)
{
LCD1602_Dis_OneChar(0,0,' ');//清楚计价符号
break;
}
else if(Key_Value == 12)
{
num_bit = 0;
LCD1602_Dis_Str(JIJIA+num_bit,0," ");
}
}
}
LCD1602_Dis_OneChar(0,0,' ');//清楚计价符号
}
void sum(unsigned int W) //价格计算
{
value = 0;
// if(num2/100) //小数有三位数据
// {
// value = W*num1*1000+W*num2;
// }
// else if (num2/10)
// {
// value = W*num1*100+W*num2;
// }
22
// else if (num2)
// {
// value = W*num1*10+W*num2;
// }
// else
// {
// value = W*num1;
// }
value =(unsigned int)(( W*num1*10+W*num2/10)/1);
for(I=15;value!=0;I--)
{
LCD1602_Dis_OneChar( I , 0 , NUM_code[value % 10 ]);//显示一位数据,显示数据位
value /=10;
if(I==14)
LCD1602_Dis_OneChar(--I,0,NUM_code[10]);
}
return;
}
int main()
{
unsigned int d;
Init_LCD1602();
LCD1602_Write_Cmd(0x01);
LCD1602_Dis_Str(1,0,"Y:");
zroe(4,0);
LCD1602_Dis_Str(9,0,"W:");
zroe(12,0);
Key_Value = 0; //按键扫描初始化,返回标志位置0
while(1)
{
v=MCP_Read();
v&=0x01FFFFF;
//按键选择
Key_Value=KeyPro();
if(KeyPro_OK)
{
KeyPro_OK = 0;
if(Key_Value==11) //计价模式
jijia();
else if (Key_Value == 13)
{
LCD1602_Write_Cmd(0x01);
LCD1602_Dis_Str(1,0,"Y:");
zroe(4,0);
LCD1602_Dis_Str(9,0,"W:");
zroe(12,0);
LCD1602_Dis_Str(0,1," 0.0g");
23
C=0;
A = 0;
num1 = 0;
num2=0;
}
else if(Key_Value == 15)
{
C=v;
}
}
//重量显示
A=(unsigned long)((v-C)*0.004768L*10);
//常参数=被测范围÷2^21 10的作用将原本只存储精度为1g,扩大到0.1g
//其真实重量 = A 乘以 0.1g 比如A=10,实际重量为1.0g
d= (unsigned int) A ;
Delay_Ms(10);
LCD1602_Dis_Str(0,1," g"); //清楚之前重量显示数据
for(I=14;A!=0;I--)
{
LCD1602_Dis_OneChar(I,1,NUM_code[A%10]);//显示一位数据,显示数据位
A/=10;
if(I==14)
{
I--;
LCD1602_Dis_OneChar(I,1,NUM_code[10]);//小数点显示
}
}
LCD1602_Dis_OneChar(I,1,NUM_code[A%10]);
//价格计算
sum(d );
}
}
A/D转换:
#include "MCP.h"
#include "ConFig.h"
#include <intrins.h>
#include "delay.h"
  //****************************************************
//读取HX711
  //****************************************************
unsigned long MCP_Read(void) //增益128
{
unsigned long DATA = 0;
unsigned char i;
MCP_SDO = 1; //释放SDO
// MCP_SCK = 1; //
24
MCP_SCK = 0;
MCP_CS=0;
while(MCP_SDO);
for(i=0;i<24;i++)
{
MCP_SCK=1;
DATA=DATA<<1;
MCP_SCK=0; 
// _nop_();
if(MCP_SDO)
DATA++;
}
MCP_SCK=1;
MCP_CS = 1;
return(DATA);
}
显示程序:
#include "ConFig.h"
#include "LCD1602.h"
void Read_Busy(void)
{
uchar busy;
LCD1602_DB = 0xff;
LCD1602_RS = 0;
LCD1602_RW = 1;
do
{
LCD1602_EN = 1;
busy = LCD1602_DB;
LCD1602_EN = 0;
}while(busy & 0x80); 
}
void LCD1602_Write_Cmd(uchar cmd)
{
Read_Busy();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_EN = 1;
LCD1602_EN = 0;
}
void LCD1602_Write_Dat(uchar dat)
{
Read_Busy();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
25
LCD1602_EN = 1;
LCD1602_EN = 0;
}
  void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
{
if(y) x |= 0x40;
x |= 0x80;
LCD1602_Write_Cmd(x);
LCD1602_Write_Dat(dat); 
}
void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
{
if(y) x |= 0x40;
x |= 0x80;
LCD1602_Write_Cmd(x);
while(*str != '\0')
{
LCD1602_Write_Dat(*str++);
}
}
void Init_LCD1602(void)
{
LCD1602_Write_Cmd(0x38);
LCD1602_Write_Cmd(0x0c);
LCD1602_Write_Cmd(0x06);
LCD1602_Write_Cmd(0x01); 
}
延时程序:
#include "ConFig.h"
#include "delay.h"
#include <intrins.h>
  //========================================================================
// 函数: void Delay_Ms(INT16U ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 自动适应主时钟.
  //========================================================================
void Delay_Ms(INT16U ms)
{
INT16U i;
do{
i = MAIN_Fosc / 96000;
while(--i) ; //96T per loop
}while(--ms);
}
  //========================================================================
// 函数: void Delay5us()
// 描述: 5us延时函数,自动适应11.0592M、12M、22.1184M主时钟。
26
// 参数: none.
  //========================================================================
//void Delay5us()
//{
// #if MAIN_Fosc == 11059200
// _nop_();
// #elif MAIN_Fosc == 12000000
// _nop_();
// #elif MAIN_Fosc == 22118400
// _nop_(); _nop_(); _nop_();
// #endif
//}
按键程序:
#include "keyboard.h"
#include "ConFig.h"
#include "delay.h"
extern bit KeyPro_OK;
bit KeyScan_OK;
//按键扫描函数 : 
//功能;只扫描一个按键,按键为号小优先 
//返回键值:
INT8U KeyScan() 
{
INT8U cord_l,cord_h;
KEY = 0x0f;
if( (KEY & 0x0f) != 0x0f)
{
Delay_Ms(5);
if( (KEY & 0x0f) != 0x0f)
{
cord_l = KEY & 0x0f;
KEY = cord_l | 0xf0;
cord_h = KEY & 0xf0;
while((KEY & 0xf0) != 0xf0 );
KeyScan_OK = 1;
return (cord_l + cord_h);
}
}
return 0;
}
INT8U KeyPro()
{
INT8U Key_Value;
Key_Value = KeyScan();
if (KeyScan_OK)
{
KeyScan_OK = 0;
27
switch(Key_Value)
{
//第一行键值
case 0xee: Key_Value = 1; break;
case 0xde: Key_Value = 2; break;
case 0xbe: Key_Value = 3; break;
case 0x7e: Key_Value = 11; break;
//第二行
case 0xed: Key_Value = 4; break;
case 0xdd: Key_Value = 5; break;
case 0xbd: Key_Value = 6; break;
case 0x7d: Key_Value = 12; break;
//第三行
case 0xeb: Key_Value = 7; break;
case 0xdb: Key_Value = 8; break;
case 0xbb: Key_Value = 9; break;
case 0x7b: Key_Value = 13; break;
//第四行
case 0xe7: Key_Value = 10; break;
case 0xd7: Key_Value = 0; break;
case 0xb7: Key_Value = 14; break;
case 0x77: Key_Value = 15; break;
}
KeyPro_OK = 1;
BEEP = 0;
// Delay_Ms(100);
BEEP = 1;
}
return (Key_Value)

第四章 系统硬件设计

4.1 单片机最小系统
  单片机如果需要正常工作,前提是基于要有一个最小系统。原因在于单片机里虽然集成了很多电路,集成了微
机的绝大多数功能部件,但仍然是不能独立运行的,必须要在外部连接一些简单的电路,才能使单片机运行起来。
  这里使用的AT89C52单片机属于AT89C51单片机的增强型,与Intel公司的80C52在引脚排列、硬件组成、工作特
点和指令系统等方面兼容。单片机工作时都需要有一个时钟电路和一个复位电路。本设计的AT89C52与时钟电路即晶
振电路(包括晶体振荡器、电容C1、C2)、上电复位电路(包括R15、C3、开关)构成单片机的最小系统。单片机最小系统电路图如图所示。在这里插入图片描述

1.晶振电路
  单片机的运行需要稳定的时钟脉冲,晶振电路又称时钟电路,为为单片机系统提供基本的时钟信号。晶体振荡
器选用11.05926MHz的高稳定无源晶体振荡器,它与AT89C52中的反向放大器构成振荡器,给CPU提供高稳定的时钟信
号。为满足谐振要求,外接电容C1、C2(又称“负载电容”),分别接到晶振的两端,每个电容的另一端再接到地,
使晶振两端的等效电容等于或接近于负载电容。电容C1、C2可以起到微调频率的作用,电容值一般在5pF-30pF之间
选择,本电路选30pF。电路如图所示。
2.复位电路
  为了避免出现“死机”、“程序走飞”等现象,在设计时要注意系统工作的可靠性与单片机复位电路设计的好
坏有着必然的联系。单片机启动时均需要复位,使CPU及所有部件全部处于初试状态,复位操作使微控制器返回初始化状态。本设计采用的手动按钮复位方式。
  复位操作简便,只需要给至少5毫秒的一个高电平到微控制器AT89C52即可,便可自动完成复位操作。因为人的
手动操作按钮时间最快也高于10毫秒,大于5毫秒,所以具有可行性。我们人为的在给复位输入端RS以高电平,在正
电源VCC和RST端之间接入一个按钮。按下按钮时,VCC端的高电平加到RST端。电路如图所示。
4.2 信号放大电路设计
  该设计中,当电子秤到达最大量程时,经测量电路输出的电压信号范围约为0-0.615mv。使用专用的测量放大器
进行信号放大,外部电路简单。
  通过引脚1和引脚8连接外接电阻R1来调整放大倍数。引脚4和引脚7分别接工作电压+5V和-5V。引脚5是输出参考
基准电压,接地。引脚6为对地的输出电压。引脚2和引脚3接传感器测量电路的输出电压。
  将0.615mv的电压放大5000倍,大约为3.075V,此时满足设计要求。这里需要注意的是,在选择外加工作电压
时,如果放大后的电压越接近外加的电压,产生的误差会越大。
由增益方程式:
G= +1
可计算出:
KΩ=9.88Ω
4.3 A/D转换电路设计
  A/D转换一共经历了取样、保持、量化和编码几个步骤。选用的此芯片共有8个引脚,VIN+和VIN-引脚接放大
器,接收输入的模拟信号,因此处放大器只有一个输出,并相对于地,故把负输入接地,U0接正输入。VREF为基准
电压(5V),作为芯片工作的参考电压,输入电压在0-5V范围内时,可以有效的、准确的进行模数转换。VDD和VSS分别作接5V电压源和接地处理。SD0/RDY作为数据输出口接单片机P2.4口。SCK是串行时钟数字输入,将数据通信与
设备同步,AD采样芯片是靠时钟驱动采样的。CS为片选引脚,低电平时进行模数转换。在这里插入图片描述

4.4 按键电路设计
  根据设计功能要求,按键采用了4×4的行列式键盘(矩阵键盘),16个按键分别是数字键0~9、小数点键和5个
功能键(计价、计价清零、去皮、重置、确认),键盘面板如图所示。
  每个按键均在行与列的交点上。按键开关的两个引脚分别接在行线和列线上。当某个按键被按下时,该按键所
连接的行线和列线被短接。为区分按键是否被按下,用单片机引脚采集到高低电平对应。没有被按下时,单片机引
脚采集到高电平,反之为低电平。为准确检测到被按下的键,将行线做输出,依次输出低电平,列线做输入均为高
电平。如果列线输入从高电平变为低电平,则低电平所在行和列交点处的按键被按下。4根行线经过一次输出低电平
的循环,单片机便可以检测出所有按键状态。单片机无限循环地扫描4根行线,使其不停地轮流输出低电平,同时单
片机不停地采集列线对应的引脚电平变化情况。
在连接I/O线时,选用的P1口,内部自带上拉电阻,省略了外部的上拉电阻。电路图如图所示。在这里插入图片描述

4.5 显示电路设计
这里的LED1602是14条引脚线的。接线设计如下:
VSS:接地。
VDD:接+5V电源。
VEE:接入一个10KΩ的电位器。目的是为了使液晶显示对比度可调(接正电源时,对比度最弱;接地时,对比度最
高)。
RS为数据/命令选择端:接单片机P2.1口,高电平时,输入数据;低电平时,输入指令。
R/W为读写选择端:接单片机P2.2口,可以高电平从液晶显示模块读取数据,低电平写入数据。
引脚E为使能信号:接单片机P2.3口,与1602的读写操作时序相关,产生高电平脉冲。
  D0-D7引脚为8位并行数据端口:分别接单片机的P0.0口-P0.7口。由于P0口内部没有上拉电阻,是开漏的,不管
它的驱动能力多大,相当于它是没有电源的,需要外部的电路提供,所以P0口接上10KΩ的上拉电阻。在这里插入图片描述

4.6 报警电路设计
  超重报警是电子秤设计中比较重要的一环,本设计设定了上限报警,电子秤设置一个10Kg的重量值。报警原理
如下:测量物体在0-10Kg的量程范围时,单片机的P2.0端口输出高电平到PNP型三极管的基极,导致三极管不导通,
电路不工作,蜂鸣器不会发出报警声。反之,当被测物体重量在允许量程范围时,单片机的P2.0端口会产生低电
平,传输给PNP型三极管的基极,导致PNP型三极管导通,电路驱动蜂鸣器,产生报警声。
  这里三极管的主要作用是给蜂鸣器提供驱动工作电流。因为单片机的I/O口电流有限且不安全,一般I/O口的信号
只做控制其它器件用,不做驱动用。当三极管导通后驱动蜂鸣器的能量由VCC供,功率、安全都得到了保证。
  三极管的发射极接电源,基极集电极接蜂鸣器的正极,负极接地。为了避免控制端可能会损坏元件,三极管有
可能也会损坏。这里通过将基极接一个10KΩ的基极偏置电阻,用于限制基极电流,并接单片机的P2.0口。
4.7 电源电路设计
  本设计中电子秤使用采用低电源电压,由电池供电。这里采用两节干电池,升压模块,保证稳压电源供电,外
围电路简洁明了,由一个贴片电感和两个贴片电容组成升压系统。PW5200A的输入电压范围在1.4V-4.4V,输出电压
为2.5V-5V。芯片引脚EN高电平时工作。GND接地。VIN和SW之间接电感器。R1和R2为反馈电阻。COUT具有稳压滤波作
用。电路如图所示。
在这里插入图片描述

第五章 系统软件设计

5.1 软件说明总体说明
1.编程思路:根据前面对硬件电路的设计,该电子秤只需要对单片机进行编程来完成对整个系统的控制。AT89C52单
片机作为一种8051单片机,是本次设计的核心控制芯片,它通过I/O口的高低电平控制,来实现对外部电路进行控制
与信号接收。同时它能够对数据进行计算处理,并具有存储数据的功能,只需要编写相应的程序就能实现。系统软
件设计主要有以下几个部分:按键模块子程序、显示模块子程序和A/D转换模块子程序。
2.编程语言及软件:
  (1)这里选用C语言来对该系统进行编译。C语言相对于其他语言,它可维护性强,且具有良好的程序结构,适
合进行本系统这类模块化程序设计。
  (2)这里选用Keil4软件进行程序的编译。下面简单的介绍其使用方法:首先建立项目文件,uVision4采用的
是项目方式管理,一个项目放在一个文件夹,建好后启动。其次给项目添加程序文件,若程序文件已建好,课直接
添加,若没有,则需先建立程序文件。然后编译、连接项目,形成目标文件,在进行此操作时,若程序有错,则编
译不成功,可以根据提示信息进行修改,修改后也可能再次错误,修改至成功为止。以上流程都成功地完成后,最
后运行调试观察结果。
5.2 主程序设计
首先,对该电子秤进行初始化,在第1行最前面写上写上“Y:”。
  然后进入主程序循环,读取模数转换器传输过来的重量原始数据。由于模数转换得到的原始数据是24位,其中
最高位的三位,两位用来判断该数据是否有效,一位是符号位。将这个原始数据与0x01FFFFF相与,用来对该原始数
据进行初步的处理。
  这里对按键进行扫描,当按下11号按键的时候,进入计价模式。当按下13号按键的时候进入重置模式。有一个
按键为计价清零,可以在计价模式时清除已经输入的数字。按下15号按键的时候,进行去皮操作。其他按键分别对
应0~9这10个数字,在计价模式中使用。
在这里插入图片描述

图 1 按键功能程序设计
  在重量与价格显示的时候,编译程序用来对接收到的原始重量数据进行计算和处理,最终得到重量与价格,并
在LCD上显示出来。在这里插入图片描述

图 2 数据处理程序
5.3 A/D转换子程序设计
在这里插入图片描述

图 5-3 AD转换程序流程图
  模数转换的片选引脚跟单片机连接,使用时首先在单片机输出信号来打开片选,然后再将数据输出引脚置1,时
钟信号置0。当检测到数据输出引角信号为1的时候,开始接收模数转换器传输过来的数据。在接收数据时,先将时
钟信号置1,将用来存储该数据的变量左移1位,然后再将时钟信号置0。如果此时数据输出引脚接收到高电平,则储
存该数据的变量加1。由于该模数转换器是24位的,因此一组完整的数据需要将上述流程重复24次,最终得到24位二
进制数,并储存在变量中。在对该变量进行处理后,就得到了模数转换后的原始数据。完成数据传输后,校准数
据,然后设置片选信号用于关闭模数转换模式。
5.4 按键模块子程序设计在这里插入图片描述

在主程序初始化之后,进入按键扫描模式。为消除抖动现象,采用软件延时的方法解决。然后由单片机进行按
键码分析,在这里按下按键时,如果按下的是计价、重置或去皮这三个按键,则执行相应的功能。若按下的是0~9这
10个数字按键,或者确认按键及“.”键,则不做反应。当按下计价按键后,进入计价菜单,这里继续进行按键扫
描。当按下0~9这10个数字时进行单价设置,若输入错误,则可按下计价清零来清除,输入完成后按下确认按键完成
单价设置功能。相应模块在执行完后,显示后再返回。
5.5 显示模块子程序设计
在这里插入图片描述

图 3显示
  LCD1602的RS数据/命令选择端用来选择寄存器,RW读写/选择端,用来选择使用读操作还是写操作,这里我们只
需要用到写操作。通过数据传输引脚,将指令发送到LCD1602并执行。在写程序的时候通过配置RW和RS,然后再通过
数据传输引脚接收指令。随后,判断执行完成情况,若命令完成,则将数据显示出来,退出子程序。如若没有,则
返回到选择指令寄存器,重复执行相关步骤。本设计中还针对不同的需求,封装了不同的函数用于调用。

第六章 系统仿真

6.1 仿真软件介绍
  Proteus是目前非常先进、完善的硬件系统设计和软件仿真的平台。是常用的电路分析和实物仿真软件。分为两
个版本:分别是ISIS(用于仿真设计)和ARES(用于PCB电路板设计)。Proteus具备以下几个重要特点:可以将单
片机仿真和分析电路仿真结合,仿真范围广,用于模拟电路、数字电路及单片机系统组成的仿真,虚拟仪器种类丰
富,功能多样化,界面清楚。能识别和支持8051系列、68000系列、HC11等主流系列的单片机系统仿真。能够绘制原
理图,PCB设计,单片机编程,支持多种第三方软件编译和调试环境并且能进行软件调试功能。其仿真的结果与实际
结果虽不是十分精确,但也很接近。将Keil软件和Proteus联合,搭建强大的联合调试环境。

第七章 总 结

7.1 项目的经济及相关安全与环境影响分析
  一个项目之所以能得以社会认可和发展下去,在于其设计时对经济性、安全性和对环境影响的分析。本设计从
设计方案的选定,到设计过程和最终完成设计,一直将这几类因素着重考虑。
  由于设计的电子秤精度高,适用的环境相对特殊,本设计在选用器件时,不一定是最便宜的,但是性价比更高
的。在分析经济因素时,没有片面地只看单看价位,还注重其性能,如平均使用寿命,维护时的代价等情况,这些
因素都会间接地影响到经济性,需要综合分析。基于这样的考虑,在选择器件时进行了横向、纵向的对比,最终选
择了一套更合适的器件方案,使成本更低。
  在设计时,安全与环境因素极为重要,甚至具有“一票否决权”,无论其他方面做得多好,只要安全、环境因
素指标不达标,都是徒劳,甚至还会带来其他影响。所以,本项目在设计时,践行绿色发展理念,选用的均为环保
材料,禁止对环境产生影响,相关标准的参数也严格按照国家标准进行。在项目的前中后期及在投入生产和用户使
用期间,乃至废弃后,始终保持环保、节能、无污染。
7.2 全文总结
  本次设计一共经历从选题、审题、阅读文献、知识的补充学习、设计方案的选定,再到具体的设计,到现在接
近尾声。从开始的模糊到现在的熟悉,经过几个月的努力探索,终究功夫不负有心人,得以设计能够顺利完成,也
基本达到了设计初衷。
  电子秤的设计流程虽然简单,但要把许多模块前后连接起来,使最后能够呈现出结果,需要知识的综合运用。
此次设计用到的基础知识多,如传感器模电、数电、单片机、C语言等,要把这些知识融会贯通,将理论知识用于实
践,往往存在许多困难。本次设计就是一次攻坚克难的过程。
  这次设计以AT89C52为控制核心,设计了传感器测量电路、信号放大电路、A/D转换电路、按键电路、显示电
路、报警电路及电源电路等硬件设计。在硬件设计时,以更简单的电路实现更完善的功能为导向,并且对设计原理
进行了了说明。是进行软件的设计,在软件设计时,用了最熟悉的语言编写,在文中给出了主程序和各个子程序模
块的流程图,并通过易懂得叙述,使整个设计思路呈现在他人面前。通过许多次的修改,在顺利完软硬件的设计
后,实现了本设计电子秤的目标功能。如去皮功能,在本电子秤若用于中药材或精密器件等的称量时常用到。通过
矩阵按键,完成计价等功能,并自动显示出结果。报警功能,有效的避免了对电子秤的机械损坏。但基于自身能力
和时间的有限,本次设计也存在一些不足,如功能不够强大,许多高精尖的功能未能实现。还需要加深这方面的研
究,以适应于更广的领域,给使用者更便捷的体验感。
  通过本次毕业设计,我的思维、动手能力都有了明显的提升,也进一步巩固了知识,对设计的认识从宏观到微
观的改变。作为一名工科生,若能够将所学有所用是最自豪的。
7.3后续工作展望
  电子秤的研究相对较为成熟,要想在这一方面有所突出和创新,需要知识的不断积累。人生是一个学习的过
程,我将以此次毕业设计为契机,刻苦学习,增强自身的研究能力。未来,将继续关注电子秤领域发展方向,不满
足于设计出一款基础的电子秤,争取在电子秤方面做出新的成绩。在未来研究方面,使其使用范围和环境更广,功
能更加完善,更加智能化。

致 谢

时至今日,在本科论文完成之际,也不全是喜悦之情,心中百感交集。回想多年的学习和生活,一路走来,太
多的人和事值得我向他们表达谢意。还未开始写论文时,就有太多的言语想要表达致谢,而如今又不知从何开始谈
起。
  小时候出生在一个到镇上还需要翻山过河数小时的偏远山村。由于地理条件的限制,到了入学时,还从未尝过
幼儿园的甜,就被“保送”到村上唯一的村小。雨天时,山路遇上滑坡、河里涨水是常态。好在结伴而行的还有比
我大几岁的伙伴,在路途中过不去时经常拉扯我一把,保证能够按时上学、安全回家,谢谢他们!小时候和爷爷奶
奶在家,那个时候,总是觉得家里做不完的农活。除了读书之外,一年四季的农活家务从未缺席,挖地、播种插
秧、夏日顶着酷暑掰玉米、打谷子说干就干,我相信儿时吃过的苦终究会尝到甜头。感谢我的爷爷奶奶,从小教会
了我要永远勤劳、奋斗和善良的人生道理,受益终身!后来,家里在镇上买了房子,我也终于去到镇上读书,可由
于基础薄弱,导致学习困难,但老师们总是耐心地讲解,这才有了对读书的认知和感觉,绵绵师恩,永志难忘!一路念书从村小到镇上再到县城初中,最后考上市里的高中继而步入大学。在这里,感谢家人通过他们的勤劳在我学
习上为我创造的物质条件、学习环境,以及精神鼓励和教育,让我成为了从村里同龄中走出来的为数不多的大学
生。而遗憾地是,就在此前一个多月,奶奶还来不及看到我大学毕业和成家立业,一场突发的疾病就让她永远地离
开了我。
  大学是人生中最美好的几年,而我好像备受上天眷顾,所幸遇见一群可敬可亲可爱的人。在这里遇到了令人最
敬佩的老师,他们知识渊博、待人和善,在我学习和生活中,都给予了我莫大的帮助和鼓励,教会我的不仅是专业
的知识,还有做事的道理。这里特别感谢本次毕业设计的指导老师——陈昌忠老师,陈老师以严谨的学术、负责的
态度、平易近人的相处方式在设计过程中给予了许多建议和指导。在这里遇到了优秀的同窗和好友,他们积极上
进,对学习的热情深深地激励着我,也一直理解和支持着我。当然还有亲爱的恋人,不论开心难过时,都一直陪伴
着我。
凡是过往,皆为序章。仅以此文,感谢人生至此所遇之人、所遇之事,感谢见到的每一处美好或不那么美好的风
景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值