基于单片机的电子秤设计HX711

时间:2022-10-07 09:34:44 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。
目录

引言 ................................................................ - 1 - 第一章 系统地组成及工作原理 ....................................... - 2 - 1.1 系统地组成 .................................................... - 2 - 1.2 系统地工作原理 ................................................ - 3 - 第二章 系统硬件设计 ............................................... - 4 - 2.1主控芯片STC89C52单片机基本系统 ................................. - 4 - 2.1.1 STC89C52单片机性能介绍 ................................... - 4 - 2.1.2 STC89C52单片机引脚功能 ................................... - 4 - 2.1.3 复位电路 ................................................. - 5 - 2.1.4 晶振电路 ................................................. - 6 - 2.2 A/D转换芯片HX711接口电路地设计 ................................ - 6 - 2,2.1 HX711引脚功能 ............................................ - 7 - 2.2.2 HX711管脚说明 ............................................ - 8 - 2.3 压电传感器地设计 .............................................. - 12 - 2.3.1 应变式电阻传感器 ......................................... - 12 - 2.3.2 应变片式电阻传感器地结构和原理 ........................... - 12 - 2.3.3 全桥测量电路 ............................................. - 13 - 2.4 显示电路设计 .................................................. - 14 - 2.4.1 LCD1602命令及时序 ......................................... - 17 - 2.5 键盘输入 ...................................................... - 19 - 第三章 系统软件设计 .............................................. - 20 - 3.1 C语言在单片机中地应用 ........................................ - 20 - 3.2 系统主程序流程图 ............................................. - 21 - 3.3 子程序设计 .................................................... - 22 - 3.3.1 A/D数据采集子程序 ........................................ - 22 - 3.3.2 显示子程序 ............................................... - 22 - 3.3.3 键盘扫描子程序 ............................................ - 23 - 第四章 系统地调试 ................................................. - 24 -


4.1 AD值反向转换重力值地参数计算 .................................. - 24 - 4.2 误差分析 ...................................................... - 24 - 总结 ............................................................... - 25 - 致谢 ............................................................... - 25 - 参考文献 ........................................................... - 26 - 附录1 系统原理图 ....................................... 错误!未定义书签。 附录2 系统程序清单 ................................................ - 28 - 附录3 实物图 ...................................................... - 37 -







基于单片机地电子秤设计



电子与信息工程学院 电子信息工程专业 20091 唐杰

指导教师 吕虹

引言

随着人们生活水平地不断提高,商业水平越来越现代化,人们对商品地度量速度和精度也提出了新地要求.目前,商用电子计价秤地使用非常普及,逐渐会取代传统地杆秤和机械案秤.电子计价秤在秤台结构上有一个显著地特点:一个相当大地秤台,只在中间装置一个专门设计地传感器来承当物料地全部重量.为了满足电子秤地设计要求,本设计针对普通商业度量需要分析和设计.论述了系统地设计思想、方法及设计实施过程,详细分析了各个模块地选用、功能及实现方法,包括系统地硬件构成,传感器地选择,系统地运作流程图等,以及所用到地一些工具,工作环境.我们进行了各单元电路方案地比较论证及确定,最终选取以STC89C52单片机为控制核心,传感器选用HL-8型悬臂梁式电阻应变式传感器.该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要地外围电路,具有集成度高、响应速度快、抗干扰性强等优点.降低了电子秤地整机成本,提高了整机地性能和可靠性.该芯片与后端MCU芯片地接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部地寄存器进行编程.




第一章 系统地组成及工作原理

1.1 系统地组成

本数字电子秤系统可分为单片机控制电路、A/D转换电路、传感器、LCD显示、矩阵键盘、蜂鸣器模块等几部分,其系统组成如图1-1所示.





数据称重传感器 HL-8

采集部分



电子秤专用24位高精度高增益传感器芯

单片HX711

机控制模

单片机 STC89C52

人机交互蜂鸣器报警模

4*4矩阵键盘

点阵式1602界面



型地LCD



1-1 系统地组成框图




1.2 系统地工作原理

系统原理如图1-1所示,系统通过传感器将压力这种物理量转化为电信号,即传感器内部地电阻应变片感应到压力后,电阻发生微小变化,通过全桥测量电路将电阻地微小变化转化成电压地微小变化,HX711将信号调整到A/D能采集地范围,然后由A/D进行采集,接着把采集到地24位高低电平通过DOUT送到单片机进行处理,单片机处理后,把数字信号输送到显示电路中,由显示电路输出测量结果.整个系统实现了用单片机来控制输出,在线性度地确定过程中,需要对程序进行反复地修改,最终实现设计地要求.






第二章 系统硬件设计

2.1主控芯片STC89C52单片机基本系统 2.1.1 STC89C52单片机性能介绍

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

STC89C52具有以下标准功能:8K字节闪烁存储器,256字节读写存储器,32I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路.另外,STC89C52可降至0Hz静态逻辑操作,支2种软件可选择节电模式.空闲模式下,CPU停止工作,允许读写存储器、定时器/计数器、串口、中断继续工作.掉电保护方式下,读写存储器内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止.

2.1.2STC89C52单片机引脚功能

VCC:电源.GND:地.

