基于单片机技术的电子秤设计与制作_第1页
基于单片机技术的电子秤设计与制作_第2页
基于单片机技术的电子秤设计与制作_第3页
基于单片机技术的电子秤设计与制作_第4页
基于单片机技术的电子秤设计与制作_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

时,则电桥输出电压或电流为零,这时电桥处于平衡状态。其测量原理:用应变片测量时,将其粘贴在弹性体上。当弹性体受力变形时,应变片的敏感栅也随同变形,其电阻值发生相应变化,通过转换电路转换为电压或电流的变化。由于内部线路采用惠更斯电桥,当弹性体承受载荷产生变形时,输出信号电压可由下式给出:(2-2)本文的目的是应用一简易电子秤,最大称重约为2.5千克,重量误差不大于±0.01千克;考虑到与其相配置的各种电路的应用的难易程度和应用性价比,最终选择了CZAF-605电阻应变式称重传感器,其称重规模为5kg。2.4放大器的方案压力传感器感受重力转换后输出的信号一般电平较低;经由电桥等电路变换后的信号亦难以直接用来显示、记录、控制或进行模数转换。为此,测量电路中需要模拟放大环节。这一环节目前主要依靠由集成运算放大器的基本元件构成具有各种特性的放大器来完成。所采用的传感器输出电压振幅范围0~10mV。而模数转换的输入电压要求为0~2V,因此放大环节至少200倍的增益,此处我们需要放大500倍。采用专用仪表放大器,如:INA128,INA129等。此类芯片内部采用差动输入,共模抑制比高,差模输入阻抗大,增益高,精度也非常好,且外部接口简单。以INA128为例,引脚图如2-3所示:图2-3INA128引脚图放大器增益G=1+50k/,通过改变的大小来改变放大器的增益。因为放大的倍数是500,所以大致选用100欧姆的电阻就可以了。基于以上分析,采用专用仪表放大器能跟好的满足要求,最终选择了INA128。

