51单片机 RAM 数据存储区 [李园7舍_404]
来源:互联网 发布:学java电脑配置 编辑:程序博客网 时间:2024/05/17 17:55
1.RAM keil C语言编程
RAM是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过128B,则未初始化的变量的初值默认为0.如果所有的变量超过单片机small模式下的128B大小,则必须对变量进行初始化,否则超过RAM大小变量的值是不确定的,在small模式下超过128B大小的变量也必须在编译器中重新设定存储器的存储模式。
在keil中,可选择small,compact,large三种方式存储数据变量:
模式 描述 small 所有默认变量均装入内部128B (0xfH)RAM中。访问速度快,但空间有限,堆栈空间分配少。 compact 将所有默认变量均存入单片机内部256B (0x1fH ) RAM中,空间不得超过256B,若单片机RAM为128B的,若存数据超过128B则会出错,访问速度介于small和large之间。跟使用关键字pdata定义变量相同。 large 所有默认变量可放在多大64KB( 0xffffH )的RAM区,包含内、外RAM。更使用关键字xdata定义变量效果相同。存储空间大,访问速度慢。在keil中可以用“Target Options”来配置这一项:
图1 选择数据存储模式
2.片内数据存储区
(1) 工作寄存器区
工作寄存器区位于片内数据存储器中的00H~1FH单元,共32字节( 如此说来每个单元是一个字节了 ),分成四组。每组8个字节,分别记为R0~R7.
编号 起终地址 寄存器名 备注 1 其占据的物理地址为00H~07H 对应于指令中的R0~R7 0区工作寄存器组 2 其占据的物理地址为08H~0FH 对应于指令中的R0~R7 1区工作寄存器组 3 其占据的物理地址为10H~17H 对应于指令中的R0~R7 2区工作寄存器组 4 其占据的物理地址为18H~1FH 对应于指令中的R0~R7 3区工作寄存器组程序默认在0区工作寄存器组存放中间运算数据。等待中断来时,中断数据工作寄存器组由0区切换到其它区域。
选择四组工作寄存器区的哪一组作为R0~R7由位于PSW寄存器的两位RS1,RS0来确定.
RS1,RS0称为区开关或组开关,两位就可决定四种状态.
RS1 RS0 工作寄存器组 0 0 工作寄存器0组 0 1 工作寄存器1组 10
工作寄存器2组 1 1 工作寄存器3组
(2)位寻址区
用户存储区位于片内数据存储器中的020H~02FH单元,共16个字节,共128位,每个字节单元的位都有一个单独的地址,分别为00H-07H,如020H.1表示020H单元的bit[1]位。020H~02FH单元可作为位寻址区。这个范围内的存储单元最大的用处就是能进行位操作,在C语言中,只能用位操作运算符(&、|、^、~、<<、>>)来对字节数据进行位操作运算。如果用汇编指令就可以直接对此片存储单片进行位操作。
如 SETB, 020H.1 就将020H的bit[1]置为了1.
除了RAM此片能进行位寻址的用户存储区以外,还有一些特殊的功能寄存器( SFR )也能进行位寻址。
(3)数据缓冲区
51系列数据缓冲区地址为30H-7FH,共80字节。只能字节寻址,不能位寻址。由于工作寄存器和位寻址区,数据缓冲区是统一编址的,所以这三者都可以用作数据缓冲区。
(4)堆,栈
栈:由系统自动分配释放,存局部值。
堆:一般由程序员分配和释放(在C中用malloc/free操作)。
栈指针SP:8位寄存器,栈最大可达128单元,只可在片内RAM中进行栈操作。
栈作用:用来保存地址、数据信息、具有先进后出特性,也是一种能存放二进制数据的空间。
MC51栈采用满顶法向上生成的软件堆栈。
软件栈:借助SP进行控制操作。
栈向上生长:新压栈的数据成为栈顶。
栈向下生长:新压入的数据远离栈顶。
地址大小还得看存储方式。
(5)专用寄存器区
专用寄存器区,也称特殊功能寄存器区 SFR
SPECIAL FUNCTIONREGISTER
寻址地址离散地分布在80H~FFH,共128字节的空间.而实际有用的只有21个字节,即在这一空间里只有18个专用功能寄存器,其中有3个专用功能寄存器占用了两个字节.SFR主要用于片内硬件的管理,通常只能以字节为单位借助于MOV指令直接寻址,但也有一些专用功能寄存器可以位寻址。
包含程序状态字PSW、数据指针寄存器DPTR、端口地址P0-P0、其它专用寄存器(累加器A、B)
3.片外数据存储区
片外RAM区:可寻空间为共64K 0000H~FFFFH,
总是使用MOVX类指令寻址
借助于工作寄存器R0或R1间接寻址时,可寻256字节
从片外RAM区取数据: MOVX A,@Ri i=0-1
向片外RAM区存数据: MOVX @Ri,A
借助16位的数据指针DPTR间接寻址,可寻64K字节:
从片外RAM区取数据: MOVX A,@DPTR
向片外RAM区存数据: MOVX @DPTR,A
<此段摘抄,防后会使用>
区分是访问内部存储器还是外部存储器地址靠指令来区分。
这里,片内的存储区即常念叨的“寄存器”,片外的ram存储区即指“系统内存”。
Note Over。
- 51单片机 RAM 数据存储区 [李园7舍_404]
- 51单片机 RAM 数据存储区
- 51 下载程序到单片机内 [李园7舍_404]
- 51之51单片机RAM数据存储区学习笔记
- 51 下载hex文件到单片机失败的解决方案 [李园7舍_404]
- 51 单片机的定时器中断(寄存器) [李园7舍_404]
- 51单片机程序执行流程(STARTUP.A51) [李园7舍_404]
- C语言数据在内存中的存储类别 [李园7舍_404]
- 51 数码管静态显示 [李园7舍_404]
- 51 数码管动态显示 [李园7舍_404]
- 51定时器中断程序编写 [李园7舍_404]
- 51 串行通信知识点整理 [李园7舍_404]
- 解析BMP文件 [李园7舍_404]
- 动态内存分配 [李园7舍_404]
- 51单片机内部ram
- matlab 和 excel 数据的导入导出 [李园7舍_404]
- 51 Keil语句延迟时间的精确计算 [李园7舍_404]
- 51 机器周期 时钟周期 晶振频率 定时器初值计算 [李园7舍_404]
- 几个不错的开源的.net界面控件
- Compile failed; see the compiler error output for details. 解决
- 怎样创建真正很小的Linux下的ELF可执行文件
- WPF:从WPF Diagram Designer Part 1学习控件模板、移动、改变大小和旋转
- Java Socket 多线程网络传输多个文件
- 51单片机 RAM 数据存储区 [李园7舍_404]
- 队列的简单实现(一)
- 2013/06/03 快考四级了
- SD卡电脑读取失败但是相机可读的问题描述和解决方案
- VS.Net中按 F5 时项目的生成顺序
- cocos2d-x文章收集
- RadASM 颜色配置
- Java工具类—-资源文件解析类PropertiesUtil
- Java工具类——数组操作ArrayUtil