创新设计总报告

时间:2024.4.21

摘 要

现代社会的发展,对称重技术提出更高要求。目前,台式电子秤在商业贸易 中的使用已经相当的普遍,但存在较大的局限性。体积大,成本高、携带不方便、 应用场所受到限制等。多年来,人们一直期待测量准确、携带方便、将低廉的便 携式电子秤投放市场。

本文设计了一种新型便携式高精度电子秤,论述了电子秤的工作原理,给出 了电子称的硬件设计和软件设计以及电子秤的抗干扰设计与系统调试部分。便携式电子秤主要由电源、称重传感器、单片机、键盘/开关、LCD显示器等部分构成。主要技术指标为0?9.999Kg;重量误差不大于±0.005Kg。电子秤的技术指标参考了同前国内市场上最权威的电子衡器技术指标,其合理性无疑加大了产品投放市场后的竞争能力。仪器主要功能有自检、去皮、计价、单价设定等。电子秤若不进行称量操作时,5分钟后将自动进入休眠模式,降低电源消耗。新型便携式高精度电子称体积小、计量准确、携带方便、操作简单、称量速度快、并集质量称量功能与价格计算功能于一体,能够满足商业贸易和居民家庭的使用需求,具有广阔的应用前景。

关键词:单片机AT89C52;称重传感器;A/D转换器

第1章绪论

1.1引言

质量是测量领域中的一个重要后来,又釆用简单的秤来测定质量。据考证,世界上最古老的计量器出于中东和埃及,最古老的衡器和砝码出自于埃及。秤是最普遍、敁普及的计量设备,电子秤取代参数,称重技术自古以来就被人们重视。公元前,人们为了对货物交换量进行估计,最初釆用木材或陶土制作的容器对交换货物进行计算。机械秤是科学发展的必然规律。低成本、高智能化的电子秤无疑具有极其广阔的市场前景。

21世纪,电子产品变得越来越丰富,给人们带来非常非常多方便,其中电子秤成了人们生活中必不可少的一部分。市场上大大小小的电子秤能够完成许多 工作,为人们节省了时间,提高了工作效率。

在超市里的一台电子秤,它能非常精确的称出商品的重量,还能去除皮重, 更主要的是,它其中预存了超市里商品的单价,当称出商品的重量后,电子秤马上就能算出其价格,不管几种商品都能一一累加,然后列出清单,可以说非常智能化,而且非常精确。由此,顾客在购物的时候非常的放心,商家的效益也提高了,所以有了电子秤,顾客买的放心,商家也卖的开心了。

1.2选题背景与意义

称重技术自古以来就被人们所重视,作为一种计量手段,广泛应用于工农业、 科研、交通、内外贸易等各个领域,与人民的生活紧密相连。电子秤是电子衡器 中的一种,衡器是国家家法定计量器具,是国计民生、国防建设、科学硏究、内外 贸易不可缺少的计量设备,衡器产品技术水平的高低,将直接影响各行各业的现 代化水平和社会经济效益的提高。因此,称重技术的硏究和衡器工业的发展各国 都非常重视。

电子秤属于电子衡器的一种,它的发展也遵循这一趋势。随着时代科技的迅 猛发展,微电子学和计算机等现代电子技术的成就给传统的电子测量与仪器带来 了巨大的冲市和革命性的影响。常规的测试仪器仪表和控制装置被更先进的新型 便携式高精度仪器所取代,使得传统的电子测量仪器在远距离、功能、精度及自 动化水平定方面发生了巨大变化,并相应的出现了各种各样的智能仪器控制系统,使得科学实验和应用工程的自动化程度得以显著提高。

做为重量测量仪器,新型便携式高精度电子秤在各行各业开始显现其计量准 确、体积小、携带方便等优点,还具有开机自检、休眠节电的功能,并开始逐渐 取代传统型的机械杠杆测量称,成为测量领域的主流产品。

1.3电子秤研究现状

1.3. 1应用范围

新型便携式高精度电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。是自动化称重控制和贸易计量的重要手段,对加强企业管理、严格生产、贸易结算、交通运输、港口计量和科学研究都起到了重要作用,它与我们日常生活紧密结合成为一种方便、快捷、称量精确的工具,广泛应用于商业、工厂生厂、集贸市场、超市、大型商场、及零售业 等公共场所的信总显示和重量计算。

1.3. 2影响因素

随着科技的进步,对电子秤的要求也越来越高。影响其精度的因素主要有:机械结构、传感器和数显仪表。在机械结构方面,因材料结构强度和刚度的限制, 会使力的传递出现误差,而传感器输出特性存在非线性,加上信号放大、模数转 换等环节存在的非线性,使得整个系统的非线性误差变得不容忽视。因此,在高精度的称重场合,迫切需要电子秤能在线自动校正系统的非线性。

1.3. 3发展趋势

衡器行业的主管部门提出了“上品种、上质量、上档次、上效益”的电子衡器发展方向,并要求到20##年基本达到国际先进水平。通过分析近年来电子衡 器产品的发展情况及国内外市场的需求,电子衡器总的发展趋势是小型化、模块 化、集成化、智能化;其技术性能趋向是速率高、准确度高、稳定性高、可靠性 高;其功能趋向是称重计量的控制信总和非控制信总并重的“智能化”功能;其 应用性能趋向于综合性和组合性。

(1)小型化

体积小、高度低、重量轻,即小、薄、轻。近几年新研制的电子平台秤结构充分体现了小薄轻的发展方向。对于低容量的电子平台秤和电子轮轴秤,可采用 将薄型或超薄型的圆形称重传感器,直接嵌入钢板或铝板底面与称重传感器外径 相同的盲孔内,形成低外形的秤体结构,称重传感器的数量和位置由秤的额定载 荷和力学要求计算决定。钢板或铝板就是秤体的台面,称重传感器既是传感元件, 又是承力支点,极大地减化了秤体结构,减少了活动连接环节,不但降低了成本, 而且提高了稳定性和可靠性。对中等或较大容量的电子平台秤、电子地上衡,已 经出现了采用方形或长方形闭合截面的薄壁型钢,并联排队列焊接成一个整体的 竹排式结构的秤体,4个称重传感器分别安装在S外边两根薄壁型钢两端的切口 内,安装在称重传感器承力点上的同定支承就是秤体的承力支点,既减化了承力 传力机构,又节省了秤体高度,这是一种很有发展前途的秤体结构。对于大型电 子平台秤,可利用有限单元法进行等强度和刚度计算,釆用抗弯刚度大的型材和 轻型波纹夹心钢板等。

(2)模块化                                            

对于大型或超大型的承载器结构,如大型静动态电子汽车衡等,已开始釆用 几种长度的标准结构的模块,经过分体组合,而产生新的品种和规格。以(5、6、 7) m长的同宽度3种标准模块为例,由单块、二块、三块到四块分体组合,可以组合成长度为(5?28) m的22种规格的分体式秤体结构。当然在实际应用中, 根据各行业用户的需要,选择其中10余种常用的标准规格即可。这种模块化的 分体式秤体结构,不但提高了产品的通用性、互换性和可靠性,而且也大大地提 高了生产效率和产品质量。冋时还降低了成本,增强了企业的市场竞争能力。

(3)集成化

对于某些品种和结构的电子衡器,例如小型电子平台秤、专用秤、便携式静动态电子轮轴秤、静动态电子轨道衡等,都可以实现秤体与称重传感器"钢轨与 称重传感器,轨道衡秤体与铁路线路一体化。

如秤体与称重传感器一体化的便携式静动态电子轮轴秤,多用硬铝合金厚板 制成。其结构原理是经过固溶热处理强化的铝合金板,或通过在4个角上钻孔和 铣槽分别形成4个悬臂梁型称重传感器;或在铝合金板的底面铣出多个对称的肓 孔和盲槽形成整体剪切梁型称重传感器。这就使得秤体称重传感器合二为一, 即铝合金板既是秤体台面又是一个大板式称重传感器。以后齐结构的lot便携式 动态电子轮轴秤为例,其尺寸为720mmX550mmX32mm,重量约为23kg。

(4)智能化

