You are on page 1of 224

2.

3 基本接口模块
2.3.1 可编程并行接口芯片 8255A

2.3.2 可编程定时器 / 计数器芯片


8253

2.3.3 可编程串行接口芯片 8251A

2.3.4 可编程中断控制器 8259A

1
I/0 接口可分为不可编程和可编程两类。

不可编程 I/O 接口的典型芯片是三态缓冲器(如


74244 、 74245 )和数据锁存器(如 7473 、 74374 ),功能是总
线隔离和增强总线的负载能力。

输入设备经三态缓冲器与 CPU 数据总线相接; CPU 输出数据到


外设时,选通输出锁存器,总线上的数据进入锁存器,此后不管
总线上的数据(锁存器输入端)如何变化,只要没有再次使相应
锁存器的选通信号有效,锁存器的输出端就一直保持最后锁存的
信息不变,从而实现数据保持,以供外设同步处理。

微机系统在设计时通常要考虑一定的灵活性、适用性,因此可编
程 I/O 接口应用得较多。可编程 I/O 接口可进一步分为通用接
口(如定时 / 计数器 8253 、中断控制器 8259 、串行接口芯片
8251 、并行接口芯片 8255 等)和专用接口(如软盘控制器 8271
和 8272 、 CRT 接口芯片 8275 、键盘及显示接口芯片 8279
等)。
2
2.3.1 可编程并行接口芯片 8255A

并行通信
是把一个字符的各数位用几条线同时进行传输,传输速
度快,信息率高,但比串行通信用的电缆多,因此,并
行通信通常用于传输距离较短(几米至几十米),数据
传输率较高的场合。
并行接口
实现并行通信的接口。
可编程并行接口芯片 8255A
是 Intel80 系列微处理器的配套并行接口芯片,它可以
为 8086/8088CPU 与外设之间提供并行输入 / 输出的通
道。可通过软件编程设置芯片的工作方式。

3
2.3.1 可编程并行接口芯片 8255A
8086/8088 的 I/O 组织
I/O 接口:主机与外界交换信息称为输入 / 输出 (I/O) 。
通常把介于主机和外设之间的一种缓冲电路称为 I/O
接口电路,简称 I/O 接口 (Interface) 。
I/O 接口的作用?
对于主机, I/O 接口提供了外部设备的工作状态及数据;对于外部
设备, I/O 接口记忆了主机送给外设的一切命令和数据,从而使主
机与外设之间协调一致地工作。

CPU 与外设间的交换信息: 1 .数据信息; 2. 状态信息; 3. 控制信


息 CPU 通过接口和外设交换信息时,只能用输入指令 (IN) 和
输出指令 (OUT) 传送数据,所以状态信息、控制信息也是被作为数
据信息来传送的,即把状态信息作为一种输入数据,而把控制信息
作为一种输出数据,这样,状态信息和控制信息也通过数据总线来
传送。但在接口中,这三种信息是在不同的寄存器中分别存放的。
I/O 接口的基本结构

DB
数据端口

AB 译 I/O
CPU 状态端口 设


CB
控制端口

每个接口电路中都包含一组寄存器, CPU 与外设进行信息交换时,各类


信息在接口中存入不同的寄存器,一般称这些寄存器为 I/O 端口,简称为
口 (Port) 。 [ 端口( port) 是接口电路中能被 cpu 直接访问的寄存器的地
址 ] 。 Cpu 通过这些地址即端口向接口电路中的寄存器发送命令,读取
状态和传送数据。
对输入 / 输出数据起缓冲作用的数据寄存器称为数据端口;
用来存放外设或者接口部件本身状态的状态寄存器称为状态端口;
用来存放 CPU 发往外设的控制命令的控制寄存器称为控制端口。
2.3.1 可编程并行接口芯片 8255A
1 8255A 的引脚与结构 PA3
PA2
1
2
40
39
PA4
PA5
8255A 的引脚 PA1 3 38 PA6
PA0 4 37 PA7
8255A 是可编程的并行输入输出接 RD 5 36 WR
口芯片,它具有三个 8 位并行端口 CS 6 35 RESET
GND 7 34 D0
(A 口、 B 口和 C 口 ) ,具有 40 个 A1 8 33 D1
引脚,双列直插式封装,由 +5V 供 A0 9 32 D2
10 31 D3
电( VCC )。 PC7 8255A
PC6 11 30 D4
PC5 12 29 D5
D7 ~ D0 PA7 ~ PA0 PC4 13 28 D6
A口 8 PC0 14 27 D7
WR A组
PC7 ~ PC4 15 26 VCC
C口 PC1
RD 4
PC2 16 25 PB7
A0 8255A 17 24
PC3 PB6
PC3 ~ PC0
A1 C口 PB0 18 23 PB5
4
CS B组 PB1 19 22 PB4
PB7 ~ PB0
B口 8 PB2 20 21 PB3
RESET

6
2.3.1 可编程并行接口芯片 8255A

A 、 B 、 C 三个端口各有 8 条端口 I/O 线:


PA7∼PA0 , PB7∼PB0 和 PC7∼PC0 ,共 24 个引
脚,用于 8255A 与外设之间的数据 ( 或控制、状态信
号 ) 的传送。
D7∼D0 : 8 位三态数据线,接至系统数据总
线。 CPU 通过它实现与 8255 之间数据的读出与写
入,控制字的写入,以及状态字的读出等操作。
A1∼A0 :端口选择信号。 A1 和 A0 经片内译码产生
四个有效地址分别对应 A 、 B 、 C 三个独立的数据
端口以及一个公共的控制端口。在实际使用
中, A1 、 A0 端接到系统地址总线的 A1 、 A0 。
当 A1A0=00 ,选择端口 A ;当 A1A0=01 ,选择端口
B ;当 A1A0=10 ,选择端口 C ;当 A1A0=11 ,选择
公共的控制端口;三态数据线:高电平、低电平、高阻态
(处于高阻状态,总线在逻辑上与所有连接负载断开)

7
2.3.1 可编程并行接口芯片 8255A

-CS :片选信号,低电平有效,由
CPU 输入,通常由高位地址码
( A15~A2 )译码得到。 -CS 有效表
示该 8255A 被选中。
读写控制信号 -RD 和 -WR :低电平
有效,由 CPU 输入,用于决定 CPU
和 8255A 之间信息传送的方向:当 -
RD=0 时,由 8255A 向 CPU 传送数
据或状态信息;当 -WR=0 时,由
CPU 向 8255A 写控制字或数据。
RESET :复位信号,由 CPU 输入,
高电平有效, RESET 有效时,清除
8255A 中所有控制寄存器内容,并将
A 、 B 、 C 三个端口都置为输入方
式。

8
2.3.1 可编程并行接口芯片 8255A
8255A 各端口的读写操作控制
CS RD WR A1 A0 操作

0 1 0 0 0 写端口 A

0 1 0 0 1 写端口 B

0 1 0 1 0 写端口 C

0 1 0 1 1 写控制寄存器

0 0 1 0 0 读端口 A

0 0 1 0 1 读端口 B

0 0 1 1 0 读端口 C

0 0 1 1 1 无操作

9
2.3.1 可编程并行接口芯片 8255A
8255A 的内部结构
A 组 A组
控制部件 端口 A PA7 ~ PA0
(8)

A组
端口 C PC7 ~ PC4
(高4位)
内部 DB ( 8 )
数据总线 外设
CPU D7 ~ D0
缓冲器
B组
端口 C PC3 ~ PC0
(低4位)
WR
RD
读/写
A1 控制逻辑 B组
A0 B 组
端口 B PB7 ~ PB0
RESET 控制部件
(8)
CS

10
2.3.1 可编程并行接口芯片 8255A
(1) 并行输入输出端口 A 、端口 B 和端口 C
端口 A 、端口 B 和端口 C 都是 8 位端口,可以选择作为输入
或输出。还可以将端口 C 的高 4 位和低 4 位分开使用,分别
作为输入或输出。当端口 A 和端口 B 作为选通输入或输出的
数据端口时,端口 C 的指定位与端口 A 和端口 B 配合使用,
用做控制信号或状态信号。
(2)  A 组和 B 组控制部件
端口 A 与端口 C 的高 4 位( PC7∼PC4 )构成 A 组,由 A
组控制部件实现控制功能;端口 B 和 C 口的低 4 位
( PC3∼PC0 )构成 B 组,由 B 组控制部件实现控制功能;

(3) 数据总线缓冲器
一个 8 位三态数据缓冲器, 8255A 通过它与系统数据总线相
连,实现 8255A 与 CPU 之间的数据传送。输入数据、输出数
据、 CPU 发给 8255A 的控制字等都是通过该部件传递的。

11
2.3.1 可编程并行接口芯片 8255A

(4) 读 / 写控制逻辑
读 / 写控制逻辑电路的功能是负责管理 8255A 与 CPU 之间的数
据传送过程。它接收 -CS 及地址总线的信号 A1 、 A0 和控制总
线的控制信号 RESET 、 -WR 、 -RD ,将它们组合后,得到对
A 组控制部件和 B 组控制部件的控制命令,并将命令送给这两个
部件,再由它们控制完成对数据、状态信息和控制信息的传送。

12
2.3.1 可编程并行接口芯片 8255A
2 8255A 的工作方式与控制字
8255A 的工作方式
8255A 在使用前要先写入一个工作方式控制字,以指定
A 、 B 、 C 三个端口各自的工作方式。 8255A 共有三种工作方
式:
 方式 0—— 基本输入输出方式,即无须联络就可以直接进行
8255A 与外设之间的数据输入或输出操作。端口 A 、 B 、
C 口的高、低四位均可工作于方式 0.
 方式 1—— 选通输入输出方式,此时 8255A 的 A 口和 B 口
与外设之间进行输入或输出操作时,需要 C 口的部分 I/O
线提供联络信号。端口 A 、 B 可工作于方式 1 。
 方式 2—— 双向输入输出方式,即同一端口的 I/O 线既可以
输入也可以输出,只有 A 口可工作于方式 2 。
端口 A 可处于三种工作方式(方式 0 ,方式 1 ,方式 2 ),端口 B 可处于两
种工作方式(方式 0 ,方式 1 ),端口 C 常常被分成高 4 位和低 4 位两部
分,可分别用来传送数据或控制信息。 13
2.3.1 可编程并行接口芯片 8255A
8255A 的控制字(定义工作方式控制字和 C 口置位 / 复位控制
字)
(1) 工作方式选择控制字
8255A 的工作方式可由 CPU 写一个工作方式选择控制字到
8255A 的控制端口实现。可以分别选择端口 A 、端口 B 和
端口 C 上下两部分的工作方式。注意 8255A 工作方式选择控
制字的最高位 D7( 特征位 ) 应为 1 。

14
2.3.1 可编程并行接口芯片 8255A

例:两片 8255A ( J1 , J2 )接口芯片初始化


1 )如果要求 J1 的各个端口处于如下工作方式:
端口 A 方式 0 ,输出;
端口 B 方式 0 ,输入;
端口 C 的高四位 输出;
端口 C 的低四位 输入。
于是, J1 的方式选择控制字代码如图所示,方式选择控制字为
83H 。
2.3.1 可编程并行接口芯片 8255A

例:两片 8255A ( J1 , J2 )接口芯片初始化


2 )要求 J2 的各个端口处于如下工作方式:
端口 A 方式 0 ,输入;
端口 B 方式 1 ,输出;
端口 C 的高四位 输出;
端口 C 的低四位 配合端口 B 工作(已由方式 1 决定),
可任意为 1 或 0 ,此处设为 0.
于是, J2 的方式选择控制字应如图所示,即 J2 的方式选
择控制字为 94H 。
2.3.1 可编程并行接口芯片 8255A
例: J1 , J2 8255A 接口芯片的端口名称,端口地址如表所
示。

利用下面 6 条指令就可以为 J1 , J2 这两个 8255A 设置方式选择控


制字(它们的控制口地址分别为 00E6H 和 00EEH )。
MOV AL,83H
MOV DX,00E6H ; 对第 1 片 8255A 设置方式选择控制字
OUT DX,AL

MOV AL,94H
MOV DX,00EEH ;对第 2 片 8255A 设置方式选择控制字
OUT DX,AL
2.3.1 可编程并行接口芯片 8255A
(2)  C 口置位 / 复位控制字
当端口 A 定义为方式 1 或方式 2 或将端口 B 定义为方式 1 时,要求使用端
口 C 的某些位作控制用,这时需要一个置位 / 复位控制字对控制端口 C 的
各位进行置位 / 复位操作。
8255A 的 C 口按位置位 / 复位控制字的最高位 D7( 特征位 ) 应
为 0D。 D2 D0
7 D6 D5 D4 D3 D1
特征位 × × × PC 口位选择 位操作

D7=0 标 无关位 000 PC0 0 复位


明是 C 001 PC1 1 置位
口位操
010 PC2
作控制 例如::
字 011 PC3
• 使端口 C 的 PC4 置
100 PC4 位的控制字为
101 PC5 00001001B(09H)
110 PC6 • 使 PC4 复位的控制
111 PC7 字为
00001000B(08H)
18
2.3.1 可编程并行接口芯片 8255A

例如:
要求对端口 C 的 PC7 位置 1 ,则控制字为 00001111B ,即
0FH ;而端口 C 的 PC3 要求置 0 ,则控制字为
00000110B ,即 06H 。

设 8255A 的控制口地址为 00EEH


则下面的程序段可以实现上述要求。

MOV AL,0FH ; 对 PC7 置 1 的控制字


MOV DX,00EEH
OUT DX,AL
MOV AL,06H ; 对 PC3 置 0 的控制字
OUT DX,AL
2.3.1 可编程并行接口芯片 8255A

方式 0—— 基本输入输出方式


方式 0 无须联络就可以直接进行 8255A 与外设之间的数据
输入或输出操作。它适用于无须应答 ( 握手 ) 信号的简单的
无条件输入 / 输出数据的场合,即输入 / 输出设备始终处于
准备好状态。
在此方式下, A 口、 B 口、 C 口的高 4 位和低 4 位可以分
别设置为输入或输出,即 8255A 的这四个部分都可以工作
于方式 0 。
 输入或输出的定义是相对于 8255A 芯片而言的。当数
据从外设送往 8255A 时为输入,反之,数据从 8255A
送往外设则为输出。

20
2.3.1 可编程并行接口芯片 8255A

方式 0—— 基本输入输出方式

1 0 0 X X 0 X X
如果三个端口均处于工作方式 0 ,则可由工作方式控制字定义 16 种
工作方式的组合。此时, CPU 与三个端口之间交换数据可以直接
由 CPU 执行 IN 或 OUT 指令来完成。

21
2.3.1 可编程并行接口芯片 8255A

方式 0 也可以用于查询方式的输入或 A口
输出设备
输出接口电路,此时端口 A 和 B 分别
作为一个数据端口,而用端口 C 的某 PC1 选通
些位作为这两个数据端口的控制和状
态信
息。 PC7 准备好
☞ 例如右图就是一个 A 口和 B 口工 8255A

PC6 准备好
在方式 0 时利用 C 口某些位作为联络

号的接口电路。在此例中将 8255A 设
PC0 清除
置为: A 口输出, B 口输入, C 口高
4
位输入 ( 现仅用 PC7 、 PC6 两位输入
B口
1 0 0 0 1 0 1 0
外 输入设备
设的状态
D
7 D 6 D ) ,
5 D C 口低
4 D 4 位输出
3D 2 D ( 现仅
1 D 0


特征 A 方式 A 方向 PC ~ 方向 B 方式 B 方向 PC ~ 方向
7 4 3 0

PC1 、 PC0 两位输出选通及清除信 22


2.3.1 可编程并行接口芯片 8255A
☞ 其工作原理是:在向输出设备 A口 输出设备
送数据前,先通过 PC7 查询设备
状态,若设备准备好则从 A 口送
选通
出数据,然后通过 PC1 发选通信 PC1
号使输出设备接收数据。从输入
设备取数据前,先通过 PC6 查询 准备好
设备状态,设备准备好后,再从 PC7
B 口读入数据,然后通过 PC0 发 8255A
清除信号,以便输入后续字节。 准备好
PC6
方式 0 用于查询方式与后面介
绍的选通输入输出方式 ( 方式 清除
1) 和选通双向输入输出方式 PC0
( 方式 2) 相比,方式 0 的联络
信号线可由用户自行安排 ( 方
式 1 和方式 2 中使用的 C 口联 B口 输入设备
络线是已定义好的 ) ,且只能
用于查询,不能
实现中断。
23
2.3.1 可编程并行接口芯片 8255A
方式 1—— 选通输入输出方式:这种工作方式下,数据输入
输出操作要在选通信号控制下完成
与方式 0 相比,它的主要特点是当 A 口、 B 口工作于方式 1 时, C 口的
某些 I/O 线被定义为 A 口和 B 口在方式 1 下工作时所需的联络信号线,
这些线已经定义,不能由用户改变。
( 1 )采用工作方式 1 进行输入操作时,需要使用的控制信号如下:
1 ) -STB :选通信号。由外设送给 8255A ,低电平有效
-STB 有效时,将外部输入的 8 位数据锁存到所选端口的输入锁存器。对于 A 组来说,指定端口
C 的 PC4 用来接收向端口 A 输入的 STB 信号;对于 B 组来说,指定端口 C 的 PC2 位用来接收向
端口 B 输入的 -STB 信号。
2 ) IBF :输入缓冲器满信号,向外部输出,高电平有效
IBF 有效时,表示由输入设备输入的数据已占用该端口的输入锁存器,它实际是对 -STB 信号的
回答信号,待 CPU 执行 IN 指令时, -RD 有效,将输入数据读入 CPU ,其后沿将 IBF 置 0 ,表
示输入缓冲器已空,外设可继续输入后续数据。对 A 组来说,指定端口 C 的 PC5 作为从端口 A
输出的 IBF 信号;对 B 组来说,指定端口 C 的 PC1 作为从端口 B 输出的 IBF 信号。
3 ) INTR :中断请求信号,向 CPU 输出,高电平有效
A 组和 B 组向 CPU 发中断请求信号。 A 组的 INTRA 通过 PC3 送出; B 组的 INTRB 通过 PC0
送出。 24
2.3.1 可编程并行接口芯片 8255A

方式 1—— 选通输入输出方式:


