8.1 微机系统扩展的必要性与扩展原理
8.1.1 系统扩展的必要性
在单片机应用系统的设计中,当片内资源无法满足需求时,就需要进行外部扩展。
- 早期单片机系统扩展原因
- 程序存储器扩展:早期Flash和OTP技术不成熟,小批量生产时需要外扩ROM。
- 数据存储器与功能模块扩展:片内RAM容量小,或缺少A/D、D/A等专用功能模块时,需要外扩。
- I/O口扩展:当通用IO引脚数量不足以连接所有外部设备时,需要进行扩展。
- 现代单片机系统设计方法
- 优先选择片内资源:首先应寻找一款片内资源就能满足设计需求的MCU,尽量避免外部扩展。
- 优先选择串行扩展:如果找不到合适的MCU,优先考虑使用串行接口芯片进行扩展。
- 并行扩展作为补充:仅在串行扩展无法满足需求(如速度要求)时,才采用并行扩展。
- 多MCU协同工作:对于复杂系统,可以采用多个MCU协同工作,通过UART或其它串行接口通信。
8.1.2 并行扩展与串行扩展的优缺点对比
- 外部并行扩展
- 优点:速度快。
- 缺点:连线多,占用IO口多,容易出现可靠性问题。
- 外部串行扩展
- 优点:连线少,占用IO口少。
- 缺点:速度较慢。
8.2 外部并行扩展原理
8.2.1 外部并行扩展相关的引脚(三总线) ❗❗❗
8051单片机通过三组总线与外部设备连接,实现并行扩展。
- 地址总线 (AB):提供16位地址。❗
- 高8位地址:由 P2口 提供。
- 低8位地址:由 P0口 提供(与数据总线分时复用)。
- 数据总线 (DB):提供8位数据。❗
- 由 P0口 提供(与地址总线分时复用)。
- 控制总线 (CB):提供读写控制信号。❗
- ALE (Address Latch Enable):地址锁存允许信号。用于从P0口上分离出低8位地址。
- PSEN (Program Store Enable):外部程序存储器读选通信号,低电平有效。
- RD / WR(Read/Write):外部数据存储器读/写信号,低电平有效。

8.2.2 程序存储器(ROM)扩展
MOVC A, @DPTR+A
为什么需要两个机器周期?
→因为片外ROM取值操作就要用掉一个机器周期👇(1) 片外ROM取指操作时序❗❗
这个操作的核心是为了解决 P0端口既要作为低8位地址总线,又要作为8位数据总线 的问题,这个过程被称为“总线分时复用”。
1. 输出地址
- 动作:当需要从外部ROM取指令时,CPU首先需要将16位的指令地址发送出去。
- 实现:
- P2端口 输出16位地址中的高8位 (A15-A8) 。在访问外部存储器期间,P2口专门用于此功能。
- P0端口 同时输出16位地址中的低8位 (A7-A0) 。
此时,完整的16位地址暂时出现在了P2和P0端口上。
2. 锁存低8位地址
- 动作:由于P0端口稍后需要转变为数据总线来接收指令,它不能一直保持地址信号。因此,必须在P0改变用途之前,将其上的低8位地址“保存”下来。这个任务由外部的地址锁存器(通常是74LS373芯片)完成。