电子衡器的称重显示控制器与电子计算机组合,利用电子计算机的智能来增加称重显示控制器的功能。使电子衡器在原有功能的基础上,增加推理、判断、 自诊断、自适应、自组织等功能。这就是如今市场上釆用微机化称重显示控制器 的电子衡器与釆用智能化称重显示控制器的电子衡器的根本区别。

(5)综合性

电子称重技术的发展规律就是不断的加强基础研究并扩大应用,扩展新技术 领域,向相邻学科和行业渗透,综合各种技术去解决称重计量、自动控制、信息 处理等问题。例如在流量计量专业,如果按照传统的理论和方法建造一卷标准大 流量测系统,价格相当昂贵。如果釆用称重法即质量流量法,只要将重量和时间测量准确,大流量的测量问题就迎刃而解了。对某些商卬电子计价秤而言,只具备称重、计价、显示、打印功能还远远不够,现代商业系统还要求它能提供各种销售信总,把称重与管理自动化紧密结合,使称重、计价、进库、销售管理一体化,实现管理自动化。这就要求电子计价秤能、电子计算机联网,把称重系统和计算机系统组成一个完整的综合控制系统。

(6)组合性

在工业称重计量过程或工艺流程中,不少称重计量系统还要求具有可组合性,即测量范围等可以任意设定;硬件能够依据一定的工作条件和环境作某些调整,硬件功能向软件方向发展;软件能按一定的程序进行修改和扩展;输入输出数据与指令可以使用不同的语言和条形码,并能与外部的控制和数据处理设备进行通信。

我国的电子衡器要打入国际市场,参与国际竞争,就必须执行国际法制计量 组织制定的国际建议并要有国际水平的技术勹装备、有国际水平的质量。这就要 求企业以技术为先导、以质量为中心、以管理为基础,努力提高制造技术与制造 工艺水平,稳定产品质量,增强国际市场竞争能力。

面对与国际先进水平的差距和我国国民经济持续发展的大好形势,我们的态 度应该是明确的,就是要从观念上、技术上和管理上迅速赶上,与时俱进、迎接挑战、开拓创新。以提高制造技术的制造工艺水平为突破口,主要解决电子衡器中的工程化产品的定型设计,生产工艺,质量保证,可靠性考核等规模生产中的关键技术与工艺,提高批量生产能力,使我国的民族衡器工业走上健康持续发展的轨道。

二、系统方案设计

新型便携式髙精度电子秤的应用系统由硬件和软件组成。硬件是指单片机、 存储器、釆集电路、输入输出设备等部分;软件是各个系统工作程序的总称。软 件设计是以硬件设计为前提的,而硬件设计之初就应该考虑相应软件的设计方法,只有硬件设计和软件设计紧密配合、协调一致,才能最大化的提髙系统的稳定性、精确性以及性价比。

2. 1性能及技术要求

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

(2)重量显示:单位为公斤;最大称重为9.999公斤,重量误差不大0.005公斤;

(3)单价金额及总价金额显示:单价金额和总价金额的单位为元,最大接数值为9999.99元,总价金额误差不大于0.01元;

(4)具有去皮功能和总额累加计算功能;

2. 2系统总体设计方案 2. 2. 1设计基本思路

按照设计的基本要求,系统可分为单片机控制模块、信号釆集模块、输入输出模块四大模块。其中信号采集模块由电阻应变片式传感器、信号的前级处理和髙精度A/D转换部分组成,包括运算放大器和A/D转换器;转换后的数字信号送给控制器处理,由控制器完成对该数字量的处理;输入输出电路为键盘输入和液晶显示,可以方便的输入数据和直观的显示中文。输入输出部分对软件的设计要求比较髙,系统的大部分功能都需要软件来控制。软件部分应用单片机C 语言进行编程,实现了该设计的全部控制功能。

2.2.2系统总体方案设计与论证

在设计系统时,针对各个模块实现的功能来设计电子秤的方案如下:

前端信号处理时,选用放大、A/D转换等措施,尤其在显示方面釆用具有字符图文显示功能的LCD显示器。这种方案不仅加强了人机交互的能力,而且满足设计要求,可以显示购物清单、所称量的物体总价等相关内容。 结构简图如下图所示:

图2. 1 LCD显示的方案

目前单片机技术比较成熟,功能也比较强大,被测信号经放大整形后送入单 片机,由单片机对测量信号进行处理并根据相应的数据关系译码显示出被测物体 的重量。由于系统需要的输入输出较多,因此要加一个I/O扩展芯片(8255)。单片机控制适合于功能比较简单的控制系统,而且其具有成本低,功耗低,体积小 算术运算功能强,技术成熟等优点。但其缺点是外接电路比较复杂,编程复杂。

2. 3系统工作原理

根据新型便携式高精度电子秤的性能及技术要求,选择AT89S51RD2单片机为核心,组成称量系统。系统主要有AT89S51RD2单片机、A/D转换器、键盘扫描电路、显示电路、传感器、放大电路等组成。

本文研究的新型便携式高精度电子秤采用箔式应变片传感器。箔式应变片传感器式电阻应变片的一种。箔式应变片的敏感栅是采用光刻技术的一种很薄的金属箔栅。根据不同的测量要求,可以制成不同形状的敏感栅,亦可在同一应变片上制成不同数目的敏感栅。箔式应变片具有散热条件好、允许电流大、横向效应小、疲劳寿命长、生产过程简单、适于批量生产等优点,已经取代丝式应变片而得到了广泛的应用。它的电容量 很小,仅几十至几百皮法。

                     系统方框图

电阻应变片的测量原理为:金属丝的电阻值除了与材料的性质有关之外,还与金属丝的长度,横截面积有关。将金属丝粘贴在构件上,当构件受力变形时,金属丝的长度和横截面积也随着构件一起变化,进而发生电阻变化。dR/R=Ks*ε其中,Ks为材料的灵敏系数,其物理意义时单位应变的电阻变化率,标志着该类丝材电阻应变片效应显著与否。ε为测点处应变,为无量纲的量,但习惯上仍给以单位微应变,常用符号με表示。由此可知,金属丝在产生应变效应时,应变ε与电阻变化率dR/R成线性关系,这就是利用金属应变片来测量构件应变的理论基础。

电阻式应变片可作为一种质量-电量的转换元件,是基于金属丝在受拉或受压会发生弹性形变这一物理特性实现的。当电阻式应变片内部金属丝收到外力作用发生形变时,它的长度,横截面及电阻率均会发生变化。本次设计中采用半桥式测量电路,在钢制的弹性体的正反两面分别贴上应变片,当弹性体受外力作用时发生弹性形变,粘在其上的电阻式应变片随之发生形变,因此改变了他们的电阻值。由于电阻式应变片组成的桥式电路是平衡的,电阻式应变片阻值的变化会引起电桥的不平衡,从而输出电压信号,该信号与物体的质量成正比。

电子秤设计中,为了消除外界干扰,要经过信号调理电路进行信号的滤波

并经放大电路处理后再经髙精度A/D转换器 转换成数字信号再传至单片机控制系统。单片机由设定程序,计算出被测物体的质量。测量结果传送至LCD显示,从而实现高精度测量。

首先通过传感器釆集到被测物体的重量并将其转换成电压信号。输出电压信 号通常很小,需要通过前端信号处理电路进行准确的线性放大。放大后的模拟电 压信号经A/D转换电路转换成数字信号被送入到主控电路的单片机中,由单片机对测量信号进行处理并根据相应的数据关系译码显示出被测物体的重量。单片机控制适合于功能比较简单的控制系统,而且其具有成本低,功耗低,体积小,算术运算功能强,技术成熟等优点。

第三章硬件设计

根据设计要求以及系统所需要实现的功能,在设计系统时可分为以下几部 分:单片机控制系统、信号釆集模块、输入输出设备、模数转换接口电路等部分组成。

3.1单片机的控制系统

3.1.1AT89S51芯片介绍

AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。

主要性能特点:

1、4k Bytes Flash片内程序存储器;   

2、128 bytes的随机存取数据存储器(RAM);   

3、32个外部双向输入/输出(I/O)口;   

4、5个中断优先级、2层中断嵌套中断;   5、6个中断源;   

6、2个16位可编程定时器/计数器;   

