电子秤 毕业设计.docx
《电子秤 毕业设计.docx》由会员分享,可在线阅读,更多相关《电子秤 毕业设计.docx(17页珍藏版)》请在冰点文库上搜索。
![电子秤 毕业设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/3/86a50982-05f7-4e0c-97ef-fb15a144e14a/86a50982-05f7-4e0c-97ef-fb15a144e14a1.gif)
电子秤毕业设计
目录
目录1
1.设计要求2
2.方案设计2
2.1设计思路2
2.2设计方案2
2.2.1.控制器部分2
2.2.2数据采集部分3
2.2.3A/D转换器4
2.3人机交互部分5
2.3.1键盘输入5
2.3.2显示输出5
3.部分电路设计5
3.1前端信号处理5
3.2模数转换电路6
4.软件组成7
4.1程序流程图7
4.2键盘服务程序7
4.3模数转换程序8
5.使用操作说明8
6.调试与检测8
7.设计小结9
附录1仿真电路图10
附录2部分源程序11
电子秤设计
摘要
本系统采用单片机AT89S52为控制核心,实现电子秤的基本控制功能。
系统的硬件部分包括最小系统板,数据采集、人机交互界面三大部分。
最小系统部分主要是扩展了外部数据存储器,数据采集部分由压力传感器、信号的前级处理和A/D转换部分组成。
人机界面部分为键盘输入和128
64点阵式液晶显示,可以直观的显示中文,使用方便。
软件部分应用单片机C语言实现了本设计的全部控制功能,包括基本的称重功能、累计计费功能、去皮功能以及显示购物清单的功能,可以设定10种商品的单价,由于系统资源丰富,还可以方便的扩展其应用。
1.设计要求
设计一个实用电子称电路。
要求用仿真软件对电路进行验证,使其满足:
能用简易键盘设置单价,对采集到的代表重量的信号能同时显示重量、金额和单价;重量显示的单位为公斤,最大称重为9.999公斤;单价和总价的单位为元,最大金额数值为9999.99元;具有去皮功能和总额累加计算功能。
自拟10种商品名称,能显示购物清单,清单内容包括:
商品名称,数量,单价,金额,本次购物总金额、购货日期、收银员编号和售货单位名称,具有中文显示功能。
2.方案设计
2.1设计思路
根据设计要求,首先要实现电子秤的称重基本功能,需要通过重量传感器采集到的重量信号,经处理后由模数转换转换成数字量,因此每一数字量就对应着一个物体的重量(在一定精度范围内),所以只要将转换的数字量与物体重量建立映射的关系即可完成称重的要求。
而其他功能这可通过程序运算来实现。
总体结构框图如下:
2.2设计方案
2.2.1.控制器部分
本系统基于51系列单片机来实现,因为系统需要大量的控制液晶显示和键盘。
不宜采用大规模可编程逻辑器件:
如CPLD、FPGA来实现。
(因为大规模可编程逻辑器件一般是使用状态机方式来实现,即所解决的问题都是规则的有限状态转换问题。
本系统状态较多,难度较大。
)另外系统没有其它高标准的要求,我们最终选择了AT89S52通用的比较普通单片机来实现系统设计,其内部带有8KB的程序存储器,可以满足系统设计需求。
2.2.2数据采集部分
1)传感器
题目要求称重范围9.999Kg,考虑到秤台自重、振动和冲击分量,还要避免超重损坏传感器,所以传感器量程必须大于额定称重—9.999Kg。
我们选择的是L-PSIII型传感器,量程20Kg,精度为
,满量程时误差
0.002Kg。
可以满足本系统的精度要求。
其原理如下图所示:
称重传感器主要由弹性体、电阻应变片电缆线等组成,内部线路采用惠更斯电桥,当弹性体承受载荷产生变形时,输出信号电压可由下式给出:
2)前级放大器部分
压力传感器输出的电压信号为毫伏级,所以对运算放大器要求很高。
通过综合考虑我们采用专用仪表放大器芯片,如:
INA126,INA121等。
此类芯片内部采用差动输入,共模抑制比高、差模输入阻抗大、增益高、线性度好,并且外部接口电路简单。
以INA126为例,引脚电路如下图所示:
放大器增益
,通过改变
的大小来改变放大器的增益。
2.2.3A/D转换器
由上面对传感器量程和精度的分析可知:
A/D转换器误差应在
以下。
12位A/D精度:
10Kg/4096=2.44g
14位A/D精度:
10Kg/16384=0.61g
考虑到其他部分所带来的干扰,12位A/D无法满足系统精度要求。
所以我们需要选择14位或者精度更高的A/D。
方案一、逐次逼近型A/D转换器,如:
ADS7805、ADS7804等。
逐次逼近型A/D转换,一般具有采样/保持功能。
采样频率高,功耗比较低,是理想的高速、高精度、省电型A/D转换器件。
高精度逐次逼近型A/D转换器一般都带有内部基准源和内部时钟,基于89C52构成的系统设计时仅需要外接几个电阻、电容。
但考虑到所转换的信号为一慢变信号,逐次逼近型A/D转换器的快速的优点不能很好的发挥,且根据系统的要求,14位AD足以满足精度要求,太高的精度就反而浪费了系统资源。
所以此方案并不是理想的选择。
方案二、双积分型A/D转换器:
如:
ICL7135、ICL7109等。
双积分型A/D转换器精度高,但速度较慢(如:
ICL7135),具有精确的差分输入,输入阻抗高(大于
),可自动调零,超量程信号,全部输出于TTL电平兼容。
双积分型A/D转换器具有很强的抗干扰能力。
对正负对称的工频干扰信号积分为零,所以对50HZ的工频干扰抑制能力较强,对高于工频干扰(例如噪声电压)有良好的滤波作用。
只要干扰电压的平均值为零,对输出就不产生影响。
尤其对本系统,缓慢变化的压力信号,很容易受到工频信号的影响。
故而采用双积分型A/D转换器可大大降低对滤波电路的要求。
积分型A/D转换器可大大降低对滤波电路的要求。
作为电子秤,系统对AD的转换速度要求并不高,精度上14位的AD足以满足要求。
另外双积分型A/D转换器较强的抗干扰能力,和精确的差分输入,低廉的价格。
综合的分析其优点和缺点,我们最终选择了ICL7135。
2.3人机交互部分
2.3.1键盘输入
键盘输入是人机交互界面中最重要的组成部分,它是系统接受用户指令的直接途径。
我们通过综合考虑采用了专用的键盘管理芯片74C922。
在电子计价秤中,带有16个按键矩阵组设置,其中0—9数字键用于输入单价及商品代码,DEL用于单价清空,累计键用于费用累计,去皮键用于重量去皮,还设置有一个转换键和退出键。
鉴于此,我们采用专用键盘管理芯片74C922。
74C922为CMOS工艺技术制造,工作电压为3—15V,“二键锁定”功能,编码输出为三芯输出,可直接与微处理器数据线相连,内部振荡器完成4×4矩形键盘扫描,有按键时,DA变高,通过非门接到AT89C51的INT1口,并且设INT1为边沿触发方式,当DA变高时,经过非门变为低电平跳变产生INT1外部中断,使AT89S52从数据总线读按键值,判断键值从而完成相应的程序功能。
根据接线图及74C922芯片真值表,我们可以将数字键0—9、键DEL、转换键、退出键、累加键和去皮键与ABCD输出(0000—1111)建立一一对应的关系,接线图见下图。
2.3.2显示输出
由于设计题目要求中文显示,而数码管无法满足,只能考虑用带有中文字库的液晶显示器。
由于可以分页显示,无需太大屏幕,我们选择了点阵式128×64型LCD。
3.部分电路设计
3.1前端信号处理
INA126构成的放大器及滤波电路:
通过调节
的阻值来改变放大倍数。
微弱信号Vi1和Vi2被分别放大后从INA126的第6脚输出。
A/D转换器ICL7135的输入电压变化范围是-2V~+2V,传感器的输出电压信号在0~20mv左右,因此放大器的放大倍数在200~300左右,可将
接成
的滑动变阻器。
由于ICL7135对高频干扰不敏感,所以滤波电路主要针对工频及其低次谐波引入的干扰。
因为压力信号变化十分缓慢,所以滤波电路可以把频率做得很低。
3.2模数转换电路
基于ICL7135的A/D转换器实现电路:
由于ICL7135内部没有振荡器,所以需要外接。
ICL7135的时钟频率典型值为200kHz最高允许为1200kHz,时钟频率越高,转换速度越快。
每输出一位BCD码的时间为200个时钟周期,选通脉冲位于数据脉冲的中部,如果时钟频率太高,则数据的接受程序还没有接受完毕,数据就已经消失了。
考虑到此系统频率要求不是太高,且单片机的工作频率也不是很高,因此我们取时钟频率的典型值:
200kHz。
此外ICL7135外部还需要外接积分电阻、积分电容,由于A/D转换器精度与外接的积分电阻、积分电容的精度无关,因而可以降低对元件质量的要求。
ICL7135还需要外接基准电源,这是因为芯片内部的基准源一般容易受到温度的影响,而基准电源的变化会直接影响转换精度。
所以当精度要求较高时,应采用外接基准源。
一般接其典型值1V。
4.软件组成
4.1程序流程图
4.2键盘服务程序
键盘段程序采用中断方式,单有键按下时,引入一个外部中断,单片机响应中断后立即查询所按键值,并对应存入相应的全局变量中。
中断返回后,通过在主程序中不断判断个功能标志位的值来实现在各个功能间的切换;数字键则用来输入单价和选择商品名称。
-
4.3模数转换程序
模数转换子程序主要功能是实现对转换结果的处理,包括转换的启动、等待转换完成并读入转换结果,以及对转换结果的换算,使之与所要达到的要求建立一一对应的关系。
5.使用操作说明
本系统采用16键键盘来实现,分为10个数字键0-9及6个控制键。
数字键:
用于输入单价和选择所存商品;
累加键:
相当于确认,可以将当前信息保存至购物清单;并且将金额累加,得到所购买商品的总金额。
去皮键:
用于去除皮重;
清除键:
用于输入单价错误的时,重新输入;
退出键:
用于退出当前模式,回到普通模式;
模式转换键:
按下后可直接输入商品代码,并可以显示购物清单。
另外,已存入的10种商品的单价均可重新设置,直接输入其单价即可,方便实用。
如果所称重物超过了系统最大量程10Kg,则蜂明器发出报警声音。
6.调试与检测
通过分块调试和整体调试相结合,发现不足并逐步调整,最后各部分工作正常。
所设计的电子秤仿真系统能基本的满足设计要求,能较好的实现普通称重、累加计费、去皮以及输入商品并显示购物清单的功能。
以下为个功能下的LCD显示:
7.设计小结
本仿真设计虽能基本上满足设计要求,但很大程度上仍需较大的改进。
首先,数模转换只能作为演示程序以实现功能之用,而要使精度达到要求,至少要使用14位或以上的AD;
其次,程序比较冗杂,仍需优化。
再次,通过此次设计,深感一个团队的重要性。
由于组队仓促,再加上相互间了解不多,以至同组队员中途放弃。
个人之力总有局限,难以完成所有要求。
附录1仿真电路图
附录2部分源程序
1.LCD显示程序:
voidpulse()
{
e=1;e=0;
}
voidbusy_check(charright)
{
P0=0xff;
if(right==1)
{
P2=0x13;//P2=0x13;
while(!
busy);
}
if(right==0)
{
P2=0x0b;//0b
while(!
busy);
}
}
voidcmd_w(charcmd,charright)
{
busy_check(right);
if(right==1)
P2=0x10;
if(right==0)
{
P2=0x08;
P2=0x08;
}
P0=cmd;
pulse();
}
voiddata_w(chardat,charright)
{
busy_check(right);
if(right==1)
P2=0x14;//0x14
if(right==0)
P2=0x0c;//0c
P0=dat;
pulse();
}
voidlcd_init()
{
uinti;
cmd_w(0x3e+1,0);//显示开关
cmd_w(0xc0+0,0);//修改显示起始行
cmd_w(0xb8+0,0);//修改页地址
cmd_w(0x40+0,0);//修改列地址
cmd_w(0x3e+1,1);
cmd_w(0xc0+0,1);
cmd_w(0xb8+0,1);
cmd_w(0x40+0,1);
for(i=0;i<256;i++)
data_w(0x00,0);
cmd_w(0xb8+4,0);
cmd_w(0x40+8,0);
for(i=0;i<256;i++)
data_w(0x00,0);
for(i=0;i<256;i++)
data_w(0x00,1);
cmd_w(0xb8+4,1);
cmd_w(0x40+8,1);
for(i=0;i<256;i++)
data_w(0x00,1);
}
charchang(chara)
{
chartemp,i;
for(i=0;i<8;i++)
{
temp<<=1;
temp|=(a&0x01);
a>>=1;
}
return(temp);
}
2.键盘服务程序
voidkey()
{
uchara;
delay(60);
a=P3&0x0f0;
a=a>>4;
switch(a)
{
case0:
b[ii]=7;break;
case1:
b[ii]=4;break;
case2:
b[ii]=1;break;
case3:
b[10]=10;break;//清除
case4:
b[ii]=8;break;
case5:
b[ii]=5;break;
case6:
b[ii]=2;break;
case7:
b[ii]=0;break;
case8:
b[ii]=9;break;
case9:
b[ii]=6;break;
case10:
b[ii]=3;break;
case11:
b[10]=11;break;//确认
case12:
b[11]=12;break;//退出
case13:
b[12]=13;break;//模式转换
case14:
b[13]=14;break;//去皮
case15:
b[13]=15;break;//累加
}
if(b[12]==0&&ii<=2&&!
(a==3||a==11||a==12||a==13||a==14||a==15))
ii++;
}
3.模数转换程序
uintADTransform()
{
uintResult;
START=1;//启动AD转换。
START=0;
while(EOC==0);//等待转换结束。
Result=ADOUT;//读入转换结果。
Result=(uint)(39.2118*Result);//处理运算结果。
returnResult;
}