8255A 中的端口 A 和端口 B 均可工作于工作方式 1 完成输
入操作功能。
( 1 )当端口 A 和 B 同时被定义为方式 1 完成输入操作
时,端口 C 的 PC0~PC5 被用作控制信号,只有 PC7 和 PC6
位可用来完成数据输入或输出操作,因此实际上构成两种
组合状态: 方式 1 输
1 )端口 A 、 B 输入, PC7 和 PC6 输 入
PC4 STB
入; A组 PC5 IBF
2 )端口 A 、 B 输入, PC7 和 PC6 输 PC3 INTR
出。
中断允许或屏蔽( C 口置位或复位操
作): PC2 STB
1 ) A 端口( PC4 ) =1 处于中断允许; B组 PC1 IBF
=0 ,处于中断屏蔽状态; PC0 INTR
2 ) B 端口( PC2 ) =1 处于中断允许;
=0 ,处于中断屏蔽状态; 25
2.3.1 可编程并行接口芯片 8255A

方式 1—— 选通输入输出方式


( 2 )采用工作方式 1 进行输出操作时,需要使用的控制信号如下:

1 ) -OBF :输出缓冲器满信号。向外部输出,低电平有效; 8255A-> 外设


-OBF 有效时,表示 CPU 已将数据写入该端口正等待输出。当 CPU 执行 OUT 指令, -WR
有效时,表示将数据锁存到数据输出缓冲器,由 -WR 的上升沿将 -OBF 置为有效。对于 A 组
来说,指定端口 C 的 PC7 用来作为从端口 A 输出的 -OBF 信号;对于 B 组,指定端口 C 的
PC1 位用作从端口 B 输出的 -OBF 信号。
2 ) -ACK :外部应答信号。由外部输入,低电平有效;外设 ->8255A
-ACK 有效时,表示外部设备已经收到由 8255A 输出的 8 位数据,它实际是对 -OBF 信号的
回答信号。对 A 组来说,指定端口 C 的 PC6 用来接收向端口 A 输入的 -ACK 信号;对 B 组
来说,指定端口 C 的 PC2 用来接收向端口 B 输入的 -ACK 信号。
3 ) INTR :中断请求信号,向 CPU 输出,高电平有效; 8255A->CPU
A 组和 B 组向 CPU 发中断请求信号。 A 组的 INTRA 通过 PC3 送出; B 组的 INTRB 通过
PC0 送出。

26
2.3.1 可编程并行接口芯片 8255A

方式 1—— 选通输入输出方式:


8255A 中的端口 A 和端口 B 均可工作于工作方式 1 完成输
出操作功能。
( 2 )当端口 A 和 B 同时被定义为方式 1 完成输出操作
时,端口 C 的 PC6 , PC7 和 PC3~PC0 被用作控制信号,只
有 PC4 和 PC5 位可用来完成数据输入或输出操作,因此实
际上构成两种组合状态: 方式 1 输
1 )端口 A 、 B 输出, PC4 和 PC5 输 出PC ACK
6
入; A组 PC7 OBF
2 )端口 A 、 B 输出, PC4 和 PC5 输 PC3 INTR
中断允许或屏蔽(
出。 C 口置位或复位操
作): PC2 ACK
1 ) A 端口( PC6 ) =1 处于中断允许; B组 PC1 OBF
=0 ,处于中断屏蔽状态; PC0 INTR
2 ) B 端口( PC2 ) =1 处于中断允许;
=0 ,处于中断屏蔽状态; 27
2.3.1 可编程并行接口芯片 8255A

方式 1—— 选通输入输出方式


( 3 )端口 A 输入,端口 B 输出
当被定义为方式 1 端口 A 输入,端口 B 输出时,端口 C 的
PC5~PC0 被用作控制信号,只有 PC6 和 PC7 位可用来完成
数据输入或输出操作,这又构成两种组合状态:
1 )端口 A 输入,端口 B 输出, PC6 和 PC7 输入;

2 )端口 A 输入,端口 B 输出, PC6 和 PC7 输出。

28
2.3.1 可编程并行接口芯片 8255A

方式 1—— 选通输入输出方式


( 4 )端口 A 输出,端口 B 输入
当被定义为方式 1 端口 A 输出,端口 B 输入时,端口 C 的
PC6 和 PC7 , PC3~PC0 被用作控制信号,只有 PC4 和 PC5
位可用作数据输入 / 输出用,这又构成两种组合状态:

1 )端口 A 输出,端口 B 输入, PC4 和 PC5 输入;

2 )端口 A 输出,端口 B 输入, PC4 和 PC5 输出。

29
2.3.1 可编程并行接口芯片 8255A
(1) A 口和 B 口均输入 A口
A 组工作方式控制字:
PA7 ~PA 0
A 口方式 1 ,输入 (PC4)
PC5~3 用于 A 口的联络信号
PC4 STBA
PC6 和 PC7 工作于方式 0 ,输入 / 输出 INTEA
由 D3 位决定, =1 输入; =0 输出 PC5 IBFA
D7 D6 D5 D4 D3 D2 D1 D0 &
1 0 1 1 1/0 × × ×
PC3 INTRA

RD PC7, PC6 I/O

B口
B 组工作方式控制字: PB7 ~PB0
B 口方式 1 ,输入 (PC2)
PC2~0 用于 B 口的联络信号 PC2 STBB
INTEB
D7 D6 D5 D4 D3 D2 D1 D0 PC1 IBFB
1 × × × × 1 1 × &

PC0 INTRB
1011 ? 11 RD

X 30
2.3.1 可编程并行接口芯片A口
8255A
(2) A 口和 B 口均为输 A口
PA ~PA 7 0
A 组工作方式控制字: (PC6)
A 口方式 1 ,输出 PC6 ACK A
PC7 、 PC6 、 PC3 用于 A 口的联络信号 INTEA
PC5 和 PC4 工作于方式 0 ,输入 / 输出由 D3 位 PC7 OBFA
决定
D7 D6 D5 D4 D3 D2 D1 D0 &
1 0 1 0 1/0 × × ×
PC3 INTRA
WR PC4, PC5 I/O
B口

B 组工作方式控制字: PB7 ~PB0


B 口方式 1 ,输出 (PC2)
PC2~0 用于 B 口的联络信号 PC2 ACK B
INTEB
D7 D6 D5 D4 D3 D2 D1 D0 PC1 OBFB
1 × × × × 1 0 × &

WR PC0 INTRB
1010 ? 10
X 31
2.3.1 可编程并行接口芯片 8255A
(3) 混合输入与输出 - 方式 1A 口输入 B 口输出
在实际应用中, 8255A 端口 A 和端口 B 也可能出现一个端口工
作于方式 1 输入,另一个工作于方式 1 输出的情况。

PA7 ~PA 0
工作方式控制字
RD PC4 STBA
D7 D6 D5 D4 D3 D2 D1 D0 PC5 IBFA
1 0 1 1 1/0 1 0 × PC3 INTRA
8255A

PB7 ~PB0
A 口输入 B 口输出 PC2 ACKB
PC1 OBFB
PC0 INTRB
WR
1011 ?10X PC6,PC7 I/O
PC6 和 PC7 工作于方
式 0 ,输入 / 输出
由 D3 位决定, =1 输 方式 1A 口输入 B 口输出
入; =0 输出
32
2.3.1 可编程并行接口芯片 8255A
(4) 混合输入与输出 - 方式 1A 口输出 B 口输入
PA7 ~PA 0
工作方式控制字 WR PC7 OBFA
D7 D6 D5 D4 D3 D2 D1 D0 PC6 ACKA
1 0 1 0 1/0 1 1 × PC3 INTRA
8255A

PB7 ~PB0
A 口输出 B 口输入 PC2 STBB
PC1 IBFB
PC0 INTRB
RD
PC4,PC5 I/O

1010 ?11X

PC5 和 PC4 工作于方式 方式 1A 口输出 B 口输入


0 ,输入 / 输出由 D3 位
决定。 =1 ,输入; =0
输出
33
2.3.1 可编程并行接口芯片 8255A

8255A 中的端口 A 和 B 工作在方式 1 时,可构成 8 种不同的


状态

端口 C 的低四位总是作控制用,而高四位中总是保持有两位仍然可作数据输入
/ 输出用,因此控制字中的 D0 位可为任意值,由 D1 , D3 , D4 位的不同取值构
成八种不同的状态组合方式。(也允许 A/B 口为方式 0 ,与另一端口的方式 1
配合工作)
2.3.1 可编程并行接口芯片 8255A
方式 2—— 选通双向输入输出方式
选通双向输入输出方式,即同一端口的 I/O 线既可以输入也
可以输出,只有 A 口可工作于方式 2 。此时 C 口有 5 条线
(PC7∼PC3) 被规定为联络信号线。剩下的 3 条线
(PC2∼PC0) 可以作为 B 口工作于方式 1 时的联络线,也可
以独立工作于方式 0 。 PA7 ~PA 0

≥1 PC3 INTR

工作方式控制字 &
PC7 OBF
D7 D6 D5 D4 D3 D2 D1 D0
1 1 × × 1/0 1/0 1/0 1/0 (PC6) PC6 ACK
INTE1
& (PC4) PC4 STB
RD
INTE2 PC5 IBF
WR I/O
PC2 ~PC0

35
3 8255A 编程及应用实例
例:编一初始化程序,使 8255A 的 PC5 端输出一个负跳
变。如果要求 PC5 端输出一个负脉冲程序又怎样的?控制
口地址为 83H 。
PC5 端输出一个负脉冲
PC5 端输出一个负跳变
MOV AL , 0BH ; PC5 置 1-
MOV AL , 0BH ; PC5 置 1- >AL
>AL MOV DX , 83H ;控制口地址
MOV DX , 83H ;控制口地址 OUT DX , AL
OUT DX , AL MOV AL , 0AH ; PC5 置 0-
MOV AL , 0AH ; PC5 置 0- >AL
>AL OUT DX , AL
OUT DX , AL MOV AL , 0BH
D7 D6 D5 D4 D3 D2 D1 DXD,
0
MOV AL
特征位 × × × PC 口位选择 位操作

1 0 1
2.3.1 可编程并行接口芯片 8255A
8255A 初始化编程
设 8255A 的 A 口工作方式 1 输出,
B 口工作方式 1 输入, PC4 和 PC5 输入,禁止 B 口中断。设
片选信号 CS 由 A9∼A2=10000000 确定。
( 1 )根据题意,设计接口电路。
( 2 )试编写程序对 8255A 进行初始化。
2.3.1 可编程并行接口芯片 8255A
8255A 初始化编程
设 8255A 的 A 口工作方式 1 输出,
B 口工作方式 1 输入, PC4 和 PC5 输入,禁止 B 口中断。设
片选信号 CS 由 A9∼A2=10000000 确定。
( 1 )根据题意,设计接口电路。
( 2 )试编写程序对 8255A 进行初始化。
工作方式选择控制字: 1010 1110

38
2.3.1 可编程并行接口芯片 8255A
初始化程序:
MOV AL , 10101110B ;控制字送 AL
MOV DX , 1000000011B; 8255A 控制字寄存器地址送 DX
OUT DX , AL ;控制字送 8255A 的控制寄存器
MOV AL , 00001101B ; PC6 置 1 ,允许 A 口中断( A 出, PC6 )
OUT DX , AL
MOV AL , 00000100B ; PC2 置 0 ,禁止 B 口中断( B 入 , PC2 )
OUT DX , AL
00 : A 口; 01 : B
工作方式控制字 口; 10 : C 口;
11 :控制口
D7 D6 D5 D4 D3 D2 D1 D0
1 0 1 0 1 1 1 ×

A口 A口 B口 任
方式 1 输出 输入 意

控制字 PC4 、 PC5 输 B口


特征位 入 方式 1

39
2.3.1 可编程并行接口芯片 8255A
利用 8255A 对按键进行查询输入
设图中 8255A 的 A 口和控制寄存器的地址分别为 80H 和
83H ,试编写 8255A 的初始化程序。

40
2.3.1 可编程并行接口芯片 8255A
 依题意初始化 8255A 的 A 口为方式 0 、输入:
MOV AL , 10010000B ;控制字送 AL
MOV DX , 83H ; 8255A 控制字寄存器地址送 DX
OUT DX , AL ;控制字送 8255A 的控制寄存器
按键状态输入:
MOV DX , 80H ; 8255A 端口 A 地址送 DX
IN AL , DX ;按键状态输入在 AL
工作方式控制字

D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 1 × × × ×

A口 A口 任 任
方式 0 输入 意 意

控制字 任 任
特征位 意 意

41
8255 与简单开关量输入输出控制
实验硬件连接
8255 编程例 1
情形 1
code segment
start: mov al,80H
out 83H,al
mov al,83H
out 82H,al
hlt
code ends
end start

1000 , 0011 ;对应的 C 口的第 1 , 2 和 8 个发光二极管



43
情形 2

code segment
start: mov al,81H
out 83H,al
mov al,83H
out 82H,al
hlt
code ends
end start

1000 ,10011 ;对应的


AM1 AM0C 口的第 8 个发光二极管亮
AIO CHIO BM BIO CLIO
44
8255 编程例 2
code segment delay proc
start: mov al,80H push cx
out 83H,al mov cx,0010H
mov al,01H dly: loop dly
lp: out 82H,al pop cx
call delay ret
ror al,1 delay endp
jmp lp code ends
end start

二极管: PC0-PC7-PC6-PC5-……
1 AM1 AM0 AIO CHIO BM 依次循环顺序点亮
BIO CLIO
45
8255 编程例 3

code segment
start: mov al,90H
out 83H,al
in al, 80H
out 82H,al
jmp start
code ends
end start

读 A 口的开关状态,将 A 口开关状态输出到 C 口去
1 AM1 AM0 AIO CHIO BM BIO CLIO
46
8255 与简单开关量输入输出控制

code segment
start: mov al,90H
out 83H,al
in al, 80H
not al
out 82H,al
jmp start
code ends
end start

读 A 口的开关状态,将 A 口开关状态取反输出到 C 口去
1 AM1 AM0 AIO CHIO BM BIO CLIO
47
8255 与简单开关量输入输出控制

8255 编程例 4
数码显示

48
8255 与简单开关量输入输出控制

将十进制数字( 0~9 )翻译成七段显示码的译码表,如下:

十进制数 七段显示码

a g f e d c b a 十六进制

f b
0 0 0 1 1 1 1 1 1 3FH
g 1 0 0 0 0 0 1 1 0 06H
2 0 1 0 1 1 0 1 1 5BH
e c 3 0 1 0 0 1 1 1 1 4FH
4 0 1 1 0 0 1 1 0 66H
d 5 0 1 1 0 1 1 0 1 6DH
6 0 1 1 1 1 1 0 1 7DH
7 0 0 0 0 0 1 1 1 07H
8 0 1 1 1 1 1 1 1 7FH
9 0 1 1 0 1 1 1 1 6FH
8255 与简单开关量输入输出控制

一位数码管显示的试验连线。
B 口输出对应的数码管依次循环显示 0~9 A 口: 0640H ;
B 口: 0642H ;
data segment 控制口: 0646H ;
digit db 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH
data ends ;数字 0~9
code segment inc bx
assume cs:code, ds:data cmp bx,10
start: mov ax,data jc lp2
mov ds,ax jmp lp1
mov al,80H 0 , B 、; C 口方式 delay proc
; A 口方式

mov dx,0646H0 出 push cx


out dx,al mov cx,0050H
mov si,offset digit dly: loop dly
lp1: mov bx,0 pop cx
lp2: mov al,[bx+si] ret
mov dx,0640H; A 口出 delay endp
out dx,al code ends
call delay end start
51
8255 与简单开关量输入输出控制
8255 与简单开关量输入输出控制
TD-PITE 8255 基本 I/O 实验
实验内容 1
使 8255 端口 A 工作在方式 0 并作为输入口,端
口 B 工作在方式 0 并作为输出口。用一组开关信
号接入端口 A ,端口 B 输出线接至一组数据灯
上,然后通过对 8255 芯片编程来实现输入输出功
能。

53
8255 与简单开关量输入输出控制
实验步骤
1 )按图连接试验线路图;

54
8255 与简单开关量输入输出控制
实验源程序
A 口: 0640H ;
Light.asm B 口: 0642H ;
控制口: 0646H ;
CODE SEGMENT
DELAY PROC
ASSUME CS:CODE PUSH CX
START:MOV DX, 0646H MOV CX, 0F00H
MOV AL, 90H AA2: PUSH AX
OUT DX, AL POP AX
AA1: MOV DX, 0640H LOOP AA2
IN AL, DX POP CX
CALL DELAY RET
MOV DX, 0642H DELAY ENDP
OUT DX, AL CODE ENDS
JMP AA1 END START
A 口读入的按键状态输出到与 B 口连接的 LED 灯上,控制其开关
55
安装 Wmd86
5.0.exe 为随机
软件安装程序

2 )编写汇编程
序,经编译、
链接无误后载
入系统;显示
“加载程序”
3 )点
击“ RUN” 运
行程序,拨动
开关,观察
LED 显示,验
证程序功能。

56
57
TD-PITE 8255 流水灯实验
实验内容 2
使 8255 的 A 口 和 B 口 均 为 输 出 , 数 据 灯
D7~D0 由左向右,每次仅亮一个灯,循环显示,
D15~D8 与 D7~D0 正相反,由右向左,每次仅点
亮一个灯,循环显示。

58
实验源程序 Light2.asm A 口: 0640H ;
B 口: 0642H ;
控制口: 0646H ;
CODE SEGMENT
ASSUME CS:CODE
START:MOV DX, 0646H CALL DELAY
MOV AL, 80H JMP AA1
OUT DX, AL
DELAY PROC
MOV BX, 8001H PUSH CX
AA1: MOV DX, 0640H MOV CX, 0F000H
MOV AL, BH AA2: LOOP AA2
OUT DX, AL POP CX
ROR BH, 1 RET
DELAY ENDP
MOV DX, 0642H
MOV AL, BL CODE ENDS
OUT DX, AL END START
ROL BL, 1
59
数据灯 D7~D0 由左向右,每次仅亮一个灯,循环显示, D15~D8 与
D7~D0 正相反,由右向左,每次仅点亮一个灯,循环显示。

60
更多的 8255 简单 I/O 编程练习
练习 1

每次亮相邻两盏灯,按照 C 口 PC0 , PC1-> PC1 , PC2->


PC2 , PC3…… 循环顺序点亮
61
练习 2

每次亮相邻两盏灯,按照 C 口 PC0 , PC1-> PC2 , PC3->


PC4 , PC5-…… 循环顺序点亮
62
练习 3

交替点亮
63
练习 4

1 , 3 , 5 , 7 , 8 , 6 , 4 , 2 顺序循环依
次点亮
64
8255 与步进电机控制
步进电机控制技术
步进电机
一种将电脉冲信号转换为角位移的机电式数模转换器,也称
脉冲电机。在开环数字程序控制系统中,常采用步进电机作
为输出控制手段 / 驱动元件。
 步进电机控制线路接收计算机发来