7、2个全双工串行通信口;   

8、看门狗(WDT)电路;   

9、片内振荡器和时钟电路;   

10、与MCS-51兼容;   

11、全静态工作:0Hz-33MHz;   

12、三级程序存储器保密锁定;   

13、可编程串行通道;   

14、低功耗的闲置和掉电模式。

管脚说明

VCC:电源电压输入端。   

GND:电源地。   、

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。   

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。   、

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口除了作为普通I/O口,还有第二功能:

P3.0 RXD(串行输入口)

P3.1 TXD(串行输出口)

P3.2 /INT0(外部中断0)

P3.3 /INT1(外部中断1)

P3.4 T0(T0定时器的外部计数输入)

P3.5 T1(T1定时器的外部计数输入)

P3.6 /WR(外部数据存储器的写选通

P3.7 /RD(外部数据存储器的读选通

P3口同时为闪烁编程和编程校验接收一些控制信号。  

I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。只有读端口时才真正地把外部的数据读入到内部总线。89C51的P0、P1、P2、P3口作为输入时都是准双向口。除了P1口外P0、P2、P3口都还有其他的功能。   

RST:复位输入端,高电平有效。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。  

AT89C51RB2管脚图

ALE/PROG:地址锁存允许/编程脉冲信号端。当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

 PSEN:外部程序存储器的选通信号,低电平有效。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。   

EA/VPP:外部程序存储器访问允许。当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。   

XTAL1:片内振荡器反相放大器和时钟发生器的输入端。   

XTAL2:片内振荡器反相放大器的输出端。

3.1.2控制电路的组成及功能

主控电路图

3.2. 1传感器的选择

本设计的压力传感器采用通用箔式应变片KFG。

特点:弯曲性优异,防水抗湿度性强,若不直接接触水时,不需要进行表面涂层处理。所有型号都可以根据要求带有或不带有引线。

性能

工作温度范围:-196~+120℃(当与CC-33A粘结时)、-196~十150℃(PC-6)。

常温下自温度补偿:士1.0x10-6应变/℃的高性能、变形极限5%。

敏感栅长度: 5mm

应变片类型:双轴、

适用线膨胀系数: 16x10-6/℃

导线的种类:聚}乙稀树脂被覆线((15cm-30m)

胶水:氰基丙烯酸盐粘结剂CC-33A

电阻: 500Ω

本设计的温度传感器选用热敏电阻。

3. 2. 2滤波放大电路

滤波放大电路阁如下所示:

信号滤波放大电路图

接收到的输出电压信号通常很小,通过前端信号处理电路进行准确的线性放 大。放大后的模拟电压信号再经A/D转换电路转换成数字量被送入到主控电路的 单片机中。本设计中选用的是-种低功耗高精度仪表放大器,仅需一个外接电阻 即可得到1?1000范围内的任意增益;±2.3V?±18V的电源电压;低功耗,最 大电源电流1.3mA,S大输入失调电压125uV,最大温度漂移luV/°C,敁大输入 偏移电流20nA;最小共模抑制比93dB (增益=10);输入电压噪声9nV (lKHz); 0. 28uV 噪声(0.1Hz?10Hz);带宽 120KHz (增益=100);建立时间 15us (0. 01%)。 AD620的增益是用电阻Rg来决定的,即用引脚1和8之间的阻抗来决定的。使 用0.1%?1%的电阻,AD620就能提供精确的增益。对G (增益)=1, Rg引脚不连接(即Rg为无穷大)。

上图中电容C9、C10用来滤除釆样信号电压中的高频噪声,选fflO.luF的普 通独石电容;电容C11、 C12用来滤除釆样信号电压中的低频噪声,选用22uF的普通独石电容。电阻R1、R2选用较小的阻值,因为釆样信号电压值只有毫伏级, 所以其阻值不宜太大,否则导致放大器由于输入电流太小而放大效果不明显

微弱信号Vil和Vi2被分别放大后从AD620的第6脚输出。A/D转换器的输入电压变化范围是-5V?+5V,传感器的输出电压信号在0?20mv左 右,因此放大器的放大倍数在200?300左右,可将RG1接成1K的滑动变阻器。

3. 3输入输出设备

3. 3. 1键盘输入

键盘输入是系统设计中一个重要的组成部分,它是系统接受用户指令的直接 途径。键盘是由若干个按键开关组成,按键多少根据单片机应用系统的用途而定。 键盘的每一个按键都相当于一个机械开关触点,当按键按下时,触点闭合;当按 键松开时,触点断开。单片机接收按键触点的信号后作出相应的功能处理。因而, 相对于单片机系统来说键盘接口信号是输入信号。

本次设计中采用8255进行I/O口的扩展。

8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。 其各口功能可由软件选择,使用灵活,通用性强。8255可作为单片机与多种外设连接时的中间接口电路。

8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。

1)与CPU连接部分

根据定义,8255能并行传送8位数据,所以其数据线为8根D0~D7。由于8255具有3个通道A、B、C,所以只要两根地址线就能寻址A、B、C口及控制寄存器,故地址线为两根A0~A1。此外CPU要对8255进行读、写与片选操作,所以控制线为片选、复位、读、写信号。各信号的引脚编号如下:

(1)数据总线DB:编号为D0~D7,用于8255与CPU传送8位数据。

(2)地址总线AB:编号为A0~A1,用于选择A、B、C口与控制寄存器。

(3)控制总线CB:片选信号、复位信号RST、写信号、读信号。当CPU要对8255进行读、写操作时,必须先向8255发片选信号选中8255芯片,然后发读信号或写信号对8255进行读或写数据的操作。

2)与外设接口部分

根据定义,8255有3个通道A、B、C与外设连接,每个通道又有8根线与外设连接,所以8255可以用24根线与外设连接,若进行开关量控制,则8255可同时控制24路开关。

 8255管脚图

各通道的引脚编号如下:

(1)A口:编号为PA0~PA7,用于8255向外设输入输出8位并行数据。

(2)B口:编号为PB0~PB7,用于8255向外设输入输出8位并行数据。

(3)C口:编号为PC0~PC7,用于8255向外设输入输出8位并行数据,当8255工作于应答I/O方式时,C口用于应答信号的通信。

3)控制器

8255将3个通道分为两组,即PA0~PA7与PC4~PC7组成A组,PB0~PB7与PC0~PC3组成B组。如图7.5所示,相应的控制器也分为A组控制器与B组控制器,各组控制器的作用如下:

(1)A组控制器:控制A口与上C口的输入与输出。

(2)B组控制器:控制B口与下C口的输入与输出。

特性如下所示:

(1)一个并行输入/输出的LSI芯片,多功能的I/O器件,可作为CPU总线与外围的接口。

(2)具有24个可编程设置的I/O口,即3组8位的I/O口为PA口,PB口和PC口.它们又可分为两组12位的I/O口,A组包括A口及C口(高4位,PC4~PC7),B组包括B口及C口(低4位,PC0~PC3).A组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O3种模式;B组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定。

引脚功能如下:

RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。

CS:芯片选择信号线,当这个输入引脚为低电平时,即/CS=0时,表示芯片被选中,允许8255与CPU进行通讯;/CS=1时,8255无法与CPU做数据传输。

RD:读信号线,当这个输入引脚为低电平时,即/RD=0且/CS=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。

WR:写入信号,当这个输入引脚为低电平时,即/WR=0且/CS=0时,允许CPU将数据或控制字写入8255。

D0~D7:三态双向数据总线,8255与CPU数据传送的通道,当CPU 执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。

 

键盘电路图

 8255具有3个相互独立的输入/输出通道端口,用+5V单电源供电,能在下面三种方式下工作。

方式0————基本输入输出方式;

方式1————选通输入/出方式;

方式三————双向选通输入/输出方式;

 PA0~PA7:端口A输入输出线,一个8位的数据输出锁存器/缓冲器, 一个8位的数据输入锁存器。 工作于三种方式中的任何一种;

 PB0~PB7:端口B输入输出线,一个8位的I/O锁存器, 一个8位的输入输出缓冲器。 不能工作于方式二;

 PC0~PC7:端口C输入输出线,一个8位的数据输出锁存器/缓冲器, 一个8位的数据输入缓冲器。端口C可以通过工作方式设定而分成2个4位的端口, 每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口。不能工作于方式一或二。