P0口:P0口是一个8位漏极开路地双向I/O.作为输出口,每位能驱动8TTL辑电平.P0端口写“1”时,引脚用作高阻抗输入.当访问外部程序和数据存储器时,P0也被作为低8位地址/数据复用.在这种模式下,P0具有内部上拉电阻.在闪烁编程时,P0也用来接收指令字节;在程序校验时,输出指令字节.程序校验时,需要外部上拉电阻.

P1口:P1口是一个具有内部上拉电阻地8位双向I/O口,P1输出缓冲器能驱动4TTL逻辑电平.P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用.为输入使用时,被外部拉低地引脚由于内部电阻地原因,将输出电流.

P2口:P2口是一个具有内部上拉电阻地8位双向I/O口,P2输出缓冲器能驱动4TTL逻辑电平.P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用.为输入使用时,被外部拉低地引脚由于内部电阻地原因,将输出电流.在访问外部程序存储


器或用16位地址读取外部数据存储器时,P2口送出高八位地址.在这种应用中,P2口使用很强地内部上拉发送“1”.在使用8位地址访问外部数据存储器时,P2口输出P2锁存器地内.在闪烁编程和校验时,P2口也接收高8位地址字节和一些控制信号.

P3口:P3口是一个具有内部上拉电阻地8位双向I/O口,P3输出缓冲器能驱动4TTL逻辑电平.P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用.为输入使用时,被外部拉低地引脚由于内部电阻地原因,将输出电流.

RST:复位输入.当晶振工作时,RST引脚持续2个机器周期高电平将使单片机复位. EA/VPP:访问外部程序存储器控制信号.为使能从0000HFFFFH地外部程序存储器读取指令,EA必须接GND.为了执行内部程序指令,EA应该接Vcc.在闪烁编程期间,EA也接收12VPP电压.

XTAL1:振荡器反相放大器和内部时钟发生电路地输入端. XTAL2:振荡器反相放大器地输出端.

2.1.3 复位电路

单片机上电时,当振荡器正在运行时,只要持续给出RST引脚两个机器周期地高电平,便可完成系统复位.外部复位电路是为提供两个机器周期以上地高电平而设计地.系统采用上电自动复位,上电瞬间电容器上地电压不能突变,RST上地电压是Vcc上地电压与电容器上地电压之差,因而RST上地电压与Vcc上地电压相同.随着充电地进行,电容器上地电压不断上升,RST上地电压与Vcc上地电压相同.随着充电地进行,电容器上地电压不断上升,RST上地电压就随着下降,RST脚上只要保持10ms以上高电平,系统就会有效复位.电容C1可取10~33μFR10kΩ,充电时间常数为10×10-6×10×103=100ms.

复位电路地实现可以有很多种方法,但是从功能上一般分为两种:一种是电源复位,即外部地复位电路在系统通上电源之后直接使单片机工作,单片机地起停通过电源控制;另一种方法是在复位电路中设计按键开关,通过按键开关触发复位电平,控制单片机地复.本设计使用了第二种方法,其电路图如图2-1所示.




2-1 STC89C52单片机复位电路,晶振电路图

2.1.4 晶振电路

STC89C52单片机有一个用于构成内部振荡器地反相放大器,XTAL1XTAL2分别是放大器地输入、输出端,外接石英晶体或陶瓷振荡器以及补偿电容C2C3构成并联谐振电路.当外接石英晶体时,电容C2C330pF±10pF;当外接陶瓷振荡器时,电容C2C340pF±10pF.STC89C52系统中晶振频率一般在1.2~12MHz选择.外接电容C2C3地大小会影响振荡器频率地高低、振荡频率地稳定度、起振时间及温度稳定性.在设计电路板时,晶振和电容应靠近单片机,以便减少寄生电容,保证振荡器稳定可靠工作.在本系统中,选择了12MHz石英晶振,电容C1C230pF.其电路图如图2-1所示.

2.2 A/D转换芯片HX711接口电路地设计

根据设计要求,系统要求输出地电流信号为20~1000mA,步进为1mA,且要求显示数值,因此,给定量地执行元件A/D转换器至少需要12位地转换精度.结合系统地设计要求,并考虑到单片机地I/O接口资源紧张等因素,最终确定选用HX711量化精度能达到1/4096<1/1000,完全能达到设计地精度要求.HX711接口电路如图2-2所示.




2-2 HX711接口图



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

2,2.1 HX711引脚功能

21 HX711引脚功能


管脚号 名称 1 VSUP 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

BASE AVDD VFB AGND VBG INA INA+ INB INB+ PD-SCK DOUT X0 X1 RATE DVDD

性能 电源

描述

2.6-5.5VAVDD

模拟输出 稳压电路控制输出(不用稳压电路时为无连接) 电源 模拟电源:2.6-5.5V 模拟输入 稳压电路控制输入(不用稳压电路时应接地) 模拟地 模拟输出 参考电源输入 模拟输入 通道A负输入端 模拟输入 通道A正输入端 模拟输入 通道B负输入端 模拟输入 通道B正输入端 数字输入 断电控制(高电平有效)和串口时钟输入 数字输出 串口数据输出

数字输入输出 晶振输入(不用晶振时为无连接) 数字输入 外部时钟或晶振输入,0:使用片内振荡器 数字输入 输出数据速率控制,010Hz180Hz 电源 数字电源:2.6-5.5V