的指令脉冲,控制步进电机作相应
的转动,所谓步进,就是指每给步
进电机一个脉冲,步进电机各绕组
的通电顺序就改变一次,即电机转
动一次。
 控制脉冲频率,可以控制电机转
速;
 改变脉冲顺序,改变步进电机转
向。
 角位移或线位移量与脉冲数成正
比。
65
步进电机常用术语
 步进电机由定子和转子组成。
 定子:由硅钢片叠成的,定子上有 6 大
磁极,每 2 个相对的磁极(N, S )组
成一对,共有 3 对。
 转子:由软磁材料制成,其外表面也均
匀地分布着齿。
工作拍数 N :转动一个齿距角时
换相次数。
转子齿数 Z :
对于三相步进电机而言, 齿距角:相邻两齿中心线间的夹
工作方式有单三拍,双三 角
拍和三相六拍之分。三拍  Z  2 / Z
就是转动一个齿距角时换 步距角:每给一个电脉冲信号电
相三次,六拍是换相六
次。
动机转子所应转过的角度的理论

   Z / N  2 / NZ
66
例 : 某四相八拍步进电机转子齿数为 8 ,问步距角为多
少?齿距角为多少?需要多少拍才能使电机旋转一周?
1 )齿距角:相邻两齿中心线间的夹角

 Z  2 / Z  360 / 8  45
2 )步距角:每给一个电脉冲信号电动机转子所应转过的角度的理论值

   Z / N  2 / NZ  360 / 8  8  5.625
3 )拍数:指电机转过一个齿距角所需脉冲数。 8 拍指的是转过一个
齿距角需要 8 次脉冲;转子齿数为 8 个,一周有 8 个齿距角,因此,
需要 64 拍才能使电机转一周。

θ=360 度 /( 转子齿数 Z* 运行拍数 N) ,以常规转子齿为 50 齿的四相步进


电机为例,四拍运行时步距角为 θ=360 度 / ( 50*4 ) =1.8 度(俗称整
步),八拍运行时步距角为 θ=360 度 / ( 50*8 ) =0.9 度(俗称半步)。
步进电机动态指标及术语:
步距角精度:步进电机每转过一个步距角的实际值与理论值的误
差。 = 误差 / 步距角 *100% 。
失步:电机运转时运转的步数,不等于理论上的步数。称之为失
步。
失调角:转子齿轴线偏移定子齿轴线的角度,电机运转必存在失调
角,由失调角产生的误差,采用细分驱动是不能解决的。
最大空载起动频率:步进电机在空载的情况下,不失步起动所能允
许的最高频率。在有负载情况下,不失步起动所允许的最高频率将
大大降低。
运行矩频特性与动态转矩:步进电机正常运转时,若输入脉冲的频
率逐渐增加,则电动机所能带动的负载转矩将逐渐下降。如图所示
矩频特性曲线(下降曲线)。矩频特性描述电机稳定运行时输出转
矩与控制脉冲频率之间的关系。

68
步进电机控制技术

步进电机的工作就是步进转动。在一般的步进电机工作中,都是
以脉冲电流来驱动。要使步进电机转动,就必须对步进电机定子
的各相绕组以适当的时序进行通电。

三相反应式步进电机,定
子的每一相都有一对磁
极,每个磁极都只有一个
齿,即磁极本身。故三相
步进电机有三对磁极共 6
个齿;其转子有四个齿,
分别称为 0 , 1 , 2 , 3
齿。直流电源 U 通过开关
A , B , C 分别对步进电
机的 A , B , C 相绕组轮
流通电。

69
 初始状态时,开关 A 接通,则 A
相磁极和转子的 1 , 3 号齿对齐,
同时转子的 2 , 4 号齿与 B , C
相磁极形成错齿状态。
 当开关 A 断开, B 接通,由于 B
相绕组和转子的 2 , 4 号齿之间的
磁力线作用,使得转子的 2 , 4 号
齿和 B 相磁极对齐,则转子的
1 , 3 号齿就和 A , C 相磁极形
成错齿;
 此后,开关 B 断开, C 接通,由
于 C 相绕组和转子 1 , 3 号齿之
间的磁力线作用,使得转子 1 , 3
号齿和 C 相磁极对齐,这时转子的
2 , 4 号齿和 A , B 相绕组磁极
产生错齿;
 当开关 C 断开, A 接通后,由于
A 相绕组磁极和转子 2 , 4 号齿之
间的磁力线作用,使转子 4 , 2 号
齿和 A 相绕组磁极对齐,这时转子
的 1 , 3 号齿和 B , C 相绕组磁
70
步进电机控制技术

 如果对一相绕组通电的操作称为 1