- 实现:
- CPU通过 ALE(地址锁存允许) 引脚发出一个高电平到低电平的脉冲 。
- 这个ALE信号的下降沿会触发74LS373锁存器,使其捕获并锁住当前P0端口上的低8位地址信息 。
- 锁存完成后,P0端口就完成了它作为地址总线的任务,并立即切换为高阻态,准备作为数据输入端口使用 。
现在,完整的16位地址被稳定地提供给外部ROM:高8位来自P2口,低8位来自74LS373锁存器的输出端。
3. 选中ROM并读取数据
- 动作:地址信号稳定后,CPU需要通知外部ROM,可以把对应地址的数据(即指令码)放到数据总线上了。
- 实现:
- CPU将 (程序存储器使能) 引脚的电平拉低 。
- /PSEN信号通常连接到外部ROM的 /OE(输出使能) 或 /CE(片选) 引脚。当/PSEN变为低电平有效时,ROM芯片被激活,它会根据其地址引脚上接收到的稳定地址,找到对应的存储单元,并将其中的8位指令码输出到数据引脚上 。
- ROM的数据引脚连接着单片机的P0端口。
此时,指令码已经被ROM放置在了数据总线(P0口)上,等待CPU读取。
4. CPU读入指令
- 动作:CPU在发出PSEN低电平后,等待一小段时间(以确保ROM有足够的时间响应),然后通过P0端口读取数据总线上的信息。
- 实现:
- CPU内部逻辑在PSEN有效期间,从P0端口读入8位指令码,并送入指令寄存器 。
- 读取操作完成后,PSEN信号会恢复为高电平,使ROM的数据输出端关闭,让出数据总线。
至此,一个完整的从外部ROM取指令的周期就结束了。CPU接下来会译码并执行刚刚取回的指令,然后开始下一个取指周期。

(2) 相关芯片介绍
- 地址锁存器 (74LS373):八进制D型锁存器,用于锁存P0口的低8位地址,实现地址和数据的分离。
- G:数据锁存控制。高电平,输出随输入变化;低电平,Q端被锁存
- /OE:三态控制:低电平,允许数据输出;高电平,三态门关闭,呈现高阻态

- 译码器 (74LS138):3-8线译码器,用于地址译码。产生多片存储器芯片的片选信号,确保不同芯片地址范围不冲突。
NOTE THAT:
如果使用16位的地址线,片外ROM可以寻址64KB。单片ROM可能没有这么大,需要多片ROM一起使用;因此需要使用地址译码器。

- 存储器 (EPROM/EEPROM/FLASH):如27C系列、28C系列、29C系列,用于存储程序或数据。
- EEPROM与FLASH的区别:EEPROM容量较小但可按字节写入,速度慢;FLASH容量大,写入前需按块擦除,速度快。
- NOR Flash与NAND Flash的区别:NOR Flash容量相对小,但支持按字节读取;NAND Flash容量相对大,按页读取。
- 命名规则
例如,(8KB)

(3) 扩展电路与地址译码❗
- 地址线全译码:使用74LS138等译码器,将高位地址线作为输入,其输出连接到各个存储芯片的片选端(/CE)。❗
- 优点:每个存储单元的地址唯一,不会产生地址重叠。

- 不完全译码(部分译码):直接用高位地址线或其简单组合来控制片选。
- 缺点:会造成地址重叠或地址镜像,即一个物理存储单元会对应多个不同的地址。在小程序或简单系统中可以使用,但会浪费地址空间。

8.2.3 数据存储器(RAM)扩展
(1) 控制信号与指令
- 控制信号:扩展外部RAM时,使用
/RD
和/WR
信号进行读写控制,而不是/PSEN
。
- 访问指令:必须使用
MOVX
指令来访问外部数据存储器(RAM)或内存映射的I/O口。
(2) 读/写时序❗
- 读时序 (
MOVX A, @DPTR
): - CPU执行
MOVX
指令的第一个机器周期,用于取指令(过程同ROM取指)。 - 第二个机器周期,P2口和P0口输出DPTR中的地址,ALE锁存低8位地址。
/RD
信号有效(拉低),选中外部RAM。- RAM将数据送到P0口上,CPU读取数据。
- 写时序 (
MOVX @DPTR, A
): - 过程与读时序类似,但在第二个机器周期中:
/WR
信号有效(拉低),同时CPU将累加器A中的数据输出到P0口。- 数据被写入到由DPTR指定的外部RAM地址单元中。
注意:P0口在扩展系统中功能复杂,分时作为ROM低位地址、ROM数据、RAM低位地址和RAM数据四种用途。

