单片机毕业设计:基于单片机的复费率智能电能表软件系统设计_第1页
单片机毕业设计:基于单片机的复费率智能电能表软件系统设计_第2页
单片机毕业设计:基于单片机的复费率智能电能表软件系统设计_第3页
单片机毕业设计:基于单片机的复费率智能电能表软件系统设计_第4页
单片机毕业设计:基于单片机的复费率智能电能表软件系统设计_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机毕业设计:基于单片机的复费率智能电能表软件系统设计 国防科学技术大学本科生学位论文基于单片机的复费率智能电能表软件系统设计姓名: 申请学位级别:本科专业:电子计算机目录 摘要 第一章引言 §1.1 单片机的发展 §1.2 复费率表的需求背景 §1.3 复费率表目前的技术状况 §1.4 设计的基本目标、实现状况、后续开展 第二章MCS-51系列单片机及其AT89C51简介 §2.1 MCS-51系列单片机 §2.2 AT89C51之新特点 第三章硬件的基本构成及软硬接口 §3.1 系统的大致硬件结构 §3.1

2、PCF8583 日历时钟芯片简介 §3.3 软硬件之间的接口 第四章软件总要及关键技术分析 §4.1 软件总体思想 §4.2 软件组成 §4.3 各模块功能分配及调用关系 §4.4 几处关键算法的说明 §4.5 关键技术分析 第五章软件模拟 I2C通讯 §5.1 I2C总线规约 §5.2 软件模拟 I2C的实现 §5.3 出现的问题及其解决 第六章键处理 §6.1 键之功能安排 §6.2 键盘监控程序设计方法综述 §6.3 键分析法及安排 第七章软件采用的抗干扰及容错技术 &

3、#167;7.1 可靠性设计综述 §7.2 抗干扰及容错技术简介 §7.3 系统采用的抗干扰容错措施 第八章系统评价 附录 1 参考书目 2 致谢 3 软件文档及程序清单 摘要 本文主要论述了如何用 AT89C51单片机构复费率智能电能表的计费模块设计,而且主要涉及其中的软件问题。 复费率表的主要特点是随时段变化将电量计入不同的计量单元。本文主要论述了采用 AT89C51 单片机作为分时计量之核心,将其计量模块的时段编制、分时计量、数据显示、数据处理及下电保存和上电恢复给以有效实现的一般技术。这其中之关键问题有:一、时段的准确切换。二、数据的可靠计量与安全保存。 为了保证系

4、统实时时钟的精度, 该系统采用了飞利浦PCF8583日历时钟芯片, 并通过软件模拟I2C总线实现了 89C51与 PCF8583的有效通讯, 为系统提供了精确的实时时钟和掉电时数据在 PCF8583里的可靠保存。 在系统监控程序的编制中, 成功地用软件模拟了 I2C的通讯;在分析已有的直接分析法、图解法、状态分析法等的基础上, 提出并成功地使用了一种新型键分析技术; 综合采取了软件WATCHDOG、数据冗余、软件陷肼等多种软件抗干扰容错措施。 通过对系统硬件资源的合理配置使用及软件的精心设计安排, 该系统较好地解决了编程、显示、下电保存、上电恢复等,取得了满意的效果。 关键词: 89C51单片

5、机PCF8583日历时钟 复费率表 软件模拟 I2C通讯 键分析技术 软件抗干扰容错技术 软件WATCHDOG第一章 引言 我们这次毕业设计主要任务是利用AT89C51单片机研制开发一种新型复费率智能电能表。设计的硬件部分由唐靖飙同学完成,我则负责其中的软件部分。下面对这次设计的背景做一些介绍。§ 本世纪40年代以来信息和微电子技术的飞速发展, 给人类的生活带来了深刻的影响。 而70年代大规模集成电路的发展更为自动化技术的革新迎来了黎明前的曙光-单片机诞生了。 单片微型计算机 Single Chip Microcomputer简称单片机, 又称微处理器 Microcontroller

6、 , 是将计算机的基本部件微型化, 使之集成在一块芯片上的微机。片内含有 CPU、ROM、RAM、并行I/O、串行 I/O、定时器/计数器、中断控制、系统时钟及系统总线等等。单片机有着体积小、功耗低、功能强、性能价格比高、易于推广应用等显著优点, 在自动化装置、智能化仪表、过程控制和家用电器等领域得到日益广泛的应用。近年来, 单片机结合专用集成电路ASIC Applied Specific Integrated Circuit 和精简指令集计算机 RISC Reduced Intruction Set Computer技术发展成嵌埋式处理器Embedded Procssor, 使得单片机可集成

