539 lines
28 KiB
Markdown
539 lines
28 KiB
Markdown
# 第 7 章 可编程接口芯片 —— 期末复习总结
|
||
|
||
> **本章导读**:所谓"可编程接口芯片",即芯片本身可被设计成具有多项功能或多种工作方式,使用时由 CPU 通过"写控制字"来选择所需功能或工作方式。本章介绍三大经典芯片:
|
||
> - **7.1 可编程并行接口芯片 8255A**
|
||
> - **7.2 可编程定时/计数器接口芯片 8253**
|
||
> - **7.3 可编程串行通信接口芯片 8251A**
|
||
|
||
---
|
||
|
||
## 一、详细内容分析
|
||
|
||
### 7.1 可编程并行输入/输出接口芯片 8255A
|
||
|
||
#### 7.1.1 8255A 的内部结构与引脚功能
|
||
|
||
**基本特性**:
|
||
- Intel 8255A 是通用的可编程**并行 I/O** 接口芯片。
|
||
- 内部结构由 4 部分组成:① 数据端口;② A 组/B 组控制电路;③ 数据总线缓冲器;④ 读/写控制逻辑。
|
||
- 有 **3 个 8 位并行数据端口**:端口 A(PA7-PA0)、端口 B(PB7-PB0)、端口 C(PC7-PC0)。
|
||
- 端口分为 **A 组**(A 口 + C 口高 4 位 PC7-PC4)和 **B 组**(B 口 + C 口低 4 位 PC3-PC0)两组独立管理。
|
||
- 支持 3 种工作方式:**方式 0、方式 1、方式 2**。
|
||
|
||
**CPU 接口信号**:
|
||
- D7-D0:三态 8 位双向数据总线缓冲器,与系统数据总线相连。
|
||
- RESET:复位信号(高电平有效),复位后所有端口置为输入方式。
|
||
- CS:片选信号,低电平有效。
|
||
- RD、WR:读、写控制信号,低电平有效。
|
||
- A1、A0:端口选择信号,配合 RD/WR/CS 选中 4 个内部寄存器。
|
||
|
||
**端口地址(A1、A0 编码)**:
|
||
|
||
| A1 | A0 | 选中端口 |
|
||
|----|----|---------------|
|
||
| 0 | 0 | A 口(数据口)|
|
||
| 0 | 1 | B 口(数据口)|
|
||
| 1 | 0 | C 口(数据口)|
|
||
| 1 | 1 | 控制口 |
|
||
|
||
**端口读写功能表**(CS=0):
|
||
|
||
| 操作 | A1 | A0 | RD | WR | 功能 |
|
||
|---------|----|----|----|----|----------------------------|
|
||
| 读操作 | 0 | 0 | 0 | 1 | 数据总线 ← A 口(CPU 读 A) |
|
||
| 读操作 | 0 | 1 | 0 | 1 | 数据总线 ← B 口 |
|
||
| 读操作 | 1 | 0 | 0 | 1 | 数据总线 ← C 口 |
|
||
| 写操作 | 0 | 0 | 1 | 0 | A 口 ← 数据总线 |
|
||
| 写操作 | 0 | 1 | 1 | 0 | B 口 ← 数据总线 |
|
||
| 写操作 | 1 | 0 | 1 | 0 | C 口 ← 数据总线 |
|
||
| 写操作 | 1 | 1 | 1 | 0 | 控制寄存器 ← 数据总线 |
|
||
|
||
#### 7.1.2 8255A 的控制字(两类)
|
||
|
||
**(1) 方式选择控制字(D7=1)**
|
||
|
||
```
|
||
D7 D6 D5 D4 D3 D2 D1 D0
|
||
1 M1 M0 C2 B A CH CL
|
||
│ └A组方式 └C口高4位 └B口 ┘ └C口低4位 ┘
|
||
特征位 00=方式0
|
||
01=方式1
|
||
1x=方式2
|
||
0=输出 1=输入
|
||
```
|
||
|
||
| D7 | D6 D5 | D4 | D3 | D2 | D1 | D0 | 含义 |
|
||
|----|-------|----|----|----|----|----|---------------------------------|
|
||
| 1 | A 组方式 | C 口高 4 位 I/O(0=出,1=入) | B 组方式(0=方式 0, 1=方式 1) | B 口 I/O | C 口低 4 位 I/O | A 口 I/O |
|
||
|
||
**(2) C 口置位/复位控制字(D7=0)**
|
||
|
||
用于单独对 C 口某一位(PC0-PC7)置 1 或清 0,不影响其它位。
|
||
- D7=0(特征位)
|
||
- D6 D5 D4 = 任意(不用)
|
||
- D3 D2 D1 = 位选择(000 对应 PC0,111 对应 PC7)
|
||
- D0 = 0 复位,1 置位
|
||
|
||
```assembly
|
||
; 例如:把 PC3 置 1
|
||
MOV AL, 00000111B ; D7=0, D3D2D1=011(PC3), D0=1 置位
|
||
OUT 63H, AL
|
||
```
|
||
|
||
#### 7.1.3 8255A 的工作方式
|
||
|
||
| 方式 | 适用端口 | 特点 |
|
||
|------|---------------------|-------------------------------------------------------------|
|
||
| 0 | A 口、B 口、C 口 | **基本的输入/输出**;无握手联络信号;分两个 8 位(A、B)和两个 4 位(CH、CL)独立设置方向;CPU 直接 IN/OUT |
|
||
| 1 | A 口、B 口 | **选通(握手)的输入/输出**;C 口引脚作为联络/握手信号;可中断;分输入与输出两种情形 |
|
||
| 2 | 仅 A 口 | **双向选通 I/O**;A 口分时双向传输;C 口的 PC3-PC7 作双向联络信号 |
|
||
|
||
**方式 1 输入(A 口、B 口)的联络线**:
|
||
- STB(输入):选通信号,**低电平有效**,由外设送来,把外设数据打入端口锁存器。
|
||
- IBF(输入缓冲器满):高电平有效,由 8255A 输出,通知外设"数据已收到"。
|
||
- INTR(中断请求):高电平有效,INTE=1 且 IBF=1 且 RD 上升沿时产生。
|
||
- INTE(中断允许):A 口用 **PC4** 置位/复位控制;B 口用 **PC2** 置位/复位控制。
|
||
- A 口输入时:PC4=STB、PC5=IBF、PC3=INTRA
|
||
- B 口输入时:PC2=STB、PC1=IBF、PC0=INTRB
|
||
- PC7-PC6:I/O(仍可作普通 I/O)
|
||
|
||
**方式 1 输出(A 口、B 口)的联络线**:
|
||
- OBF(输出缓冲器满):低电平有效,CPU 已把数据送到端口。
|
||
- ACK(响应):低电平有效,由外设送来,通知 8255A 数据已收到。
|
||
- INTR(中断请求):高电平有效,ACK 上升沿后产生。
|
||
- INTE:输出 A 口由 **PC6** 置位/复位;输出 B 口由 **PC2** 置位/复位。
|
||
- A 口输出:PC7=OBF、PC6=ACK、PC3=INTRA
|
||
- B 口输出:PC1=OBF、PC2=ACK、PC0=INTRB
|
||
- PC5-PC4:I/O
|
||
|
||
**方式 2(A 口双向)**:
|
||
- 仅 A 口适用,PC3-PC7 共 5 个联络信号,含义与方式 1 类似。
|
||
- INTE1(输出中断允许)由 **PC6** 置/复位;INTE2(输入中断允许)由 **PC4** 置/复位。
|
||
- INTRA 在输入或输出时都可以产生。
|
||
|
||
#### 7.1.4 8255A 的应用举例(例 7.1.1:方式 0 产生波形)
|
||
|
||
**题目**:8255A 在方式 0 工作,使其在 PC0、PC3 引脚产生如图所示波形,端口地址 60H/61H/62H/63H。
|
||
|
||
**硬件连接分析**:
|
||
- 高位地址 A7-A2 通过 74LS138 译码产生片选 CS(要求 Y0 有效,A7-A2=011000)。
|
||
- 低位地址 A1、A0 直接连 8255A 的 A1、A0,所以:
|
||
- A 口地址 = 0110 00 00 = **60H**
|
||
- B 口地址 = **61H**
|
||
- C 口地址 = **62H**
|
||
- 控制口地址 = **63H**
|
||
|
||
**应用基本过程**:
|
||
1. **端口地址归纳**(设计):根据硬件连接确定端口地址,或根据接口要求设计硬件。
|
||
2. **控制字归纳**:根据工作方式,按方式选择控制字格式归纳控制字。
|
||
3. **编写程序**:先初始化(写控制字),再写功能程序。
|
||
|
||
**初始化与波形程序**(方式 0 输出,A/B/C 全输出,故控制字 D7=1,方式 0 → D6D5=00,PC3、PC0 输出 → D3、D0 都要是 0 = 1000 0000B = 80H):
|
||
|
||
```assembly
|
||
START: MOV AL, 80H ; 方式 0 输出控制字(A/B/C 全部为输出)
|
||
OUT 63H, AL
|
||
A1: MOV AL, 01H ; PC0=1, PC3=1 → 0000 1001? 注意波形图中PC3=0,PC0=1时为01H
|
||
OUT 62H, AL
|
||
CALL D1ms
|
||
MOV AL, 09H ; 1001B → PC3=1, PC0=0
|
||
OUT 62H, AL
|
||
CALL D1ms
|
||
MOV AL, 00H ; PC3=0, PC0=0
|
||
OUT 62H, AL
|
||
CALL D1ms
|
||
MOV AL, 08H ; PC3=1, PC0=0
|
||
OUT 62H, AL
|
||
CALL D1ms
|
||
JMP A1
|
||
```
|
||
|
||
> 注:本题也可使用 C 口置位/复位控制字单独控制 PC3、PC0,避免整体重写。
|
||
|
||
---
|
||
|
||
### 7.2 可编程计数器/定时器 8253
|
||
|
||
#### 7.2.1 8253 的基本功能
|
||
|
||
1. **3 个独立的 16 位计数器**(计数器 0、1、2),每个能完成 16 位减法计数。
|
||
2. 每个计数器有 **6 种工作方式**(方式 0~5)。
|
||
3. 能进行 **二进制/十进制(BCD)减法计数**。所谓十进制计数是指 BCD 码计数。
|
||
4. 计数频率范围 0~2 MHz。
|
||
5. 既可作**计数器**也可作**定时器**使用。
|
||
|
||
#### 7.2.2 8253 内部结构与引脚
|
||
|
||
**4 个可寻址的端口(A1、A0 编码)**:
|
||
|
||
| A1 | A0 | 端口 |
|
||
|----|----|--------------------|
|
||
| 0 | 0 | 计数器 0(数据口) |
|
||
| 0 | 1 | 计数器 1(数据口) |
|
||
| 1 | 0 | 计数器 2(数据口) |
|
||
| 1 | 1 | 控制口 |
|
||
|
||
**每个计数器 3 条外部信号**:
|
||
- **CLK**:计数脉冲输入,上升沿触发计数。
|
||
- **GATE**:门控信号,启动或禁止计数器。
|
||
- **OUT**:计数器状态输出,当减到 0 时按工作方式输出相应波形。
|
||
|
||
**每个计数器内部 4 个寄存器**(每个 16 位):
|
||
1. 8 位控制寄存器(实际只用 6 位)。
|
||
2. 16 位计数初值寄存器(保存 CPU 写入的初值)。
|
||
3. 16 位减 1 计数器(实际执行减 1 操作)。
|
||
4. 16 位输出锁存器(CPU 读取当前计数值时使用)。
|
||
|
||
**计数初值计算**:
|
||
- **计数方式**:计数初值 = 要求的计数次数 N。
|
||
- **定时方式**:计数初值 = 定时时间 t / 时钟脉冲周期 TCLK = t × fCLK。
|
||
|
||
**计数初值 0 等价于最大值**:十进制 = 10000,二进制 = 65536(0000H 等于 10000H / FFFFH+1)。
|
||
|
||
**读/写格式(RL1、RL0 决定)**:
|
||
- 00 = 锁存命令(锁存当前计数值供 CPU 读)
|
||
- 01 = 只读/写低 8 位,高 8 位自动为 0
|
||
- 10 = 只读/写高 8 位,低 8 位自动为 0
|
||
- 11 = 先低 8 位后高 8 位(读写 16 位)
|
||
|
||
#### 7.2.3 8253 的控制字格式
|
||
|
||
控制字写入 **控制口(A1A0=11)**:
|
||
|
||
```
|
||
D7 D6 D5 D4 D3 D2 D1 D0
|
||
SC1 SC0 RL1 RL0 M2 M1 M0 BCD
|
||
└计数器选择┘ └读/写格式┘ └工作方式┘ └计数方式┘
|
||
```
|
||
|
||
| 字段 | 编码与含义 |
|
||
|-----------|----------------------------------------------------------------------------------|
|
||
| SC1 SC0 | 00=计数器 0,01=计数器 1,10=计数器 2,11=非法 |
|
||
| RL1 RL0 | 00=锁存命令,01=只读/写低 8 位,10=只读/写高 8 位,11=先低 8 位后高 8 位 |
|
||
| M2 M1 M0 | 000=方式 0,001=方式 1,×10=方式 2,×11=方式 3,100=方式 4,101=方式 5 |
|
||
| BCD | 0=二进制计数,1=BCD(十进制)计数 |
|
||
|
||
**编程原则**:
|
||
1. 控制字必须在计数初值之前写入;写入控制字有复位作用,使 OUT 变为各方式规定的初始状态。
|
||
2. 16 位计数(初)值的读写必须遵守控制字 RL1、RL0 规定的顺序。
|
||
3. 读取计数值有 2 种方法:**简单读出**(直接读,先锁存再读)和**锁存读出**(先发锁存命令再读)。
|
||
|
||
#### 7.2.4 8253 的六种工作方式(核心考点)
|
||
|
||
| 方式 | 名称 | OUT 输出波形 | 启动方式 | 计数值使用 |
|
||
|------|------------------|-------------------------------|----------|------------|
|
||
| 0 | 计数结束中断方式 | 上升沿(计数到 0 时变高) | 软启动 | 一次有效 |
|
||
| 1 | 可编程单稳方式 | N 个 CLK 的单个负脉冲 | 硬启动 | 多次有效 |
|
||
| 2 | 脉冲频率发生器 | 1 个 CLK 宽的负脉冲(重复) | 软、硬 | 重复有效 |
|
||
| 3 | 方波发生器 | 占空比 ≈ 50% 方波(重复) | 软、硬 | 重复有效 |
|
||
| 4 | 软件触发选通 | 计数到 0 后 1 个 CLK 负脉冲 | 软启动 | 一次有效 |
|
||
| 5 | 硬件触发选通 | 计数到 0 后 1 个 CLK 负脉冲 | 硬启动 | 多次有效 |
|
||
|
||
- **软启动**:写入计数初值后即开始计数(GATE=1)。
|
||
- **硬启动**:必须等到 GATE 上升沿才启动计数。
|
||
- **一次有效**:送入计数初值后只能计一轮,结束后停止。
|
||
- **多次有效**(重复有效):计数结束后自动重新装入初值开始新的一轮计数。
|
||
|
||
**方式 0(计数结束中断方式)**:
|
||
- 写入控制字后 OUT 立即变为低电平;
|
||
- 写入初值后开始减 1 计数,计数到 0 时 OUT 变高(产生正跳变),可作中断请求;
|
||
- 计数过程中 GATE=0 禁止计数,GATE=1 继续计数;
|
||
- 计数过程中可改写新的初值,下一个 CLK 按新初值开始计数。
|
||
|
||
**方式 1(可编程单稳)**:
|
||
- 硬启动(GATE 上升沿触发),每触发一次输出一个宽度为 N×TCLK 的负脉冲;
|
||
- 在脉冲期间再次触发可重新开始(再触发单稳)。
|
||
|
||
**方式 2(脉冲频率发生器 / 速率发生器)**:
|
||
- 写入初值后即开始计数,OUT 平时为高,计数到 1 时 OUT 变低 1 个 CLK,再自动重新装入初值继续;
|
||
- **典型应用**:分频器(产生固定周期的窄负脉冲);
|
||
- GATE=0 停止计数,GATE 上升沿可重新同步启动。
|
||
|
||
**方式 3(方波发生器)**:
|
||
- 写入初值后开始计数,OUT 输出占空比近似 50% 的方波;
|
||
- 初值为**偶数**时,前半段高、后半段低严格对称;
|
||
- 初值为**奇数**时,高电平多 1 个 CLK 周期(高电平 = (N+1)/2 × TCLK,低电平 = (N-1)/2 × TCLK);
|
||
- 重复有效,计数到 0 后自动重装初值。
|
||
|
||
**方式 4(软件触发选通)**:
|
||
- 写入初值即启动,OUT 平时为高,计数到 0 时输出 1 个 CLK 的负脉冲;
|
||
- 一次有效(与方式 0 类似但多 1 个负脉冲输出)。
|
||
|
||
**方式 5(硬件触发选通)**:
|
||
- 硬启动,GATE 上升沿触发;触发后 OUT 平时为高,计数到 0 时输出 1 个 CLK 的负脉冲;
|
||
- 多次有效:每次 GATE 上升沿都重新开始一轮。
|
||
|
||
#### 7.2.5 8253 的应用举例(例 7.2.1:初始化设计)
|
||
|
||
**题目**:8253 通道 1 工作于方式 0,按 BCD 方式计数,初值 400。计数器 0/1/2 和控制寄存器端口地址依次为 80H-83H。
|
||
|
||
**分析步骤**:
|
||
1. **端口地址**:80H/81H/82H/83H。
|
||
2. **控制字**:通道 1(SC1SC0=01)、方式 0(M2M1M0=000)、只写低 8 位(RL1RL0=01,因为初值 400 < 256 不需要高字节,也可写 11=16 位)、BCD 计数(BCD=1)。
|
||
→ 控制字 = 01 01 000 1 = 0111 0001B = **71H**(若选 16 位读写则为 0111 1011 = 7BH)。
|
||
3. **计数初值**:400,BCD 格式 → 04 00H(送两次:先低 00H,后高 04H)。
|
||
|
||
**初始化程序**(按 RL1RL0=01 只写低 8 位示例):
|
||
|
||
```assembly
|
||
MOV AL, 71H ; 控制字:通道1, 方式0, BCD, 只写低8位
|
||
OUT 83H, AL
|
||
MOV AL, 00H ; 低 8 位计数值
|
||
OUT 81H, AL
|
||
MOV AL, 04H ; 高 8 位计数值(虽 RL=01 也常按 16 位分两次写)
|
||
OUT 81H, AL
|
||
```
|
||
|
||
> **常考点**:计数初值公式 = 输入时钟频率 / 期望输出频率(对方式 2、3 而言,输出频率即 OUT 引脚信号频率)。
|
||
|
||
---
|
||
|
||
### 7.3 可编程串行通信接口芯片 8251A
|
||
|
||
#### 7.3.1 串行通信概述
|
||
|
||
**基本通信方式**:并行通信 vs 串行通信。
|
||
|
||
**两种传输方式**:
|
||
- **基带传输**:直接用电平传送数字信号(如 RS-232)。
|
||
- **频带传输**:用数字信号调制载波,需 Modem(调制解调器),按调制方式分调幅、调频、调相。
|
||
|
||
**传送方向**:
|
||
- **单工**:只能 A→B 单方向。
|
||
- **半双工**:双方都可收发,但不能同时。
|
||
- **全双工**:双方可同时收发(需 2 条独立信道)。
|
||
|
||
**传输速率**:
|
||
- **信息传输速率(比特率)**:单位 bit/s 或 bps。
|
||
- **码元传输速率(波特率)**:单位 Baud。
|
||
|
||
**异步 vs 同步通信**:
|
||
- **异步通信**:以字节(字符)为单位,一帧包括 **起始位 + 数据位(5~8 位) + 奇偶校验位(可选) + 停止位(1/1.5/2 位)**。字符间空闲位为高电平。传送效率较低但简单。
|
||
- **同步通信**:以数据块(字节组)为单位,一帧含 **同步字符 + 数据块**,需收发双方时钟严格同步,传送效率高。
|
||
|
||
#### 7.3.2 8251A 内部结构
|
||
|
||
8251A 是串行通讯接口,可工作于**异步方式**或**同步方式**,字符长度 5/6/7/8 位任选。
|
||
|
||
**5 个组成部分**:
|
||
1. 数据总线缓冲器(与 CPU 数据总线接口)。
|
||
2. 发送缓冲器(并行→串行,从 TXD 发出)。
|
||
3. 接收缓冲器(RXD 接收串行数据→并行)。
|
||
4. 读/写控制逻辑(接收 CPU 的 CS、RD、WR、C/D 等)。
|
||
5. 调制解调器控制电路(DTR、RTS、DSR、CTS)。
|
||
|
||
#### 7.3.3 8251A 的引脚
|
||
|
||
**与 CPU 连接的引脚**:
|
||
- D7-D0、RD、WR、CS、RESET、CLK
|
||
- **C/D**:控制/数据端口选择。C/D=0 选数据口;C/D=1 选控制/状态口。
|
||
- **TXRDY**:发送器准备好(状态位),通知 CPU 可写入新数据。
|
||
- **TXEMPTY**:发送移位寄存器空,高电平有效。
|
||
- **TXC**:发送时钟。
|
||
- **RXRDY**:接收器准备好(状态位),CPU 可读取数据。
|
||
- **RXC**:接收时钟。
|
||
- **SYNDET**:同步检测(同步方式下使用)。
|
||
|
||
**与调制解调器(Modem)的接口信号**:
|
||
- DTR:数据终端准备好,8251A 通知 Modem 已就绪。
|
||
- RTS:请求发送,8251A 要求发送数据。
|
||
- DSR:数据装置准备好,Modem 已就绪。
|
||
- CTS:清除发送(请求发送响应),允许 8251A 发送。
|
||
- RXD:接收数据线;TXD:发送数据线。
|
||
|
||
**读写操作功能表(C/D + RD + WR + CS)**:
|
||
|
||
| C/D | RD | WR | CS | 操作 |
|
||
|-----|----|----|----|-----------------------------|
|
||
| 0 | 0 | 1 | 0 | 数据总线 ← 8251A 数据(CPU 读接收数据)|
|
||
| 0 | 1 | 0 | 0 | 8251A 数据 ← 数据总线(CPU 写发送数据)|
|
||
| 1 | 0 | 1 | 0 | 数据总线 ← 8251A 状态(CPU 读状态字)|
|
||
| 1 | 1 | 0 | 0 | 8251A 控制字 ← 数据总线(CPU 写控制字)|
|
||
| × | 1 | 1 | 0 | 高阻 |
|
||
| × | × | × | 1 | 高阻(未选中) |
|
||
|
||
#### 7.3.4 8251A 的控制字
|
||
|
||
**(1) 方式选择控制字**(**8251A 复位之后**第一个写入;写入"控制口",即 C/D=1):
|
||
|
||
```
|
||
D7 D6 D5 D4 D3 D2 D1 D0
|
||
└停止位┘ └字符长度┘ └奇偶校验┘ └通信方式┘
|
||
```
|
||
|
||
- **D1D0(通信方式选择)**:
|
||
- 00 = 同步方式
|
||
- 01 = 异步方式(×1,时钟 = 波特率)
|
||
- 10 = 异步方式(×16,时钟 = 16×波特率)
|
||
- 11 = 异步方式(×64,时钟 = 64×波特率)
|
||
- **D3D2(字符长度)**:00=5 位,01=6 位,10=7 位,11=8 位。
|
||
- **D5D4(奇偶校验)**:0=不用,1=使用奇偶校验。
|
||
- **D7D6(异步时停止位)**:00=无效,01=1 位停止位,10=1.5 位停止位,11=2 位停止位。
|
||
- **D7D6(同步时同步字符个数)**:00=2 个同步字符(内同步),01=2 个(外同步),10=1 个(内同步),11=1 个(外同步)。
|
||
|
||
**(2) 命令控制字**(方式选择字之后任何时间可写入;写入"控制口"):
|
||
|
||
```
|
||
D7 D6 D5 D4 D3 D2 D1 D0
|
||
EH IR RTS ER SBRK RXE DTR TXEN
|
||
搜索同步 内部复位 请求发送 错误复位 发中止 接收允许 终端准备好 发送允许
|
||
```
|
||
|
||
- **注意**:命令字的 D5(RTS)、D1(DTR) **与引脚反相**(写入 1,引脚输出低)。
|
||
- **D3(SBRK)**=1:强迫 TXD 变低(发中止字符)。
|
||
- **D6(IR)**=1:内部复位(8251A 复位回到初始状态,等同于 RESET)。
|
||
- **D4(ER)**=1:清除错误标志(PE/OE/FE)。
|
||
- **D0(TXEN)**=1:允许发送;**D2(RXE)**=1:允许接收;**D7(EH)**=1:异步时无意义,同步方式下允许搜索同步字符。
|
||
|
||
**(3) 状态字**(只读,反映当前状态;读"状态口"即 C/D=1、RD=0):
|
||
|
||
```
|
||
D7 D6 D5 D4 D3 D2 D1 D0
|
||
DSR SYNDET/BD FE OE PE TXEMPTY RXRDY TXRDY
|
||
```
|
||
|
||
- **DSR/SYNDET/BD/TXEMPTY/RXRDY/TXRDY**:与同名引脚状态相同。
|
||
- **PE=1**:奇偶错;**OE=1**:溢出错(上一字符还没被 CPU 取走,新字符又到了);**FE=1**:格式错(异步方式下未检测到停止位)。
|
||
- **状态位 TXRDY 与引脚 TXRDY 有区别**:状态位 TXRDY 表示**数据输出缓冲器空**;引脚 TXRDY 只有当 **CTS=0**、**TXEN=1** 时才置位(表示可以接收 CPU 数据)。CPU 输出一个字符后状态位 TXRDY 会自动清 0。
|
||
|
||
#### 7.3.4.4 8251A 初始化流程(重要)
|
||
|
||
**关键顺序**:方式选择控制字 → 命令控制字。**两者必须分两次写入同一个控制口**,且**方式选择字必须在复位之后第一个送入**。如果写完方式选择字立刻又写了命令字,CPU 不会执行命令字内容。
|
||
|
||
完整流程:
|
||
1. 系统 **RESET**(或写命令字 D6=1 内部复位)。
|
||
2. 写入 **方式选择控制字**。
|
||
3. 异步方式:跳过;同步方式:输出 1~2 个同步字符。
|
||
4. 写入 **命令控制字**(允许发送/接收、清错误标志等)。
|
||
5. 进行数据传送;发送时查 TXRDY=1,接收时查 RXRDY=1。
|
||
6. 工作中若需要可再次写命令字(含内部复位 IR=1)。
|
||
|
||
#### 7.3.5 8251A 的应用举例(例 7.3.1:异步方式初始化)
|
||
|
||
**题目**:8251A 异步方式,波特率因子 16,每字符 7 位数据位,偶校验,2 个停止位,允许发送和接收。数据口地址 200H,控制口地址 201H。
|
||
|
||
**方式选择控制字**:
|
||
- 通信方式:异步×16 → D1D0 = 10
|
||
- 字符长度 7 位 → D3D2 = 10
|
||
- 偶校验(使用奇偶校验,校验类型由命令字决定) → D5 = 1,D4 = 1(偶校验=1)
|
||
- 2 位停止位 → D7D6 = 11
|
||
|
||
控制字 = 11 1 1 1 0 10 = **1111 1110B = FAH**
|
||
|
||
**命令控制字**:
|
||
- 允许发送 → D0(TXEN)=1
|
||
- 允许接收 → D2(RXE)=1
|
||
- 清错误标志 → D4(ER)=1
|
||
- 其他位取 0(IR=0 不内部复位;SBRK=0 不发中止;RTS=0;DTR=0;EH=0)
|
||
|
||
命令字 = 00 0 0 1 0 1 0 1 = **0011 0111B = 37H**
|
||
|
||
**初始化程序**:
|
||
|
||
```assembly
|
||
MOV AL, 0FAH ; 方式选择控制字
|
||
MOV DX, 201H ; 控制端口地址
|
||
OUT DX, AL
|
||
MOV AL, 37H ; 命令控制字:允许收发,清错误标志
|
||
OUT DX, AL
|
||
; ... 发送/接收数据时再读写 200H 端口
|
||
```
|
||
|
||
---
|
||
|
||
## 二、考点总结
|
||
|
||
### (一)8255A 考点
|
||
|
||
- 【高频】**3 个端口 PA/PB/PC** 的结构,**A 组**(A 口 + C 高 4 位)、**B 组**(B 口 + C 低 4 位)。
|
||
- 【高频】**三种工作方式**对比:
|
||
- **方式 0**:基本输入/输出,**无握手**,A/B/C 口都可工作(适用端口最广)。
|
||
- **方式 1**:**选通(握手)输入/输出**,仅 A、B 口适用,C 口做联络信号,**可产生中断**。
|
||
- **方式 2**:**仅 A 口**可用的**双向**选通 I/O。
|
||
- 【高频】**方式选择控制字(D7=1)**:8 位含义、归纳方法。
|
||
- 【高频】**C 口置位/复位控制字(D7=0)**:单独操作 PC0-PC7 中任意一位。
|
||
- 【高频】**端口地址归纳**:A1A0 编码(00/01/10/11 选 A/B/C/控制);CS 由高位地址译码得到;通过 74LS138 等译码器确定 CS 后才能算出 A/B/C/控制口地址。
|
||
- 【高频】**方式 1 的联络线**:
|
||
- 输入:STB、IBF、INTR、INTE(A 口 INTE 用 PC4 控,B 口 INTE 用 PC2 控)。
|
||
- 输出:OBF、ACK、INTR、INTE(A 口输出 INTE 用 PC6 控,B 口输出 INTE 用 PC2 控)。
|
||
- 【高频】**8255A 初始化编程步骤**:归纳端口地址 → 归纳控制字 → 写控制字到控制口 → 通过数据口读写数据。
|
||
- 【常考】**74LS138(3-8 译码器)**功能表。
|
||
|
||
### (二)8253 考点
|
||
|
||
- 【高频】**3 个独立 16 位计数器**、**6 种工作方式**、**二进制/BCD 计数**、**最高 2 MHz**。
|
||
- 【高频】**计数初值计算公式**:
|
||
- 计数方式:初值 N = 要求的计数次数。
|
||
- 定时方式:初值 N = 定时时间 t / 时钟周期 TCLK = t × fCLK。
|
||
- **频率换算**:N = 输入时钟频率 fCLK / 输出信号频率 fout(方式 2、3 适用)。
|
||
- 【高频】**控制字格式(8 位)**:SC1/SC0(计数器选择)+ RL1/RL0(读写格式)+ M2/M1/M0(方式)+ BCD(计数制)。
|
||
- 【高频】**6 种工作方式对比表**(方式 0~5 名称、波形、启动方式、计数值使用):
|
||
- **方式 0**:计数结束中断,**软启动**,一次有效,OUT 输出正跃变。
|
||
- **方式 1**:可编程单稳,**硬启动**,多次有效。
|
||
- **方式 2**:**脉冲频率发生器 / 速率发生器**,**软/硬启动**,**重复有效**,常作分频器。
|
||
- **方式 3**:**方波发生器**,**软/硬启动**,**重复有效**,占空比近似 50%;**奇初值时高电平多 1 个 CLK**。
|
||
- **方式 4**:软件触发选通,软启动,一次有效。
|
||
- **方式 5**:硬件触发选通,硬启动,多次有效。
|
||
- 【高频】**GATE 门控信号在各方式中的作用**:电平控制(0 禁/1 允)vs 边沿触发(上升沿启动)。
|
||
- 【高频】**端口地址**(A1A0=00/01/10/11 选 计数器 0/1/2/控制口)。
|
||
- 【高频】**编程顺序**:**先写控制字,再写计数初值**;16 位数据**先低 8 位后高 8 位**。
|
||
- 【常考】**读计数器当前值的两种方法**:简单读出(先锁存再读)和直接读。
|
||
- 【常考】**最大计数初值 0 等价于 10000(BCD)或 65536(二进制)**。
|
||
|
||
### (三)8251A 考点
|
||
|
||
- 【高频】**异步串行帧格式**:起始位 + 数据位(5~8)+ 奇偶校验位(可选)+ 停止位(1/1.5/2)。**起始位为 0,停止位为 1**。
|
||
- 【高频】**波特率因子**:×1、×16、×64 三种异步方式(时钟 = 波特率因子 × 波特率)。
|
||
- 【高频】**3 类引脚**:
|
||
- 与 CPU:D7-D0、RD、WR、CS、CLK、RESET、**C/D**(区分控制口/数据口)、TXRDY、TXEMPTY、TXC、RXRDY、RXC、SYNDET。
|
||
- 与 Modem:DTR、RTS、DSR、CTS、RXD、TXD。
|
||
- 【高频】**两类控制字格式**(都写入"控制口"即 C/D=1):
|
||
- **方式选择控制字**:D1D0 通信方式、D3D2 字符长度、D5D4 奇偶校验、D7D6(异步停止位 / 同步字符)。
|
||
- **命令控制字**:EH、IR、RTS、ER、SBRK、RXE、DTR、TXEN。**RTS/DTR 位与引脚反相**。
|
||
- 【高频】**状态字**(读"状态口"):DSR、SYNDET/BD、FE、OE、PE、TXEMPTY、RXRDY、TXRDY;PE/OE/FE 三个错误标志由命令字 ER 位清除。
|
||
- 【高频】**初始化顺序**(**顺序错则失败**):
|
||
1. **RESET**(或命令字 D6=1 内部复位);
|
||
2. **写方式选择控制字**;
|
||
3. 同步方式还要输出 1~2 个同步字符;
|
||
4. **写命令控制字**(允许收发、清错误标志等);
|
||
5. 进行数据通信。
|
||
- 【高频】**状态位 TXRDY ≠ 引脚 TXRDY**:状态位 TXRDY 表示发送缓冲器空,引脚 TXRDY 还要 CTS=0 且 TXEN=1 时才置位。
|
||
|
||
### (四)三大芯片共性考点
|
||
|
||
- 【高频】**端口地址归纳**:由 CS(高位译码)+ A1A0(低位地址)共同决定。
|
||
- 【高频】**控制字/方式字各位含义**——能根据题意写控制字(初始化编程核心)。
|
||
- 【高频】**初始化编程** = 写控制字(控制口) + 写数据/初值(数据口)。
|
||
- 【常考】**74LS138(3-8 译码器)**、**74LS245 收发器**等辅助芯片功能。
|
||
|
||
---
|
||
|
||
### 三、常见题型与答题思路
|
||
|
||
#### 1. 编程题:给定硬件连线,写 8255A / 8253 / 8251A 初始化程序
|
||
- **步骤 ①**:根据 CS(74LS138 译码输出)和 A1、A0 推出 A/B/C/控制口地址(或计数器 0/1/2/控制口地址)。
|
||
- **步骤 ②**:根据题意要求(如方式 0 输出、A 组方式 2、异步 7 位偶校验、计数器 1 方式 2 二进制等)按控制字格式**逐位归纳**。
|
||
- **步骤 ③**:按顺序写程序:先 `OUT 控制口, AL`(写控制字),再 `OUT 数据口, AL`(写初值或数据)。
|
||
|
||
#### 2. 计算题:已知输入频率与输出频率求计数初值
|
||
- 公式:**N = fCLK / fout**(针对 8253 方式 2、3)。
|
||
- 例:fCLK = 2 MHz,要求输出 1 kHz 方波 → N = 2 000 000 / 1 000 = **2000**。
|
||
- 进一步:若要求输出方波(方式 3),2000 为偶数,占空比严格 50%。
|
||
|
||
#### 3. 分析题:判断 8253 哪种工作方式产生何种波形
|
||
- 看 OUT 输出波形形状:单个负脉冲宽度 N×TCLK → **方式 1 单稳**;
|
||
- 周期重复、窄负脉冲 → **方式 2 速率发生器**;
|
||
- 占空比近似 50% 方波 → **方式 3 方波发生器**;
|
||
- 一次正跃变(计数结束中断) → **方式 0**;
|
||
- 单个 CLK 宽负脉冲、一次有效 → **方式 4**;
|
||
- 硬触发多次有效 → **方式 5**。
|
||
|
||
#### 4. 简答题:8255A 方式 1 与方式 0 的区别 / 8253 各方式特点对比
|
||
- **8255A 方式 0 vs 方式 1**:
|
||
- 方式 0:基本 I/O,无握手,CPU 直接 IN/OUT 同步读写。
|
||
- 方式 1:选通 I/O,C 口做联络线(STB/IBF/OBF/ACK/INTR),可中断或查询,工作节奏由外设决定。
|
||
- **8253 6 种方式对比**:抓住 **启动方式(软/硬)+ 计数值使用(一次/多次)+ 输出波形**三要素即可答全。
|
||
|
||
---
|
||
|
||
> **复习建议**:本章编程与计算并重。务必**熟练画出三种芯片的控制字格式**,能根据题目要求在 1 分钟内写出控制字二进制串,再转十六进制送 AL。重点练 8253 的**计数初值计算**和 8255A 的**端口地址归纳 + 方式选择控制字归纳**两大套路。 |