论文题目:基于51单片机的电子秤的设计
第一章 功能说明
本设计系统以单片机AT89S52为控制核心,实现电子秤的基本控制功能。在设计系统时,为了更好地采用模块化设计法,分步设计了各个单元功能模块。 系统的硬件部分包括最小系统部分、数据采集部分、人机交互界面和系统电源四大部分。最小系统部分主要包括AT89S52和扩展的外部数据存储器;数据采集部分由称重传感器,信号的前期处理和A/D转换部分组成,包括运算放大器AD620和A/D转换器ICL7135;人机界面部分为键盘输入,四位LED数码显示器,可以直观的显示重量的具体数字以及方便的输入数据,使用方便;系统电源以LM317和LM337为核心设计电路以提供系统正常工作电源。 系统的软件部分应用单片机C语言进行编程,实现了该设计的全部控制功能。该电子秤可以实现基本的称重功能(称重范围为0~9.999Kg,重量误差不大于±0.005Kg),并发挥部分的显示购物清单的功能,可以设置日期和设定十种商品的单价, 还具有超量程和欠量程的报警功能。 本系统设计结构简单,使用方便,功能齐全,精度高,具有一定的开发价值。 称重传感器原理即由非电量(质量或重量)转换成电量的转换元件,它是把支承力变换成电的或其它形式的适合于计量求值的信号所用的一种辅助手段。 按照称重传感器的结构型式不同,可以分直接位移传感器(电容式、电感式、电位计式、振弦式、空腔谐振器式等)和应变传感器(电阻应变式、声表面谐振式)或是利用磁弹性、压电和压阻等物理效应的传感器。 对称重传感器的基本要求是:输出电量与输入重量保持单值对应,并有良好的线性关系;有较高的灵敏度;对被称物体的状态的影响要小;能在较差的工作条件下工作;有较好的频响特性;稳定可靠。 传感器下的定义是:“能感受规定的被测量并按照一定的规律转换成可用信号的器件或装置,通常由敏感元件和转换元件组成”。其中敏感元件指传感器中能直接感受被测量的部分,转换元件指传感器中能将敏感元件输出量转换为适于传输和测量的电信号部分。此外传感器是一种检测装置,能感受到被测量的信息,并能将检测感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。它是实现自动检测和自动控制的首要环节。 称重传感器在电子秤中占有十分重要的位置,被喻为电子秤的心脏部件,它的性能好坏很大程度上决定了电子秤的精确度和稳定性。通常称重传感器产生的误差约占电子秤整机误差的50%~70%。若在环境恶劣的条件下(如高低温、湿热),传感器所占的误差比例就更大,因此,在人们设计电子秤时,正确地选用称重传感器非常重要。 称重传感器的种类很多,根据工作原理来分常用的有以下几种: 电阻应变式、电容式、压磁式、压电式、谐振式等。(本设计采用的是电阻应变式) 电阻应变式称重传感器包括两个主要部分,一个是弹性敏感元件:利用它将被测的重量转换为弹性体的应变值;另一个是电阻应变计:它作为传感元件将弹性体的应变,同步地转换为电阻值的变化。电阻应变片所感受的机械应变量一般为10 - 6~10 - 2,随之而产生的电阻变化率也大约在10 - 6~10 - 2数量级之间。这样小的电阻变化用一般测量电阻的仪表很难测出,必须采用一定形式的测量电路将微小的电阻变化率转变成电压或电流的变化,才能用二次仪表显示出来。在电阻应变式称重传感器中通过桥式电路将电阻的变化转换为电压变化。电阻应变式称重传感器工作原理框图如图2-1所示: 如图2-2电阻应变式称重传感器工作原理框图 
当传感器不受载荷时,弹性敏感元件不产生应变,粘贴在其上的应变片不发生变形,阻值不变,电桥平衡,输出电压为零;当传感器受力时,即弹性敏感元件受载荷P时,应变片就会发生变形,阻值发生变化,电桥失去平衡,有输出电压。 如图2-3 桥式测量电路 R1、R2、R3、R4为4个应变片电阻,组成了桥式测量电路,Rm为温度补偿电阻,e为激励电压,V为输出电压。 若不考虑Rm,在应变片电阻变化以前,电桥的输出电压为: V= 由于桥臂的起始电阻全等,即R1 = R2 = R3 = R4 = R,所以V=0 。 当应变片的电阻R1、R2、R3、R4变成R+△R1、R+△R2、R+△R3、R+△R4时,电桥的输出电压变为: V= 通过化简,上式则变为: V=  也就是说,电桥输出电压的变化与各臂电阻变化率的代数和成正比。 如果四个桥臂应变片的灵敏系数相同,且 = Kε,则上式又可写成: V= ε1 - ε2 + ε3 - ε4 ) 式中K为应变片灵敏系数,ε为应变量。 上式表明,电桥的输出电压和四个轿臂的应变片所感受的应变量的代数和成正比。在电阻应变式称重传感器中,4个应变片分别贴在弹性梁的4个敏感部位,传感器受力作用后发生变形。在力的作用下,R1、R3被拉伸,阻值增大,△R1、△R3正值,R2、R4被压缩,阻值减小,△R2、△R4为负值。再加之应变片阻值变化的绝对值相同,即 △R1 = △R3 = + △R或ε1 = ε3 = +ε △R2 = △R4= - △R或ε2 = ε4 = - ε 因此,V= ×4ε = e Kε。若考虑 Rm,则电桥的输出电压变成: V=  = = K εe 令SU = ,则SU = K ε SU称为传感器系数或传感器输出灵敏度。 对于一个高精度的应变传感器来说,仅仅靠4个应变片组成桥式测量电路还是远远不够的。由于弹性梁材料金相组织的不均匀性及热处理工艺、应变片性能及粘贴工艺、温度变化等因素的影响,传感器势必产生一定的误差。为了减少传感器随温度变化产生的误差,提高其精度和稳定性,需要在桥路两端和桥臂中串入一些补偿元件。如:初始不平衡值的补偿、零载输出温度补偿、输出灵敏度温度补偿等。 第二章 系统总体设计
2.1 电子秤设计的要求- 称重范围:不超过9.999Kg
- 测量精度:≤ 0.005Kg
- 显示方式:LCD显示所称量的物品重量,同时还可显示物品的名称,数量,单价,金额和所有物品的总金额。
- 使用操作:键盘输入数据,操作简单方便。
- 特殊功能:具有去皮功能以及能将金额累加计算;当物品重量超过电子秤量程,即过载情况或者是物品重量小于A/D转换器所能转换的最小精度,即欠量程的时候,具有超重报警功能。
2.2电子秤设计的基本思路 将电子秤大致能划分为三大部分,数据采集模块、控制器模块和人机交互界面模块。其中数据采集模块由压力传感器、信号的前级处理和A/D转换部分组成。转换后的数字信号送给控制器处理,由控制器完成对该数字量的处理,驱动显示模块完成人机间的信息交换。此外添加了一个过载、欠量报警提示的特殊功能。 如图2-1(上图为本系统的设计图) 2.3单片机的选型AT89S52单片机是AT89S系列中的增强型高档机产品,它片内存储器容量是AT89S51的一倍,即片内8KB的Flash程序存储器和256B的RAM。另外,它还增加了一个功能极强的、具有独特应用的16位定时/计数器2等多种功能。在工程应用中AT89S52有一显著的优势:不需要烧写器,只借助PC 机的并口输出和极为简单的下载电路,便可将程序通过串行方式写入单片机。并且下载电路可设计在系统中,可以随时修改单片机的软件而不对硬件做任何改动。 由此,通过对目前主流型号的比较,我们最终选择了AT89S52通用的普通单片机来实现系统设计。AT89S52是一种兼容MCS51微控制器,工作电压4.0V到5.5V,全静态时钟0 Hz 到33 MHz,三级程序加密,32个可编程I/O口,2/3个16位定时/计数器,6/8个中断源,全双工串行通讯口,低功耗支持Idle和Power-down模式,Power down模式支持中断唤醒, 看门狗定时器,双数据指针,上电复位标志。另外在外扩展了32K数据存储器,以满足系统要求。 2.4 A/D转换器介绍 A/D转换器是一种能把输入模拟电压或电流-成与它成正比的数字量,也就是说能把被控对象的各种模拟信息变成计算机可以识别的数字信息。A/D转换器种类较多,从原理上可分为四种:双积分式A/D转换器,逐次逼近式A/D转换器、并行A/D转换器、计数器式A/D转换器及△-∑型A/D转换器。在电子秤的设计中用的比较多的是双积分式A/D转换器和△-∑型A/D转换器。 双积分ADC的基本原理是对输入模拟电压和参考电压分别进行两次积分,将输入电压平均值变成与之成正比的时间间隔,然后利用时钟脉冲和计数器测出此时间间隔,进而得到相应的数字量输出。如图2-6所示是电子秤中常用的双积分式A/D转换电路,它由积分器、比较器、模拟电子开关,积分电阻、积分电容、自动回零电阻、电容组成。其中VG是模拟地,VFR是基准电压(相对于VG为负值),VX是检测电压。 如图2-6 双积分A/D转换电路 其次双积分型A/D转换器具有很强的抗干扰能力。对正负对称的工频干扰信号积分为零,所以对50HZ的工频干扰抑制能力特强,对高于工频干扰(例如噪声电压)也具有良好的滤波作用。只要干扰电压的平均值为零,对输出就不产生影响。尤其对本系统,缓慢变化的压力信号,很容易受到工频信号的影响。故而采用双积分型A/D转换器可大大降低对滤波电路的要求。 作为电子秤,系统对AD的转换速度要求并不高,精度上14位的AD足以满足要求。另外双积分型A/D转换器较强的抗干扰能力,和精确的差分输入,低廉的价格。最终选择了精度为10Kg/ 20000= 0.5g的ICL7135。 2.5键盘输入键盘输入是人机交互界面中重要的组成部分,它是系统接受用户指令的直接途径。键盘是由若干个按键开关组成,键的多少根据单片机应用系统的用途而定。键盘由许多键组成,每一个键相当于一个机械开关触点,当键按下时,触点闭合,当键松开时,触点断开。单片机接收到按键的触点信号后作相应的功能处理。因此,相对于单片机系统来说键盘接口信号是输入信号。 ZLG7289是周立功单片机公司设计的串行输入输出可编程键盘显示芯片,有强大的键盘显示功能,支持64键控制,可以比较方便地扩展系统。另外ZLG7289内部有译码电路,大大简化了程序。最终选择ZLG7289作为键盘扫描显示芯片。 2.6输出显示采用可以设置显示单价,金额,中文,购物日期等的LCD,它具有低功耗、可视面大、画面友好及抗干扰能力强等功能,其显示技术已得到广泛应用。 LCD 显示器的工作原理:液晶显示器的主要材料是液态晶体。它在特定的温度范围内,既具有液体的流动性,又具有晶体的某些光学特性,其透明度和颜色随电场、磁场、光照度等外界条件变化而变化。因此,用液晶做成显示器件,就可以把上诉外界条件的变化反映出来从而形成现实的效果。 虽然ZLG7289具有控制数码管显示的功能,但考虑到本题目要求中文显示,数码管无法满足,只能考虑用带有中文字库的液晶显示器。由于可以分页显示,无需太大屏幕,最终选择点阵式128×64型LCD—OCM4x8C。 : 第三章 硬件设计与制作 3.2主控电路的设计P1口和P2.0~P2.6口作为地址总线,其中P1口作为低地址线和数据总线复用,P2.0~P2.6口做高地址线。P2.7作为62256的片选控制总线,ALE接锁存器74LS373的使能端。P3.6和P3.7作为外部数据存储器写/读选通信号输出端分别接62256的/WE和/OE端。 主控电路图如下: 如图3-2 主控电路设计图 3.3信号处理电路 以下为滤波放大电路图: 如图3-3 信号滤波放大图 上图中电容C5、C6用来滤除采样信号电压中的高频噪声,选用0.1uF的普通独石电容;电容C7、C84用来滤除采样信号电压中的低频噪声,选用22uF的普通独石电容。电阻R3、R4选用较小的阻值,因为采样信号电压值只有毫伏级,所以其阻值不宜太大,否则导致放大器由于输入电流太小而放大效果不明显。 微弱信号Vi1和Vi2被分别放大后从AD620的第6脚输出。A/D转换器ICL7135的输入电压变化范围是-2V~+2V,传感器的输出电压信号在0~20mv左右,因此放大器的放大倍数在200~300左右,可将R9接成1K的滑动变阻器。由于ICL7135对高频干扰不敏感,所以滤波电路主要针对工频及其低次谐波引入的干扰。因为压力信号变化十分缓慢,所以滤波电路可以把频率做得很低。 图中的LM741的输出端与AD620的地端相连,LM741的2脚与6脚相连构成电压跟随器,R15与正负电源相接,通过改变R15的阻值可使VO与 RET之间的压差变化,从而实现调零、去皮的功能。 ICL7135与单片机的接口 在读取A/D转换后的结果时,选用数据选择器作为数据读取的控制器,这样简化了ICL7135与单片机的接口电路,便于硬件设计与软件编程的实现。 在ICL7135进行A/D转换结束后输出的/STRB负脉冲引起AT89S52中断。同时在第一个/STB负脉冲时由软件将P1.7口置0,因而使S=0,使74LS157的Y (1Y,2Y,3Y,4Y)=A(4A,3A,2A,1A)。AT89S52读P1.0~P1.3口便读得BCD码,此时D5=1。此后, D4,D3,D2,D1轮流为“1”,即可读得千位、百位、十位和个位的BCD码。 前端信号处理电路设计如下图: 如图3-4 信号数模转换图 ICL7135的输出时序图: 如图3-5 输出时序图 在A/D转换结束后立即更新输出锁存器并不断地扫描输出BCD码。在A/D转换期间BUSY为低电平,转换完毕后BUSY变为高电平。A/D转换结束后立刻顺序并连续不断地输出位驱动信号D5、D4、D3、D2、D1(均为正脉冲)。当D5为高电平时,B8、B4、B2、B1是万位BCD码。同样当D4为高电平时,B8、B4、B2、B1是千位BCD码。同理D3、D2、D1 为正脉冲时各对应百、十、个位的BCD码。在A/D转换完毕后,还连续输出5个/STB负脉冲,它们分别位于D5、D4、D3、D2、D1正脉冲的中间,脉冲宽度为T/2。 在设计时,还考虑过使用另一种接口电路,它巧妙地运用了ICL7135 地“Busy”端功能,只要一个I/O口和单片机内部的一个定时器就可把ICL7135的数据送人单片机,可以节省大量的单片机资源,减小系统的体积。原理如下: “Busy”输出端(ICL7135的21脚)高电平的宽度等于积分和反积分时间之和。ICL7135内部规定积分时间固定为10001个时钟脉冲时间,反积分时间长度与被测电压的大小成比例。如果利用单片机内部的计数器对ICL7135的时钟脉冲计数,利用"Busy"作为计数器门控信号,控制计数器只要在Busy为高电平时计数,将这段Busy高电平时间内计数器计的内容减去10001,其余数等于被测电压的数值。 3.3人机交互界面模块设计3.3.1键盘输入控制电路如表3-2 ZLG7289引脚说明 | | | | | | | | | | | | | | 片选输入端此引脚为低电平时可向芯片发送指令及读取键盘数据 | | | 同步时钟输入端向芯片发送数据及读取键盘数据时此引脚电平上升沿表示数据有效 | | | 串行数据输入/输出端当芯片接收指令时此引脚为输入端当读取键盘数据时此引脚在读指令最后一个时钟的下降沿变为输出端 | | | 按键有效输出端平时为高电平当检测到有效按键时此引脚变为低电平 | | | | | | | | | | | | | | | | | | |
SPI串行接口工作方式介绍: ZLG7289 采用串行方式与微处理器通讯,串行数据从DATA 引脚送入芯片,并由CLK 端同步。当片选信号变为低电平后,DATA 引脚上的数据在CLK 引脚的上升沿被写入ZLG7289 的缓冲寄存器。 ZLG7289 的指令结构有三种类型: 1、不带数据的纯指令,指令的宽度为8 个BIT 即微处理器需发送8个CLK 脉冲; 如图3-6 纯指令时序图 2、带有数据的指令宽度为16 个BIT 即微处理器需发送16 个CLK 脉冲; 如图3-7 带数据指令时序图 3、读取键盘数据指令宽度为16个BIT,前8个为微处理器发送到ZLG7289的指令,后8 个BIT为ZLG7289返回的键盘代码,执行此指令时ZLG7289的DATA端在第9个CLK 脉冲的上升沿变为输出状态并与第16个脉冲的下降沿恢复为输入状态,等待接收下一个指令。 图3-8 读键盘指令时序图 下图为电路图: 图3-9 键盘接口图 图中P1.5口接/CS;P1.6口接CLK;P1.0口接DIO;P3.2口接/KEY,利用中断0通知AT89S52读数。 键盘控制芯片ZLG7289 控制键盘的扫描,当监测到有键按下后ZLG7289 的9脚便产生一个低电平通知单片机,单片机可以采用查询或者中断方式将数据通过P3.0口以串行方式读入。因为查询方式会浪费大量的时间,所以本系统采用的是中断方式。 2、 参数选择参考如下 8只下拉电阻和8 只键盘连接位选线DIG0~DIG7 的8 只位选电阻应遵从一定的比例关系,下拉电阻应大于位选电阻的5 倍而小于其50 倍,典型值为10 倍,下拉电阻的取值范围是10K~100K, 位选电阻的取值范围是1K~10K。所以取上拉电阻为10K,下拉电阻为100K。 ZLG7289需要一外接晶体振荡电路供系统工作,其典型值分别为F=16MHz C=15pF。实际使用时取F=12MHz,C=15pF。 3.3.2 LCD显示电路OCM4x8C是具有串/并接口,其内部含有中文字库的图形点阵液晶显示模块。该模块的控制/驱动器采用台湾矽创电子公司的ST7920,因而具有较强的控制显示功能。OCM4x8C的液晶显示屏为128×64点阵,可显示4行、每行8个汉字。为了便于简单、方便地显示汉字,该模块具2Mb的中文字型CGROM,该字型ROM中含有8192个16×16点阵中文字库;同时,为了便于英文和其它常用字符的显示,具有16Kb的16×8点阵的ASCII字符库;为便于构造用户图形,提供了一个64×256点阵的GDRAM绘图区域,且为了便于构造用户所需字型,提供了4组16×16点阵的造字空间。利用上述功能,OCM4x8C可实现汉字、ASCII码、点阵图形、自造字体的同屏显示。为便于和多种微处理器、单片机接口,模块提供了4位并行、8位并行、2线串行、3线串行多种接口方式。 该模块具有2.7V~5.5V的宽工作电压范围,且具有睡眠、正常及低功耗工作模式,可满足系统各种工作电压及便携式仪器低功耗的要求。液晶模块显示负电压,也由模块提供,从而简化了系统电源设计。模块同时还提供LED背光显示功能。除此之外,模块还提供了画面清除、游标显示/隐藏、游标归位、显示打开/关闭、显示字符闪烁、游标移位、显示移位、垂直画面旋转、反白显示、液晶睡眠/唤醒、关闭显示等操作指令。 如表3-3引脚功能说明 电路图中PSB接低电平,进入串行接口模式;串行数据线SID接P3.1口;串行时钟线SCLK接P1.6;RS固定接高电平。此为典型二线串行模式。 字符显示RAM地址与字符显示位置关系: 如表3-4 RAM地址与字符显示位置关系 2/3线串行接口方式: 当模块的PSB脚接低电平时,模块即进入串行接口模式。串行模式使用串行数据线SID与串行时钟线SCLK来传送数据,即构成2线串行模式。 OCM4x8C还允许同时接入多个液晶显示模块以完成多路信息显示功能。此时,要利用片选端“CS”构成3线串行接口方式,当“CS”接高电位时,模块可正常接收并显示数据,否则模块显示将被禁止。通常情况下,当系统仅使用一个液晶显示模块时,“CS”可连接固定的高电平。 模块2线串行工作操作时序如下图所示: 如图3-10 2线串行时序图 由图3.12可以看出,单片机与液晶模块之间传送1字节的数据共需24个时钟脉冲。首先,单片机要给出数据传输起始位,这里是以5个连续的“1”作数据起始位,如模块接收到连续的5个“1”,则内部传输被重置并且串行传输将被同步。紧接着,“RW”位用于选择数据的传输方向(读或写),“RS”位用于选择内部数据寄存器或指令寄存器,最后的第8位固定为“0”。在接收到起始位及“RW”和“RW”的第1个字节后,下一个字节的数据或指令将被分为2个字节来串行传送或接收。数据或指令的高4位,被放在第2个字节串行数据的高4位,其低4位则置为“0”;数据或指令的低4位被放在第3个字节的高4位,其低4位也置为“0”,如此完成一个字节指令或数据的传送。需要注意的是,当有多个数据或指令要传送时,必须要等到一个指令完成执行完毕后再传送下一个指令或数据,否则,会造成指令或数据的丢失。这是因为液晶模块内部没有发送/接收缓冲区。
3.4报警电路的设计下图为系统报警电路原理图,用于超载和欠量程提示。系统设计了两个发光二极管作为超载和欠量程指示灯,使系统更加完善。当系统判断为超载或欠量程时,ICL7135给输出一个高电平信号OR(超载)或UR(欠量程),经非门后形成低电平从而驱动发光二极管发光提示。 如图3-11 报警电路原理图 第四章 软件设计软件流程图及程序设计为了方便程序调试和提高可靠性,程序设计采用自上而下、模块化、结构化的程序设计方法,把总的编程过程逐步细分,分解成一个个功能模块,每个功能模块相互独立,每个模块都能完成一个明确的任务,实现某个具体的功能。本设计按任务模块划分的程序主要有初始化程序、主程序, A/D转换子程序、显示子程序、键盘处理子程序。 4.1初始化程序设计流程图单片机系统上电后,进入初始化程序,完成单片机片内各模块的设置和A/D转换器的功能设置初始化,然后进入主程序。 如图 4-1 初始化程序设计流程图 4.2主程序设计流程图单片机完成初始化程序后进入主程序,主程序主要完成对存储参数的读取,对检测到的数据进行数据处理,键处理,显示处理等。 <img alt="" src="http://c.51hei.com/a/huq/a/a/8/50/50.034.jpg" _height="594" border="0" width="363">[/code]
如图4-2 主程序设计流程图 4.2 主程序设计及其相关程序设计4.2.1程序清单
- uint max_weight;//最大称量
- uchar dsel;//分度值
- uchar dp;//小数点
-
- float beilv;//倍率
- ulong zero_save;//传感器零位值
- }bdf;
-
- uint code num_ten[4]={1,10,100,1000};
- uchar code adcount2[4]={2,4,5};//数据处理进平均次数
-
- uchar code tab_dsel[4]={1,2,5,10};//分度值表
- //0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
- uchar code tab[]={0xB7,0x03,0xD6,0xC7,0x63,0xE5,0xF5,0x83,0xF7,0xE7,
-
- //A , b , C , d , E , F , 暗, - , t , P
- 0xF3,0x75,0xB4,0x57,0xF4,0xF0,0x00,0x40,0x74,0xF2,
-
- //H , L , o , J , r , n , U, =, - i
- 0x73,0x34,0x55,0x07,0x50,0x51,0x37,0x44,0x04,0x01};
- //显示位码表
-
- //0, 1, 2, 3, 4, 5, 6
- uchar code digit[]={0xfe,0xdf,0xef,0xfd,0xfb,0xbf,0xF7};//显示位码表
-
- sbit P_OE =P2^1;//显示控制
- sbit P_LE =P2^0;
-
- sbit buz0 =P3^6;//蜂鸣器
- sbit buz1 =P3^7;
- /******************************************************/
- bit b_follow;//启动零位跟踪标记
- bit b_serial;//串口发送完标记
- bit b_followdelay;//第一次不进行零位跟踪
- bit b_steady;//稳定标记
- /******************************************************/
- void (* data task)(void);//函数指针变量,接受下一步要做的任务
-
- uint idata fendushu;//分度数
-
- uchar weight_led[6] ;//重量窗显示缓存
- uchar idata temp_var;
- uchar weight_dp;//小数点位数
- uchar fu_number;//负号显示位置
- uchar wdcount;//稳定计数
- uchar adup_count;//异常值计数
- uchar addcount3;//累加次数
- /******************************************************/
- extern void key_scan(void);//按键扫描
- extern void weight_disp(void);//重量计算,超载报警
- extern void start_set(void);//单片机初始化设置
- extern void adc (void);//读取AD值
- extern void ad_processor(void);//AD数据滤波处理
- extern void fun_weight(void);//正常称重状态
- extern void bd_start(void);//重量或电压标定选择
- extern void dy_disp(void);//电压显示
- extern void led_disp(ulong temp,uchar num);
- extern uchar get_jiaoyan(uchar *address,uchar num);//计算校验字
- extern void neima(void);
-
- void delay60ms(uchar time);//40ms延时
- void fendu_val(void);//分度数运算
- void check_canshu(void);//读参数,并校验是否正确
- void ver_disp(void);//显示版本号
- void seg_check(void);//笔画检测
- /******************************************/
- void main (void)
- {
-
- start_set(); //单片机初始化
- beep_time=3; //开机鸣叫
- flash_num=6; //没有闪烁位
- spi_sys(); //ad芯片初始化
- check_canshu(); //读参数,并校验是否正确
- if(bdf.shuduval>2) //若是异常值,用默认值
- bdf.shuduval=1;
- addcount3=4;
- bdf_dp_temp=bdf.dp; //保存小数点(标定修改参数时用)
- bdf_dsel_temp=bdf.dsel;//保存分度值(标定修改参数时用)
- key_scan(); //标定按键扫描
-
- switch(key_temp) //功能键处理函数
- {
- case 0xc0:b_biaoding=1;task=bd_start ; break;//
-
- default:
- bdf.dp=0;
- ver_disp();//显示版本号
- seg_check();//笔画检测
- fendu_val();//分度数运算
- zero_current=ad_steady;//保存当前零位值
- task=fun_weight;
- break;
- }
-
- do
- { //主循环程序
- adc(); //A/D采样
- ad_processor();//数据处理
- zero_follow(); //零位跟踪程序
- neima(); //内码计算
- weight_disp(); //重量显示
- key_scan(); //按键扫描
- (* task)(); //任务切换函数
-
- }
- while(1);
-
-
-
- }
- /*****************************************************************/
- void fendu_val(void)//分度数运算
-
- { uchar i;
- ulong temp;
-
- temp=(ulong)bdf.max_weight*num_ten[bdf_dp_temp];
- fendushu=temp/bdf.dsel;
-
- i=fendushu/3000;
- if (i==0)
- i=1;
- half_sel_bound=5/bdf.beilv;//半个分度的原始码
- follow_bound=i*half_sel_bound;//计算零位跟踪时的原始码,按3000分度
- time_weight=200;
-
- }
- /*****************************************************************/
- void ver_disp(void)//显示版本号及最大量程
- {
- weight_led[0]=7;// 7
- weight_led[1]=1;// 1
- weight_led[2]=2;// 2
- weight_led[3]=17;// -
- weight_led[4]=0;// 0
- weight_led[5]=5;// 5
- fun_led=0xff;
- delay60ms(15);//40ms延时
- beep_time=3;
- led_disp(bdf.max_weight,5);//显示最大量程
- weight_led[0]=15;// F
- delay60ms(20);//40ms延时
复制代码
4.2信号采样与A/D转换子程序的设计
如图 4-3 信号采样与A/D转换子程序的设计
4.3 键盘/显示子程序设计 如图 4-4 键盘/显示子程序设计 如图 4-5 按键扫描流程图 - extern bit b_keyok;//有按键产生标记
- extern bit b_longdown;//长按下标记
- extern uchar key_num;//键值
- extern uchar key_temp;//临时键值
- extern uchar key_count;//键长按计数
- extern uchar key_dly;//键去抖动延时
- extern uchar beep_time;//蜂鸣时间
- void key_scan1();////按键松开或没有按下处理
- /****************************************************/
- oid disp_t1(void) interrupt 3 using 1//显示中断程序
- {
- uchar temp;
- TR1 =0;
- P_OE=1;//高阻态,禁止输出
- if((disp_number==(5-bdf.dp))&(bdf.dp!=0))//这一位是否有小数点
- temp=0x08;//小数点段码
- else
- temp=0;
- if(disp_number==6)//指示灯显示不用查表
- P0=fun_led;//
- else
- {
- if((disp_number==fu_number)&&b_fuhao)
- temp=temp|0x40;
-
- if((disp_number==flash_num)&b_flash)//是否有闪烁位
- P0=0x0;
- else
- P0=tab[weight_led[disp_number]]|temp;//查表取段码
- }
- P_LE=1;
- P_LE=0;//573锁存段码
- P0=digit[disp_number];//送位码
- P_OE=0;//573输出有效
- disp_number++;
- if(disp_number==7)//是否显示最后一位
- {
- disp_number=0;
- if(beep_time)//是否要鸣叫
- {
- if(!TR0)
- {buz0=~buz1;TR0 =1;}
- beep_time--;
- }
- else
- {TR0=0;buz0=1;buz1=1;}//不鸣叫时置高,减小电流
- if(key_dly)//按键去抖动延时
- key_dly--;
- if(flash_num<6)
- {
- if(flash_time)//闪烁计时
- flash_time--;
- else
- { b_flash=!b_flash;flash_time=20;}//时间到,置闪烁标记
- }
- }
- TH1 =0xf8;
- TL1 =0x18;
- TR1 =1 ;
- }
复制代码
完整的Word格式文档51黑下载地址:
基于51单片机的电子秤的设计.doc
(1.22 MB, 下载次数: 223)
|