拍,则对 A , B , C 三相绕组轮流
通电需要 3 拍。对 A , B , C 三相
绕组轮流通电一次称为一个周期。该
例中,三相步进电机转动一个齿距角
需要三拍操作。
例 1 :该三相步进电机若采用
三拍方式,则它的步距角为

   Z / N  2 / NZ  360(
/ 3  4) 30
例 2 :如果转子有 40 个齿且用三拍方式的步进
电机,则它的步距角为
/ 3  40) 3
   Z / N  2 / NZ  360(
71
对一相绕组通电的操作称为 1 拍,三拍指转动一个齿距角时换相三次;六拍指转
动一个齿距角时换相六次。

三相步进电机工作方式
单三拍
各相通电顺序为: A→B→C→A→ …
双三拍
各相通电顺序为: AB→BC→CA→AB→ …
三相六拍
各相通电顺序为: A→AB→B→BC→C→CA→A→ …
 选用不同的工作方式可使步进电机具有不同的工作性能。双相通电
时,在通电换接时,总有一相通电,所以,工作比较平稳。
 除了三相步进电机,还有四相、五相、六相等多种。多相通电方式
能提高输出转矩。所以,功率较大的步进电机多采用多于三相的励
磁绕组,且多相通电。

72
第1 第2 第3 第1 第2 第3 第1 第2 第3 第4 第5 第6
拍 拍 拍 拍 拍 拍 拍 拍 拍 拍 拍 拍
A 1 0 0 A 1 0 1 A 1 1 0 0 0 1
B 0 1 0 B 1 1 0 B 0 1 1 1 0 0
C 0 0 1 C 0 1 1 C 0 0 0 1 1 1
单三拍: A→B→C→A→ 双三拍: 三相六拍: A→AB→B→BC→C→CA→A→
AB→BC→CA→AB→
不同工作方式下各相通电的电压波形
A

B

C

A 双
B 三
C 拍

A
三相
B 六拍
C
73
步进电机接口示例
X 轴步进电机输出字表
ADX Data
CBA
ADX[1] 0000,0001=0x01
ADX[2] 0000, 0011=0x03
ADX[3] 0000, 0010=0x02
ADX[4] 0000, 0110=0x06
ADX[5] 0000, 0100=0x04
ADX[6] 0000, 0101=0x05
PA0 、 PA1 、 PA2 通过驱动控制 X 轴步进电 Y 轴步进电机输出字表
机; ADY Data
PA4 、 PA5 、 PA6 通过驱动控制 Y 轴步进电
机; ADY[1] 0001,0000=0x10
数据输出 1 时通电, 0 断电,三相六拍的控制方 ADY[2] 0011,0000 =0x30
式输出字表如右表。
第1 第2 第3 第4 第5拍 第6拍 ADY[3] 0010,0000 =0x20
拍 拍 拍 拍 ADY[4] 0110,0000 =0x60
A 1 1 0 0 0 1
ADY[5] 0100,0000 =0x40
B 0 1 1 1 0 0
ADY[6] 0101,0000 =0x50
C 0 0 0 1 1 1
三相六拍: A→AB→B→BC→C→CA→A→ 74
单四拍 双四拍: 四相八拍:
A→B→C→D→A → AB→BC→CD→DA→AB → A→AB→B→BC→C→CD→D→DA →A
第 第 第 第 第 第 第 第 第 第 第 第 第 第 第 第
1 2 3 4 1 2 3 4 1 2 3 4 5 6 7 8
拍 拍 拍 拍 拍 拍 拍 拍 拍 拍 拍 拍 拍 拍 拍 拍
A 1 0 0 0 A 1 0 0 1 A 1 1 0 0 0 0 0 1
B 0 1 0 0 B 1 1 0 0 B 0 1 1 1 0 0 0 0
C 0 0 1 0 C 0 1 1 0 C 0 0 0 1 1 1 0 0
D 0 0 0 1 D 0 0 1 1 D 0 0 0 0 0 1 1 1

不同工作方式下各相通电的电压波形
A
B
C
D

A
B
C
D

A
B
C
D
单四拍

步进电机基本实验 A→B→C→D→A →
第 第 第 第
1 2 3 4

单四拍
拍 拍 拍 拍
A 1 0 0 0
B 0 1 0 0
CODE SEGMENT C 0 0 1 0
D 0 0 0 1
START:MOV AH,11H
WAIT: IN AL,PORTA
TEST AL,10000000B DEALY PROC
;由 PA7 控制 MOV CX,0020H
JZ WAIT DLY: LOOP DLY
MOV AL,AH RET
AND AL,OFH DELAY ENDP
OUT PORTB, AL
; B 口低四位输出控制步进电机 CODE ENDS
ROL AH,1 END START
CALL DELAY
JMP WAIT
步进电机基本实验 双四拍
需要多少拍才能使电机旋转一周?

双四拍:
AB→BC→CD→DA→AB →
第 第 第 第
1 2 3 4
拍 拍 拍 拍
A 1 0 0 1
B 1 1 0 0
C 0 1 1 0
D 0 0 1 1

拍数:指电机转过一个齿距角所需脉冲数。 4 拍指的是转过一个齿距角需要
4 次脉冲。图示转子齿数为 8 个,因此,需要 32 拍才能使电机转一周。
步进电机基本实验
四相八拍
需要多少拍才能使
电机旋转一周?

四相八拍:
A→AB→B→BC→C→CD→D→DA →A

第 第 第 第 第 第 第 第
1 2 3 4 5 6 7 8
拍 拍 拍 拍 拍 拍 拍 拍
A 1 1 0 0 0 0 0 1
B 0 1 1 1 0 0 0 0
C 0 0 0 1 1 1 0 0
D 0 0 0 0 0 1 1 1

四相八拍指的是转过一个齿距角需
要 8 次脉冲( 8 拍)。图示转子齿
数为 8 个,因此,需要 64 拍才能
使电机转一周。
TD-PITE 步进电机控制实验

XD0~XD15: 系统数据线
XA1~XA20: 系统地址线

8255A : A 口方式 0 输入; B 口方式 0 输出。用 PB0~PB3 来驱动控制四相


步进电机;控制字为: 90H

79
数据输出 1 时通电, 0 断电,四相八拍的控制方式输出字表如下

四相八拍:
A→AB→B→BC→C→CD→D→DA →A

四相八拍方式输出字表

01H , 03H , 02H , 06H , 04H , 0CH , 08H


, 09H
系统总线单元

开关及 LED 显示单


8255A 单元
驱动电路 元
实验 1: 采用四相八拍方式控制
步进电机正转

;四相八拍方式输出字表

A 口: 0600H ;
B 口: 0602H ;
控制口: 0606H ;

; 8255A 初始化,送控制字到控制口
MOV AL,0
A1: LEA BX, TABDT
XLAT
MOV DX,0602H
OUT DX,AL
CALL DALLY
INC AL
LOOP A1
DALLY PROC NEAR

DALLY ENDP
汇编程序经过编译、链接,无误后,加载,点击“ RUN” 运行。
实验 2: 采用四相八拍控制方法,实现交替正转和反转。

dx

A 口: 0600H ;
B 口: 0602H ;
控制口: 0606H ;
实验 3 :采用双四拍控制方法,
由拨动开关( K7 )控制步进电
机正转和反转。

双四拍:
AB→BC→CD→DA→AB → 输出字表

03H , 06H , 0CH , 09H


用 PB0~PB3 来驱动控制步进电机
OUT 的八位 A 口: 0600H ;
只用低四位 B 口: 0602H ;
控制口: 0606H ;
2.3.2 可编程定时器 / 计数器芯片 8253

实现定时的方法有三种:软件定时、不可编程的
硬件定时和可编程的硬件定时。
软件定时是通过让机器执行一段没有具体操作目的的程序来实现
的。由于 CPU 执行每条指令都需要一个确定的时间,因此,只要选
择适当的指令和安排适当的循环次数就很容易实现软件定时,但软
件定时占用 CPU 资源,降低了 CPU 的利用率;
不可编程的硬件定时尽管定时电路并不很复杂,但这种定时电路在
硬件连接好以后,定时值和定时范围不能由程序来控制和改变,使
用不灵活;
可编程定时器 / 计数器是为方便计算机系统的设计和应用而研制
的,定时值及其范围可以很容易地由软件来控制和改变,能够满足
各种不同的定时和计数要求,因此得到了广泛的应用。

86
2.3.2 可编程定时器 / 计数器芯片 8253
1 8253 的结构与功能
8253 的引脚
8253 是 24 脚双列直插式芯片,用 +5V 电源供电。芯片内
有三个相互独立的 16 位定时 / 计数器。 8253 最高计数速率
为 2.6MHz 。

D7 1 24 VCC D7~D0 CLK 0


D6 2 23 WR #0 GATE0
D5 3 22 RD WR OUT0
D4 4 21 CS 8253
D3 5 20 A1 RD CLK 1
D2 6 19 A0
8253 #1 GATE1
D1 7 18 CLK 2
A0 OUT1
D0 8 17 OUT 2
CLK 0 9 16 GATE 2 A1
OUT0 10 15 CLK 1 CLK 2
GATE 0 11 14 GATE 1 CS #2 GATE2
GND 12 13 OUT 1 OUT2

87
2.3.2 可编程定时器 / 计数器芯片 8253
(1) 数据引脚 D7∼D0 :数据线,双向三态,与系
统数据总线连接。
(2) 片选信号 -CS :输入信号,低电平时选中
此片。由 CPU 输出的地址经地址译码器产生。
(3) 地址线 A0 , A1 :这两根线接到系统地址总
线的 A0 , A1 上,当 -CS 为低电平,且 8253 被
选中时,用它们来选择 8253 内部的四个寄存
器。当 A1A0=00 时,选中通道 0 ;当 A1A0=01
时,选中通道 1 ;当 A1A0=10 时 , 选中通道 2 ;
当 A1A0=11 时 , 选中控制字寄存器。
(4) 读信号 -RD :输入信号,低电平有效。由
CPU 发出,用于控制对选中的 8253 内寄存器的
读操作。
(5) 写信号 -WR :输入信号,低电平有效。由
CPU 发出,用于控制对选中的 8253 内部寄存器
的写操作。
88
2.3.2 可编程定时器 / 计数器芯片 8253
(6) 时钟脉冲信号 CLK0 、 CLK1 、 CLK2 :
计数器 0 、计数器 1 和计数器 2 的时钟输入端。
由 CLK 引脚输入的脉冲可以是系统时钟 ( 或系统时钟
的分频脉冲 ) 或其他任何脉冲源所提供的脉冲。时钟脉
冲信号的作用是在 8253 进行定时或计数时,每输入一
个时钟信号,便使计数值减 1 。若 CLK 是由精确的时
钟脉冲提供,则 8253 作为定时器使用;若 CLK 是由
外部事件输入的脉冲,则 8253 作为计数器使用。

(7) 门控脉冲信号 GATE0 、 GATE1 、 GATE2 :计


数器 0 、计数器 1 和计数器 2 的门控制脉冲输入端,
是由外部送入的门控脉冲,该信号的作用是控制启动
定时器 / 计数器工作。
(8) 输出信号 OUT0 、 OUT1 、 OUT2 :计数器 0 、
计数器 1 和计数器 2 的输出端。当计数器计数到 0
时,该端输出一标志信号,从而产生不同工作方式时
的输出波形。

89
2.3.2 可编程定时器 / 计数器芯片 8253
8253 的内部结构
8253 芯片由数据总线缓冲器、读 / 写逻辑、控制字寄存器
以及 3 个独立的 16 位计数器组成。

CLK0
数据总线 8 8 计数器
D7 ~ D0 GATE0
缓冲器 0 号
OUT0

WR 内
RD 部 CLK1
读/写 8 计数器
A0 逻辑 总 GATE1
A1 1 号
线
CS OUT1

CLK2
控制字 8 8 计数器
GATE2
寄存器 2 号
OUT2

24 90
2.3.2 可编程定时器 / 计数器芯片 8253
(1)  3 个独立的 16 位计数器
每个计数器具有相同的内部结构, 计数器 0
都包括一个 8 位的控制寄存器、一
个 16 位的计数初值寄存器 CR 、 控制寄存器
一个 16 位的减 1 计数器 CE 和一
个 16 位的输出锁存寄存器
OL 。 16 位的计数初值寄存器 CR 计数初值寄存器 (CR)
和 16 位的输出锁存寄存器 OL 共
同占用一个 I/O 端口地址, CPU CRH CRL
用输出指令向 CR 预置计数初值,
用输入指令读回 OL 中的数值,这
两个寄存器都没有计数功能,只起
锁存作用。 16 位的减 1 计数器 CE 减 1 计数
执行计数操作,其操作方式受控制 CEH CEL
器 (CE)
寄存器控制,最基本的操作是:接
受计数初值寄存器的初值,对
CLK 信号进行减 1 计数,把计数
结果送输出锁存寄存器中锁存。 输出锁存寄
OLH OLL
存器 (OL)

91
2.3.2 可编程定时器 / 计数器芯片 8253
(2) 控制寄存器
控制寄存器用来保存来自 CPU 的控制字。每个计数器都有一个控
制命令寄存器,用来保存该计数器的控制信息。控制字将决定计数
器的工作方式、计数形式及输出方式,亦决定如何装入计数初值。
8253 的 3 个控制寄存器只占用一个地址号,而靠控制字的最高两位
来确定将控制信息送入哪个计数器的控制寄存器中保存。控制寄存
器只能写入,不能读出。
(3) 数据缓冲器
数据缓冲器是三态、双向 8 位缓冲器。它用于 8253 和系统数据总线
的连接。 CPU 通过数据缓冲器将控制命令字和计数值写入 8253 计
数器,或者从 8253 计数器中读取当前的计数值。
(4) 读 / 写逻辑
读 / 写逻辑的任务是接收来自 CPU 的控制信号,完成对 8253 内部
操作的控制。这些控制信号包括读信号 -RD 、写信号 -WR 、片选
信号 -CS 以及用于片内寄存器寻址的地址信号 A0 和 A1 。当片选信
号有效,即 -CS=0 时,读写逻辑才能工作。该控制逻辑根据读 / 写
命令及送来的地址信息,决定三个计数器和控制寄存器中的哪一个
工作,并控制内部总线上数据传送的方向。
92
2.3.2 可编程定时器 / 计数器芯片 8253
8253 的读写操作状态操作
-CS -RD -WR A1 A0 操作
0 1 0 0 0 写计数初值到计数器 0 的 CR (计数初值寄存器 )
0 1 0 0 1 写计数初值到计数器 1 的 CR
0 1 0 1 0 写计数初值到计数器 2 的 CR
0 1 0 1 1 写控制字

0 0 1 0 0 从计数器 0 的输出锁存寄存器 OL 中读出当前计数



0 0 1 0 1 从计数器 1 的 OL 中读出当前计数值
0 0 1 1 0 从计数器 2 的 OL 中读出当前计数值
0 0 1 1 1 无操作

1 × × × × 未选中

0 1 1 × × 无操作

93
2.3.2 可编程定时器 / 计数器芯片 8253
8253 共占用 4 个 I/O 地址。当 A1A0=00 时,为计数器 0 中的 CR( 计
数初值寄存器 ) 和 OL( 输出锁存寄存器 ) 寄存器的共用地址,至于是
将计数初值写入 CR ,还是从 OL 中读出当前计数值,则由控制信号 -
WR 和 -RD 决定,这两个信号同时只能有一个有效。当 A1A0=01 和
10 时,分别为计数器 1 和计数器 2 的 CR 和 OL 的共用地址。当
A1A0=11 时,是 3 个计数器内的 3 个控制寄存器的共用地址,至于
CPU 是给哪个计数器送控制字,则由控制字中的最高两位的编码决
定。

8253 计数器在工作之前,用户必须对其进行初始化编程:首先 CPU


用输出指令向控制寄存器送控制字,然后再用输出指令向计数初值寄
存器 CR 预置计数 / 定时的初值。启动工作后, CR 中的初值就送入
减 1 计数器 CE 对 CLK 输入的计数 / 定时脉冲信号进行减 1 计数。当
CE 中的内容减为 0 ,表示计数 / 定时到,则 OUT 端输出信号。输出
信号的波形形式由工作方式决定。
94
2.3.2 可编程定时器 / 计数器芯片 8253
2 8253 的编程
8253 在工作之前,用户首先要为某一计数器 ( 计数器 0~2) 写入
控制字以确定其工作方式;写入定时 / 计数初值;在定时 / 计数
工作过程中,有时还需要读取某计数器当前的计数值。

8253 的控制字格式:定义各通道的工作方式

95
2.3.2 可编程定时器 / 计数器芯片 8253
D7D6 位是控制字的计数器编号。
 8253 有 3 个独立的控制寄存器,它们共用一个端口地址 (A1A0=11) ,由
控制字中最高两位标明将控制字写入哪个计数器的控制寄存器中。
D5D4 位用来设定计数器的数据读 / 写方式。
 在给计数器写入计数初值时,可以赋 16 位的初值,也可以只赋 8 位
( 另 8 位被自动置 0) , 8 位初值可以是高字节,也可以是低字节。在读
取计数器当前的计数值时,计数器并未停止计数,有可能在先后读高低
字节时,计数器的值发生变化,因此有必要先锁存当前的计数值,然后
再分字节读出,先读出低 8 位数据,后读出高 8 位数据。
 当 D5D4=00 时,计数器的当前计数值被锁存在 OL 中,此时计数器照常
计数,但 OL 中的值不变,待 CPU 将 OL 中的两字节数据读走后, OL
中的内容又随减 1 计数器 CE 变化。当 D5D4=01 ,只读 / 写低 8 位,
高 8 位自动置 0( 写计数初值时 ) ; D5D4=10 时,只读 / 写高 8 位,低
8 位自动置 0( 写计数初值时 ) ; D5D4=11 时,先读 / 写低 8 位,再
读 / 写高 8 位。
D3D2D1 位决定了计数器的工作方式。
8253 共有六种工作方式(方式 0~ 方式 5 )。
D0 位决定计数器的数制。
96
2.3.2 可编程定时器 / 计数器芯片 8253

8253 的读 / 写操作
(1) 写操作
写操作是指 CPU 对 8253 写入控制字或写入计数初值。
8253 在开始工作之前, CPU 要对其进行初始化编程 ( 写
入控制字和计数初值 ) :
 ① 对每个计数器,必须先写控制字,后写计数初
值。因为后者的格式是由前者决定的。
② 写入的计数初值必须符合控制字 (D5D4 两位 ) 决
定的格式。 16 位数据应先写低 8 位,再写高 8 位。
当给 8253 中的多个计数器进行初始化编程时,其顺序可
以任意,但对每个计数器进行初始化时必须遵循规定原
则。

97
2.3.2 可编程定时器 / 计数器芯片 8253
(2) 读操作
读操作是指读出某计数器的当前计数值到 CPU
中。有两种读取当前计数值的方法:
① 先使计数器停止计数 ( 在 GATE 端加低电平或关闭
CLK 脉冲 ) :根据送入的控制字中的 D5D4 位的状态,用
一条或两条输入指令读减 1 计数器 CE 的内容。实际上,
CPU 是通过输出锁存器 OL 读出当前计数值的,因为在计
数过程中, OL 的内容是跟随 CE 内容变化的。此时由于
CE 不再计数,故可稳定地读出 OL( 即 CE) 的内容。
② 在计数的过程中不影响 CE 的计数而读取计数值:为
达此目的,应先对 8253 写入一个具有锁存功能的控制
字,即 D5D4 位应为 00 ,这样就可以将当前的 CE 内容锁
存入 OL 中,然后再用输入指令将 OL 的内容读到 CPU
中。当 CPU 读取了计数值后,或对计数器重新进行初始
化编程后, 8253 会自动解除锁存状态, OL 中的值又随减
1 计数器 CE 值变化。

98
2.3.2 可编程定时器 / 计数器芯片 8253
应用举例
设 8253 芯片的端口地址为 388H∼38BH ( 计数器 0 , 1 , 2
各占据 1 个端口地址; 3 个控制寄存器只占用一个地 址号)。
现要求计数器 0 工作在方式 3 ,计数初值为 2354H ,二进制计
数;计数器 1 工作在方式 2 ,计数初值为 18H ,二进制计数。
试根据上述要求编写初始化程序及读取计数器 0 当前计数值的
程序。
 计数器 0 的初始化程序

MOV DX , 38BH ;给计数器 0 送控制字


MOV AL , 00110110B ;
OUT DX , AL
MOV DX , 388H ;送计数初值的低 8 位
MOV AL , 54H
OUT DX , AL
MOV AL , 23H ;送计数初值的高 8 位
OUT DX , AL
99
2.3.2 可编程定时器 / 计数器芯片 8253
计数器 1 的初始化程序 计数器 1 工作在方式 2 ,计数初值为 18H ,二进制计数。

MOV DX , 38BH ;给计数器 1 送控制字


MOV AL , 01010100B ;
OUT DX , AL
MOV DX , 389H ;计数初值送低 8 位
MOV AL , 18H 写入一个具有锁存功能的控制字,即
OUT DX , AL D5D4 位应为 00 ,这样就可以将当前的
CE 内容锁存入 OL 中,然后再用输入指
计数器 0 当前计数值读出程序 令将 OL 的内容读到 CPU 中
MOV DX , 38BH ;送计数器 0 当前计数值锁存命令
MOV AL , 06H 0 0 0
OUT DX , AL
MOV DX , 388H ;读出当前计数值的低 8 位
IN AL , DX
MOV CL , AL
IN AL , DX ;读出当前计数值的高 8 位,计数值保存在 CX
MOV CH , AL

100
2.3.2 可编程定时器 / 计数器芯片 8253
3 8253 的工作方式
8253 有六种不同的工作方式。在不同的工作方式下,计数过程
的启动方式不同, OUT 端的输出波形不同,自动重复功
能、 GATE 的控制作用以及更新计数初值对计数过程的影响也
不完全相同。 同一芯片中的三个计数器,可以分别编程选择
不同的工作方式。

(1) 方式 0—— 计数结束中断方式


这是一种软件启动、不能自动重复的计数方式。
 写入方式 0 的控制字 (CW) 后,其输出端变低。再写入
计数初值 N ,在写信号 -WR 以后经过 CLK 的一个上
升沿和一个下降沿,初值进入减 1 计数器 CE 。计数器
减到 0 后, OUT 成为高电平。此信号通常接至 8259A
的 IR 端作为中断请求信号。

101
写入方式
0 的控制
字 CW
后,输出
端变低。

INTR

GATE=0 ,禁止减 1 操作继续,待


GATE 重新有效后,减 1 操作继续进

INTR
102
2.3.2 可编程定时器 / 计数器芯片 8253

在计数过程中,随时可以写入新的计数值初值,计数器使用新的初值
重新开始计数 ( 若新初值是 16 位,则在送完第一字节后中止现行计
数,送完第二个字节后才重新开始计数 ) ,计数值为 0 时, OUT 输出
从低到高的跳变,可用它向 CPU 发中断请求 INTR 。
计数初值一次有效。
门控信号 GATE=1 ,允许减 1 操作; GATE=0 ,禁止减 1 操作继
续,待 GATE 重新有效后,减 1 操作继续进行。
方式 0 主要用于单次计数,计数到时,利用 OUT 信号作为查询信号或
中断请求信号。由于 8253 内部没有中断控制管理电路,故用 OUT 作
为中断请求信号时,需要通过中断优先级控制电路 ( 如 8259) 向 CPU
申请中断。
方式 0 既可完成计数功能,也可完成定时功能。

103
2.3.2 可编程定时器 / 计数器芯片 8253

(2) 方式 1—— 可编程单脉冲发生器


一种硬件启动、不能自动重复但通过 GATE 的正跳变可使计
数过程重新开始的计数方式。
 在写入方式 1 的控制字后 OUT 成为高电平,在写入计数
初值后,要等 GATE 信号出现正跳变时才能开始计数。
在下一个 CLK 脉冲到来后, OUT 变低,将计数初值送
入 CE 并开始减 1 计数,直到计数器减到 0 后 OUT 变为
高电平。

104
计数过程一旦启动, GATE 变成低电平也不会使计数中止。计数完成后
若 GATE 再来一个正跳变,计数过程又重复一次。对应 GATE 的每一
个正跳变,都输出宽度为 N*TCLK 的负脉冲,因此称这种方式为可编
程单脉冲发生器。
 在计数过程启动之后计数完成之前,若 GATE 又发生正跳变,则计数器
又从初值开始重新计数, OUT 端仍为低电平,两次的计数过程合在一起
使 OUT 输出的负脉冲加宽了。
 在方式 1 计数过程中,计数值一次有效。若写入新的计数初值,也只是写
入到计数初值寄存器中,要等到下一个 GATE 正跳变启动信号,计数器
才接收新初值重新计数。 105
2.3.2 可编程定时器 / 计数器芯片 8253
(3) 方式 2—— 分频工作方式 / 速率波发生器
写入控制字后, OUT 信号变为高电平,若计数初值为 N ,启动计数
后,以 CLK 信号的频率进行减 1 计数, OUT 输出高电平保持不
变;待计数值减到“ 1” 和“ 0” 之间时, OUT 输出宽度为一个 CLK
周期的负脉冲。
当减到 1 时, OUT 输出一个宽度为一个 CLK 时钟周期的负脉冲,
OUT 恢复成高电平后,计数器又重新开始计数。可以看出, OUT 输
出信号的频率为 CLK 信号频率的 1/N ,即 N 次分频,故称这种工作
方式为分频工作方式。

106
3.3 可编程定时器 / 计数器芯片 8253

写入控制字后, OUT
信号变为高电平

方式 2 需要 GATE 信号保持高电平。当 GATE 变为低电平


时,停止计数。 GATE 由低变高后, CR 中的计数初值又重
新装入减 1 计数器 CE 中开始计数。
方式 2 在计数过程中若写入新的计数初值,并不影响当前的
计数过程。在本次计数结束后,才以新的计数初值开始新的分
频工作方式。
107
2.3.2 可编程定时器 / 计数器芯片 8253
(4) 方式 3—— 方波发生器
工作于方式 3 时,在计数过程中其输出前一半时间为高电平,
后一半时间为低电平。其输出是可以自动重复的周期性方波,
输出的方波周期为 N*TCLK 。
 在写入方式 3 控制字后,计数器 OUT 端立即变高。若
GATE 信号为高,在写完计数初值 N 后,开始对 CLK 信
号进行计数。计数到 N/2 时, OUT 端变低,计完余下的
N/2 , OUT 又变高,如此自动重复, OUT 端产生周期为
N*TCLK 的方波。
CW N=4
WR

CLK

GATE
4 3 2 1
4 3 2 1 0
OUT

TOUT = N*TCLK
108
2.3.2 可编程定时器 / 计数器芯片 8253

若计数初值为偶数,则计数的前半周期为 N/2 ,计数的


后半周期为 N/2 ,输出重复周期为 N ,占空比为 1 : 1
的方波形。若计数初值为奇数,则计数的前半周期为
(N+1)/2 ,计数的后半周期为 (N−1)/2 ,近似方波。
在写入计数初值时,如果 GATE 信号为低电平,计数器
并不开始计数。待 GATE 变为高电平时,才启动计数过
程。在计数过程中,应始终使 GATE=1 。若 GATE=0 ,
中止计数,待恢复 GATE=1 时,计数器重新从初值 N 开
始计数。
在计数过程中写入新的计数初值时不影响当前的半个周
期的计数。在当前的半个周期结束 (OUT 电位发生变化 )
时,将启用新的计数初值开始新的计数过程。

109
2.3.2 可编程定时器 / 计数器芯片 8253
(5) 方式 4—— 软件触发方式
方式 4 是一种软件启动、不自动重复的计数方式。
 在写入方式 4 的控制字后, OUT 变为高电平。当写入计数
初值后立即开始计数 ( 这就是软件启动 ) 。当计数到 0 后,
OUT 输出变为低电平,持续一个 CLK 脉冲周期后恢复为高
电平,计数器停止计数。故这种方式是一次性的。只有
CPU 再次将计数初值写入计数初值寄存器 CR 后才会启动
另一次计数过程。
CW N=4
WR

CLK

GATE

4 3 2 1 0
OUT 110
2.3.2 可编程定时器 / 计数器芯片 8253
(6) 方式 5—— 硬件触发方式
方式 5 是一种硬件启动、自动重复的计数方式。
 在写入方式 5 控制字后, OUT 变高,写入计数初值时即
使 GATE 信号为高电平,计数过程仍不启动,而是要求
GATE 信号出现一个正跳变,然后在下一个 CLK 信号到
来后才开始计数。计数器减到 0 时, OUT 输出负脉冲,
宽度为一个 CLK 周期,表示定时时间到或计数次数到。
CW N = 4
WR

CLK

GATE
4 3 2 1 0
OUT

111
2.3.2 可编程定时器 / 计数器芯片 8253

由于方式 5 是由 GATE 的上升沿启动计数,同方


式 1 一样,计数启动后,即使 GATE 变成低电
平,也不影响计数过程的进行。但若 GATE 信号
产生了正跳变,则不论计数是否完成,计数初值
将被置入计数器,重新开始新一轮计数。
若在计数过程中给计数器写入新的计数初值,此
时 只 是 将 计 数 初 值 保 存 到 计 数 初值 寄 存 器 CR
中,并不影响当前的计数过程,在 GATE 产生正
跳变时新的计数初值才被置入减 1 计数器 CE 开
始计数。

112
8253 定时器 / 计数器六种工作方式的特点比较

由低到高的正跳变
计数结束中断方式

输出 N 倍时钟周期的单脉冲

分频工作方式 1 0
一个时钟周期的负脉冲

方波发生器
重复周期为 N 的方波

一个时钟周期的负脉冲

一个时钟周期的负脉冲
113
2.3.2 可编程定时器 / 计数器芯片 8253

4 8253 应用举例
使用 8253 计数器 2 产生频率为 40kHz 的方
波,设 8253 的端口地址为 0040H~0043H ,已
知时钟端 CLK2 输入信号的频率为 2MHz 。试
设计 8253 与 8086 总线的接口电路,并编写产
生方波的程序。

分析: 8253 端口地址分配: 0040H ,计数器 0 ;


0041H ,计数器 1 ; 0042H ,计数器 2 ; 0043H ,控制字
寄存器

114
2.3.2 可编程定时器 / 计数器芯片 8253
8253 与 8086 总线的连接

D7~D0

RD
WR
A0
A1

A2
译 地址译码器产生 8253 的片选
~ … 码 信号; A1 , A0 产生通道选
A15
择信号,由 CPU 输入。

8253 的端口地址为
0040H~0043H

115
2.3.2 可编程定时器 / 计数器芯片 8253
为了使计数器 2 产生方波,应使其工作于方式 3 ,输入的
2MHz 的 CLK2 时钟信号进行 50 次分频后可在 OUT2 端输出
频率为 40 kHz 的方波,因此,对应的控制字应为
10010111B ,计数初值为十进制数 50 。程序如下:
分析: 8253 端口地址分配: 0040H ,计数器 0 ; 0041H ,计数
器 1 ; 0042H ,计数器 2 ; 0043H ,控制字寄存器
MOV AL , 10010111B ;对计数器 2 送控制字
MOV DX , 0043H ;控制字端口地址
OUT DX , AL
MOV AL , 50 ;送计数初值 50
MOV DX , 0042H ;计数器 2 端口地址
OUT DX , AL

计数器 2 ;只读 / 写低字节;方式 3 产生方波;十进制计数


50
116
练习

某 8086 系统中包含一片 8253 芯片,要求完成如下功能:


1 )利用通道 0 完成对外部事件计数功能,计满 50 次向 CPU 发中断请
求;
2 )利用通道 1 产生频率为 1KHz 的方波,其中 CLKi 端输入 2.5MHz 的
时钟脉冲。
请写出 8253 的初始化程序。通道 0~ 通道 2 和控制字的端口号分别为
1FF0H~1FF3H
分析:
通道 0 应定义为工作方式 0 ,完成计数功能,计数
初值为 3CH ( 50 );
通道 1 应定义为工作方式 3 , 1KHz 方波,周期为
1ms , 2.5MHz ,其重复周期为 0.4us ,所以,计数
初值为 2500=09C4H ;
通道 0 ,工作方式 0 ,计数初值为 通道 1 ,工作方式 3 ,计数初值
3CH ( 50 ) 为 2500=09C4H ;