7、众多的软件和硬件, 而成为更深意义上的单片应用机型, 使其更强的功能深入到数据、数值分析, 信号处理, 智能机器人及图象处理等高技术领域。 自1974年美国德克萨斯仪器公司推出第一块单片机以来, 许多家公司参与了单片机的研制和生产的竞争。 目前通用型单片机至少有50多个系列400 多个品种。 其中最具代表性的典型机种为 Intel公司的MCS-51系列, Motorola公司的MC6805系列和Zilog公司的 Z8系列及其派生的各种产品。而我国应用最多的是MCS-51系列, 它为我国单片工作者所最熟悉, 而且有多种性能完善的开发工具, 在各个技术领域的科研和技术改造、产品开发中起着越来越大的

8、作用。 同时, 这也为我们开发研制新型复费率智能电能表提供了良好的基础。§1.2 复费率表的需求背景 随着我国国民经济的迅猛发展, 电力资源的紧张日显突出。而且众所周知, 电力生产的特点是发、供、用电同时完成, 加之电能存储既困难成本又高, 因而在一般情况下,发电量是由用电量多少决定的。电力的使用又有明显的时段性: 在用电集中时,要求发电量增加形成电网负荷高峰; 反之, 当用电负荷大量减少时, 则要求减少发电量形电网负荷低谷。这种运行状况不仅很不经济, 有时甚至危及电网的安全。为了平衡负荷, 电力部门采取了许多措施, 实行多部电价就是主要措施之一。 所谓多部电价就是根据用电的时段性特

9、征, 在用电高峰期提高电价, 限制用电; 在低谷期降低电价, 以鼓励用电。这样, 对于供电部门有利于提高电网的效率; 对于用电部门来说可适当减少电费开支, 并避免在用电高峰期的拉闸限电现象。 这对于双方都是有利的。因此就需要有可以将不同时段的用电情况分别记量的复费率电表。而我国目前生产的电表多为机械式总量表, 不具备复费率功能, 从国外引进的不仅价格十分昂贵, 许多质量也不稳定。电力部门迫切需要研制与生产我们自己的复费率表, 以期多部电价顺利实施, 并对电能的使用管理起到许多积极作用。§1.3 复费率表目前的技术状况 复费率表 Multitariff Watt Hour Meter

10、最早出现于七十年代后期的美国, 我国于八十年代初期进行了有限的引进。其主要特点是按时段不同将电量计入不同的计量单元, 以提供按多部电价收费的依据和给电力技术经济管理提供数据。 从国内外的各种复费率电表生产情况来看, 各厂家设计的结构、选用的元件、所采用的技术措施方式很多, 因此表的品种也较繁多, 性能不一, 但总的来说大都是在机械母表的基础上增加分时计量和显示功能而成。其发展过程中大致出现过以下几种:一 按工作原理分类: * 采用全机械传动的机械式;* 分时计量和时钟控制均采用电子线路实现的电子式;* 采用电子时钟电路和机械计时部件与机械计数部件的机电混和式;二 按分时计量模块和机械母表的结合

11、方式分类: * 两相合一的一体式; * 两相分离的分离式;三 按电能计数的转换方式分类: * 机械式; * 感应脉冲式; * 光电转换式;在各种表的种种不同中, 核心内容是工作原理的区别。 从复费率表的特点和功能可知, 任一复费率表都必须有以下四个基本组成部分: 电能测量部分, 时间控制部分, 电量分别计录装置和切换部分, 控制及时控电源。 采用何种技术措施来将其给以有效的实现就是问题之根本点。 复费率表刚刚出现之时, 由于技术上的不成熟, 最为简单的机械式和机电混和式占很大部分。而近年来随着单片机技术的广泛应用和日趋完善, 采用单片机作为其分时计量的核心单元的复费率表成了技术上的主流, 其余

12、的都已经和正在被淘汰。而且,由于用户需求的不断提出, 复费率表已不仅仅是分时计量和显示,而成为集计量、显示、编程、电力数据统计、负荷控制信号传送等于一体的智能仪器, 其组成部分大都要求有: 光电脉冲电能信号转换、单片机时控、分时计量、需量功能、红外抄表、数码管/液晶板显示、RS232/RS485接口以实现与微机联网和远程抄表等等。但目前市场上出现的复费率表 包括从国外进口的一些表往往都存在着这样或那样的不足, 如: 时钟误差较大、数据可靠性不高、与微机联网的接口不完善等。基于此, 我们决定研制开发一种各方面较为完善的新型复费率智能电能表。§1.4 设计的基本目标、实现状况、后续开展