A1,A0:地址选择线,用来选择8255的PA口,PB口,PC口和控制寄存器.

当A1=0,A0=0时,PA口被选择;

当A1=0,A0=1时,PB口被选择;

当A1=1,A0=0时,PC口被选择;

当A1=1.A0=1时,控制寄存器被选择。

3. 3. 2输出显示

LCD可以设置显示单价,金额,中文,购物日期等,且具有低功耗、可视面 积大、画面友好及抗干扰能力强等功能,性价比非常高,目前其显示技术己得到 了广泛应用。

LCD显示器丁作原理:液晶显示器主要材料是液体晶体。它在特定温度范围 内,即具有液态流动性也具有晶体的某些光学特性,其透明度和颜色都随电场、 磁场、光照等外界条件变化而变化。因此,用液晶做成显示器件,就间可以把以 上提到的外界环境的变化情况反映出来从而形成现实的效果。

本次设计中采用不带字库的LCD1286液晶模块,是128*64点阵液晶模块的简称。

技术参数

  

  LED12864管脚图

引脚

1 GND 电源地

2 VCC +5v

3 VO 亮度调节1,与10KΩ电位器的可调端连接

4 D\I 数据\指令选择,高电平为数据,低电平为控制指令

5 R\W 读写操作,高电平为读数据,低电平为控制指令

6 E 读写使能端,下降沿锁存

7 D0 数据总线

8 D1 数据总线

9 D2 数据总线

10 D3 数据总线

11 D4 数据总线

12 D5 数据总线

13 D6 数据总线

14 D7 数据总线

15 CS1 片选,高电平选择左屏

16 CS2 片选,高电平选择右屏

17 RES 复位,低电平有效

18 VEE 亮度调节2,接10KΩ电位器固定一端,另一端接地

19 VCC 背光电源+5v

20 GND 背光电源地0v

           

LCD显示电路

3.5模数转换接口电路

系统需要把模拟信号转变成数字信号后才能送至单片机控制系统,所以需要 一个A/D转换电路。下面具体介绍A/D转换器相关内容。

3.5.1A/D转换器的选定

A/D转换的方法通常可以分为:双积分式A/D转换,并行A/D转换,串行A/D 转换,逐次逼近A/D转换等。在这些转换方式中,双积分式A/D转换多用在数据采集系统和精度要求比较高的场合。双积分型AD转换器精度很髙,但是速度很慢,具有精确的差分输入,输入阻抗高,可自动调零。这种类型的转换器具有很强的抗干扰能力。只要干扰电压的平均值为零,对输出就不产生影响。尤其对本系统,缓慢变化的压力信号,很容易受到工频信号的影响。其实电子秤设计中,对A/D转换速度要求并不高,精度8位的AD转换器足以满足要求,逐次逼近A/D转换器在速度,精度,功耗方面有绝对优势,且价格低廉。因此逐次逼近A/D转换器是电子秤设计的最佳选择。

  

   

ADC0808管脚图

本次设计中采用ADC0808作为A/D转换器。

ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。

内部结构

ADC0808是CMOS单片型逐次逼近式A/D转换器,它有8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器。

引脚功能(外部特性)

ADC0808芯片有28条引脚,采用双列直插式封装,如右图所示。各引脚功能如下:

1~5和26~28(IN0~IN7):8路模拟量输入端。

8、14、15和17~21:8位数字量输出端。

22(ALE):地址锁存允许信号,输入,高电平有效。

6(START): A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。

7(EOC): A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。

9(OE):数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。

10(CLK):时钟脉冲输入端。要求时钟频率不高于640KHZ。

12(VREF(+))和16(VREF(-)):参考电压输入端

11(Vcc):主电源输入端。

13(GND):地。

23~25(ADDA、ADDB、ADDC):3位地址输入线,用于选通8路模拟输入中的一路 。

极限参数

电源电压(Vcc):6.5V

控制端输入电压:-0.3V~15V

其它输入和输出端电压:-0.3V~Vcc+0.3V

贮存温度:-65℃~+150℃

功耗(T=+25℃):875mW

引线焊接温度:①气相焊接(60s):215℃;②红外焊接(15s):220℃

抗静电强度:400V

输出端注意

  out8为最低位-out1为最高位,out8-out1分别接单片机的P0.0到P0.7端。

数模转换电路图

第四章软件设计

4. 1系统主流程

4.1.1主程序设计思路

新型便携式高精度电子秤软件设计总体思想是:根据预先编好的程序对物体 测量进行控制,完成自动诊断、自动清零、自动存储数据完成重量的称量,并按 照各种参数间的关系,经计算后自动求出有关参数,如:重量、单价、总价等。 根据系统功能,可将软件分为若干功能相对独立的模块,并为每个模块设计 程序流程图。该功能程序模块包括:系统初始化、A/D转换数据处理、键盘中断 处理、显示模块、数据处理模块。

4. 1.2主程序流程图

开机后,机器自检,检查称重显示是否为零,若称重显示不为零,则显示不 为零,显示为错误标志,此时,应进行微调,使之显示为零;若称重显示为零, 进行整机初始化,再进行称重及数据运算处理,否则直接将显示数据送至显示缓 冲区,接下来判断有无按键按下,若有,则进入按键功能处理程序,若无,则返主程序。下图是主程序流程图。


图4. 1主程序流程图


4. 1.3 A/D转换处理程序

在新型便携式高精度电子秤控制系统中,以AT89S51单片机为核心,设计一 个基于单片机的数据釆集系统,通过模拟电压形式输入系统,经逐次逼近型A/D转换器可以釆集8路模拟量,精度为8位,并经过多次釆样,通过滤波,取得更精确的重量值,下图是A/D转换过程框图:

图4. 2 A/D流程框图

4. 2键盘与显示处理程序

我们知道键盘和M示是人与微机系统打交道的主要设备。在本系统中我们釆8255扩展I/O口,解决了CPU I/O口不足的问题。

4. 2. 1键盘模块

微处理器周而复始扫的描键盘,当发现有键按下时,首先做出判断,看是命 令键还是数字键;若是数字键则把此时读数存入存储器,并显示;若是命令键, 则通过查阅转移表来获得处理子程序的入门。子程序执行完后继续进行键盘扫 描。键盘扫描结构框图如图所示:

图4. 3 键盘扫描结构框图

新型便携式高精度电子秤的按键扫描电路釆ffl 4*4的16按键,分为数字键: 0?9,和5个命令键:去皮、置零、小数点、净/毛转换。数字键和小数点键用于输入单价,去皮键用于去除皮重;清单键爪于输入单价错误的时候,重新输入。

键盘中断服务程序流程图如图所示:

图4. 4 键盘中断服务程序流程图

4. 2. 2显示模块

显示模块应于操作有关,也就是说,操作齐没操作一下,显示设备上都应有 一定的反应。操作者从显示设备上获取微机控制系统的信总,显示模块可以由命 令键来驱动或者自动驱动。

电子秤作为一种自动计价和称重的仪表,其系统内有大量的数据需处理,伍 括重量计算,价格计算等。数据处理主要有多字节的乘法运算。这里就不一一介 绍说明了。

第五章电子秤的抗干扰设计

新型便携式电子称硬件设计中釆取的抗干扰措施:

(1)屏蔽抗干扰设计。那个便携式高精度电子秤不能接地,电场屏蔽困难,仪器不能增加过多的硬件屏蔽。W此,仪器可在外壳内表面涂一层金属膜对外电磁干扰进行屏蔽。

(2)传感器的抗干扰设计。里然传感器的电容和参考电容使用两个不NJ的 电容频率转换电路,但是由于电容间的耦合作用,两个传感器电容会造成干扰。 为了防止这种情况,系统通过软件控制两个定时器进行交替工作。

新型便携式高精度电子秤采用干电池供电,不存在电源或电网干扰问题。但现场使用不可避免的受到自然放电的干扰和其他电气设备的放电干扰,但又不能增加很多硬件屏蔽措施,并且,干扰会造成程序弹飞、进入循环或死机状态,因此软件抗干扰设计对提高仪器的可靠性非常重要。软件抗干扰不仅效果好,而且可以减低产品成本,有利于仪器的商品化设计。

