基于单片机HX711电子称设计

更新时间:2024-05-16 16:49:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

泸州职业技术学院

毕业设计报告

简易电子秤

学生姓名 所在系 班级 专业 指导教师

2016年12月20日

电子工程系

应用电子技术

毕业设计任务书

学生姓名 设计题目 专业班级 14级应用电子1班 学号 电子秤的设计与制作 课题针对的职业岗电子工程师岗位,培养学生简易电子产品的设计思路与制作能力 位和用途 课题所针对的职业能通过网络等途径查阅专业文献资料,能阅读、理解所查阅的专业文献资料,并能岗位的业务和技能将文献方案迁移、应用到到所设计的电路中;熟练制作小规模电子线路产品; 要求 设计并制作一个电子秤。 工作任务及要求 基本要求: 1、能用简易键盘设置单价,能够同时显示重量和金额; 2、重量显示:单位为克;最大称重为500g,重量小于50g,误差小于0.5g,重量在50g以上的,误差小于1g。 扩展要求:具有去皮功能,去皮范围不超过100g,超过所测重量时能够报警。 201.6.10.20-2016.10.30拟定毕业设计实施计划; 2016.11.1-2016.11.10 确定实施方案,完成电路设计与仿真; 2016.11.11-2016.11.20 购买元件,完成实物制作与调试; 2016.11.21-2016.12.10 撰写论文 进度安排 以上内容由指导教师填写 [1] 施汉谦,宋文敏·电子秤技术[M]·北京:中国计量出版社,1991 [3] 李军,贺庆之·检测技术及仪表[M]·中国轻工业出版社 [4] 曲波,肖圣兵,吕建平·工业常用传感器选型指南[M]·清华大学出版社 [5] 顾理敏,宋玮·电子称[M] ·北京:计量出版社,1982 [6] 张锡富·传感器[M] ·机械工业出版社 参考资料

指导教师签字 教师姓名: 签字: 年 月 日 审核意见: 签字: 年 月 日 学生接受任务签字 接受任务时间: 年 月 日 签字: 审核意见: 签字: 年 月 日 教研室审核意见 院系审核意见

摘要

摘要

随着微电子技术的应用,市场上使用的传统称重工具已经满足不了人们的要求,为了改变传统称重工具在使用上存在的问题,在本设计中将智能化、自动化用在了电子秤系统中。此电子秤很大程度上满足了应用需求,具有很大的应用前景。

本文在分析当前电子秤的主流设计方案的基础上,以单片机MCS-51系列的

STC89C52芯片为信息处理核心,提出了基于电阻应变片为传感电路的电子秤设

计方案。论文详细分析了系统整体设计思路、硬件电路和系统软件的设计方法和流程。最后介绍了系统的硬件调试和软件调试方法,并给出了调试结果。 关键词:电子秤、STC89C52、电阻应变片

I

目录

目录

第一章 绪论......................................................... 1

1.1 选题的背景和意义 ............................................ 1 1.2 研究现状 .................................................... 1 1.3 主要研究对象 ................................................ 1 第二章 总体设计方案................................................. 2

2.1设计思路..................................................... 2 2.2 控制模块方案论证 ............................................ 2 2.3 A/D转换和运放模块方案论证 ................................... 3 2.4 电阻应变片传感器方案论证 .................................... 4 2.4 电阻应变片式传感器的结构和原理 ............................. 5 2.5 键盘模块方案论证 ............................................ 6 2.6 显示模块方案论证 ............................................ 6 第三章 电子秤硬件设计............................................... 8

3.1 设计整体结构 ................................................ 8 3.2 STC89C52最小系统 ............................................. 8 3.3 A/D转换电路 ................................................. 9 3.4 键盘电路 ................................................... 12 3.5 显示电路 ................................................... 12 第四章 电子秤软件设计.............................................. 13

4.1 主程序的设计 ............................................... 13 4.2 子程序的设计 ............................................... 14 4.2.1 键盘扫描程序 ............................................. 14 4.2.2 A/D转换子程序的设计 ..................................... 15 4.2.3 显示电路子程序的设计 .................................... 16 4.2.4 数据处理子程序的设计 .................................... 16 第五章 系统调试.................................................... 18

5.1软件调试.................................................... 18 5.2硬件调试.................................................... 18 5.3结 论....................................................... 21 5.4致 谢....................................................... 22 参考文献 ....................................................... 23

II

第一章绪论

第一章 绪论

1.1 选题的背景和意义

电子秤是日常生活中常用的称重器材,广泛应用于超市、大中型商场、物流配送中心。电子秤在结构和原理上取代了以杠杆平衡为原理的传统机械式称量工具。相比传统的机械式称量工具,电子秤具有称量精度高、装机体积小、应用范围广、易于操作使用等优点,在外形布局、工作原理、结构和材料上都是全新的计量衡器。

1.2 研究现状

电子秤不仅要向高精度、高可靠方向发展而且更需向多种功能的方向发展。据悉目前电子秤的附加功能主要有以下几种:1.电子秤附加了处理机构计算机信息补偿装置可以进行自诊断、自校正和多种补偿计算和处理。2.具有去皮重显示等特种功能。电子秤有些已具备了动物称量模式即通过进行算术平均、积分处理和自动调零等方法消除上述的误差。3.附加特殊的数据处理功能。目前的电子秤有附加多种计算和数据处理功能以满足多种使用的要求。今后随着电子高科技的飞速发展电子秤技术的发展定将日新月异。同时功能更加齐全的高精度、高智能的先进电子秤将会不断问世其应用范围也会更加拓宽。

