8.7 中断应用举例——打印机接口设计
打印机功能:计算机的主要外围设备之一,用
来把测量、运算结果或程序
打印出来,有些打
印机还可以打印#
格#和图形。
打印机的种类:有字符式、针式、激光、笔描
和热灼式等,工作原理也各不相同,价格由 100
元到几万元不等,其内部由一些单片机、集成电路、
机械机构和微电机等部分组成的机电一体化系统。
但其与计算机接口方法基本上是相近的。
目前打印机与单片机的接口大多采用
的
Centronic 打印机接口。Centronic 接口的打印机一
般采用:
8 位数据线
和三根基本的应答控制线: 、BUSY、 。
为选通信号,由单片机发出,可把数据线上的
打印机数据存入打印机的缓冲区中,送满一行后启
动打印机打印一行字符。BUSY 表示打印机是否处
于忙的状态,如它等于 1(处于忙状态),则不能
接受新的数据,如等于 0(处于空闲状态),则可
以接收新的打印数据。 是打印机完成一次打印
后的应答信号。
以 PP40 彩色绘图打印机为例,PP40 与主机的
通讯接口时序如图 8.1 所示。如下:
1/5
图 8.2 8535 与 PP40 接口电路
若打印如下两行字符: t: 32 ℃
P: 102kPa
则要把以下 ASCⅡ码送给打印机:$74(t)、
$3A(:)、$20(空格)、$33(3)、$32(2)、$6F(°)、
$43(C )、$0A(换行)、$50(P)、$3A(:)、$20(空格)、
$31(1)、$30(0)、$32(2)、$6B(k)、$50(P)、$61(a)、
$0A(换行)。
事先已将这些 ASCⅡ码放在 SRAM 中$100 开
始的单元中。
一、采用查询的方法
给打印机送数据可以采用查询的方法,单片机
每送一个数据,发选通脉冲后,打印机忙线变高,
同时接收处理该数据,完成后忙线变低,单片机查
到忙线变低后再送下一个数据。采用查询的方法程
序如下:
采用查询的方法程序如下:
.include "8535def.inc"
RESET: ldi r16,low(ramend) ;栈指针置初值
out spl,r16
ldi r16,high(ramend)
out sph,r16
2/5
ldi r16,$ff;定义 C 口为输出
out ddrc,r16
ldi r16,$01 ;定义 PD0 为输出,PD2 为输入
out ddrd,r16
sbi portd,0;先使 PD0 输出为高( )
ldi xh,$01;X 指向打印缓冲区首址
ldi xl,$00
ldi r25,18 ;要打印的字符数
loop: ld r24,x+ ;向打印机数据口送一个字符
out portc,r24
cbi portd,0 ;发选通脉冲( )
rcall t1us
sbi portd,0
rcall t1us ;延时 3us
rcall t1us
rcall t1us
loop1: sbic pind,2;等待忙线变低
rjmp loop1
dec r25 ;字节数是否发完
brne loop;没发完再发下一个
here: rjmp here
二、采用中断的方法
打印机中的微电机和机械的动作是一个慢过
程,需要几十 ms 才能传送一个字节数据,用查询
的方法送一组数据给打印机有时需要数秒钟。这样
单片机在这段时间内就不能干别的事情,有些情况
是不允许的,常采用中断的方法,其工作过程如下。
主程序送第一个数据给打印机数据口,接着发
选通脉冲,打印机接收处理该数据时,忙线变高,
3/5
直到处理好此数据后忙线变低,BUSY 的下降沿产
生一个 INT0 中断;
在中断服务子程序中再送下一个数据,发送选
通脉冲后立即返回主程序。这样,送字符和发选通
信号是在外中 0 服务子程序中完成,单片机主程序
照常执行,每送一个字符,只打断几微秒。
采用中断的方法主程序如下:
.include "8535def.inc"
.org $000
rjmp RESET
rjmp EXT_INT0
RESET: ldi r16,low(ramend);栈指针置初值
out spl,r16
ldi r16,high(ramend)
out sph,r16
ldi r16,$ff ;定义 C 口为输出
out ddrc,r16
ldi r16,$01 ;定义 PD0 输出,PD2 输入
out ddrd,r16
sbi portd,0 ;先使 PD0 输出为高
ldi r16,$02;定义 INT0 下降沿申请中断
out mcucr,r16
clr r16 ;清中断标志寄存器
out gifr,r16
ldi xh,$01;X 指向打印缓冲区首址
ldi xl,$00
ldi r25,17;要打印的字符数
ld r24,x+ ;向打印机数据口送第一个字符
out portc,r24
cbi portd,0 ;发选通脉冲( )
rcall t1us
4/5
sbi portd,0
ldi r24,$40 ;使能 INT0 中断
out gimsk,r24
sei ;开中断
here: rjmp here
采用中断的方法中断服务程序如下:
EXT_INT0:in r1,sreg;保护标志寄存器
ld r24,x+ ;向打印机数据口送字符
out portc,r24
cbi portd,0;发选通脉冲( )
rcall t1us
sbi portd,0
dec r25 ;是否发完
brne ext_int01
ldi r24,$00;发完则关 INT0 中断
out gimsk,r24
ext_int01:
out sreg,r1 ;恢复标志寄存器
reti;中断返回
5/5