本文在单片机软件设计中采用下列软件抗干扰设计方法:

(1)CPU受千扰后,往往会把操作数当做指令码来执行,程序出现弹飞。 为抑制弹飞,采用指令冗余,即在关键地方插入一些单字节空操作指令。

(2)测量算法采用数字滤波、曲线拟合两种数据处理方法。数据滤波复用性好、自适应性强、可实现超低频滤波。数字滤波滤除随机的有害干扰信号,剔除干扰数据,消除了一定的系统误差,提高了仪器的准确性和重复性。曲线拟合对测量曲线进行不失真跟踪处理,保证测量计算准确。

(4)CPU处于等待状态时,让CPU进入睡眠模式,既实现了低功耗设计,又极大地减少了对CPU的干扰。

(5)程序中一些标志以便CPU在执行程序运行时核对判断,若符合标志设 定就继续运行,不然就转事故处理程序。标志判断可以及时纠正程序运行过程中 的差错。

第六章 电子秤系统调试

调试包括硬件调试、软件调试和样机调试。

硬件调试和软件调试都是独立进行的,软件调试包括监控子程序、数据釆集 子程序、数据处理子程序、显示子程序、键盘扫描子程序、报警子程序。软件调 试中需要W到的测量信号可以叫仿真实验台上的电压信号进行模拟,不需要进行 硬件的连接。同样硬件调试也不需要软件连接而独立进行的。

软件调试和硬件调试都止确无误时,就可以进行连接调试,在调试中继续找出单独调试中无法指出的问题,反反复复进行修改软件和硬件的工作,一直到所设计的电子秤显示的数据趋近于理想数据,然后进行软件的岡化与整机的组装工作。

调试过程中常见的几种故障:

故障一:传感器显示电压示数范围与要求的LCD显示器的质量示数不一致;这种故障主要是由于没有选好转换系数导致的,在修改程序时候转换子程序,在进制转换中计算出转换系数值,就能使质量范围满足要求。

故障二:经过放大器的传感器信号不稳定,并且不满足设定的放大倍数。信号不稳定主要是由于传感器精度不够准确,以及连线时线路不稳定等因素的影响;不满足放大倍数是由于放大器选择不合适,导致不能满足设定的放大倍数。应该选择精度卨的传感器,预计好运算放大器的放人倍数,以便于选择合适的运算放大器。

第七章总结与展望

传统的台式电子秤体积大、成本高、携带不便;而设计的新型便携式高精度 电子秤回避了传统台式电子秤的所有缺点,能够面向千家万户及各个贸易市场, 在项目方案制定、系统硬件设计及软件设计等方面进行了充分、细致的考虑。

新塑便携式髙精度电子秤技术指标参考了 R前国内市场上使用最多、国内外 产量最大的电子衡器的技术指标,其合理性无疑加大了产品投放市场后的竞争

基于单片机设计的电子秤,无论是计量精度,还是稳定性都满足国家要求, 它具有较好的标定校准方法,性能稳定,操作简单,价格低廉。同时通过硬件的 少量扩展和软件的修改,设计出性能优越的计价称,满足各行各业对电子衡器的 需求。

受研究时间和本人知识结构的制约,本文研究工作也存在一些不足之处:新 型便携式高精度电子秤设计期问,由于对实际工程设计不熟悉,设计过程中不可 避免地存在一些问题,如湿度影响等。便携式电子秤小巧轻便,成本低廉,但它 的设计所需要的理论知识、工程经验、工艺技术非常渊博,有待今后不断学习、 提高。


附录一:总体电路图


附录二:系统程序

#include<AT89c5x.h>

#include<stdlib.h>

#include<intrins.h>

#include <absacc.h>

#include <math.h>

#define uchar unsigned char

#define uint unsigned int

#define LScan   XBYTE[0x7f00]  //列扫描地址

#define HScan   XBYTE[0x7f02]  //行扫描地址

#define P2.0 0

#define P2.1 1

#define P2.4 2

#define P2.2 5

#define P2.3 6

#define P1.5 4

#define P1.4 7

/*-----------------宏定义------------*/

#define SET_BIT(x,y) (x|=(1<<y))

#define CLR_BIT(x,y) (x&=~(1<<y))

#define GET_BIT(x,y) (x&(1<<y))

/*----------端口电平---------------*/

#define LCD_RS_1  SET_BIT(P2,P2.0)

#define LCD_RS_0  CLR_BIT(P2,P2.0)

#define LCD_RW_1  SET_BIT(P2,P2.1)

#define LCD_RW_0  CLR_BIT(P2,P2.1)

#define LCD_EN_1  SET_BIT(P2,P2.4)

#define LCD_EN_0  CLR_BIT(P2,P2.4)

#define LCD_CS1_1  SET_BIT(P2,P2.2)

#define LCD_CS1_0  CLR_BIT(P2,P2.2)

#define LCD_CS2_1  SET_BIT(P2,P2.3)

#define LCD_CS2_0  CLR_BIT(P2,P2.3)

#define DataPort P0

#define Busy 0x80

/*-----------------------------------------------*/

#define DS1302_RST_1  SET_BIT(P1,P1.4)

#define DS1302_RST_0  CLR_BIT(P1,P1.4)

#define DS1302_CLK_1  SET_BIT(P1,P1.5)

#define DS1302_CLK_0  CLR_BIT(P1,P1.5)

#define DS1302_DAT_1  SET_BIT(P1,P1.4)

#define DS1302_DAT_0  CLR_BIT(P1,P1.4)

float p,t;

float qu_pi,shenfa,jieguo;

uchar hour,sec,min;

__flash uchar act[5]={0xf0,0xe0,0xd0,0xb0,0x70};

__flash uchar dan[]={0x00,0x10,0x00,0x10,0xF8,0x17,0x49,0x12,0x4A,0x12,0x4C,0x12,0x48,0x12,0xF8,0xFF,

0x48,0x12,0x4C,0x12,0x4A,0x12,0x49,0x12,0xFC,0x13,0x08,0x18,0x00,0x10,0x00,0x00};

__flash uchar jia[]={0x80,0x00,0x40,0x00,0x20,0x00,0xF8,0xFF,0x87,0x00,0x40,0x80,0x20,0x40,0x90,0x3F,

0x08,0x00,0x07,0x00,0x08,0x00,0x90,0xFF,0x20,0x00,0xC0,0x00,0x40,0x00,0x00,0x00};

__flash uchar yuan[]={0x20,0x80,0x20,0x80,0x22,0x40,0x22,0x20,0x22,0x18,0xE2,0x07,0x22,0x00,0x22,0x00,

0x22,0x00,0xE2,0x3F,0x22,0x40,0x23,0x40,0x22,0x40,0x30,0x40,0x20,0x70,0x00,0x00};

__flash uchar jin[]={0x80,0x00,0x80,0x40,0x40,0x40,0x20,0x4A,0x50,0x52,0x48,0x62,0x44,0x42,0xC3,0x7F,

0x44,0x42,0x68,0x62,0x50,0x52,0x20,0x4A,0x40,0x60,0xC0,0x40,0x40,0x00,0x00,0x00};

__flash uchar e[]={0x10,0x10,0x8C,0x08,0x44,0xFC,0xB5,0x4A,0x26,0x49,0xA4,0x4A,0x74,0x7C,0x0C,0x08,

0x02,0x80,0xF2,0x4F,0x1A,0x20,0xD6,0x1F,0x12,0x20,0xFB,0x4F,0x12,0xC0,0x00,0x00};

__flash uchar zhong[]={0x08,0x40,0x08,0x40,0x0A,0x48,0xEA,0x4B,0xAA,0x4A,0xAA,0x4A,0xAA,0x4A,0xFE,0x7F,

0xAA,0x4A,0xAA,0x4A,0xA9,0x4A,0xF9,0x4B,0x29,0x48,0x0C,0x60,0x08,0x40,0x00,0x00};