MOV DX , 1FF3H ; 8253 控制端口地 MOV DX , 1FF3H ; 8253 控制端口地


址 址
MOV AL , 10H ;通道 0 方式 0 , MOV AL , 76H ;通道 1 方式 3 ,
OUT DX , AL OUT DX , AL
MOV DX , 1FF0H ;通道 0 端口地址 MOV DX , 1FF1H ;通道 1 端口地址
MOV AL , 3CH ; 50 次,计数初值 MOV AX , 09C4H ;计数初值,
OUT DX , AL OUT DX , AL ;先送低字节
MOV AL , AH ;再送高字节
00 , 01 , 000 , OUT DX , AL
0 01 , 11 , 011 ,
0
练习

某 8086 系统中包含一片 8253 芯片,要求完成如下功能:


利用通道 2 完成对外部事件计数功能,计满 5000H 次向 CPU 发中断请求;
请写出 8253 的初始化程序。通道 0~ 通道 2 和控制字的端口号分别为
1AB0H~1AB3H

分析:通道 2 应定义为工作方式 0 ,完成计数功


能,计数初值为 5000H ;

MOV DX , 1AB3H ; 8253 控制端口地址


MOV AL , 10100000H ;通道 2 方式 0 ,只读写高
8位
OUT DX , AL
MOV DX , 1AB2H ;通道 2 端口地址
MOV AL , 50H ;计数初值高 8 位 , 低 8 位自动置
0
OUT DX , AL
练习: PC 机内的 8253 与电子发声控制

8253-5 是 PC 机内的计数器电路。
8253-5 的 3 个计数器端口地址分别为 40H 、 41H 、 42H ,
控制字寄存器地址为 43H 。

8255A 在 PC 机系统中有比较独特的作用,主要是读取键盘
扫描码、系统当前配置、状态以及扬声器等电路的控制。
8255A 涉及 3 个端口地址分别为 60H ( A 口)、 61H ( B
口)、 62H ( C 口)、控制字寄存器地址为 63H 。
A 口和 C 口为输入, A 口的 8 位全部连到键盘接口。 B 口
为输出, PB0 输出到 8253-5 的计数器 2 门, PB1 的信号输
出到扬声器输入电路产生声音。

120
PC 扬声器的发声原理
扬声器的音频信号可以由 8255A 的 PB1 和 8253-5 的
计数器 2 输出端相与产生,可以把 PB1 置为高电平而
通过设置 8253-5 的计数器 2 的计数值来产生音频信
号。也可以把 8253-5 的计数器 2 置为高电平,由 CPU
定时向 8255A 的 B1 写值来产生音频信号。
PC 扬声器的声音是由 1bit 的变化产生的,它只能改
变频率,无法改变大小,因而它只能产简单的方波。

J1 是 扬 声 器 插 口 , U1
是一个 带输出钳位二极
管的双外围与非驱动
器。 S 为钳位端, A 为
输入, Y 是输出。由于
S 接到高电平,所以 U1
实际上只起 到非门的作
用。
121
音乐演奏

一个音符对应一个频率,将对应一个音符频率的方
波通到扬声器上,就可以发出这个音符的声音。将一
段乐曲的音符对应频率的方波依次送到扬声器,就可
以演奏出这段乐曲。利用 8253 的方式 3——“ 方波发
生器”,将相应一种频率的计数初值写入计数器,就
可产生对应频率的方波。计数初值的计算如下:
计数初值 = 输入时钟 ÷ 输出频率
 例如输入时钟采用 1MHz ,要得到 800Hz 的频率,计数初
值即为 1000000÷800=1250=4E2H 。

122
音符与频率 (Hz) 对照关系

123
控制程序
使 8253 以一定
的频率溢出,
从而驱动喇叭
发出特定频率
的声音。

; di 是输出频率

编程例 8253music.asm ; bx 是循环节拍次数


;调用发声子程序

124
8253-5 的 3 个计数器端口地址分别为 40H 、 41H 、 42H ,控制字寄存器地址为 43H ;可
以把 PB1 置为高电平而通过设置 8253-5 的计数器 2 的计数值来产生音频信号。
1 0 1 1 0 1 1 0

10110110 计数器 2, 读写 16 位 ,
方式 3, 方波 , 二进制计数 .

计数初值 (ax) = 输入时


钟 ( dx,ax ) ÷ 输出频率
(di )

IN AL,61H 是读入 8255 的 B 端口内容 , 并


让 PB0 和 PB1 都等于 1(0000,0011);PB0 输
出到 8253 的计数器 2 门, PB1 的信号输
出到扬声器输入电路产生声音 .

125
编程例 8253music10.asm 对比 编程例 8253music.asm

mov cx, 5

126
2.3.3 可编程串行接口芯片 8251A
1 串行通信基本概念
串行通信中的数据传送模式
单工 (Simplex) 通信模式。仅能进行一个方向的数
据传送。如 A 作为发送器, B 能作为接收器。
半双工 (Half Duplex) 通信模式。它能够在设备 A
和设备 B 之间交替地进行双向数据传送。即数据可
以在一个时刻从设备 A 传送到设备 B ,而另一时刻
也可以从设备 B 传送到设备 A ,但不能同时进行。
全双工 (Full Duplex) 通信模式。通信设备 A 或 B
均能在发送的同时又能接收数据。即设备 A 向设备
B 发送数据的同时,设备 B 也可以向设备 A 发送数
据。
127
2.3.3 可编程串行接口芯片 8251A

比特率与波特率
比特率是数字信号的传输速率,比特率是指每秒
能传输的二进制代码的比特 (bit) 数,单位为 bps
(bit per second) 或 kbps( 千比特 / 秒 ) 。
波特率 (Baudrate) :调制速率(又称为波形速
率),波特指每秒能传输的符号 ( 也称离散状态 )
数。
 若每个符号所含信息量等于 1 比特,则波特率等于比特
率。
 在计算机中,一个“符号”的含义为高电平或低电平,
即符号所含信息量刚好等于 1 比特。 因此,在计算机
数据传输中常将比特率称为波特率。

128
2.3.3 可编程串行接口芯片 8251A
串行通信数据的收发方式 - (异步)与(同步)通
信方式

串口进行通信的方式有两种:同步通信方式和异步通信
方式。
同步通信方式要求通信双方以相同的时钟频率进行,而
且准确协调,通过共享一个单个时钟或定时脉冲源保证
发送方和接收方的准确同步,效率较高;
异步通信方式不要求双方同步,收发方可采用各自的时
钟源,双方遵循异步的通信协议,以字符为数据传输单
位,发送方传送字符的时间间隔不确定,发送效率比同
步传送效率低。
2.3.3 可编程串行接口芯片 8251A
串行通信数据的收发方式 - (异步)与(同步)通
信方式
异步通信方式 1 位的时间取决于波特率

下降沿标示

异步通信所采用的数据格式是一组不定“位数”数组组成。第一位称
为起始位,宽度为 1bit ,低电平;接着传送一个 8 位的数据 ( 包括 7
位数据 ,1 位奇偶校验位 ) ,其中,高电平为 1 ,低电平为 0 ;最后是
停止位。在两个数据组之间可有空闲位。
2.3.3 可编程串行接口芯片 8251A
串行通信数据的收发方式 - 异步与同步通信方式
同步通信方式
同步通信时所使用的数据格式分为:面向字符型和面向比特的两种
( 1 )面向字符型的数据格式
面向字符型的同步通信数据格式可采用单同步(一个同步字符)或双同步
(两个同步字符)。信息结束均用两个字节的循环控制码 CRC 为结束。

SYNC 数据字节 1 数据字节 2 …… 数据字节 n CRC1 CRC2 单同步

SYNC SYNC 数据字节 1 …… 数据字节 n CRC1 CRC2 双同步

131
2.3.3 可编程串行接口芯片 8251A
同步通信方式
( 2 )面向比特型的数据格式

根据同步数据链路控制规程( SDLC ),面向比特型的数据以帧为


单位传输,每帧由六个部分组成。第一部分是开始标志“ 7EH” ,
第二部分是一 个字节的地址场;第三部分是一个字节的控制场,第
四部分是需要传输的数据;第五部分是两个字节的循环控制码
CRC ;最后又是“ 7EH” 作为结束标志。

通常,异步通信速率要比同步通信的低。

132
2.3.3 可编程串行接口芯片 8251A

例子:串行通信的传输率

例:异步传输过程:
设每个字符对应 1 个起始位、 7 个信息位、 1 个奇偶校验位
和 1 个停止位,如果波特率为 1200bps ,那么,每秒钟能传
输的最大字符数为(一个空闲位也没有):

1200/10 = 120 个
2.3.3 可编程串行接口芯片 8251A
信号的调制和解调
在计算机系统中,主机与外设之间所传送的是用二
进制“ 0” 和“ 1” 表示的数字信号。数字信号的传
送要求占用很宽的频带,且还具有很大的直流分
量,因此数字信号仅适用于在短距离的专用传输线
上传输。
在进行远距离的数据传输时,一般是利用电话线作
通信线路。由于电话线不具备数字信号所需的频带
宽度,如果数字信号直接用电话线传输,信号将会
出现畸变,致使接收端无法从发生畸变的数字信号
中识别出原来的信息。因此必须采取一些措施,在
发送端把数字信号转换成适于传输的模拟信号,而
在接收端再将模拟信号转换成数字信号。前一种转
换称为调制,后一种转换称为解调。完成调制、解
调功能的设备叫做调制解调器 (Modem) 。

134
2.3.3 可编程串行接口芯片 8251A

2 串行接口芯片 8251A 串行接口包括四个主要寄


存器:状态寄存器、控制
典型串行接口的基本结构 寄存器、输入缓冲寄存器
和输出缓冲寄存器。

输入缓冲寄
存器总是和
输入移位
(串行输
入 / 并行输
出)寄存器
配对使用;
输出缓冲寄
存器总是和
输出移位
(并行输
入 / 串行输
出)寄存器
配对使用。
135
2.3.3 可编程串行接口芯片 8251A
8251A 的基本功能

8251A 是通用串行输入 / 输出接口,可用于串行的同步或异步两种通信


方式,它能将 CPU 并行输入的 8 位数据变换成逐位输出的串行信号;
也能将外设串行输入数据变换成并行数据,一次传给 CPU 。
其主要性能如下:

1 )同步传送( 5~8 )位 / 字符;可选择内同步或外同步,可自动插


入同步字符;
2 )异步传送( 5~8 )位 / 字符;时钟频率为波特率的 1 、 16 或 64
倍;可产生 1 、 1.5 或 2 位的停止位;可产生终止字符;
3 )全双工、双缓冲发送和接收器;
4 )具有奇偶、溢出和帧错误等校验检测电路 .
2.3.3 可编程串行接口芯片 8251A
8251A 的结构

发送器

接收器
2.3.3 可编程串行接口芯片 8251A
发送器

8251A 的发送器包括发送缓冲器、发送
移位寄存器(并 - 串转换)及发送控制电
路三部分。
CPU 需要发送的数据经发送缓冲器并行
输入,并锁存。如果是采用同步方式,
则在发送数据前,发送器自动送出一个
或两个同步字符。然后,逐位串行输出
数据。
如果采用异步方式,则由发送器在其首
尾加上起始位和停止位,然后从起始位
开始,经过并 - 串转换,从数据输出线
TXD 逐位串行输出。
2.3.3 可编程串行接口芯片 8251A
接收器

8251A 的接收器包括接收缓冲
器、接收移位寄存器(串 - 并转
换)及接收控制电路三部分。
外部数据从 RXD 端,逐位进入接
收移位寄存器。如果是同步方
式,则要检测同步字符,确认已
经达到同步,接收器才开始串行
接收数据,一组数据接收完,并
行输入接收缓冲器;如果是异步
方式,则应识别并删除起始位和
停止位。
2.3.3 可编程串行接口芯片 8251A
数据总线缓冲器: CPU 和 8251A 之间信息交换通道
读写控制电路:用来接收 CPU 发来的一系列控制信号。

1 ) RESET :复位信号,向
8251A 输入,高电平有效;
2 ) CLK :主时钟,向 8251A
输入;
3 ) -CS :片选信号。 CPU
输入,低电平有效,有效表示 -CS C/-D -RD -WR 操作
被选中;
0 0 0 1 读数据 CPU<8251A
4 ) -RD 及 -WR 信号: CPU
0 1 0 1 读状态 CPU<8251A
输入,低电平有效;
5 ) C/-D :控制 / 数据信号 =1 0 0 1 0 写数据 CPU>8251A
表示当前通过数据总线传送的 0 1 1 0 写控制字
CPU>8251A
是控制字; =0 表示当前通过
数据总线传送的是数据。
2.3.3 可编程串行接口芯片 8251A
调制解调控制电路:
使用 8251A 实现远距离串行通信时, 8251A 的数据输出端
要经过调制器将数字信号转换成模拟信号,数据接收端收
到的是经过解调器转换来的数字信号。其接口信号如下:

1 ) -DTR :数据终端准备好,输出, 调 模 解
发送端 制 拟 调
有效表示 CPU 已经准备好接收数据; 信
接收端
2 ) -DSR :数据装置准备好发送数 号
据;输入,低电平有效。这是由外设
( 调制解调器 ) 送入 8251A 的信号,用
于表示调制解调器或外设的数据已经准
备好。
3 ) -RTS :请求发送信号,向调制解
调器输出,有效表示 CPU 已准备好发
送数据;
4 ) -CTS :清除发送信号,由调制解
调器输入,低电平有效。
2.3.3 可编程串行接口芯片 8251A
8251A 可用于串行的异步或同步两种通信方式
8251A 引脚与连接
时钟、复位及片选信号:
 CLK—— 时 钟 信 号 输 入 线 , 用 于
8251A 工作时内部的定时,它的频率没
有明确值的要求,但必须不低于接收或
发送波特率的 30 倍。

 RESET—— 复位信号输入线,高电平
有效。复位后 8251A 处于空闲状态直
至被初始化编程。

 -CS—— 片选信号,低电平有效,它由
CPU 的地址信号译码而形成。 -CS 为
低电平时, 8251A 被 CPU 选中。
142
与 CPU 之间的接口引脚
数据信号 D0~D7 :
与 CPU 的数据总线对应连接。
读 / 写控制信号:
 -RD—— 读选通信号, CPU 输入,低电平有
效。
 -WR—— 写选通信号, CPU 输入,低电平
有效。
 C/-D—— 控制 / 数据信号,通常该引脚与
CPU 地址总线 A0 引脚相连,实现 8251A 内
部寄存器的寻址。 -CS C/-D -RD -WR 操作
0 0 0 1 读数据 CPU<8251A
0 1 0 1 读状态 CPU<8251A
0 0 1 0 写数据 CPU>8251A
0 1 1 0 写控制字
CPU>8251A
143
与 CPU 之间的收发联络信号:

TXRDY (Transmitter Ready)—— 发送准备好信


号,输出,高电平,通知 CPU 当前 8251A 已做好
发送准备, CPU 可以向 8251A 传送一个字符。当
CPU 将要发送的数据写入 8251A 后, TXRDY 恢复为
低电平。 TXRDY 可作为 8251A 向 CPU 发送的中断
请求信号。
TXE (Transmitter Empty)—— 发送器空信号,
输出,高电平有效。 TXE=1 时,表示发送器中没
有要发送的字符,当 CPU 把要发送的数据写入
8251A 中后, TXE 自动变为低电平。
RXRDY (Receiver Ready)—— 接收器准备好信号,输出,高电平有
效。 RXRDY=1 时,表明 8251A 已经从串行输入线接收了一个字符,
正等待 CPU 将此数据取走。因此,在中断方式时, RXRDY 可作为向
CPU 申请中断的请求信号;在查询方式时, RXRDY 的状态供 CPU 查询
之用。
SYNDET (Synchronous Detect)—— 同步检测信号。用于内同步状
态输出或外同步信号输入。此线仅对同步方式有意义。
144
与外部设备 ( 或调制解调器 ) 之间的接口引脚

-DTR (Data Terminal Ready)—— 数据终端准备好,输出,低电平有


效。通知外设 CPU 当前已准备就绪。
-RTS (Request To Send )—— 请求发送,输出,低电平有效。表示
CPU 已准备好发送数据,请求调制解调器做好准备。

TXD (Transmitter Data)—— 发送数据输出


线。 CPU 并行输入给 8251A 的数据从该引脚
串行发送出去。
-DSR (Data Set Ready)—— 数据装置准备
好,输入,低电平有效。这是由外设 ( 调制
解调器 ) 送入 8251A 的信号,用于表示调制
解调器或外设的数据已经准备好。

145
与外部设备 ( 或调制解调器 ) 之间的接口引脚

-CTS (Clear To Send)—— 清除发送,输入,低电平有效。这是由外设


( 调制解调器 ) 送往 8251A 的低电平有效信号,是对 -RTS 的响应。
-RXD (Receiver Data)—— 串行数据输入线。
-RXC (Receiver Clock)—— 接收器接收时钟输入端。它控制 8251A 接
收字符的速度,在上升沿采集串行数据输入线。在同步方式时,它由外
设 ( 或调制解调器 ) 提供, -RXC 的频率等于波特率;在异步方式时, -
RXC 由专门的时钟发生器提供,其频率是波特率的 1 倍、 16 倍或 64
倍,即波特率将等于 -RXC 端脉冲经过分频得到的脉冲的频率,分频系数
可通过方式选择字设定为 1 、 16 或 64 。实际上, -RXC 和 -TXC 往往连
在一起,共同接到一个信号源上,该信号源要由专门的辅助电路产生。
-TXC (Transmitter Clock)—— 发送器发送时钟输入端。 -TXC 的频率
与波特率之间的关系同 -RXC 。数据在 -TXC 的下降沿由发送器移位输
出。

146
8251A 与 CPU 及外设的连接
CLK—— 时钟信号输入
线,用于 8251A 工作时
内部的定时

-DTR :数据终端准备好,输
出,低电平有效。表示 CPU 当
前已准备好。
-DSR :输入,低电平有效。这 TXRDY :发送准备好信
是由外设 ( 调制解调器 ) 送入 号,输出,高电平,通
8251A 的信号,用于表示调制解 知 CPU 当前 8251A 已
调器或外设的数据已经准备好。
A0 接收器 / 发送器时 做好发送准备, CPU 可
-RTS :请求发送,输出,低电
钟:在同步方式 以向 8251A 传送一个字
平有效。表示 CPU 已准备好发 符;
C/-D——送数据。

