基于51单片机电子秤设计讲解.docx
- 文档编号:10958030
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:35
- 大小:252.77KB
基于51单片机电子秤设计讲解.docx
《基于51单片机电子秤设计讲解.docx》由会员分享,可在线阅读,更多相关《基于51单片机电子秤设计讲解.docx(35页珍藏版)》请在冰豆网上搜索。
基于51单片机电子秤设计讲解
摘要
电子秤是日常生活中常用的称重设备,广泛应用于超市、大中型商场、物流配送中心。
电子秤在结构和原理上取代了以杠杆平衡为原理的传统机械式称量工具。
相比传统的机械式称量工具,电子秤具有称量精度高、装机体积小、应用范围广、易于操作使用等优点,在外形布局、工作原理、结构和材料上都是全新的计量衡器。
微电子技术的发展为电子秤提出了改进的空间。
电子秤向着简单、便宜发展,智能化、精确的电子秤成为了人们的追求。
本简易电子秤以常见的AT89C51为核心,以电阻应变片采集应变数据,通过HX711放大并进行AD转换供单片机处理,用LCD1602显示所测量的重量,同时本电子秤系统还提供单价设置进行求价格的计算以及去皮功能,通过一些简单低成本的元器件就完成了一个功能齐全的电子秤的制作,将传统电子秤的成本进行了缩减。
关键词:
电阻应变片AT89C51HX711电子秤
第一章方案与论证
一、方案类型
(一)方案一
通过单片机为主控芯片,用应变片采集应变数据,通过专用仪表放大器INA128对采集到的信号进行放大,在配上模数转换芯片对放大了的模拟信号转化为数字信号,传入单片机中进行数据处理,找出函数关系并转化关系。
通过数字信号转化为重量值显示在LDC1602上,同时通过键盘进行数据输入,输入单价、去皮等功能。
通过蜂鸣器和二极管实现超额报警功能。
(二)方案二
以单片机为主控芯片,应变片采集应变数据,将放大和模数转换用HX711芯片来同时进行实现,将模拟量传入主控芯片单片机中进行数据转换,通过函数关系转换为重量显示到LED上或者LCD1602上,同时通过键盘按键进行数据输入,输入单价、去皮等功能,并通过蜂鸣器进行数据处理。
(三)方案三
运用PLC作为主控制器,PLC运用广泛,它具有接线简单,通用性好,编程简单,使用方便,可连接为控制网络系统,易于安装,便于维护等优点。
二、方案论证与选定
运用51单片机作为主控芯片,AT89C51是一种高效微控制器。
它为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
但方案一中,放大和AD转换模块为独立模块,它们的独立设计费事费力且还会存在误差较大的情况。
相比于方案一,方案二一HX711作为放大和AD转换芯片,简化了电路结构。
HX711是一款专为高精度电子秤设计的24位AD转换器芯片。
与同类型其他芯片相比,该芯片集成了包括文雅电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。
精度方面很好的满足了题目中的要求,相比于方案一,方案二根据可行性。
方案三采用PLC作为主控芯片,但其价格昂贵,违背了我们制作电子秤的简单、便捷、便宜的原则,所以我们并没考虑选用PLC作为主控芯片。
综合考虑后,我们决定选择方案二来进行本简易电子秤系统的设计与制作。
通过精度、价格、简单程度出发考虑,方案二是最合适的。
第二章设计方案
一、设计思路
图2-1总体思路图
图2-2具体思路
二、各部分设计
(一)传感器部分设计
传感器应题目要求选用电阻应变片,是用于测量应变的元件。
它能将机械构件上应变的变化转换为电阻变化。
为了减少测量误差,本简易电子秤系统采用全桥差动形式,全桥差动测量电路不仅没有非线性测量误差,且电压灵敏度是单臂电阻应变片工作时的四倍,运用全桥差动[1]使得本电子秤系统更加稳定和可靠。
图2-3全桥差动电路
(二)主控芯片
主控芯片是电子秤的核心部分,它能接受转换后的传感器信号,同时也能扫描接受到键盘的输入信号,计算价格后控制显示器的输出,能够实现去皮功能,当超过称重量量程时还要控制报警装置报警。
本简易电子秤选用AT89C51作为主控芯片,AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
51单片机的操作简单,功能强大,价格便宜。
运用51单片机作为主控芯片可以减少成本,而且制作简便,能够实现本系统的所有功能,是一个不错的选择。
(三)放大与AD转换模块
在系统总体设计时,我们考虑到了将放大与AD转换作为单独的模块进行设计,但是思考后发现这其中还有更好的选择。
HX711是一款专为高精度电子秤而设计的24位A/D转换器芯片。
与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。
同时HX711还自带放大功能,可选增益为64和128两种。
运用HX711保证了题目要求的高精度,可实现精度误差控制在01g以内,保证了我们完成题目的要求。
(四)键盘方案
针对题目要求,需要我们输入单间进行计算,单价包含0-9十个数字,数字键占用十个,确定和清除占用两个,去皮占用一个,复位占用一个。
去皮键、复位键、清除键单独用一个IO口引出;将十个数字键、确定键、计算总价键十二个键制成3x4的矩阵键盘[2]。
通过设计成矩阵键盘的模式而减少单片机IO口的占用,为其他功能腾出空间。
图2-43x4矩阵键盘
第三章电路设计
一、单片机最小系统电路
AT89C51是片内有ROM/EPROM的单片机,其最小系统简单、可靠,仅由时钟电路、复位电路、电源电路构成。
(一)时钟电路
AT89C51虽然有内部振荡电路,但要形成时钟,必须外部附加电路。
AT89C51单片机的时钟产生方法有两种。
内部时钟方式和外部时钟方式。
本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。
振荡晶体可在1.2MHZ到12MHZ之间选择。
电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度有少许影响,可在20pF到100pF之间取值。
所以本设计中,振荡晶体选择12MHZ,电容选择22pF。
(二)复位电路
AT89C51的复位电路是由外部的复位电路来实现的。
只需给复位引脚RST加上大于2个机器周期的高电平就可使其复位。
复位电路通常采用上电自动复位和按键复位两种方式。
本设计就是用的按键手动复位。
其中电平复位是通过RST端经电阻与电源Vcc接通而实现的。
(三)电源电路
AT89C51的电源脚分别为20脚Vss和40脚Vcc。
这两个脚分别接地和+5V直流电源,31脚EA为内外存储器的控制端,接+5V允许访问外部存储器。
图3-1晶振电路和复位电路
二、AD转换电路
HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。
与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点、降低了电子秤的整机成本,提高了整机的性能和可靠性。
该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。
输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。
通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。
通道B则为固定的64增益,用于系统参数检测。
芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。
芯片内的时钟振荡器不需要任何外接部件。
上电自动复位功能简化了开机的初始化过程。
图3-2HX711模块电路
三、LCD1602显示电路
本设计采用的是LCD1602显示,LCD1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5×7或者5×11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。
1602LCD是指显示的内容为16×2,即可以显示两行,每行16个字符液晶模块。
图3-3LCD1602电路
四、总设计电路
图3-4系统总电路
第四章测试方法与测试结果
一、测试方法
由于本系统是一个简易电子秤系统,所以最好的测量方法就是通过测量标准砝码的质量来比对本电子秤系统的测量显示值。
以测量结果显示值减去砝码质量再除以砝码质量得出误差百分比,同时也得出精确程度。
(一)键盘测量与LCD1602测量
键盘与LCD1602的测量我们放在一起进行,编写按键与LCD1602显示函数,将对应按键编码成0-9,按下按键通过LCD1602来进行显示所按下键盘的数值,通过这种方法我们同时测量了键盘与LCD1602的功能,保证了电路焊接的正确性。
(二)模数转换对应数值测量
将HX711连接到电路中,通过LCD1602来显示转换后的数值信号,依次将10g、20g、30g、40g到500g的砝码放到秤盘上,依次独处LCD1602的显示数值,将这五十组数据放入到Excel表格中,通过Excel绘制线性图形。
通过线性图形拟合出线性函数关系。
(三)测量质量检测
分别用10g、20g、50g、100g、200g、500g的砝码放到本简易电子系统的秤盘上,比对测量显示值,求出误差百分比和测量精度。
除此之外,我们还用一个10克、两个2克砝码组成一个五十克砝码;一个10克砝码、两个20克砝码和一个50克砝码组成一个100克方法等组合放在秤盘中心进行测量,以此来确定本简易电子秤系统的精确度。
二、测量结果
(一)AD转换后数值信号值与砝码质量的对应关系
表4-1AD值与砝码质量(g)的对应关系
AD值
9174
9088
9003
8919
8833
8749
8663
8577
8494
8408
重量
0
10
20
30
40
50
60
70
80
90
AD值
8326
8239
8153
8069
7983
7898
7814
7725
7641
7553
重量
100
110
120
130
140
150
160
170
180
190
AD值
7470
7385
7300
7218
7130
7046
6961
6874
6792
6702
重量
200
210
220
230
240
250
260
270
280
290
AD值
6626
6541
6455
6370
6294
6208
6123
6036
5954
5873
重量
300
310
320
330
340
350
360
370
380
390
AD值
5780
5695
5615
5535
5455
5371
5290
5212
5133
5049
重量
400
410
420
430
440
450
460
470
480
490
通过表中的数据,通过Excel折线图进行拟合,拟合出的结果为数据呈现线性关系,这满足应变片的性质,得出的转换函数为:
y=0.1185x+1085.8145。
图4-1折线图
(二)简易电子秤测量结果与标准砝码比对关系
在确定了函数转换关系之后,电子秤的制作基本快要完成,将函数关系编写到程序中就实现电子秤的制作。
将10g-500g依次增长10g的砝码放入到秤盘中,比对标准砝码值与测量显示值之间的关系发现误差基本控制在1g之内,0-50g期间大致控制在了0.5g的范围内,基本完成了题目所给要求。
三、测量结论
本简易电子秤系统达到了题目要求,拥有输入单价求价格的功能,同时还能满足价格的叠加在单片机芯片中计算而不用,输入一个记录一个值那么麻烦。
同时本电子称系统也完成了去皮功能,清除,复位功能,甚至还设置了超上限报警装置报警值上限为550g。
参考文献
[1]胡向东,李锐,耿道渠等[M].传感器与检测技术第2版.北京.机械工业出版社.2013.37-38
[2]郭天祥.51单片机C语言教程[M].北京.电子工业出版社.2009.86
附录
一、HX711代码
#include"lcd1602.h"
#include
#include"hx711.h"
#include
sbitADDO=P2^4;
sbitADSK=P2^3;
/**************************************************************
externunsignedlongReadAD(void);
.
.
unsignedlongdata;
data=ReadAD();
.
-------------------------------------------------------------*/
ulongReadCount(void)
{
ulongCount;
uchari;
ADSK=0;//使能AD(PD_SCK置低)
Count=0;
while(ADDO);//AD转换未结束则等待,否则开始读取
for(i=0;i<24;i++)
{
ADSK=1;//PD_SCK置高(发送脉冲)
Count=Count<<1;//下降沿来时变量Count左移一位,右侧补零
ADSK=0;//PD_SCK置低
if(ADDO)Count++;
}
ADSK=1;
Count=Count^0x800000;//第25个脉冲下降沿来时,转换数据
ADSK=0;
return(Count);
}
二、键盘代码
#include
#include"lcd1602.h"
#include"key.h"
ucharnum,s=5;
ucharprice=0;
ucharcodetable1[]={"0123456789"};
str2[]={"Price:
"};
ucharcodestr3[]={"Total:
"};
voiddisplay_cost(ucharprice)//显示单项称量价格
{
ucharw[5],i=5;
w[0]=price/10000;
w[1]=price%10000/1000;
w[2]=price%1000/100;
w[3]=price%100/10;
w[4]=price%10;
while(i!
=10)
{
DisplayOneChar(i,1,w[i-5]);
i++;
}
}
/**********键盘扫描子程序************/
//voidtemer1()interrupt3
voidkeyscan(void)
{
uchartemp;
P1=0XFE;
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xbe:
num=1;s++;break;
case0xde:
num=2;s++;break;
case0xee:
num=3;s++;break;
//case0x7e:
num=4;k='/';s++;break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
price=price*10+num;
DisplayOneChar(s,1,table1[num]);
}
}
P1=0XFd;
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xbd:
num=4;s++;break;
case0xdd:
num=5;s++;break;
case0xed:
num=6;s++;break;
//case0x7d:
num=8;k='*';s++;break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
price=price*10+num;
DisplayOneChar(s,1,table1[num]);
}
}
P1=0XFb;
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xbb:
num=7;s++;break;
case0xdb:
num=8;s++;break;
case0xeb:
num=9;s++;break;
//case0x7b:
num=12;k='-';s++;break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
DisplayOneChar(s,1,table1[num]);
}
}
P1=0XF7;
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xb7:
num='-';s++;break;
case0xd7:
num=0;s++;break;
case0xe7:
num='=';s++;break;
//case0x77:
num=16;k='+';s++;break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
if(num==0)
{
price=price*10+num;
DisplayOneChar(s,1,table1[num]);
}
elseif(num=='-')
{
s=5;
price=0;
DisplayListChar(0,1,16,str2);
}
else
{
DisplayListChar(0,1,16,str3);
display_cost(price);
}
}
}
}
三、LCD1602
#include
#include
#include"lcd1602.h"
sbitrs=P2^0;
sbitLCM_RW=P2^1;
sbitlcden=P2^2;
/********延时程序K*1ms,12000mhz****************/
voiddelay(uintk)
{
uinti,j;
for(i=0;i for(j=0;j<100;j++); } /*********写指令到LCM子函数****************/ voidWriteCommandLCM(ucharcom) { P0=com; rs=0; lcden=0; delay (1); lcden=1; delay (1); lcden=0; } /************写数据到LCM子函数****************/ voidWriteDataLCM(uchardate) { P0=date; rs=1; lcden=0; delay (1); lcden=1; delay (1); lcden=0; } /*************LCM初始化子函数****************/ voidinitLCM() { WriteCommandLCM(0x38); delay(10); WriteCommandLCM(0x0f); delay(10); WriteCommandLCM(0x06); delay(10); WriteCommandLCM(0x01); delay(10); } /************显示指定坐标的一个字符子函数********/ voidDisplayOneChar(ucharX,ucharY,ucharDData) { Y&=0x01; X&=0x0f; if(Y) X|=0x40;//若y为1(显示第二行),地址码加0x40 X|=0x80;//指令码为地址码+0x80 WriteCommandLCM(X); WriteDataLCM(DData); } /********显示指定坐标的一串字符子函数********/ voidDisplayListChar(ucharX,ucharY,ucharlength,ucharcode*DData) { ucharListLength=0; Y&=0x01; X&=0x0f; while(X { DisplayOneChar(X,Y,DData[ListLength]); ListLength++; X++; } } 四、主函数 #include #include #include #include #include"lcd1602.h" #include"hx7
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 电子秤 设计 讲解