3系统设计系统的整体设计如下图所示3-1所示。压压力传感器放大电路模数转换微处理器键盘x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8LCD显示x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8x=0.8图3-1硬件应用的总体思路3.1单片机89C52RC最小系统89C52RC是一款低压高性能CMOS8位微处理器,具有4K字节闪存,128字节RAM,32个双向I/O端口,两个16位定时器/计数器,5个中断源,一个全双工串行通信端口,芯片内振荡器和时钟电路。同时,89C52RC可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。89C52RC的P0口为一个8位漏级开路双向I/O口,P1、P2和P3口是一个内部提供上拉电阻的8位双向I/O口,同时P3口还作为89C52RC的一些特殊功能口。89C52RC是片内有ROM/EPROM的单片机,其最小系统简单、可靠,仅由时钟电路、复位电路、电源电路构成。如图3-2所示。3.1.1时钟电路89C52RC虽然有内部振荡电路,但要形成时钟,必须外部附加电路。89C52RC单片机的时钟产生方法有两种。内部时钟方式和外部时钟方式。本应用采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHZ到12MHZ之间选择。电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度有少许影响,可在20pF到100pF之间取值。所以本应用中,振荡晶体选择12MHZ,电容选择22pF。图3289C52RC最小系统的应用3.1.2复位电路89C52RC的复位电路是由外部的复位电路来实现的。只需给复位引脚RST加上大于2个机器周期的高电平就可使其复位。复位电路通常采用上电自动复位和按键复位两种方式。本应用就是用的按键手动复位。其中电平复位是通过RST端经电阻与电源VCC接通而实现的。3.1.3电源电路89C52RC的电源脚分别为20脚VSS和40脚VCC(图中已默认连接,未显示出来)。这两个脚分别接地和+5V直流电源,31脚EA为内外存储器的控制端,接+5V允许访问外部存储器。3.2放大电路传感器检测电路的功能是将电阻应变片的电阻变化转化为电压输出。本应用选用的是CZAF-605电阻应变式称重传感器,由于其获得的电压信号较小,需要放大器对信号进行放大。考虑到干扰的作用,对传感器的信号进行了滤波处理,最终应用如图3-3所示。图33传感器与放大器的接口电路INA128的2和3脚为信号输入端,4、5和7脚为电源引脚。微弱信号放大后从INA128的第6脚输出。通过调节的阻值可以来改变放大倍数,使得输出电压在A/D转换的基准电压要求范围之内。根据要求,A/D转换器的输入电压变化范围是0V~4.999V,传感器的输出电压信号在0~10mv,因此取放大器的放大倍数500。因此代入公式,。3.3模数转换器电路HX711是一款专为高精度电子秤而设计的24位A/D转换器芯片。与其他同类型芯片相比,该芯片集成了其他同类型芯片所需的外围电路,包括稳压电源、片内时钟振荡器等。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B则为固定的32增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。作为单通道模拟信号输入时HX711AD的输入电压是0~5V且8位分辨率时的电压精度为19.53mV。如果作为由IN+与IN-输入的输入时,可是将电压值设定在某一个较大范围之内,从而提高转换的宽度。但值得注意的是,在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。HX711AD与单片机的接口电路如图3-4所示。图34HX711AD与单片机的接口电路图3.4显示电路本应用采用LCD1602显示,LCD1602液晶又称1602字符液晶。它是一种点阵液晶模块,专门用于显示字母、数字、符号等。它由5×7或5×11个点阵字符位组成,每个点阵字符位可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。1602LCD是指显示的内容为16×2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。LCD1602与单片机的连接如图3-5所示。3脚VEE接一个滑动变阻器,滑动变阻器两端接电源和地。调试欢动变阻器的值可以改变LCD的对比度。因为LCD为共阳极,所以D0到D7有加入上拉电阻。图35单片机与LCD1602接线图3.5报警子程序设计报警功能是电子秤的一个附加功能,实现报警功能的方法为:定义一个蜂鸣器响的函数,在重量设定函数中定义一个最大量程变量,当重量达到上限时,调用beep函数,使之响一段时间。虽然方法简单,但是循环扫描闹铃仍然会占用系统执行时间。图3-6为报警子程序流程图。图3-6报警流程图3.6按键处理程序3.6.1按键介绍在单片机系统中,键盘按连接形式可分为独立连接键盘、矩阵式键盘和薄膜开关。本设计中用的是独立连接式键盘。当键没有按下时,所有的数据输入线都为高电平;当有一按键被按下时,与之相连的数据输入线将变为低电平;通过相应指令,可以判断是否有按键按下。按键要正确发挥作用必须消除抖动。所谓抖动,是一种由于按键是机械式的弹性开关,通常在按键按下和抬起的时候会出现多次闭合或者断开的现象,如图3-7所示。通常抖动时间为5ms~10ms,稳定闭合区的时间由按键动作决定,CPU往往会在闭合抖动时检测到多次电平的变化。消除硬件抖动有硬件和软件两种方式。硬件消抖方法是在按键输入通道上添加去抖动电路,从根本上避免电压抖动的产生。软件消抖方法则采用延迟5~10ms时间,待电压稳定后,再进行状态输入。在本设计中用延时的方法就足够了。图3-7按键时波形图3-8按键去抖流程当抖动的问题消除以后,还必须判断按键者是否将按键释放。通常按键的稳定闭合区的时间最少也有上百毫秒,是抖动时间的数十倍,如果按键者持续按下按键不松手,那么按键一直处于闭合状态。这种状态会导致CPU误以为按键被按多次,为了避免这种错误,程序需要判断按键被松开,这样才是一个完整的按键动作。用等待查询的方法就可以判断了。例如判断S1键松开与否,只需在在避开闭合抖动以后执行while(!s1),当按键一松开CPU检测到s1=1,等待查询就结束,之后便可执行该按键相应的处理程序。3.6.2按键设计图3-9按键k8功能流程图本设计运用4个独立按键实现单价调节和状态切换功能。四个独立按键中,S6、S7是负责实现单价、重量的调整,S5是设置调整数值大小的。S8则是功能切换键负责不同显示结果的切换,另外一个k4键则负责在重量超出范围后清零功能。下面用流程图简要说明每个按键的作用。由于数字上调节大不和切换显示的时候位数不变,所以接着把需要显示的量的每个位通过取值表示出来,例如单价个位上的数值是单价的值乘以10去小数点之后再对10进行除法运算所得。图3-10S5键功能图3-11按键s6、s7实现单价调整子程序