时,它由外设 ( 或调
制 / 数据信号, 制解调器 ) 提供, - TXE :发送器空信号,
通常该引脚与-CTS :清除发送,输入,低电
RXC 的频率等于波 输出,高电平有效;
平有效。这是由外设
CPU 地址总线 ( 调制解调
特率;在异步方式
器 ) 送往 8251A 的低电平有效信 RXRDY :接收器准备好
A0 引脚相连 时, -RXC 由专门的
号。 信号,输出,高电平有
TXD :发送数据输出线。 时钟发生器提供,
CPU 效。 RXRDY=1 时,表
并行输入给 8251A其频率是波特率的
的数据从该 1 明 8251A 已经从串行输
引脚串行发送出去。 倍、 16 倍或 64 倍 入线接收了一个字符,
正等待 CPU 将此数据取
RXD :串行数据输入线。 走;
SYNDET :同步检测信
147
8251A 的只写控制字(方式控制字和操作命令控制
字)寄存器及只读的状态字寄存器
8251A 使用前必须初始化( 方式控制字和操作命令控制字 )

D1D0=00 时, (1) 方式选择控制字。用来确定 8251A 的通信方式 ( 同步


8251A 处于同步工 或异步 ) 、校验方式 ( 奇校验、偶校验或不校验 ) 、数据
作方式。否则为异
步工作方式,且当
位数 (5 、 6 、 7 或 8 位 ) 及波特率参数等,方式控制字
D1D0=01 、 10 和 11 应该在复位后写入,且只需写入一次。
时, RXC 和 TXC 引
脚上加载的时钟的
频率应分别为波特 D7 D6 D5 D4 D3 D2 D1 D0
率的 1 倍、 16 倍和
64 倍。
Y N
同步方式

同步方式 停止位 校验方式 数据位数 方式及波特率因子


×0— 内同步 00 — 无效 ×0 — 不校验 00 —5 位 00 — 同步方式
×1— 外同步 01 —1 位 01 — 奇校验 01 —6 位 01 — 异步 (×1)
0×— 双同步字 10 —1 位半 11 — 偶校验 10 —7 位 10 — 异步 (×16)
1×— 单同步字 11 —2 位 11 —8 位 11 — 异步 (×64)

148
( 2 )操作命令控制字。使 8251A 进入规定的工作状态以准备
发送或接收数据。应该在写入方式控制字后写入,用于控制
8251A 的工作,可多次写入。
EH 位只对同步方式有
效,对于同步方式,允
许接收,必须使 EH=1

1 :发断缺字符; 0 :
正常工作

方式控制字和命令控制字本身无特征标志,也没有独立的端口地址, 8251A 是根据写


入先后次序来区分这两者的:先写入者为方式控制字,后写入者为命令控制字。所以
对 8251 初始化编程时必须按一定的先后顺序写入方式控制字和命令控制字。
149
( 3 )状态寄存器:存放 8251A 的状态信息,供 CPU 利用 IN 指
令查询 。

DSR :调制解调器或外设的数据已经准备好。

D7 D6 D5 D4 D3 D2 D1 D0
DSR SYNDET FE OE PE TXE RXRDY TXRDY

同引脚
定义:发送准备好信
TXRDY
号,通知 CPU 当前 8251A
已做好发送准备, CPU 可
以向 8251A 传送一个字符; 1— 存在奇偶校验
错 :接收器准备好信
RXRDY
号。 RXRDY=1 时,表明
8251A 已经从串行输入线接
收了一个字符,正等待 1— 溢出错
CPU 将此数据取走;

TXE :发送器空信号 1— 帧校验错


SYNDET :同步检测信号

 当 FE=1 时,出现帧格式错,就是指在异步方式下当一个字符终了而没有检测到规
定的停止位时的差错。此标志位不禁止 8251A 的工作,可由控制命令字中的 ER 来
复位。 150
2.3.3 可编程串行接口芯片 8251A
( 3 )状态控制字: CPU 可在 8251A 工作过程中利用 IN 指令读取当前
8251A
的控制状态字。

151
2.3.3 可编程串行接口芯片 8251A

【例 1 】 若要查询 8251A 接收器是否准备好,则可用下


列程序段完成:

MOV DX , 0FFF2H ;状态口


L : IN AL , DX ;读状态口
AND AL , 02H ;查 Dl = 1 ?即准备好了吗?
JZ L ;未准备好,则等待
MOV DX , OFFF0H ;数据口
IN AL , DX ;已准备好则输入数据
8251A 初始化编程
8251A 初始化过程

 8251 进行初始化编程,必须在系统
复位之后;
 首先写入方式控制字,以决定通信
方式、数据位数、校验方式等。若
是同步方式则紧接着送入一个或两
个同步字符,若是异步方式则这一
步可省略,后送入命令控制字,就
可以发送或接收数据了。
 初始化过程的信息全部写入控制端
口 , 特 征 是 C/-D=1 , 即 地 址 线
A0=1( 因为 C/-D 接至 A0) 。
 由于各控制字没有特征位,因而写
入的顺序不能出错。
3 8251 应用举例
异步方式下初始化编程举例
设 8251A 控制口的地址为 301H ,数据口地址为 300H ,按下述要求对
8251A 进行初始化。
 异步工作方式,波特率因子为 64( 即数据传送速率是时钟频率的 1/64) ,采用偶校
验,字符总长度为 10(1 位起始位, 7 位数据位, 1 位偶校验位, 1 位停止位 ) 。
 允许接收和发送,使错误全部复位。
 查询 8251A 的状态字,当接收准备就绪时,从 8251A 数据口读入数据,否则等待。

Step1: 方式控制字: 01111011B


异步方式下初始化编程举例
 异步工作方式,波特率因子为 64( 即数据传送速率是时钟频率的 1/64) ,采用偶校
验,字符总长度为 10(1 位起始位, 7 位数据位, 1 位奇偶校验位, 1 位停止位 ) 。
 允许接收和发送,使错误全部复位。
 查询 8251A 的状态字,当接收准备就绪时,从 8251A 数据口读入数据,否则等待。

Step2: 操作命令控制字: 00010101B


异步方式下初始化编程举例
-CS C/-D -RD -WR 操作
0 0 0 1 读数据 CPU<8251A
设 8251A 控制口的地址为 301H ,数据口地址为
0 1 0 300H
1 ,按下述要求对 8251A
读状态 CPU<8251A
进行初始化。 0 0 1 0 写数据 CPU>8251A
 异步工作方式,波特率因子为 64( 即数据传送速率是时钟频率的 1/64) ,采用偶校
验,字符总长度为 10(1 位起始位,0 7 位数据位,
1 写控制字
1 1 位奇偶校验位,
0 1 位停止位 ) 。
 允许接收和发送,使错误全部复位。 CPU>8251A
 查询 8251A 的状态字,当接收准备就绪时,从 8251A 数据口读入数据,否则等待。

MOV DX , 301H ; 8251A 控制口地址


MOV AL , 01111011B ;方式控制字
OUT DX , AL ;送方式控制字
MOV AL , 00010101B ;命令控制字
OUT DX , AL ;送命令控制字
WAIT : IN AL , DX ;读入状态字
AND AL , 02H ;检查 RXRDY=1 ?
JZ WAIT ; RXRDY≠1 ,接收未准备就绪,等待
MOV DX , 300H ; 8251A 数据口地址
IN AL , DX ;读入数据
156
同步方式下初始化编程举例
设 8251A 为同步工作方式,控制口地址为 51H , 2 个同步字符,采
用内同步, SYNDET 为输出引脚,偶校验,每个字符 7 个数据位。
双同步工作方式的 2 个同步字符,可以相同,也可以不同。本例使用
两个相同的同步字符 23H 。

方式控制字:
0 0 1 1 1 0 0 0

157
同步方式下初始化编程举例
设 8251A 为同步工作方式,控制口地址为 51H , 2 个同步字符,采
用内同步, SYNDET 为输出引脚,偶校验,每个字符 7 个数据位。
双同步工作方式的 2 个同步字符,可以相同,也可以不同。本例使用
两个相同的同步字符 23H 。

MOVAL , 00111000B ;方式控制字:设置工作方式、双同步字符偶校验、


;每个字符 7 位
OUT 51H , AL ;送方式控制字
MOV AL , 23H ;同步字符
OUT 51H , AL ;送第一个同步字符
OUT 51H , AL ;送第二个同步字符
MOVAL , 10010111B ;命令控制字:使接收器和发送器启动,
;使状态寄存器中的 3 个出错标志位复位,
;通知调制解调器 CPU 现已准备好进行数据传送
OUT 51H , AL ;送命令控制字

158
 8251A 应用举例

当 8251A 与 CPU 连接时,要占用两个端口地址,即控制端口地址


(C/-D=1) 和数据端口地址 (C/-D=0) 。
在 使 用 8251A 时 , 需 要 提 供 三 个 时 钟 信 号 : CLK 、 -TXC 和 -
RXC 。 CLK 信号的频率没有明确值的要求;接收器接收时钟 -RXC
和发送器发送时钟 -TXC 的频率在同步方式时等于波特率,在异步方
式时应分别为波特率的 1 倍、 16 倍和 64 倍,即波特率将等于 -RXC
和 -TXC 端脉冲经过分频得到的脉冲的频率,分频系数可通过方式选
择字设定为 1 、 16 或 64 。
8251A 的 RXRDY 和 TXRDY 分别为“接收数据准备好”和“发送数
据准备好”的状态输出引脚。如果要利用中断方式控制传输,利用这
两个信号组合起来形成中断请求信号,中断服务程序将依据“接收数
据准备好”状态读入接收的数据,依据“发送数据准备好”状态把要
发送的字符发至 8251A ;如果用查询方式控制传输,这两个引脚就
没用了。
其他引脚,如 D7-D0 与系统数据总线相连; -RD 、 -WR 分别与 -
RD 、 -WR 相连; -CS 与端口地址译码器 (A0 不参加译码 ) 输出端相
连; C/-D 端与地址总线 A0 相连。
159
用 8251A 为 8086 CPU 与 CRT 终端设计一串行通信接
口。 8251A 控制端口地址为 301H ,数据端口地址为 300H 。
要求:
 异步方式传送,数据格式为 1 位停止位, 8 位数据位,奇校验;
 波特率因子为 16 ;
 CPU 用查询方式将显示缓冲区的字符“ HAPPY NEW YEAR” 送 CRT
显示器。显示缓冲区在数据段。

8086CPU 8251A
D7 ~ D0
D7 ~ D0
TXD 1488
地址 CRT
CS 终端
译码器
AD0 ~ AD15 地址
RXD 1489
锁存器 A0
C/D
GND
DSR
ALE CTS
WR WR 波特率
RD RD T XC
发生器
CLK CLK
R XC

160
当地址锁存允许信号 ALE 有效时,将 CPU 送来的地址锁存,地址译码器
对输入地址 A1∼A9 进行译码,其输出接到 8251A 的片选端。地址 A0 用于
选择 8251A 的控制 / 数据端口。波特率发生器按规定给 8251A 提供发送和
接收时钟,其频率应等于波特率与程序设定的波特率因子 16 的乘积。电平
转换电路 1488 和 1489 实现 TTL 电平与 RS–232C 电平的转换。

8086 CPU 与 CRT 终端的串行接口


8086CPU 8251A
D7 ~ D0
D7 ~ D0
TXD 1488
地址 CRT
CS 终端
译码器
AD0 ~ AD15 地址
RXD 1489
锁存器 A0
C/D
GND 清除发送和数据装
DSR 置装备好都是低有
ALE CTS 效,接地
WR WR 波特率
RD RD TX C
发生器
CLK CLK
R XC
161
2.3.3 可编程串行接口芯片 8251A

异步方式传送,数据格式为 1 位停止位, 8 位数据位,奇


校验;波特率因子为 16 ;

方式控制字:

0 1 0 1 1 1 1 0

162
2.3.3 可编程串行接口芯片 8251A

命令控制字 异步方式传送, CPU 用查询方式将显示


缓冲区的字符“ HAPPY NEW
YEAR” 送 CRT 显示器。
0 0 1 1 0 0 1 1

163
2.3.3 可编程串行接口芯片 8251A
DATA SEGMENT
STR DB ‘Happy New Year’, 0AH, 0DH,’$’
CNT EQU $-STR
;回车: 0AH ,换行:
DATA ENDS
0DH
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX , DATA
MOV DS , AX
MOV DX , 301H ;控制口地址
MOV AL , 01011110B ;方式控制字
OUT DX , AL ;送方式控制字
MOV AL , 00110011B ;命令控制字
OUT DX , AL ;送命令控制字
MOV BX , OFFSET STR ;字符串偏移地址
MOV CX , CNT ;发送字符个数
164
2.3.3 可编程串行接口芯片 8251A
WAIT: MOV DX , 301H ;控制口地址
IN AL , DX ;读状态字
TEST AL , 01H ;检测 TXRDY=1 ?
JZ WAIT ;如果不是,则等待
MOV DX , 300H ;数据口地址
MOV AL , [BX] ;从数据缓冲区读要发送的字符
OUT DX , AL ;发送字符
INC BX ;数据缓冲区地址加 1
DEC CX
JNZ WAIT ;若字符未送完,则循环发送
MOV AH , 4CH
INT 21H
CODE ENDS TXRDY :发送准备好信号,通知 CPU 当前 8251A 已
END START 做好发送准备, CPU 可以向 8251A 传送一个字符;

165
8251 串行接口试验——自收自发实验

编写程序,实
现将 4000H
起始的 10 个
单元中的初始
数据发送到串
口,然后自接
受并保存到
3000H 起始的
内存单元中
8.4 可编程串行接口芯片 8251A 应用

8251 芯片
8251.asm

; 8251 数据口 600 ;控制口 602

; 8254 定时器 2:06C4H ,控制口


06C6H

1011 0110; 计数器 2 ,读写高低


两字节;方式 3 ,二进制计数

计数器 2 ,初值 000CH

8251 进行初始化编程,必须在系统复位之后;
01 11 11 10

方式控制字应该在复位后写入,且只
需写入一次。操作命令控制字在写入
方式控制字后写入,用于控制 8251A
的工作,可多次写入。

0 0 1 1 0 1 1 1
执行过程和结果验证
2.3.4 可编程中断控制器 8259A

1 8259A 的功能
CS 1 28 V CC
WR 2 27 A0
8259A 是 可 编 程 中 断 控 制 器 芯 RD 3 26 INTA
片,用于管理和控制 80x86 的外 D7 4 25 IR 7
D6 5 24
部中断请求,可实现中断优先级 D5 6 23
IR 6
IR 5
判定,提供中断类型号,屏蔽中 D4 7
8259A
22 IR 4
8 21
断输入等功能。 D3 IR 3
D2 9 20 IR 2
D1 10 19 IR 1
D0 11 18 IR 0
8259A 采用 28 脚 CAS 0 12 17 INT
双列直插封装形式; CAS 1 13 16 SP / EN
GND 14 15 CAS 2

172
单片 8259A 可管理 8 级中断,
若采用级联方式,最多可以用
9 片 8259A (一片主片, 8 片
从片)构成两级中断机构,管
理 64 级中断。 从1

主片 1 )三级中断最多管理
多少级中断?
2 ) 4 片 8259A 最多管
理多少级中断?

从2
8259A 是可编程器件,它所具
有的多种中断优先级管理方式
可以通过主程序在任何时候进
行改变或重新组织。
2.3.4 可编程中断控制器 8259A
2 8259A 的内部结构及外部引脚
(1) 8259A 的内部结构(八部分)

174
2.3.4 可编程中断控制器 8259A
中断请求寄存器 IRR (Interrupt Request Register) :
8 位,接受并锁存来自 IR0 ~ IR7 的中断请求信号,当 IR0 ~ IR7 上出现
某一中断请求信号时, IRR 对应位被置 1 ;
中断屏蔽寄存器 IMR (Interrupt Mask Register) :
 8 位,若 IRR 中记录的各级中断中有任何一级需要屏蔽,只要将 IMR 的
相应位置 1 即可,未被屏蔽的中断请求进入优先权判别器;
中断服务寄存器 ISR (In-Service Register) :
8 位,保存当前正在处理的中断请求,例如,如果 ISR 的 D2=1 ,表示
CPU 正在为来自 IR2 的中断请求服务;
优先权判别器 PR (Priority Resolver) :
 能够将各中断请求中优先级最高者选中,并将 ISR 中相应位置 1 。若某
中断请求正在被处理, 8259A 外部又有新的中断请求,则由优先权判别
器将新的中断请求和当前正在处理的中断进行比较判断优先级。若新的
中断请求比正在处理的中断级别高,则正在处理的中断自动被禁止,先
处理级别高的中断,由 PR 通过控制电路向 CPU 发出中断申请 INT 。

175
2.3.4 可编程中断控制器 8259A

CPU 处理外设的 INTR 请求的过程


CPU 收到中断请求后,若 IF=1 (STI 指令可将中断允
许标志 IF 置 1 ),则 CPU 响应中断,执行两个中断响应
总线周期,在 -INTA 引脚上发出两个负脉冲。
8259A 收到第一个负脉冲后,使 IRR 锁存功能失效,不接
受 IR0 ~ IR7 上的中断请求信号;直到第二个负脉冲结束
后,才又使 IRR 锁存功能有效,并清除 IRR 的相应位,使
ISR 的对应位置 1 ,以便为优先级裁决器以后的裁决提供
依据。
收到第二个负脉冲后, 8259A 把当前中断的中断类型码送
到 D7~D0 , CPU 根据此类型号进入相应的中断服务程序。
在中断服务程序结束时向 8259A 发中断结束命令 EOI ,该
命令将 ISR 寄存器的相应位清 0 ,中断处理结束。
176
2.3.4 可编程中断控制器 8259A
数据总线缓冲器是 8259A 与系统之间传送信息的数据通道,
是一个双向八位三态缓冲器。
读 / 写控制逻辑包含了初始化命令字寄存器和操作命令字寄
存器。用来接收来自 CPU 的读 / 写控制命令和片选控制信
息。
 功能是确定数据总线缓冲器中数据的传输方向,选择内部的各命令字
寄存器。
 一片 8259A 只占两个 I/O 端口地址,可用末位地址码 A0 来选端口,
其他高位地址作为片选信号 -CS 输入。
级联缓冲 / 比较 器用来存放和比较在系统中用到的所有
8259A 的级联地址。
 主控 8259A 通过 CAS0 、 CAS1 和 CAS2 发送级联地址,选中从控