电子秤的设计首先是通过电阻应变片为称重传感器采集到被测物体的重量并将其转换成电压信号。经放大后的模拟电压信号经A/D转换电路转换成数字量被送入到主控微处理器中,再经过单片机控制译码显示器,从而显示出被测物体的重量。

1.3 主要研究对象

本文主要是设计的内容是简易电子秤,它用单片机作为处理核心,信号由电阻应变片为称重传感器感受后经放大器放大和模数转换后输入到单片机处理,

1、能用简易键盘设置单价,能够同时显示重量和金额;

2、重量显示:单位为克;最大称重为500g,重量小于50g,误差小于0.5g,重量在50g以上的,误差小于1g。

3、具有去皮功能,去皮范围不超过100g,超过所测重量时能够报警。

1

第二章总体设计方案

第二章 总体设计方案

2.1设计思路

电子秤设计的整体方案是:传感器采集到因压力变化产生的电信号,但是一般这样产生的电信号很小,需要利用放大电路将其放大,放大的电信号再通过A/D转换器转换为数字信号后送入到微处理器中处理,微处理器处理后输出信号控制显示器显示出来。同时还需要键盘对物品单价等信息输到微处理器内部,还需要有过载报警装置。根据本次设计要求,其整体设计方案如图1所示。

图1 电子秤整体设计方案图

2.2 控制模块方案论证

控制部分是电子秤的核心部分,它需要接收转换后的传感器信号,同时也能扫描接收到键盘的输入信号,计算价格后控制显示器的输出,当超过称重量量程时还要控制报警装置报警。主控制器可以选择单片机,也可以选择FPGA;结合成本等综合因素,实际应用的多以单片机为主控制器。因此,本次设计我们选择了单片机控制作为主控制器。

基于单片机的电子秤设计主要有以下两个方案。 方案一:以单片机STC89C52作为主控制器:

STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K的在系统可编程

闪烁存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上flash允许程序存储器在线可编程,也适于常规编程器。在单芯片上,拥有灵巧的8,PU和在系统上可编程闪烁存储单元,使得STC89C52为众多嵌入式控制应用系统提供灵活、有效的解决方案。

方案二:以单片机STM32作为主控制器:

STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的。

其中STM32F1系列有:STM32F103“增强型”系列STM32F101“基本型”系列

STM32F105、STM32F107“互联型”系列。

2

第二章总体设计方案

增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。

从理论上讲,二者都能作为本次设计的主控器,但根据题意的要求,8位的单片机就能满足本次设计要求,本着简单实用、高性价比的原则,我们选择了

STC89C52RC作为控制器。

2.3 A/D转换和运放模块方案论证

称重传感器采集的压力信号是模拟量,且传感器应变产生的电信号也比较弱,通常只有几十mV;单片机系统内部运算时用的都是数字量。因此对于单片机而言我们无法直接操作模拟量,必须将传感器产生的微弱信号进行放大处理,再将处理过的模拟量转换为数字量,提供给微处理器处理。模数转换器就是将输入的模拟信号转换成数字信号。

现在模数转换的基本方法有十几种,常用的有计数法、逐次比较法、双斜积分法和并行转换法。由于逐次比较法模数转换具有速度快、分辨率高等特点,而且采用这种方法的ADC芯片成本较低。

方案一:采用ADC0832集成芯片外加运放电路

ADC0832是美国国家半导体公司生产的一种8 位分辨率、双通道模数转换芯片,

其输入输出电平与TTL/CMOS相兼容,电源供电时输入电压在0~5V之间,工作频率为250KHZ转换时间为32μS,一般功耗仅为15mW;由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。图3为

AD0832双列直插式封装引脚图。 但ADC0832内部没包含放大器,需在外围制作一

个放大电路。如图2所示:

图2 ADC0832引脚图

方案二:采用电子秤专用模拟/数字芯片HX711。

3

第二章总体设计方案

HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型

其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点、降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B则为固定的64增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接部件。上电自动复位功能简化了开机的初始化过程。如图3所示:

图3 HX711芯片

从成本和性能方面比较,ADC0832比HX711集成芯片贵,并且还需要额外的运算放大电路配合。HX711内部集成了放大增益模块,集成度高、响应速度快、抗干扰性强,还能有效降低电子秤的整机成本,提高了整机的性能和可靠性。其性价比比ADC0832集成芯片好,因此,本次设计我们选用了HX711集成芯片。

2.4 电阻应变片传感器方案论证

电阻应变片式传感器是以应变片为传感器元件的传感器。它具有以下优点:

1.精度高,测量范围广;2.使用寿命长,性能稳定可靠。3.结构简单、尺寸小、重

