8255A的应用举例
7 C- \. t4 B8 U( J6 Y# M! Z 1.8255A在PC系列机中的应用简况
, M7 l1 ]% b3 J1 ^$ F 在PC/XT机中用一片8255A来做三项工作:一是管理键盘,二是控制扬声器,第三是输入系统配置开关的状态。占用的I/0端口地址空间为60H~7FH,但实际使用60H~63H。
2 a/ }% a7 J" ?3 K- p2 E 在PC/AT机中,原8255A管理的功能改由其他器件实现。如键盘管理改用Intel 8042单片机实现,系统配置参数由:MCl46818实时时钟/CMOS RAM芯片存储和提供。
/ ?2 Y2 f# T' o7 b) e5 j1 N
从8255A的时序图可看到,8255A的速度是比较慢的。因此,在高档微机的主系统中未见到使用8255A或多功能接口芯片中集成有8255A逻辑的报道。但是,在某些接口电路、单片机系统以及外部设备中还常常用到8255A。
" A) y. ?( Z2 M. N
2.8255A的应用举例
% H1 H# n8 ~; |8 s6 F" ~ q0 S& Z) X例6.1 使用8255A从方式0工作ADC、DAC与CPU之间的接口。
) d/ N9 R7 |0 q* V0 Q
ADC(Analog Digital Converter)即模数转换器在第四章已提到,它可将在一定范围(一般为四种之一:0~5 V,0~10 V,-5~ 5 V,-10~ 10 V)内变化的直流电压信号变换成相对应的数字量(一般为二进制,少量采用BCD码表示)。通常将连续变化的物理量(如电压、电流、温度、压力、流量、速度等)称为模拟量。在实际应用中,经常要把这些模拟量的值采集到计算机中来,以便进行相应的数据处理或经过某种算法运算得到一个结果再去控制某种对象。要实现此目标,对于非电模拟信号,要多一项处理,即通过传感器或变送器变成电信号(有的还需要进行线性化处理),接下来的处理和电压模拟信号一样,通过ADC转换成数字,再通过接口电路将转换数据读入CPU。
/ s) k/ `5 L3 n7 p9 v- O& w. ~( M
DAC(Digital Analog Converter)即数模转换器,和模数转换器的功能正好相反,将数字量变换成相对应的电压(或电流)。通过DAC计算机可实现对被控对象的控制。DAC和CPU之间也需要有一个接口。
; Q5 S, r3 t7 p8 Z
ADC和DAc早已集成化,各自有多种规格、型号,可以说名目繁多。本例中的ADC和DAC都是最简单的,各自实现一路信号的转换,涉及到的数字量都是8位的,故属8位转换器。这里的ADC和DAC尽管简单,但也颇具代表性。
/ m+ R& X: L# T1 L DAC一般只需一个控制信号,即数据选通(STB DATA)。该信号为一脉冲信号,将数据输入线上的数据送入DAC内部的数据寄存器。转换数据一旦装入,经过一段时间(一般只有几微秒或更短)的延迟,在模拟量输出端上即可产生与该数字量相对应的电压输出。
8 W. E; f; j0 ]6 M+ E
ADC一般都具有下列3个控制信号:
! V" K$ ]6 L s2 c0 G7 b (1)START
, B7 V/ {1 f3 S 启动A/D转换,为一脉冲信号。本例假定它是正脉冲(真正起作用的是边沿)。
) M. J2 F; ?: d8 u3 o! b6 W7 z b (2)EOC
8 M& L+ ~# E8 ]9 _ 转换结束,为状态信号。本例假定A/D转换期间该信号为低电平,一旦转换结束,就变为高电平。
2 {2 v7 \4 h) _ (3)OE(上划线)
9 e2 ^# B7 q9 r. W+ E* ~
输出允许,低电平有效。在A/D转换结束后,置该信号有效,可使转换数据通过内部的三态门出现在输出线上。
* k1 J$ a1 T% A s9 A1 i' ^
根据这两个转换器的控制和状态信号的需要,可将作为接口的8255A设置成方式0,连接如图6.13所示。A口作输出口,用来输出要进行D/A转换的数据;B口作输入口,用来输入A/D转换结果;c高4位口作输入口(仅用PC4),用来读:EOC状态;C低4位口作输出口,用置位/复位操作产生D/A、A/D转换所需的各种控制信号。
6 g; a4 o0 X! f* E
图6.14所示是进行D/A输出及采样模拟量的流程图。采样模拟量部分的“使PC3(OE)为低电平”一项可移到准备阶段去做,即让ADC的输出三态门一直为开放状态。
+ w, z) c" q. F5 ~/ s$ P% W
% @, i. \) e1 A. o- M: f( p
3 |$ L' f9 p7 y8 N" b
$ |. \) L7 A# S! d9 D8 ]+ q% h* W$ n# N( e6 x1 R
! p2 \4 z8 C5 e; R4 Y: ~- t9 k
a; ]% J! ]: ]! x6 Q
9 d b$ a1 k$ T9 S% n! H5 }- q! [+ P" x5 I0 P/ N+ P! U
下面的程序段是做一些准备工作(具体工作在注释中说明):
; l5 O7 f& x; P% Y 例6.2使用8255A以方式1工作作打印机与CPU之间的接口。
2 c7 P" M7 X, S/ N$ Y/ v5 i$ _2 E 打印机是一种最基本的输出设备。打印机也名目繁多,有多种规格、型号,功能也不尽相同。但从使用角度看,只需了解其外部特性。这里假定用的是一台简单的字符打印机,其外部特性是:给其数据输入端送一个字符的数据(ASCII码),在选通输入端加一选通脉冲(负脉冲),则打印该字符,打印完毕,它发出一个响应信号ACK(上划线)。
, I1 n0 x: H! A. F% i: @4 W
打印机的速度和CPU相比,慢得太多。为了提高计算机的工作效率,CPU和打印机之间几乎都采用中断传送方式。这里用8255A作接口,让A组工作在方式1,连接如图6.15所示。这里安排A口为输出口,输出要打印的数据;安排PC4作选通输出。这样,方式设置控制字应为10100000B(此例中B组未加利用,为方便起见,控制字的低3位都取0)。
3 V! h D$ c+ B+ ^. @1 L
& J6 G* k" u7 K. e' c0 a
( M% L* g7 k: M' h' A$ O) v. \* c( M7 l& g7 z" l
" a# `$ u/ a8 M* F+ w) O, U
{6 A4 o; i9 H6 ~ 方式1是中断传送方式,在初始化8255A后要将打印机所对应的中断屏蔽开放,使CPU能响应8255A产生的中断请求。
7 `1 S5 S$ V4 o* }5 V" C
通常,要打印的总是一个数据块,即一串字符,当然其中可包括回车符和换行符。采用中断方式,向打印机输出字符应在中断服务程序中进行,每进入一次中断服务程序输出一个字符,并修改地址指针,使其指向下一个要打印的字符。值得注意的是,8255A不能主动提出第一个中断请求,中断请求以接收到打印机的回答信号为前提,而回答信号又需要在CPU向打印机输出数据之后才能产生。那么,第一个要打印的字符如何处理?有两种方法:一是在主程序中输出第一个字符,并修改地址指针;二是在主程序中安排一条软中断指令INT nn(“nn”为打印机中断所对应的中断类型号),即不通过硬件中断请求而人为进入到打印机中
2 w5 r% }; d( i( _断服务程序。第二种方法显得规范些,所有的打印字符都在中断服务程序中输出。如图6.16所示是打印中断服务程序流程以及采用第二种方法的主流程中与打印有关的部分。
; N% ]4 l* Y e
/ b' g6 V/ T8 i4 J- l5 j; W
1 J0 Z6 C: f- Y& j( }. j/ S, ^
5 V' x0 H5 W8 D) S7 z a/ b7 s5 p3 E6 U4 h, G! c/ \
# @1 t" I) A1 W/ t/ ?- W2 t
实现这一流程,可用汇编语言,也可用高级语言。下面是用Turbo_c编写的中断服务程序。其中port_A和port_CMD分别是表示A口地址和控制字口地址的变量,在主程序中已定义并赋值;prt_pointer在主程序中已定义为字符型指针,并使其指向打印数据缓冲区,而该缓冲区已经装入待打印的数据;prt_cnt在主程序中已定义,作为打印字节计数器,并已赋值。
# q" m% W7 u3 G/ y1 u
, C1 ^5 p$ v3 q4 _
$ c2 h _% G B1 y
! l% L* y' X$ r" Z9 J. p$ \
( {, m; a' T+ U' ?3 m
! L3 u( Z. d: V1 r! p 在第五章的中断服务程序举例(INT lCH软中断)中已经提到,在Turbo_c中,中断服务程序是用类型为interrupt的函数表示的,函数名即为中断服务程序入口地址;保护现场和恢复现场是由Turbo_c编译程序自动安排的。上面的程序再次表明了这一点。
/ ^% T+ o( H* s' d. a7 s 例6.3使用的8255A以方式2工作作主、从CPU之间的接口。
: @6 `; G- D# B$ u- P
随着大规模集成电路技术的发展,在一个系统中使用多个CPU变得越来越普遍。在这样的系统中有一个CPU起主导作用,是整个系统的核心,称之为主CPU;其他的CPU处于从属地位,完成系统所分配的某个或某些任务,例如负责某种I/O操作,称这些CPU为从CPU。
7 C" l5 H2 g1 R) N/ {# R* y: ^
当采用多CPU结构时,必须解决主、从CPU之间的数据传送问题。这里利用工作在方式2的8255A作主、从CPU之间的接口,如图6.17所示(图中省略了主CPU以及它与8255A的连接)。
$ u9 D6 e7 P8 A- A3 M3 ]$ |: `1 {) b
由于方式2的输入和输出都具有锁存功能,所以主CPU和从CPU之间的数据传送可通过8255A的端口(A口)中转。例如,主CPU要向从CPU传送一个字节的数据时,先将数据送至8255A的端口A,从cPu再从A口取走数据。这种操作是异步的。
( x- K& y( B/ Q! G8 }1 A3 b3 q; O
这里,主CPU和8255A之间采用中断传送方式。由于8255A只有一根中断求线,所以主CPU响应中断后需要读状态口(c口),来判断是输入引起的中断还是输出引起的中断。
2 }+ N0 f3 C+ T* Y7 ~: Z% T. q, B
从CPU和8255A之间采用查询方式。当从CPU要读取主CPU发来的数据(在A口中),先查询OBF(上划线)引脚信号的状态,若OBF(上划线)有效,则表明数据有效,再进行读操作。当从CPU要向主CPU发送数据时,先查询IBF引脚信号的状态,看主CPU是否已将上一个数据取走。
8 J E& L; b; J
主CPU和8255A之间除了通过地址译码产生8255A的片选信号外,不需要其他电路。而从CPU需要设置3个I/O端口:一个状态输入口,用来读8255A的OBF(上划线)和IBF的状态;一个读数据口,用来读8255A的A口中的数据,同时向8255A发响应信号ACK(上划线);一个写数据口,用来送数据至8255A的A口,同时向8255A发选通信号STB(上划线)。为此,从CPU需要分配3个I/O端口地址。
* ^7 w( S& G% k, t7 r9 }; [, D
5 @8 ~ g: w- g6 J* l: ?. M
, @0 P. u# I7 j# D4 a& k; ?2 I
' }+ m8 c( Q1 g. A) F) ~3 Y8 L3 w/ {& V1 l1 a: r
2 ]/ r* R! f: S g/ \ 注意,8255A方式2的输出是三态的,从CPU读A口数据为什么还要加三态门?这是因为,ACK(上划线)变为无效后(后沿),A口的数据还要在PA7~PAO维持TKD的时间,TKD的最大值为250 ns。如果不加三态门,则在这一段时间内从CPU不能利用数据总线进行其他操作。由于从CPU对A口的操作是双向的,所以这里的三态门也应是双向的。对该双向三态门的允许控制以及方向控制,读者可自行分析。
4 H& }* k9 E! B4 r6 a& C3 p 在这个例子中,对主CPU来说,8255A是可编程接口芯片,所以要对它进行设置;而对从CPU来说,8255A仅起一台外设的作用,操作这台外设需要设置3个端口。