__flash uchar liang[]={0x20,0x00,0x20,0x80,0x20,0x80,0xBE,0xAF,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xFF,

0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBF,0xAF,0x22,0x80,0x30,0x80,0x20,0x00,0x00,0x00};

__flash uchar chu_shi_hua[][32]={0x04,0x10,0x34,0x08,0xC4,0x06,0x04,0x01,0xC4,0x82,0x3C,0x8C,0x20,0x40,0x10,0x30,

0x0F,0x0C,0xE8,0x03,0x08,0x0C,0x08,0x10,0x28,0x60,0x18,0xC0,0x00,0x40,0x00,0x00,

0x40,0x00,0x42,0x40,0x44,0x20,0xC8,0x1F,0x00,0x20,0xFC,0x47,0x04,0x42,0x02,0x41,

0x82,0x40,0xFC,0x7F,0x04,0x40,0x04,0x42,0x04,0x44,0xFE,0x63,0x04,0x20,0x00,0x00,

0x40,0x00,0x20,0x00,0xF8,0xFF,0x07,0x00,0x04,0x80,0xF4,0x43,0x14,0x45,0x14,0x29,

0x14,0x19,0xFF,0x17,0x14,0x21,0x14,0x21,0x14,0x41,0xF6,0xC3,0x04,0x40,0x00,0x00,

0x00,0x80,0x00,0x60,0xFE,0x1F,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0xFE,0x7F,

0x22,0x02,0x22,0x02,0x22,0x42,0x22,0x82,0xFF,0x7F,0x02,0x00,0x00,0x00,0x00,0x00,

0x10,0x00,0x08,0x00,0xE4,0xFF,0x13,0x00,0x26,0x00,0x8A,0x3F,0xA3,0x24,0xAA,0x24,

0xA4,0x24,0xA3,0x3F,0x26,0x40,0x2A,0x80,0xF2,0x7F,0x23,0x00,0x02,0x00,0x00,0x00,

0x00,0x08,0x00,0x04,0x00,0x22,0x7F,0x11,0xC9,0x09,0x49,0x87,0x49,0x41,0x49,0x21,

0x49,0x19,0x49,0x07,0x49,0x41,0x7F,0x81,0x00,0x41,0x80,0x3F,0x00,0x01,0x00,0x00,

0x00,0x00,0xF8,0x07,0x48,0x02,0x48,0x02,0x48,0x02,0x48,0x02,0xFF,0x3F,0x48,0x42,

0x48,0x42,0x48,0x42,0x48,0x42,0xFC,0x47,0x08,0x40,0x00,0x70,0x00,0x00,0x00,0x00,

0x80,0x00,0x80,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x40,0x82,0x80,0xE2,0x7F,

0xA2,0x00,0x92,0x00,0x8A,0x00,0x86,0x00,0x80,0x00,0xC0,0x00,0x80,0x00,0x00,0x00,

0x20,0x10,0x24,0x08,0x24,0x06,0xA4,0x01,0xFE,0xFF,0xA3,0x00,0x22,0x11,0x10,0x0C,

0x1C,0x43,0x13,0x80,0xD0,0x7F,0x10,0x00,0x50,0x01,0x30,0x06,0x10,0x0C,0x00,0x00};

__flash uchar shi[]={0x00,0x00,0xFC,0x3F,0x84,0x10,0x84,0x10,0x84,0x10,0xFE,0x3F,0x14,0x00,0x10,0x00,

0x90,0x00,0x10,0x23,0x10,0x40,0x10,0x80,0xFF,0x7F,0x10,0x00,0x10,0x00,0x00,0x00};

__flash uchar fen[]={0x00,0x01,0x80,0x00,0x40,0x80,0x20,0x40,0x98,0x20,0x86,0x1F,0x80,0x00,0x80,0x40,

0x83,0x80,0x8C,0x40,0x90,0x3F,0x20,0x00,0xC0,0x00,0x80,0x01,0x80,0x00,0x00,0x00};

__flash uchar miao[]={0x20,0x10,0x24,0x08,0x24,0x06,0xA4,0x01,0xFE,0xFF,0xA3,0x00,0x22,0x81,0x80,0x80,

0x70,0x40,0x00,0x20,0xFF,0x17,0x00,0x08,0x10,0x04,0x20,0x03,0x60,0x00,0x00,0x00};

void LcdJianMang();//检测忙函数

__flash uchar shizijian[][16]={

  0x00,0x00,0xE0,0x0F,0xF0,0x1F,0x08,0x20,0x08,0x20,0x18,0x30,0xF0,0x1F,0xC0,0x07,//  0

  0x00,0x00,0x00,0x00,0x10,0x20,0xF0,0x3F,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00, //  1

  0x00,0x00,0x70,0x30,0x78,0x38,0x08,0x34,0x08,0x32,0xD8,0x31,0xF0,0x38,0x20,0x08, //  2

  0x00,0x00,0x30,0x18,0x38,0x38,0x88,0x21,0x88,0x21,0xF8,0x33,0x70,0x1E,0x00,0x0C, //  3

  0x00,0x00,0x00,0x06,0x80,0x05,0x60,0x24,0x30,0x24,0xF8,0x3F,0xF8,0x3F,0x00,0x24, //  4

  0x00,0x00,0xF0,0x19,0xF8,0x39,0x88,0x20,0xC8,0x20,0x88,0x31,0x88,0x1F,0x00,0x06, //  5

  0x00,0x00,0xE0,0x0F,0xF0,0x3F,0x88,0x20,0x88,0x20,0x98,0x20,0x98,0x1F,0x00,0x0E, //  6

  0x00,0x00,0x38,0x00,0x18,0x00,0x08,0x3E,0x88,0x3F,0xE8,0x00,0x38,0x00,0x08,0x00, //  7

  0x00,0x00,0x70,0x1E,0xF8,0x37,0x88,0x21,0x88,0x21,0x88,0x23,0xF8,0x1E,0x20,0x0C, //  8

  0x00,0x00,0xF0,0x11,0xF8,0x3B,0x08,0x22,0x08,0x22,0x18,0x3B,0xF0,0x1F,0xE0,0x07, //  9

  0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // '.' 10

  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ' ' 11

  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x31,0xC0,0x7B,0xC0,0x7B,0x80,0x31  // ':' 12

};

/*-------------------------------------------------*/

void delay_1ms(void)

{

     uint i;

     for(i=1;i<20;i++)

         ;

}

/*-------------------------------------------------*/

void delay(uint x)

{

     uint i,j;

     for(j=0;j<x;j++)

         for(i=0;i<10000;i++);

}

/*-------------------------------------------------*/

void DS1302_Set_Byt(uchar x)

{

   uchar i;

 

   for(i=8;i>0;i--)

   {

      if(x&0x01)

        DS1302_DAT_1;

      else

        DS1302_DAT_0;

      DS1302_CLK_0;

      DS1302_CLK_1;

      DS1302_CLK_0;

      x=x>>1;

   }

}

/*-------------------------------------------------*/

uchar DS1302_Get_Byt()

{

   uchar i,x;

   x=0;

   CLR_BIT(DDRB,7);

   SET_BIT(PORTB,7);

   for(i=8;i>0;i--)

   {

     x=x>>1;

     if(GET_BIT(PINB,7))

          x=x|0x80;

     DS1302_CLK_1;

     DS1302_CLK_0;

   }

   SET_BIT(DDRB,7);

   CLR_BIT(PORTB,7);

   return x;

}     

/*-------------------------------------------------*/

void DS1302_Set_Shu_Ju(uchar x,uchar y)

{

    DS1302_RST_0;

    DS1302_CLK_0;

    DS1302_RST_1;

    DS1302_Set_Byt(x);

    DS1302_Set_Byt(y);

    DS1302_RST_0;

    DS1302_CLK_0;

}

/*-------------------------------------------------*/

uchar DS1302_Get_Shu_Ju(uchar x)

{

    uchar y;

    DS1302_RST_0;

    DS1302_CLK_0;

    DS1302_RST_1;

    DS1302_Set_Byt(x);

    y=DS1302_Get_Byt();

    DS1302_RST_0;

    DS1302_CLK_0;

    return y;

}

/*-------------------------------------------------*/

void LcdWriteData(uchar dataw)//写数据