8259A 。 对 于 主 8259A , CAS2~CAS0 是 输 出 信 号 ; 对 于 从
8259A , CAS2~CAS0 是输入信号。
177
2.3.4 可编程中断控制器 8259A
(2) 8259A 的外部引脚
8259A 采用 28 脚双列直插封装形式;
-CS :片选信号,输入,低 CS 1 28 V CC
电平有效,来自地址译码器 WR 2 27 A0
的输出。只有该信号有效 RD 3 26 INTA
4 25
时, CPU 才能对 8259A 进 D7 IR 7
D6 5 24 IR 6
行读 / 写操作。 6 23
D5 IR 5
-WR :写信号,输入,低电 D4 7 22 IR 4
8259A
平有效,通知 8259A 接收 D3 8 21 IR 3
9 20
CPU 从数据总线上送来的命 D2 IR 2
D1 10 19 IR 1
令字。
D0 11 18 IR 0
-RD :读信号,输入,低电 CAS 0 12 17 INT
平有效,用于读取 8259A 中 CAS 1 13 16 SP / EN
某些寄存器的内容 ( 如 GND 14 15 CAS 2
IMR 、 ISR 或 IRR) 。

178
2.3.4 可编程中断控制器 8259A
D7∼D0 :双向、三态数据线,接系统数
据总线的 D7∼D0 ,用来传送控制字、
状态字和中断类型号等。 CS 1 28 V CC
WR 2 27 A0
IR7∼IR0 :中断请求信号,输入,从 RD 3 26 INTA
I/O 接口或其他 8259A( 从控制器 ) 上接 D7 4 25 IR 7
5 24
收中断请求信号。在边沿触发方式中, D6 IR 6
D5 6 23 IR 5
IR 输入应由低到高,此后保持为高, 7 22
D4 IR 4
直到被响应。在电平触发方式中, IR D3 8
8259A
21 IR 3
输入应保持高电平。 D2 9 20 IR 2
D1 10 19 IR 1
 INT : 8259A 向 CPU 发出的中断请求
D0 11 18 IR 0
信号,高电平有效,该引脚接 CPU 的 CAS 0 12 17 INT
INTR 引脚。 CAS 1 13 16 SP / EN
 -INTA :中断响应信号,输入,接收 GND 14 15 CAS 2
CPU 发 来 的 中 断 响 应 脉 冲 以 通 知
8259A 中断请求已被响应,使其将中断
类型号送到数据总线上。
179
2.3.4 可编程中断控制器 8259A
 CAS0∼CAS2 :级联总线,输入或输出,
用于区分特定的从控制器件。 8259A 作为
主控制器时,该总线为输出,作为从控制 CS 1 28 V CC
WR 2 27 A0
器时,为输入。 3 26
RD INTA
 -SP/-EN :从片 / 允许缓冲信号,输入或 D7 4 25 IR 7
D6 5 24 IR 6
输出,该引脚为双功能引脚。在缓冲方式 6 23
D5 IR 5
中 ( 即 8259A 通过一个数据总线收发器与 D4 7 22 IR 4
8259A
系统总线相连 ) ,该引脚被用做输出线, D3 8 21 IR 3
9 20
控制收发器的接收或发送;在非缓冲方式 D2 IR 2
D1 10 19 IR 1
中,该引脚作为输入线,确定该 8259A 是 11 18
D0 IR 0
主控制器 (-SP/-EN = 1) 还是从控制器 (- CAS 0 12 17 INT
SP/-EN = 0) 。 CAS 1 13 16 SP / EN
GND 14 15 CAS 2
A0 :地址输入信号,用于对 8259A 内部
寄存器端口的寻址。每片 8259A 对应两个
端口地址,一个为偶地址,一个为奇地
址,且偶地址小于奇地址。
180
2.3.4 可编程中断控制器 8259A
3 8259A 的工作方式
中断优先级管理方式:中断优先级管理是中断管理的核心问题
(1) 完全嵌套方式
也称固定优先级方式。在这种方式下,由 IRi 端引入的中断请求
具有固定的优先级, IR0 最高, IR7 最低。在对 8259A 初始化后若
没有设置其他优先级方式,则默认为完全嵌套方式。
当一个中断请求被响应时, ISR 中的对应位被置 1 , 8259A 把中
断类型码放到数据总线上,然后进入中断服务程序。一般情况下
( 除中断自动结束方式外 ) ,在 CPU 发出中断结束命令 (EOI) 前,
此对应位一直保持为 1 ,以封锁同级或低级的中断请求,但并不禁
止比本级优先级高的中断请求,以实现中断嵌套。
(2) 特殊全嵌套方式
在主从结构的 8259A 系统中,将主片设置为特殊全嵌套方式,可
以在处理某一级中断时,不但允许优先级更高的中断请求进入,也
允许同级的中断请求进入。
181
2.3.4 可编程中断控制器 8259A
中断优先级管理方式
(3) 优先级自动循环方式
采用这种方式,各中断源优先级是循环变化的,主要用在系统中各中
断源优先级大致相同的情况下。一个设备的中断服务完成后,其优先
级自动降为最低,而将最高优先级赋给原来比它低一级的中断请求。
例 如 : 开 始 时 , 优 先 级 队 列 还 是
IR0 , IR1 , IR2 , IR3 , IR4 , IR5 , IR6 , IR7(IR0 最高, IR7 最
低 ) ; 若 此 时 出 现 了 IR0 请 求 , 响 应 IR0 并 处 理 完 成 后 ( IR1 最
高),队列变为 IR1 , IR2 , IR3 , IR4 , IR5 , IR6 , IR7 , IR0 ;
若又出现了 IR4 请求,处理完 IR4 后 (IR5 变为最高优先级 ) ,队列变
为 IR5 , IR6 , IR7 , IR0 , IR1 , IR2 , IR3 , IR4 。
(4) 优先级特殊循环方式
该方式与优先级自动循环方式相比,不同之处在于可以设置开始的最
低优先级。例如,最初设定 IR4 为最低优先级,那么 IR5 就是最高优
先级,而优先级自动循环方式中,最初的最高优先级一定是 IR0 。

182
2.3.4 可编程中断控制器 8259A
中断优先级管理方式
(5) 查询方式
这种方式下, CPU 的 IF 位为 0 ,禁止外部的中断请求。外设仍
然向 8259A 发中断请求信号,要求 CPU 服务,此时, CPU 需要
用软件查询方法来确认中断源,从而实现对外设的服务。 CPU 首
先 向 8259A 发 查 询 命 令 , 紧 接 着 执 行 一 条 输 入 指 令 (IN) , 从
8259A 的偶地址读出一个字节的查询字, CPU 读入查询字后,判
断其最高位,若最高位为 1 ,说明 8259A 的 IR 端已有中断请求输
入,此时该查询字的最低三位组成的代码表示了当前中断请求的最
高优先级, CPU 据此转入相应的中断服务程序。
查询字格式
IR L2 L1 L0
=1 表示有中断请求;
给出当前处理的最高
=0 表示无中断请求。 优先级

183
2.3.4 可编程中断控制器 8259A
中断屏蔽方式

(1) 普通屏蔽方式
 通过对中断屏蔽寄存器 (IMR) 的设定,实现对中断请求
的屏蔽。中断屏蔽寄存器的每一位对应了一个级别的中
断请求,当某一位为 1 时,与之相应的某一级别的中断
请求被屏蔽。 CPU 在响应某一中断请求时,还可以在
主程序或中断服务程序中对 IMR 的某些位置 1 ,以禁
止高级别中断的进入。
(2) 特殊屏蔽方式
 当 CPU 正在处理某级中断时,要求仅对本级中断进行
屏蔽,而允许优先级比它高或低的中断进入系统。

184
对于一个中断源的中断处理过程应包括以下几
个步骤 : 中断请求、中断响应、保护断点、中
中断结束方式 断处理和中断处理结束返回。
(1) 一般中断结束方式 / 普通 EOI 方式
该方式用于完全嵌套方式下的中断结束。 CPU 在中断服务程序结束
时,向 8259A 发常规中断结束命令 EOI , 8259A 收到这个 EOI 命令
后,自动将中断服务寄存器 ISR 中最高优先级的置“ 1” 位清“ 0” 。在
完全嵌套方式下, ISR 中最高优先级位对应于当前正在处理的中断,将
其清 0 ,就相当于结束了当前正在处理的中断。
(2) 自动结束方式 / 自动 EOI 方式
任何一级中断被响应后, ISR 寄存器中相应位置“ 1” , CPU 将进入中
断响应总线周期,在第二个中断响应信号( -INTA )结束时,自动将
ISR 相应位清“ 0” ,被称为自动 EOI 方式;
注意,该方式是在中断响应后,而不是在中断处理结束后将 ISR 位清
0 。这样,在中断处理过程中, 8259A 中就没有“正在处理”的标识。
此时,若有中断请求出现,且 IF = 1 ,则无论其优先级如何,都将得到
响应。这就有可能出现低级别中断打断高级中断或同级中断相互打断的
不合理现象。

185
2.3.4 可编程中断控制器 8259A
中断结束方式

(3) 特殊中断结束方式 (SEOI)


在普通 EOI 方式的基础上,当中断服务程序结束给 8259A 发
出 EOI 命 令 的 同 时 , 将 当 前 结 束 的 中 断 级 别 也 传 送 给
8259A ,被称为特殊中断结束方式。在这种情况下, 8259A
将 ISR 寄存器指定级别的相应位清“ 0” ,显然这种结束方式
可以在任何情况下使用。

在级联方式下,一般不用中断自动结束方式,而是用
一般结束方式或特殊结束方式。在中断处理程序结束
时,必须发两次中断结束命令,一次是发往主片,另
一次发往从片。

186
2.3.4 可编程中断控制器 8259A
中断触发方式 电平触发方式时,从 IR0~IR7 引脚输入的有效信号应该为高
电平,而且必须保持有效到响应它的第一个 -INTA 信号的前
沿,否则这个 IRi 信号有可能丢失;但也不允许 IRi 信号太
1) 电平触发方式 长,如果 ISR 寄存器相应位复位后该 IRi 端信号还有效,则
8259A 就可能重新响应这一中断请求而出现重复中断现象。
该方式以 IRi 端上出现的高电平作为中断请求信号。请
求一旦被响应,该高电平信号应及时撤除。
2) 边沿触发方式
该方式以 IRi 端上出现由低电平向高电平的跳变作为中
断请求信号,跳变后高电平一直保持,直到被响应。

不管采用什么方式触发的中断,在中断响应的第二 个
– INTA 信号有效期间 8259A 应将当前被响应的中断
类型码通过数据 D7~D0 传送给 CPU 。

187
2.3.4 可编程中断控制器 8259A

与系统总线的连接方式
1) 缓冲方式
缓冲方式主要用于多片 8259A 级联的大系统中。在缓冲
方式下, 8259A 通过总线收发器 ( 如 8286) 和数据总线
相连。 8259A 的 -SP/-EN 作为输出 (-EN 有效 ) 。
2) 非缓冲方式
非缓冲方式主要用于单片 8259A 或片数不多的 8259A 级
联的系统中。该方式下, 8259A 直接与数据总线相连,
8259A 的 -SP/-EN 作为输入 (-SP 有效 ) 。只有单片
8259A 时, -SP/-EN 端必须接高电平;有多片 8259A
时,主片的 -SP/-EN 端接高电平,从片的该引脚接低电
平。
2.3.4 可编程中断控制器 8259A
4 8259A 的编程举例
8259A 是可编程的中断控制器,它的工作状态和操作方式是由 CPU
通过命令字进行控制的。 8259A 有两类命令字——初始化命令字
ICW (Initialization Command Words) 和操作命令字 OCW (Operation
Command Words) 。在 8259A 的控制部分有 7 个 CPU 可访问的寄存
器,分成两组:一组用做存 ICW ,另一组存 OCW 。
 ICW 用于 8259A 的初始设定,即当计算机刚启动时,由 CPU 按
次序发送 2∼4 个不同格式的 ICW ,用来建立起 8259A 操作的初
始状态,此后的整个工作过程中该状态保持不变。
 操作命令字 (OCW) 用于动态控制中断处理,是在需要改变或控制
8259A 操作时随时发送的。
每片 8259A 包含两个端口地址 , 一个偶地址端口 (A0=0), 一个奇地
址端口 (A0=1) ,所有的命令字都是通过这两个端口来发送的。
 当发出 ICW 或 OCW 时, CPU 中断申请引脚 INTR 应关闭 ( 使
用指令
CLI )。
189
2.3.4 可编程中断控制器 8259A
初始化命令字 / 预置命令字
( (1)
ICWICW
1 )1 :主要用于设置工作方式,写入 A0=0 的端口。

对 A0=0 的端口写入一个 D4=1 的数据,表示初始化编程开始。


 D2 和 D7∼D5 这 4 位在仅对 8080/8085 系统有意义, 8086/8088 系统中这 4 位不
用,通常置为 0 。
 D4 :特征位,必须为 1 ;
 D3 : LTIM 位,设置中断请求信号的触发方式。
 D1 : SGNL 位,是否工作在单片方式, 0 为多片级联, 1 为单片。
 D0 : IC4 位, 0 表示不需设置命令字 ICW4 , 1 表示后面还需要设置 ICW4 。
0 0 0 1 ? 0 ? ?
190
2.3.4 可编程中断控制器 8259A
初始化命令字 / 预置命令字
((2)
ICW )
ICW :用于设置中断类型号,写入 A =1 的端口。
2
2 0

A0 7 6 5 4 3 0
1 T7 T6 T5 T4 T3 X X X

中断类型码的高 5 位
紧跟在 ICW1 之后,端口地址为奇地址( A0=1 )表示当前写入的是
ICW2 ;
在 8086/8088 系统中,只设置 D7∼D3 ,即只需设置中断类型号的高 5
位。 D2∼D0 的实际内容由 8259A 根据中断请求来自 IR0∼IR7 的哪一个
输入端,自动填充为 000∼111 中的某一组编码,与高 5 位一同构成 8
位的中断类型号。
例 如 , 在 PC/XT 中 ICW2 为 00001000B , 则 对 于 从
IR0 、 IR1 、 IR2 、 IR3 、 IR4 、 IR5 、 IR6 和 IR7 上引入的各中断请
求 , 其 相 应 的 中 断 类 型 号 为
08H 、 09H 、 0AH 、 0BH 、 0CH 、 0DH 、 0EH 和 0FH 。
191
2.3.4 可编程中断控制器 8259A
初始化命令字 / 预置命令字

(3)ICW
ICW 3 ):用于设置级联,写入 A =1 的端口。只有当系统
3 0

中有级联( ICW1 的 SNGL 位为 0 )时,才写 ICW3 。


A0 7 6 5 4 3 0
1 S7 S6 S5 S4 S3 S2 S1 S0 主 8259A
对于主片, ICW3 的 S0∼S7 指明了 IR0∼IR7 各引脚连接从片的情况,置 1
的 位 表 示 对 应 的 引 脚 有 从 片 级 联 。 例 如 , 若 主 片 ICW3 的 内 容 为
07H(00000111B) 时 , 说 明 主 片 的 IR0 、 IR1 、 IR2 上连有从片。

A0 7 6 5 4 3 0
1 0 0 0 0 0 ID2 ID1 ID0 从 8259A

对于从片, ICW3 的 D7∼D3 不用,置 0 即可;用 ID2∼ID0 表示与主片的对应引脚


级联,例如,若某从片 ICW3 的内容为 00000111B ,说明该从片的 INT 引脚与主
片的 IR7 相连;如果 ID2∼ID0 =100 ,,表示该从片接在主片的 IR4 端。

192
3.5 可编程中断控制器 8259A
初始化命令字 /
中断优先级管理方式: 预置命令字
( 1((4)ICW
ICW4 )
)一般嵌套方式: 4 :用于设置 8259A 的工作方式,写入 A0=1 IR
IRi 端引入的中断请求具有固定的优先级, 的0 最高,
端口。 ICW1 的 D0(IC4) 位为 ISR
IR7 最低。当一个中断请求被响应时, 1 时,才写入 ICW
中的对应位被置 1 4,。8259A 把中
断类型码放到数据总线上,然后进入中断服务程序。封锁同级或低级的中断
请求,但并不禁止比本级优先级高的中断请求,以实现中断嵌套。
(2) 特殊嵌套方式:在主从结构的 8259A 系统中,将主片设置为特殊全嵌套
方式,可以在处理某一级中断时,不但允许优先级更高的中断请求进入,也
允许同级的中断请求进入。

(1)  D3 :
正常 BUF
EOI 位,若该位为 1 ,则 8259A 工作于缓冲方式,
:该方式用于完全嵌套方式下的中断结束。 8259A 通过数据总线收
CPU 在中断服务程序结束时,向
8259A发发常规中断结束命令
器 和总 线 相连 , -SP/-EN
EOI ,引8259A
脚为 输 出; 该 位
收到这个 为 命令后,自动将中断服务寄存器
EOI 0 , 8259A 工 作 于 非缓冲 方
式, SP/EN 引脚为输入,用做主片、从片选择端。
ISR 中最高优先级的置“ 1” 位清“ 0” 。结束当前正在处理的中断。
(2)自动
D2 :EOI
M/S:任何一级中断被响应后,
位,当 D3 即 BUF 位为 1 时,该位才有效,用于主
ISR 寄存器中相应位置“ /1” 从片选择, 0 表示
, CPU 将进入中断
响应总线周期,在第二个中断响应信号(
为从片, 1 表示为主片;当 BUF 位为-INTA )结束时,自动将 ISR 相应位清“ 0” ,被
0 时该位无效,可设为任意值。
称位自动D1 :EOI 方式;该方式是在中断响应后,而不是在中断处理结束后将
AEOI 位,设置结束中断方式。 0 表示中断正常结束,靠中断结束指令清除 ISR 位清 0 。这
样,在中断处理过程中, 8259A 中就没有“正在处理”的标识。此时,若有中断请求出
ISR 相应位; 1 表示自动结束中断,即 CPU 响应中断后,立即自动清除 ISR 相应
现,且 IF = 1 ,则无论其优先级如何,都将得到响应。这就有可能出现低级别中断打断高
位。
级中断或同级中断相互打断的不合理现象。 193
初始化编程
任何一种 8259A 的
初始化都必须发送
ICWl 和 ICW2 , 只
有在 ICWl 中指明需
要 ICW3 ( ICW1 中 D1 位
为 1 是单级使用,为 0 级联使
用)和 ICW4 ( D0 位为
1 需要设置 ICW4 ) 以后,
才 发 送 ICW3 和
ICW4 。
一旦初始化以后,
若要改变某一个
ICW ,则必须重新
再进行初始化编
程,不能只是写入
单独的一个 ICW 。
194
2.3.4 可编程中断控制器 8259A
例如: 8086/8080 系统机中的 8259A 初始化过程
主片定义为:上升沿触发、在 IR2 级联从片、有 ICW4 、非 AEOI 方
式、中断类型号 08H∼0FH 、一般的中断嵌套方式、端口地址是 20H 、
21H ;
从片定义为:上升沿触发、级联到主片的 IR2 、有 ICW4 、非 AEOI 方
式、中断类 型号为 70H∼78H 、一般的中断 嵌套方式、端口地址是
A0H 、 A1H 。
0 0 0 1 0 0 0 1
ICW1

