51单片机内部有256字节的RAM空间。 低128字节为工作寄存器组区域(0x00H-0x1FH)、位寻址区域(0x02H-0x2FH)、通用RAM区域(0x30H-0x70H)和SFR寄存器区域。 (0x80-0xFF) 该空间定义了51单片机的所有控制寄存器和状态寄存器。 接下来我们按照上图中自下而上的顺序一一介绍各个区域的功能和访问方式。
工作寄存器区
工作寄存器区域为R0-R7,各为1字节,但51单片机一共有4组工作寄存器,单片机在运行时只能有一组工作寄存器。 各工作寄存器的地址及工作寄存器组的选择如下图所示:
工作寄存器的作用是传递函数参数、给局部变量赋值、保存函数执行结果等。此外,很多指令也使用工作寄存器。 我们可以先思考这个问题:用51单片机可以实现四个数的和吗? 我们看一下下面的图片:
add函数接收三个参数a、b、c,但没有d。 参数d可以不传吗? 我们先看一下官方文档的解释:
Cx51 编译器在 MCU 寄存器中传递最多三个函数参数。 由于参数不会写入内存或从内存中读取,因此该机制显着提高了系统性能。 参数或参数传递可以由 REGPARMS 和 NOREGPARMS 指令控制:
原来51最多只能传递3个参数,但是现在超过3个怎么办? 我们只能加减三个数吗? 如下图所示,add函数传递的参数分别为1、2、3、4。 我们运算的结果是A,十进制就是10。 那么第四个参数去哪里了呢?
经过仿真,我们知道第四个参数被压入堆栈。 (看起来堆栈可以在工作寄存器区域,但最好不要这样做。而是应该让SP指向.S文件中的0x60之后)
注意:51单片机中的int是2个字节! 51单片机SP上电时默认值为0x07,i、j、t入栈0x07+2*3=0x13。 51微控制器堆栈正向增长,因此第四个参数的位置是0x14和0x15所在的位置。
2. 位寻址区
0x20-0x2F共有16个字节,128位,所以寻址范围为0-0x7F。 内存映射关系如下图所示:
使用方法是C51特有的关键字,sbit关键字对应的汇编指令是BIT。 (注意:SFR 寄存器也可以位寻址!)
修改后的关键字sbit指向P2.1的位置。 P2^1 在 SFR 寄存器区域中按位寻址。 之所以为1是因为还没有被赋值,所以它的默认值为1。位寻址区域非常有用。 例如,对P2.1进行位操作不会影响P2.0、P2.2等其他I/O端口,因此是一种非常方便的操作方法。 其实STM32也可以实现这样的效果!
3. 通用RAM区
一般RAM区域可以运行函数的局部变量,因为SP指针保护了调用函数和中断函数站点。 具体表现是:
1、保护断点:将PC压入堆栈,执行完中断函数后,弹出PC之前的值,恢复到中断前程序运行的点。
2.保护现场:保护寄存器组的值。
4.SFR寄存器区
特殊功能寄存器区定义了控制和监视51单片机操作的控制寄存器和状态寄存器。 定时器、I/O口、串口、中断等相关寄存器都在这里定义。 同时,这个区域是离散的,是为制造商保留的。 不过52单片机可以访问,但是需要间接寻址。 对于C语言编程来说,无需关注这一点。 C语言本身可以转换它。 。 那么,52单片机的堆栈就增长了128字节供我们使用。
好了,我们来回顾和总结一下上面的内容吧!
整篇文章主要通过KEIL和程序介绍了51单片机RAM区各模块的功能。 第一个方面是通用寄存器组所占用的地址空间以及该区域在程序运行时的作用。 其次,位寻址区的重要性和作用。 如果不使用位寻址,则只能使用读-写-修改形式。 这样不仅使用起来不方便,而且还增加了代码量。 第三个方面是通用RAM区和SFR区的重要性。