摘 要:本文以89C52单片机为核心,阐述了高频开关电源监控系统液晶显示模块的设计框架,介绍了 89C52与液晶的接口电路,并以C51为开发平台,系统地介绍了用液晶显示监控系统参数的方法,并给出了相应的C51源程序,该方案已经获得应用。
关键字:高频开关电源; 监控系统; 液晶显示 C51
引言
供电电源和人们的工作、生活息息相关,一旦发生故障将导致系统瘫痪,造成局部乃至社会性的巨大影响。高频开关电源由于体积小、功率密度高、运行可靠,深受人们欢迎。常用电源系统配置若干个高频开关电源模块,(N+1)冗余并联运行,将220V交流电转换成负载所要求的直流电,电瓶并联于系统输出,正常情况下由模块输出对其充电,停电时由电瓶放电供给负载,保证其正常工作,同时切换备用油机投入发电。为此我们设计了一个以89C52单片机为核心的控制器,监控高频开关电源的工作状况,进行智能管理,包括电压调谐、电瓶管理、模块限流、故障判断及报警、参数及状态显示等。
在高频开关电源的监控系统中,使用液晶作为显示输出设备。液晶除了显示西文和数字外,还可显示汉字及各种图像,因此近年来广泛用于现代智能仪器及自动化仪表中。由于用汇编语言编写的汉字显示程序难于阅读,不同的液晶控制器与单片机的接口也不尽相同,本文着重介绍具有内藏控制器的液晶板与89C52的接口电路,并给出了显示片内汉字及片外二级汉字字库的方法和相应的C51源程序。
监控系统显示部分的主要原理
高频开关电源监控系统需要控制的参数通常有三相交流电压、模块输出电压、模块电流、电瓶电压、电瓶电流、负载电压等模拟量及电压输入正常、工作正常、风扇故障、开关机信号、风扇强迫风冷等开关量。监控的参数众多,一屏无法全部显示,因此程序框架采用树状分支结构,如图1所示。
开机初始化后,第一屏显示三个主要的参数值(交流电压、输出电压、输出电流),参数数值动态刷新显示。如果当前存在故障,则蜂鸣器报警,液晶反转闪烁显示"故障",按"确认"键可进入故障屏查看故障内容。程序设计故障内容可保存,以便于查看检修,按"清除"键可清除当前不存在的故障。若要查看系统其它信息,在第一屏按"操作"键可换屏进入主菜单选项屏,汉字反转显示以表示当前光标的位置。通过"↑
"、"↓ "键移动光标,可选择电压、电流、工作状态、参数设置等四个选项,按"确认"键可进入当前光标位置相应的选项。
电压屏又细分为直流电压、交流电压两屏;电流屏分为电源模块电流和直流电流两屏。在工作状态屏中显示当前开机的电源模块、电瓶均浮充、系统加减开关管等状态,同时可打开/关闭报警声音、查看系统参数信息等。在参数设置中,可显示修改均浮充电压、过压值、欠压值、限流值、均充时间、均充周期等十几个系统工作参数。为防止参数被随意修改,在进入参数设置前设置了密码输入屏,同时程序对参数可修改范围进行自动限幅,保证系统运行的安全性,参数值保存在串行EPROM芯片中,在其它屏下按"操作"键则返回第一屏。
图1 系统主程序框图(略)
系统参数的显示分为汉字部分和数值部分。对于数值部分,首先要将显示单元内容由十六进制转换为十进制,送到RAM中特设的四个单元(程序设计显示数值最多为四位数),然后再将这四个单元内容依次送显示。对于显示时必要的修饰,如是否带小数点,数值不以虚零开头等,只需加必要16高频开关电源监控系统的判断即可。参数修改,实际上是修改相应进制转换的四个RAM单元中的十进制内容,同时不断送显示,其中要考虑RAM单元的定位及小数点的处理。参数修改确认后,将四个RAM单元的内容经进制转换后送到相应参数单元,同时送串行EPROM芯片保存。对于汉字部分,本程序中汉字点阵直接采用汉字库,一些特殊字符则自编点阵。下面将着重介绍汉字显示部分。
监控系统显示部分的软硬件设计
图2为89C52与液晶的接口电路原理图。(略)
系统显示采用内藏T6963C液晶控制器的MGL(S)24064CCFL型液晶板(清华蓬远公司产),长240个点,宽64个点。
程序存放在89C52内部EEPROM中,89C52与液晶的接口电路不需扩展外围程序芯片,EA/VP脚接高电平。外围扩展32K静态RAM62256作为数据存储器以及扩展存放二级汉字字库的字模512K
ROM 27C4001。由于27C4001需19位地址线,而89C52只有16位地址线,因此,我们分别使用89C52的P10、P11、P12、P13为A16、A17、A18、A19。液晶、62256及27C4001的片选信号用GAL16V8对A17、A18、A19进行译码产生。其逻辑关系方程为:
液晶的接口信号包括数据D0至D7、片选CS-LCD信号、地址线A0、读信号RD、写信号WR、电源VCC、地GND、复位/RES以及对比度负压信号及背光信号等。对液晶来说,A0=0时为液晶数据口,A0=1时为液晶命令口。
下面介绍软件设计。选通LCD、62256及27C4001的函数分别为
SelectLcd()、Select62256()、Select27C4001()。具体形式如下:
void Select27C4001()
{ P13=0;}
void Select62256()
{ P13=1;P12=0;P11=0;}
void SelectLcd()
{ P13=1;P12=0;P11=1;}
对液晶的操作包括初始化程序和应用程序。液晶的数据口为DataPort XBYTE [0X0000],命令口为DataPort XBYTE
[0X0001]。对液晶进行操作时必须检查液晶是否忙。我们设计了检查液晶是否忙的函数Check-Lcd-Busy(),具体如下:
voidCheck-Lcd-Busy()
{ unsigned char data statu;
SelectLcd();
While(1)
{ statu=CmdPort;
if((statu^0==0x01)&(statu^1==0x02))break;
}
}
对液晶的初始化程序为InitLcd(),如下:
void InitLcd()
{ Check-Lcd-Busy();
DataPort=0;
Check-Lcd-Busy();
DataPort=0;
Check-Lcd-Busy();
CmdPort=0x40; /*设置文本显示区首地址*/
Check-Lcd-Busy();
DataPort=0x20;
Check-Lcd-Busy();
DataPort=0x00;
Check-Lcd-Busy();
CmdPort=0x41; /*设置文本显示区宽度,即一 行显示所占字节数*/
Check-Lcd-Busy();
DataPort=0;
Check-Lcd-Busy();
DataPort=0x08;
Check-Lcd-Busy();
CmdPort=0x42; /*设置图形显示区首地址*/
Check-Lcd-Busy();
DataPort=0x20;
Check-Lcd-Busy();
DataPort=0x00;
Check-Lcd-Busy();
CmdPort=0x43; /*或文本属性区宽度,即一行 显示所占字节数*/
Check-Lcd-Busy();
CmdPort=0xA7; /*设置光标形状=8 8*/
Check-Lcd-Busy();
CmdPort=0x80; /*设置显示方式*/
Check-Lcd-Busy();
CmdPort=0x9F; /*设置显示开关,图形、西文显 示*/
}
在液晶上显示片内自定义16 16汉字的函数为Write-CC(unsigned int x,unsigned int y,unsigned,int,CCcode)。x,y分别为液晶的横坐标与纵坐标,CCcode为所要显示的自定义16
16汉字字模表的第几个汉字,CCTAB为汉字字模表的首址。其具体函数如下:
void Write-CC(unsigned int x,unsigned int y,unsigned int CCcode)
{ unsigned int data Dsp-Ram-Addr,para;
unsigned char data Hz-Pattern-L,Hz-Pattern-R,i;
unsigned char data code * Hz-Ptr;
Select62256();
Dsp-Ram-Addr=0x0800+y*32+x; /*LCD显示缓冲区首地 址=0800H+O-Y 20H+O-X*/
Hz-Ptr=CCTAB+CCcode 32; /*计算汉字点阵首地址*/
for(i=0;i<16;i++) /*共16行*/
{ para=Dsp-Ram-Addr;
Check-Lcd-Busy();
DataPort=para&0x00FF; /*送显示指针低位*/
para=para>>8;
Lcd-Busy();
DataPort=para&0x00FF; /*送显示指针高位*/
Check-Lcd-Busy(); /*写入地址*/
CmdPort=0x24;
Hz-Pattern-L=*Hz-Ptr;
Check-Lcd-Busy();
DataPort=Hz-Pattern-L; /*送左边8个像点的汉字字*/
Check-Lcd-Busy();
CmdPort=0xC0; /*写入8个像点的汉字字模*/
Hz-Ptr++;
Hz-Pattern-R=*Hz-Ptr;
Check-Lcd-Busy();
DataPort=Hz-Pattern-R; /*送右边8个像点的汉字字*/
Check-Lcd-Busy();
CmdPort=0xC0; /*写入8个像点的汉字字模*/
Hz-Ptr++;
Dsp-Ram-Addr=Dsp-Ram-Addr+0x20;
}
}
在液晶上显示片外二级汉字字库的函数为Write-CC-EX(unsigned int x,unsigned int y,unsigned
int Chinese)。x,y分别为液晶的横坐标与纵坐标,Chinese为所要显示具体汉字。其具体函数如下:
voidWrite-CC-EX(unsigned int x,unsigned int y,unsigned int Chinese)
{unsigned int data Dsp-Ram-Addr,para;
unsigned char data i,statu,Hz-Left,Hz-Right,tmp;
unsigned long data Hz-P-Addr,t;
data unsigned char xdata *HZ-PL;
Select62256();
Dsp-Ram-Addr=0x0800+y2 0x20+x2;/*LCD显示缓冲区首地址=0800H+O-Y 20H+O-X*/
/*计算汉字点阵首地址*/
Hz-P-Addr=((Chinese>>16)&0x00FF-0xA1L);/*Chinese实际为汉字的内码,由内码计算汉字点阵首地址*/
Hz-P-Addr=Hz-P-Addr+94L*(Chinese&0x00FF-0xA1L);
Hz-P-Addr*=32L;
for(i=0;i<0x10;i++)
{ P1=(P1&0xF0)|((Hz-P-Addr&0x000FFFFFL)>>16);/*此操作已包含了选通27C4001的功能*/
Hz-PL=(unsigned int)Hz-P-Addr;
Hz-Left=*Hz-PL;/*取本行左8个像点数据*/
Hz-P-Addr=Hz-P-Addr+1;
P1=(P1&0xF0)|((Hz-P-Addr&0x000FFFFF)>>16);/*此操作已包含了选通27C4001的功能*/
Hz-PL=(unsigned int)Hz-P-Addr;
Hz-Right=*Hz-PL; /*取本行右8个像点数据*/
Hz-P-Addr=Hz-P-Addr+1;
Check-Lcd-Busy();
Para=Dsp-Ram-Addr;
DataPort=para&0x00FF;
Check-Lcd-Busy();
para=para>>8;
DataPort=para&0x00FF;
Check-Lcd-Busy();
CmdPort=0x24;
Check-Lcd-Busy();
DataPort=Hz-Left; /*写入本行左8个像点数据*/
Check-Lcd-Busy();
CmdPort=0xC0; /*且RAM地址自动加一*/
Check-Lcd-Busy();
DataPort=Hz-Right; /*写入本行右8个像点数据*/
Check-Lcd-Busy();
CmdPort=0xC0; /*且RAM地址自动加一*/
Dsp-Ram-Addr=Dsp-Ram-Addr+0x20;
}
}
在调用Write-CC(unsigned int x,unsigned int y,unsigned int CCcode)时必须自己预先定义好16
16的汉字字模。由于我们使用了P1口对LCD、27C4001、62256进行选通,因此,要特别注意SelectLcd(),Select27C4001()和Select62256()的调用情况。由于调用Write-CC(unsigned
int x,unsigned int y,unsigned int CCcode)和Write-CC-EX(unsigned int
x,unsigned int y,unsigned int Chinese)包含了函数的参数传递,而传递这些参数必须使用数据存储区62256,所以在调用Write-CC(*,*,*)和Write-CC-EX(*,*,*)之前,必须先调用Select62256()函数以保证选通62256,否则会出现无法预测的错误。
|