1 引 言
由于单片机具有简单实用、高可靠性、良好的性能价格比以及体积小等优点,已经在各个技术领域得到了迅猛发展。本文着重介绍89C52对并行接口的微型打印机的控制,以便更好地了解和掌握单片机对外部接口的一般和一些特殊功能的应用。
2 控制打印原理
89C52单片机执行程序存贮器中的程序,控制电机带动滑槽轮及蜗杆转动[1],使打印机的机头滑架左右移动,从而不断改变同一点行上的打点位置。蜗杆的转动一方面通过凸轮带动走纸机构实行走纸,另一方面驱动色带移动。电机转动时感应线圈有一个3V的正弦信号,经过整形电路后成为方波,此方波输入到89C52,经过89C52相应的指令检测此方波的变化时刻(从上升沿变到下降沿或者从下降沿变到上升沿时刻),在方波变化时刻使打印机的相应打针进行冲打,完成打印任务,同时由这个方波的变化确保各打印点之间的距离相等。当机头滑架到达最左边时,磁铁使干簧管闭合,这时单片机送出一负脉冲作为行同步信
号,使每行打印时在最左端对齐。
3 硬件组成
3.1驱动电路
用89C52的P1口的PlO~P14分别控制打印机的电机及打印针头,P3.3控制干簧继电开关,当滑架到达最左端时,电机每转一圈,干簧继电开关闭合一次,P3.3就接地一次发出一负脉冲作为同步信号,以保证打印时每行在最左端对齐。在以前众多微型打印机中,由于应用三极管的拉电流,当单片机上电复位时P1口的初始状态为输入方式,所以PlO-P17均为高电平,如果没有一个非门[2],则单片机上电复位时就会使组成功率放大器(由2个NPN管构成)的三极管导通,从而使电机转动和4个打针同时通电,这是不允许的。在这里使用灌电流足以驱动电机和打针,故不需非门,如图1所示。
电机转动时,感应线圈输出幅值为3V的正弦波,经10,11两端子送出到晶体管整形为方波后送入P3.4,P3.4检测此方波作为打印同步信号,以确保打印点之间距离相等。4只打针循环同步情况如图2所示。由图2可知:A,C打针是在方波下降到来时刻冲打,B,D打针在方波上升到来时冲打。
4只打针A,B,C,D在滑架上从左到右水平安装,间隔24个点位。在打印每行96个点时,他们同时移动。移动时,若4个打针需要连续冲打,则按A,B,C,D次序依次通电激励,每打1点,滑架右移1/4点位,4只打针打完正好移动1个点位。冲打1点行,滑架连续
移动24点位。冲打顺序如图3所示。
打印机工作时的程序如下:
u1: SETB P3.4 ;判断同步脉冲
JNB P3.4,u1 ;P3.4是上升沿吗?
ORL 90H,#FEH ;电机转动而打针不工作
JZ U2 ;累加器A为0转移
CLR P1.4 ;第4个打针开始工作
u2: LCALL U10 ;调数据的子程序
u3: SETB P3.4
JBP3.4,U3 ;P3.4是下降沿吗?
ORL 90H,#FEH
JZ U4
CLR P1.3 ;第3个打针开始工作
u4: LCALL U10
u5: SETB P3.4
JNB P3.4,U5
ORL 90H,#FEH
JZ U6
CLR Pl.2;第2个打针开始工作
u6: LCALL U10
u7: SETB P3.4
JBP3.4,U7
ORL 90H,#FEH
JZ U8
CLR p1.1; 第1个打针开始工作
u8: INC R6
RET
ui0: ... ...
... ...
3.2 基本系统
由于微型打印机的打印缓冲区一次可快速装入240个代码,如全部为汉字,则要占用RAM为240X32=7 650个字节,显然89C52内的256B[3]RAM明显不够,所以要外挂1片数据存贮器(这里用的是6116)才能满足要求。基于这些,他的基本系统由89C52芯片,27C040(27C040并不是作为程序存贮器使用,而是用来存放字库、字符),数据存贮器(6116)构成,如图4所示。
由于27C040只有1片,所以其片选线与地址锁存器(74LS373)的片选线均直接接地。同时外接的27C040的地址线A0一A7由P0口通过地址锁存器提供,A8~A15由P2口提供,A16~A18由P1.5~P1.7提供。而数据存贮器(6116)片选端CE是由89C52的P2.7控制的,当P2.7=0时则选中6116,此时89C52的P2.0~P2.2输出6116所需的高位地址,P0口输出6116的低8位地址锁存在锁存器74LS373中。若是读6116,则P0口变为输入方式,在RD为低电平时,选通6116,此时6116中相应的数据出现在PO口,再由CPU读入累加器A中。若是写,则PO口为输出,当WR为低电平时,将累加器A中出现在PO口上的数据写入6116。
3.3 89C52对打印机联络信号的控制
3.3.1 打印机的联络信号
打印机的联络信号有:STB,ACK,BUSY。STB:数据选通触发脉冲,输入。此信号上升沿时数据线上8位数据被打印机读入 机内锁存。
ACK':回答脉冲,输出。当其为"低"电平时表示数据已被接收而且打印机准备好接收下一个数据。
BUSY:"忙"信号,为状态输出线,当打印机在打印字符、执行命令期间BUSY=1,表示打印机处于"忙"状态,这时打印机通知主机,他处于"忙"之中而不能接收数据,此时主机不能使用STB信号向打印机送入新的数据字节。当打印机打完一个字符后,BUSY=0,同时他产生ACK信号通知主机,准备接收下一个数据,当主机接收到BUSY=0时,主机向打印接口输出1B到DO-D7,并发出STB低电平信号,当打印机收到STB低电平信号后,单片机在其上升沿时读入数据。其时序图[4]如图5所示。
3.3.2 89C52对联络信号实施控制的电路电路图如图6所示。
上电复位时D触发器(U1)的Q输出端为1,无论P3.0为何值,经过"或"门(6)后,BUSY=1,不接收数据。
当89C52的P2.7=0时,即有6116(数据存贮器)的CE为低电子,表示选中了6116,由图3可知当P2.7=0时,经过反相器(3)再经过"或"门(8),此时无论P3.7为何值74ALS374的片选端CE总为高电平,即没有选中,这样就保证了外部的数据与数据存贮器的数据分别进行传输与接收而不至发生混乱。从上面的分析,当P2.7=0时,表示选中了6116,而没有选中74ALS374,此时主机不应有数据送入打印机,即有BUSY=1,ACK=1,下面来看是否满足这点:当P2.7=0时,经过反相器(3)一路经D触发器(U2)的Q输出为1即ACK=1,另一路经过"或"门(8),这时无论P3.7为何值,输出总为1,再经D触发器(U1)的Q输出也为1,经"或"门(6)后,BUSY=1,显然满足要求。
当P2.7=1时,通过"非"门(3)后变为0,若此时单片机准备读取数据(即P3.7=0),他们经过"或"门(8)后,一路到74ALS374的片选端(CE),一路到D触发器(U1)的清除端,使D触发器的Q输出端为0,即有74ALS374(CLK)为0,表示74ALS374的DO~D7端已有数据(同时Q=1,即P3.5=1,这样通过检测单片机的P3.5就可知道是否有数据输入),此时若89C52的P3.0=0,经?quot;或"门(6)后输出为0,即BUSY=0,又由于P2.7经过"非"门(3)后为0,他输出到D触发器(U2)的D端,当P3.6(WR)从低电平变为高电平时使D触发器(U2)的Q输出端为0即ACK=0,这时当主机发出STB脉冲时,在STB脉冲上升沿到来时打印机开始从74ALS374中读入数据。
4 软件设计
系统控制软件主要包括:主程序、打印机是否在线的子程序、判断是何种机型的子程序、判断滑架到达最左端的子程序、读取数据的子程序和走纸与打印的子程序等,其主程序流程框图如图7所示,其他子程序由于篇幅所限,在此不再详细介绍。