存储器结构
STC89C52 的存储器采用 哈佛结构(程序存储器和数据存储器分开编址),这是 8051 架构的经典设计。
存储器总览
| 存储器类型 | 地址范围 | 容量 | 用途 |
|---|---|---|---|
| Flash 程序存储器 | 0000H ~ 1FFFH | 8K 字节 | 存放用户程序代码 |
| 内部 RAM(低 128 字节) | 00H ~ 7FH | 128 字节 | 通用寄存器、位寻址区、堆栈 |
| 内部 RAM(高 128 字节) | 80H ~ FFH | 128 字节 | 只能间接寻址访问 |
| 扩展 RAM(XRAM) | 0000H ~ 00FFH | 256 字节 | 通过 MOVX 指令访问 |
| EEPROM(数据 Flash) | 按扇区擦写 | 5K 字节 | 掉电不丢失的数据存储 |
程序存储器(Flash)
- 容量:8K 字节(地址 0000H ~ 1FFFH)
- 可通过 ISP(串口下载)在线编程
- 复位后 CPU 从 0000H 开始执行
中断向量表
| 地址 | 中断源 |
|---|---|
| 0000H | 复位入口 |
| 0003H | 外部中断 0(INT0) |
| 000BH | 定时器 0 溢出 |
| 0013H | 外部中断 1(INT1) |
| 001BH | 定时器 1 溢出 |
| 0023H | 串行口中断 |
| 002BH | 定时器 2 溢出 |
C 语言编程中通常不需要手动处理中断向量表,Keil C51 编译器会自动生成。但理解向量地址有助于调试。
内部 RAM
低 128 字节(00H ~ 7FH)
| 区域 | 地址范围 | 功能 |
|---|---|---|
| 工作寄存器区 0 | 00H ~ 07H | R0~R7(可通过 PSW 切换为区 1~3) |
| 工作寄存器区 1 | 08H ~ 0FH | R0~R7 |
| 工作寄存器区 2 | 10H ~ 17H | R0~R7 |
| 工作寄存器区 3 | 18H ~ 1FH | R0~R7 |
| 位寻址区 | 20H ~ 2FH | 16 字节 × 8 位 = 128 个可位寻址位 |
| 通用 RAM + 堆栈区 | 30H ~ 7FH | 80 字节,一般用于堆栈和变量 |
高 128 字节(80H ~ FFH)
与特殊功能寄存器(SFR)地址重叠!
- 访问时通过寻址方式区分:
- 直接寻址 → 访问的是 SFR(如 MOV 90H, #0FFH 操作 P1 口)
- 间接寻址 → 访问的是 RAM(如 MOV @R0, #0FFH 且 R0=90H 时操作高 128 字节 RAM)
扩展 RAM(XRAM)
- 地址范围:0000H ~ 00FFH(256 字节)
- 通过 MOVX 指令访问(C51 中用
xdata关键字) - 默认不开启,需要通过 SFR 配置启用
EEPROM(数据 Flash)
- 容量:5K 字节(分布在 Flash 的不同扇区)
- 擦除扇区大小:512 字节
- 通过 ISP/IAP 操作读写
- 适合存储校准参数、配置信息、用户数据等掉电保持数据
⚠️ 重要:EEPROM 按扇区擦除,不能单字节擦除!但可以单字节写入。修改一个字节前需要备份整个扇区,擦除后重写。
存储器选用策略
在 C51 编程中,根据需求选择合适的存储类型:
| 关键字 | 存储区域 | 访问速度 | 容量 | 适用场景 |
|---|---|---|---|---|
data |
内部 RAM(低 128B) | ★★★★★ | 128B | 频繁访问的变量 |
idata |
内部 RAM(全部 256B) | ★★★★ | 256B | 中等频率变量 |
xdata |
扩展 RAM(XRAM) | ★★★ | 256B | 大数据缓冲区 |
code |
程序 Flash | ★★ | 8K | 常量表、字符串 |