单片机与打印机的接口实践

🏠 首页 《无线电》杂志 1992年 🔗 第7期 🔗 第26页 分类:无线电技术自学经验交流 🔗 周振安 🔗

(周振安)把打印机连接到主机上,这在自行研制开发的应用系统中是常有的事。对于一个熟练的电脑工程技术人员来说,这是轻而易举的,但对众多的电子爱好者来说,当他们初次接触时,总觉隔着一层窗户纸。本文试图以8031单片机与GP16微型打印机接口为例,在简单了解GP16内部基本结构的基础上介绍8031单片机与GP16接口实践及简单打印驱动程序的设计,以期达到捅破窗户纸,进而引进门的目的。

一.GP16微型打印机的结构简介

GP16是江苏启东计算机厂开发生产的一种微型打印机,它体积小、价格便宜,适合作为智能仪器及仪表和实时控制系统的嵌入式硬拷贝输出设备,其内部结构框图如图1所示。

图1
图1 🔍原图 (849×526)

由图1可见,GP16大体由打印头、控制器(8039单片机)及EPROM(2716)等部分组成,其中打印头为4针式,每行可打印5×7点阵字符16个,打印头的4根打针完全由8039单片机控制。EPROM2716内除存放有打印机的监控程序外,还存放有打印字符库。8039通过三态锁存器(74LS373)和三态门(74LS245)与主机实现并行通信。主机执行写操作,可将命令或数据送给GP16;执行读操作,可检测GP16的现行状态。8039可以自动识别主机送来的命令或数据,执行命令并按字符代码在字符库中找到相对应的打针动作信息,驱动打印头,从而打印出所需的字符来。

二.GP16与主机的接口

GP16提供的16根接口信号线定义如下:

图2
图2 🔍原图 (895×159)

其中I/O\(_{0}\)~I/O7为8根数据线,RD-、WR-为读、写控制线,BUSY-为状态线,CS-为设备选通线。GP16可以很方便地与任何CPU的主机相连接,图2示出了GP16与8031单片机的硬件连接。

图3
图3 🔍原图 (590×394)

图2中,主机采用TD—Ⅱ型学习机。GP16的数据线及读、写线分别与TD—Ⅱ中8031的P0口及RD-、WR-对应连接。选通线CS-由TD—Ⅱ学习机的译码器74LS139的Y-3引出,其地址为6000H~7FFFH;BUSY-为GP16的状态线。当BUSY-=0时表示打印机空闲;当BUSY-=1时,表示打印机忙。BUSY-接8031的INT-1。8031可以工作在查询方式,也可以工作在中断方式。当工作在中断方式时,打印机作为中断源,当BUSY-为低(空闲)时即可申请中断,8031响应中断,将要打印的信息送给GP16,然后即转至其它服务,因此中断方式可大大节省CPU的时间。当主机工作在查询方式时,可以用查询BUSY-来判别打印机是否空闲,也可以用读语句来读取GP16的状态字节以判别打印机是否空闲(此时BUSY-线可以不接)。GP16的状态字的格式如下:

图4
图4 🔍原图 (365×63)

D0=1表示打印机处于忙状态;D0=0表示打印机处于空闲状态;D7=1表示主机送来的命令非法,GP16拒绝执行,当收到主机送来的正确命令时,D7自动清0;其它位均无定义。

由于打印机速度要远低于8031,因此查询方式占用8031的时间较多。

三.打印驱动程序的编写

1、GP16的命令格式及命令

GP16的每一命令格式占两个字节:第一字节的高4位为命令的操作码,低4位为点行数,它决定了字符行与行之间的距离。因每一个字符占5×7点阵,即一个字符占7个点行,因此点行数取值应大于或等于8。例如,当字符行距要求为3个点行时,点行数应取10,即0AH。第二字节为本打印命令的字符行数,它决定了本打印命令的有效范围。例如,行数取64H(即100),则打完100行后本命令失效,若要继续打印,需重新送打印命令。显然,设置一次打印格式,最多只能打印256行,因此,当打印行数超过256行时,需在打印过程插送打印命令。

GP16共有4条命令,即空走纸命令(操作码为1000),打印字符串命令(操作码为1001),数据打印命令(操作码为1010),图形打印命令(操作码1011)。命令的两个字节可由8031的传送语句分两次连续送至GP16,然后即可连续送打印字符了。当打满1行时,GP16自动进纸一个字符行。

2、打印程序举例

下面以打印字符串命令打印26个大写英文字母为例,给出源程序(见第35页)。虽然例子简单,但也足以说明问题。由于篇幅所限,一些较为复杂的打印驱动程序不便给出,读者可自行考虑。

字符编码表及更详细的使用说明,读者可参阅随机附带的说明书。

源程序清单

PRT: MOV DPTR,#7FFPH;GP16地址→DPTR

ACALL BUSY

MOV A, #9AH;送字符串打印命令

MOVX @DPTR,A

ACALL BUSY;查忙

MOV A, #05H;送行数

MOVX @DPTR,A

MOV R7, #41H;字符A的ASCII码→R7

PRT1:ACALL BUSY

MOV A,R7;送打印字符

MOVX @DPTR,A

INC R7

CJNE R7, #5BH,PRT1;打完否,未完继续

RET

BUSY:MOV DPTR,#7FFFH; 查忙子程序

MOVX A,@DPTR

ANL A, #81H

JNE BUSY

RET