(3) 相关芯片与电路
- 常用RAM芯片:6264 (8k byte), 62256 (32k byte)等。
- 连接电路:与ROM扩展类似,需要使用74LS373锁存地址,并通过地址译码(如74LS138或部分译码)和
/RD
、/WR
信号控制多片RAM。

80C51的扩展结构“不是真正的哈佛结构”,主要原因是:虽然它的程序空间和数据空间在逻辑上是独立的,但它们在物理上共用了同一组外部总线。
8.2.4 外部I/O口扩展
(1) 目的与访问方式
- 目的:增加I/O口数量、进行电平匹配、增加驱动能力。
- 访问方式:外部I/O口被看作外部数据存储器(RAM)进行统一编址,同样使用
MOVX
指令访问。
这也导致了这种扩展方式
- 只能对口进行拓展(因为数据总线过P0口)
- 需要配合
/WR
,/RD
使用(像一块真正的RAM那样)
(2) 输出口扩展
- 实现方式:可使用锁存器(如74LS373或74LS377)。将P0口与锁存器的数据输入端相连,通过地址译码和
/WR
信号产生锁存信号,将P0口上的数据锁存并输出。


在这个基础上,采用一个译码器选中不同的锁存器,就可以实现真正的IO口数目扩展
(3) 输入口扩展
- 实现方式:可使用三态缓冲器(如74LS244/245)。将外部输入信号连接到缓冲器输入端,其输出端与P0口相连。通过地址译码和
/RD
信号产生使能信号,将外部信号读入P0口。

8.3 外部串行扩展原理
80C51单片机内置的、原生的串行通信接口就是一个UART(Chapter7有介绍),它主要通过 P3.0 (RXD) 和 P3.1 (TXD) 这两个专用引脚进行全双工的异步串行通信 。
标准的80C51芯片本身并不集成I2C、SPI或1-Wire总线的硬件控制器;但是可以通过软件模拟(写程序)来实现这些功能
8.3.1 I²C总线 (Inter-Integrated Circuit)❗❗
- I²C(Inter-IC bus)是一种使用两根信号线进行串行信息传送,并允许若干兼容器件共享的双线总线结构。
- 半双工,可以发送也可以接收,但是不能在同时发送和接收

(1) 基本结构与特点
- 物理连接:I²C总线使用两根信号线:
- SDA (Serial Data):串行数据线,用于传输双向的数据。
- SCL (Serial Clock):串行时钟线,用于传输时钟信号,以同步串行数据线上的数据。
- 电气特性:总线上所有器件的SDA和SCL引脚都是开漏结构,因此都需要通过上拉电阻连接到电源(Vcc)。
- 设备角色:挂接在I²C总线上的器件,根据其功能可分为两种:
- 主控器 (Master):负责总线控制,产生时钟信号(SCL),并启动和结束数据传送。
- 从控器 (Slave):在总线上被主控器寻址,并根据主控器的命令来接收或发送数据。
(2) 总线信号与时序
I²C总线通过特定的信号组合来定义通信的起始、数据传输和结束。
- 总线空闲 (Bus Idle):SDA和SCL两条线都保持高电平。
- 起始信号 (START):在SCL保持高电平的情况下,SDA上产生一个由高电平到低电平的变化。 这个信号用于启动I²C总线,所有从设备都必须在检测到起始信号后进行后续操作。