量轻,因此在测量时,对工件工作状态及应力分布影响小;4.频率响应特性好。应变片响应时间约为100ns;5.可在高低温、高速、高温、强烈振动、强磁场、核辐射和化学腐蚀等恶劣环境条件下工作;6.应变片种类繁多,价格便宜。电阻应变片的工作原理是基于电阻应变效应,即在导体产生机械形变时,它的电阻值相应发生变化。应变片式电阻传感器应用很广。本设计采用的是梁式力传感器,该传感

4

第二章总体设计方案

器结构简单、灵敏度高。适用于小压力测量。

2.4.1 电阻应变片式传感器的结构和原理

电阻应变式传感器是将被测量的力,通过它产生的金属弹性变形转换成电阻变化的元件。由电阻应变片和测量电路两部分组成。常用的电阻应变片有两种:电阻应变片和半导体应变片,本设计采用的是电阻应变片,为获得高电阻值,电阻丝排成网状,并贴在绝缘的基片上,电阻丝两端引出导线,线珊上面有覆盖层,起保护作用。由变换测量电路将电阻的变化转化为电压变化后输出。如图4所示:

图4 实验图

通常可以用电阻应变片以单臂电桥、双臂电桥和全桥的方式构成测量电路。通过实验对比三种测量电路发现,在做单臂电桥实验时,正负之间出现了比较大的误差,而在做双臂电桥以及全桥实验时,误差很小。可见是定值电阻R2的接入给电路带来的影响,尤其是当四个定值电阻都换成应变片的时候(全桥测量),正负的测量值几乎没有差别。从最后的结果来看,全桥的灵敏度最高,双臂次之,单臂最低。且基本呈现出以下关系,即全桥灵敏度约为双臂2倍,双臂约为单臂的

2倍。这和理论值是基本相符的。可见,电桥的工作臂系数越大,则电桥的灵敏度

越高。

据以上比较与分析,我们选做全桥的应变片传感器。

5

第二章总体设计方案

2.5 键盘模块方案论证

键盘输入是人机交互界面中重要的组成部分,它是系统接受用户指令的直接途径。操作者通过键盘向系统发送各种指令或置入必要的数据信息。键盘由许多键组成,每一个键相当于一个机械开关触点,当键按下时,触点闭合,当键松开时,触点断开。单片机接收到按键的触点信号后作相应的功能处理。因此,相对于单片机系统来说键盘接口信号是输入信号。

方案一:专用芯片式设计

专用键盘处理芯片一般功能比较完善,芯片本身能完成对按键的编码、扫描、消抖和重键等问题的处理,甚至还集成了显示接口功能。列如Intel8279是一种为8位微处理器设计的比较成熟的通用键盘/显示器接口芯片。专用键盘处理芯片的优点很明显,可靠性高,口简单,使用方便,适合处理按键较多的情况。但在很多应用场合,考虑成本因素,可能并不是最佳选择。

方案二:矩阵式键盘设计

矩阵式键盘又叫行列式键盘。用I/O口线组成行、列结构,按键设置在行列的交点上。例如,用2×2的行列结构可构成4个键的键盘,4×4行列结构可构成16个键的键盘。因此,在按键数量较多时,可以节省I/O口线。相对于专用芯片式可以节省成本,且更为灵活。缺点就是需要用软件处理消抖、重键等问题。如图5所示:

图5 4×4矩阵键盘

结合设计需求,综合考虑成本因素,本次决定采用矩阵键盘。

2.6 显示模块方案论证

方案一:LED显示 :

LED是一种通过控制半导体发光二极管的显示方式,用来显示文字、图形、图

像、动画、行情、视频、录像信号等各种信息的显示屏幕。它是由七个条状发光二极管芯片排列而成的。可实现0~9的显示。这种显示块有共阴极与共阳极两种。

6

第二章总体设计方案

共阴极LED显示块的发光二极管阴极共地。当某个发光二极管的阳极为高电平时,发光二极管点亮;共阳极LED显示块的发光二极管阳极并接。

但七段LED显示器通常只能显示数字和少数几个字母符号;显示内容单一,不容易满足本次设计需求。

方案二:LCD显示:

LCD 液晶显示器是 Liquid Crystal Display 的简称。液晶显示的原理是利用液晶

的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。且LCD体积小、重量轻、功耗低,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

1602字符型LCD是一款应用非常成熟的高性价比字符型LCD显示器。它是一

种专门用于显示字母、数字、符号等内容的点阵式LCD。1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,1602LCD主要技术参数:显示容量:16×2个字符,芯片工作电压:4.5—5.5V,工作电流:2.0mA(5.0V),模块最佳工作电压:5.0V,字符尺寸:2.95×4.35(W

×H)mm。

由于本次设计的显示模块需要显示多位数字,如果采用数码管显示的话将会占用多个单片机I/O口,使得电路变得更为复杂,而且功耗也不低。所以选用

1602LCD液晶显示器件。如图6所示:

图6 1602显示屏

7

第三章电子秤硬件设计

第三章 电子秤硬件设计

3.1 设计整体结构

物体放在压力传感器上,传感器发生形变,阻抗就发生变化,产生一个变化的模拟信号,该信号需要有放大电路放大后输入到模数转换器,转换为数字信号后输入到微处理器处理。微处理器根据键盘命令以及程序将结果输出到显示器,直到显示结果。根据本次设计需求,结合前期的方案论证与选择情况,得出本次设计的总体框图如图7所示。

