用单片机驱动LED数码管有很多方法,按显示方式分,有静态显示和动态(扫描)显示,按译码方式可分硬件译码和软件译码之分。
静态显示就是显示驱动电路具有输出锁存功能,单片机将所要显示的数据送出后就不再管,直到下一次显示数据需要更新时再传送一次新数据,显示数据稳定,占用很少的CPU时间。动态显示需要CPU时刻对显示器件进行数据刷新,显示数据有闪烁感,占用的CPU时间多。这两种显示方式各有利弊;静态显示虽然数据稳定,占用很少的CPU时间,但每个显示单元都需要单独的显示驱动电路,使用的硬件较多;动态显示虽然有闪烁感,占用的CPU时间多,但使用的硬件少,能节省线路板空间。
硬件译码就是显示的段码完全由硬件完成,CPU只要送出标准的BCD码即可,硬件接线有一定标准。软件译码是用软件来完成硬件的功能,硬件简单,接线灵活,显示段码完全由软件来处理,是目前常用的显示驱动方式。
比较常用的显示驱动芯片有:74LS164 , CD4094+ULN2003(2803) ,74HC595+ULN2003(2803) , TPIC6B595,AMT9095B, AMT9595等许多。另外,市场上还有一些专用的LED扫描驱动显示模块如MAX7219等,功能很强,价格稍高一些。下面是一个用74LS164驱动显示的例子和一个用4094扫描驱动显示的例子
系统硬件设计 为了能够显示电梯的运行状态,电梯楼顶的主控单元与轿厢节点微处理器之间需要信号线相连。传统的电梯控制 系统C作业方式下需要的信号传输线有11根之多,这样对于现场施工很不方便,而且增加了系统的不稳定因素。为此我们设计在主控单元与节点微处理器之间采用双绞线串行通讯,这即节省了成本,又提高了传输的可*性,方便施工。 本系统主要的硬件设计是节点处单片机显示控制部分。主控单元和节点之间的通讯为标准RS-485接口。 LED显示模块控制电路如图1所示。整个电路由单片机AT89C51、列驱动电路ULN2803、行驱动电路TIP122、移位寄存器4094及附属电路组成。设计的显示界面可显示6个汉字,需要24个8×8 LED点阵模块,组成16×96的矩形点阵。由于AT89C51只有4K ROM,如何合理的安排显示内容的点阵数据及显示运行程序是需要考虑的问题。通常电梯显示的提示信息不是很多,主要有楼层显示、电梯运行状态显示、电梯故障显示等,大概需要40个左右汉字就足够了,另外还有数字,特殊图符等,总共大约需要2K的存储空间,所以4K ROM是够用的。 显示采用逐行扫描方式。单片机从内存中取出第一行需要显示的12字节点阵数据,由列点阵数据输入端P1.2口按位依次串行输入至列移位寄存器,数据输入的顺序与显示内容顺序相反。然后置行点阵选通端P1.3为1,即行移位寄存器的D为高电平,STR使能,(所有4094的OE引脚接+5V电平)则列移位寄存器中的数据同时并行输出,从而选通该行。延时一段时间后,再进行下一行点阵数据的显示。需要注意的是,每次只能选通一行数据。通过不断的逐行扫描,实现了数字或提示信息的显示。
显示程序设计 点阵数据文件的建立 根据显示要求,本系统需要的点阵数据库应包括如下几个部分:(1)楼层数字显示,这些点阵数据可以使用一些取模软件(如字模提取v2.1)获得,非常简便。为显示方便,点阵格式应为16×8。(2)电梯运行状态汉字信息显示,本字模数据取自UCDOS下的字库文件HZK16。HZK16文件的字符为16×16点阵。所有字符按照区位码从小到大升序排列。计算汉字字符首地址的公式如下:汉字首地址=((区码-1)×94+位码-1)×32。(3)特殊图形(如产品商标、箭头等)的点阵数据的提取。与(1)类似,可以先做一个BMP文件,然后用取模软件(如字模提取v2.1)获得。为了显示方便,点阵数据的格式应为n*(16×8)(箭头图形这里取16×16),不足要求的则以0数据补充。需要指出的是,为了使编程处理简单,以上的点阵数据均为横向取模。 特殊显示效果的生成 这里我们采用C51编程。C语言编程具有快捷,模块功能强大,可读性好,效率高等优点,目前很多公司的单片机产品都支持C语言开发。为了使轿厢内显示面板的显示更加醒目,形象生动,我们在程序中设计了诸如闪动、箭头移动等动态显示效果。 在电梯运行期间,显示面板上的信息应包括箭头、楼层数字显示、电梯上(下)行文字说明三部分。其中箭头可以上下滚动,显示电梯正在运行及指示电梯运行方向,当达到预定楼层时,箭头停止运行,而楼层数字则显示当前电梯所处的楼层。 电梯运行期间信息显示子程序。该子程序函数的参数说明如下:指针pt_num、pt_arr、pt_info分别指示数字、箭头、汉字信息点阵数据存储区首地址,变量num传递当前电梯所处楼层值,arr_offset为箭头点阵数据存储区的偏移量。该程序中调用的TRT(unsigned char dat )为发送1个字节数据到移位寄存器的函数。 void dis_num(unsigned char code*pt_num, unsigned char code*pt_arr, unsigned char code*pt_info ,unsigned char num, unsigned char arr_offset) { unsigned char num_dis,HS,VC, n_10,n_1; n_10=num/10; //提取楼层的个位、十位数字 n_1=num-n_10*10; for(VC=0;VC<16;VC++)//显示信息 { for(num_dis=0;num_dis<4;num_dis++)//电梯上( 下)行信息显示 { for(HS=0;HS<2;HS++) TRT(*(pt_info+VC*2+1-HS+32*(3-num_dis))); } TRT(*(pt_num+n_1*16+VC));//楼层数值个位显示 TRT(*(pt_num+n_10*16+VC));// 楼层数值十位显示 for(HS=0;HS<2;HS++)//箭头显示 TRT(*(pt_arr-n_layer+(n_layer+VC*2+1-HS)%32)); } } 然后在主程序中调用该函数。电梯层数由主控单元传送给显示面板控制器,为了使箭头能够动态显示,只需在调用时更改箭头点阵数据的偏移量即可。 {... ... n_flore=ele_floor;//获取当前电梯所处楼层值 if(ele_dir==1)//判断电梯是否电梯上行 for(n_layer=0;n_layer<16;n_layer++)//箭头图形滚动 {if(n_flore==store[1])//判断当前楼层是否变化 for(num_t=0;num_t<20;num_t++)//循环运 行,使箭头图形显示一段时间_ //NUM、ARROW_UP、ele_up分别为数字、向上箭 头、汉字信息点阵数据存储区首地址 dis_num(NUM, ARROW_UP+n_layer*2, ele_up, n_flore, n_layer*2); } ... ...}
通讯功能的实现 电梯系统主控单元与轿厢内的显示面板控制器之间采用串行通讯。其工作流程是这样的:主控单元的单片机控制器定时监测信号线的状态,如若信号线状态发生变化,则把当前的状态发给轿厢内显示模块单元。考虑到现场环境比较恶劣,通讯时有可能受到干扰,我们在设定通讯约定时做了考虑,具体通讯约定如下: 通讯时首先发通信开始标志,接着发送显示工作命令字。工作命令字包括2个字节,提供给显示面板控制器显示内容编码,如表1所示。最后对数据进行校验,发送数据校验和。然后等待接收端发回的确认信息,若确认信息正确,则该次通讯结束,否则主控单元尝试第二次发送,如果第二次仍然出错,则主控单元提示报警,同时在轿厢内的显示面板显示出错信息。该通讯规约非常简便,较好的解决了上述问题。下面给出主要的程序: 发送程序: void timer0()interrupt 1 using 1//定时监测信号线的状态 { if(t_data[1]!=P0)||t_data[2]!=P2}//判断信号线是否 变化 { t_data[1]=P0; t_data[2]=P2; chk_data=t_data[0]+t_data[1]+t_data[2]; t_data[3]=chk_data>>8; t_data[4]=(unsigned char)chk_data;//校验和 } TH0=0x4c;//重装初始值 TL0=0x00;} 相关主程序: {...... for(i=0;i<5;i++)//重装输出缓冲区 { tdata[i]=t_data[i];} for(i=0;i<5;i++)//发送数据 { SBUF=tdata[i]; while(TI==0); TI=0; } for(count=0;count<2;count++)//接收下位机发回的确 认信息 { while(RI==0); RI=0; rdata[count]=SBUF; } if(rdata[0]==0x45&&rdata[1]==0x52)//如果出现错误 再次发送 for(i=0;i<5;i++) { SBUF=tdata[i]; while(TI==0); TI=0; } ...... } 串行中断接收程序与此类似,这里不再列出。
结语 本文设计了实现电梯控制系统LED点阵显示模块的设计方案,并成功应用于实际系统。 |