单片机--51单片机存储器访问
51单片机存储器访问
稍微整理一些相关知识点。
XBYTE、XWORD
这些宏定义于 absacc.h中,用于访问外部数据存储空间。
| 宏定义 | 占用字节数 | 说明 |
|---|---|---|
| XBYTE | 8位 | 按字节访问 |
| XWORD | 16位 | 按16位数据访问 |
例如:
1 |
|
这里访问的是外部数据空间中的地址。XBYTE 与 XWORD 的区别在于访问的数据宽度不同。具体行为应以工程中实际使用的宏定义为准。
另外,部分项目会自定义 XBYTE 等宏,用于声明固定地址变量。例如:
1 | XBYTE EC_Version_Minor _at_ (ECRAM + 0x00); |
注意: 这不是 absacc.h 中 XBYTE 访问宏的通用用法。 只有当工程对XBYTE进行了相应的自定义,并且编译器支持这种声明形式时,代码才能编译成功。
8051还有其他的访问方式,如访问内部数据存储器的DBYTE和DWORD,访问常量远内存区域的FCARRAY等宏。
具体参考:ARM官网资料
bdata 与 sbit
bdata 和 sbit 是Keil C51中常见的扩展语法,用于利用 8051 内部RAM的位寻址能力。
8051 内部 RAM 的 0x20~0x2F 是位寻址区,共 16 字节、128 个可独立寻址的位。Keil C51 可以使用 bdata 将变量放置在该区域,使其各个位能够通过 sbit 单独访问。
例如:
1 | volatile unsigned char bdata Service_at_0x26; |
bdata:位寻址变量
| 关键字/语法 | 含义 |
|---|---|
| volatile | 标记变量为「易变变量」,禁止编译器优化该变量的读写操作,每次读取都会直接从内存取最新值,避免被硬件/中断修改后编译器还用缓存的旧值 |
| unsigned char | 变量类型是1字节(8位)无符号字符 |
| bdata | 将变量声明为位寻址数据 |
| Service | 变量名,是状态服务标志的总变量 |
| at0x26 | Keil专属绝对地址定位语法,强制把Service变量固定放在内部RAM地址0x26的位置(正好属于位寻址区) |
sbit:独立访问某一位
sbit是KeilC51专属关键字,用来定义可独立寻址的位变量,语法为sbit位变量名 = 父变量^位序号(0~7)
位序号从0到7对应Service字节的最低位(bit0)到最高位(bit7),每个位是一个独立的布尔标志:
| 位变量名 | 对应位 | 通常功能含义 |
|---|---|---|
| F_Service_PCI | bit0 | PCI接口服务标志位 |
| F_Service_UNLOCK | bit1 | 解锁状态/服务标志位 |
| F_Service_SEND | bit2 | 通用数据发送服务标志位 |
| F_Service_Send_PS2 | bit3 | PS2设备(键盘/鼠标)发送服务标志位 |
| F_Service_PS2 | bit4 | PS2设备状态/接收服务标志位 |
| F_Service_MS_1 | bit5 | 1毫秒定时服务标志位 |
| F_Service_PCI2 | bit6 | 第二路PCI接口服务标志位 |
| F_Service_KEY | bit7 | 按键事件服务标志位 |
整体作用
这段代码是嵌入式项目里常用的事件标志组实现:用1个字节的8个独立位,分别标记8种不同的功能状态/待处理事件,比如按键触发时把F_Service_KEY置1,主循环检测到该位为1就执行按键处理逻辑,处理完再清0。
这里的功能名称来自变量命名,实际含义仍需结合工程代码确认。
例如:
1 | /* 设置按键事件标志 */ |
8051单片机内部RAM地址划分
8051单片机内部RAM地址范围为0x00~0x7F,不同地址区域有不同的功能,其中位寻址区0x20~0x2F是bdata变量的专属区域,具体划分如下:
| 地址范围 | 区域功能 |
|---|---|
| 0x00~0x1F | 四组通用寄存器组(每组R0~R7共8个寄存器),用于临时数据存储,可通过寄存器组切换提高效率 |
| 0x20~0x2F | 唯一的位寻址区,共16字节 = 128个可独立寻址的位,对应的独立位地址为0x00~0x7F,仅该区域可使用sbit操作 |
| 0x30~0x7F | 通用数据区/栈区,只能按字节读写,用于存放普通变量、栈数据等 |
上述划分适用于经典 8051 的低128字节内部RAM。部分兼容芯片像(FIC6288)具有额外的内部 RAM、独立地址空间或不同的存储器映射,不能一概而论。
RAM 与 Flash 的区别
RAM
物理容量由芯片设计决定。RAM 是“运行时数据区”,仅存数据。不同增强型芯片可能远大于经典 8051 的 128/256 字节,例如部分型号可达 128KB/256KB,但需确认是内部 RAM、XRAM 还是其他存储区。
Flash 核心特性
存放程序指令、配置参数、掉电需保留的数据。只读(写需擦除)、掉电不丢。单片机上电后,CPU 从 Flash/ROM 中定义的复位向量和程序入口取指执行,而不是把整个程序复制到 RAM 后执行。
注意:经典 8051是哈佛结构,程序存储器和数据存储器分开编址。CPU 复位后从程序存储器(Flash/ROM)取指令执行,不是把整个程序搬到RAM再执行。启动代码把变量初值从 Flash 复制到 RAM,但程序本身仍在程序存储器中取指执行。
地址总线与寻址范围
地址总线位宽决定单次最大寻址数量。经典8051是16 位地址总线,程序存储器和外部数据空间各自通常可寻址 0x0000~0xFFFF,即 64KB。寻址范围不等于存储物理容量:增强型 8051(如部分 FIC6288 等)可通过 bank 切换等方式突破 64KB 限制,访问更大的 RAM/Flash。具体容量和映射以芯片数据手册为准。