4系统仿真测试在完成软件设计的基础上,本章将进行程序编译和系统调试工作。程序编译是指由程序设计语言把模块结构转换成单片机能接受的形式,将软硬件设计完成后首次结合在一起;系统调试是指发现并且消除系统存在的错误或者误差,保证单片机应用系统的可靠性。由第二章系统方案设计可知,本设计的开发环境为KeilμVision3。本章将详细介绍如何使用该环境建立、编译和调试项目,并结合软硬件说明本设计调试过程中出现的错误和误差,以及解决方案。4.1程序编译新建工程双击启动μVision3,执行KeilC51软件的菜单“Project/NewProject..."弹出"CreateNewProject"对话框。选择一个合适的文件夹,用来存放工程文件。如图4-1所示。在对话框中单击CreatNewFolder图标新建一个文件夹,取名为“电子秤”。双击进入该文件夹,在文件名后的输入框内将项目取名为“dzc”放置在该文件夹内。单击“保存”按钮,保存项目。图4-1工程保存新建工程后,KeilC51会给出选择CPU器件的提示,这里要选择Atmel公司的AT89S52,如图4-2所示。

图4-2选择CPU器件添加源程序文件创建源程序文件执行菜单“File/New...”出现一个名为Textn的文档。执行菜单“File/Save”弹出"SaveAs"对话框,将文件名改为“dzc.c"然后保存。图4-3保存文件保存好源文件后,可以将这个文件添加到项目中。单击KeilC51软件左边项目工作窗口”Target1"上的“+”号,将其展开。然后右键单击SourceGroup1,选择AddFilestoGroup‘SourceGroup1’,然后在弹出的对话框中选中刚刚保存的源文件,单击“Add”。添加完成:

图4-4源程序添加到工程编写程序并编译在源程序窗口中,输入完整的程序代码,然后单击"File/Save"保存程序.先设置开发环境参数,单击“Option"选项,在“Target”标签中设置时钟频率为12.0Mhz,在"Output"标签页,选中“CreateHEX”项,其他的为默认,然后单击“确定”按钮。图4-5设置开发参数单击工具栏中编译按钮,编译当前源程序,编译结果会显示在输出窗口中,如果显示“0Error(s),0Warning(s)"就表示程序没有问题了。如果存在错误或警告,就要仔细检查程序,修改后在编译,直到通过为止。图4-6编译工具栏

图4-7编译结果4.2仿真结果编译后的结果会生成HEX格式的程序文件"dzc.hex"该文件可以被载入并最终烧录到芯片中。将安装了芯片的实验板通电后,就可以运行里面的程序。由于有实验板的硬件协助;本设计采用在线编程的方式直接在硬件系统上观察运行效果。如图图4-8仿真结果1图4-9仿真结果2