13、一 基本目标基于对新型复费率智能电能表的需求, 我们决定采用以AT89C51单片机和飞利浦PCF8583日历时钟芯片作为主要器件,而这次设计的基本目标就是完成其中软件部分的时段编制、分时计量、数据显示、数据处理及下电保存和上电恢复。由于PCF8583日历时钟芯片是通过 I2C接口与外界通讯, 而 AT89C51没有I2C接口, 所以软件还要完成模拟 I2C通讯的任务。 二 实现情况由于银河计算技术发展中心已经开发并投放市场了一种复费率电能表 采用的是专用单片机。 软时钟技术, 设计开发的新型表要和原有的保持功能兼容,设计中就基本按照原有 产品说明, 将其显示和编程完全给以实现,并将时段由八个增

14、加为十个。 软件顺利实现了模拟 I2C通讯, 为系统提供了高精确度的实时时钟。至此, 新型表软件模块的设计已基本完成。三 后续开展这次毕业设计由于时间紧, 任务重, 软件设计简化掉了红外抄表和RS485串行通讯, 但留下了较好的接口, 使得红外遥控只需将键码分析出来就可使用已有程序完成功能, RS485串行通讯也正着手编制加入, 争取早日将新型复费率智能电能表推上市场。第二章MCS-51系列单片机及AT89C51简介§2.1 MCS-51系列单片机 MCS-51系列单片机根据片内有无程序存贮器及存贮器的形式, 分为3 种基本产品: 8051, 8751和8031。8051单片机片内含

15、有掩膜 ROM型程序存贮器; 8751片内含有EPROM型程序存贮器, 其程序可多次擦除重写; 8031片内没有程序存贮器, 但可外部扩展一片或多片含用户程序的EPROM, 使用较为灵活。 它们之间除程序存贮器的形式不同外, 其它结构与功能全都相同。 MCS-51系列单片机的主要特征如下: * 适合于控制应用的 8位 CPU; * 64K 外部程序存贮器地址空间; * 64K 外部数据存贮器地址空间; * 128/256 Byte 内部 RAM; * 3256 位双向可分别寻址的 I/O 线; * 24 个16位定时/计数器; * 全双工异步串行口 UART ; * 519个中断源/511个向

16、量的中断结构; * 片内时钟振荡器; * 布尔处理器。§2.2 AT89C51之新特点 AT89C51是一种低功耗。高性能的 8位CMOS微处理器芯片, 片内含有4K 字节的闪速可编程及可擦除只读存贮器 Flash Programmable and Erasable ROM, 简写为PEROM, 128字节的RAM, 32条I/O线, 2 个 16位定时/计数器, 一个全双工异步串行口 UART , 一个五源两级的中断结构, 片上振荡器与时钟电路。 经我们实验认为, AT89C51是一种很可靠的性能非常优良的芯片, 它的使用给我们这次设计提供了很多便利。第三章硬件的基本构成及软硬接口

17、§3.1 系统的大致硬件结构 系统使用了一片带有4K 字节的闪速可编程及可擦除只读存贮器的 AT89C51单片机作为中央控制器; 采用一片飞利浦 PCF8583 日历时钟芯片作为系统硬时钟, 并使用其中的 256个 Byte RAM 作为掉电时数据保存区; 采用 8位 LED七段显示器作为显示部件, 4个发光二极管作为峰平谷和电能脉冲指示灯; 用七个按钮接到P2.0P2.6作为系统控制键; 用光电头得到电能脉冲信号, 以外部中断方式INT1将脉冲信号送入89C51; 用一块7705得到上电复位和掉电中断信号,掉电信号从INT0接入89C51; 用变压器作为系统正常工作电源,用一个高能

18、锂电池作为掉电时PCF8583备用电源以维护系统实时时钟和数据。§3.2 PCF8583 日历时钟芯片简介 PCF8583是一个低电压源的日历时钟芯片和RAM电路, 它的主要功能特性如下: * 4 年日历时钟, 24或12点格式; * 具有串行I2C总线接口; * 256字节RAM, 自动字节地址增量; * 具有可编程的闹钟.定时和中断功能。 RAM的头8个字节单元地址为0007作为可寻址的寄存器, 其中地址为00的单元为控制/状态寄存器, 0107单元为时钟计数器,地址为的080F的单元可编程为空闲单元或闹钟寄存器。 由于我们只用到了它的计时功能, 所以下面只简单谈一下时钟计数器和

19、控制寄存器。 00单元: 复位后状态为的00H, 此时为32.767kHz时钟方式, 取消了起闹功能, 读5至6单元时不屏蔽。装入实时时间时应先给00单元送80H; 01, 02, 03, 04单元依次为百分之一秒、秒、分、时计数器,其数据格式为压缩BCD码; 05单元为年和日期寄存器, 06单元为星期和月份寄存器,其格式如下: PCF8583的其它单元被用作RAM,本文将在附录中对其详细说明。§3.3 软硬之间的接口及硬件资源的分配 由上述硬件构成可知, 硬件在外围电路方面为软件提供的接口有:* 显示部分: P0.0P0.3为数字09的BCD码, P0.4为小数点, P1 为八个七

