谁能讲讲51单片机 hx711 怎么读取单片机程序数据,然后放到液晶上显示?不要随随便便找一段程序来忽悠。

查看: 2693|回复: 19
HX711+称重传感器在无负载时得到的数据浮动很大
用HX711+称重传感器在没有负载时能得到返回的AD值,但是每次开机测的变化很大。最开始是426038,过段时间就会变成209321,差不多就是这么大的差别,而且还不准确。不知道是什么原因啊~求指导!我给HX711供的3.3V的电,这个会不会有影响啊?
我从AD值变成重量是用类似砝码标定得到个表达式计算的,在网上看了看,还有那种用电压啊算的公式,这个计算公式的方法用人用过嘛,可以指导一下吗?
另外我不知道自己的获重程序是否出错,请大神们指教一下
unsigned long int HX711_read_byte(void)
{
& &
& &&&P9OUT &= ~BIT7;
& &&&dat=0;& && &// DOut=1,Sck=0时表明A/D 转换器还未准备好输出
& &&&while(P9IN & BIT6); //等待Dout为0,判断AD转换是否结束,未结束继续等待& && &&&
& &&&for(i=0;i&24;i++)
& &&&{& &
& &&&P9OUT |=&&BIT7;& & //sck上升沿 (发送脉冲)
&&Delay__hx711_us(4);
& &&&dat=dat&&1;& &//&&sck下降沿来临时变量左移一位,右侧补零
& &&&P9OUT &= ~BIT7; //SCK下降沿
Delay__hx711_us(4);
& &&&if(P9IN & BIT6)
& &&&dat++;
& &&&}&&
& &&&P9OUT |=&&BIT7;
Delay__hx711_us(4);
&&
& &// dat=dat^0x800000;& &
& &/* if(dat&0x800000)
& & & & {
& & & & & & & & dat|=0xFF800000;
& & & & }
& & & & else
& & & & {
& & & & & & & & dat&=0x007FFFFF;
& & & & }*/
&&if((dat& 0x800000) == 0x800000)
& & & & {
& & & & & & & & dat = ~(dat - 1);& && && &&&//这里是由补码求出其除符号位的原码的计算。
& & & & }& &&&
& &&&return (dat);& && && && &
}复制代码
是711的典型电路么?
我也遇到同样的问题 这个711太差劲了
我也遇到同样的问题 这个711太差劲了
俺在某宝上面随便买过两家的HX711, 价格2块出头, 都没发现问题
之前用过,没有发现这样的问题。
是711的典型电路么?
是的,我没改过,因为我不会改T^T
那怎么解决呢~
我也遇到同样的问题 这个711太差劲了
那请问你怎么解决的呢~
俺在某宝上面随便买过两家的HX711, 价格2块出头, 都没发现问题
那可以给我看看你获取711AD值的程序吗,谢谢
之前用过,没有发现这样的问题。
那可以给我看看你获得AD值的程序吗?
你也是连的称重传感器吗?那请问你如何把AD值计算到重量的呢
是的,我没改过,因为我不会改T^T
那怎么解决呢~
典型电路的话, 用3.3V供电可能会有问题, 建议你改成5V供电
典型电路的话, 用3.3V供电可能会有问题, 建议你改成5V供电
因为我板上只有引出的3.3v供电,怎么办呢T^T
因为我板上只有引出的3.3v供电,怎么办呢T^T
HX711典型电路包括一个稳压电路, 预设的稳压值肯定高于3.3V, 所以你用3.3V供电的话这部分电路无法正常工作
解决办法有两个, 你可以改动稳压电路反馈分压电阻的阻值将稳压器的输出电压设定为3V以下, 比如2.8V
或者你的3.3V电源质量比较好,噪声和纹波不大的话, 也可以直接把HX711的稳压电路直接短路跳过去
HX711典型电路包括一个稳压电路, 预设的稳压值肯定高于3.3V, 所以你用3.3V供电的话这部分电路无法正常工 ...
谢谢~也就是说我要自己重新焊改那个hx711板子啊?
HX711典型电路包括一个稳压电路, 预设的稳压值肯定高于3.3V, 所以你用3.3V供电的话这部分电路无法正常工 ...
稳压电路的反馈电阻可以麻烦告诉我是哪一个吗
用过HX711,感觉还可以
稳压电路的反馈电阻可以麻烦告诉我是哪一个吗
你看一下HX711的4脚是不是有两个电阻分别连到3脚和5脚, 如果是的话, 改变这两个电阻的比例就能改输出电压
假如连到3脚的电阻是20K, 连到5脚的电阻是8.2K, 这时候稳压器的输出值大概是 1.25V*((20+8.2)/8.2) = 4.3V
你把8.2K的电阻改成15K的话, 那输出电压就应该是&&1.25V*((20+15)/15) = 2.9V
大概就是这个意思, 你结合自己的实际电路试试看吧
用过HX711,感觉还可以
电源搞好了的话, HX711精度还是不错的, 命门是温漂太大, 很难搞好
我实际使用的要求的精度不是很高
你看一下HX711的4脚是不是有两个电阻分别连到3脚和5脚, 如果是的话, 改变这两个电阻的比例就能改输出电压 ...
明白意思了~~谢谢,等真的需要改的时候我再动,毕竟要改硬件了,谢谢!
以后有什么问题希望也能向你请教
你看一下HX711的4脚是不是有两个电阻分别连到3脚和5脚, 如果是的话, 改变这两个电阻的比例就能改输出电压 ...
谢谢,受益匪浅
阿莫电子论坛, 原"中国电子开发网"
, 原www.ourdev.cn, 原www.ouravr.com当前位置: >>
基于51单片机的电子称设计 (1)
编号 ()毕业设计(2015 届本科)设计题目:基于 51 单片机的电子秤设计 学 专 班 院:电气工程学院 业:电气工程及其自动化 级:11 级电气一班作者姓名:杨发强 指导教师:薛彪 完成日期:2015 年 职 称: 5 研究生 月 1 日 目录诚信声明 ............................................................... (1) 基于 51 单片机的电子秤设计 .............................................. (2) 中文摘要 .............................................................. (2) 英文摘要 ............................................................... (2) 1 引言 ................................................................. (3) 1.1 课题研究背景 ........................................................ (3) 1.2 电子衡器的研究现状 .................................................. (3) 1.3 课题的研究意义 ...................................................... (4) 1.4 本文的设计思路 ...................................................... (4) 2 系统方案论证与硬件选型 ............................................... (5) 2.1 系统总体设计方案的比较与论证 ........................................ (5) 2.2 硬件方案设计与论证 .................................................. (7) 2.3 A/D 转换器的选择 .................................................... (9) 2.4 键盘处理部分方案的论证 .............................................. (9) 2.5 显示器部分的选择 ................................................... (10) 2.6 超量程报警部分的选择 ............................................... (10) 3 硬件电路设计 ........................................................ (10) 3.1 STC89C52 单片机介绍 ................................................ (10) 3.2 A/D 转换器与 STC89C52 单片机接口电路 ............................... (12) 3.3 显示电路与 STC89C52 单片机的接口电路 ............................... (14) 4 主程序设计 .......................................................... (17) 4.1 主程序设计 ......................................................... (17) 4.2 系统主程序流程图 ................................................... (18) 4.3 系统子程序设计 ..................................................... (19) 5 系统调试 ............................................................ (20) 5.1 调试过程 ........................................................... (20) 5.2 故障分析与解决方案 ................................................. (20) 5.3 功能测试 ........................................................... (21) 5.4 精度测量 ........................................................... (21) 6 结论................................................................ (212) 参考文献 ............................................................. (212) 致 谢................................................................. (214) 附录材料目录 .......................................................... (25) 附录 1................................................................. (25) 附录 2................................................................ (257) 附录 3................................................................. (28) 陇东学院本科生毕业设计诚信声明本人郑重声明:所呈交的本科毕业设计,是本人在指导老师的指导下, 独立进行研究工作所取得的成果,成果不存在知识产权争议,除文中已经 注明引用的内容外,本设计不含任何其他个人或集体已经发表或撰写过的 作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方 式标明。本人完全意识到本声明的法律结果由本人承担。作者签名:二 O 一五年月日1 基于 51 单片机的电子秤设计杨发强,薛彪(陇东学院 电气工程学院,甘肃 庆阳 745000)摘 要: 随着数字化技术的快速不断变化和应用, 电子称重技术同样也得到了很大的发展和应用, 各种数字化智能化的电子衡器逐渐出现,但商用电子称作为电子称重方面重要的一部分,在中小型 市场并没有得到普及,依然以杆秤、台秤和普通电子秤为主的商用电子秤,存在明显的精度差、容 易损坏和难维修等缺陷,特别是在进行轻微物体、药材等的测量时误差更大。 本文设计的电子秤主要以 STC89C52 单片机为核心,通过 Proteus 软件和 Keil 软件实现了对电 子称的功能仿真设计。主要分为五个模块:物体重量采集模块、单片机处理模块、键盘控制模块、 数据显示模块以及软件驱动模块[1]。用压力传感器采集压力数值,通过 A/D 转换送给单片机,单片 机通过重量参数进而选择 24 位精度值进行处理,最后将输出的称重值显示在在 1602LCD 液晶上。 整个电子秤系统能够智能化的实现自动测量、自动报警、直接显示等功能,具有操作方便,测量准 确,成本比较低、稳定性高等特点,可以很好的用于不同的应用场合,适应了中小型市场的需要。 关键词:单片机 STC89C52;称重传感器;A/D 转换;液晶显示器The design of electronic scales based on 51 MCUYANG Fa-qiang,XUE Biao (Electrical Engineering College ,Longdong University,Qingyang 745000,Gansu,China) Abstract:With the rapid development and application of digital technology, electronic weighing technology has been developed and applied extensively .And a variety of intelligent digital electronic weighing is emerging progressively, but in small and middle market, the commercial electronics, which is an important part of the electronic weighing, is still limited to the simple electronics said such as steelyard, platform scales and simple electronics. All these are known as the main commercial electronic scales, but the existence of accuracy, easily damage, and difficult to repair defects also affect itself. Especially during weighing some minor objects such as tea, medicinal herbs, mistakes is easy to appearance through measuring. This paper, the design of the double-precision electronic using microcontroller STC89C52 as the core, achieve the simulation capabilities of electronic design by using Proteus Software and KEIL software. Now dividing this paper into five main modules: how to collect the weight of the object with this double-precision electronic said module, how to deal with the data through single-chip machine, how to control keyboard module, the display module and how to drive software module. Fristly, use different pressure sensor to acquire pressure parameters. Secondly the signal processor and A / D conversion work out the data, finally given to the MCU. Thridly according to the data above the MCU will automatically select whether the 24 precision value computing processor. Ultimately the input through the keyboard will be showed on the LCD1602 real-time display. The entire electronic system can intelligently accomplish double-precision measurement automatically, automatic alarm, visual display, at the same time, it’s easy to operate, accurate measurement, low cost, stability and high reliability. Based on the introduction above ,it can be used in different applications occasions, and it can adapt to the needs of small and medium-sized market. Key Words: Double-STC89C52;LA/DLCD display1 引 言2 1.1课题研究背景电子称重技术是现代化称重技术和系统控制工程的重要基础之一, 从 50 年代中期开始电子技术逐渐进入到衡器的辅助测量装置系统中,60 年代初期出现机电结合式电子称量系统以来,经过 40 多年的不断发展和完善,从最开始的机电结合型发展到现在的全电子型和数字化智能型,电子衡器 称重技术经过了很长的发展, 其便于与电子计算机紧密结合而实现称重计数与过程自动控制的特点, 在贸易、能源、冶金、轻工、医药、航天航空等部门得到了广泛的利用。而衡器作为国家法定计量 的器具,自古以来就被人们重视,作为一种计量方式,广泛的应用于工农业作业、科研研究、交通 计数、内外贸易等各个领域,与人民的生活紧紧相连,也是民生、国防、科学、贸易中不可缺少的 计量工具。电子称重技术作为工业控制系统和商业管理系统的重要组成,不但是提供重量数据的单 体仪器,而且推进了工业自动化生产和现代化管理,它起到了减少作业时间、改良操作条件、降低 能源材料的耗损、提高产品质量。以及加强企业管理和改善经营等多方面的应用。因此电子称量技 术水平的高低,将直接影响着各行各业的现代化水平和社会经济效益的发展和变化[2]。1.2 电子衡器的研究现状 1.2.1 国内外发展情况从国际上看,随着二十世经济发展越来越快,为了能够把称重技术引入到越来越先进生产工艺 中去,使称重技术的发展越来越智能化,希望称重过程向自动化发展,因此电子技术不断进入衡器 制造业。在 1954 年使用了带新式打印机的倾斜式秤,其输出信号能够控制商用结算器,并且用电磁 铁机构与人工操作系统的按键与办公机器联用。在 1960 年开发出了与衡器相联的专门称重值打印 机。在当时带有电子装置的衡器其称重工作是机械式的,但其中称重有关的显示记录和远传式控制 器等功能是电子自动方式。电子秤的发展过程与其他事物一样,同样经历了由简单到复杂变换、由 粗糙到精密变化、由机械到机电结合再到全面电子化、再由单一功能到多功能发展的过程。 在国内,我国的称重技术在 20 世纪 40 年代以前还全是机械式的杆秤和台秤,40 年代开始发展 了机电结合式的称量技术。50 年代开始,出现了以称重传感器为主的电子秤。80 年代以来,我国通 过自行研究和探索消化吸收和技术改造。已由传统机械式衡器步入集传感器、微电子技术、计算机 技术和一体化的电子衡器发展阶段。目前,由于电子衡器具有称量快、读数方便、能在恶劣条件下 工作、便于与计算机技术结合而实现称重技术和过程控制的自动化特点,已被广泛应用于工矿企业、 能源交通、商业贸易和科学技术等各个部门,但商用电子称在国内的发展,并没有像其他功用的电 子秤一样取得飞速的发展,只有在部分大型超市可以看到多功能电子称的运用,但其造价高操作复 杂,无法在中小市场得到广泛的推广应用,中小市场仍然依赖于传统的杆秤和简易的低精度电子称, 但随着电子技术的不断发展,以及衡器工艺技术的不断完善,更多品种的的电子称研发必然会推动 中小市场电子秤的改进。1.2.2 电子称的发展方向3 电子称的发展动向为:小型化、模块化、智能化、集成化;其技术性能趋向于速率高、准确度 高、可靠性高;其应用性趋向于综合性、组合性;而且更需要向多种功能的方向发展。 目前电子称的附加功能主要有以下几种: (1)具有皮重、净重显示、语音播报等功能呢。电子称部分已具备了动态称量模式,即通过进行 算术平均、积分处理和自动调零等方法,消除上述的误差; (2)电子称附加了计算机信息补偿处理装置,可以进行自诊断、自校正和多种补偿计算和处理; (3)附加单价总额计算功能。目前的电子称有附加多种计算和数据额处理功能,以满足多种使用 的要求[3]。1.3 课题的研究意义今后,随着电子高科技的快速发展,电子称重技术也定将日新月异。功能更加齐全的高精度的 先进电子称将会不断问世,其应用范围也会更加广阔。从实际情况看来,目前中小型市场上使用的 称量工具,主要还是以杆秤、台秤、小型简易电子称为主,操作简单但精度比较低,而且调整时间 长,运行不可靠,易损件多,维修困难,能源消耗大,生产成本比较高。这些特点导致了中小型市 场上电子称产品的整体水平偏低,产品质量在低水平徘徊。在这些中小型市场,称重仪器选择的局 限性,已逐渐无法满足越来越走向现代化的需求,对电子称的要求不仅仅要简便而且要更公平更合 理,对精度不仅有要求,对功能也有更多的期望,电子称不仅要称量较重物体,还能够更精确的称 量较轻的物体,比如茶叶和药材等,要求精度更高,称量更准确。双精度电子称便是基于此而提出 的研发课题,不仅能够自动切换精度进行测量不同物体,还能够克服上述诸多缺点,实现操作简易、 维修容易、调整时间短、不易损坏等特点,还具有较大的实用价值。1.4 本文的设计思路随着微控制器技术、传感器技术的发展和计算机技术的广泛应用,电子产品的更新速度达到了 日新月异的地步。本系统在设计过程中,除了能实现系统的基本功能外,设计两个称重电路以对应 不同精度、不同承重范围的物品,还增加了超重提示功能,在连接电路图时,选用尽量少的管脚来 实现设计的全部功能,这样方便以后的功能拓展,比如可以实现和其他机器或设备(包括上位PC机 和数据存储设备)交换数据。除此之外,系统的微控制器部分选择了兼容性比较好的AT89系列单片 机,在系统更新换代的时候,只需要增加很少的硬件电路,甚至仅仅删改系统控制程序就能够实现。 电子秤不仅要向高精度、高可靠方向发展,而且更需向多种功能的方向发展。据悉, 目前电子 秤的附加功能主要有这些方面:电子秤附加了计算机信息补偿处理装置,可以进行自诊断、自校正 和多种补偿计算和处理;具有皮重、净重显示等特种功能。电子秤有些已具备了动态称量模式, 即 通过进行算术平均、积分处理和自动调零等方法, 消除上述的误差;附加特殊的数据处理功能。目 前的电子秤有附加多种计算和数据处理功能, 以满足多种使用的要求。另外由于实际应用当中,称 重器可以有一定量的过载,但不能超出要求的范围,系统自动零显示,提示出错。 综上所述,本课题的主要设计思路是:利用压力传感器采集因压力变化产生的电压信号,经过电4 压放大电路放大,然后再经过模数转换器转换为数字信号,最后把数字信号送入单片机。单片机经 过相应的处理后,得出当前所称物品的重量及总额,然后再显示出来。本文主要以下几个方面的工 作: (1)详细讲解了称重器工作原理。 (2)对称重器系统进行总体方案的设计。 (3)对于称重器的硬件系统,重点介绍关于精度、转换速率的压力传感器和A/D转换模块器件的 选取。LCD 显示 压力传感器 信号转换 单 片 电源输入 机 报警电路 键盘控制图 1-1 设计思路框图(4)对于称重器的软件系统, 通过解说LCD液晶显示, 对于主程序的编写与调试提供重要的依据。 (5)依据称重系统的总电路,通过Keil软件C语言编程和Proteus仿真,实现模拟的称重显示。 (6)对称重系统的测量值与显示值的差值,进行系统的调试与误差校正。 主要技术指标为:称量范围0~5Kg;分度值0.001精度等级Ⅲ级;电源DC 9V。这种高精度智 能电子秤体积小、计量准确、携带方便,集重量称量功能于一体,能够满足商业贸易和居民家庭的使 用需求。2 系统方案论证与硬件选型2.1 系统总体设计方案的比较与论证在设计系统时,针对各个模块实现的功能来设计电子秤的方案有以下几种: 方案一 数码管显示。此方案利用数码管显示物体重量,简单可行,可以采用内部带有模数转换功能的单片机。此设计的硬件部分简单,接口电路易于实现,并且在编程时大大减少程序量,在 电路结构上只有简单的输出输入关系。缺点是:硬件部分简单,虽然可以实现电子称基本的称重功 能,但是不能实现外部数据的输入,无法实时地设定各种控制参数。由于数码管只能实现简单的数 字和英文字符的显示,不能显示汉字以及其他的复杂字符,不能达到显示购物清单的要求。又因为 采用了具有模数转换功能的单片机,系统电路过于简单,系统硬件的扩展必受到限制,电子秤的功 能过于单一,达不到设计的标准。结构如图 2-1 所示:数据采集 单片机 数码管显示图 2-1 数码管显示方案 5 方案二在前一种方案的基础上进行扩展,增加一键盘控制装置,增加外界对单片机内部的数据设定,使电子称实现称重计价的功能。结构简图如图 2-2 所示:数码管显示 数据采集 单片机 键盘输入 图 2-2 带有键盘输入的结构简图此方案设计的电子秤,可以实现称物计价功能,但是局限于数码管的功能,在显示时只能显示 单价、购物总额以及简单的货物代码等。在显示重量时,如果数码管没有足够的位数,那么称量物 体重量的精度必受到限制,所以此方案需要较多的数码管接入电路中。这样在处理输入输出接口时 需要另行扩展足够多的 I/O 接口供数码管使用,比较麻烦。 方案三 前端信号处理时,选用放大、信号转换等措施,尤其在显示方面采用具有字符图文显示 功能的 LCD 显示器。这种方案不仅加强了人机交换的能力,而且满足设计要求,可以显示购物清单 和所称量的物体信息等相关内容。结构简图如图 2-3 所示:LCD 显示 单 压力传感器 AD 转换器 片 机 键盘控制 报警电路图 2-3LCD 显示的方案目前单片机技术比较成熟,功能也比较强大,被测信号经放大整形后送入单片机,由单片机对 测量信号进行处理并根据相应的数据关系译码显示出被测物体的重量。单片机控制适合于功能比较 简单的控制系统,而且其具有成本低,功耗低,体积小算术运算功能强,技术成熟等优点。但其缺点是 外围电路比较复杂,编程复杂。使用这种方案会给系统设计带来一定的难度。 方案四 采用以现场可编程门阵列(FPGA)为控制核心,利用 EDA 软件编程,下载烧制实现。系 统集成于一片 Xilinx 公司的 SpartanⅡ系列 XC2S100E 芯片上,体积大大减小、逻辑单元灵活、集成 度高以及适用范围广等特点,可实现大规模和超大规模的集成电路[4]。 采用 FPGA 测频测量精度高,测量频率范围大,而且编程灵活、调试方便,设计要求的精度较 高,所以要求系统的稳定性要好,抗干扰能力要强。从中可以看到系统的基本工作流程和各单元电 路所用到的核心器件。其中控制器采用 Xilinx 公司可编程器件 FPGA 为核心,基于 ISE 软件平台, 采用 VHDL 编程实现数据处理、LED 和 LCD 驱动、时钟芯片的 I2C 通讯、键盘控制等模块。结构 简图如图 2-4 所示:FPGA 的逻辑容量密度大,集成度高,可大大减少印刷电路板的空间,减低系统 功耗,同时还可以提高设计的工艺性和产品的可靠性。6 虽然以 FPGA 为核心的电子称系统很优化,但只有在大规模和超大规模集成电路中其高集成度 才能更好得以体现。其主要在 PC 机接口卡的总线接口、程控交换机的信号处理与接口、雷达声纳 系统的成像控制与数字处理、数控机床的测试系统等方面有广泛应用。鉴于本电子称的设计并不太 复杂,单片机完全能实现所需功能,所以在具体设计时,采用了第三种设计方案。LCD 显示 压力传感器 信号转换 FPGA 时钟芯片 报警电路 键盘控制图 2-4 电子称系统的组成结构图2.2 硬件方案设计与论证 2.1 CPU 的选择方案本文基于以单片机为主控制器的设计,可以容易地将计算机技术和测量控制技术结合在一起, 组成新型的只需要改变软件程序就可以更新换代的“智能化测量控制系统”。这种新型的智能仪表 在测量过程自动化、测量结果的数据处理以及功能的多样化方面,都取得了巨大的进展。STC 公司 的 51 系列的单片机都可使用,在这里选用 STC 生产的 STC89C52 单片机[5]。 STC89C52 的优势: 第一,STC89C52 是 STC 公司生产的一种低功耗、高性能 CMOS8 位微控制器,具有 8K 在系 统可编程 Flash 存储器。 第二,STC89C52 使用经典的 MCS-51 内核,但做了很多的改进使得芯片具有传统 51 单片机不 具备的功能。在单芯片上,拥有灵巧的 8 位 CPU 和在系统可编程 Flash,使得 STC89C52 为众多嵌 入式控制应用系统提供高灵活、超有效的解决方案。 第三, 具有以下标准功能: 8k 字节 Flash,512 字节 RAM, 32 位 I/O 口线,看门狗定时器, 内置 4KB EEPROM,MAX810 复位电路,3 个 16 位定时器/计数器,4 个外部中断,一个 7 向量 4 级中断结构(兼容传统 51 的 5 向量 2 级中断结构),全双工串行口。 第四, STC89X52 可降至 0Hz 静态逻辑操作, 支持 2 种软件可选择节电模式。 空闲模式下, CPU 停止工作,允许 RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保存, 振荡器被冻结, 单片机一切工作停止, 直到下一个中断或硬件复位为止。 最高运作频率 35MHz, 6T/12T 可选。2.2 传感器的选择传感器的定义:能感受规定的被测量,并按照一定规律转换成可用输出信号的器件或装置。通 常传感器由敏感元件和转换元件组成。其中敏感元件指传感器中能直接感受被测量的部分,转换部 分指传感器中能将敏感元件输出量转换为适于传输和测量的电信号部分。现代科技的快速发展使人 类社会进入了信息时代,在信息时代人们的社会活动将主要依靠对信息资源的开发和获取、传输和7 处理,而传感器处于自动检测与控制系统之首,是感知获取与检测信息的窗口;传感器处于研究对 象与测控系统的接口位置,一切科学研究和生产过程要获取的信息,都要通过它转换为易传输与处 理的电信号[6]。 称重传感器是力传感器当中一个重要的品种,实际应用及其广泛。 称重传感器中最多的是电阻应 变式称重,应变片是称重传感器的核心单元,弹性体是基础组成部分。称重传感器按结构类型分主要 有 S 行双连孔式传感器,柱式传感器,轮辐式与桥式传感,柱环式传感器,剪切梁式传感器和单 S 梁式 传感器。S 行双连孔式传感器量程范围一般在 2Kg 到 500Kg,这种类型称重传感器抗偏,抗侧能力较 强。柱式传感器的测量范围都很大,一般最大可以达到几百吨,它刚性好,抗过载能力强,加工也 简单,重量也比较轻。轮辐式传感器由于结构的对称性,所以能够承受大的侧向力,由于它有较大 的滞后误差,很多场合都被桥式传感器所取代。桥式传感器的弹性体形状像桥,因此得得名。桥式 传感器精度高,标定方便,普遍应用于汽车秤跟平台秤等多个场合。柱环式传感器由于本身的结构 特性目前大多仅用于测量拉力,其精度一般在 0.03 到 0.05 之间。剪切梁式传感器运用剪切原理制作 而成,精度跟稳定性都很高,一般都不需要线性补偿都能达到要求。它不受测力点变化的影响。测 量范围在几十千克的场合一般选用单 S 梁式传感器,它不适合在振动大的时候使用。图 2-5 传感器工作原理图称重传感器在选用过程中一般要考虑以下问题: (1)安装要求,有些场合就直适合某种特定的称重传感器。 (2)使用环境条件,如需密封、防爆等。 (3)传感器的精度等级。精度等级通常由弹性体结构决定,以及处理过程中是否有线性补偿。 (4)传感器的量程范围。估算被测物体的最大重量在多少,要想获得较准备的测量数值一般选择 的量程是被测体最大重量的 2 到 2.5 倍。 (5)传感器使用过程受温度影响的特性和蠕变特性 经过查询资料对比, 适合本设计的可以用平行梁应变式传感器, 最大量程为 5Kg, 精度为 0.001%, 满量程时误差为+0.01Kg;有考虑到秤台自重,震动和冲击分量,还要避免超重破坏传感器,允许最8 大量程时误差+0.1kg,可满足本系统的精度要求。它的特点:精度高、易加工、结构简单紧凑、抗 偏载能力强、固有频率高。其工作原理如图 2-5 所示: 其工作原理:用应变片测量时,将其粘贴在弹性体上。当弹性体受力变形时,应变片的的敏感 栅也随之变形,其阻值发生相应的变化,通过转换电路转换为电压的变化。由于内部线路采用惠斯 通电桥,当弹性体承受载荷产生变形时,输出信号电压可由下式(2-1)给出:Eout ?R2 ? R4 ? △R1 △R2 △R3 △R4 ? ?? ? ? ? ? ? Ein ( R2 ? R4) ? R1 R2 R3 R4 ?(2-1)2.3 A/D 转换器的选择A/D 转换部分是整个设计的关键,这一部分处理不好,会使得整个设计毫无意义。HX711 是一 款专为高精度电子秤而设计的 24 位 A/D 转换器芯片。与同类型其它芯片相比,该芯片集成了包括 稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗 干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端 MCU 芯片 的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关 可任意选取通道 A 或通道 B,与其内部的低噪声可编程放大器相连。通道 A 的可编程增益为 128 , 对应的满额度差分输入信号幅值分别为± 20mV 或± 40mV。通道 B 则为固定的 64 增益,用于系统参 数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的 A/D 转换器提供电源,系统板上 无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的 初始化过程[7]。 HX711 的芯片功能介绍,该芯片有两路可选择差分输入,片内低噪声可编程放大器,可选增益 为 128。同时稳压电路可直接向外部传感器和芯片内 A/D 转换器提供电源片内时钟振荡器无需任何 外接器件,必要时也可使用外接晶振或时钟。选用上电自动复位电路简单的数字控制和串口通讯。 所有控制由管脚输入, 芯片内寄存器无需编程可选择 10Hz 或 80Hz 的输出数据速率, 同步抑制 50Hz 和 60Hz 的电源干扰耗电量(含稳压电源电路)。 典型工作电流:& 1.7mA, 断电电流:& 1μA , 工作电压范围:2.6 ~ 5.5V,工作温度范围:-20 ~ +85℃。2.4 键盘处理部分方案的论证目前,微机系统中最常用的是触电式开关按键。在编写单片机程序时,键盘作为一种人机接口 的方式实现,是很常用的。而一般的实现方法包括: ① 外接键盘扫描芯片(例如
等),然后由该芯片来完成去抖、键值读取、中断请求等 功能。最后单片机响应中断并读取键值,有时也可以采用轮训的方式。 ② 如果按键数较少,那么可以直接将按键接到单片机的 I/O 口,然后各按键取逻辑或送到单片机的 中断管脚(对于 51 体系),单片机响应中断后再去读取 I/O 口的数据。如果单片机的中断向量比较 少(例如 AVR 系列单片机,每个 I/O 口都可以作为中断),也可以直接把各个键盘接到每个具有中 断功能的 I/O 上面。在中断处理程序中,往往需要执行这样一个操作序列:延时一定的时间去抖,9 如果按键有效,那么等待按键释放。 上述两种方法都存在比较明显的缺陷:第一种方法需要专门的外围芯片,增加成本,且一般不 容易检测按键的按下、释放及长按键等事件。第二种方法同样不容易检测按键的按下、释放及长按 键等事件。且采用软件延时的方式,浪费 CPU 资源,很不可取。 鉴于上述两种方法的缺点,我们可以采用扫描式的方法来判断按键事件。扫描方法即 CPU 在一 定的节奏下,去扫描按键数据线上的信号,然后分析并确定按键事件。因为本设计的电子秤需要设 置最大量程和清零去皮[8]。2.5 显示器部分的选择显示器是人机交换的主要部分,它可以将测量电路测得的数据经过 CPU 处理后直观的显示出 来。 数据显示有两种方案: LED(全称: Light Emitting Diode) 数码显示和 LCD (全称: Liquid Crystal Display)液晶显示。LCD 液晶显示器是一种极低功耗显示器,从电子表到计算器,从袖珍仪表到便 携式微型计算机以及一些文字处理机都用到了液晶显示器。LCD 液晶显示具有显示质量高,数字式 接口,体积小,重量轻,功耗低等优点。因此,本次设计选择了 LCD 液晶显示器。这里我们采用 1602LCD 液晶显示器,主要用于显示数字、专用符号和图形。2.6 超量程报警部分的选择智能仪器一般都具有报警和通讯功能,报警主要用于系统运行出错、当测量的数据超过仪表量 程或者是超过用户设置的上下限时为提醒用户而设置。在本系统中,设置报警的目的就是在超出电 子秤测量范围时,发出声光报警信号,提示用户,防止损坏仪器。 超限报警电路是由单片机的 I/O 口来控制的,当称重物体重量超过系统设计所允许的重量时, 通过程序使单片机的 I/O 值为高电平,报警灯 D2 发光。3 硬件电路设计3.1 STC89C52 单片机介绍 3.1.1 STC89C52 单片机综述单片机的诞生标志着计算机正式形成了通用计算机系统和嵌入式计算机系统两个分支。通用计 算机系统主要用于海量高速数值运算,不必兼顾控制功能,其数据总线的宽度不断更新,而且不断 提高运算速度和完善通用操作系统。以突出其高速海量数值运算能力,在数据处理、模拟仿真、人 工智能、图象处理、多媒体、网络通信中得到了广泛的应用;单片机作为最典型的嵌入式系统,由 于其微小的体积和低廉的成本,广泛应用于家用电器、机器人、仪器仪表、工业控制单元、办公自 动化设备以及通信产品中,成为现代电子系统中最重要的智能化工具。因此,单片机的出现大大促 进了现代计算机技术的飞速发展,成为近代计算机技术发展史上一个重要里程碑。 单片机的典型代表是 Intel 公司在 20 世纪 80 年代初设计生产的 MCS-51 单片机。 后来 Intel 公司 把 MCS-51 的核心技术授权给了很多其它的公司,所以有很多公司在做以 8051 为核心的单片机,当 然, 功能或多或少有些改变以满足不同的需求, 其中的 89C52 就是这几年在我国非常流行的单片机,10 这是由美国 ATMEL 公司开发生产的。 STC89C52 是一种低功耗、高性能 CMOS8 位微控制器,具有 8K 在系统可编程 Flash 存 储器。使用 Atmel 公司高密度非 易失性存储器技术制造,与工业 80C51 产品指令和引脚完全兼 容。片上 Flash 允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的 8 位 CPU 和在系统可编程 Flash,使得 STC89C52 为众多嵌入式控制应用系统提 供高灵活、超有效的解 决方案。STC89C52 具有以下标准功能:8k 字节 Flash,256 字节 RAM,32 位 I/O 口线,看门狗定 时器,2 个数据指针,三个 16 位 定时器/计数器,一个 6 向量 2 级中断结构,全双工串行口,片内 晶振及时钟电路。另外,STC89C52 可降至 0Hz 静态逻辑操作,支持 2 种软件可选择节电模式。空 闲模式下,CPU 停止工作,允许 RAM 、定时器 / 计数器、串口、中断继续工作。掉电保护方 式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位 为止。 在本系统中用于称量的主要器件是称重传感器, 称重传感器在受到压力或拉力时会产生电信号, 受到不同压力或拉力是产生的电信号也随着变化,而且力与电信号的关系一般为线性关系。由于称 重传感器一般的输出范围为 0~20mV, 对 A/D 转换或单片机的工作参数来说不能使 A/D 转换和单片 机正常工作,所以需要对输出的信号进行放大。由于传感器输出的为模拟信号,所以需要对其进行 A/D 转换为数字信号以便单片机接收。单片机根据称重传感器输出的电信号和速度传感器输出的速 度信号计算出物体的重量。在本系统中,硬件电路的构成主要有以下几部分:STC89C52 的最小系 统构成、电源电路、数据采集、人机交换电路等[9]。3.1.2 STC89C52 的最小系统电路构成STC89C52 单片机的最小系统由时钟电路、复位电路、电源电路及单片机构成。单片机的时钟 信号用来提供单片机片内各种操作的时间基准,复位操作则使单片机的片内电路初始化,使单片机 从一种确定的初态开始运行。最小系统图如下 3-2 所示。 单片机的时钟信号通常用两种电路形式得到:内部振荡方式和外部振荡方式。在引脚 XTAL1 和 XTAL2 外接晶体振荡器(简称晶振)或陶瓷谐振器, 就构成了内部振荡方式。 由于单片机内部有一 个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲。 当单片机的复位引脚 RST 出现 2 个机器周期以上的高电平时,单片机就执行复位操作。如果 RST 持续为高电平,单片机就处于循环复位状态。根据应用的要求,复位操作通常有两种基本形式: 上电复位和上电或开关复位。上电复位要求接通电源后,自动实现复位操作。 上电或开关复位要求电源接通后,单片机自动复位,并且在单片机运行期间,用开关操作也能 使单片机复位。单片机的复位操作使单片机进入初始化状态,其中包括使程序计数器 PC=0000H, 这表明程序从 0000H 地址单元开始执行。 系统复位是任何微机系统执行的第一步,使整个控制芯片回到默认的硬件状态下。51 单片机的 复位是由 RESET 引脚来控制的,此引脚与高电平相接超过 24 个振荡周期后,51 单片机即进入芯片11 内部复位状态,而且一直在此状态下等待,直到 RESET 引脚转为低电平后,才检查 EA 引脚是高电 平或低电平,若为高电平则执行芯片内部的程序代码,若为低电平便会执行外部程序。3.2 A/D 转换器与 STC89C52 单片机接口电路HX711 是 24 位单片 A/D 转换器。它采用逐次逼近型的 A/D 转换器,最大转换时间为 25us,转 换精度为 0.05%,所以适合于高精度的快速转换采样系统。芯片内部包含微处理器借口逻辑(有三 态输出缓冲器) , 故可直接与各种类型的 8 位或者 16 位的微处理器连接, 而无需附加逻辑接口电路, 且能与 CMOS 及 TTL 电路兼容。HX711 采用 16 脚双列直插标准封装如下图 3-3 所示[10]。图 3-2 STC89C52 最小系统电路HX711 有 5 根控制线,逻辑控制输入信号有: VBG:字节选择控制信号。 VSUP:片启动信号。 VFB:片选信号。当 CS=0,CE=1 同时满足时,HX711 才处于工作状态,否则工作被禁止。 INNA:读数据/转换控制信号。 PD-SCK:数据输出格式选择控制信号。当其为高电平时,对应 12 位并行输出;为低电平时,对应 8 位输出。 当 R/-C=0,启动 A/D 转换:当 A0=0,启动 12 位 A/D 转换方式;当 A0=1,启动 8 位转换方式。 当 R/-C=1,数据输出,A0=0 时,高 8 位数据有效;A0=1 时,低 4 位数据有效,中间 4 位为 0,高 4 位为三态。12 输出信号有: XI: 工作状态信号线。 当启动 A/D 进行转换时, HX711 为高电平; 当 A/D 转换结束时为低电平。 则可以利用此线驱动一信号二极管的亮灭,从而表示是否处于 A/D 转换。 由于对 HX711 的 8、10、12 引脚的外接电路有不同连接方式,所以 HX711 与单片机的接口方 案有两种, 一种是单极性接法, 可实现输入信号 0~10V 或者 0~20V 的转换; 另一种为双极性接法, 可实现输入信号-5~+5V 或者-10~+10V 之间转换。本次设计采用单极性接法,如图 3-4 所示。 根据芯片管脚的原理,无论启动、转换还是结果输出,都要保证 CE 端为高电平,所以可以将 单片机的/RD 引脚和/WR 端通过与非门与 HX711 的 INPA 端连接起来。转换结果分高 8 位、低 4 位 与 P0 口相连,分两次读入,所以 12/-8 端接地。同时,为了使 CS、A0、R/-C 在读取转换结果时保 持相应的电平,可以将来自单片机的控制信号经 74LS373 锁存后再接入。CPU 可采用中断、查询或 者程序延时等方式读取 HX711 的转换结果,本设计采用查询方式[11]。图 3-3 HX711 芯片引脚图图 3-4HX711 与 STC89C52 的接线图13 3.3 显示电路与 STC89C52 单片机的接口电路图 3-5 单片机与 LCD 接线图3.3.1 1602 点阵型 LCD 简介1602 是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及 128× 64 全点阵液晶显示器组 成。可完成图形显示,也可以显示 4× 8 个(16× 2 点阵) 字母[12]。 主要技术参数与显示特性: 电源:VDD 3.3V~+5V(内置升压电路,无需负压); 显示内容:128 列× 64 行; LCD 类型:STN; 多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等。3.3.2 点阵 LCD 的显示原理在数字电路中,所有的数据都是以 0 和 1 保存的,对 LCD 控制器进行不同的数据操作,可以得 到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要 8 位(一字节)即可。而对于 中文,常用却有 6000 以上,于是我们的 DOS 前辈想了一个办法,就是将 ASCII 表的高 128 个很少 用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低 128 位则留给英文字符使用,即 英文的内码。那么,得到了汉字的内码后,还仅是一组数字,若要在屏幕上显示,就涉及到文字的 字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信 息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图 3-6 所示:14 图 3-6“A”字模图3.3.3 1602LCD 指令系统表 3-2 1602LCD 指令表指令命令 引 脚 显示开关 显示起示行设置 页设置 列地址设置 读状态 写数据 读数据 (1)显示开/关指令 R/W 0 0 0 0 1 0 1 RS 0 0 0 0 0 1 1控制信号 DB7 DB6 DB5 0 1 1 1 BUSY 0 1 0 X 0 1 X 1 X DB4 1 X 1 X DB3 1 X 1 X 0 DB2 1 X X X 0控制代码 DB1 1 X X X 0 DB0 I/O X X X 0ON/OFF RST 写数据 读数据15 R/WRS 00DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 1 1 1 1 1 1/0当 DB0=1 时,LCD 显示 RAM 中的内容;DB0=0 时,关闭显示。 (2)显示起始行(ROW)设置指令 R/WRS 00 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 11 显示起始行(0--63)该指令设置了对应液晶屏最上一行的显示 RAM 的行号, 有规律地改变显示起始行, 可以使 LCD 实现显示滚屏的效果。 (3)页(PAGE)设置指令 R/WRS 00 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 100111 页号(0--7)显示 RAM 共 64 行,分 8 页,每页 8 行。 (4)列地址(Y/Address)设置指令 R/WRS 00 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 01 显示列地址(0--63)设置了页地址和列地址,就唯一确定了显示 RAM 中的一个单元,这样 MPU 就可以用读、写指 令读出该单元中的内容或向该单元写进一个字节数据。 (5)读状态指令 R/WRS 00 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 BUSY 0 ON/OFF REST 0 0 0 0该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下: BUSY:1-内部在工作 0-正常状态; ON/OFF:1-显示关闭 0-显示打开; RESET:1-复位状态 0-正常状态; 在 BUSY 和 RESET 状态时,除读状态指令外,其它指令均不对液晶显示模块产生作用。在对液 晶显示模块操作之前要查询 BUSY 状态,以确定是否可以对液晶显示模块进行操作。 (6)读写数据指令 R/WRS 00 (7)读数据指令16DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 写数据 R/WRS 00DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 读/显示数据读、写数据指令每执行完一次读、写操作,列地址就自动增一。必须注意的是,进行读操作之 前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据[13]。4 系统软件设计4.1 主程序设计在单片机应用系统的开发中,软件的设计是最复杂和困难的,大部分情况下工作量都较大,特 别是对那些控制系统比较复杂的情况。如果是机电一体化的设计人员,往往需要同时考虑单片机的 软硬件资源分配。本系统的软件设计主要分为系统初始化、按键、显示处理及信号频率输入处理。 程序设计是一件复杂的工作,为了把复杂的工作条理化,就要有相应的步骤和方法。其步骤可 概括为以下三点: (1) 分析系统控制要求,确定算法:对复杂的问题进行具体的分析,找出合理的计算方法及适 当的数据结构,从而确定编写程序的步骤。这是能否编制出高质量程序的关键。 (2) 根据算法画流程图:画程序框图可以把算法和解题步骤逐步具体化,以减少出错的可能性。 (3)编写程序:根据程序框图所表示的算法和步骤,选用适当的指令排列起来,构成一个有机的 整体,即程序。 程序数据的一种理想方法是结构化程序设计方法。结构化程序设计是对利用到的控制结构类程 序做适当的限制,特别是限制转向语句(或指令)的使用,从而控制了程序的复杂性,力求程序的上、 下文顺序与执行流程保持一致性,使程序易读易理解,减少逻辑错误和易于修改、调试。根据系统 的控制任务,本系统的软件设计主要由主程序、初始化程序、A/D 转换子程序、键盘扫描子程序和 显示子程序等组成。4.1.1 C 语言在单片机中的应用C 语言是一种通用的计算机程序设计语言,在国际上非常流行。它既可以用来编写计算机的系 统程序,也可以用来编写一般的应用程序。以前计算机的系统软件主要用汇编语言编写,单片机应 用系统更是如此。C 语言是当前最流行的程序设计语言,它像其它高级语言一样,面向用户,面向 解题的过程,编程者不必熟悉具体的计算机内部结构和指令;C 语言又像汇编语言一样,可以对机 器硬件进行操作。如进行端口 0,1 操作、位操作、地址操作,并可内嵌汇编指令,将汇编指令当作 它的语句一样。我们知道,汇编语言将涉及计算机硬件,所以 C 语言又像低级语言一样,可以对计 算机硬件进行控制,因此人们把它称为介于高级语言与低级语言之间的一种中级语言。正是因为 C 语言具有这样的特性,所以很适合编写要对硬件进行操作的软件程序 [14]。本文采用 C 语言进行编 写.因为经系统软件比较,本系统存储量较大,因此必须应用 C 语言编程了。4.1.2 电子称的软件设计与实现17 电子称软件设计均采用模块化设计,整个程序包括主程序、A/D 转换模块程序、键盘扫描程序、 液晶显示子程序等模块。所有程序均采用 C 语言编写。4.2 系统主程序流程图主程序流程图 4-1 给出了系统工作的基本过程,描述了信号的基本流向,起到一个向导的作用。图 4-1 系统总程序图4.3 系统子程序设计系统子程序主要包括 A/D 转换启动及数据读取程序设计、键盘输入控制程序设计。4.3.1 A/D 转换启动及数据读取程序设计A/D 转换子程序主要是指在系统开始运行时,把称重传感器传递过来的模拟信号转换成数字信 号并传递到单片机所涉及到的程序设计,如图 4-2 所示。4.3.3 键盘输入控制程序设计当有键按下时,要逐行或逐列扫描来判断是哪个按键按下。通常的扫描方式有扫描法和反转法。4.3.2显示程序设计显示子程序主要是来判断是否需要显示,以及如何去显示,也是十分重要的程序之一。 如下图 4-318 所示。图 4-2A/D 转换启动及数据读取程序流程图 开始LCD 初始化启动屏幕控制键按下调试程序 图 4-3 显示子程序流程图19 5 系统调试5.1 调试过程软件模块本文主要应用 Keil 软件进行编程,编程采用模块化结构,先易后难,逐步实现相应的 功能。软件程序的调试,我们主要结合硬件仿真图来进行。具体调试步骤有: (1) A/D 转换程序的调试,双精度的电子称设计主要基于两款不同的 A/D 转换芯片,一个是 8 位的 A/D,一个是十二位的 A/D,因此在进行 A/D 转换采集程序的调试时,不仅要能够实现参数的 采集,还需要考虑相应的压力测量范围,使两种精度范围不会产生冲突,程序调试时也主要围绕这 样的思路进行,结合硬件仿真图,先调试 8 位 A/D 的采集转换,能够正常工作后再进行 12 位的 A/D 转换,最后进行两个程序的整合,实现不同压力段的测量。 (2) 显示程序的调试,基于 1602 液晶的显示程序是软件程序的另一个大模块,128*64 的液晶 模块能够支持 4*8 的汉字显示,能够十分方便的显示电子称的输入输出参数,但 1602 仿真模块并没 有相应的汉字库和字符库,因此在编程时不得不自己编写字库,然后进行调用,这一块是比较难的, 本文在调试时,完成的思路也是从小到大,先实现液晶的初步显示,然后结合采集程序,逐步加入 显示的汉字和字符,最终完成设计功能。5.2 故障分析与解决方案 5.2.1 故障出现情况(1)24 位 A/D 采集不能正常进行,无法实现循环采集参数; (2)液晶显示不能正常工作,总是出现跳变; (3)键盘控制不够灵活。5.2.2 解决方案上述三个问题是整个系统方案设计过程中比较难解决的问题, 针对上述故障我们通过耐心调试, 一一对应的完成了解决方案。 (1)12位A/D采集不能正常进行,主要有两个问题,一个问题是硬件电路冲突,另一个问题软件 程序嵌套不合理。硬件电路的冲突来源于读取12位的参数时引脚的分配,所以本文首先对电路图进 行了修改,在启动转换硬件部分做了更周密的分析和设计,其次对于程序的嵌套和调用也进行了更 为详细的梳理,不会出现两个A/D同时工作的冲突。 (2) 液晶不能正常工作,经过分析后主要来自两方面,一方面是自己对液晶模块的不熟悉造成 的,另一个方面还是程序的不稳定。开始时对字库不熟悉,误认为液晶带有字库,导致液晶只能亮 不能工作,进一步熟悉了液晶模块后,再结合采集程序显示时,出现了一直跳变,显示不稳定,这 种情况应该是不合理的,硬件电路没有问题的前提下,还是软件程序嵌套调用不合理,通过重新对 软件模块梳理,发现其中的 IF 嵌套有不合理的地方,多了很多不合理的延时程序,还有就是主程序 结构有点复杂,针对这些情况一一进行了改进,使程序能够逐步稳定运行[15]。20 5.3 功能测试物体放在压力传感器上, 压力传感器会有个显示重量的值 U1, 当显示启动时,通过按压 “启动” 按键,LCD 液晶显示屏幕上显示当前称量物体的重量值 U2,U1 与 U2 的差值就是系统产生的误差。 若按下“清除”按键,则清除 LCD 液晶上的测量值。当测量超过量程时,报警,灯亮。5.4 精度测量电子秤在正常工作的情况下进行精度测量调试,测量结果如下表 5-4 所示。表 5-4 数据测量表称量次数实际值(g)测量值(g)误差(g)1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 3220 40 60 80 100 120 140 160 180 200 220 240 260 280 300 320 340 360 380 400 420 440 460 480 500 520 540 560 580 600 620 64020 40 60 80 100 121 141 161 181 202 222 242 262 282 303 303 343 363 383 404 424 444 464 484 504 524 544 564 584 605 625 645210 0 0 0 0 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51660 680 700 720 740 760 780 800 820 840 860 880 900 920 940 960 980 665 685 706 726 747 767 787 808 828 848 868 888 908 929 949 969 989 5 5 6 6 7 7 7 8 8 8 8 8 8 9 9 9 9 9 10由以上数据可已看出,每当重物增加 100g 时误差就会增加 1g。可以通过软件方式消除误差。 国家标准是 0-5kg 电子秤误差为+0.5 所以本设计可以在实际生活中应用。6 结论随着全球数字化技术的不断发展,电子衡器已经在我们的生活各个领域得到了广泛的应用,从 工业贸易到能源交通都能看到电子衡器的技术应用。本文着眼于目前中小型市场商用电子称智能化 低、精度差、易损坏等特点,研发设计了基于 STC89C52 单片机的双精度电子称。 电子称是针对目前中小型市场上现有的衡器无法同时运用于称量微重物理和较重物体而研发的 产品。该仿真设计系统主要包括五大模块,即数据采集和双精度转换模块、单片机处理模块、键盘 控制模块、128*64 液晶显示模块和软件驱动模块。启动工作后,单片机可根据 A/D 采集的重量参数 能够自动选择转换精度值,完成相应的数据处理,同时在 128*64 的液晶屏上进行直观的显示重量、 4*4 键盘控制系统能够实时进行单价调整,操作简单方便,不仅能够测量微重物理,而且能够测量 较重物体,完全达到了商品的自动化、数字化和智能化,具有很好的应用价值和意义。 本文唯一的不足是只对研发方案成果的进行了仿真设计, 没有运用实物进行验证方案是否可行, 有待进一步的研发。虽然没有做出实物,但基于 51 单片机双精度电子称依然是一个具有前景的电子 衡器产品,非常适合于中小型市场的物体称重,如果电子称进一步发展,与虚拟串口技术融合,将 会实现与上位机的无线通讯,实现远程监测,将更有价值。 参考文献:[1] [2] 赵茂泰. 智能仪器原理及应用[M].北京:电子工业出版社.. 李全利. 单片机原理及接口技术[M].北京:高等教育出版社.. 22 [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15]贾伯年. 俞朴.传感器技术[M].东南大学出版社.. 单成祥. 传感器理论设计基础及其应用[M].北京:国防工业出版社.. 李道华. 李玲,朱艳.传感器电路分析与[M].武汉:武汉大学出版社.. 沙占友. 王彦朋等.智能传感器系统设计与应用[M].北京:电子工业出版社.. 何希才. 薛永毅. 传感器及其应用实例[J].北京:机械工业出版社.. 李群芳. 单片机微型计算机与接口技术[M].北京:电子工业出版社.. 周立功. 单片机实验与实践[M].北京航空航天大学出版社.. 全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品汇编[J].北京理工大学出版社.. 何立民 .单片机高级教材[M].北京:航空航天大学出版社.. 童诗白. 华成英 .模拟电子技术基础[M]. 北京:北京高等教育出社.. 程林 . 超省电型电子秤的设计方案[J].福建:福建省计量科学技术研究所. . 美国国家仪器(NI)公司.技术支持.http://www.ni.com/support/zhs/.2011.3. 王丽丽.基于 Wi-Fi 的无线数据采集系统研究[D].郑州:河南大学,.23 致谢经过半年的忙碌和工作,本次毕业设计已经接近尾声,作为一个本科生的毕业设计,由于经验 的匮乏,难免有许多考虑不周全的地方,如果没有指导老师的督促指导,以及一起工作的同学们的 支持,想要完成这个设计是难以想象的。 在这里要感谢我的指导老师薛彪老师。他平日里工作繁多,但在我做毕业设计的每个阶段,从 外出实习到查阅资料,设计草案的确定和修改,中期检查,后期详细设计,程序调试等整个过程中 都给予了我悉心的指导。我的设计较为复杂烦琐,但是老师仍然细心地纠正设计中的错误。除了薛 老师的专业水平外,他的治学严谨和科学研究的精神也是我永远学习的榜样,并将积极影响我今后 的学习和工作。 最后还要感谢大学四年来所有的老师,为我们打下专业知识的基础;同时还要感谢所有的同学 们,正是因为有了你们的支持和鼓励。此次毕业设计才会顺利完成。 之前是我想得太简单了,想着用精度高的传感器,高精度的 A/D 转换器,可是贪图的再多,很 多东西都到不了极致,不知道自己到底在追求什么,性价比什么反而因为精度提高反而发挥不到极 致,相当于浪费资源,所以,决定改版用最简单且便宜的器件,完成最初的设计,达到性价比最高。24 附录材料目录附录 1单片机与 HX711 连接图HX711 引脚图报警电路25 STC89C52 最小系统图电源电路 26 附录 2实物图27 附录 3 程序#include&reg52.h& #include&math.h& #include&absacc.h& #include &intrins.h& #include &stdio.h& #include&source.h& #define uchar unsigned char #define uint unsigned int #define LCD_databus P0 //LCD1602 的 8 位数据口 //HX711 的引脚 sbit ADCS =P3^0; //ADC0832 chip seclect sbit ADDI =P3^5; //ADC0832 k in sbit ADDO =P3^5; //ADC0832 k out sbit ADCLK =P3^1; //ADC0832 clock signal sbit Alarm_led_red =P1^6; sbit RS=P1^5; //RS 为 0---命令;1----数据 sbit RW=P1^4; //RW 为 1---写;0---读 sbit EN=P3^2; //液晶使能端 sbit CS1=P3^3; //片选 1 低电平有效,控制左半屏 sbit CS2=P3^4; //片选 1 低电平有效,控制右半屏 sbit STATUS = P1^3; //AD 转换完成标志 uchar ad_alarm,ad_data,press_bai,press_shi,press_ge,press_dot,press_dot1,press_dot2; double press,value0,value1; uchar hB uchar lB char data disbuf1[5]={0}; //存储重量 char data disbuf2[5]={0}; char data disbuf3[6]={0}; uchar code keyval[]={0x00,0x01,0x02,0x03,0x08,0x09,0x0a,0x0b,0x10,0x11,0x12,0x13,0x18,0x19,0x1a,0x1b}; uchar xdata duan _at_ 0xB //11 1111 uchar xdata wei _at_ 0x9F //11 1111 unsigned char xdata ADSEL _at_ 0x7FFE; unsigned char xdata ADL _at_ 0x7FFF; /*********延时 K*1ms,12.000mhz**********/ void delay(uint k) { uint i,j; for(i=0;i&k;i++) {28//超过压力表量程最大值红色 led 报警定义 for(j=0;j&60;j++) {;} } } void Read_busy() { P0=0x00; RS=0; RW=1; EN=1; while(P0&0x80); EN=0; } void write_LCD_command(uchar value) { Read_busy(); RS=0; RW=0; LCD_databus= EN=1; _nop_(); _nop_(); EN=0; } void write_LCD_data(uchar value)//写数据函数 { Read_busy(); RS=1; //选择数据 RW=0; LCD_databus= EN=1; _nop_(); _nop_(); EN=0; } uchar Read_LCD(void) { Read_busy(); LCD_databus=0xFF; RS=1; RW=1; EN=1; _nop_(); _nop_(); EN=0; LCD_databus=0xFF; RS=1; //读取真正的数据 //EN 由 1----0 锁存有效数据 //写命令函数 //对 LCD 的每次读写都要读忙 //选择命令 //读操作//EN 由 1----0 锁存有效数据//读数据函数//RS=1,RW=1//先进行一次空读操作29 RW=1; EN=1; value=LCD_ _nop_(); _nop_(); EN=0; } void Set_page(uchar page) { page=0xb8| write_LCD_command(page); } //设置“页”LCD1602 共 8 页,一页是 8 行点阵点 //页的首地址为 0xB8void Set_line(uchar startline) //设置显示的起始行 { startline=0xC0| //起始行地址为 0xC0 write_LCD_command(startline); //设置从哪行开始:共 0--63;一般从 0 行开始显示 } void Set_column(uchar column) //设置显示的列 { column=column &0x3f; //列的最大值为 64 column= 0x40| //列的首地址为 0x40 write_LCD_command(column); //规定显示的列的位置 } void SetOnOff(uchar onoff) //显示开关函数:0x3E 是关显示,0x3F 是开显示 { onoff=0x3e| //onoff:1---开显示;0---关显示
write_LCD_command(onoff); } void SelectScreen(uchar screen) //选择屏幕 { switch(screen) { case 0: CS1=0;CS2=0; //全屏 case 1: CS1=0;CS2=1;//左半屏 case 2: CS1=1;CS2=0;//右半屏 default: } } void ClearScreen(uchar screen) //清屏函数 { uchar i,j; SelectScreen(screen); //0--全屏;1---左半屏;2---右半屏 for(i=0;i&8;i++) //控制页数 0-7,共 8 页 { Set_page(i); Set_column(0); for(j=0;j&64;j++) //控制列数 0-63,共 64 列30 { write_LCD_data(0x00); //写入 0,地址指针自加 1 } } } void init_LCD() { SetOnOff(1); SelectScreen(0); ClearScreen(0); Set_line(0); } //LCD 的初始化 //开显示 //清屏 //开始行:0void Display_ASCII(uchar screen,uchar page,uchar column,uchar p) { SelectScreen(screen); Set_page(page); Set_column(column); for(i=0;i&8;i++) //显示字符上半部分:8*8 { write_LCD_data(disbuf[i+(p*16)]); } Set_page(page+1); //显示字符下半部分:8*8 Set_column(column); for(i=0;i&8;i++) { write_LCD_data(disbuf[i+(p*16)+8]); } } void Display_HZ(uchar screen,uchar page,uchar column,uchar *p) { SelectScreen(screen); Set_page(page); //写上半页:16*8 Set_column(column*16); //控制列 for(i=0;i&16;i++) //控制 16 列的数据输出 { write_LCD_data(p[i]); //汉字的上半部分 } Set_page(page+1); //写下半页:16*8 Set_column(column*16); //控制列 for(i=0;i&16;i++) //控制 16 列的数据输出 { write_LCD_data(p[i+16]); //汉字的下半部分 } } void Init_display_HZ() {31 Display_HZ(1,0,0,huan); Display_HZ(1,0,1,ying); Display_HZ(1,0,2,shi); Display_HZ(1,0,3,yong); Display_HZ(2,0,0,gao); Display_HZ(2,0,1,jing); Display_HZ(2,0,2,du); Display_HZ(2,0,3,cheng); Display_HZ(1,2,0,zhong); Display_HZ(1,2,2,liang); Display_HZ(1,2,3,fuhao); Display_HZ(2,2,3,kg); //单位 KG Display_HZ(1,4,0,dan); Display_HZ(1,4,2,jia); Display_HZ(1,4,3,fuhao); Display_HZ(2,4,3,yuan); Display_HZ(1,6,0,he); Display_HZ(1,6,2,ji); Display_HZ(1,6,3,fuhao); Display_HZ(2,6,3,yuan); } void clear() { init_LCD(); //初始 12864 ClearScreen(0); //清屏 Init_display_HZ(); disbuf2[5]=0; } //8279 初始化函数 void KbDisInit() { duan=0x00; duan=0xd1;//清楚 RAM while(duan&0x80) //清除完毕 wei=0x34; //分频 } /************读 ADC0832 函数************/ void Adc0832(unsigned char channel) //AD 转换,返回结果 { uchar i=0; uint dat=0; uchar ndat=0; if(channel==0)channel=2; if(channel==1)channel=3; ADDI=1; _nop_(); _nop_(); ADCS=0;//拉低 CS 端 _nop_(); _nop_();32 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 端,形成下降沿 3 ADDI=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|= ad_data=33 press=(0.4367*ad_data)+8.8864; } void adc_Convert(void) { uint MSB,LSB,adc_R ADSEL = 0xFF; while(STATUS==1); hByte = ADSEL; lByte = ADL; delay(100); MSB=(uint)(hByte && 4); LSB=(uint)(lByte && 4); adc_Res = MSB + LSB; press=(0.003662)*adc_R } /*重量显示函数*/ void data_pro(void) { uint temp,k; if(15&=press) 变换 { temp=(int)(press*100);//测试时补偿值为*a+9.3;//当压力值介于 15kpa 到 115kpa 之间时, 遵循线性//放大 10 倍,便于后面的计press_bai=temp/10000; //取压力值百位 press_shi=(temp%1; //取压力值十位 press_ge=((temp%1)/100; //取压力值个位 press_dot=(((temp%1)%100)/10; //取压力值十分位 press_dot1=(((temp%1)%100)%10; //取压力值 bai 分位 if(15&=press&100) { disbuf1[0]=press_ disbuf1[1]=press_ disbuf1[2]=10; disbuf1[3]=press_ disbuf1[4]=press_dot1; } if(press&=100) { disbuf1[0]=press_ disbuf1[1]=press_ disbuf1[2]=press_ disbuf1[3]=10; disbuf1[4]=press_ } for(k=0;k&5;k++) { Display_ASCII(2,2,(k*8),disbuf1[k]); } } if(press&15) { temp=(int)(press*1000); //放大 10 倍,便于后面的计算34 press_shi=temp/10000; //取压力值十位 press_ge=(temp%1; //取压力值个位 press_dot=((temp%1)/100; //取压力值十分位 press_dot1=(((temp%1)%100)/10; //取压力值百分位 press_dot2=(((temp%1)%100)%10; //取压力值千分位 if(10&=press&15) { disbuf1[0]=press_ disbuf1[1]=press_ disbuf1[2]=10; disbuf1[3]=press_ disbuf1[4]=press_dot1; } if(press&10) { disbuf1[0]=press_ disbuf1[1]=10; disbuf1[2]=press_ disbuf1[3]=press_dot1; disbuf1[4]=press_dot2; } for(k=0;k&5;k++) { Display_ASCII(2,2,(k*8),disbuf1[k]); } } } /*超压报警函数*/ void alarm(void) { if(ad_data&=243) { Alarm_led_red=0; } else { Alarm_led_red=1; } }//如果当前压力值大于 115kpa, //则启动 red led 报警 //关闭 red led 报警35
更多搜索:
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 单片机读取usb数据 的文章

 

随机推荐