8255A 的应用举例
作者:陆志才 文章引用自“微型计算机组成原理”(高教出版社,南开大学 2003)
点击数: 6803 更新时间:2007-2-24 0:35:43
8255A 的应用举例
1.8255A 在 PC 系列机中的应用简况
在 PC/XT 机中用一片 8255A 来做三项工作:一是管理键盘,二是控制扬声
器,第三是输入系统配置开关的状态。占用的 I/0 端口地址空间为 60H~7FH,
但实际使用 60H~63H。
在 PC/AT 机中,原 8255A 管理的功能改由其他器件实现。如键盘管理改用 I
ntel 8042 单片机实现,系统配置参数由:MCl46818 实时时钟/CMOS RAM 芯
片存储和提供。
从 8255A 的时序图可看到,8255A 的速度是比较慢的。因此,在高档微机的
主系统中未见到使用 8255A 或多功能接口芯片中集成有 8255A 逻辑的报道。但
是,在某些接口电路、单片机系统以及外部设备中还常常用到 8255A。
2.8255A 的应用举例
例 6.1 使用 8255A 从方式 0 工作 ADC、DAC 与 CPU 之间的接口。
ADC(Analog Digital Converter)即模数转换器在第四章已提到,它可将在一定范围
(一般为四种之一:0~5 V,0~10 V,-5~+5 V,-10~+10 V)内变化的直流电压
信号变换成相对应的数字量(一般为二进制,少量采用 BCD 码表示)。通常将连
续变化的物理量(如电压、电流、温度、压力、流量、速度等)称为模拟量。在实
际应用中,经常要把这些模拟量的值采集到计算机中来,以便进行相应的数据处
理或经过某种算法运算得到一个结果再去控制某种对象。要实现此目标,对于非
电模拟信号,要多一项处理,即通过传感器或变送器变成电信号(有的还需要进
行线性化处理),接下来的处理和电压模拟信号一样,通过 ADC 转换成数字,再
通过接口电路将转换数据读入 CPU。
DAC(Digital Analog Converter)即数模转换器,和模数转换器的功能正好相反,
将数字量变换成相对应的电压(或电流)。通过 DAC 计算机可实现对被控对象的
控制。DAC 和 CPU 之间也需要有一个接口。
ADC 和 DAc 早已集成化,各自有多种规格、型号,可以说名目繁多。本例中
的 ADC 和 DAC 都是最简单的,各自实现一路信号的转换,涉及到的数字量都
是 8 位的,故属 8 位转换器。这里的 ADC 和 DAC 尽管简单,但也颇具代表性。
DAC 一般只需一个控制信号,即数据选通(STB DATA)。该信号为一脉冲信号,
将数据输入线上的数据送入 DAC 内部的数据寄存器。转换数据一旦装入,经过
一段时间(一般只有几微秒或更短)的延迟,在模拟量输出端上即可产生与该数字
量相对应的电压输出。
ADC 一般都具有下列 3 个控制信号:
(1)START
启动 A/D 转换,为一脉冲信号。本例假定它是正脉冲(真正起作用的是边沿)。
(2)EOC
转换结束,为状态信号。本例假定 A/D 转换期间该信号为低电平,一旦转换
结束,就变为高电平。
(3)OE(上划线)
输出允许,低电平有效。在 A/D 转换结束后,置该信号有效,可使转换数据
通过内部的三态门出现在输出线上。
根据这两个转换器的控制和状态信号的需要,可将作为接口的 8255A 设置成
方式 0,连接如图 6.13 所示。A 口作输出口,用来输出要进行 D/A 转换的数
据;B 口作输入口,用来输入 A/D 转换结果;c 高 4 位口作输入口(仅用 PC4),
用来读:EOC 状态;C 低 4 位口作输出口,用置位/复位操作产生 D/A、A/
D 转换所需的各种控制信号。
图 6.14 所示是进行 D/A 输出及采样模拟量的流程图。采样模拟量部分的“使
PC3(OE)为低电平”一项可移到准备阶段去做,即让 ADC 的输出三态门一直为开
放状态。
下面的程序段是做一些准备工作(具体工作在注释中说明):
例 6.2 使用 8255A 以方式 1 工作作打印机与 CPU 之间的接口。
打印机是一种最基本的输出设备。打印机也名目繁多,有多种规格、型号,功
能也不尽相同。但从使用角度看,只需了解其外部特性。这里假定用的是一台简
单的字符打印机,其外部特性是:给其数据输入端送一个字符的数据(ASCII 码),
在选通输入端加一选通脉冲(负脉冲),则打印该字符,打印完毕,它发出一个响
应信号 ACK(上划线)。
打印机的速度和 CPU 相比,慢得太多。为了提高计算机的工作效率,CPU 和
打印机之间几乎都采用中断传送方式。这里用 8255A 作接口,让 A 组工作在方
式 1,连接如图 6.15 所示。这里安排 A 口为输出口,输出要打印的数据;安排
PC4 作选通输出。这样,方式设置控制字应为 10100000B(此例中 B 组未加利用,
为方便起见,控制字的低 3 位都取 0)。
方式 1 是中断传送方式,在初始化 8255A 后要将打印机所对应的中断屏蔽开放,
使 CPU 能响应 8255A 产生的中断请求。
通常,要打印的总是一个数据块,即一串字符,当然其中可包括回车符和换行
符。采用中断方式,向打印机输出字符应在中断服务程序中进行,每进入一次中
断服务程序输出一个字符,并修改地址指针,使其指向下一个要打印的字符。值
得注意的是,8255A 不能主动提出第一个中断请求,中断请求以接收到打印机的
回答信号为前提,而回答信号又需要在 CPU 向打印机输出数据之后才能产生。
那么,第一个要打印的字符如何处理?有两种方法:一是在主程序中输出第一个
字符,并修改地址指针;二是在主程序中安排一条软中断指令 INT nn(“nn”为打
印机中断所对应的中断类型号),即不通过硬件中断请求而人为进入到打印机中
断服务程序。第二种方法显得规范些,所有的打印字符都在中断服务程序中输出。
如图 6.16 所示是打印中断服务程序流程以及采用第二种方法的主流程中与打印
有关的部分。
实现这一流程,可用汇编语言,也可用高级语言。下面是用 Turbo_c 编写的中
断服务程序。其中 port_A 和 port_CMD 分别是表示 A 口地址和控制字口地址的
变量,在主程序中已定义并赋值;prt_pointer 在主程序中已定义为字符型指针,
并使其指向打印数据缓冲区,而该缓冲区已经装入待打印的数据;prt_cnt 在主程
序中已定义,作为打印字节计数器,并已赋值。
在第五章的中断服务程序举例(INT lCH 软中断)中已经提到,在 Turbo_c 中,
中断服务程序是用类型为 interrupt 的函数表示的,函数名即为中断服务程序入口
地址;保护现场和恢复现场是由 Turbo_c 编译程序自动安排的。上面的程序再次
表明了这一点。
例 6.3 使用的 8255A 以方式 2 工作作主、从 CPU 之间的接口。
随着大规模集成电路技术的发展,在一个系统中使用多个 CPU 变得越来越普
遍。在这样的系统中有一个 CPU 起主导作用,是整个系统的核心,称之为主 CP
U;其他的 CPU 处于从属地位,完成系统所分配的某个或某些任务,例如负责
某种 I/O 操作,称这些 CPU 为从 CPU。
当采用多 CPU 结构时,必须解决主、从 CPU 之间的数据传送问题。这里利用工
作在方式 2 的 8255A 作主、从 CPU 之间的接口,如图 6.17 所示(图中省略了主
CPU 以及它与 8255A 的连接)。
由于方式 2 的输入和输出都具有锁存功能,所以主 CPU 和从 CPU 之间的数据
传送可通过 8255A 的端口(A 口)中转。例如,主 CPU 要向从 CPU 传送一个字节
的数据时,先将数据送至 8255A 的端口 A,从 cPu 再从 A 口取走数据。这种操
作是异步的。
这里,主 CPU 和 8255A 之间采用中断传送方式。由于 8255A 只有一根中断求
线,所以主 CPU 响应中断后需要读状态口(c 口),来判断是输入引起的中断还是
输出引起的中断。
从 CPU 和 8255A 之间采用查询方式。当从 CPU 要读取主 CPU 发来的数据(在
A 口中),先查询 OBF(上划线)引脚信号的状态,若 OBF(上划线)有效,则
表明数据有效,再进行读操作。当从 CPU 要向主 CPU 发送数据时,先查询 IBF
引脚信号的状态,看主 CPU 是否已将上一个数据取走。
主 CPU 和 8255A 之间除了通过地址译码产生 8255A 的片选信号外,不需要其
他电路。而从 CPU 需要设置 3 个 I/O 端口:一个状态输入口,用来读 8255A
的 OBF(上划线)和 IBF 的状态;一个读数据口,用来读 8255A 的 A 口中的数
据,同时向 8255A 发响应信号 ACK(上划线);一个写数据口,用来送数据至
8255A 的 A 口,同时向 8255A 发选通信号 STB(上划线)。为此,从 CPU 需要
分配 3 个 I/O 端口地址。
注意,8255A 方式 2 的输出是三态的,从 CPU 读 A 口数据为什么还要加三态
门?这是因为,ACK(上划线)变为无效后(后沿),A 口的数据还要在 PA7~PA
O 维持 TKD 的时间,TKD 的最大值为 250 ns。如果不加三态门,则在这一段时