11H

ICW2 用于设置中断类型号,写入 A0=1 的端口。


08H
A0 7 6 5 4 3 0
1 0 0 0 0 1 0 0 0
2.3.4 可编程中断控制器 8259A
在 IR2 级联从片
A0 7 6 5 4 3 0

ICW
3 1 S7 S6 S5 S4 S3 S2 S1 S0 主 8259A

片 00000100B=04H
对于主片, ICW3 的 S0∼S7 指明了 IR0∼IR7 各引脚连接从片的情况,置 1
的 位 表 示 对 应 的 引 脚 有 从 片 级 联 。 例 如 , 若 主 片 ICW3 的 内 容 为
07H(00000111B) 时 , 说 明 主 片 的 IR0 、 IR1 、 IR2 上连有从片。

ICW4

一般的中断嵌套方式,非缓冲,正常 EOI , 8086 系统

00000001B=01H
2.3.4 可编程中断控制器 8259A
例如: 8086/8080 系统机中的 8259A 初始化过程
从片定义为:上升沿触发、级联到主片的 IR2 、有 ICW4 、非 AEOI 方
式、中断类 型号为 70H∼78H 、一般的中断 嵌套方式、端口地址是
A0H 、 A1H 。
0 0 0 1 0 0 0 1
ICW1

11H

ICW2 用于设置中断类型号,写入 A0=1 的端口。



70H
A0
7 6 5 4 3 0
1 0 1 1 1 0 0 0 0
2.3.4 可编程中断控制器 8259A
级联到主片的 IR2


ICW3 00000010B=02H
A0 7 6 5 4 3 0
片 1 0 0 0 0 0 ID2 ID1 ID0 从 8259A
对于从片, ICW3 的 D7∼D3 不用,置 0 即可;用 ID2∼ID0 表示与主片的对应引脚
级联,例如,若某从片 ICW3 的内容为 00000111B ,说明该从片的 INT 引脚与主
片的 IR7 相连;如果 ID2∼ID0 =100 ,,表示该从片接在主片的 IR4 端。

ICW4
一般的中断嵌套方式,非缓冲,正常 EOI , 8086 系统

00000001B=01H
2.3.4 可编程中断控制器 8259A
例如: PC/AT 机中的 8259A 初始化过程
主片定义为:上升沿触发、在 IR2 级联从片、有 ICW4 、非 AEOI 方
式、中断类型号 08H∼0FH 、一般的中断嵌套方式、端口地址是 20H 、
21H ;
从片定义为:上升沿触发、级联到主片的 IR2 、有 ICW4 、非 AEOI 方
式、中断类 型号为 70H∼78H 、一般的中断 嵌套方式、端口地址是
A0H 、 A1H 。0 0 0 1 X 0 X X

ICW1

ICW2

ICW3

ICW4
2.3.4 可编程中断控制器 8259A
操作命令字
系统初始化完成以后,可以在应用程序中随时向 8259A 送
操作命令字,以改变 8259A 的工作方式,读出 8259A 内部
寄存器的值等。
( 1) OCW1 :实现中断屏蔽功能,写入 A0=1 的端口,
其端口地址为奇地址,内容直接置入中断屏蔽寄存器 IMR 。

MX=1 表示屏蔽中断源 IRX 引入的中断请求; MX=0 表示来自 IRX


的中断请求得到允许。例如,若 OCW1=03H ,说明 IR0 和 IR1 上
的中断请求被屏蔽。
200
2.3.4 可编程中断控制器 8259A
操作命令字 ( 2 ) OCW2 :设置中断结束方式和优先级循
环方式,写入 A0=0 的端口。

L0L1L2 字段给出当前结束
的是哪一级的中断
2.3.4 可编程中断控制器 8259A

( 2 ) OCW2

1 ) 001 :普通 EOI 方式,一旦结束中断服务程序, CPU 给 8259A 送 EOI 结束命
令, 8259A 将 ISR 寄存器中当前级别最高的置“ 1” 位清“ 0” ;
2 ) 011 :特殊 EOI 方式,除给 8259A 送 EOI 结束命令外,还由 L2 , L1 , L0 字段给
出当前结束的是哪一级的中断, 8259A 将 ISR 寄存器中指定级别的相应位
清“ 0” ;
3 ) 101 :普通 EOI 循环方式,一旦结束中断服务程序, CPU 给 8259A 送 EOI 结束
命令,将 ISR 寄存器中当前级别最高的置“ 1” 位清“ 0” ,并将最低优先级赋给
刚结束的中断请求 IRi ,将最高优先级赋给 IRi+1 ,其他中断优先级按循环方式顺序
改变;
4 ) 111 :特殊 EOI 循环方式,一旦结束中断服务程序, 8259A 将 ISR 寄存器中由
L2 , L1 , L0 字段给定级别的相应位清“ 0” ,并将最低优先级赋给这一中断请求,
最高优先级赋给原来比它低一级的中断请求,其他中断优先级按循环方式顺序改
变;
5 ) 100 或 000 :自动 EOI 循环方式, CPU 将在中断响应总线周期的第二个中断响
应信号 -INTA 结束时,将 ISR 寄存器中相应位置“ 0” ,并将最低优先级赋给这一
级,最高优先级赋给原来比它低一级的中断请求,其他中断优先级按循环方式顺序
2.3.4 可编程中断控制器 8259A
操作命令字
( 3 ) OCW3 :具有三个方面的功能:设置和撤消特殊屏蔽
方式、设置中断查询方式以及设置对 8259A 内部寄存器的读
出。 OCW3 写入 A0=0 的端口。

203
2.3.4 可编程中断控制器 8259A

( 2 ) OCW3

1 ) RR 位是读寄存器命令, RR=1 表示 CPU 要读取 8259A
中某寄存器的内容; RIS=0 ,表示要读取 IRR 寄存器的内
容; RIS=1 表示要读取 ISR 寄存器的内容。
如果将 RR 和 RIS 设置称“ 10” ,然后安排一条输入指令 IN ,则将
8259A 中 IRR 寄存器的内容读到 CPU 的 AL 寄存器中;而如果将 RR 和
RIS 设置称“ 11” ,然后安排一条输入指令 IN ,则将 8259A 中 ISR 寄存
器的内容读到 CPU 的 AL 寄存器中;
如果要读取 IMR 寄存器的内容呢?

只要将端口地址设成奇地址
( A0=1 ),直接安排一条
IN 指令,便可将 IMR 寄存
器内容读入 AL 寄存器。
2.3.4 可编程中断控制器 8259A

( 2 ) OCW3

2 ) P 位:查询位,将 P 位置“ 1” 后,表示 CPU 向 8259A
发查询命令,查询当前是否有中断正在被处理。如果有,则
给出当前处理的最高优先级是哪一级。查询字格式
IR L2 L1 L0
=1 表示有中断请求;
给出当前处理的最高
=0 表示无中断请求。 优先级

3 ) ESMM 和 SMM 位设置成“ 11” 时,表示定义 8259A 采


用特殊屏蔽方式,这种情况下只屏蔽同级中断请求进入,而
允许高级中断打断低级中断,也允许低级中断打断高级中
断。当 ESMM 和 SMM 位设置成“ 10” 时,表示取消这种特
殊屏蔽方式。
2.3.4 可编程中断控制器 8259A

操作控制字 OCW1~OCW3 可安排在预置命令字之


后,用户可以在程序的任何位置上设置它们。

当要读取 ISR 或 IRR 寄存器内容或需要查询当前


8259A 的中断状态时,都必须先定义 OCW3 ,然后用
IN 指令读入。

如果只需要读取 IMR 的内容,则不需要定义


OCW3 ,只要通过奇地址读入 OCW1 的内容就可。
可见,并不是任何时候都需要设置 OCW3 操作命令
字。
206
2.3.4 可编程中断控制器 8259A
 8259A 的读操作
 在 PC 机中 8259A 的端口地址为 20H 和 21H ,以此为例介绍 8259A
常用的读操作有。
1 )读出 IRR 的值:先向 20H 端口写 0AH(OCW3 : RR=1 、 RIS=0) ,
再读 20H 端口。
MOV AL , 0AH ; OCW3=0AH
OUT 20H , AL ; OCW3 写入 8259A
IN AL , 20H ;读出 IRR 内容
2) 读出 ISR 的值:先向 20H 端口写 0BH(OCW3 : RR=1 、 RIS=1) ,
再读 20H 端口。
MOV AL , 0BH ; OCW3=0BH
OUT 20H , AL ; OCW3 写入 8259A
IN AL , 20H ;读出 ISR 内容

207
3) 读查询字 ( 读出最高级别的 IR L2 L1 L0
中断请求 IR) :先向 20H 端口
写 0CH(OCW3 P=1) ,再读 =1 表示有中断请求;
给出当前处理的最高
20H 端口。 =0 表示无中断请求。 优先级

4) 读 IMR 的值。随时可用奇地址读 IMR 的值,并对其作修


改。

OCW1 写入奇地址

208
例: 8259A 级联使用的初始化程序举例

某系统中设置两片 8259A 实现中断控制,它们之间采用级联方式连接,


一片从 8259A 的 INT 端与主 8259A 的 IR3 端相连,已知当前主 8259A
的 IR0 和 IR5 端分别引入两个中断请求,从 8259A 的 IR2 和 IR3 端上也
分别引入两个中断请求。中断请求均为上升沿触发。特殊嵌套,正常
EOI.
2.3.4 可编程中断控制器 8259A
( 1 )已知主 8259A 引入的中断类型码分别为 40H 和 45H ,它们的中
断服务程序在同一个段中,其段基址为 1000H ,偏移地址分别为 1050H
和 2060H ,而由从 8259A 引入的中断请求 IR2 和 IR3 的中断类型码为
32H 和 33H ,它们的中断服务程序在同一个段中,其段基址为 2000H ,
偏移地址分别为 5440H 和 3620H ,请首先将四个中断入口写入中断向量
表。

32H*4=00C8H ;
33H*4=00CCH

主 8259A 的请自己写
2.3.4 可编程中断控制器 8259A
( 2 )若已知主 8259A 的端口地址为 FFE8H 和 FFE9H ,从 8259A 的
端口地址为 FFFAH 和 FFFBH ,分别对主 8259A 和从 8259A 进行初始
化。
主片初始化程序段如下:
MOV AL , 11H ;定义 ICW1
MOV DX , 0FFE8H
OUT DX , AL
MOV AL , 40H ;主中断类型码 40H
MOV DX , 0FFE9H
OUT DX , AL
MOV AL , 08H ;从 8259A 的 INT 端

;主
8259A 的 IR3 端相连
OUT DX , AL
MOV AL , 11H ; ICW4
OUT DX , AL
MOV AL , 0D6H ; OCW1 从 8259A 的 INT 端与主 8259A 的 IR3 端相连,已
OUT DX , AL 知当前主 8259A 的 IR0 和 IR5 端分别引入两个中断
MOV AL , 20H ; OCW2 请求
从 8259A 的请自己写
8259A 应用举例

设 8259A 在 PC/XT 机中的连接如附图,其中的 IR2 端是


保留端,其余都已被占用。现假设某外设的中断请求信号
由 IR2 端引入,要求编程实现 CPU 响应该中断时屏幕显示
字符串“ WELCOME !”。
已知主机启动时 8259A 中断类型号的高 5 位已初始化为
00001 ,故 IR2 的类型号为 0AH(00001010B) ; 8259A 的中断
结束方式初始化为非自动结束,即要在服务程序中发 EOI 命
令; 8259A 的端口地址为 20H 和 21H 。
DATA SEGMENT
MESS DB 'WELCOME ! ' , 0AH , 0DH , '$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE , DS:DATA
START: MOV AX , SEG INT2
MOV DS , AX
MOV DX , OFFSET INT2 设置中断服务程序入口地址
MOV AX , 250AH
INT 21H
IN AL , 21H ;读中断屏蔽寄存器,开放
AND AL , 0FBH ;IR2 中断
OUT 21H , AL
STI
LL : JMP LL ;等待中断
MOV AH , 4CH
INT 21H
213
INT2 : MOV AX , DATA ;中断服务程序
MOV DS , AX
MOV DX , OFFSET MESS
MOV AH , 09 ;输出 DX 中的字符串, 9 号系统功能调用
INT 21H ;显示每次中断的提示信息
MOV AL , 20H ;偶地址 + D3D4 特征位由可判断是 OCW2
显示完字符,在 OUT 20H , AL ;发出 EOI 结束中断
程序中发 EOI 命 IN AL , 21H
令,屏蔽掉 IR2 OR AL , 04H ;屏蔽 IR2 中断
引脚的中断请求 OUT 21H , AL
STI
IRET ;返回主程序
CODE ENDS
END START

214
设置中断服务程序入口地址的方法
1 . DOS 系统功能调用法
功能号: (AH)=25H 。
入口参数: (AL)= 中断类型号
  (DS)= 中断服务程序入口地址的段地址
(DX)= 中断服务程序入口地址的偏移地址

以下程序段完成中断类型号为 60H 的入口地址置入:


PUSH DS ;保护 DS
MOV DX , OFFSET INT60H ;取服务程序偏移地址
MOV AX , SEG INT60H ;取服务程序段地址
MOV DS , AX
MOV AH , 25H ;送功能号
MOV AL , 60H ;送中断类型号
INT 21H ; DOS 功能调用
POP DS ;恢复 DS
2 .直接装入法
用传送指令直接将中断服务程序首地址置入向量表中。设中断
类型号为 60H( 此类型号对应的向量表地址为从 00180H 开始的四
个连续存储单元 ) ,中断服务子程序符号名为 INT60H 。程序段如
下:
XOR AX , AX
MOV DS , AX
MOV AX , OFFSET INT60H ; AX=3412H
MOV DS : [0180H] , AX ;置服务程序偏移地址
MOV AX , SEG INT60H ; AX=7856H
MOV DS : [0180H+2] , AX ;置服务程序所在代码段的段地址

IP 12H 0180H
34H 0181H
CS 56H 0182H
78H 0183H
8259A 的应用实验

8259A 的单次中断实验接线图

单次脉冲开关与 8259A 的 MIR7 ( IR7 引脚)相连,


每按动一次单次脉冲开关,产生一次外部中断,在显示
器上输出一个字符“ 7” 。 MIR 的中断类型码为
0FH (中断向量表的地址为 0000 :
003CH~0000:003FH )。
MIR 的中断类型码为 0FH, 高 5 为 08H
直接装入法设置中断服
务子程序入口地址。

允许 IR7 中断
Mov ah,01h
Mov al,37h; 显示字符 7
Int 10h
接线,按动单次脉冲
8259A 响应单次脉冲中断,每响应一次,输出一次“ 7”
8259A 小 结
ICW 用于 8259A 的初始设定,即当计算机刚启动时,由 CPU 按
次序发送 2∼4 个不同格式的 ICW ,用来建立起 8259A 操作的初始状
态。
操作命令字 (OCW) 用于动态控制中断处理,是在需要改变或控制
8259A 操作时随时发送的。
每片 8259A 包含两个端口地址 , 一个偶地址端口 (A0=0), 一个奇地
址端口 (A0=1) ,所有的命令字都是通过这两个端口来发送的。
命令字 地址端口 A0
初始化过程:通过 A0 、
初始 ICW1 0 次序以及相应的 ICW1
化命 ICW2 1 设置,决定依次写入的
令字 是哪个初始化命令字。
ICW3 1
ICW4 1
OCW1 :奇地址读 / 写,
OCW1 1 对应 IMR 的设置或读入;
操作
命令 OCW2 0
OCW2 和 OCW3 都对应
字 OCW3 0 偶地址,通过特征位区
分。
可编程接口器件

8255A 、 8253 、 8259A 、 8251A 端口


1)8255A
A 、 B 、 C 及控制端口: A1∼A0 :端口选择信号。在实际使用
中, A1 、 A0 端接到系统地址总线的 A1 、 A0 。当 A1A0=00 ,选择端
口 A ;当 A1A0=01 ,选择端口 B ;当 A1A0=10 ,选择端口 C ;当
A1A0=11 ,选择公共的控制端口; 初始化是往控制口写工作方式控制字
和 C 口置位 / 复位控制字 ( 可选 ) 。
2)8253
8253 共占用 4 个 I/O 地址。当 A1A0=00 时,为计数器 0 中的 CR( 计数
初值寄存器 ) 和 OL( 输出锁存寄存器 ) 寄存器的共用地址,至于是将计
数初值写入 CR ,还是从 OL 中读出当前计数值,则由控制信号 -WR
和 -RD 决定,这两个信号同时只能有一个有效。当 A1A0=01 和 10 时,
分别为计数器 1 和计数器 2 的 CR 和 OL 的共用地址。当 A1A0=11 时,
是 3 个计数器内的 3 个控制寄存器的共用地址,至于 CPU 是给哪个计
数器送控制字,则由控制字中的最高两位的编码决定。初始化首先 CPU
用输出指令向控制寄存器送控制字,然后再用输出指令向计数初值寄存
223
可编程接口器件
3)8251A
C/-D—— 控制 / 数据信号,通常该引脚与 CPU 的 A0 引脚相连,实现
8251A 内部寄存器的寻址。 8251A 有两个端口:控制口和数据口。初
始化方式控制字和命令控制字送控制口,数据通过数据口送出或读
入。 8251 进行初始化编程,首先写入方式控制字,以决定通信方式、
数据位数、校验方式等。若是同步方式则紧接着送入一个或两个同步
字符,若是异步方式则这一步可省略,后送入命令控制字。初始化过
程的信息全部写入控制端口,特征是 C/-D=1 ,即地址线 A0=1 。
命令字 地址端口 A0
4)8259A
ICW1 0
初始
化命 ICW2 1
两个端口地址 , 一个偶
地址端口 (A0=0), 一个 令字 ICW3 1
奇地址端口 (A0=1) ,所 ICW4 1
有的命令字都是通过这 OCW1 1
两个端口来发送的 操作
命令 OCW2 0
字 OCW3 0
224

You might also like