20、段的位选择, 如0010,0000B 则显示左数第三个七段。* 按键信息: 七个按钮分别挂接在P2.0P2.6上, 平时为高电平, 按下时为低, 定义如下: 键名 键值对应89C51引脚 ? 01000000BP2.6 00100000BP2.500010000BP2.400001000BP2.3 00000100BP2.2 00000010BP2.1 00000001BP2.0* 掉电中断: 掉电信息由INT0引入89C51。* 电能脉冲: 电能脉冲由INT1引入89C51。* 与PCF8583的通讯:PCF8583具备I2C接口, 其中SDA数据线接P0.7,SCL时钟线接P2.7。又:

21、PCF8583有开放式中断, 接P0.5, 软件检测其由高到低跳变作为秒信号。* 指示灯:P3.4P3.7接四个发光二极管, 软件将其定义如下: P3.4 峰电指示,P3.5 平电指示, P3.6 谷电指示,P3.7 电能脉冲指示, P3.4和P3.5同时亮为尖峰电量指示, P3.4P3.6全亮为总电量指示。 程序对系统内部硬件的资源分配为: T0定时器用作定时, 它的中断用于软件WATCHDOG, T1计数/定时器、TI/RI串行I/O 中断留作系统扩展用。 其余如P0,P1,P2,P3等在软硬接口中已有定义, 不再赘述。AT89C51中128字节RAM分配为: 25字节用作堆栈, 30 字

22、节用作计算需量用的滑差队列, 第0第1两组寄存器, 8 字节的显示缓冲区以及一些常用常修改的数据。 PCF8583的RAM中设有实时时钟, 并存放下电保护数据和系统一些不常修改的数据如: 时段定义、用户号、抄表密码等。 在上述软硬接口定义和硬件资源分配下进行了软件设计以完成系统功能。 第四章软件总要及关键技术分析§4.1 软件总体思想 单片机程序又称为监控程序, 它负责监督管理智能仪器的全部资源和全部操作。它是智能仪器的心脏和灵魂, 监控程序质量的好坏直接决定着一个智能仪器性能。 由于程序将用在新型电表上, 所以其数据的安全性与可靠性就是至关重要的了, 这就要求首先要尽可能保证程序的

23、正确性。而简单将在某种程度上导致正确, 因此在编程处理中尽可能避免了程序结构的过于复杂,而将其分为相对较为独立的功能模块。并且, 按照软件工程学的思想, 软件在其生存周期中其维护是很占用人力的, 所以尽可能应使程序有较好的可读性。本着正确、简单、可读的原则编制了整个软件。当然, 这是以程序代码效率的降低为代价的。 笔者认为, 在内存不是主要矛盾的情况下, 代码量在一定限度内的增加以换取软件的高可靠性和良好的可读性是很值得的。§4.2 软件组成 本设计中监控程序由主程序和三个中断服务程序组成。 T0中断服务程序和RAM H单元一起作为软件WATCHDOG, 是系统抗干扰措施之一。 电能

24、脉冲中断服务程序负责记录电能脉冲数目, 如果满一个计量单位就修改总电量, 并根据当前时段峰平谷值修改分电量。 掉电中断服务程序负责保存掉电保护数据, 然后停止程序执行以防数据丢失。 主程序则首先调用初始化, 给各特殊寄存器置初始值, 并依掉电标志的状态不同给各工作单元送初值。 如果是掉电恢复还要处理掉电时间记录和抄表等工作, 然后进入主循环。在这个主循环中喂软件WATCHDOG一次; 不断调用显示子程序显示数据;同时, 检测 PCF8583秒信号得到实时时间, 维护滑差队列、计算最大需量、修改相应记录,并检测是否到时段转换点, 是则更新当前时段峰平值; 检测有无键按下, 若有, 则转到键处理子

25、程序完成处理; 然后跳转到循环头继续循环; 这期间如果有中断则由中断服务程序处理之。 整个软件中显示项号是系统最重要的数据: 显示内容由它指示, 在调用键处理程序和数据送显示的子程序时都靠它来传递参数。 主程序流程如下: 软件大体框架如下:§4.3 各模块功能分配及调用关系 软件大体按功能分为多个模块, 其功能分配及调用关系如下:.1. I2C通讯模块: 从PCF8583中读出或向PCF8583写入若干个数据。.2. 掉电中断INT0服务程序: 保存脉冲计数值, 显示项号和当前时间, 中止程序执行。 调用:1I2C通讯模块.3. 电能脉冲中断INT1服务程序:接收脉冲信号, 并判断是