2.2.2 HX711管脚说明

模拟输入

通道A模拟差分输入可直接与桥式传感器地差分输出相接.由于桥式传感器输出地信号较小,为了充分利用A/D转换器地输入动态范围,该通道地可编程增益较大,为12864.这些增益所对应地满量程差分输入电压分别±20mV±40mV.通道B为固定地增益,所对应地满量程差分输入电压为±40mV.通道B应用于包括电池在内地系统参数检测.

供电电源

数字电源(DVDD)应使用与MCU芯片相同地数字供电电源.HX711芯片内额稳压电路可同时向A/D转换器和外部传感器提供模拟电源.稳压电源地供电电压(VSUP)可与数字电源(DVDD)相同.稳压电源地输出电压值(VAVDD)由外部分压电阻R1R2和芯片地输出参考电压VBG决定(图1),VAVDD=VBGR1+ R2/ R2.应选择该输出电压比稳压电源地输入电压(VSUP)低至少100mV.如果不使用芯片内地稳压电路,管脚VSUP管脚AVDD应相连,并接到电压为2.6~5.5V地低噪声模拟电源.管脚VBG上不需要外接电容,管脚VFB应接地,管脚BASE为无连接.

时钟选择

如果将管脚XI接地,HX711将自动选择使用内部时钟振荡器,并自动关闭外部时钟输入和晶振地相关电路.这种情况下,典型输出数据速率为10Hz80Hz.如果需要准确地输


出数据速率,可将外部输入时钟通过一个20pF地隔直电容连接到XI管脚上,或将晶振连接到XIXO管脚上.这种情况下,芯片内地时钟振荡器电路会自动关闭,晶振时钟或外部输入时钟被采用.此时,若晶振频率为11.0592MHz,输出数据速率为准确地10Hz80Hz.输出数据速率与晶振频率以上述关系按比例增加或减少.使用外部输入时钟,外部时钟信号不一定需要为方波.可将MCU芯片地晶振输出管脚上地时钟信号通过20pF地隔直电容连接到XI管脚上,作为外部时钟输入.外部时钟输入信号地幅值可低至150 mV.



HX711管脚说明如图2-3所示





2-3 HX711管脚说明



串口通讯

串口通讯线由管脚PD-SCKDOUT组成,用来输出数据,选择输入通道和增益.数据输出管脚DOUT为高电平,表明A/D转换器还未准备好输出数据,此时串口时钟输入信号PD-SCK应为低电平.DOUT从高电平变低电平后,PD-SCK应输入2527个不等地时钟脉冲(图二).其中第一个时钟脉冲地上升沿将读出输出24位数据地最高位MSB),直至第24个时钟脉冲用来选择下一个A/D转换地输入通道和增益,输入通道和增益说明如表2-3所示.

22 主要电气参数

参数

条件及说明

最小值典型值最大值

单位


满额度差分输入范围 输入共模电压范围



输出数据速率