{

     LcdJianMang();//判忙

     LCD_RW_0;//写

     LCD_RS_1;//数据

     DataPort=dataw;

     delay_1ms();

     LCD_EN_1;

     delay_1ms();

     LCD_EN_0;

   

}    

/*-------------------------------------------------*/

void LcdWritCommand(uchar dataw)//写指令

{

     LcdJianMang();//判忙

     LCD_RW_0;LCD_RW_0;//

     LCD_RS_0;LCD_RS_0;//指令

     DataPort=dataw;

     delay_1ms();

     LCD_EN_1;

     delay_1ms();

     LCD_EN_0;

}   

/*-------------------------------------------------*/

void LcdJianMang()//检测忙函数

{

     LCD_EN_0;

     LCD_RW_1;

     LCD_RS_0;

     LCD_EN_1;

     DDRC=0x00;

     if(PINB&0x80)

      {

       

      }

     LCD_EN_0;     

     DDRC=0xff;

}

   

/*--------------------------------------------------------------*/

void xie_yi_ge_han_zi(uchar x,uchar y,uchar z,uchar __flash *p)

{

  uchar i,y1;

  for(i=0;i<z;i++)

  {

       if(y>63)

       {

          LCD_CS1_1;

          LCD_CS2_0;

          y1=y-64;

       }

       else

       {

          LCD_CS1_0;

          LCD_CS2_1;

          y1=y;

       }

       LcdWritCommand(x+0xb8);

       LcdWritCommand(0x40+y1);

       LcdWriteData(p[i*2]);

       LcdWritCommand(x+0xb9);

       LcdWritCommand(0x40+y1);

       LcdWriteData(p[i*2+1]);

       y++;

  }

}

/*--------------------------------------------------------------*/

void xie_duo_ge_shu_ju(uchar x1,uchar x2,uchar x3,uchar x4,uchar __flash *k)

{

  uchar i;

  for(i=0;i<x1;i++)

      xie_yi_ge_han_zi(x2,x3+(i*x4),x4,k+i*32);

}

/*-------------------------------------------------*/

void chushihua()

{

    uchar i,j;

    LcdWritCommand(0x3f);

    LcdWritCommand(0xc0);

    for(i=0;i<8;i++)

    {

       LCD_CS1_0;

       LCD_CS2_0;

       LcdWritCommand(i+0xb8);

       LcdWritCommand(0x40);

       for(j=0;j<64;j++)

       {

           LcdWriteData(0x00);

       }

    }

  

   

   

}

/*-------------------------------------------------*/

uchar scan_key(void)       

{                

//延时函数

void delay(uint i)

{uint j;

  for(j=i;j>0;j--)

   {  ;  }

}

//检测有无按键按下的函数

uchar CheckKey()       //有按键按下返回0xff,无则返回0

{ uchar i;

 LScan =0x00;

  i=(HScan & 0x0f);

  if(i==0x0f) return(0);

  else  return(0xff);

 }

//********键盘扫描子函数***********

uchar KeyScan()         

{       //无按键返回oxff,有则返回键码       

    uchar ScanCode;

 uchar CodeValue;

 uchar k;

 uchar i,j;

 if(CheckKey()==0)  return(0xff);     //无按键,返回0xff

 else

  {

   delay(200);                     //延时

   if(CheckKey()==0)

     return(0xff);        //无按键,返回0xff

   else

    {

     ScanCode=0x01;              //设置列扫描码,初始值最低位为0

     for(i=0;i<5;i++)            //逐列扫描5次

      {

       k=0x01;                   //行扫描码赋初值

       LScan=~ScanCode;            //送列扫描码

       CodeValue=i;              //键码就是i的值,第零行的每列键码为0,1,2,3,和i值一致

       for(j=0;j<4;j++)

        {

         if((HScan & k) ==0)      //是否在当前列,

          {

           while(CheckKey()!=0); //若是,则等待按键释放

           return(CodeValue);     //返回键码

          }

         else                     //否则,键码加5,同一列的每一行上的键码恰好相差5

          {                       //列扫描码k右移一位,扫描下一行

           CodeValue+=5;

           k<<=1;

          }

                  

         }

         ScanCode<<=1;            //每一行都扫描完,列扫描码右移一位,扫描下一列

      }  

         }

  }

}

}

/*-------------------------------------------------*/

void xianshi130(uchar x1,uchar j,char  *a2)

{

   uchar s;

   s=0;

   for(s=0;s<=j;s++)

   {

       if(a2[s]=='.')

       {

         xie_yi_ge_han_zi(x1,119-(j-s)*8,8,shizijian[10]);

        

       }

       else

         xie_yi_ge_han_zi(x1,119-(j-s)*8,8,shizijian[a2[s]-0x30]);

     

   }

 

}

 

/*----------------------------------------------*/

void Lcd_1602_Qing_Chu(uchar k2)

{

  uchar j;

  for(j=0;j<9;j++)

   {

       xie_yi_ge_han_zi(k2,55+j*8,8,shizijian[11]);  

   }

}

/*-------------------------------------------------*/

void shi_zhi_xian_shi120(uchar x2,float k1)

{

      uchar xk,i;

      static char a5[8];//把Static去掉就要不停的乱闪,不知道为什么

      uint k;

      uint y;

      i=0;

      y=10000;

      k=(uint)k1;xk=0;

      if(k>0)

      {

        for(i=0;i<5;i++)

        {

           if((k/y)||(xk))

           {

             a5[i]=k/y;

             xk=1;

           }

           else

             a5[i]=11;

           k=k%y;

           y=y/10;

        }

      }

      else

      {

        a5[i]=0;

        i++;

      }

      k1=k1-(uint)k1;

      xk=0;

      a5[i]='.';

      while(xk<3)

      {

           i++;

           k=(uint)(k1*10);

           a5[i]=k;

           k1=k1*10-k;

           xk++;

      }

      if(i>0)

        i--;

      for(xk=0;xk<=i;xk++)

      {

         if(a5[xk]=='.')

            xie_yi_ge_han_zi(x2,119-(i-xk)*8,8,shizijian[10]);

         else

            xie_yi_ge_han_zi(x2,119-(i-xk)*8,8,shizijian[a5[xk]]);

     

      }

   

}

/*-------------------------------------------------*/

void qing_an_jian_shu_zu(char *a)

{

  uchar i;

  for(i=0;i<7;i++)

      a[i]=0;

}

void qing_chu_jieguo(char *a2)

{

  

   shenfa=jieguo;

   qing_an_jian_shu_zu(a2);

   Lcd_1602_Qing_Chu(0);

   xie_yi_ge_han_zi(0,119,8,shizijian[0]);

 

}

/*-------------------------------------------------*/

void Jian_Pan_Chu_Li()

{

      uchar x;

      static char a2[7], i;

      static uchar x1;

      x=scan_key();

      if(x!=20)

      {

         if((x<10)&&(i<7))//输入0-9数字

         {

          

            a2[i]=x+0x30;

            xianshi130(0,i,a2);

            i++;

         }

         if(x==19)//退格键

         {

            if(i>0)

            {       

              i--;

              a2[i]=0;

              Lcd_1602_Qing_Chu(0);

              if(i>0)

                 xianshi130(0,i-1,a2); 

              if(i==0)

                 xie_yi_ge_han_zi(0,119,8,shizijian[0]);

            }

         }

         if(x==10)//小数点键

         {

            if(i==0)

            {

               a2[i]='0';

               i++;

            }

            a2[i]='.';

            xianshi130(0,i,a2);

            i++;

         }

       

         if(x==11)//乘法

         {

          

            qing_chu_jieguo(a2);

            i=0;x1=1;

                    

         }

         if(x==12)//除法

         {

          

            qing_chu_jieguo(a2);

            i=0;x1=2;

                    

         }

         if(x==13)//加法

         {

           

           qing_chu_jieguo(a2);

           i=0;x1=3;

                    

         }

         if(x==14)//减法

         {

           qing_chu_jieguo(a2);

           i=0;x1=4;

                    

         }

         if(x==15)

         {

            x1=5;

            shenfa=jieguo;

         }

         if((x==18)||(x1==5))//确定键

         {

             p=atof(a2);

             switch(x1)

             {

                case 0:jieguo=p*t; break;

                case 1:jieguo=p*shenfa; break;

                case 2:jieguo=shenfa/p; break;

                case 3:jieguo=shenfa+p; break;

                case 4:jieguo=shenfa-p; break;

                case 5:jieguo=p-shenfa; break;

            

             }

             shi_zhi_xian_shi120(4,jieguo);

             x1=0;i=0;

             qing_an_jian_shu_zu(a2);

           

       

         }

         if(x==17)//清零键

         {

            Lcd_1602_Qing_Chu(0);

            p=0; xie_yi_ge_han_zi(0,119,8,shizijian[0]);

            qing_an_jian_shu_zu(a2);

            i=0;x1=0;

         }

         if(x==16)//去皮

         {

             qu_pi=t;

         }

      }

}

 