图7 硬件设计总体框图

3.2 STC89C52最小系统

图8 STC89C52最小系统

STC89C52是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理

器,128字节RAM,32个双向I/O 口线,两个16位定时器/计数器,5个中断源,

8

第三章电子秤硬件设计

一个全双工串行通信口,片内振荡器及时钟电路。同时,STC89C52可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

STC89C52最小系统简单、可靠,仅由时钟电路、复位电路、电源电路构成,如

图10所示。

1、时钟电路:

STC89C52虽然有内部振荡电路,但要形成时钟,必须外部附加电路。STC89C52

单片机的时钟产生方法有两种。内部时钟方式和外部时钟方式。

本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHZ到12MHZ之间选择。电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度有少许影响,可在20pF到100pF之间取值。所以本设计中,振荡晶体选择12MHZ,电容选择22pF。

2、复位电路:

STC89C52的复位电路是由外部的复位电路来实现的。只需给复位引脚RST加

上大于2个机器周期的高电平就可使其复位。复位电路通常采用上电自动复位和按键复位两种方式。本设计就是用的按键手动复位。其中电平复位是通过RST端经电阻与电源Vcc接通而实现的。

3、电源电路:

STC89C52的电源脚分别为20脚Vss和40脚Vcc(图中已默认连接,未显示出

来)。这两个脚分别接地和+5V直流电源,31脚EA为内外存储器的控制端,接+5V允许访问外部存储器。

3.3 A/D转换电路

传感器检测电路的功能是把电阻应变片的电阻变化转变为电压输出,本设计中选用的是CZAF-350电阻应变式称重传感器,因为通过其得到的电压信号很小,通常只有几十mV。所以需要放大器放大信号,本次设计中我们选用了海芯科技公司的HX711A/D转换器,它内部包含了放大器,可以将信号放大128倍。如图9所示:

HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型

其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点、降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU芯片的接口和

9

第三章电子秤硬件设计

编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或

±40mV。通道B则为固定的64增益,用于系统参数检测。芯片内提供的稳压电源

可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接部件。上电自动复位功能简化了开机的初始化过程。在本电路中,三极管9012起到的调节作用。R1/R2/R5/R6起到分压作用,C2/C3起到隔直通交的作用。

图9 A/D转换电路

表1 引脚功能表

HX711管脚说明 模拟输入 通道A模拟差分输入可直接与桥式传感器的差分

输出相接。由于桥式传感器输出的信号较小,为了充分利用A/D转换器的输入动态范围,该通道的可编程增益较大,为128或64。这些增益所对应的满量程差分输

10

第三章电子秤硬件设计

入电压分别±20mV或±40mV。通道B为固定的增益,所对应的满量程差分输入电压为±40mV。通道B应用于包括电池在内的系统参数检测。 供电电源 数字电源(DVDD)应使用与MCU芯片相同的数字供电电源。HX711芯片内额稳压电路可同时向A/D转换器和外部传感器提供模拟电源。稳压电源的供电电压(VSUP)可与数字电源(DVDD)相同。稳压电源的输出电压值(VAVDD)由外部分压电阻R1、

R2和芯片的输出参考电压VBG决定(图1),VAVDD=VBG(R1+ R2)/ R2。应选择

该输出电压比稳压电源的输入电压(VSUP)低至少100mV。如果不使用芯片内的稳压电路,管脚VSUP和管脚AVDD应相连,并接到电压为2.6~5.5V的低噪声模拟电源。管脚VBG上不需要外接电容,管脚VFB应接地,管脚BASE为无连接。时钟选择 如果将管脚XI接地,HX711将自动选择使用内部时钟振荡器,并自动关闭外部时钟输入和晶振的相关电路。这种情况下,典型输出数据速率为10Hz或80Hz。如果需要准确的输出数据速率,可将外部输入时钟通过一个20pF的隔直电容连接到XI管脚上,或将晶振连接到XI和XO管脚上。这种情况下,芯片内的时钟振荡器电路会自动关闭,晶振时钟或外部输入时钟被采用。此时,若晶振频率为

11.0592MHz,输出数据速率为准确的10Hz或80Hz。输出数据速率与晶振频率以上

述关系按比例增加或减少。使用外部输入时钟,外部时钟信号不一定需要为方波。可将MCU芯片的晶振输出管脚上的时钟信号通过20pF的隔直电容连接到XI管脚上,作为外部时钟输入。外部时钟输入信号的幅值可低至150 mV。

复位和断电 当芯片上电时,芯片内的上电自动复位电路会使芯片自动复位。管脚PD-SCK输入来控制HX711的断电。当PD-SCK为低电平时,芯片处于正常工作状态。

图10 引脚图

11

第三章电子秤硬件设计

3.4 键盘电路

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成3×4=12个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显。矩阵键盘电路与

STC89C52单片机接口电路如图11所示。

图11 键盘电路与单片机的连接图

3.5 显示电路

本设计采用的是LCD1602显示。1602采用标准的16脚接口,其中1和2脚为电源正负极,3脚为对比度调整端,4脚RS为寄存器选择,5脚RW为读写信号线,

6脚为使能端,7到14脚为8为双向数据端。15和16脚为电源背光极。3脚VEE接