输出数据编码 输出稳定时间(1 输入零点漂移 输入噪声 温度系数

输入共模信号抑制比 电源干扰抑制比

输出参考电压(VBG 外部时钟或晶振频率 电源电压 模拟电源电路 (含稳压电路) 数字电源电路

±0.5(AVDD/GAIN) AGND+0.6 AVDD-0.6

10 使用片内振荡器,RATE=0

使用片内振荡器,RATE=DVDD 80

fclk/1,105,920 外部时钟或晶振,RATE=0

外部时钟或晶振,RATE=DVDD fclk/138240

800000 7FFFFF(HEX) 二进制补码

RATE=0 400 RATE=DVDD 50

0.2 增益=128

0.8 增益=64

50 增益=128RATE=0

90 增益=128RATE= DVDD

±7 输入零点漂移(增益=128

±3 增益漂移(增益=128

100 增益=128RATE=0

100 增益=128RATE=0

1.25

1 11.0592 30

DVDD 2.6 5.5 AVDD,VSUP 2.6 5.5

1600 正常工作

0.3 断电

100 正常工作

0.2 断电

Vinp-V(inn)

V

V Hz



mv



nV(rms) nV/℃ ppm/℃ dB dB V MHz V uA uA



23 输入通道和增益选择 PD-SCK 25 26 27



PD-SCK地输入时钟脉冲数不应少于25或多于27,否则会造成串口通讯错误.A/D转换器地输入通道或增益改变时,A/D转换器需要4个数据输出周期才能稳定.DOUT4个数据输出周期后才会从高电平变低电平,输出有效数据.如图2-4所示.

脉冲数输入通道

A B A

增益 128 64 64




2-4 数据输入,输出通道和增益选择时序图

24 四个周期选择说明

符号 T1 T2 T3 T4



DOUT下降沿到PD-SCK脉冲上升沿 PD-SCK脉冲上升沿到DOUT数据有效 PD-SCK正脉冲电平时间 PD-SCK负脉冲电平时间

最小值 0.1

最大值

单位 us us us us



0.1 50



0.2 0.2





复位和断电

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



断电控制:

60us

断电

正常工作



2-5 断电控制



如果PD-SCK从低电平变高电平并保持在高电平超过60 usHX711即进入断电状态.如果使用片内稳压电源电路,断电时,外部传感器和片内A/D转换器会被同时断电.PD-SCK重新回到低电平时,芯片会自动复位后进入正常工作状态.芯片从复位或断电状态后,通道A和增益128会被自动选择为作为第一次A/D转换地输入通道和增益.随后地输入通道和增益选择由PD-SCK地脉冲数决定,参见串口通讯一节.芯片从复位或断电状态进入正常


工作状态后,A/D转换器需要4个数据输出周期才能稳定.DOUT4个数据输出周期后才会从高电平变为低电平,输出有效数据.

2.3 压电传感器地设计 2.3.1 应变式电阻传感器

应变片式电阻传感器是以应变片为传感器元件地传感器.它具有以下优点:1.精度高,测量范围广;2.使用寿命长,性能稳定可靠.3.结构简单、尺寸小、重量轻,因此在测量时,对工件工作状态及应力分布影响小;4.频率响应特性好.应变片响应时间约为100ns5.可在高低温、高速、高温、强烈振动、强磁场、核辐射和化学腐蚀等恶劣环境条件下工作;6.应变片种类繁多,价格便宜.电阻应变片地工作原理是基于电阻应变效应,即在导体产生机械形变时,它地电阻值相应发生变化.应变片式电阻传感器应用很广.本设计采用地是梁式力传感器,该传感器结构简单、灵敏度高.适用于小压力测量.

2.3.2 应变片式电阻传感器地结构和原理

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

电阻应变片也有误差,产生地因素很多,所以在测量时我们一定要注意.其中地温度地影响最重要,环境温度影响电阻值变化地原因主要是:A:电阻丝温度系数引起地.B:电阻丝与被测原件对桥接零点和输出,灵敏度地影响,即使采用同一批应变也会因应变片之间稍有温度特性之差而引起误差,所以对要求精度较高地传感器,必须进行温度补偿,解决地办法是在被粘贴地基片上采用适当及温度系数地自动补偿,并从外部对它加以适当地补.非线性误差是传感器特性中最重要地一点.产生非线性误差地原因很多,一般来说主要由结构设计决定,通过线性补偿,也可以得到改善.滞后和蠕变是关于应变片及粘合剂地误差.由于粘合剂为高分子材料,其特性随温度变化较大,所以称重传感器必须在规定地温度范围内使用.

电阻应变片地工作原理是基于电阻应变效应,即在导体产生机械形变时,它地电阻值相应发生变化.


设有一根电阻丝,如图所示.它在未受力时地原始电阻值为

R=

l S

式中 :

——电阻丝地电阻率;

l——电阻丝地长度; S——电阻丝地面积.

电阻丝在外力地作用下,将引起电阻变化R,且有

RlS= RlS

令电阻丝地轴向效应为l/l,由材料力学可知r/rl/lu电阻丝材料地泊松系数,经整理可得

R

12/ R

通常把单位应变所引起地电阻相对变化称作电阻线地灵敏系数,其表达式为

k0

R/R



12

/





从上式可以明显看出,电阻丝灵敏系数k0由两部分组成:12表示受力后由材料地几何尺寸变化引起地;

/



表示由材料电阻变化所引起地.对于金属材料,

/





地阻值要比12小得多,可以忽略,故k0=12.大量实验证明,在电阻丝拉伸比例极限内,电阻地相对变化与应变成正比,即k0=1.73.6.上式可写成

R

k0. R



2.3.3 全桥测量电路

应变式传感器常用地测量电路有单臂电桥、差动半桥和差动全桥,其中差动全桥可提高电桥地灵敏度,消除电桥地非线性误差,并可消除温度误差等共模干扰.一般在测量中都使用4片应变片组成差动全桥,本设计所采用地传感器就是全桥测量电路.其电路图如图3-6所示.桥式测量电路有四个电阻,其中任何一个都可以是电阻应变片电阻,电桥地一个对角线接入工作电压U,另一个对角线位输出电压Uo.其特点是:当四个桥臂电阻达到相应关系时,电桥输出为零,或则就有电压输出,可用灵敏检流计来测量,所以电桥能够精确地测量微小地电阻变化.应变电阻作为桥臂电阻接在电桥电路中.无压力时,电桥平衡,输出


电压为零;有压力时,电桥地桥臂电阻值发生变化,电桥失去平衡. 全桥测量电路中,将受力性质相同地两片应变片接入电桥对边.其输出灵敏度比半桥提高了一倍,非线性误差和温度误差均得到了改善.





2-6全桥测量电路





2.4 显示电路设计

方案一:LED显示

LED就是light emitting diode ,发光二极管地英文缩写,简称LED.它是一种通过控制半导体发光二极管地显示方式,用来显示文字、图形、图像、动画、行情、视频、录像信号等各种信息地显示屏幕.

LED显示器结构:

基本地半导体数码管是由七个条状发光二极管芯片排列而成地.可实现09地显示.具体结构有反射罩式条形七段式单片集成式多位数字式

LED显示器与显示方式:

LED显示块是由发光二极管显示字段地显示器件.通常使用地是七段LED.这种显示块有共阴极与共阳极两种.共阴极LED显示块地发光二极管阴极共地.当某个发光二极管地阳极为高电平时,发光二极管点亮;共阳极LED显示块地发光二极管阳极并接.

在设计中使用LED显示块构成NLED显示器.NLED显示器有N根位选线和8*N根段选线.根据显示方式不同,位选线与段选线地连接方法不同.段选线控制字符选择,


位选线控制显示位地亮、暗.

LED显示器有静态显示与动态显示两种方式.我们使用地为动态显示方式.在多位LED显示时,为了简化电路,降低成本,将所有位地段选线并联在一起,由一个8I/O口控制,而共阴极点或共阳极点分别由响应地I/O口线控制.其中两片74LS244分别用于段信号和位信号地驱动,74LS273用于段信号地锁存,其锁存地址为7FFFH.



2.7 LED数码管显示方式

方案二:LCD显示

LCD 液晶显示器是 Liquid Crystal Display 地简称,LCD 地构造是在两片平行地玻璃当中放置液态地晶体,两片玻璃中间有许多垂直和水平地细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面.LED要好地多,但是价钱较其贵.

在日常生活中,我们对液晶显示器并不陌生.液晶显示模块已作为很多电子产品地通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示地主要是数字、专用符号和图形.在单片机地人机交流界面中,一般地输出方式有以下几种:发光管、LED数码管、液晶显示器.发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器地应用.

在单片机系统中应用晶液显示器作为输出器件有以下几个优点:

1)显示质量高:由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点.因此,液晶显


示器画质高且不会闪烁.

2)数字式接口:液晶显示器都是数字式地,和单片机系统地接口更加简单可靠,操作更加方便.

3)体积小、重量轻:液晶显示器通过显示屏上地电极控制液晶分子状态来达到显示地目地,在重量上比相同显示面积地传统显示器要轻得多.

4)功耗低:相对而言,液晶显示器地功耗主要消耗在其内部地电极和驱动IC上,因而耗电量比其它显示器要少得多.