结语本设计的研究课题为商用电子秤的设计,要求在学习并掌握单片机的工作原理、编程方法及系统设计的前提下分析电子秤的工作原理、基本功能,最后编写软件程序连接硬件电路来实现功能。电子秤基本功能包括显示和调节,需要单价、质量、总价的正确显示和单价大小调整功能。系统以89C52RC单片机为控制芯片,显示模块用1602LCD液晶显示器显示实现,调节单价模块和显示切换模块采用4个独立按键的方式。设计以结构性、可读性、功能性强的C语言作为编程语言,在KeiluVision开发环境下编写应用程序,采用模块化编程思想,结合硬件电路作整体调试,最终实现电子秤的基本功能。作为单片机初学者,通过这次实践,了解了电子秤的用途及工作原理,熟悉了用KEIL编程、ISP下载总线验证程序编写是否正确的步骤、PROTEL软件的使用等,不仅锻炼了工程设计实践能力,也培养了独立设计能力。巩固了所学知识,掌握单片机工作原理,熟习硬件、软件系统设计的过程,锻炼动手能力、查阅资料能力、综合运用知识的能力,以及培养团队合作的精神,为今后工作打下了一定的基础。但是此次毕业设计也暴露出自己专业基础的很多不足之处,比如缺乏综合应用专业知识的能力,对材料的不了解,缺乏对与专业相关知识的了解,遇困难容易烦躁,没耐心,实际动手能力差等。事实上,作为一个单片机初学者应该把数据传输、外部数据中断、存储器扩展等基本操作熟练掌握等等。此次设计中主要精力集中在软件设计上,在硬件电路原理图与印刷电路图的研究还不够熟练、透彻。因此今后应该多找几个例题稍作练习。

参考文献[1]许晓彤.基于单片机的电子秤应用[J].硅谷,2012,04:69.[2]冯秀彦.基于单片机的智能电子秤的应用与实现[J].计算机光盘软件与应用,2012,09:136.[3]李常青,魏亚坤,左凌轩,吴平.基于ADS1230的高精度智能电子秤应用[J].电子世界,2013,10:149+155.[4]刘昌盛.基于单片机的智能电子秤应用[J].山东工业技术,2015,13:64.[5]冯春宝,陈文鑫,董炎峰,何安东,李登峰.基于单片机的数字电子秤的应用与实现[J].重庆与世界(学术版),2015,07:1-3.[6]吴正平,戴龙清,黄锐,何欢.基于STM32的高精度电子秤应用[J].电子制作,2016,21:20-22+24.[7]张争刚,熊刚.基于单片机的多功能电子秤应用[J].机械与电子,2016,11:58-61.[8]刘西平,刘锦辉.基于单片机的简易电子秤应用与实现[J].电脑知识与技术,2016,10:255-256+259.[9]张文莉,吴钦木.基于STM32的无线多秤盘高精度电子秤[J].机械与电子,2016,07:50-52+56.[10]倪刚.基于STC12C5AS2的电子秤应用研究[J].电子世界,2014,13:96.[11]刘西平,刘锦辉.基于单片机的简易电子秤设计与实现[J].电脑知识与技术,2016,12(10):255-256+259.[12]史艳玲.基于单片机的自动装水装置的设计[J].科技经济导刊,2016(20):60+54.[13]黄俊梅.基于单片机教学和实训应用的电子秤设计[J].内燃机与配件,2016(09):153-155.[14]徐维维.传感器及检测技术教学改革探讨[J].廊坊师范学院学报(自然科学版),2016,16(03):114-115+121.[15]张争刚,熊刚.基于单片机的多功能电子秤设计[J].机械与电子,2016,34(11):58-61.[16]徐伦,邓涛.一种基于STM32的多功能精密电子秤[J].数字技术与应用,2016(10):148-149.[17]刘涛.物联网专业传感器技术课程改革[J].科教文汇(中旬刊),2016(10):71-73.[18]胡美娇,高美春.基于24位A/D转换的高精度电子秤的设计[J].现代计算机(专业版),2013(32):61-63+68.[19]孙泽烽,卢雨情,胡静.基于单片机的电子秤设计[J].科技创新导报,2013(28):19.[20]韩文霆,张超,乔军,郭俊杰,吴普特,SuKiOoi.基于单片机的吊秤式盆栽作物蒸渗仪设计[J].农业机械学报,2013,44(11):247-252.[21]王俊芳,王海斌,倪晓昌,刘朝晖,杨斐,杨旭.基于电阻应变片式传感器的电子秤设计与实现[J].智能计算机与应用,2016,6(06):121-123+126.[22]曹良足.传感器原理与工程应用的综合实验教学改革探讨[J].景德镇学院学报,2016,31(06):93-95.[23]刘美娟,张琦,穆远威.基于HX711的高精度电子秤的设计[J].信息通信,2017(01):142-144.[24]蒋正金,王艺环,黄旭德,张朋强.基于STM32和HX710A的高精度电子秤[J].微型机与应用,2017,36(05):91-94.[25]杨婷.基于MSP430单片机的电子称设计[J].自动化应用,2017(03):29-30+55.[26]张超洋,周启忠,张龙江,梁怀波.基于ARM单片机的高精度电子秤设计与实现[J].电子技术与软件工程,2017(06):254-255.