一个滑动变阻器,滑动变阻器两端接电源和地。

图12 单片机与LCD1602接线图

调试滑动变阻器的值可以改变LCD的对比度。因为LCD为共阳极,为加大输出引脚的驱动能力,所以D0到D7有加入上拉电阻,要保证上拉电阻明显小于负载的阻抗,以使高电平输出有效,负载阻抗是10k,供电电压是5v要求高电平不小于4.5v,那么上拉电阻R:(5-4.5)=10:5,R为1k,如图12所示。

12

第四章电子秤软件设计

第四章 电子秤软件设计

程序设计是一件复杂的工作,为了把复杂的工作条理化,就要有相应的步骤和方法。其步骤可概括为以下三点:

首先需要分析系统控制要求,确定算法:对复杂的问题进行具体的分析,找出合理的计算方法及适当的数据结构,从而确定编写程序的步骤。这是能否编制出高质量程序的关键。

其次是根据算法画流程图:画程序框图可以把算法和解题步骤逐步具体化,以减少出错的可能性。

最后就是编写程序:根据程序框图所表示的算法和步骤,选用适当的指令排列起来,构成一个有机的整体,即程序。

程序数据的一种理想方法是结构化程序设计方法。结构化程序设计是对利用到的控制结构类程序做适当的限制,特别是限制转向语句(或指令)的使用,从而控制了程序的复杂性,力求程序的上、下文顺序与执行流程保持一致性,使程序易读易理解,减少逻辑错误和易于修改、调试。

根据系统的控制任务,监控软件采用模块技术设计,根据系统功能,将软件分为若干个功能相对独立的模块,为每一个模块设计程序流程图。该电子秤功能程序模块包括:A/D转换启动及数据读取程序设计、显示子程序设计、键盘扫描子的程序设计、价格计算子程序设计等。

4.1 主程序的设计

主程序是系统信息处理的关键,主程序模块主要完成编程芯片的初始化及按需要调用各模块(子程序),在系统初始化过程中,初始化程序将RAM的30H到

5FH单元清零,同时将系统设置成500g。

13

第四章电子秤软件设计

图13 主程序流程图

主程序主要完成编程芯片的初始化及按需要调用各子程序,上电启动后,系统初始化,单片机读取模数转换器的数据,然后调用显示子程序显示重量,同时扫描键盘子程序,调用价格计算子程序计算价格并显示出来,如图13所示。

4.2 子程序的设计

主程序按需要调用各子程序。系统子程序主要包括(A/D转换启动及数据读取程序设计、显示子程序设计、键盘扫描子的程序设计、价格计算子程序设计等)。

A/D转换启动及数据读取子程序设计主要是上电运行后,HX711完成初始化,把经

放大的称重传感器传递过来的模拟信号转换成数字信号并传递到单片机所涉及到的程序。

HX711进行模数转换时,须现将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转换的结束。最后将CS置高电平禁用芯片。

4.2.1 键盘扫描程序

键盘扫描子程序主要是扫描键盘的输入,调用显示子程序显示,输出输入的参数,计算总价是调用价格计算子程序计算总价格。

键盘电路设计成4X4矩阵式,由键盘编码方式可以得出1、2、3、4、5、6、7、8、

14

第四章电子秤软件设计

9、0及清零和计价各键对应的键值:0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3d,0x30,0x2e。

图14 键盘扫描函数流程图

在程序中可以先判断按键编码,然后根据编码将键盘代表的数值送到相应的存储单元,再进行功能选择或数据处理,如图14所示。

4.2.2 A/D转换子程序的设计

A/D转换启动及数据读取子程序设计主要是上电运行后,HX711完成初始化,把经放大的称重传感器传递过来的模拟信号转换成数字信号并传递到单片机所涉及到的程序。

HX711进行模数转换时,须现将CS是能端置于低电平并且保存低电平直到完

全结束。芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,

DO和DI端则使用DI端输入通道功能选择的数据信号。在第1 个时钟脉冲的下沉

之前DI端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能,到第3 个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。

15

第四章电子秤软件设计

从第11个字节的下沉输出DATA0。随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片。如图15所示:

图15 A/D转换启动及数据读取程序流程图

4.2.3 显示电路子程序的设计

用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。

根据1602LCD的显示控制原理,设计出的显示子程序的流程图如下图16所示。

图16 显示子程序流程图

4.2.4 数据处理子程序的设计

价格计算子程序由键盘计价键控制,当输入单价后,在没有清零的情况下,点计价键,计算出总价后,调用显示子程序显示出中重量。

16

第四章电子秤软件设计

该子程序中利用各工作寄存器2组,数据存在以40H单元为首址的连续单元中。价格计算公式总价=单价×重量。这个程序需要两次的数制转换,输入单价后需要将单价转化为二进制后才能与二进制的重量进行计算。计算后的结果必须转换为十进制数显示出来。如图17所示:

图17 子程序流程图

17

第五章系统调试

第五章 系统调试

5.1、仿真调试

在设计电子秤的过程中,先在proteus仿真软件中仿真,成功后,再根据仿真电路图制作出实物。proteus仿真软件是一专门基于单片机的及其外围电路的仿真软件。仿真的第一步是先进行软件调试,是通过对程序的编写连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正错误的过程。软件调试的方法是先分块后组合。