26、否需要修改总电量, 及按当前时段峰平谷值指示修改分电量。调用:1. I2C通讯模块.4. T0中断服务程序: 软件WATCHDOG监视器, 将 H增1, 并判是否大于3, 是则转出错处理。.5. 更新显示缓冲区模块READ:将DSPNUM显示项号所指示的数据送入显示缓冲区。调用:1. I2C通讯模块.6. 编程数据记录模块:记录修改过的编程数据。调用:1. I2C通讯模块。.7. 上电初始化模块:各单元送初始值, 初始化各特殊寄存器, 各变量送缺省值。调用:.1I2C通讯模块.5更新显示缓冲区模块READ.8. 抄表模块:记录抄表数据, 重置工作单元, 记录需量数据。调用:1I2C通讯模块.9

27、. 掉电恢复模块:恢复掉电保护数据, 记录停电时间, 如需要则抄表。 判断当前时段, 恢复正常工作。调用:1I2C通讯模块.5更新显示缓冲区模块READ.8抄表模块.10. 键处理模块:分析键码, 并按程序不同状态执行对应操作。调用:1I2C通讯模块.5更新显示缓冲区模块READ.8抄表模块.11. 显示模块:将显示缓冲区数据送数码管显示。.12. 主程序模块:根据系统时钟及时切换时段, 调用各模块完成系统功能。§4.4 几处关键算法的说明1 秒信号的获得:PCF8583的INT脚有开放中断,当它不作闹钟功能时,此引脚上为以秒为周期的方波信号,读该引脚,如有由高到低跳变记为1秒,秒计

28、数在8951里完成,满一分钟时读PCF8583内时间,修改8951 内时间以和8583保持一致。2 需量的计算:设有滑差队列指针QUETHIS, 抄表后自动回到队列头QUEHEAD, 当QUETHIS指向队列最后一个元素时置队列满标志QUEFALL,软件检测到有这个标志时开始计算当前需量,及判读并记录最大需量。3 循环显示的实现:非编程态当循环键 摁下,则进入循环显示。 置循环标志,同时置显示项号DSPNUM为01项,软件检测有循环标志则做如下动作: SC_LAST移入PRE_LAST, 秒最后一位移入SC_LAST, 若PRE_LASTSC_LAST 则显示项号DSPNUM增1, 增 1后若

29、DSPNUM06就置DSPNUM为01, 即只显示前五项, 这样就依次循环显示0105项。4 判当前时段SD_NOW:程序先判断用户定义了多少个时段, 由于规定最后一个时段为23:59, 软件从时段02 开始检测最后一个时段值不为23:59 的时段, 则SYSDS 使用时段数等于这个时段号,再看该时段的费率是否为谷, 不为谷SYSDS再增1, 这样就得到用户定义的时段数目。根据当前时间, 程序搜索最后一个小于当前时间的时段值, 它即为当前时段,将当前时段费率填入DQSDFPG 当前时段峰平谷值, 它指示分电量的记录, 并将下个时段值填入 XGSD 下个时段, 以供软件在出现分信号时检测,若时钟

30、等于XGSD则更新DQSDFPG和XGSD。5 时段的切换系统设有 XGSD 下个时段值, 两个字节, 分别为下个时段点的小时和分钟值, 以供软件在出现分信号秒计时为00H时检测,若时钟等于XGSD则更新DQSDFPG和XGSD。 将当前时段费率填入DQSDFPG当前时段峰平谷值, 它指示分电量的记录, 并将下个时段值填入XGSD 下个时段, 以供下次检测。 6 数据的显示 显示由两部分共同完成,显示程序 DISPLAY和显示缓冲区更新程序READ。DISPLAY负责把显示缓冲区的内容送到八个七段上显示出来,做法是:关闭P1口送00H, 显示缓冲区一个字节送P0, P1口开放 每次开放一位,

31、如01000000B开放左数第二个七段, 顺次从高则低送八个七段同时开放该数码管。 READ负责把显示项号DSPNUM 指示的数据送到显示缓冲区 DSPNUM50 时为普通非编程态显示, DSPNUM50时为编程态显示。 做法是利用类似高级语言Switch的机构, 用 CJNEA,#项号1,#标号1 AJMP#功能子程序标号2 标号1: CJNEA,#项号2,#标号3 AJMP#功能子程序标号4 标号3: : : 功能子程序标号2: 送项号为项号1的数据; AJMP READ_END 功能子程序标号4: 送项号为项号2的数据; AJMP READ_END: : READ_END更新程序结束点:

32、 语句来实现跳转到该项数据处理处, 这使和分折和处理两相分离, 程序易读、易编制、易调试, 更方便后续工作的开展和维护如需增加显示项仅增加 CJNEA,#新项号,#处理 AJMP#新处理标号 新处理标号: 处理 AJMP READ_END 即可。 若READ数据在PCF8583中,则先调用READPCF子程序将数据读入读缓冲区R_BUF, 然后将之分解送入DSPBUF, 同时根据对该数据意义的解释对相应位置小数点位, 如DSPNUM01时是总电量, 此时若为两位小数, 则DSPBUF的37H第4bit置1, 送显示时即有小数点被点亮。 7 编程数据记忆FWRITE: 对数据编程时, 有一个MO

33、DI_F位,若该位为1 时,则说明该项数据系统修改过, 则调用FWRITE记忆之, 否则不修改原值。 FWRITE先按DSPNUM的不同解释显示缓冲区数据的意义, 将数据装配起来, 例由六字节变为三字节压缩 BCD码, 且不含小数点信息 小数点只在显示时按对该数据的解释加上。 同样对 DSPNUM采用了类似 Switch的机构。若数据存放在PCF8583则调用WRITEPCF写入之。 8 键处理程序: 键分析时程序分为两个状态: 编程态和非编态。 在不同的状态下同一个键功能不同, 程序也按不同功能状态聚簇, 在不同的状态下分析到同一个键也执行不同的程序。 9 编程态数据闪烁的实现: 程序设了一

34、个闪烁指示字BLINK, 一个闪烁标志位BLINK_F, 进入编程态时置位BLINK_F, 当秒计数最后一位为 1时, DISPLAY程序就不打开BLINK 所指示的对应数码管, 当秒计数最后一位为0时, DISPLAY程序正常显示所有有值的数码管。 这样就得到了闪烁的效果。§4.5 关键技术分析 为了程序较好的可读性, 在软件的编制中许多地方使用了类似高级语言的结构化技术, 并使用了类似 C语言中SWITCH机构的结构。具体实践中主要就是严格按功能划分程序模块, 使得各模块之间功能相对独立, 接口定义清晰, 参数传递尽量简单,以减少可能出现的失误, 避免引起系统功能紊乱。 设计过程

35、中还严格按照软件工程学的要求,先行设计出了伪代码程序, 这也给软件由抽象的设计思想到具体的汇编程序的编制带来了很大的方便。 这使得程序代码段功能分配明确, 控制转移十分清楚, 给程序的编制和调试带来了很大方便。 突出例证就是程序在编码完成后, 仅用了五天就基本上调通了近3000行汇编程序。 而且, 可以预见, 它还将给以后的维护工作带来极大的便利。 由于程序数据量较大, 8951的128字节RAM不能满足要求, 再加上下电时数据要在PCF8583中保存, 如何实现没有I2C接口的 AT8C951和只靠I2C接口和外部联系的PCF8583之间的有效通讯, 便成为设计能否成功的关键。这个问题将在第

36、五章中予以详细讨论。 作为智能仪器的单片机系统是要和外部有联系的。这其中的主要手段之一就是键盘。当然这里所说的键盘可能只有很少几个按钮组成。而且常常出现同一键在不同状态下按下具有不同的意义, 如何编制出高质量的键盘监控程序就成了一个需要好好研究的问题。我们将在第六章重点研究这个问题。 由于电能表使用的环境比较复杂, 各种干扰可能很大,而且还会因用户的误操作给系统带来难以预料的不良影响, 所以如何提高系统的可靠性就也成为了一个至关重要的事情。第七章将会有这方面的详细说明。 对于以上的几个问题系统都给予了较好的解决。第五章 软件模拟 I2C通讯 §5.1 I2C总线规约 1 I2C总线概

37、念: I2C串行总线是器件与器件IC与IC简称为I2C之间的通讯总线, 使用两根线 时钟线 SCL和数据线 SDA 就可以实现器件之间的串行通讯。飞利浦的很多单片机具有I2C总线接口,同时还生产配置I2C接口的外围电路RAM,I/O口,AD,DA 等, 它为系统的扩展提供了很方便的手段。I2C的硬件逻辑提供了开始和结束信号检测。 从器件地址识别、总线的竞争与同步、定时和控制等功能。 这里我们主要关心有关软件模拟方面的特性。 I2C 总线根据地址识别每个器件。根据器件的功能可以工作于发送或接收方式。 另外, 对于发送器或接收器来说, 在进行数据传送时可以认为是主器件或从器件。 一个主器件是启动在

38、总线上传送数据并产生时钟以允许传送的器件, 这时任何被寻址的器件认为是从器件。 数据有效性: 在时钟高电平期间SDA上的数据必须稳定见下图,只有在时钟线SCL低电平期间SDA线上高电平后低电平状态才能发生变化。 开始和结束信号:开始信号: SCL为高时, SDA由高到低跳变;结束信号: SCL为高时, SDA由低到高跳变; 2 数据传送:.1. 字节格式送到SDA线上的每个字节必须为 8位长度, 每次传送的字节数是不受限制的, 每个字节后面必须跟一个响应位。 数据在传送时先传送最高位详见下图。2. 响应认可确认数据是必须的, 认可位相对于主器件产生的 1 个时钟,在这个时钟内发送器释放SDA线