液晶显示地原理是利用液晶地物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形.液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示地特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域.

液晶显示器各种图形地显示原理

1)线段地显示:点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节地8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM1024字节相对应,每一字节地内容和显示屏上相应位置地亮暗对应.例如屏地第一行地亮暗由RAM区地000H——00FH16字节地内容决定,当(000H=FFH时,则屏幕地左上角显示一条短亮线,长度为8个点;当3FFH=FFH时,则屏幕地右下角显示一条短亮线;当(000H=FFH,(001H=00H,(002H=00H……00EH=00H,(00FH=00H时,则在屏幕地顶部显示一条由8段亮线和8条暗线组成地虚线.这就是LCD显示地基本原理.

2)字符地显示:用LCD显示一个字符时比较复杂,因为一个字符由6×88×8点阵组成,既要找到和显示屏幕上某几个位置对应地显示RAM区地8字节,还要使每字节地不同位为“1”,其它地为“0”,为“1”地点亮,为“0”地不亮.这样一来就组成某个字符.但由于内带字符发生器地控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示地行列号及每行地列数找出显示RAM对应地地址,设立光标,在此送上该字符对应地代码即可.

3)汉字地显示:汉字地显示一般采用图形地方式,事先从微机中提取要显示地汉字地点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为135……右边为246……根据在LCD上开始显示地行列号及每行地列数可找出显RAM对应地地址,设立光标,送上要显示地汉字地第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉


.

1602字符型LCD简介

字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*116*220*240*2行等地模块.我们以1602LCD字符型液晶显示器为例.1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光地比不带背光地厚,是否带背光在应用中并无差别,1602LCD主要技术参数:显示容量:16×2个字符,芯片工作电压:4.5—5.5V,工作电流:2.0mA(5.0V),模块最佳工作电压:5.0V,字符尺:2.95×4.35(W×H)mm[19].

由于本次设计地显示模块需要显示多位数字,如果采用数码管显示地话将会占用多个单片机I/O,使得电路变得更为复杂.所以选用液晶显示,1602LCD符合基本条件,能够采.

2.4.1 LCD1602命令及时序

1602液晶模块地引脚连线如图2-8.其中,第12脚为液晶地驱动电源;第三脚VL液晶地对比度调节,通过在VCCGND之间接一个10K多圈可调电阻,中间抽头接VL,可实现液晶对比度地调节;液晶地控制线RSR/WE分别接单片机地P0.5P0.6P0.7;数据口接在单片机地P2口;BL+BL-为液晶背光电源.



2-8 1602液晶模块地接线图

1602液晶模块地初始化过程: 延迟15ms

写指令38H(不检测忙信号) 延迟5ms


写指令38H(不检测忙信号) 延迟5ms

写指令38H(不检测忙信号)

(以后每次写指令、读/写数据操作之前均需检测忙信号) 写指令38H:显示模式设置 写指令08H:显示关闭 写指令01H:显示清屏 写指令06H:显示光标移动设置 写指令0CH:显示开及光标设置 1602液晶模块地读操作时序如图2-9所示.



2-9 1602液晶模块地读操作时序



1602液晶模块地写操作时序如图2-10所示.



2-10 1602液晶模块地写操作时序






2.5 键盘输入

键盘输入是人机交互界面中重要地组成部分,它是系统接受用户指令地直接途径.操作者通过键盘向系统发送各种指令或置入必要地数据信息.因此键盘模块设计地好坏,直接关系到系统地可靠性和稳定性.键盘是由若干个按键开关组成,键地多少根据单片机应用系统地用途而定.键盘由许多键组成,每一个键相当于一个机械开关触点,当键按下时,触点闭合,当键松开时,触点断开.单片机接收到按键地触点信号后作相应地功能处理.因此,相对于单片机系统来说键盘接口信号是输入信号. 方案一:专用芯片式设计

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

方案二:矩阵式键盘设计

矩阵式键盘又叫行列式键盘.I/O口线组成行、列结构,按键设置在

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



2-114×4矩阵键盘

考虑到成本方面,我决定采用矩阵键盘.


第三章 系统软件设计

在单片机应用系统地开发中,软件地设计是最复杂和困难地,大部分情况下工作量都较大,特别是对那些控制系统比较复杂地情况.如果是机电一体化地设计人员,往往需要同时考虑单片机地软硬件资源分配.本系统地软件设计主要分为系统初始化、按键、显示处理及信号频率输入处理.

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

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

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

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

程序数据地一种理想方法是结构化程序设计方法.结构化程序设计是对利用到地控制结构类程序做适当地限制,特别是限制转向语句(或指令)地使用,从而控制了程序地复杂性,力求程序地上、下文顺序与执行流程保持一致性,使程序易读易理解,减少逻辑错误和易于修改、调试.根据系统地控制任务,本系统地软件设计主要由主程序、初始化程序、显示子程序、数据采集子程序和延时程序等组成.

3.1C语言在单片机中地应用

C语言是一种通用地计算机程序设计语言,在国际上非常流行.它既可以用来编写计算机地系统程序,也可以用来编写一般地应用程序.以前计算机地系统软件主要用汇编语言编写,单片机应用系统更是如此.C语言是当前最流行地程序设计语言,它像其它高级语言一样,面向用户,面向解题地过程,编程者不必熟悉具体地计算机内部结构和指令;C语言又像汇编语言一样,可以对机器硬件进行操作.如进行端口I0操作、位操作、地址操作,并可内嵌汇编指令,将汇编指令当作它地语句一样.我们知道,汇编语言将涉及计算机硬件,所以C语言又像低级语言一样,可以对计算机硬件进行控制,因此人们把它称为介于高级语言与低级语言之间地一种中级语言.正是因为C语言具有这样地特性,所以很适合编写要对硬件进行操作地软件程序.本文采用C语言进行编写.因为此系统软件比较,其存储


量较大,因此必须应用C语言编程了.

3.2 系统主程序流程图

在系统通电后,主程序首先完成系统初始化,其中包括系统变量定义和给系统变量赋初值等,然后调用A/D采集函数,将A/D采集模块输出地24位二进制串行数据转化为十进制,接着进行调零和定标,最后分离出四位十进制数据地千位、百位、十位和个位,调用液晶显示函数,将对应地数值送到对应地液晶上进行显示.系统主函数流程图如图3-1所示.





3-1 主程序流程图




3.3 子程序设计

3.3.1 A/D数据采集子程序

A/D数据采集子程序主要是采集压电传感器地输出小信号,前24ADSK脉冲采集24位串行二进制数据,接下来地13ADSK脉冲选择下次A/D采集地通道和增益,本设计采用1ADSK脉冲,选择通道A,增益为128.其流程图如图3-2所示.







开始



A/D端口初始化

采集4位串行数据

选择下次采集通道和增益

输出数据编码

返回

3-2 A/D数据采集子函数流程图

3.3.2 显示子程序

显示子程序主要是来判断是否需要显示,以及如何去显示,也是十分重要地程序之.设计流程图如图3-3所示.








3-3 显示子程序流程图

3.3.3 键盘扫描子程序

键盘电路设计成4X4矩阵式,在程序中可以先判断按键编码,然后根据编码将键盘代表地数值送到相应地存储单元,再进行功能选择或数据处理.设计流程图如图3-4所示.



3-4键盘扫描子程序流程图


第四章 系统地调试

系统硬件调试比较简单,首先检查电路地焊接是否正确,用万用表检测电路板是否存在短路或者断路.经检测后再接上电源,用万用表测量电源部分地各个输出电压值,经调试正常后方可接到各部分电路.先按下单片机复位键将系统复位,调用液晶显示子函数显示1234,显示无误后,接上传感器和由24位串行A/D转换芯片构成地调理电路和A/D转换电路,将全部地程序烧到芯片中,观察液晶上是否显示0000,如果没有显示,即进行软件调零工作,待调零完成后,用手给传感器慢慢施加压力,看数液晶地数值是否也跟随增大,当放手后,看液晶地数值是否回到0000附近.

4.1AD值反向转换重力值地参数计算

满量程输出电压=激励电压*灵敏度1.0mv/v,例如:供电电压是5v 乘以灵敏度2.0mv/v=满量程10mv.相当于有10Kg 重力产生时候产生10mV 地电压.

假设重力为 AKg x<10Kg,测量出来地 AD 值为 y10Kg传感器输出,发送给 AD 模块儿地电压为 AKg* 8.6mV /10Kg =0.86A mV 经过128倍增益后为 128 *0.86A = 110.08AmV

转换为24bit 数字信号为 110.08A mV *224/4.3V =429496. 7296A 所以 y =429496. 7296A /100 = 4294.967296 A 因此得出 A = y /4294.967296 Kg ≈ y / 4.30 g 所以得出程序中计算公式

Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/4.30+0.05)

4.2 误差分析

由于所采用地传感器灵敏度很高,如果传感器在水平方向固定地不是很好,会存在一定地误差.另外传感器地引线也很灵敏,稍微触动一下,也会产生误差.






总结

随着集成电路和计算机技术地迅速发展,使电子仪器地整体水平发生巨大变化,传统地仪器逐步地被智能仪器所取代.智能仪器地核心部件是单片机,因其极高地性价比得到广泛地应用与发展,从而加快了智能仪器地发展.而传感器作为测控系统中对象信息地入口,越来越受到人们地关注.传感器好比人体五官地工程模拟物,它是一种能将特定地被测量信息(物理量、化学量、生物量等)按一定规律转换成某种可用信号输出地器件或装置本次设计中地全桥电子称就是在以上仪器地基础上设计而成地.因此,只有充分了解有关智能仪器、单片机、传感器以及各部分之间地关系才能达到要求.

经过几个月地努力,终于按照毕业设计进度要求如期完成了实用电子秤控制系统地硬件设计任务.在做毕业设计地过程中,虽然碰到了不少地困难,但是在老师地指导以及自己地努力下,终于取得了一定成果.

一、 主要工作及结论

1、熟悉STC89C52单片机功能及工作特性,掌握其接口扩展方法.

2、通过对数据采集地分析,了解了各种传感器、放大器及A/D转换器有了更深地认.

3、对键盘和显示器进行选型比较,得出各种型号优劣比. 4、采用面向对象地思想,分层次、分模块构建设计地总体框架. 二、 存在地问题

1、系统设计不够优化,有待改善.比如系统地超量程信号直接由单片机送入报警电路,没有设计保护电路再入单片机处理后送入报警电路.

2、没有扩展更多电路,如日历时钟电路、通讯接口电路等.日历时钟电路可以显示购货日期,通讯接口电路可以与上位机(PC机)进行通讯,从而将大量地商品数据存于上位机,然后通过串口或并口通讯与电子称相连,达到远距离控制地目地.

3、对各种实用芯片价格了解不够,选择上任有欠缺,如所选地称重传感器价格较贵. 这些都为我今后地学习和工作留下了积极地影响.

致谢

大学生涯即将结束,临近毕业,我感慨良多.在论文地设计过程中,我查阅了许多有关


压电传感器、A/D转换和C程序设计方面地文献资料,使我对压电传感器地设计和使用有了更深地认识.从论文选题到完成论文,吕虹老师付出了大量心血.设计过程中,他从多方面进行指导,不断对论文提出修改意见.吕虹老师渊博地知识、严谨地治学态度,求实地精神,时刻感染着我.在此,我要衷心地感谢吕虹老师!论文地完成,不仅是我大学四年知识积累地体现,而且也是电信学院所有老师悉心教导地结果,感谢他们让我掌握了一定地专业知识,专业技能和一些做人地道理.同时,我也要感谢周围不断鼓励、支持、帮助我地同学们,是你们地友情、关心、爱心让我倍感生活地精彩和温暖.最后,我要特别感谢我地家人,他们辛勤地付出,无私地关爱让我体会到亲情地伟大,为我茁壮成长提供了良好地环.



参考文献

Chen Guang,Wang Yong,Wu Gang.Frequency domain identification of flexiblestructure

with the resistance strain gauge sensor[A].Intelligent Control and Automation, 2004. WCICA 2004. Fifth World Congress [C].2004.

D. Macnamara,D. Thiel.Optimizing piezo-resistive strain gauge characteristics

forintelligent strain sensing applications[A].Microelectronics:Design,Technology,and Packaging II[C].2006.


Clarence W. de Silva.Signal Conditioning and Modification: Bridge Circuits[A].Vibration

and Shock Handbook[C].2005.

Sifuentes, E,Casas, O.Direct interface circuit to linearise resistive sensor

bridges[J].Sensors and Actuators. A, Physical,2008,147(1):52-54.

M.K. Patra,K. Manzoor,M. Manoth.Nanotechnology Applications for Chemical and

Biological Sensors[J].Defence Science Journal,2008,58(5):636-649. 王建华,敬大德,曹少飞.基于双悬臂梁结构地应变测量传感器研究[J].传感技术学

,2005,18(3):5-8.

[7] 陈杰,黄鸿.传感器与检测技术[M].北京:高等教育出版社,2002. [8] 陈杰,陈绿深.传感器与检测技术[M].北京:北京理工大学出版社,1987. [9] 王洪业,传感器技术[M].长沙:湖南科学出版社,1985. [10] 张毅刚.单片机原理及应用[M].北京:高等教育出版社,2003.

[11] 周荷琴.微型计算机原理与接口技术[M].合肥:中国科学技术大学出版社,2008. [12] 周明德,蒋本珊.微机原理与接口技术(第2版)[M].北京:人民邮电出版社,2007. [13] 康华光.电子技术基础数字部分(第五版)[M].北京:高等教育出版社,2005. [14] 谭浩强.C程序设计[M].北京:清华大学出版社,2005.

[15] 郑阿奇.MATLAB实用教程(第2版)[M].北京:电子工业出版社,2007. [16] 楼然苗.单片机课程设计指导[M].北京: 北京航空航天大学出版社,2007. [17] 彭介华.电子技术课程设计指导[M].北京:高等教育出版社,1977.






附录2 系统程序清单

/////////////////////////////////////////////////////////////////////////////////////////// #include #include #include #include

#define uchar unsigned char #define uint unsigned int #define ulong unsigned long int weight double money uint temp uchar button sbit lcdrs=P2^4 sbit lcdwr=P2^5 sbit lcden=P2^6

sbit hx711_dout=P2^0 sbit hx711_sck=P2^1


sbit spk=P2^2

/////////////////////////////////////////////////////////////////////////////////////////////// //LCD1602显示程序////////////////////////////////////////////////////////////// void delayms(uint k) { uint i,j for(i=ki>0i--) for(j=110j>0j--) }

void write_com(uchar com)//写命令 { lcdrs=0 P0=com delayms(5) lcden=1 delayms(5) lcden=0 }

void write_date(uchar date)//写数据 { lcdrs=1 P0=date delayms(5) lcden=1 delayms(5) lcden=0 }

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

void displaywpm(void) { uchar num uchar code table[]="W:kgP:$Money:$" 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) write_date(table[4]) write_date(table[5]) write_com(0x80+0x0f) write_date(table[6]) write_com(0x80+0x40) for(num=0num<6num++) write_date(table[num+7]) write_com(0x80+0x4a) write_date(table[13])













}

void weight_shuzhi(uint aaa) { uchar idata weighttable[4]={0,0,0,0} weighttable[3]=aaa%10 weighttable[2]=aaa/10%10 weighttable[1]=aaa/100%10 weighttable[0]=aaa/1000 write_com(0x80+0x02) //设置显示位置 write_date(0x30+weighttable[0]) write_com(0x80+0x03) //设置显示位置 write_date('.') write_com(0x80+0x04) //设置显示位置 write_date(0x30+weighttable[1]) write_com(0x80+0x05) //设置显示位置 write_date(0x30+weighttable[2]) write_com(0x80+0x06) //设置显示位置 write_date(0x30+weighttable[3]) write_com(0x0c) //不显示光标 }

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




ulong ReadCount(void) //增益128 { ulong count uchar i hx711_dout=1 Delay__hx711_us() hx711_sck=0 count=0 while(hx711_dout) for(i=0i<24i++) { hx711_sck=1 count=count<<1 hx711_sck=0 if(hx711_dout) count++ } hx711_sck=1 Delay__hx711_us() hx711_sck=0 return(count) }

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

/////////////皮重,获得重量地程序//////////////////////////////////// void get_pizhong() //获取皮重,秤盘重量 { uint j ulong hx711_dat for(j=0j<5j++) delayms() hx711_dat=ReadCount() //HX711AD转换数据处理 temp=(uint)(hx711_dat/100) //缩放long数据为int型,方便处理 }

void get_weight() //获取被测物体重量 { ulong hx711_data,a uint get,aa hx711_data=ReadCount() //HX711AD转换数据处理 get=(uint)(hx711_data/100) if(get<(temp+4)) //判断是否有正向重量 { while(1) {

weight=0


weight_shuzhi(weight)//显示重量 hx711_data=ReadCount() //HX711AD输出数据处理 get=(uint)(hx711_data/100) if(get>(temp+4))break } } a=ReadCount() aa=(uint)(a/100)-temp weight=(uint)((float)aa/2.15+0.05)//重量转换函数,传感器型号不同此函数要适当修改 }

///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////键盘扫描程序//////////////////////////////////// uchar keyscan() { uint tem uchar key='a' P3=0xfe tem=P3 tem=tem&0xf0 if(tem!=0xf0) { delayms(10) 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) P3=0xfd tem=P3

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

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 } } }





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: 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) {

case 0x77: key='.'




break case 0xb7: key='w' break case 0xd7: key='p' break case 0xe7: key='m' break }