在编出完整的程序并确保无误后进行综合调试。在调试程序之前,先检查各硬件模块间的连接是否无误,有无断路现象。确认连接无误后就给系统通电进行调试。

正式调试时,首先进行总体调试,即观察系统的运行情况以便快速地发现存在的问题。然后进行各硬件模块调试,主要针对有问题的硬件模块及其程序进行调试,以便准确地查出问题的原因并解决问题。

在本次设计的仿真中,因仿真软件里找不到HX711,所以用ADC0832代替HX711。 仿真效果图如图18所示。

图18

5.2、硬件调试

首先进行各硬件的组装,组装好后,进行通电测试,看是否键盘输入、调零、显示是否正常,检查好后无误,进行整机调试,准备好砝码,从最小量开始加量,然后记下砝码质量和显示屏显示的数据,将两个数据进行对比,做一个表格出来。看一下它们之间的误差是多少,需满足重量小于50g的,误差为0.5g,重量大于50g

18

第五章系统调试

的误差为1g。如果误差过大,那么我们将进行软件和硬件的调整。调整好误差后,我们在实现去皮功能。

在本次设计的调试中,显示屏显示字符不清晰,经检查电路,3脚VEE直接接地,所以造成了显示不清晰,后查LCD1602资料发现,需在脚VEE接一个滑动变阻器,滑动变阻器两端接电源和地。调试滑动变阻器的值可以改变LCD的对比度。因为LCD为共阳极,所以D0到D7有加入上拉电阻。

图19

表2 数据的测量 实际值(g) 测量值(g) 误差(g) 实际值(g) 测量值(g) 5 10 20 30 50 5.5 8.9 20.5 28.9 48 0.5 1.1 0.5 1.1 2 100 200 250 300 400 101 198 247 304 410 误差(g) 1 2 3 4 10 通过的第一次的调试发现测量值和实际值的误差不符合(需满足重量小于50g的,误差为0.5g,重量大于50g的误差为1g)要求(如表1所示),可以看出: 小于50g的误差都在0.5g以上,而大于50g的,误差都在1g以上,大的达到10g。

调试了软件以后任然没解决好这个故障,最后确定问题在硬件上,称上的悬梁臂太软(含铁质太少),造成了弯曲变形。后期我采用了铁质过硬的材料做,效果好的很多。经过改进后,在进行调试,结果就好很多了,误差也迅速减小(如表2所示)。小于50g的误差都在0.5g以下,而大于50g的,误差都在1g以下,满

19

第五章系统调试

足了课题设计要求。

表3 数据的测量 实际值(g) 测量值(g) 误差(g) 实际值(g) 测量值(g) 5 10 20 30 50 5.2 9.8 20 30.1 50 0.2 0.2 0 0.1 0 100 200 250 300 400 100.5 199.5 250.5 299 400.5 误差(g) 0.5 0.5 0.5 1 0.5 经过改进后,在进行调试,结果就好很多了,误差也迅速减小(如表2所示)。小于50g的误差都在0.5g以下,而大于50g的,误差都在1g以下,满足了课题设计要求。

20

结论

结 论

论文主要研究的是简易电子秤的设计,主要是基于现实商店卖西的电子秤,在小重量范围的称量。具有如下的功能:

1、能用简易键盘设置单价,能够同时显示重量和金额;

2、重量显示:单位为克;最大称重为500g,重量小于50g,误差小于0.5g,重量在50g以上的,误差小于1g。

3、具有清零功能和复位功能。 4、超出所测的重量时能够报警。

此电子秤采用LCD1602显示,能够同时显示重量价格,并且具有很高的性价比,能够广泛的应用少于500g重量的范围的交易。

通过几天的努力设计,我和我的设计伙伴们完成了这次比赛设计,在这次设计中,我们把大学所学的知识有机的结合起来,也让我们回顾了我们两年所学的知识,在本次设计中,更加让我们熟悉了STC89C52的功能等,还有通过查阅资料,了解了各电路的功能以及各分元件的用途和选型对比。在设计思想方面让我们懂得了需分层次、分模块来设计框架。但是在设计过程中也存在着一些问题:

1、在设计传感器时,不清楚应变片安装的部位,更换了几次梁臂后才有一点效果。

2、还有对各芯片的使用也不是很清楚,导致了在设计时花费了很多时间去查资料。没有扩展更多电路,这也是在学习过程中知识的不充分。

21

致谢

致 谢

经过两周的努力,我终于完成了这次毕业的设计。作为在校学生,由于经验的匮乏,知识的不充足,难免有许多考虑不周的地方,如果没有指导老师的督促指导,想要完成这个设计恐怕难以想象。

在整个毕业设计过程中,我对大学三年所学的知识有了一个系统的认识和了解。尤其对本课题所用到的单片机及其相关的知识进一步的了解,对利用单片机进行控制系统的设计与开发及对系统的分析和问题的解决有了切身的体会。

在这里要感谢我的指导老师邱富军老师,他在忙完自身工作以外还帮我分析问题,让我更加努力的解决问题,除了邱老师优秀的专业水平外,他的治学严谨和科学研究的精神也是我永远学习的榜样,并将积极影响我今后的学习和工作。

