打印机接口设计程序

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;中断返回

相关文档
最新文档