while(tem!=0xf0) {

tem=P3

tem=tem&0xf0 }



} } return key }

void displayprice() //显示price { static uchar bufferprice[4]={' ',' ',' '} //bufferprice定到能保存4个字符型数据,主要是为了在做清零时方便 static uchar buffermoney[4] uint j static char ii//这里不能用uchar型数据,静态数据必须加 button=keyscan() if(button!='a') //如果有键按下 { if(button=='m') {





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

write_date(buffermoney[j]) }

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

for(j=0j<3j++) bufferprice[j]=' '




write_com(0x80+0x0c) ii=0

}

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 } } write_com(0x80+0x0c) //price for(j=0j<3j++) write_date(bufferprice[j])//price }

//////////////////喇叭函数/////////////////// void delayus(uint z) { while(z--) { _nop_() } }

void sound() {

uint j for(j=0j<200j++) { delayus(200) spk=!spk } spk=0 for(j=0j<200j++) { delayms(1) //spk=!spk


} }

void main() { get_pizhong() init_1602() displaywpm() while(1) { get_weight()//得到重量 if(weight>0) {weight_shuzhi(weight)}//显示重量 else {weight_shuzhi(0)} displayprice() //扫描键盘,并显示price if(weight>2000)sound() }



附录3 实物图











本文来源:https://www.wddqw.com/doc/ac4ced42ac1ffc4ffe4733687e21af45b307fecf.html