同时也感谢我大学所有的老师,为我们打下了良好的专业基础,为这次设计提供了基础。此次毕设顺利完成。

22

参考文献

参考文献

[1] 康华光,邹寿彬.电子技术基础[M].北京:高等教育出版社,2009.

[2] 黄智伟. 全国大学生电子设计竞赛技能训练.北京航空航天大学出版社,2007.2 [3] 李庭贵、龙舰函.c51单片机应用技术项目化教程.机械工业出版,2014.7 [4] 王港元.电工电子实践指导[M].江西:江西科学技术出版社,2005. [5] 贾伯年,俞朴.传感器技术[M]. 东南大学出版社,2000.

[6] 李道华,李玲,朱艳.传感器电路分析与设计[M]. 武汉大学出版社,2000. [7] 赵茂泰.智能仪器原理及应用[J].电子工业出版社,2004. [8] 张晓东等.电工实用电子制作[M].北京:国防工业出版社,2005. [9] 黄继昌等.实用单元电路及其应用[M].北京:机械工业出版社,2008. [10] 余孟尝.数字电子技术基础简明教程[M].北京:高等教育出版社,2006. [11] 电子电路图网. http://www.cndzz.com.

[12] 周志敏等. 集成稳压电源电路图集[M].北京:中国电力出版社,2008. [13] 范科常用电子传感器参数手册[M].北京:工业出版社,2001.6

[14] 杨素行模拟电子技术基础简明教程[M].北京:高等教育出版社,2006,978-7

23

附录

附录

附录1、仿真图:

附录2、实物图:

24

附录

附录3 、程序清单:

#include #include #include #include

#define uchar unsigned char #define uint unsigned int #define ulong unsigned long int weight; double money; uint temp; uchar button; sbitlcdrs=P2^4; sbitlcdwr=P2^5; sbitlcden=P2^6; sbit hx711_dout=P2^0; sbit hx711_sck=P2^1; sbitspk=P2^2; sbit ADDO =P1^5; sbit ADSK = P0^0;

//LCD1602显示程序////////////////////////////////////////////////////////////// voiddelayms(uint k) { uinti,j; }

void write_com(uchar com)//写命令 {

lcdrs=0; P0=com; delayms(5); for(i=k;i>0;i--) for(j=110;j>0;j--);

25

附录

lcden=1; delayms(5);

}

lcden=0;

void write_date(uchar date)//写数据 {

lcdrs=1; P0=date; delayms(5); lcden=1;

delayms(5); }

void init_1602() { }

voiddisplaywpm(void) {

ucharnum;

uchar code table[]=\write_com(0x80); write_date(table[0]); write_date(table[1]); write_com(0x80+0x07); write_date(table[2]); write_date(table[3]); write_com(0x80+0x0a); lcden=0; lcdwr=0;

write_com(0x38);//设置16x2 显示5x7点阵,8位数据接口 write_com(0x0c);//设置开显示,不显示光标 write_com(0x06);//写一个字符后地址指针加1 write_com(0x01);//显示清0,数据指针清0 lcden=0;

26

附录

}

voidweight_shuzhi(uintaaa) {

ucharidataweighttable[4]={0,0,0,0}; weighttable[3]=aaa; weighttable[2]=aaa/10; weighttable[1]=aaa/100; write_date(table[4]); write_date(table[5]); write_com(0x80+0x0f); write_date(table[6]); write_com(0x80+0x40); for(num=0;num<6;num++) write_date(table[num+7]); write_com(0x80+0x4a); write_date(table[13]);

weighttable[0]=aaa/1000; }

//////////////////////////////////////////////////////////////////////////////////// ///////////////////hx711程序////////////////////////////////////////////////// void Delay__hx711_us(void) {

_nop_(); _nop_();

write_com(0x80+0x06); //设置显示位置 write_date(0x30+weighttable[0]); write_com(0x80+0x05); //设置显示位置 write_date('.');

write_com(0x80+0x02); //设置显示位置 write_date(0x30+weighttable[1]); write_com(0x80+0x03); //设置显示位置 write_date(0x30+weighttable[2]); write_com(0x80+0x04); //设置显示位置 write_date(0x30+weighttable[3]); write_com(0x0c); //不显示光标

27

附录

}

ulongReadCount(void) //增益128 { }

///////////////////////////////////////////////////////////////////

/////////////皮重,获得重量的程序//////////////////////////////////// void get_pizhong() //获取皮重,秤盘重量 { }

uint j;

ulong hx711_dat; for(j=0;j<5;j++) ;

delayms(20);

//HX711AD转换数据处理

ulong count; uchar i; hx711_dout=1; Delay__hx711_us(); hx711_sck=0; count=0;

while(hx711_dout); for(i=0;i<24;i++) { }

hx711_sck=1; Delay__hx711_us(); hx711_sck=0; return(count);

hx711_sck=1; count=count<<1; hx711_sck=0; if(hx711_dout)

count++;

hx711_dat=ReadCount();

temp=(uint)(hx711_dat/100); //缩放long数据为int型,方便处理

28

附录

void get_weight() //获取被测物体重量 {

ulong hx711_data,a; uintget,aa;

//HX711AD转换数据处理

