跳转至

存储器结构

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 配置启用
// C51 中定义扩展 RAM 中的变量
unsigned char xdata buffer[128];  // 放在 XRAM 中

EEPROM(数据 Flash)

  • 容量:5K 字节(分布在 Flash 的不同扇区)
  • 擦除扇区大小:512 字节
  • 通过 ISP/IAP 操作读写
  • 适合存储校准参数、配置信息、用户数据等掉电保持数据

⚠️ 重要:EEPROM 按扇区擦除,不能单字节擦除!但可以单字节写入。修改一个字节前需要备份整个扇区,擦除后重写。

存储器选用策略

在 C51 编程中,根据需求选择合适的存储类型:

关键字 存储区域 访问速度 容量 适用场景
data 内部 RAM(低 128B) ★★★★★ 128B 频繁访问的变量
idata 内部 RAM(全部 256B) ★★★★ 256B 中等频率变量
xdata 扩展 RAM(XRAM) ★★★ 256B 大数据缓冲区
code 程序 Flash ★★ 8K 常量表、字符串
// 实际使用示例
unsigned char data   count;       // 高速计数变量
unsigned char idata  buf[64];     // 较大量数据
unsigned char xdata  sensor_log[200];  // 采集数据缓存
unsigned char code   seg_table[] = {0x3F, 0x06, 0x5B, 0x4F};  // 7段码表