蓝桥杯51单片机的存储结构详解
创作时间:
作者:
@小白创作中心
蓝桥杯51单片机的存储结构详解
引用
CSDN
1.
https://blog.csdn.net/2401_84123527/article/details/146463536
51单片机的存储结构组成
51单片机的存储结构主要分为三部分:
1. 程序存储器(ROM)
- 地址范围:0x0000到0xFFFF(64KB)。
- 作用:用于存储程序代码(如指令、常量等)。
- 扩展:如果单片机的内部ROM不够用,可以通过外部扩展ROM来增加程序存储空间。
2. 数据存储器(RAM)
- 内部 RAM
- 地址范围:0x00到0xFF(256字节)。
- 作用:用于存储变量、堆栈、临时数据等。
- 分区
- 低 128 字节(0x00到0x7F):可以直接寻址包括通用bank寄存器和支持位寻址区,和普通ram区。
- 高 128 字节(0x80到0xFF):只能通过间接寻址访问的普通RAM访问速度较慢与低128字节的。
- 外部 RAM
- 地址范围:0x0000到0xFFFF(64KB)。
- 作用:通过外部扩展RAM芯片来增加数据存储空间。
3. SFR特殊功能寄存器区
- 地址范围:0x80到0xFF(高128字节)。
- 作用:用于控制和访问单片机的各种外设(如GPIO、定时器、串口等)。
- 访问方式:通过sfr关键字定义别名来访问。如sfr P0 = 0x80;支持直接寻址,部分支持位操做。
注意这里需要注意一点:就是这个IDATA区和SFR区所用的地址描述都是80-ff,但是他们对应的物理空间确是不同的,在c语言上通过关键字idata和sfr进行区分,在硬件上sfr采用直接寻址,idata采用间接寻址。
位寻址区
- 地址范围:0x20到0x2F(16字节)。
- 作用:支持位寻址操作,每个字节的每一位都可以单独访问。
- 访问方式:通过sbit关键字定义位别名来访问。
分析51单片机的位寻址
首先我们需要明白位地址空间和字节地址空间的区别,位地址空间其实就是对字节地址空间的每个位的映射,通过关键字sbit区分,51单片机的0x20到0x2F(16字节),支持位寻址,对应位地址空间的0x00到0x7f,可能你们会疑惑为什么有这个位地址空间,它是不是独立的,真实存在的物理地址呢?其实它就是对应于内部ram的0x20到0x2F这16个字节地址空间,只不过它支持位操作,通常被用来操作标志位。是一种映射。例如:
unsigned char bdata var3; // 存储在bdata区
sbit flag = var3^0; // 定义var3的第0位为flag
flag = 1; // 位操作
对于高128字节ram它其实也支持位操作,不过并不是全部都支持,只要那些需要经常使用到位操作的寄存器才会支持,比如gpio和串口。例如:
sbit P0_0 = 0x80; // 定义P0.0的位地址为0x80
P0_0 = 1; // 将P0.0引脚设为高电平
内部ram的位寻址和sfr寄存器的位寻址的区别
内部ram的位寻址为什么仅限于0x20–0x2F?
- 硬件设计:为了简化硬件实现,51单片机只将内部RAM的0x20–0x2F区域设计为支持位操作。
- 资源限制:内部RAM资源有限,16字节的位寻址区已经是一种折中方案。
为什么内部RAM不能全部支持位操作?
地址空间冲突
- 如果内部RAM的低128字节(0x00–0x7F)全部支持位操作,会导致地址空间冲突:
- 字节地址0x00可以表示内部RAM的第0字节,也可以表示位地址0x00(对应字节地址0x20的第0位)。
- 硬件无法区分是字节操作还是位操作。
硬件解码复杂度
- 内部RAM的位寻址区仅限于0x20–0x2F,可以减少硬件解码电路的复杂度。
- 如果整个128字节都支持位操作,硬件需要额外的解码逻辑,增加芯片面积和成本。
性能优化
- 内部RAM的位寻址区(0x20–0x2F)主要用于存储软件标志位,访问频率相对较低。
- SFR的位寻址区(如P0端口)用于控制硬件外设,访问频率较高,因此采用更高效的位寻址方式。
- sfr的内部寻址是通过sfr变量和sbit变了区分的,因此它不需要连续,可以达到随机(按需要去设置是否支持位寻址),只需要区分关键字即可。
关键对比分析
特性 | 内部RAM位寻址区 | SFR位寻址区 |
---|---|---|
地址范围 | 位地址 0x00–0x7F | 位地址 0x80–0xFF |
对应物理存储 | 内部RAM的 0x20–0x2F(16字节) | SFR的 0x80–0xFF(部分寄存器支持) |
汇编指令 | SETB 00h(操作位地址0x00) | SETB 80h(操作位地址0x80) |
硬件支持 | 所有51单片机均支持 | 仅部分SFR支持位寻址(如P0-P3) |
用途 | 存储标志位、状态位 | 控制外设引脚或寄存器状态位 |
内存变量关键字的区别
1. 关键字概述
关键字 | 存储区域 | 地址范围 | 寻址方式 | 访问速度 | 用途 |
---|---|---|---|---|---|
data | 内部RAM低128字节 | 0x00–0x7F | 直接寻址 | 最快 | 存储频繁访问的变量 |
idata | 内部RAM高128字节 | 0x80–0xFF | 间接寻址 | 较快 | 存储较少访问的变量 |
bdata | 内部RAM位寻址区(0x20–0x2F) | 0x00–0x7F(128位) | 位寻址 | 快 | 存储需要位操作的标志位 |
xdata | 外部扩展RAM | 0x0000–0xFFFF(64KB) | DPTR间接寻址 | 较慢 | 存储大量数据 |
pdata | 外部扩展RAM低256字节 | 0x0000–0x00FF(256B) | 分页寻址(MOVX @Ri) | 中等 | 存储中等规模数据 |
code | 程序存储区(ROM) | 0x0000–0xFFFF(64KB) | 直接寻址 | 最快 | 存储常量、程序代码 |
直接寻址和简介寻址的区别
1. 直接寻址
- 定义:直接寻址是指指令中直接给出操作数的内存地址。
- 例如:
MOV A, 30H
表示将地址30H的内容加载到累加器A。 - 特点:
- 访问速度快,因为地址直接嵌入指令中。
- 只能访问固定的内存地址(如内部RAM的低128字节或SFR区)。
- 适用于访问已知地址的变量或寄存器。
- 使用场景:
- 访问内部RAM的低128字节(00H ~ 7FH)。
- 访问特殊功能寄存器(SFR,80H ~ FFH)。
1. 直接寻址
- 定义:直接寻址是指指令中直接给出操作数的内存地址。
- 例如:
MOV A, 30H
表示将地址30H的内容加载到累加器A。 - 特点:
- 访问速度快,因为地址直接嵌入指令中。
- 只能访问固定的内存地址(如内部RAM的低128字节或SFR区)。
- 适用于访问已知地址的变量或寄存器。
- 使用场景:
- 访问内部RAM的低128字节(00H ~ 7FH)。
- 访问特殊功能寄存器(SFR,80H ~ FFH)。
MOV R0, #30H ; 将地址30H加载到R0
MOV A, @R0 ; 将R0指向的地址的内容加载到累加器A
MOV DPTR, #1000H; 将地址1000H加载到DPTR
MOVX A, @DPTR ; 将DPTR指向的外部RAM内容加载到累加器A
3. 直接寻址和间接寻址的区别
特性 | 直接寻址 | 间接寻址 |
---|---|---|
地址指定方式 | 指令中直接给出地址 | 通过寄存器(如R0、R1、DPTR)指定地址 |
访问速度 | 较快 | 稍慢 |
灵活性 | 固定地址,灵活性低 | 动态地址,灵活性高 |
适用区域 | 内部RAM低128字节、SFR区 | 内部RAM高128字节、外部RAM |
典型指令 | MOV A, 30H | MOV A, @R0、MOVX A, @DPTR |
1. 51单片机的寄存器
51单片机的寄存器主要包括以下几类:
(1)工作寄存器(R0 ~ R7)
- 数量:8个(R0 ~ R7)。
- 功能:用于通用数据操作。
- 特点:
- 51单片机有4组工作寄存器(Bank 0 ~ Bank 3),每组包含R0 ~ R7。
- 通过PSW(程序状态字)中的RS1和RS0位来选择当前使用的寄存器组。
- 默认使用Bank 0(RS1=0, RS0=0)。
(2)特殊功能寄存器(SFR)
- 数量:21个(具体数量取决于单片机型号)。
- 功能:用于控制和配置硬件外设(如P0、P1、定时器、串口等)。
- 常见SFR:
- ACC(累加器A):用于算术和逻辑运算。
- B:用于乘除法操作。
- PSW(程序状态字):包含标志位(如CY、AC、OV等)。
- SP(堆栈指针):指向堆栈顶部。
- DPTR(数据指针):用于访问外部RAM或代码存储器。
- P0、P1、P2、P3:I/O端口寄存器。
- TCON、TMOD:定时器控制寄存器。
- SCON、SBUF:串口控制寄存器。
(3)其他寄存器
- PC(程序计数器):指向下一条要执行的指令地址。
- DPTR(数据指针):16位寄存器,用于访问外部RAM或代码存储器。
3. 51单片机和32位单片机的寄存器对比
特性 | 51单片机 | 32位单片机(ARM Cortex-M) |
---|---|---|
通用寄存器数量 | 8个(R0 ~ R7) | 13个(R0 ~ R12) |
寄存器位宽 | 8位 | 32位 |
寄存器组 | 4组(Bank 0 ~ Bank 3) | 无分组 |
特殊功能寄存器 | 21个(如ACC、B、PSW、DPTR等) | 多个(如SP、LR、PC、PSR等) |
浮点寄存器 | 不支持 | 可选支持(S0 ~ S31、D0 ~ D15等) |
访问方式 | 直接寻址、间接寻址 | 统一编址,直接访问 |
4. 51单片机的寄存器组切换
51单片机有4组工作寄存器(Bank 0 ~ Bank 3),每组包含R0 ~ R7。通过PSW寄存器中的RS1和RS0位来选择当前使用的寄存器组。
- RS1和RS0的值:
- RS1=0, RS0=0:Bank 0(默认)。
- RS1=0, RS0=1:Bank 1。
- RS1=1, RS0=0:Bank 2。
- RS1=1, RS0=1:Bank 3。
bank寄存器的概念
在51单片机中,Bank寄存器是指工作寄存器组(Register Bank),它是51单片机寄存器设计的一个重要特性。51单片机有4组工作寄存器(Bank 0 ~ Bank 3),每组包含8个通用寄存器(R0 ~ R7)。通过切换寄存器组,可以快速保存和恢复上下文,特别适用于中断处理和任务切换。
1. Bank寄存器的结构
- 数量:4组(Bank 0 ~ Bank 3)。
- 每组寄存器:每组包含8个通用寄存器(R0 ~ R7)。
- 总寄存器数量:4组 × 8个 = 32个寄存器(但同一时间只能访问一组)。
2. Bank寄存器的地址
- Bank 0:地址 00H ~ 07H(R0 ~ R7)。
- Bank 1:地址 08H ~ 0FH(R0 ~ R7)。
- Bank 2:地址 10H ~ 17H(R0 ~ R7)。
- Bank 3:地址 18H ~ 1FH(R0 ~ R7)。
3. Bank寄存器的切换
- 通过PSW(程序状态字)中的 RS1 和 RS0 位来选择当前使用的寄存器组。
- RS1 和 RS0 是PSW的第4位和第3位(PSW.4 和 PSW.3)。
- RS1 和 RS0 的值:
- RS1=0, RS0=0:选择 Bank 0(默认)。
- RS1=0, RS0=1:选择 Bank 1。
- RS1=1, RS0=0:选择 Bank 2。
- RS1=1, RS0=1:选择 Bank 3。
4. Bank寄存器的用途
- 快速上下文切换:
- 在中断处理或任务切换时,可以通过切换寄存器组来保存和恢复上下文,而不需要将寄存器内容压入堆栈。
- 例如:
- 进入中断时,切换到新的寄存器组(如Bank 1)。
- 退出中断时,切换回原来的寄存器组(如Bank 0)。
- 提高效率:
- 寄存器组切换比堆栈操作更快,适合实时性要求高的应用。
5. 总结
- Bank寄存器占用低128字节的00H ~ 1FH,但通过寄存器组切换实现地址复用。
- 未激活的Bank地址可作为普通RAM使用,但需避免误操作导致数据覆盖。
- 合理使用Bank切换可以高效管理寄存器和内存资源,尤其适用于中断和任务切换场景。
热门推荐
中国近代佛教改革的倡导者——记民国四大高僧之太虚法师
美缝剂去除全攻略:硬质表面和衣物上的处理方法
发胶可以带上高铁吗?发胶携带全攻略,让你帅气不失分!
贺州:以“长寿文化”为载体绘就民族团结进步幸福底色
机器学习模型效果不好?这份排查指南请收好
“鸡兔同笼”讲解方法(13种),总有一种适合你!
1236名百岁老人调查:决定人寿命长短的不是吃和运动,而是这些
健身期间的饮食禁忌
住建部最新国标!C200混凝土来了!
写作中的通感魔法:原来好文笔还能闻得到
年薪制的特点与风险:高薪背后的法律考量
有效缓解神经衰弱的多种方法与心理调节技巧分享
教你如何写出一份“完美”的借条
什么是波浪和波动?有哪些常见的波动现象?
写意牡丹画法
二手车第三方检测够全面吗?
蘑菇图像分类数据集及深度学习应用
秀珍菇工厂化高产栽培技术
你被「職場PUA」了嗎?釐清三大套路與五大自救策略(含範例)
一保险公司因拒不履行生效判决义务,被罚款5万元!
Windows 11系统中如何设置默认中文输入法
凡岛人力资源管培生项目的优势与特点
蒸发结晶分盐系统处理焦化废水
密码应遵循的安全原则
如何选择适合家庭的电饭锅:品牌、功能、容量及价格解析
睡眠障碍挂什么科
房屋腾退的关键要素:关注老百姓合法权益,确保补偿公平合理!
食用碱、小苏打、酵母粉、泡打粉的区别和用法
数字化与客户管理是什么
财务管理专业课程是什么