39、。s, 最小高电平为4s, 主器件产生的时钟频率为0100kHz。§5.2 软件模拟 I2C的实现飞利浦公司生产的具有I2C总线接口的外围芯片种类十分繁多,其.性能和操作要求也多种多样, 这里我们主要以PCF8583 为例介绍一下.如何用软件模拟的方法来实现没有I2C接口的主处理器和只靠I2C接口和外部联系的具有RAM 特性的外围器件之间的有效通讯, 且将它们统称为外部RAM器件。 根据I2C总线规约可知, 软件模拟I2C通讯的大体流程可划分如下: 1 向外部RAM里写入:*1* 发开始信号; SCL为高时, SDA由高到低跳变*2* 发从器件地址7 个Bit和R/W 0为写入 位;

40、*3* 检测等待外部RAM器件的应答信号ACK;*4* 发送字地址 即RAM 单元的地址;*5* 检测等待外部RAM器件的应答信号ACK;*6* 发送数据 .1. 发送一个数据字节; .2. 检测等待外部RAM器件的应答信号ACK; .3. 是最后一个字节吗 是, 则转到*7*; 否则, 转到.1 *7* 发送结束信号; SCL为高时,SDA由低到高跳变2 从外部RAM里读出:*1* 发开始信号; SCL为高时, SDA由高到低跳变*2* 发从器件地址7 个Bit和R/W 0为写入 位;*3* 检测等待外部RAM器件的应答信号ACK;*4* 发送字地址 即RAM 单元的地址;*5* 检测等待外

41、部RAM器件的应答信号ACK;*6* 发开始信号; SCL为高时, SDA由高到低跳变*7* 发从器件地址7 个Bit和R/W 1为读出 位;*8* 检测等待外部RAM器件的应答信号ACK;*9* 发送数据 .1. 发送一个数据字节; .2. 是最后一个字节吗 是, 则转到 .5. ; 否则,执行 .33. 主器件如本例中的 8951发应答信号ACK,即在一个时钟周期内SCL为高时拉低SDA电平; .4. 转 .15. 主器件不响应, 即在一个时钟周期内SCL为高时保持SDA为高电平; 从器件检测到这个高电平的下一个时钟周期放弃SDA线, 以使主器件能产生结束信号6. 转*10* ; *10*

42、 发送结束信号; SCL为高时,SDA由低到高跳变 有关的详细说明请参考附录的软件文档。 这里有很关键的一点就是要严格保证, 在一次传送开始后和结束前数据线SDA 在时钟线为高时不能发生变化 因为I2C 规约将之定义为开始或结束信号, 否则将会导致传送的非常结束。 只要满足I2C规约的时序定义, SCL的低电平时间可以根据需要适当延长。 软件在给以实现时, 可考虑使用一个定时/计数器来实现I2C对时序的要求。 这样软件可以在I2C通讯的同时执行其它的操作。其不足是软件编制较为复杂, 较易出错。 还可考虑全由软件来满足时序要求, 靠调整指令安排顺序来实现, 包括加入一些 NOP指令。这样的不足是

43、要占处理器的全部时间, 很难再插入其它操作。而且还要考虑中断可能造成的影响。本系统是采用纯软件方法实现时序要求的, 对中断的处理是采用全屏蔽的方法, 在一次通讯开始就关闭所有的中断, 结束时将之重新打开。由于一次通讯耗时极短,实验证明对中断的响应基本上没有影响 读/写一个字节耗时不到 0.2ms, 读/写完成后立即开中断。而电能脉冲中断最快也只有每隔250ms有一次, 所以不会造成中断信号丢失 。 另外一种处理方法是不屏蔽中断, 但进入中断后不马上进行中断处理, 而是先等待 SCL为低再开始中断处理, 并在中断处理过程中始终保持SCL为低即可。 这一方法适于在中断不宜屏蔽的系统中使用。 

44、67;5.3 出现的问题及其解决在程序的调试过程中, 发现所编制的I2C通讯程序工作不正常,具体表现是如果一次传送大批量数据, 则会有前几个数据正确, 而后面的读出错误或者读出几个字节后死机的可能, 但如果每次只读写一个字节则可保证正确。 经过对程序的反复检查, 发现可能问题出在指令的安排不能满足 I2C规约对时序的要求。于是, 程序调整了对SDA 和SCL操作的指令的时序, 把在SDA线上输出一位"0"或"1"的功能由一个子程序完成改变为直接语句输出, 使得该操作与启/停信号和ACK信号的时序取得一致,并减少了子程序调用的开销和可能因此带来的错误。并在