/*-------------------------------------------------*/

void main()

{

  

   uint asd2;

   uchar asd1;

   float m;

  // t=1.0;

  

   DDRD=0xff;

   PORTD=0x00;

   DDRB=0xff;

   PORTB=0x60;

   DDRC=0xff;

   PORTC=0x00;

   DDRA=0xf0;

   PORTA=0x00;

   uchar Key;

  XBYTE[0x7f03]=0x81;    //8255初始化,设置A口输出,C口低4位输入

  while(int0==1)

   { Key=KeyScan();

     

   }

}

   chushihua();

  // shi_zhi_xian_shi120(0,15);

 //  xie_duo_ge_shu_ju(4,2,32,16,chu_shi_hua[0]);

 //  xie_duo_ge_shu_ju(5,4,24,16,chu_shi_hua[4]);

  // delay(100);

 //  chushihua();

 

   xie_yi_ge_han_zi(0,0,16,dan);

   xie_yi_ge_han_zi(0,16,16,jia);

   xie_yi_ge_han_zi(0,32,8,shizijian[12]);

   xie_yi_ge_han_zi(0,119,8,shizijian[0]);

   xie_yi_ge_han_zi(2,0,16,zhong);

   xie_yi_ge_han_zi(2,16,16,liang);

   xie_yi_ge_han_zi(2,32,8,shizijian[12]);

  

   xie_yi_ge_han_zi(4,0,16,jin); 

   xie_yi_ge_han_zi(4,16,16,e);

   xie_yi_ge_han_zi(4,32,8,shizijian[12]);

  

   sec=DS1302_Get_Shu_Ju(0x81);

   sec=sec&0x7f;

   min=DS1302_Get_Shu_Ju(0x83);

   min=min&0x7f;

   hour=DS1302_Get_Shu_Ju(0x85);

   hour=hour&0x3f;

   xie_yi_ge_han_zi(6,16,16,shi);

   xie_yi_ge_han_zi(6,48,16,fen);

   xie_yi_ge_han_zi(6,80,16,miao);

   ACSR= 0x80;

   ADMUX=0x00;

   ADCSRA=0xee;//SREG=0x80;

   m=0;p=0;qu_pi=0;

   SET_BIT(PORTB,4);//

   //shi_zhi_xian_shi120(2,15);

   while(1)

   {

      

       Jian_Pan_Chu_Li();

       asd1=ADCL;

       asd2=(uint)ADCH;

       asd2=(asd2<<8)+asd1;

      t=asd2/34.1;

       t=t-qu_pi;

       if(t!=m)

       {

          m=t;

        //  Lcd_1602_Qing_Chu(2);

          shi_zhi_xian_shi120(2,t); 

          //Lcd_1602_Qing_Chu(4);

          jieguo=p*t;

          shi_zhi_xian_shi120(4,jieguo);      

      

       }

       ADCSRA|=0x40;

       sec=DS1302_Get_Shu_Ju(0x81);

       sec=sec&0x7f;

       min=DS1302_Get_Shu_Ju(0x83);

       min=min&0x7f;

       hour=DS1302_Get_Shu_Ju(0x85);

       hour=hour&0x3f;

       xie_yi_ge_han_zi(6,64,8,shizijian[(sec&0xf0)>>4]);xie_yi_ge_han_zi(6,72,8,shizijian[(sec&0x0f)%10]); 

       xie_yi_ge_han_zi(6,32,8,shizijian[(min&0xf0)>>4]);xie_yi_ge_han_zi(6,40,8,shizijian[(min&0x0f)%10]);  

       xie_yi_ge_han_zi(6,0,8,shizijian[(hour&0xf0)>>4]);xie_yi_ge_han_zi(6,8,8,shizijian[(hour&0x0f)%10]);

    

   }

}

更多相关推荐:
吊灯创新设计报告书

课程名称题目类别指导教师专业班级姓名学号完成日期成绩吊灯设计目录封面1目录2前言3第一部分课题分析4一设计背景及原则4二设计思路6三设计意图7第二部分调研分析8一灯具的调研8二吊灯的调研11三灯具重点企业分析1...

创新基础设计报告

创新基础设计报告创新基础设计报告作品名称便捷开瓶器学生姓名班级学号完成日期20xx年6月3日机电综合工程训练中心1创新基础设计报告一设计创意二作品主要制造过流程2创新基础设计报告三作品图纸按制图课要求不够请附页...

产品创新设计 报告格式(1)

成绩创新实践报告产品创新设计制作学号班级姓名签字学号20xx5639班级电气0901姓名签字成静学号班级姓名签字学号班级姓名签字学号班级姓名签字学号班级姓名签字12

机构创新设计实验报告

机构创新设计实验报告实验课程名称机械原理学院机电学院专业班级10机械设计制造及其自动化学号101401010124学生姓名舒展20xx年6月28日机构创新设计实验报告一实验目的1通过实际机构的应用设计和搭接加深...

专业创新设计报告

德州学院学生专业创新设计报告实习名称实习时间实习地点专业班级13级工商专升本学生姓名刘全达王德勇安太东指导教师王彬教学单位经济管理学院二O一二年八月二十八日德州学院实习报告纸目录一专业设计目的3二专业设计引言概...

机械创新设计报告 多功能电脑桌

机械创新设计实验报告班级机制1006班姓名李扬学号103004010617指导教师张融20xx年5月22日实验题目便携式多功能电脑桌姓名李扬成绩实验日期20xx年5月22日批阅教师同组成员陈伟李瑞坚批阅日期一实...

机械创新设计报告

机械创新设计报告学校:绍兴文理学院元培学院姓名:班级:学号:摘要摇椅作为一种家用休闲、休息的良好用具,能缓解生活压力、促进健康,但是普通摇椅自身不能动,要依靠其他的外力摇动才能动起来。为此,学生在教师的指导下给…

创新产品设计学习报告

选题类别2创新产品设计课程期末读书报告题目创新设计中国制造迈向中国创造的突破口姓名学号学院专业年级指导教师20xx年月日创新设计中国制造迈向中国创造的突破口第一部分一概述从20世纪80年代开始随着全球制造业向中...

创新产品设计-报告

选题类别创新产品设计课程期末读书报告题目创新产品设计课程的学习体会姓名学号学院福州大学至诚学院专业财务管理年级20xx指导教师卢健涛20xx年4月22日第一部分以下内容来自德国学者GerhardPahl和Wol...

德州学院专业创新设计报告模板(整个文档)

德州学院学生专业创新设计报告实习名称设计或计划书或根据情况自定名称实习时间实习地点专业班级学生姓名指导教师教学单位20xx专业创新设计报告正文内容及格式参考题目黑体小三号居中一专业设计目的黑体五号左对齐正文宋体...

机电创新设计学习报告

机械创新设计报告机械创新设计学习报告机械创新一直是我们专业所极力强调的通过我院的科技论文报告会科研立项申报等形式让我在潜移默化中渐渐熟悉着机械创新的方法和过程在本学期学习本门课程之后我对此的认识又更加清晰深刻了...

机械创新设计调查报告

机械创新设计过程调查报告一VTG可变增压涡轮叶片几何技术11新技术名称VTG可变增压涡轮叶片几何技术12发明人保时捷Porsche13发明原因及背景为了解决Porsche997使用了较大型的废气涡轮后随之而来的...

创新设计报告(41篇)