利用单片机分时电价系统设计 精品.docx
《利用单片机分时电价系统设计 精品.docx》由会员分享,可在线阅读,更多相关《利用单片机分时电价系统设计 精品.docx(32页珍藏版)》请在课桌文档上搜索。
1、一、课题说明随着经济的快速发展,电力需求的不断增长和能源价格的不断提升。用电紧张已经成为突出的问题摆在我们面前。而电力又不是可以储存的特殊商品,某些时段用电多,其他时段用电少。用电高峰时电力供不应求,用电低谷时又电力过剩。为了应对这样的难题,可以采用分时电价来缓解供需矛盾,提高电力利用效率。分时电价是指在不同时段采用不同电价,根据用电需求和电网负荷将每天的时间划分为用电高峰时段(6:OO22:00)和用电低谷时间段(22:00-6:00),高峰时段执行较高电价(0.8元/度),低谷时段执行较低电价(0.6元/度)。通过价格杠杆调节电力资源。从而提高电力利用效率。本设计利用单片机控制普通电能表,
2、实现分时计费的功能。本系统可以作为额外的模块安装到普通电能表,这样用户已安装的普通电能表不需要更换为新的电能表,仅仅另外安装了本系统后就可以作为一个标准的智能电能表使用。本系统实现以下功能:1、 记录高峰用电量2、 记录低谷用电量3、 记录总用电量4、 计算并记录高峰时段用电电费5、 计算并记录低谷时段用电电费6、 计算并记录总电费7、 显示高峰用电量8、 显示低谷用电量9、 显示总用电量10、 显示高峰时段用电电费11、 显示低谷时段用电电费12、 显示总用电电费13、 清除电量记录和电费记录记录和计算用电量、电费都由单片机编程完成,显示功能由单片机控制1.CD实现。相应的显示功能选项由键盘
3、按键选择。二、系统整体设计本系统的设计时将整个系统划分为多个模块,简化设计流程。同时便于团队协作,将多个任务分配给多人完成。本系统可以简单的划分为5个模块:1、光电转换模块,用于将普通电能表的转数通过光电器件转换为电脉冲,送入CPU的Tl端口。2、键盘模块,用于将按键转换为按键编码,并用中断的方式通知CPU有键被按下。3、1.CD显示模块,用于显示必要的提示信息和电量、电费的数值。4、时钟模块,为CPU模块提供精确的时刻计数5、核心控制模块,由SST公司的89C58单片机和必要的外围芯片构成,用于接受光电模块送来的电脉冲,对脉冲进行计数,将计数值转化为电量,根据由时钟模块中取得的小时,判断用电
4、的时段,计算相应时段的电量和电费,并记入总电量和电费;接受键盘的中断,根据不同的按键显示不同的功能;控制1.CD显示模块,将CPU内部的数据送到1.CD上显示,并显示必要的提示信息。各个模块的原理框图下图所示。三、各个分系统的设计原理(共7点)1、 光电转换模块用于获取普通电能表记录的用电量,在普通电能表的旋转铝盘上打一个很小的检测孔提取光脉冲。铝盘每旋转一圈,模块会检测到一个光脉冲,经光电耦合并加以整形放大后转换成电脉冲,送到CPU的Tl端用作计数触发脉冲。普通电能表的铭牌上标有每KWh多少转,其含义为电能表转数每达这一数值就是用了一度电(即IKWh).将从电能表上提取转换后的的脉冲信号送入
5、单片机的Tl端并进行计数,编程时将TI计数器的计数模值设为电能表的转数,当计数器计数溢出时就可以判断电能表已经用了一度电。测试时可以使用实验室普通的信号发生器送出脉冲信号代替电能表的转数脉冲,送入单片机的TI端。2、 键盘模块由普通的16键非编码键盘与Intel8279可编程键盘/显示接口芯片组成完整的编码键盘电路。当键盘上有键按下时Intel8279会将按键转换为键码存储在一个FIFo(FirstInFirstOut,先入先出)队列中,并向CPU申请中断。CPU得知中断以后,从Intel8279的存储区读出键码,判断相应的按键,决定执行相应的功能。3、1.CD显示模块通过8255外围接口扩展
6、芯片连接到CPUo1.CD显示模块规格为122x32像素,在显示时分为上下两行。每行占122x16个像素,设计显示8个16x16的字符。严格的说要显示8个16x16的字符,至少要128x16个像素,设计时第四个字符和的8个字符各少3个像素列,虽然少了3个像素列,但是由于像素大小极其微小,人的肉眼是很难分辨出来的。这样的设计简化了编程需要考虑的问题。上行一般显示标题、提示、出错信息等,下行一般显示数值。使用时只需要CPU通过8255芯片将显示用的字码存储在1.CD模块的内部存储区,1.CD就可以显示出相应的字符。4、 在本系统中要记录不同时段的用电量,并计算出不同时段的电费。这就需要一个比较精确
7、的时间标准,通常可以使用Motorola公司的MC146818可编程时钟芯片,将计费段的时间存储起来,在各时间段开始向单片机的INTO端口申请中断,在不同的时段使系统执行不同的计费程序。在本系统中采用课题1的电脑时钟代替,将课题1的电脑时钟附加额外功能,在整点向外部RAM区的一个存储单元写入当前的钟点。CPU在计数满一度电的时候执行中断程序,此时CPU读取外部RAM中存储的钟点,判断不同的时段。执行不同的任务。5、 功能设置智能识辨技术:本系统的编码键盘每按下一个键,就中断一次。假如设置某个功能时需要按功能键B和输入数字24,就需要按键3次,键盘模块会发出3次中断申请。这样就带来一个问题:由于
8、每次中断都是调用同一个中断函数,这样,在按下功能键B后,如何将接下来按下的2和4识别为一个整数24并放入相应变量中,而不是认为按下2键是显示总电量,按下4键是显示低谷时段电费?智能识别技术的原理是在B键别按下时系统将标记一个标志位,表明B键已经被按下,然后2键被按下时,系统首先查看标志位有没有被设置,当它发现标志位已经被标记为B时,它即了解到这是一个功能设置,将2放入一个输入缓冲区,而不是显示总电量。并等待下次按键。接着4键被按下后,系统发现标志位被标记为B,它将4放入2后面的缓冲区,等待下次按键C然后结束键(本系统中为E)被按下,系统发现标志位被标记为B,又发现E为结束键,系统利用算法将缓冲
9、区中的2和4转换为一个整数送入到相应的变量中完成设置。然后系统中的标志位被清除,以后的按键回归到正常状态。系统利用智能识别技术,接受键盘输入,对内部的计费标准,如高峰电费、电表转数KWh等进行设置。6、 功能设置超时自动复位技术:(侦探狗技术)此项技术解决一个实际应用中遇到的问题。设某人A按了键盘上的自定义设置功能键,此时系统功能键标志将被做上标记,系统处于等待设置数值状态。但此时A恰好有事离开,某人B,在不知情的情况下,按照系统的说明书按了09的数字键,以为是显示或者是相应的其他功能。但是系统认为此时输入的数值是对内部数据的设置。这样会产生两个问题:一方面,B因为按了某键而系统没有执行相应功
10、能而莫明其妙;另一方面,B可能在不知情的情况下修改了内部计费、时段等标准,导致系统工作出错。侦探狗技术能够使功能设置在6.5S后超时,然后清除系统内部的功能设置标志,使系统恢复到正常状态。7、 四大关键辅助性算法:这里要说明的几个算法都不参与硬件的驱动,完全是纯软件的算法。虽然很短小,但是简练的完成了其目的。在整个系统控制程序中的地位,不亚于其他与硬件接触的函数。是整个系统中介于外部硬件数据与CPU数据之间的核心。1)算法NUmSToAITay:这个算法的功能是,将作为第一参数传递的int型整数的各位分离,按照由高位到地位的顺序依次放入作为第二参数传递的数组中。方便其他函数使用数组中的数字,利
11、用字库得到相应的字型码。此算法中其实包含2个子算法。如传递一个整数54321到函数中,第一个子算法将54321的各位分离放入数组,但是此时得到的序列为倒序,即:数组下标0,1,2,3,4分别存放数字1,2,3,4,5。第二个子算法将数组中的元素进行倒序运算,得到需要的顺序,即:数组下标0,1,2,3,4分别存放5,4,3,2,I02)算法:ArrayToCharacters:此算法的功能是,将作为第一参数传递的,存放1位数字的数组,通过查字库,将得到的字型码按顺序放入作为第二参数传递的将要显示的字符库中。此算法运算后得到的字符库就可以送入1.CD的显示缓存区,显示出相应的图形了。此算法利用Nu
12、msToArray算法得到的数组,查找字库,产生字符库。这两个函数作为核心算法被显示电量电费等函数使用。3) 算法ArrayToDigitalI:此算法的功能是将作为第一参数传递的存放一位数字的数组,转化为一个整数返回。此算法一般用来将存放在键盘缓存区的一位数字序列转化为一个整数。其他函数利用返回的整数设置相应变量的值。此函数被设置高峰时段,电表转数等函数使用作为核心算法。4) 算法ArrayToDigitalF:此算法的功能是将作为第一参数传递的存放一位数字的小数序列数组转换为一个浮点数返回。此算法一般用来将存放在键盘缓冲区的一个小数序列转化为浮点数返回给调用函数。此算法实现时将序列以小数点
13、(系统中为D键)为轴心分成两半,每半都是一个一位整数序列,将两个序列传递给AITayTODigitall,ArrayToDigitalI返回两个整数。将小数点后面的整数转换成小数加到小数点前面的整数上完成到浮点数的转换。此函数被设置电费函数调用作为核心算法。整个系统的电路图五、系统软件设计本系统的软件编程同样是按照模块设计的。首先解释本系统软件的部分全局变量。软件的代码请参见1.S图片或者PDF。initset结构用于保存高峰时段电价、低谷时段电价、高峰起始时间、高峰结束时间、低谷起始时间、低谷结束时间和普通电能表每度电的转数。这些变量用作电量计费的标准。键盘模块有修改这些变量的功能,以使智能
14、电表系统可以适应不同环境。initset结构定义的全局变量为Set,Set将initset结构中的变量实例化。coulometer结构定义电能表在高峰时段使用的电量、低谷时段使用的电量和使用的总电量。COUlOmeter结构定义的全局变量为CoUIo。fee结构记录当前使用的电费,包括高峰时段使用电量的电费,低谷时段使用电量的电费和使用的总电费。fee结构定义的全局变量为Fee。在程序中由于要用到外部存储器或者IO端口的直接地址,所以利用KeilC51中绝对定址关键字_at_定义了各种外部端口和IO端口的地址。其中RAM6264定义为外部RAM中存储的时刻的地址。mandPortOf8279为
15、键盘控制芯片8279的命令地址,DataOf8279定义为8279数据口的地址。mandPortOf8255定义为1.CD接口芯片8255的控制口地址,APOrtof8255定义为8255的A口地址,CPortOf8255定义为8255的C地址,但是在程序中没有直接使用C地址,而是通过8255的命令口使C的各位分别置位来控制C口的。全局函数InijCPUO和Init_8255and1.CD()用来对CPU和液晶显示模块进行初始化。IniJCPUO用于开放必要的中断允许,将Tl配置为计数器,用来检测电脉冲信号。Init_8255and1.CD()将8255的A、B、C口配置成方式0输出模式。打开
16、1.CD显示并清屏。1、键盘模块程序的设计:键盘模块包含两个中断函数,KeyBoard和DogSniffer,KeyBoard函数用于处理键盘按键事件,每次键盘按键中断,KeyBOad函数会检查按键的键值,根据不同的键值调用不同的功能函数。DogSniffer函数为侦探狗技术的实现函数,当在键盘上按下功能键时KeyBoard函数调用WakeupDog函数,唤醒侦探狗,其实质是向TO定时器送入定时初值,并使TO开始计时。当TO每65ms定时中断一次。每次中断后系统调用中断处理函数DogSniffer,DogSniffer函数判断功能键标志是否被标记,如果功能键标志被标记,而且按键时间超过TO的1
17、00次计数,即6.5So则DogSniffer使功能键标志复位。如果功能键标志没有被标记,则DOgSniffer使TO中断计数复位。并且不在向TO送入定时初值。如果功能键标志被标记,但是TO中断计数未达100次,则将TO中断计数加1,并向TO送入定时初值,开始下次定时。以下是键盘模块程序中使用的函数列表,其中NumsToArray等四个辅助算法函数在第二部分,系统整体设计中已经详细描述,这里不在说明。键盘模块各函数间的调用关系图如图所示。voidDogSniffer(Void)interrupt1using0;voidKeyBoard(Void)interrupt2using0;voidSho
18、wHighCoulometer(Void);voidShow1.owCoulometer(Void);voidShowAllCoulometer(Void);voidShowHighFee(Void);voidShow1.owFee(Void);voidShowAllFee(Void);voidClear(void);voidWakeupDog(void);voidSetHighFee(ucharkey);voidSet1.owFee(ucharkey);voidSetRotateSeed(ucharkey);voidSetHighStart(ucharkey);voidSetHighEnd(
19、ucharkey);voidSet1.owStart(ucharkey);voidSet1.owEnd(ucharkey);ucharNumsToArray(intnumber,ucharArray8);voidArrayToCharacters(ucharmessage8,uchardisplay832,ucharlength);intArrayToDigitalI(ucharA11*ay8,ucharlength);floatArrayToDigitalF(ucharArray8,ucharlength);KeyBoard中断处理函数首先将按键的键码读入一个变量中,然后判断功能键标志Whi
20、chFunctionKey是否被作标记,如果已做标记,则进入一个SWitCh语句,根据不同的键码,调用不同设置函数。如果WhichFunctionKey未被标记,则进入标准状态的按键处理过程,此过程通过一个SWitCh语句决定不同的执行方式。按下05键时,为显示相关信息的操作,则直接调用相关函数。按下C键时为复位语句,直接调用CIear()函数。当按下功能键6D时,首先将功能键标志WhichFunctionKey设置为相同的键码,然后唤醒侦探狗,进行设置超时探测。当下次按下按键时,由于WhiChFUnCtiOnKey已被标记,会转到相应的设置函数执行。如果长时间未按下任何键,当超过侦探狗的超时
21、时间后,侦探狗会将WhichFunctionKey标志的标记取消。ShowHighCoulometer,Show1.owCou1ometer,ShowAllCoulometer和ShowIIighFee、Show1.owFee、ShowAllFee两组函数用于显示coulometer和fee结构的变量中保存的高峰用电量、低谷用电量、总用电量和高峰电费、低谷电费、总电费的数值。这两组函数将内存中保存的数值转化为一个只存放单个位数字的数组,然后通过查字库NumCharacters,将单个数字的字型码送到要显示的字符缓存区里。ShowHighFee一组函数在显示时,由于内部变量为float型,在1.
22、CD上显示时比较困难,而且在计算电费时按照整数结算也是比较容易接受的选择,所以在实现时首先利用标准库中的ceil()函数将float取整,然后再转化为整型数字显示SetHighFee、Set1.owFee、SetRotateSpeed、SetHighStart、和SetHighEndSet1.owStartSet1.owEnd函数用于设置initset结构定义的电价、转数、高峰时段、低谷时段等变量。这些函数被调用时一般将按键信息存储在一个输入缓冲区里面。输入小数点用按键D代替,输入结束用按键E代替。当这些函数检测到一个输入结束按键时,它们将输入缓冲区的数据传递给ArrayToDigitalI或
23、者时ArrayToDigitalF,由他们完成输入到数值的转化。然后将转化后的数值设为相应变量的当前值。做完这些工作后,这些函数将输入缓存区、缓存位置计数和WhiehFUnCtiOnKey标志复位。以备下一次设置。2、1.CD显示模块程序设计:1.CD模块部分包含下列几个函数:voidSendmandTo1.CD(ucharmand);voidDisplay_1.eft(ucharmdata);voidDisplay_Right(ucharmdata);voidDisplay_All(ucharmdata);voidDisplaySelected(ucharpagenum,ucharcolum
24、n,ucharmdata16);voidDisplayAtRow(ucharrow,ucharcolumn,ucharmdata32);voidDisplayA1.ine(ucharline,ucharmdata832);DiSPIay_All函数用于系统启动时清屏,不用作其他用途,其他任何函数都不应该调用。1.CD模块的设计思想是尽力提供一个较为容易使用的、与硬件隔离的接口给其他调用函数。这一部分的编程模型如下图所示:1.CD部分的实现与此模型相对应、SendmandTo1.CDDisplay_1.eft和DiSPlay_Right函数位于此模型中的“1.CD驱动层”中,这3个函数直接接触硬
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用单片机分时电价系统设计 精品 利用 单片机 分时 电价 系统 设计
链接地址:https://www.desk33.com/p-1424124.html