hx711_data=ReadCount(); get=(uint)(hx711_data/100); if(get<(temp+4)) {

while(1) {

//判断是否有正向重量

weight=0;

}

weight_shuzhi(weight);//显示重量 hx711_data=ReadCount(); get=(uint)(hx711_data/100); if(get>(temp+4))break;

//

//HX711AD输出数据处理

(J1-11059200)/148)-40))*3*15-38380-13700;

}

///////////////////////////////键盘扫描程序//////////////////////////////////// ucharkeyscan() {

uint tem; uchar key='a'; P3=0xfe; tem=P3; tem=tem&0xf0; if(tem!=0xf0) {

delayms(10); }

a=ReadCount(); aa=(uint)(a/100)-temp;

weight=(uint)((float)aa/9.87+0.5);//重量转换函数,传感器型号不同此函数要适当修改

29

附录

P3=0xfe; tem=P3; tem=tem&0xf0; if(tem!=0xf0) { tem=P3; switch(tem) {

case 0x7e: key='0'; break; case 0xbe: key='1'; break; case 0xde: key='2'; break; case 0xee: key='3'; break;

}

while(tem!=0xf0) { tem=P3; tem=tem&0xf0; }

}

} P3=0xfd; tem=P3; tem=tem&0xf0; if(tem!=0xf0) {

delayms(10); 30

附录

P3=0xfd; tem=P3; tem=tem&0xf0; if(tem!=0xf0)

{

tem=P3;

switch(tem) } P3=0xfb; tem=P3; tem=tem&0xf0; if(temp!=0xf0) {

delayms(10); P3=0xfb; tem=P3; tem=temp&0xf0; if(tem!=0xf0)

{

tem=P3; switch(tem) {

case 0x7b:

{ }

case 0x7d:key='4';break; case 0xbd:key='5';break; case 0xdd:key='6';break; case 0xed:key='7';break;

while(tem!=0xf0) }

{ }

tem=P3; tem=tem&0xf0;

31

附录

key='8'; break; case 0xbb: key='9'; break; case 0xdb: key='.'; break; case 0xeb: key=' '; break;

}

while(tem!=0xf0)

{ tem=P3; tem=tem&0xf0;

}

}

} P3=0xf7; tem=P3; tem=tem&0xf0; if(tem!=0xf0) { delayms(10); P3=0xf7; tem=P3; tem=tem&0xf0; if(tem!=0xf0) { tem=P3; switch(tem)

{

32

附录

}

void displayprice() //显示price {

static ucharbufferprice[4]={' ',' ',' '}; //把bufferprice定到能保存4个字符型数据,主要 } return key;

}

}

while(tem!=0xf0) { }

tem=P3; tem=tem&0xf0; case 0x77: key='.'; break; case 0xb7: key='w'; break; case 0xd7: key='p'; break; case 0xe7: key='m'; break;

是为了在做清零时方便

staticucharbuffermoney[4]; uint j;

static char ii;//这里不能用uchar型数据,静态数据必须加 button=keyscan();

if(button!='a') //如果有键按下 {

33

附录

}

}

write_com(0x80+0x0c); //price for(j=0;j<3;j++)

write_date(bufferprice[j]);//price

if(button=='m') { }

else if(button=='p')//单价 { }

else if(button==' ') //清零 {

ii=ii-1; //因为会减到-1,所以i不能用uchar型 if(ii<=0)ii=0; bufferprice[ii]=' '; } else { }

bufferprice[ii]=button; ii++;

if(ii>=3)ii=3; for(j=0;j<3;j++) bufferprice[j]=' '; write_com(0x80+0x0c); ii=0;

money=atof(bufferprice)*weight/10;//atof将字符串转换为浮点型 sprintf(buffermoney,\将浮点型转换为字符串 write_com(0x80+0x46); for(j=0;j<4;j++)

write_date(buffermoney[j]);

34

附录

//////////////////喇叭函数/////////////////// voiddelayus(uint z) { while(z++) { _nop_();

} }

void sound() { uint j; for(j=0;j>200;j++) { delayus(200); spk=!spk;

} spk=0;

for(j=0;j>200;j++) { delayms(1); //spk=!spk; }

/*if (spk>500 spk=1) elsespk=0;*/ }

void main() { get_pizhong(); init_1602();

displaywpm();

/* unsigned long ReadCount(void) {

unsigned long Count;

35

附录

unsigned char i; ADSK=0;//使能AD(PD_SCK 置低)

Count=0;while(ADDO); //AD转换未结束则等待,否则开始读取for (i=0;i<24;i++) { ADSK=1;//PD_SCK 置高(发送脉冲) Count=Count<<1; //下降沿来时变量 //Count//左移一位,右侧补0

ADSK=0; //PD_SCK 置低if(ADDO) Count++

}

ADSK=1;

Count=Count&0x800000;//第25个脉冲下降沿来时,ADSK=0return(Count);

} */ while(1) { get_weight();//得到重量 if(weight>0)

{weight_shuzhi(weight);}//显示重量 else

{weight_shuzhi(0);}

displayprice(); //扫描键盘,并显示price if(weight>2000)sound(); }

}

36

转换数据

本文来源:https://www.bwwdw.com/article/0wn7.html

Top