基于.-51单片机电子秤设计_第1页
基于.-51单片机电子秤设计_第2页
基于.-51单片机电子秤设计_第3页
基于.-51单片机电子秤设计_第4页
基于.-51单片机电子秤设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

...wd......wd......wd...摘要电子秤是日常生活中常用的称重设备,广泛应用于超市、大中型商场、物流配送中心。电子秤在构造和原理上取代了以杠杆平衡为原理的传统机械式称量工具。相比传统的机械式称量工具,电子秤具有称量精度高、装机体积小、应用范围广、易于操作使用等优点,在外形布局、工作原理、构造和材料上都是全新的计量衡器。微电子技术的开展为电子秤提出了改良的空间。电子秤向着简单、廉价开展,智能化、准确的电子秤成为了人们的追求。本简易电子秤以常见的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值9174908890038919883387498663857784948408重量0102030405060708090AD值8326823981538069798378987814772576417553重量100110120130140150160170180190AD值7470738573007218713070466961687467926702重量200210220230240250260270280290AD值6626654164556370629462086123603659545873重量300310320330340350360370380390AD值5780569556155535545553715290521251335049重量400410420430440450460470480490通过表中的数据,通过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<intrins.h>#include"hx711.h"#include<reg52.h>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<reg52.h>#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()interrupt3voidkeyscan(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<reg51.h>#include<intrins.h>#include"lcd1602.h"sbitrs=P2^0;sbitLCM_RW=P2^1;sbitlcden=P2^2;/********延时程序K*1ms,12000mhz****************/voiddelay(uintk){ uinti,j; for(i=0;i<k;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<length) { DisplayOneChar(X,Y,DData[ListLength]); ListLength++; X++; }}四、主函数#include<reg51.h>#include<intrins.h>#include<absacc.h>#include<math.h>#include"lcd1602.h"#include"hx711.h"sbitspeaker=P2^7;sbitqupi=P3^7;sbitqingling=P3^6;intweight;ucharnum,s=5;ulongad_data=0;ulongcost=0,total=0;ulongprice=0;ucharflag_ok=0;//ok键的按键次数ucharpi=0;ucharflag_dian=0,dian=1;//小数点的位数,和小数点标志ucharflag_dian_all=0;uchardian_max=1;//最大的点的位数ucharflag_jian=0;ucharcha=0,flag_jia=0,flag_jian;ucharcodestr0[]={"Weight:g"};ucharcodestr1[]={"cost:"};ucharcodestr2[]={"Price:"};ucharcodestr3[]={"Total:"};ucharcodetable1[]={"0123456789"};voidalarm(void);voidkeyscan(void);//键盘扫描函数voiddisplay_cost(ulongprice)//显示单项称量价格{ ucharw[5],i,j,wei; w[0]=price/10000; w[1]=price%10000/1000; w[2]=price%1000/100; w[3]=price%100/10; w[4]=price%10; if(flag_ok==1) { wei=5;i=5;// if(flag_dian==1)// j=11;// else// j=10; while(wei!=11) {// if(flag_dian==1&&wei==10-dian) if(wei==10-dian) DisplayOneChar(wei,1,'.'); else { DisplayOneChar(wei,1,table1[w[i-5]]); i++; } wei++; } } else { wei=6;i=6;// if(flag_dian_all==1)// j=12;// else// j=11; while(wei!=12) {// if(flag_dian_all==1&&wei==11-dian_max) if(wei==11-dian_max) DisplayOneChar(wei,1,'.'); else { DisplayOneChar(wei,1,table1[w[i-6]]); i++; } wei++; } }}voidad_change(ulongprice){ ucharw[5],i; ucharge,bai,shi,qian; intaver=0; doublez=0; w[0]=price/10000000; w[1]=price%10000000/1000000; w[2]=price%1000000/100000; w[3]=price%100000/10000; w[4]=price%10000/1000;// DisplayOneChar(0,1,table1[w[0]]);// DisplayOneChar(1,1,table1[w[1]]);// DisplayOneChar(2,1,table1[w[2]]);// DisplayOneChar(3,1,table1[w[3]]);// DisplayOneChar(4,1,table1[w[4]]); for(i=0;i<5;i++) { z=z*10+w[i]; }// weight=(1093.8-0.1196*z)*10.0;//初始// aver+=weight; weight=(1085.8-0.1185*z)*10.0;//第二次 aver+=weight; weight=(1082.6-0.1182*z)*10.0;//第三次 aver+=weight; /***********第三次,,分段*******************/ if(z>8700) weight=(1079.6-0.1177*z)*10.0; elseif(z>8290) weight=(1087.5-0.1186*z)*10.0; elseif(z>7850) weight=(1077-0.1174*z)*10.0; elseif(z>7410) weight=(1068.3-0.1163*z)*10.0; elseif(z>7000) weight=(1080.8-0.1179*z)*10.0; elseif(z>6590) weight=(1086.1-0.1187*z)*10.0; elseif(z>6170) weight=(1100.4-0.1209*z)*10.0; elseif(z>5730) weight=(1080.8-0.1177*z)*10.0; elseif(z>5330) weight=(1114.9-0.1238*z)*10.0; else weight=(1114-0.1236*z)*10.0; aver+=weight; weight=aver/3;// if(weight<0)// {// cha=-weight;// flag_jia=1;// flag_jian=0;// weight=0;// }// elseif(weight<20)// {// cha=weight;// flag_jian=1;// flag_jia=0;// weight=0;// }// else// {// if(flag_jia==1)// weight=weight+cha;// if(flag_jian==1)// weight-=cha;// } qian=weight/1000; bai=weight%1000/100; shi=weight%100/10; ge=weight%10;DisplayOneChar(7,0,table1[qian]); DisplayOneChar(8,0,table1[bai]); DisplayOneChar(9,0,table1[shi]); DisplayOneChar(10,0,'.'); DisplayOneChar(11,0,table1[ge]); DisplayOneChar(12,0,'g');}/*************主程序***************/voidmain(){ delay(500);//系统延时500ms启动 initLCM(); WriteCommandLCM(0x01);//清屏显示 DisplayListChar(0,0,16,str0); DisplayListChar(0,1,16,str2); while(1) { ad_data=ReadCount(); ad_change(ad_data); keyscan(); alarm(); }}/*************报警值函数******************/voidalarm(void){ if(weight>5500) speaker=0;//则启动报警 else speaker=1;}/**********键盘扫描子程序************///voidtemer1()interrupt3voidkeyscan(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; } if(flag_jian==0) { if(flag_dian==1) dian++; 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; } if(flag_jian==0) { if(flag_dian==1) dian++; 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!=0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论