打印机接口设计程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8.7 中断应用举例——打印机接口设计
打印机功能:计算机的主要外围设备之一,用来把测量、运算结果或程序清单打印出来,有些打印机还可以打印表格和图形。
打印机的种类:有字符式、针式、激光、笔描和热灼式等,工作原理也各不相同,价格由100元到几万元不等,其内部由一些单片机、集成电路、机械机构和微电机等部分组成的机电一体化系统。但其与计算机接口方法基本上是相近的。
目前打印机与单片机的接口大多采用标准的Centronic打印机接口。Centronic接口的打印机一般采用:
8位数据线
和三根基本的应答控制线:、BUSY、。
为选通信号,由单片机发出,可把数据线上的
打印机数据存入打印机的缓冲区中,送满一行后启动打印机打印一行字符。BUSY表示打印机是否处于忙的状态,如它等于1(处于忙状态),则不能接受新的数据,如等于0(处于空闲状态),则可
以接收新的打印数据。是打印机完成一次打印后的应答信号。
以PP40彩色绘图打印机为例,PP40与主机的通讯接口时序如图8.1所示。如下:
图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
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才能传送一个字节数据,用查询的方法送一组数据给打印机有时需要数秒钟。这样单片机在这段时间内就不能干别的事情,有些情况是不允许的,常采用中断的方法,其工作过程如下。
主程序送第一个数据给打印机数据口,接着发选通脉冲,打印机接收处理该数据时,忙线变高,
直到处理好此数据后忙线变低,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
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;中断返回