版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于单片机的智能电子秤设计目录1绪论1.1选题的背景和意义电子秤系统的软件设计程序设计是一件复杂的工作,为了把复杂的工作条理化,就要有相应的步骤和方法。其步骤可概括为以下三点:首先需要分析系统控制要求,确定算法:对复杂的问题进行具体的分析,找出合理的计算方法及适当的数据结构,从而确定编写程序的步骤。这是能否编制出高质量程序的关键。其次是根据算法画流程图:画程序框图可以把算法和解题步骤逐步具体化,以减少出错的可能性。最后就是编写程序:根据程序框图所表示的算法和步骤,选用适当的指令排列起来,构成一个有机的整体,即程序。程序数据的一种理想方法是结构化程序设计方法。结构化程序设计是对利用到的控制结构类程序做适当的限制,特别是限制转向语句(或指令)的使用,从而控制了程序的复杂性,力求程序的上、下文顺序与执行流程保持一致性,使程序易读易理解,减少逻辑错误和易于修改、调试。根据系统的控制任务,监控软件采用模块技术设计,根据系统功能,将软件分为假设干个功能相对独立的模块,为每一个模块设计程序流程图。该电子秤功能程序模块包括:A/D转换启动及数据读取程序设计、显示子程序设计、键盘扫描子的程序设计、价格计算子程序设计、以及报警子程序设计等。4.1主程序的设计主程序是系统信息处理的关键,主程序模块主要完成编程芯片的初始化及按需要调用各模块〔子程序〕,在系统初始化过程中,初始化程序将RAM的30H到5FH单元清零,RXD引脚置成低电平,防止误报警,同时将系统设置成2.5Kg量程,并写2.5Kg量程标志。设计流程图如图5-1所示。主程序主要完成编程芯片的初始化及按需要调用各子程序,上电启动后,系统初始化,单片机读取模数转换器的数据,然后调用显示子程序显示重量,同时扫描键盘子程序,调用价格计算子程序计算价格并显示出来。图4SEQ图\*ARABIC\s11电子秤系统程序设计流程图4.2子程序的设计主程序按需要调用各子程序。系统子程序主要包括A/D转换启动及数据读取程序设计、显示子程序设计、键盘扫描子的程序设计、价格计算子程序设计、以及报警子程序设计等。4.2.1模数转换子程序的设计A/D转换启动及数据读取子程序设计主要是上电运行后,ADC0832完成初始化,把经放大的称重传感器传递过来的模拟信号转换成数字信号并传递到单片机所涉及到的程序设计设计流程图如图4-2所示。ADC0832进行模数转换时,须现将CS是能端置于低电平并且保存低电平直到完全结束。芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO和DI端那么使用DI端输入通道功能选择的数据信号。在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能,到第3个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端那么开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。从第11个字节的下沉输出DATA0。随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束[23]。最后将CS置高电平禁用芯片。图42A/D转换启动及数据读取程序流程图4.2.2键盘扫描子程序的设计键盘扫描子程序主要是扫描键盘的输入,调用显示子程序显示,输出输入的参数,计算总价是调用价格计算子程序计算总价格。键盘电路设计成3×4矩阵式,由键盘编码方式可以得出1、2、3、4、5、6、7、8、9、0及清零和计价各键对应的键值:0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3d,0x30,0x2e。在程序中可以先判断按键编码,然后根据编码将键盘代表的数值送到相应的存储单元,再进行功能选择或数据处理。图43键盘扫描子程序流程图显示子程序的设计单片机应用系统通常都需要进行人—机对话。其中包括人对应用系统的状态干预与数据输入,应用系统必须向操作者显示状态与运行结果等信息。显示器是单片机应用系统中最常用的人—机交互设备。显示子程序是字符显示,首先初始化,输出一些根本信息,然后调用事先编好的键盘显示子程序,输出显示命令,显示过程中还需要调用延时子程序。当输入通道采集了一个信号,或人为的键入一个值,或系统与仪表出现异常情况显示管理软件应及时调用显示驱动程序模块,用来更新当前数据显示符号。设计显示子程序的流程图如下列图4-4所示:图44显示子程序流程图4.2.4价格计算子程序的设计价格计算子程序由键盘计价键控制,当输入单价后,在没有清零的情况下,点计价键,计算出总价后,调用显示子程序显示出中重量。该子程序中利用各工作存放器2组,数据存在以40H单元为首址的连续单元中。价格计算公式总价=单价×重量。这个程序需要两次的数制转换,输入单价后需要将单价转化为二进制后才能与二进制的重量进行计算。计算后的结果必须转换为十进制数显示出来。图45价格程序流程图4.2.5报警子程序的设计因为压力传感器的所受压力有极限,所以称重量必须有在一定范围内,超过重量时必须有报警程序。主程序初始化设定阈值为2.5Kg,报警子程序将设定的阈值与实时显示的值进行比拟,先比拟高位,假设高位大,即设定值小于实时显示的值,这时将RXD置为1,将发光二极管点亮,且使蜂鸣器发出声音。假设高位相等,就比拟低位,同理假设设定值低位小于实际显示值,将RXD置为1,将发光二极管点亮,且使蜂鸣器发出声音。这就需要一段比拟程序以及一小段置1清0程序。图46报警子程序流程图5系统调试5.1软件调试在设计电子秤的过程中,先在软件中仿真,仿真成功后,再制作出实物。仿真采用的是proteus软件,是一专门基于单片机的及其外围电路的仿真软件。仿真的第一步是先进行软件调试,是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正错误的过程。软件调试的方法是先分块后组合。在编出完整的程序并确保无误后进行综合调试。在调试程序之前,先检查各硬件模块间的连接是否无误,有无断路现象。确认连接无误后就给系统通电进行调试。正式调试时,首先进行总体调试,即观察系统的运行情况以便快速地发现存在的问题。然后进行各硬件模块调试,主要针对有问题的硬件模块及其程序进行调试,以便准确地查出问题的原因并解决问题。我在实际仿真的时候出现了LCD无显示,最终找出原因是LCD是共阳极的需要接上拉电阻。同时还发现蜂鸣器超重后都不报警但是LED发亮,最后发现是蜂鸣器的响应时间设置太大产生的。软件调试如图5-1所示。图5-1软件调试图5.2硬件调试按照设计好的电子秤系统原理图,计算出各个元器件的参数,选择相应的器件,制作出了实际的电子秤系统后。首先检查连线是否与逻辑图一致,用万用表检查有无短路、虚焊等现象。器件的型号、规格、规格、极性是否有误,插接方向是否正确。检查完毕,可用万用表检测仪下电路板正负电源之间的电阻,排除电源短路的可能。之后将生成的hex文件烧到单片机中,得到响应的实物,观察现象,并排除问题。刚开始通电后,发现LCD显示画面不理想,之后调节上拉电阻后到达了满意的效果。同时出现报警装置没有用,之后检查发现是因为实际买的三极管极性与理论图不一样。换了正负极方向就可以了。同时测量的重物质量与实际相比严重偏大,之后修改程序中的转换倍数后正常了。结论本论文主要研究的是简易电子秤的设计,主要是基于超市的电子秤,在小重量范围的称量。具有如下的功能:1、能用简易键盘设置单价,能够同时显示重量和金额;2、重量显示:单位为千克;最大称重为2.5千克,重量误差不大于±0.01千克;3、具有清零功能和复位功能。4、超出所测的重量时能够报警。此电子秤采用LCD1602显示,能够同时显示重量价格,并且具有很高的性价比,能够广泛的应用少于2.5kg重量的范围的交易。致谢经过两周的努力终于完成了本次设计,其中由于经验的匮乏,难免有许多考虑不周全的地方,但由于同学及老师的帮助大多都得以解决,真是辛苦大家了。在这里要感谢我的老师牛月兰老师平常的悉心教导,正是由于她的辛勤教导才能有足够的知识完成这份设计,老师为人和蔼可亲,经常给我们解决一些难题,她治学严谨和科学研究的精神也是我永远学习的典范,并将积极影响我今后的学习和工作。最后还要感谢之前指导过我们的所有的老师,正是由于他们,我们才能打好专业知识的根底;同时还要感谢所有的同学们,正是因为有了你们的支持和鼓励。此次课程设计才会顺利完成。参考文献张毅刚.单片机原理及应用[M].北京:高等教育出版社,2023.彭介华.电子技术课程设计指导[M].北京:高等教育出版社,2023.常健生.检测与转换技术[M].北京:机械工业出版社,2004.何立民.单片机应用技术选编[M].北京:北京航空航天大学出版社,2007梁瑞林.传感器实用电路设计与制作[M].北京:科学出版社,2007.附录A系统原理图附录B仿真图附录C程序清单.#include<reg51.h>#include<intrins.h>#include<absacc.h>#include<math.h>#defineucharunsignedchar#defineuintunsignedint#defineBUSY0x80//常量定义#defineDATAPORTP0sbitADCS=P3^5;sbitADDI=P3^7;sbitADDO=P3^7;sbitADCLK=P3^6;sbitLCM_RS=P2^0;sbitLCM_RW=P2^1;sbitLCM_EN=P2^2;uintx1,y1,z1=0,w1,j,temp1;ucharad_data,k,n,m,e,num,s;//采样值存储sbitspeaker=P3^0;charpress_data;//标度变换存储单元unsignedcharad_alarm;//报警值存储单元unsignedcharpress_ge=0;//显示值百位unsignedcharpress_shifen=0;//显示值十位unsignedcharpress_baifen=0;//显示值个位unsignedcharpress_qianfen=0;//显示值十分位ucharcodestr0[]={"Weight:.Kg"};ucharcodestr2[]={"Price:"};ucharcodestr3[]={"Total:"};ucharcodetable2[]={0x37,0x38,0x39,0x34,0x35,0x36,0x31,0x32,0x33,=0x3d,0x30,0x2e};//键盘码voiddelay(uint);voidlcd_wait(void);voiddelay_LCM(uint);//LCD延时子程序voidinitLCM(void);//LCD初始化子程序voidlcd_wait(void);//LCD检测忙子程序voidWriteCommandLCM(ucharWCLCM,ucharBusyC);//写指令到ICM子函数voidWriteDataLCM(ucharWDLCM);//写数据到LCM子函数voidDisplayOneChar(ucharX,ucharY,ucharDData);//显示指定坐标的一个字符子函数voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//显示指定坐标的一串字符子函数voidweishu(uintm);voidweishu1(uintm);voiddisplay(void);ucharAdc0832(unsignedcharchannel);voidalarm(void);voiddata_pro(void);/**********主程序************/voidmain(void){delay(500);//系统延时500ms启动//ad_data=0;//采样值存储单元初始化为0initLCM();WriteCommandLCM(0x01,1);//清显示屏DisplayListChar(0,0,str0);DisplayListChar(0,1,str2);while(1){ad_data=Adc0832(0);//采样值存储单元初始化为0alarm();data_pro();display();if(k==1){DisplayOneChar((s+7),1,table2[num-1]);x1=m;y1=n;y1=y1*10+x1;}if(k=='*'){data_pro();WriteCommandLCM(0x01,1);weishu(z1);k=0;}if(k=='='){z1=z1*temp1;WriteCommandLCM(0x01,1);DisplayListChar(0,1,str3);s=0;weishu1(temp1*n);k=0;j=temp1;}if(k==''){WriteCommandLCM(0x80+0x40,1);WriteCommandLCM(0x01,1);z1=0;s=0;//防止清零时指针后移动}}}/*********延时程序K*1ms,12.000mhz**********/voiddelay(uintk){uinti,j;for(i=0;i<k;i++)for(j=0;j<100;j++);}/**********写指令到ICM子函数************/voidWriteCommandLCM(ucharWCLCM,ucharBusyC){if(BusyC)lcd_wait();DATAPORT=WCLCM;LCM_RS=0;//选中指令存放器LCM_RW=0;LCM_RW=0;//写模式LCM_EN=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();LCM_EN=0;}/**********写数据到LCM子函数************/voidWriteDataLCM(ucharWDLCM){lcd_wait();//检测忙信号DATAPORT=WDLCM;LCM_RS=1;//选中数据存放器LCM_RW=0;//写模式LCM_EN=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();LCM_EN=0;}/***********lcm内部等待函数*************/voidlcd_wait(void){DATAPORT=0xff;//读LCD前假设单片机输出低电平,而读出LCD为高电平,//那么冲突,Proteus仿真会有显示逻辑黄色LCM_EN=1;LCM_RS=0;LCM_RW=0;LCM_RW=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();while(DATAPORT&BUSY){LCM_EN=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();LCM_EN=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}LCM_EN=0;}/**********LCM初始化子函数***********/voidinitLCM(){LCM_EN=0;DATAPORT=0;delay(15);WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号delay(5);WriteCommandLCM(0x38,0);delay(5);WriteCommandLCM(0x38,0);delay(5);WriteCommandLCM(0x38,1);//8bit数据传送,2行显示,5*7字型,检测忙信号WriteCommandLCM(0x08,1);//关闭显示,检测忙信号WriteCommandLCM(0x01,1);//清屏,检测忙信号WriteCommandLCM(0x06,1);//显示光标右移设置,检测忙信号WriteCommandLCM(0x0c,1);//显示屏翻开,光标不显示,不闪烁,检测忙信号TMOD=0x11;EA=1;ET1=1;TR1=1;k=0;x1=0;y1=0;z1=0;}/****显示指定坐标的一个字符子函数****/voidDisplayOneChar(ucharX,ucharY,ucharDData){Y&=0x01;X&=0x0f;if(Y)X|=0x40;//假设y为1〔显示第二行〕,地址码+0X40X|=0x80;//指令码为地址码+0X80WriteCommandLCM(X,1);WriteDataLCM(DData);}/*******显示指定坐标的一串字符子函数*****/voidDisplayListChar(ucharX,ucharY,ucharcode*DData){ucharListLength=0;Y&=0x01;X&=0x0f;while(X<16){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}}/*****************系统显示子函数*****************/voiddisplay(void){WriteCommandLCM(0x0c,1);//显示屏翻开,光标不显示,不闪//烁,检测忙信号DisplayListChar(0,0,str0);//DisplayListChar(0,1,str2);DisplayOneChar(8,0,press_ge+0x30);DisplayOneChar(10,0,press_shifen+0x30);DisplayOneChar(11,0,press_baifen+0x30);DisplayOneChar(12,0,press_qianfen+0x30);delay(1000);//稳定显示}/************读ADC0832函数************///采集并返回ucharAdc0832(unsignedcharchannel)//AD转换,返回结果{uchari=0;ucharj;uintdat=0;ucharndat=0;if(channel==0)channel=2;if(channel==1)channel=3;ADDI=1;_nop_();_nop_();ADCS=0;//拉低CS端_nop_();_nop_();ADCLK=1;//拉高CLK端_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿1_nop_();_nop_();ADCLK=1;//拉高CLK端ADDI=channel&0x1;_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿2_nop_();_nop_();ADCLK=1;//拉高CLK端ADDI=(channel>>1)&0x1;_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿3ADDI=1;//控制命令结束_nop_();_nop_();dat=0;for(i=0;i<8;i++){dat|=ADDO;//收数据ADCLK=1;_nop_();_nop_();ADCLK=0;//形成一次时钟脉冲_nop_();_nop_();dat<<=1;if(i==7)dat|=ADDO;}for(i=0;i<8;i++){j=0;j=j|ADDO;//收数据ADCLK=1;_nop_();_nop_();ADCLK=0;//形成一次时钟脉冲_nop_();_nop_();j=j<<7;ndat=ndat|j;if(i<7)ndat>>=1;}ADCS=1;//拉低CS端ADCLK=0;//拉低CLK端ADDO=1;//拉高数据端,回到初始状态dat<<=8;dat|=ndat;return(dat);//returnadk}voiddata_pro(void){unsignedint;floatpress;if(0<ad_data<256){intvary=ad_data;press=(0.012*vary);temp1=(int)(press*1000);//放大1000倍,便于后面的计算press_ge=temp1/1000;//取压力值百位press_shifen=(temp1%1000)/100;//取压力值十位press_baifen=((temp1%1000)%100)/10;//取压力值个位press_qianfen=((temp1%1000)%100)%10;//取压力值十分位}}/*****************报警子函数*******************/voidalarm(void){if(ad_data>223)speaker=0;//那么启动报警elsespeaker=1;}voidweishu(uintm){ucharwei4,wei3,wei2,wei1,wei0;wei4=m/10000;wei3=m%10000/1000;wei2=m%1000/100;wei1=m%100/10;wei0=m%10;DisplayOneChar(7,1,0x30+wei4);DisplayOneChar(8,1,0x30+wei3);DisplayOneChar(10,1,0x30+wei2);//DisplayOneChar(10,1,'.');DisplayOneChar(11,1,0x30+wei1);DisplayOneChar(12,1,0x30+wei0);}voidweishu1(uintm){ucharwei5,wei4,wei3,wei2,wei1,wei0;wei5=m/100000;wei4=m%100000/10000;wei3=m%10000/1000;wei2=m%1000/100;wei1=m%100/10;wei0=m%10;DisplayOneChar(7,1,0x30+wei4);DisplayOneChar(8,1,0x30+wei3);DisplayOneChar(9,1,'.');DisplayOneChar(10,1,0x30+wei2);//DisplayOneChar(10,1,'.');DisplayOneChar(11,1,0x30+wei1);DisplayOneChar(12,1,0x30+wei0);}/*****************键盘扫描子程序*******************/voidtemer1()interrupt3{uchartemp;EX1=0;P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case0xee:num=1;n=7;k=1,s++;break;case0xde:num=2;n=8;k=1,s++;break;case0xbe:num=3;n=9;k=1,s++;break;case0x7e:num=4;k='/',s++;break;}whil
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省韶关市新丰县2020-2021学年七年级上学期期中历史试题(含答案)
- 合规转利润:降本增效全指南(2026)《GBT 36228-2018无损检测 平面型伤高度超声定量导则》
- 合规转利润:降本增效全指南(2026)《GBT 36064-2018塑料软包装凹版印刷过程质量控制及检验方法》
- 五上语文【1-25课必背知识点晨读】
- 数控研磨工改进模拟考核试卷含答案
- 柔性版印刷员保密意识考核试卷含答案
- 《鸡兔同笼》教学设计
- 搪瓷花版饰花工变更管理测试考核试卷含答案
- 无损检测员岗前创新意识考核试卷含答案
- 防暴指导员岗前竞争分析考核试卷含答案
- 老年骨质疏松症护理指南
- 2026福建海峡企业管理服务有限公司(央企外包岗)招聘12人笔试历年典型考点题库附带答案详解
- 广铁校招机考真题库
- 车辆动态监控奖惩制度
- 2025-2026学年人教版八年级地理上学期全册知识点提纲
- 2025年中国雄安集团数字城市科技有限公司招聘笔试参考题库附带答案详解
- 2026青海西市湟中区招聘森林草原专职消防员15人笔试备考题库及答案解析
- 2025ESAIC指南:分娩时硬膜外镇痛失败的管理解读
- (正式版)DB51∕T 3342-2025 《炉灶用合成液体燃料经营管理规范》
- 医疗不良事件的分类分级管理标准
- GB/T 5782-2025紧固件六角头螺栓
评论
0/150
提交评论