45、写SCL线和写SDA线的指令之间加入了一条NOP指令, 以调整时序。重新编译之后, 问题果然得到解决。 最初的程序还有一个不令人满意的地方就是通讯速度太慢, 有些地方大量数据传送时可以看到明显的滞留, 影响到显示的效果, 而且, 这还给掉电时通过 I2C通讯保存数据带来一定的困难。在上面所谈到的时序问题解决后, 尽可能减少了通讯子程序中的空等待, 而是调整指令次序以配合定时要求。结果将传送一个字节所需要的时间从2ms左右减少到 0.2ms, 从而使通讯速度得到了很大提高, 也保证了通讯的质量。第六章 键处理 作为智能仪器的单片机系统主要通过键盘和外部有联系, 当然这里所说的键盘通常是几个按钮组

46、成或一个4×4的小键盘。为了完成较为复杂的操作, 常常要定义一系列键盘指令来实现各种不同的功能, 这样就会出现同一键在不同状态下按下具有不同的意义, 要想编制出高质量的键盘监控程序就要有一个科学的方法来指导, 这就是所谓键分析法。 下面结合这次设计的实践来给以讨论。 §6.1 键之功能安排 系统采用了七个按钮, 分别挂接在P2.0P2.6上,平时为高电平, 按下时为低电平, 定义如下: 键名 键值对应89C51引脚 ? 01000000BP2.6 00100000BP2.5 00010000BP2.4 00001000BP2.3 00000100BP2.200000010B

47、P2.1 00000001BP2.0 功能说明: 1 编程态 退出编程态。系统总清, 恢复为出厂状态。 无效。 如已选择了数据位, 该位值增1模10, 否则, 编程项号增1模21如已选择了数据位, 该位值减1模10, 否则, 编程项号减1模21 选择要编程改变的数据位。 如果数据被改变,记忆改变后的数据,同时编程项号增1否则,编程项号增1,但不记忆当前数据。 2 非编程态 进入编程态。无效。 抄表,同时进行需量清零。 进入非循环显示,显示项号增1模 50。 进入非循环显示,显示项号减1模 50。进入循环显示, 同时置显示项号为01H 进入非循环显示, 同时置显示项号为01H§6.2

48、键盘监控程序设计方法综述键盘监控程序要完成的工作主要有两部分: 一是获得键码, 二是分析是哪一键, 并根据不同的程序状态调用相应的处理程序完成键的功能。 由于键盘监控程序设计是以计算机为基础的设计的基本组成部分之一, 具有很重要性的意义, 所以已经有很多人对这个问题进行过深入研究, 提出了一些很好的方法。 目前, 设计键盘监控程序主要有两种方法: 直接分析与转移表法和状态分析法。 早期多采用直接分析法。 这种方法的缺点是键盘分析程序与动作程序混为一体, 不可分割。 程序的编写。 修改。 阅读。 移植都比较麻烦。 对一键多义键盘尤甚。 而美国学者 /.tman 在1977年提出的 "

49、键盘分析算法" 克服了直接分析法的不足, 国内从1982年开始使用这种方法, 并称之为"状态分析法"。 随着单片机应用的日益广泛, 人们又逐渐认识到了这种方法的缺点与不足, 并提出了相应的改进方法, 其中以中国科学院感光化学研究所陶培德提出的 "图解法" 为优秀的代表。 直接分析与转移表法由于大家都比较熟悉, 这里就不再赘述。 下面简要介绍一下键码的获得和"图解法"。键码的获得: 键码的获得其实也是键分析法研究的一个方面, 但又有相对的独立性, 它是分析实现键功能的基础,所以先单独给以讨论。 键码获取方法较多不同的方法可以给

50、出不同的键码, 它可以完全由键盘硬件电路直接给出编码键盘, 也可以由简单的键盘接口电路配上一定的键扫描, 由键译码程序给出非编码键盘。 智能仪器为充分利用微电脑的软件资源, 减少硬件开支,一般多采用非编码键盘。非编码键盘又有行扫描法和线翻转法两种给出键码的方法, 其中线翻转法采用中断技术。 "图解法" "图解法"的基本思想是把监控程序看作一个系统, 键开关作为该系统的输入, 动作程序看作系统的输出。 根据系统理论: 系统的输出取决于系统当前的状态和输入激励, 并 伴随当前状态跃迁到下一个状态有时下一个状态与当前状态相同,构成自身循环。若令PREST PREsent STate表描述当前状态, 令NEXST NEXt STate 表描述下个状态简称"次态"。 那么监控程序可以描述为: 系统输出的动作程序取决于输入键开关的键码和系统现态值, 并由现态PREST 跃迁到次态NEXST。 而任一时刻系统的状

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论