设计了一款以89C52单片机为主的电能表。本电表有以下功能:1,可红外线通讯,和PC通信(用232接口),485通讯实现 远程抄表。通讯方式为国标电能表645规约。2,主要有液晶屏显示,附带了两位数码管显示,方便了软件测试时,需了解一些实时参数。3,断电后电量数据,参数数据的保存,时钟的运行。(I2C接口)4,可在电脑里随时更改此电表参数。表号,日期时间,时段(检测到分钟),自动抄表日等。
1, 硬件部分
电路组成:本电表的核心是89C52单片机,具有8KB的FLASH程序存储器,256B数据存储器。电路有六部分:1。电源电路,三组电源输出,485电源,电表电源,单片机工作电源。2。单片机电路,程序的运行包括采样AD7755脉冲、驱动I2C芯片,液晶1621芯片,数码管显示,红外载波38KHZ,通讯等。3。断电数据和时钟运行,用了PCF8563,24C02芯片。4。通讯电路,有485芯片,232芯片,红外接收芯片,红外发射管等(以多功能电能表通信规约协议)。5。显示电路,两位共阳极8段数码管,直接接在52单片机的P0,P2口,利于显示程序上的简单。1621液晶驱动,可显示8位数字等。6。普通电能表电路,电压直接通过电阻,电流用锰铜片给AD7755采样。采样脉冲送给52单片机P3.2口,用外部中断0来实现电量的检测。电表为3200转一度电,精确到0.01度。
2, 电路原理
89C52单片机是核心。此电路主要是两大内容:普通电子电能表电路,单片机电路。普通电子电能表电路就不多说了,这个网上很多的。主要说一下单片机电路。
ADE7755芯片把电量脉冲通过光耦U10送给52单片机P3.2口。当单片机采样到32个脉冲,执行中断程序,在中断程序给电量内存加一操作。当最低两位满时,请此最低两位,在给高两位内存加一,依次类推。
P3.3口为手动清零接口,在程序上是一开始检测到此脚为低,则清当前电量和表号全为零。这样做是利于在调试通讯程序和以后维护的方便。
数据的断电保存用了24C02芯片。通信SCL,SDA管脚和单片机P3.6,P3.7脚相连接。I2C协议用软件模拟实现的。
PCF8563为时钟芯片,断电后,此芯片用纽扣电池供电。芯片工作电流很小,使之时钟很长时间都不掉。8563也是I2C协议,SCL,SDA管脚和单片机P3.6,P3.7脚相连接。通信时在软件上发不的地址来区别24C02芯片。
485通讯通过光耦和52单片机的串行口连接,这样保证了程序不受通讯回路的电干扰。485是经典电路,有兴趣的朋友可以在网上查查这方面的资料。
红外通讯的关键是载波从那里来,本电表用52单片机的P1.0口来实现。P1.0口为52单片机特有的定时/计数器2。用软件上使此口不停的发出38.4KHZ载波。两个PNP三级管调制了发射信号。接收用了红外载波芯片,比较简单。
232通讯为通用的电路,在这就不细说了。
显示电路两小部分,笔者一开始用了液晶屏来驱动显示,可在调试程序时为了更了解程序一些参数,故用了两位共阳级数码管来显示。此两位数码管直接和52单片机P0,P2口连接,这样做是为了程序上的简单。(越简单越容易找到错误)液晶屏1621芯片也是用软件来驱动的,本液晶屏用了深圳精锐通电子有限公司的产品。此屏的软件驱动也很简单。P1.4口控制此屏的背景灯,P1.5口为1621芯片数据通讯线,P1.6口为时钟线,.P1.7为片选线。
电源部分分三路出去,485电源为一路,普通电子电能表一路,52单片机一路。这样做增加了一点小成本,但为了保证程序的稳定有很大作用。变压器的选择很关键,因为三路都使用同一个变压器。用的7805芯片来稳压。
3, 软件部分
软件是此表的灵魂。软件包括主程序,中断程序(电量数据,串行通讯),费率切换程序,显示程序,通讯程序, I2C协议驱动程序。 主程序—52单片机初始化。包括堆栈的分配。标志位初始化。电量,时段,表号从24C20读取。中断的参数设置,载波参数设置等
主程序的运行需显示程序,电量数据存储I2C芯片程序(需标志位变换),读取PCF8563芯片时间数据程序,费率切换程序,自动抄表日程序等。主程序就是一个循环。当有中断发生时,去到中断程序执行。具体的流程图在44.DDB工程文件中。
中断程序---电量数据,串行通讯。每当.P3.2口来32个脉冲,就执行中断电量数据程序,此中断程序优选级别最高,首选给总电量数据内存加一操作,然后检测当前费率工作状态,来确定该给那个费率(尖,峰,平,谷)电量数据加一操作。最后置电量数据标志位为零。串行通讯程序里有检测通讯数据是否是国标645规约电能表通信格式。若不是放弃此次通讯,每字节数据为偶效验。此中断程序用了52单片机很多数据存储器。
费率切换程序--- 此程序用了笔者很长时间。当时感觉和简单,做的时候感觉和棘手,不是一开始想的简单。我想棘手也许是用汇编语言来实现的。说说难的原因(也许别人感觉不难),第一,费率切换主要是找到当前时间电表应该工作在什么状态,是,尖?峰?平?谷?肯定要从时钟芯片把当前年,月,日,时,分,秒给读出来,然后和时段数据比较来确定。可问题难的是,这个时段数据不是固定的,是变化的。因为电表里时段设置是通过上位机软件来改的,这样就会发生时段不是固定的,所以费率的切换实际上是很多的变量比较。难就在这里,至少我是这样认为的。也许用C语言就很简单多了,但用汇编,那个CJNE指令用来用去是很烦的。好了,不多说了,有感兴趣的朋友可以把此源程序拿回去,慢慢消化,看看有没有更好的办法。
此程序可以在一年内划分两个时区,若你消化我的这段程序,你就不难发现实际上一年内可以划分很多时区的。但为了方便有用了两个,够用了。有个问题要说一下,此费率切换程序识别精度没有做到秒,做到了分钟。我个人认为没有必要这样做,因为到秒的话,程序上有点烦琐,而且还会有一些实时问题要在程序里做出错处理,浪费了资源。
显示程序---用液晶屏显示了当前时间,年月日,当前总电量,当前尖,峰,平,谷电量,当前费率状态,表号(为2个参数),电表常数。共计11参数显示,附带了数码管显示一个变量参数。(可以是秒,分,电量的个位或者十位等,但必须是两位。)
此11个参数显示方法为循显方式。循显就是显示第一个参数一段时间后在显示另外一个参数,直到把最后一个参数显示后在回到第一个参数显示,依次类推。此程序显示的参数和没个参数显示的时间可以增加和减少,但不能在上位机更改。只能在源程序里改。所以感兴趣的朋友可以把这段程序消化一下,使只可以在上位机改,但最好遵守645规约。因为我的通讯程序采用的方式就是此规约。此规约可以在网上找一下。
通讯程序—为国标电能表645规约方式。举例说明:上位机通过远程抄表软件抄此电表当前总电量数据。如果表号为000019861012,那么上位机抄表软件发给电表数据的格式为68 12 10 86 19 00 00 68 01 02 43 C3 9A 16。若电表当前电量为49.98度电,则电表发给上位机的数据格式为 68 12 10 86 19 00 00 68 81 06 43 C3 CB 7C 33 33 CB 16。可以看到必须是68开头的,16结束的。还有效验字节,为倒数第二个字节。效验字节为前面所有字节相加,舍弃进位后得到的字节。具体细节可以参考国标电能表645规约。
源程序上的子程序JSHOU为此通讯程序,具体的思路就是比较上位机抄表软件抄的参数(标识码)是否为此表的参数。 I2C协议驱动程序-----其实此程序在教科书说的很多,只不过加了个时钟芯片PCF8563,此芯片和24C02断电数据保存芯片是共用了52单片机P3.6和P3.7管脚。区分是采用了不同的地址确定是8563芯片还是24C02芯片。8563地址为:读0A3H,写0A2H。24C02地址为:读0A1H,写0A0H。有关PCF8563芯片的资料可在网上找一下。
本机调试用了很多时间,主要是程序上的一些错误,调试方法没有用软件仿 真。(用软件仿真总是和实际有区别的)硬件仿真用了SST89E516RD芯片。 此芯片仿真主要是成本很低。不需要买昂贵的仿真器。感兴趣的朋友在网上 可以搜一下此芯片资料,自制一个仿真器。是很简单。在这里,笔者就不多 说了。