- 停止信号 (STOP):在SCL保持高电平的情况下,SDA上产生一个由低电平到高电平的变化。 这个信号将停止I²C总线上的数据传送。
- 数据有效 (Data Valid):在起始信号后,当SCL保持高电平的周期期间,SDA线上的数据状态是有效的。
【关于STOP START:】❗
在传输数据时,当SCL为高电平的时候,SDA不能变化,否则会被误认为是START/STOP信号
所以:
- 主机只会在低电平的时候输出数据到SDA
- 在SCL高电平的时候,接收方会读取SDA数据,因为SDA电平在这个时间不能变化
一个典型的数据传输流程如下:
- 主设备发送一个 START 信号 。
- 主设备在SCL线上产生8个时钟脉冲,同时在SDA线上发送一个7位的从设备地址和一个读/写方向位(共8位)。
- 被选中的从设备在第9个时钟脉冲时,将SDA拉低,发送一个“应答位(ACK)”,表示已收到地址。
- 主设备(或从设备,取决于读写方向)继续在SCL上产生8个时钟脉冲,在SDA上传输一个字节的数据(8位)。
- 接收方在第9个时钟脉冲时,再发送一个“应答位”。
- 步骤4和5可以重复多次,以传输多个字节的数据。
- 数据传输全部完成后,主设备发送一个 STOP 信号,释放总线 。
8.3.2 单总线 (1-Wire)
单总线特性
- 物理连接:仅用一根数据线DQ完成数据收发和供电。
- 工作原理:
- 唯一地址:每个1-Wire器件内部都有一个全球唯一的64位激光烧录ROM编码作为地址。
- 主机在通信时,可以先发出“搜索ROM”的指令,总线上的所有设备会依次上报自己的ID,主机通过这个过程就能知道总线上有哪些设备以及它们的“地址” 。
- 寄生供电:1-Wire 设备内部有一个小电容。当 DQ 总线处于空闲(高电平)状态时,设备会利用上拉电阻提供的微弱电流给这个内部电容充电。在总线被拉低进行数据传输时,设备就依靠这个电容里存储的电能维持工作 。这样,设备只需要 DQ 和 GND 两根线就能工作,实现了所谓的“寄生供电”。
单总线操作时序与流程
- 严格的时序:通信依赖于精确控制的脉冲宽度。主机通过不同宽度的低电平脉冲来表示“0”和“1”,并通过拉低总线后在特定时间窗口内采样来读取数据。
- 操作流程:初始化(复位脉冲和存在脉冲) -> ROM命令(寻址) -> 功能命令(如读写数据)。
- 常用芯片:DS18B20数字温度传感器。
8.3.3 SPI总线 (Serial Peripheral Interface)❗
SPI总线特性
- 物理连接:通常为四线制:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。
- 工作原理:
- 全双工同步传输。
- 主从结构,可支持多主模式。
- 数据可按MSB或LSB优先顺序传输。
SPI通信时序❗
对于,从低到高的跳变表示传输开始;从高到低的跳变表示传输结束

