1、摘 要本论文对智能电能表进行了详细的阐述。主要讲述了一种对普通电能表进行扩展,从而实现分时计价功能的智能化电能表,并给出了软件设计及调试问题。在论文完成过程中,主要进行了以下工作:(1) 对系统要求进行分析,并设计系统的整体结构(2) 把整体细分化,对每个模块进行详细设计(3) 绘制原理图和PCB板,并制成实验板(4) 按照硬件电路,编写软件程序(5) 调试阶段,调试各软、硬件模块,编写测试程序,验证系统的可用性,最后制成系统样机。 本论文主要对智能电能表的结构进行了较详细的阐述,并简要讲述了近来电能表的发展及研究动态。具体分析了软件的两大模块:键盘模块程序设计、LCD显示模块程序设计,并对主
2、要芯片的使用做了说明。同时也对硬件总体设计做了一些简要的阐述,并对编辑软件所使用的函数写了一些分析。另外还介绍了绘制原理图所出现的一些问题,比如各个芯片之间连线及接口问题。关键词:键盘模块;LCD显示模块;时钟芯片 ABSTRACTThis study will discuss about the intelligence electric energy meter in detail. It is an intelligent electric energy meter by expanding to the normal electric energy meter, carries out
3、 the divided chronometer price, gives the software design and adjusts the problem. We do the following work in the completion of the thesis.(1) Analyze the requirement of the system, and design the whole structure of the system.(2) Subdivide the whole, and design each module in particular.(3) Protra
4、ct schematic plot and PCB plot, and crank out experiment board.(4) Write software procedure according to hardware circuit.(5) In debugging moment, debug each software and hardware module, write testing procedure, validate the usability of the system, and finally crank out the system sample.This stud
5、y will discuss about the intelligence electric energy meter in detail, and tell of the recent development of electric energy meter and the research statement in brief. This study analyzes materially the two parts: keyboard part program design and LCD show part program design, and does the explanatio
6、n to the use of main chip. Also it explains the hardware total design in brief, and writes some analysis about editing the function which is used of software.Moreover this study also introduced some problems about drawing the principle diagram. For example, the connected line each chip and interface
7、 problem.Keywords: keyboard part; LCD show part; clock chip目 录摘 要Abstract1 概述11.1 本课题研究背景及意义11.2 国内外研究的动态11.3 本课题的可行性分析21.4 设计要求及预期研究成果22 系统简介42.1 系统总体方案设计42.2 硬件各模块的设计52.2.1 主机52.2.2 电脑时钟模块62.2.3 LCD显示模块62.2.4 光电转换模块62.2.5 键盘控制模块62.2.6 看门狗模块73 软件设计83.1 键盘模块103.1.1 键盘的中断处理函数133.1.2 实时时钟电路MC146818A16
8、4 调试中出现的问题22参考文献24致 谢25附录浙江理工大学信息电子学院本科毕业论文(设计)1 概述1.1 本课题研究背景及意义近年来,随着经济的快速发展,电力需求的不断增长和能源价格的不断提升,用电紧张已经成为突出的问题摆在我们面前。而电力又不是可以储存的特殊商品,某些时段用电多,其他时段用电少。用电高峰时电力供不应求,用电低谷时又电力过剩。为了应对这样的难题,可以采用分时电价来缓解供需矛盾,提高电力利用效率。分时电价是指在不同时段采用不同电价,根据用电需求和电网负荷将每天的时间划分为用电高峰时段(6:0022:00)和用电低谷时间段(22:006:00),高峰时段执行较高电价(0.8元/
9、度),低谷时段执行较低电价(0.6元/度)。供电部门通过对不同时段的用电实行不同电价,用经济手段鼓励用户主动采取避峰填谷的措施,从而使电力负荷曲线变缓,以提高发电设备的利用率,同时减小由于负荷曲线变化太大而引起的不安全因素。20世纪30年代,国外就开展了电力负荷控制方面的研究,实行分时计费是一种经济有效地调节负荷曲线的方法。因此,开发一种简单实用的分时计量电能表变得尤为重要,本课题通过对一般电能表进行扩展,从而实现分时计量功能。1.2 国内外研究的动态近几年,随着我国国民经济稳步发展,城市居民家庭用电不断增加,用电管理方式也随之改革,上海、武汉等国内大中城市逐步推出分时优惠电价政策,分时电价方
10、式已在国内各大城市得到迅速推广。分时段计费的复费率电能表用户逐渐由工业用户逐渐由工业用户为主转向居民用户为主,单相复费率电能表的市场需求量不断增长。据全国电工仪器仪表标准化技术委员会秘书处统计,近一年来,办理复费率电能表产品型号注册的企业近300家,注册频率呈上升趋势。目前电子式分时电能表已进入非常成熟的阶段。它是一种静止式无任何机械运动部件的固态电能表,由电压互感器、电流互感器、高精度高速A/D变换器、电能计量专用集成电路、实时时钟、数据存储器、大屏幕液晶驱动及显示器、数据通信接口、开关电源等模块构成,精度通常在1.0级至0.5级,可靠性好,易于实时记录,大部分型号均带有预付费功能可供选用。
11、采用带有预付费功能时,电量有电钥匙、IC卡等输入,剩余电量不足时,可根据用户负荷性质选择输出音响及告警,显示电量不足,启动表内继电器跳闸等功能。具有失压断流记录、RS232、RS422、RS485等标准通信接口,可远程定时抄录计量数据、本月及上月最大需求量、峰、平、谷最大需求量、脉冲输出,监控通过密码设定,方可读出与修改数据等,时段设定通常有8个。目前常用的这一系列产品有DSSD331、D66、DTSD341等。1.3 本课题的可行性分析电在我们的日常生活中已不足为奇,而电能与当今社会的科学进步、经济发展和人们的生活都密切相关。它广泛应用于农业生产,照明,信息通讯,交通运输,自动控制,日常生活
12、,科学实验等各个方面,为现代社会的精神文明的发展提供物质基础。电能是继蒸气时代之后的又一类二次能源。化学燃料(煤、石油、天然气)、核烯料、太阳能、网通、水能、潮汐能、地热能等一次能转换二次能源电能。同时电的对整个人类的影响意义深远,它不公从根本上改变了整个工业生产的面貌,而且还直接改变了人类的生活方式,使人类迅速跨进了电气时代。由于电是一种高效的便于工作于输送的能源。电力出现后,很快就被应到炼钢、建筑、纺织等生产行业以及电车、地下铁路等城市公共交通部门,并且已成为家庭主要使用的能源之一。电能的广泛使用注定了人们需要合理、高效的使用,因此,分时计费电能表就应时而生。本文介绍了一种简单的分时计费电
13、能表。该系统可以作为为外的模块安装到普通电能表上,从而实现分时计价功能。它是用TS150位移传感器对普通电能表进行光电采集,对脉冲进行计数并将计数值转化为电量,由MC146818提供相应的时间来判断用电的时段,并计算相应时段的电量和电费从而实现分时计费的功能。1.4 设计要求及预期研究成果本设计利用单片机控制普通电能表,实现分时计费的功能。本系统可以作为额外的模块安装到普通电能表,这样用户已安装的普通电能表不需要更换为新的电能表,仅仅另外安装了本系统后就可以作为一个标准的智能电能表使用。本系统实现以下功能:(1) 记录高峰用电量(2) 记录低谷用电量(3) 记录总用电量(4) 计算并记录高峰时
14、段用电电费(5) 计算并记录低谷时段用电电费(6) 计算并记录总电费(7) 显示高峰用电量(8) 显示低谷用电量(9) 显示总用电量(10) 显示高峰时段用电电费(11) 显示低谷时段用电电费(12) 显示总用电电费(13) 清除电量记录和电费记录记录和计算用电量、电费都由单片机编程完成,显示功能由单片机控制LCD实现。相应的显示功能选项由键盘按键选择。此外,断电后所有存储数据不丢失,电表绝对时间标准仍正常运转。2 系统简介2.1 系统总体方案设计本系统的设计将整个系统划分为多个模块,简化设计流程。本系统可以简单的划分为5个模块:单片机控制模块、电脑时钟模块、光电转换模块、LCD显示模块、键盘
15、控制模块。其中测试模块是以AT89C51单片机为核心进行设计的,这里充分利用了单片机的数据处理及实时检测能力,利用单片机接受光电模块送来的电脉冲,对脉冲进行计数,将计数值转化为电量,根据由时钟模块中取得的小时,判断用电的时段,计算相应时段的电量和电费,并记入总电量和电费;接受键盘的中断,根据不同的按键显示不同的功能;控制LCD显示模块,将CPU内部的数据送到LCD上显示,并显示必要的提示信息。而且此系统可以广泛应用于社会,通过分时计费来控制并约束用户的用电量,从而达到合理使用电能。同时本系统也采用了四大关键辅助性算法:这里要说明的几个算法都不参与硬件的驱动,完全是纯软件的算法。虽然很短小,但是
16、简练的完成了其目的。在整个系统控制程序中的地位,不亚于其他与硬件接触的函数。是整个系统中介于外部硬件数据与CPU数据之间的核心。(1)算法NumsToArray:这个算法的功能是,将作为第一参数传递的int型整数的各位分离,按照由高位到地位的顺序依次放入作为第二参数传递的数组中。方便其他函数使用数组中的数字,利用字库得到相应的字型码。此算法中其实包含2个子算法。如传递一个整数54321到函数中,第一个子算法将54321的各位分离放入数组,但是此时得到的序列为倒序,即:数组下标0,1,2,3,4分别存放数字1,2,3,4,5。第二个子算法将数组中的元素进行倒序运算,得到需要的顺序,即:数组下标0
17、,1,2,3,4分别存放5,4,3,2,1。(2)算法:ArrayToCharacters:此算法的功能是,将作为第一参数传递的,存放1位数字的数组,通过查字库,将得到的字型码按顺序放入作为第二参数传递的将要显示的字符库中。此算法运算后得到的字符库就可以送入LCD的显示缓存区,显示出相应的图形了。此算法利用NumsToArray算法得到的数组,查找字库,产生字符库。这两个函数作为核心算法被显示电量电费等函数使用。(3)算法ArrayToDigitalI:此算法的功能是将作为第一参数传递的存放一位数字的数组,转化为一个整数返回。此算法一般用来将存放在键盘缓存区的一位数字序列转化为一个整数。其他函
18、数利用返回的整数设置相应变量的值。此函数被设置高峰时段,电表转数等函数使用作为核心算法。(4)算法ArrayToDigitalF:此算法的功能是将作为第一参数传递的存放一位数字的小数序列数组转换为一个浮点数返回。此算法一般用来将存放在键盘缓冲区的一个小数序列转化为浮点数返回给调用函数。此算法实现时将序列以小数点(系统中为D键)为轴心分成两半,每半都是一个一位整数序列,将两个序列传递给ArrayToDigitalI,ArrayToDigitalI返回两个整数。将小数点后面的整数转换成小数加到小数点前面的整数上完成到浮点数的转换。此函数被设置电费函数调用作为核心算法。2.2 硬件各模块的设计本系统
19、的硬件部分主要由主机、LCD显示模块、光电转换模块、电脑时钟模块、键盘控制模块、看门狗模块六部分组成。系统原理框图如图2.1所示:LCD显示单片机系统光电转换采样电路电脑时钟键盘备用电源看门狗电路图2.1 系统原理图2.2.1 主机本课题通过单片机来实现对电脉冲的采集和计数,因为单片机是按工业测控环境要求设计的,抗干扰能力强,环境要求不高,可适应的温度范围宽,灵活性好,体积轻,可以降低系统的成本获得较好的性能。AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压,主性能C
20、MOS8位微处理器,俗称单片机。该器件ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容,而且芯片上的EEPROM允许在线(+5)电擦除、电写入或采用通用的非易失存储编程器对程序存储器重复编程。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的At89C51是一种高效微控制器,能为很多嵌入式控制系统提供一种灵活性高且价廉的方案,所以我们选用AT89C511。2.2.2 电脑时钟模块实时时钟电路是控制系统中常用的功能模块。在本系统中我们采用了Motorola公司的MC146818可编程时钟芯片。MC146818是专用于稳中有降类微处理器与单片机
21、系统的时钟集成电路。它带有50字节的低功耗静态RAM,可进行时、分、秒和年、月、日及星期的计数,并有自动的月结束识别和闰年处理功能,具有12/24小时和AM/PM的12小时计时功能,既可与Motorola系列的单片机接口,又可以与Intel的微处理器接口2。我们利用该芯片将计费段的时间存储起来,在各时间段开始向单片机的INT0端口申请中断,在不同的时段使系统执行不同的计费程序。CPU在计数满一度电的时候执行中断程序,此时CPU读取外部RAM中存领教的钟点,判断不同的时段,执行不同的任务。2.2.3 LCD显示模块由于液晶显示器(LCD)具有工作电压低、微功耗、显示信息量大和接口方便等优点,所以
22、本系统采用16*2液晶显示器。LCD显示模块通过接口扩展芯片连接到CPU,使用时只需要CPU通过芯片将显示用的字码存储在LCD模块的内部存储区,LCD就可以显示出相应的字符3。2.2.4 光电转换模块光电转换模块用于获取普通电能表记录的用电量,在普通电能表的旋转铝盘上打一个很小的检测孔提取光脉冲。铝盘每旋转一圈,模块会检测到一个光脉冲,经光电耦合并加以整形放大后转换成电脉冲,送到CPU的T1端用作计数触发脉冲。普通电能表的铭牌上标有每KWh多少转,其含义为电能表转数每达这一数值就是用了一度电(即1KWh)4。将从电能表上提取转换后的电脉冲信号送入单片机的T1端并进行计数,编程时将T1计数器的计
23、数模值设为电能表的转数,当计数器计数溢出时就可以判断电能表已经用了一度电。测试时可以使用实验室普通的信号发生器送出脉冲信号代替电能表的转数脉冲,送入单片机的T1端。2.2.5 键盘控制模块键盘模块由普通的16键非编码键盘与Intel8279可编程键盘/显示接口芯片组成完整的编码键盘电路。当键盘上有键按下时Intel8279会将按键转换为键码存储在一个FIFO(First In First Out,先入先出)队列中,并向CPU申请中断。CPU得知中断以后,从Intel 8279的存储区读出键码,判断相应的按键,决定执行相应的功能5。2.2.6 看门狗模块本系统的看门狗由一块MAX813L芯片和一
24、个开关组成,主要用于抗干扰和复位。看门狗实际上是一个计数器,一般给看门狗一个大数,程序开始运行后看门狗开始倒计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数。如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。此外,WatchDog5还可以在程序陷入死循环时让单片机复位而不用整个系统断电,从而保护你的硬件电路。此外,因为考虑可能遇到停电情况,此时电能表不转,无脉冲信号给出,但绝对时间标准仍须正常运转,否则整个系统将打乱,因此系统还配置了备用电源。3 软件设计软件设计的成功与否关系到整个系统能否具有使用灵活。操作简便,可靠性强等优点,而设计良好胡软件能够做到在
25、较少地改变硬件电路的情况下,方便地改进系统的功能,这就对软件的设计提供了较高的要求。 遵循“自顶向下,逐步求精“的结构化设计原则,先将任务层次化,然后对每一层再逐步细化,每一层实现的功能尽量是独立的,彼此之间互相影响应该较少,然后按照与划分相反的过程编写,调试程序,待所有子程序都编写设计通过后,依它们之间的逻辑顺序组合起来,构成完整的程序软件。采用这种方法,不仅使软件可读性好,维护方便且易于修改移植。如用户有特殊要求需要改动软件时,则只需修改或替换某子任务所对应的子程序即可,从而加快了系统研制进度,缩短了软件开发周期6。本系统要完成的任务有两大部分:键盘模块任务和LCD显示模块任务。键盘模块任
26、务通过对不同键的设置,实现分时计费,主要负责对高峰时段电价、低谷时段电价、高峰起始时间、高峰结束时间、低谷起始时间、低谷结束时间和普通电能表每度电的转数的保存记录,并以这些变量作电量计费的标准进行运算,计算出不同时段的电费,每次键盘按键中断,系统函数都会根据不同的键值调用不同的功能函数。而LCD 显示程序则是将CPU处理过后的数据相应的显示在液晶屏上。本系统的软件编程同样是按照模块设计的。首先解释本系统软件的部分全局变量。initset结构用于保存高峰时段电价、低谷时段电价、高峰起始时间、高峰结束时间、低谷起始时间、低谷结束时间和普通电能表每度电的转数。这些变量用作电量计费的标准。键盘模块有修
27、改这些变量的功能,以使智能电表系统可以适应不同环境。initset结构定义的全局变量为Set,Set将initset 结构中的变量实例化。coulometer 结构定义电能表在高峰时段使用的电量、低谷时段使用的电量和使用的总电量。coulometer结构定义的全局变量为Coulo。fee结构记录当前使用的电费,包括高峰时段使用电量的电费,低谷时段使用电量的电费和使用的总电费。fee结构定义的全局变量为Fee。在程序中由于要用到外部存储器或者IO端口的直接地址,所以利用Keil C51中绝对定址关键字_at_定义了各种外部端口和IO端口的地址。其中RAM6264定义为外部RAM 中存储的时刻的地
28、址。CommandPortOf8279为键盘控制芯片8279的命令口地址,DataOf8279定义为8279数据口的地址。CommandPortOf89C51定义为LCD接口芯片89C51的控制口地址,APortOf89C51定义为89C51的P0口地址,CPortOf89C51定义为89C51的P2口地址,但是在程序中没有直接使用P2口地址,而是通过89C51的命令口使P2口的各位分别置位来控制P2口的。全局函数Init_CPU() 和Init_89C51andLCD()用来对CPU和液晶显示模块进行初始化。Init_CPU()用于开放必要的中断允许,将T1口配置为计数器,用来检测电脉冲信号
29、。Init_89C51andLCD()将89C51的P0、P1、P2口配置成方式0输出模式。打开LCD显示并清屏。下面是系统总体程序框图,由主程序和中断服务程序组成,如图3.1和图3.2。电能表上电后执行初始化,包括将各时段、时间、日期、表号、用电数据等读入内部数据缓冲区,接着清WDT,然后检查时段是否需要更新,若需要,则转入中断处理部分。执行一系列操作后转到LCD显示程序,根据显示缓冲区的内容按要求循环显示各种电能参数,并根据相关数据处理达到从那时起计量电能的目的。当CPU对T1端的脉冲不断计数,直至计数到满一度电的时候,T1产生一个中断。CPU执行中断,首先读取MC146818的RAM的钟
30、点值,判断不同的时段。根据不同的时段将不同时段的用电量加1,计算出相应时段的电费,并计算出总用电量和总电费。NNY开始初始化时段更新?WTD清零键处理显示处理切换时段累加用电量Y图3.1 系统总程序流程图NYNNYY加峰电量加尖电量加平电量读寄存器保护现场中断加谷电量加总电量恢复现场峰时段?尖时段?平时段?返回图3.2 中断程序流程图3.1 键盘模块本系统的编码键盘每按下一个键,就中断一次。假如设置某个功能时需要按功能键B和输入数字24,就需要按键3次,键盘模块会发出3次中断申请。这样就带来一个问题:由于每次中断都是调用同一个中断函数,这样,在按下功能键B后,如何将接下来按下的2和4识别为一个
31、整数24并放入相应变量中,而不是认为按下2键是显示总电量,按下4键是显示低谷时段电费?智能识别技术的原理是在B键别按下时系统将标记一个标志位,表明B键已经被按下,然后2键被按下时,系统首先查看标志位有没有被设置,当它发现标志位已经被标记为B时,它即了解到这是一个功能设置,将2放入一个输入缓冲区,而不是显示总电量。并等待下次按键。接着4键被按下后,系统发现标志位被标记为B,它将4放入2后面的缓冲区,等待下次按键。然后结束键(本系统中为E)被按下,系统发现标志位被标记为B,又发现E为结束键,系统利用算法将缓冲区中的2和4转换为一个整数送入到相应的变量中完成设置。然后系统中的标志位被清除,以后的按键
32、回归到正常状态。系统利用智能识别技术,接受键盘输入,对内部的计费标准,如高峰电费、电表转数/KWh等进行设置7。键盘程序框图如图3.3所示:键盘中断服务程序关中断保护现场读取8279中的键码由键码转键服务子程序高峰用电量低谷用电量总用电量高峰时段电费低谷时段电费总电费设置高峰电费设置低谷电费设置高峰起始设置高峰结束按键功能系统复位开中断返回图3.3 键盘程序流程图设置低谷结束设置低谷起始键盘模块包含两个中断函数,KeyBoard和DogSniffer,KeyBoard函数用于处理键盘按键事件,每次键盘按键中断,KeyBoad函数会检查按键的键值,根据不同的键值调用不同的功能函数。DogSnif
33、fer函数为侦探狗技术的实现函数,当在键盘上按下功能键时KeyBoard函数调用WakeupDog函数,唤醒侦探狗,其实质是向T0定时器送入定时初值,并使T0开始计时。当T0每65ms定时中断一次。每次中断后系统调用中断处理函数DogSniffer,DogSniffer函数判断功能键标志是否被标记,如果功能键标志被标记,而且按键时间超过T0的100次计数,即6.5S。则DogSniffer使功能键标志复位。如果功能键标志没有被标记,则DogSniffer使T0中断计数复位。并且不在向T0送入定时初值。如果功能键标志被标记,但是T0中断计数未达100次,则将T0中断计数加1,并向T0送入定时初值
34、,开始下次定时。以下是键盘模块程序中使用的函数列表,其中NumsToArray等四个辅助算法函数在第二部分,系统整体设计中已经详细描述,这里不在说明。void DogSniffer(void) interrupt 1 using 0;void KeyBoard(void) interrupt 2 using 0;void ShowHighCoulometer(void);void ShowLowCoulometer(void);void ShowAllCoulometer(void);void ShowHighFee(void);void ShowLowFee(void);void ShowA
35、llFee(void);void Clear(void);void WakeupDog(void);void SetHighFee(uchar key);void SetLowFee(uchar key);void SetHighStart(uchar key);void SetHighEnd(uchar key);void SetLowStart(uchar key);void SetLowEnd(uchar key);uchar NumsToArray(int number,uchar Array8);void ArrayToCharacters(uchar message8;uchar
36、display832;uchar length);int ArrayToDigitalI(uchar Array8,uchar length);float ArrayToDigitalF(uchar Array8,uchar length);KeyBoard中断处理函数首先将按键的键码读入一个变量中,然后判断功能键标志WhichFunctionKey是否被作标记,如果已做标记,则进入一个switch语句,根据不同的键码,调用不同设置函数。如果WhichFunctionKey未被标记,则进入标准状态的按键处理过程,此过程通过一个switch语句决定不同的执行方式。按下05键时,为显示相关信息的操
37、作,则直接调用相关函数。按下C键时为复位语句,直接调用Clear()函数。当按下功能键6b时,首先将功能键标志WhichFunctionKey设置为相同的键码,然后唤醒侦探狗,进行设置超时探测。当下次按下按键时,由于WhichFunctionKey已被标记,会转到相应的设置函数执行。如果长时间未按下任何键,当超过侦探狗的超时时间后,侦探狗会将WhichFunctionKey标志的标记取消。ShowHighCoulometer,ShowLowCoulometer,ShowAllCoulometer和ShowHighFee、ShowLowFee、ShowAllFee两组函数用于显示coulomet
38、er和fee结构的变量中保存的高峰用电量、低谷用电量、总用电量和高峰电费、低谷电费、总电费的数值。这两组函数将内存中保存的数值转化为一个只存放单个位数字的数组,然后通过查字库NumCharacters,将单个数字的字型码送到要显示的字符缓存区里。ShowHighFee一组函数在显示时,由于内部变量为float型,在LCD上显示时比较困难,而且在计算电费时按照整数结算也是比较容易接受的选择,所以在实现时首先利用标准库中的ceil()函数将float取整,然后再转化为整型数字显示。SetHighFee、SetLowFee、SetHighStart、和SetHighEnd、SetLowStart、S
39、etLowEnd函数用于设置initset结构定义的电价、转数、高峰时段、低谷时段等变量。这些函数被调用时一般将按键信息存储在一个输入缓冲区里面。输入小数点用按键D代替,输入结束用按键E代替。当这些函数检测到一个输入结束按键时,它们将输入缓冲区的数据传递给ArrayToDigitalI或者时ArrayToDigitalF,由他们完成输入到数值的转化。然后将转化后的数值设为相应变量的当前值。做完这些工作后,这些函数将输入缓存区、缓存位置计数和WhichFunctionKey标志复位。以备下一次设置。3.1.1 键盘的中断处理函数下面简单介绍了键盘的中断处理函数,当键盘接到CPU的T1中断时,根据
40、键值的不同调用相应的处理函数。void KeyBoard(void) interrupt 2 using 0 /从外部中断INT1,工作寄存器0组uchar key;/定义键盘函数CommandPortOf8279=0x40;/键盘控制芯片8279的命令口地址key=DataOf8279;/8279的数据口地址if(WhichFunctionKey =0x06 & WhichFunctionKey = 0x0b)switch(WhichFunctionKey)/选择函数case 0x06:SetHighFee(key);/设置高锋电费break;case 0x07:SetLowFee(key)
41、;/设置低谷电费break;case 0x08:SetHighStart(key);/设置高锋起始break;case 0x09:SetHighEnd(key);设置高锋结束break;case 0x0a:SetLowStart(key);/设置低谷开始break;case 0x0b:SetLowEnd(key);设置低谷结束elseswitch(key)case 0x00:ShowHighCoulometer();/显示高锋用电量break;case 0x01:ShowLowCoulometer();/显示低谷用电量break;case 0x02:ShowAllCoulometer();/显
42、示总用电量break;case 0x03:ShowHighFee();/显示高锋电费break;case 0x04:ShowLowFee();/显示低谷电费break;case 0x05:ShowAllFee();/显示总电费break;case 0x0c:Clear();/系统复位break;case 0x0d:WhichFunctionKey=0x0d;/按键功能WakeupDog();/看门狗超时探测break;default:ShowError();/显示出错break;3.1.2 实时时钟电路MC146818A83.1.2.1 MC146818A的结构VDD:电源线,可以为3DC6V
43、;VSS:地线。信号、电源地;MOT:单片机类型选择线,当MOT接VDD时,选择Motorola总线时序;当MOT接VSS时,选择Intel类型总线,如8051、8085等;OSC1、0SC2:时间基准输人线,可接外部信号源或晶振。在时钟电路中,一般接32.768kHz的晶振;CKFS:时钟频率输出选择线,当CKFS接VDD时,CKOUT引脚输出频率为晶振频率;当CKFS接VSS时,CKOUT引脚输出频率为晶振频率的1/4;CKOUT:时钟输出线;SQW:方波输出线;AD0AD7:双向地址/数据总线;AS/ALE:地址锁存线;DS/:读信号线;R/:写信号线;:片选线;:中断请求线INT;:复
44、位信号线;PS:电源检测信号线,用来控制寄存器D的VRT位;:掉电检测线,当此线为低时,禁止访问芯片,这有利于电池供电。由于MC146818采用高速CMOS工艺,对于32.768kHZ晶振频率,当VDD为5V时,消耗电流为50uA,因此可以采用后备电池方式,以确保主电源掉电后,时钟仍正常工作。3.1.2.2 MC146818A的软件编程MC146818A时钟电路的内部地址空间如表3-1所列。对MC146818A的编程,主要是通过它的寄存器A、B、C、D设置工作状态实现的。下面着重分析这四个寄存器。(1) 寄存器A:用来确定基准频率和分频计数器的输出频率,它的格式为U1PDV2DV1DV0RS3
45、RS2RS1RS0 D7 D6 D5 D4 D3 D2 D1 D0 各位定义为:D7-U1P,只读位。”1”表示正在更新,”0”表示可读时间、闹钟和日历值。D6D5D4- DV2 DV1 DV0,可读写,不受影响,用于选择基准频率,对于32.768kHz晶振,D6D4应清零,D5置1。D3D2D1D0 - RS3RS2RS1RS0,可读写,不受影响,通过SQW引脚输出方波及中断周期。选择分频输出频率。(2) 寄存器B:用来确定更新周期、各种中断的许可、数据格式、计时方式和输出方波的许可。可读写。它的格式为:SETP1EA1EU1ESQWEOM24/12DSE D7 D6 D5 D4 D3 D2
46、 D1 D0 各位定义为:D7-SET为“0”表示允许周期更新,“1”停止周期更新,以便对时间和日历进行初始化;D6-P1E:“1”表示允许周期中断,激活;“0”表示禁止周期中断;D5-A1E:“1”表示允许闹钟中断,“0”表示禁止;D4-U1E:“1”表示允许周期更新,结束位激活 ,“0”表示禁止;D3-SQWE:“1”表示允许方波由SQW引脚输出,“0”表示禁止,并使SQW始终为低电平;D2-DM:数码格式选择。“1”选择二进制码,“0”选择十进制码;D1-12/24:小时选择,“1”表示时间单元为24小时计时,“0”表示时间单元为12小时计时,这样,地址单元4与5的最高位“0”为AM,“1”为PM;D0-DSE:夏令时允许位,“0”为禁止。表3-1 MC146818A的内部地址空间分布地址单元地址单元0秒8月1秒闹钟9年2分10寄存器A3分闹钟11寄存器B4时12寄存器C5时闹钟13寄