致谢本论文是在导师的谆谆教诲和指导下完成的,从选题、构思到定稿无不渗透着导师的心血和汗水;导师渊博的知识和严谨的学风使我受益终身,在此表示深深的敬意和感谢。这次写论文的经历也会使我终身受益,我感受到,做论文是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程。没有认真学习和钻研,自己就不可能有研究的能力,就不可能有自己的研究,就不会有所收获和突破。希望这个经历,在今后的学习和生活中能够继续激励我前进。另外,还要特别感谢我的家人,他们时刻关心我,给我提供了学习的机会,时时刻刻为我鼓劲、为我加油,进而促使我不断成长和进步。同时,也要感谢寝室的室友以及所有关心我的朋友,感谢他们陪伴我走过了很多美好的时光,在我遇到困难时他们关心我、帮助我。在完成毕业论文的过程中,很多朋友都给了我无私的帮助和支持,在此表示由衷的谢意!最后,因本人水平有限,论文肯定还有不少不足之处,恳请各位老师批评指正,我希望可以有机会继续去完善,我将不断努力继续充实自己。

附录1原理图附录2程序#include<reg52.h>#include<intrins.h>#include<string.h>bitbdataflag_key;#include"main.h"#include"LCD1602.h"#include"HX711.h"#include"keyboard.h"#include"eeprom52.h"#include"wannianli.h"#include"yyxp.h"#defineucharunsignedchar#defineuintunsignedintunsignedlongHX711_Buffer=0;unsignedlongWeight_Maopi=0;unsignedlongWeight_Maopi_0=0;intqupi=0;longWeight_Shiwu=0;//键盘处理变量unsignedcharkeycode;unsignedcharDotPos; //小数点标志及位置uintGapValue,GapValue1;unsignedlongidataprice;//单价,长整型值,单位为分unsignedlongidatadanjia[8]={11,22,33,44,100,200,300,400};unsignedcharcount_danjia;unsignedlongidatamoney,total_money;//总价,长整型值,单位为分//定义标识volatilebitFlagTest=0; //定时测试标志,每0.5秒置位,测完清0volatilebitFlagKeyPress=0;//有键按下标志,处理完毕清0//校准参数//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。//当发现测试出来的重量偏大时,增加该数值。//如果测试出来的重量偏小时,减小改数值。//该值可以为小数//#defineGapValue349sbitLED=P3^6;sbitK1=P3^0; //计算总价并语言播报//sbitK3=P2^3;volatilebitClearWeighFlag=0;//传感器调零标志位,清除0漂/******************把数据保存到单片机内部eeprom中******************/voidwrite_eeprom(){ SectorErase(0x2000); GapValue1=GapValue&0x00ff; byte_write(0x2000,GapValue1); GapValue1=(GapValue&0xff00)>>8; byte_write(0x2001,GapValue1); byte_write(0x2060,a_a); }/******************把数据从单片机内部eeprom中读出来*****************/voidread_eeprom(){ GapValue=byte_read(0x2001); GapValue=(GapValue<<8)|byte_read(0x2000); a_a=byte_read(0x2060);}/**************开机自检eeprom初始化*****************/voidinit_eeprom(){ read_eeprom(); //先读 if(a_a!=1) //新的单片机初始单片机内问eeprom { GapValue=1000; a_a=1; write_eeprom(); //保存数据 } } //显示单价,单位为元,四位整数,两位小数voidDisplay_Price(){ LCD1602_write_com(0x89); LCD1602_write_word("PR:");LCD1602_write_com(0x8c); LCD1602_write_data(price/100+0x30); LCD1602_write_data(price%100/10+0x30); LCD1602_write_data('.'); LCD1602_write_data(price%10+0x30);}//显示重量,单位kg,两位整数,三位小数voidDisplay_Weight(){ LCD1602_write_com(0x80); LCD1602_write_word("WE");LCD1602_write_com(0x83);// LCD1602_write_data(Weight_Shiwu/10000+0x30); LCD1602_write_data(Weight_Shiwu%10000/1000+0x30); LCD1602_write_data('.'); LCD1602_write_data(Weight_Shiwu%1000/100+0x30); LCD1602_write_data(Weight_Shiwu%100/10+0x30); LCD1602_write_data(Weight_Shiwu%10+0x30); LCD1602_write_data('');}//显示总价,单位为元,四位整数,两位小数voidDisplay_Money(){//unsignedinti,j;LCD1602_write_com(0x80+0x40); //指针设置LCD1602_write_word("S:");LCD1602_write_com(0xc9);LCD1602_write_word("T:");LCD1602_write_com(0xc7);LCD1602_write_word("");if(money>9999) //超出显示量程{LCD1602_write_com(0x80+0x40+2);LCD1602_write_word(".-");return;}if(money>=1000){LCD1602_write_com(0x80+0x40+2); LCD1602_write_data(money/1000+0x30); LCD1602_write_data(money%1000/100+0x30); LCD1602_write_data(money%100/10+0x30); LCD1602_write_data('.'); LCD1602_write_data(money%10+0x30);}elseif(money>=100){LCD1602_write_com(0x80+0x40+2); LCD1602_write_data(0x20); LCD1602_write_data(money%1000/100+0x30); LCD1602_write_data(money%100/10+0x30); LCD1602_write_data('.'); LCD1602_write_data(money%10+0x30);}elseif(money>=10){LCD1602_write_com(0x80+0x40+2); LCD1602_write_data(0x20); LCD1602_write_com(0x80+0x40+3); LCD1602_write_data(0x20); LCD1602_write_data(money%100/10+0x30); LCD1602_write_data('.'); LCD1602_write_data(money%10+0x30);}else{LCD1602_write_com(0x80+0x40+2); LCD1602_write_data(0x20); LCD1602_write_com(0x80+0x40+3); LCD1602_write_data(0x20); LCD1602_write_com(0x80+0x40+4); LCD1602_write_data(0+0x30); LCD1602_write_data('.'); LCD1602_write_data(money%10+0x30);}if(total_money>9999) //超出显示量程{LCD1602_write_com(0x80+0x40+11);LCD1602_write_word(".-");return;}if(total_money>=1000){LCD1602_write_com(0x80+0x40+11); LCD1602_write_data(total_money/1000+0x30); LCD1602_write_data(total_money%1000/100+0x30); LCD1602_write_data(total_money%100/10+0x30); LCD1602_write_data('.'); LCD1602_write_data(total_money%10+0x30);}elseif(total_money>=100){LCD1602_write_com(0x80+0x40+11); LCD1602_write_data(0x20); LCD1602_write_data(total_money%1000/100+0x30); LCD1602_write_data(total_money%100/10+0x30); LCD1602_write_data('.'); LCD1602_write_data(total_money%10+0x30);}elseif(total_money>=10){LCD1602_write_com(0x80+0x40+11); LCD1602_write_data(0x20); LCD1602_write_com(0x80+0x40+12); LCD1602_write_data(0x20); LCD1602_write_data(total_money%100/10+0x30); LCD1602_write_data('.'); LCD1602_write_data(total_money%10+0x30);}else{LCD1602_write_com(0x80+0x40+11); LCD1602_write_data(0x20); LCD1602_write_com(0x80+0x40+12); LCD1602_write_data(0x20); LCD1602_write_com(0x80+0x40+13); LCD1602_write_data(0+0x30); LCD1602_write_data('.'); LCD1602_write_data(total_money%10+0x30);}}//数据初始化voidData_Init(){price=0;DotPos=0;}//定时器0初始化voidTimer0_Init(){ ET0=1;//允许定时器0中断 TMOD=1;//定时器工作方式选择 TL0=0xb0; TH0=0x3c;//定时器赋予初值 TR0=1;//启动定时器}//定时器0中断voidTimer0_ISR(void)interrupt1using0{ucharCounter; TL0=0xb0; TH0=0x3c;//定时器赋予初值 //每0.5秒钟刷新重量Counter++;if(Counter>=10){FlagTest=1; Counter=0;}}//按键响应程序,参数是键值//返回键值://78910(清0)//45611(删除)//12312(未定义)//14(未定义)015(.)13(确定价格)voidKeyPress(ucharkeycode){ switch(keycode) { case0: case1: case2: case3: case4: case5: case6: case7: case8: case9: //目前在设置整数位,要注意price是整型,存储单位为分 if(DotPos==0) { //最多只能设置到千位 if(price<100) { price=price*10+keycode*10; } }//目前在设置小数位 elseif(DotPos==1)//小数点后第一位 { price=price+keycode; DotPos=2; } Display_Price(); break; case10://清零键 speak(41); if(qupi==0) qupi=Weight_Shiwu; else qupi=0; Display_Price(); // FlagSetPrice=0; DotPos=0; break; case11: //删除键,按一次删除最右一个数字 price=0; DotPos=0; Display_Price(); break; case12: //加 if(GapValue<10000) GapValue++; break; case13://减 if(GapValue>1) GapValue--; break; case14:count_danjia++; if(count_danjia>7) count_danjia=0; price=danjia[count_danjia]; Display_Price(); break; case15://小数点按下 DotPos=1;//小数点后第一位 break;}}//****************************************************//主函数//****************************************************voidmain(){yyxp_rest=1; yyxp_data=1; init_eeprom();//开始初始化保存的数据 Init_LCD1602(); //初始化LCD1602EA=0;Data_Init();Timer0_Init();//初中始化完成,开断EA=1;// Ds1302Init();// Get_Maopi(); LCD1602_write_com(0x80); //指针设置LCD1602_write_word("WelcomeToUse"); //LCD1602_write_com(0x80+0x40); //指针设置LCD1602_write_word("ElectronicScale");Delay_ms(2000);Get_Maopi();LCD1602_write_com(0x80); //指针设置LCD1602_write_word("WE:0.000PR:00.0");LCD1602_write_com(0x80+0x40); //指针设置LCD1602_write_word("S:0.0T:0.0");Display_Price();// Get_Maopi(); //称毛皮重量// Weight_Shiwu=9000; while(1) {//每0.5秒称重一次 if(FlagTest==1&&keynum==0) { Get_Weight(); } if(Weight_Shiwu<10) { keyscan(); if(keynum==0) display(); if(key2==0) { Delay_ms(5); if(key2==0) { speak(41); if(qupi==0) qupi=Weight_Shiwu; else qupi=0; while(key2==0); }} } else { keycode=Getkeyboard(); if(K1==0) { Delay_ms(5); if(K1==0) { total_money+=money; Display_Money(); bofang(1,total_money); while(K1==0); } } if(key1==0) { Delay_ms(5); if(key1==0) { total_money=0; Display_Money(); bofang(1,total_money); while(key1==0); }} if(key3==0) { Delay_ms(5); if(key3==0) { total_money=0; Display_Money(); bofang(2,price); bofang_zhongliang(Weight_Shiwu); bofang(1,money); while(key3==0); }}

温馨提示

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

评论

0/150

提交评论