阶段一:启动与寻址 (主机发送指令)
- 片选 (Initiation)
- 从机处于空闲状态。
- 主机首先将
CS
线从低到高跳变。此时,对应的从机被激活,准备接收主机的指令。
- 发送指令和地址 (Master Transmits)
- 主机开始在
SK
(时钟) 线上产生同步时钟脉冲。 - 在每个时钟脉冲的驱动下,主机在
DI
(Data In,对主机来说是 MOSI) 线上发送数据。 - 从时序图的
DI
波形可以看出,主机依次发送了: - 一个起始位
1
。 - 一个操作码,这里是
10
(根据我们之前复习的内容,这对应 93C46 芯片的 READ 指令)。 - 紧接着是要读取的存储单元地址 (
An
到A0
)。
阶段二:数据传输 (从机响应)
- 数据输出 (Slave Responds)
- 从机在接收完指令和地址后,开始准备数据。在此之前,它的数据输出线
DO
(Data Out,对主机来说是 MISO) 处于高阻态 (High Impedance),相当于断开状态,不会干扰总线。 - 当从机准备好数据后,它开始响应主机后续的时钟信号。
- 主机继续在
SK
线上产生时钟脉冲。 - 在每个时钟脉冲的驱动下,从机将数据(从
Dn
到D0
)一位一位地放到DO
线上,供主机读取。
阶段三:结束通信
- 结束传输 (Termination)
- 当主机接收完所有数据位后(即
D0
之后),它停止产生SK
时钟信号。 - 最后,主机将
CS
线由高电平拉回到低电平,释放从机,本次通信正式结束。 - 图中标注的
tcs
(Chip Select High Time) 指的是CS
信号在两次通信之间必须保持低电平的最小时间,以确保从机能正确识别下一次通信的开始。
典型芯片型号 ❗
芯片型号 (Chip Model) | 总线类型 (Bus Type) | 主要功能 (Main Function) | 主要特点 (Key Features) |
24C02/04/08/16系列 | I²C (二线制) | EEPROM (电可擦除可编程只读存储器) | ● 通过I²C两线串行接口通信
● 型号数字代表容量,如24C02为2Kb
● 用于存储需要掉电不丢失的数据 |
DS1307 | I²C (二线制) | RTC (实时时钟) | ● 提供秒、分、时、日、月、年等信息,带闰年补偿 ● 内置由电池供电的RAM
● 常用于需要时间记录的应用 |
93C46 | SPI (三线制) | EEPROM (电可擦除可编程只读存储器) | ● 通过三线串行接口通信
● 内部存储结构可由用户选择(如128x8位或64x16位) |
DS18B20 | 1-Wire (单总线) | 数字温度计 | ● 通过单总线协议与微控制器通信
● 每个芯片有全球唯一的64位序列号地址
● 可在一根总线上挂接多个芯片以实现多点测温 |
总结
特性对比 | I2C (Inter-Integrated Circuit) | 1-Wire (单总线) | SPI (Serial Peripheral Interface) |
信号线数量 | 2根:SDA (串行数据线), SCL (串行时钟线) 。 | 1根:DQ (数据线,可同时用于供电) 。 | 最少4根:SCK (时钟), MOSI (主出从入), MISO (主入从出), /CS (片选) 。每增加一个从机,通常需要额外一根 /CS 线。 |
通信方式 | 半双工:SDA 线是双向的,在同一时刻只能发送或接收数据。 | 半双工:所有通信在同一根 DQ 线上分时进行。 | 全双工:MOSI 和 MISO 是独立线路,主机在发送数据的同时可以接收数据 。 |
总线速度 | 较慢:标准速度为 100kHz,快速模式为 400kHz 。 | 最慢:通常用于低速设备,通信速率受严格时序限制。 | 最快:同步时钟频率可以很高(MHz级别),是三者中速度最快的 。 |
寻址方式 | 软件寻址:通过在SDA线上发送唯一的7位或10位从机地址来选择设备 。 | 软件寻址:每个设备有全球唯一的64位ROM ID,通过发送该ID来寻址 。 | 硬件寻址:通过专门的 /CS 片选线来选择从机,一条/CS线对应一个从机。 |
总线拓扑 | 多主机、多从机:允许多个设备作为主机来发起通信 。 | 单主机、多从机:只能有一个主机 。 | 单主机、多从机:只能有一个主机 。 |
应答机制 | 有:从机在接收到每一个字节后,会发送一个**应答位(ACK)给主机,确认数据已收到。 | 有 (存在脉冲):在初始化时,从机通过拉低总线产生一个存在脉冲(Presence Pulse)来应答主机 。 | 无:协议本身没有内置的应答机制,主机无法直接知道从机是否成功接收数据。 |
核心优点 | - 接线非常少,仅需2根线即可挂载多个设备。<br>- 支持多主机。 | - 接线最少,仅需1根数据线。<br>- 支持寄生供电**,可进一步简化布线 。 | - 速度极快,协议简单。<br>- 全双工通信,效率高。 |
核心缺点 | - 速度相对较慢。<br>- 协议比 SPI 复杂,需要处理起始/停止/应答信号。 | - 速度非常慢。<br>- 通信时序要求严格,对软件编程挑战较大。 | - 占用I/O口线最多。<br>- 没有内置的应答和流控机制。 |
典型应用芯片 | EEPROM (24C02/04) 实时时钟 (DS1307) | 温度传感器 (DS18B20) | EEPROM (93C46) Flash存储器, AD/DA转换器 |