数据存储器(RAM),又称随机存储器,用来存放数据和运算结果等信息,存储单元既可读又可写。单片机除了可以使用内部数据存储器外,也可以使用外部数据存储器。
MCS-51系列单片机的内部数据存储器有256B的存储空间(即有256个存储单元,每个单元存储1字节数据),地址编号为00H~FFH(也可用0000H~00FFH表示);外部数据存储器地址编号为0000H~FFFFH,有64KB的存储空间。外部数据存储器最开始的一段地址(0000H~00FFH)与内部数据存储器相同,对于相同的地址,单片机是通过不同的指令来区分的。MCS-51系列单片机数据存储器的地址编号如图2-15所示。
从图2-15中可以看出,内部数据存储器分为两大部分:
低128字节为用户数据RAM单元,地址为00H~7FH,该部分作为用户数据存取使用。
高128字节为特殊功能寄存器(SFR)单元,地址为80H~FFH,该部分作为单片机功能控制使用。
低128B又分为3个区:工作寄存器区、位寻址区和数据缓存区,结构如图2-16所示。
图2-15 MCS-51单片机RAM地址编号
图2-16 MCS-51单片机RAM前3个区的结构
1.工作寄存器区
工作寄存器区的地址编号为00H~1FH,如图2-16所示,该区域又分为4组(0~3组),每组有8个存储单元,都用R0~R7表示。单片机在工作时,在同一时间内这4组寄存器中只能有1组工作,到底是哪一组寄存器工作由特殊功能寄存器区内的程序状态字寄存器(PSW)中的RS1位和RS0位的状态决定,具体见表2-2。不用的工作寄存器可作为一般存储器供用户使用,CPU复位后会自动选中0组。
表2-2 工作寄存器与RS1、RS0的关系
例如,当寄存器PSW中的RS1=0、RS0=1时,1组(08H~0FH)寄存器处于工作状态。
2.位寻址区
位寻址区的地址编号为20H~2FH,该区域有16个存储单元,在该区域既可以对某个存储单元进行字节操作,也可以用位操作指令对某个存储单元进行位操作。下面以图2-17来说明字节操作和位操作。
在进行字节操作时,用字节操作指令选中编址为24H的存储单元,然后可以将1个字节的数据存入该单元,或从该单元取出。图中是将1个字节的数据11011001存入编址为24H的存储单元。
图2-17 字节操作与位操作
a)字节操作 b)位操作
在进行位操作时,用位操作指令选中编址24H,该24H是一个位地址,在图中它是字节地址24H的第4位,该地址存储了一位数“0”,如果要将该位转换成“1”,可用位操作指令选中位地址24H,然后将“1”存入该位,该位就变为“1”,整个字节就变为1101 1001。
单片机在工作时,是通过程序指令区分地址是字节地址还是位地址的,有关的指令知识将在后续章节介绍。地址编号为20H~2FH的位寻址区有16个存储单元,每个单元有8位,共有128位,这128位的位地址见表2-3。
表2-3 片内RAM中位寻址区的位地址
3.数据缓存区
数据缓存区又称用户数据区,或称作内部RAM区,它的地址编号为30H~7FH。该区域一般用来存储随机数据和运算中间结果等。一个使用数据缓存区的例子是“MOV 33H,A”,即把累加器A中的数据载入到33H上。
4.特殊功能寄存器区
特殊功能寄存器(SFR)区是一些具有特殊功能的存储单元,地址编号是80H~FFH,其中末尾位为0或者8的地址可以位寻址。
SFR区有多个特殊的寄存器,每个寄存器都有一个地址,如寄存器A(累加器)的地址是E0H,寄存器PCON的地址是87H,各寄存器的地址很多是不连续的,第1列的寄存器还具有位寻址功能。SFR区有128个存储单元(80H~FFH),而真正定义的只有20多个单元,对于未定义的单元用户不可使用,以免发生不必要的错误。特殊寄存器的名称、位地址和复位初值见表2-4。(www.xing528.com)
表2-4 特殊寄存器列表
(续)
SFR中21个特殊寄存器非常重要,下面先简单介绍一下其中一些常用寄存器的功能,在以后的学习中将逐步深入说明。
(1)累加器A
累加器A的地址是E0H,它是单片机内应用最多的寄存器,可以位寻址,位地址为E0H~E7H或ACC.0~ACC.7。
(2)寄存器B
寄存器B的地址是F0H,它主要用于乘、除运算。
(3)程序状态字寄存器(PSW)
程序状态字寄存器(PSW)的地址是D0H,它是一个状态指示寄存器(又称标志寄存器),用来指示系统的工作状态。PSW是一个8位寄存器,可以存储8位数值,每位数值代表不同的功能。PSW各位的功能如下:
D7位(CY):进位标志位。在单片机进行加法运算时,如果相加有进位时CY=1,无进位时CY=0;在进行减法运算时,当有借位时CY=1,无借位时CY=0。
D6位(AC):辅助进位标志位。在进行加、减运算时,低4位向高4位有进位或借位时,AC=1,否则AC=0。
D5位(F0):用户可自定义的程序标志位。可用软件对该位置“1”或置“0”。
D4位(RS1)、D3位(RS0):工作寄存器选择位。这两位用来控制工作寄存器区(00H~1FH)4组中的某一组寄存器进入工作状态,具体见表2-2。
D2位(OV):溢出标志位。在进行有符号数运算时,如果运算结果不在-128~+127范围内,OV=1,否则OV=0。
D1位:保留位,该位不可使用。
D0位(P):奇偶校验位。该位用于对累加器A中的数据进行奇偶校验,当累加器A中“1”的个数为奇数个时,P=1;为偶数个时,P=0。MCS-51系列单片机总是保持累加器A与P中“1”的总个数为偶数,例如累加器A中“1”的个数为奇数个,那么P要为“1”,这样才能让两者“1”的总个数为偶数,这种校验方式称作偶校验。
(4)数据指针寄存器(DPTR)
数据指针寄存器(DPTR)是一个16位寄存器,由DPH和DPL两个8位寄存器组成,地址分别是83H、82H,用它可以访问单片机外部数据存储器中的数据。
(5)堆栈指针寄存器(SP)
在日常人们洗碗碟时,通常是将洗完的碗碟一只一只由下往上堆起来,使用时则是将碗碟从上往下一只一只取走。这个过程有两个要点:一是这些碗碟的堆放是连续的;二是先堆放的后取走,后堆放的先取走。
单片机中的堆栈与上述情况类似。堆栈是指在单片机数据存储器中划分出的一个连续的存储空间,这个存储空间存取数据时具有“先进后出,后进先出”的特点。
在存储器存取数据时,首先由系统给出地址选中某个单元,再将数据存入或取出。如果有一批数据要连续存入存储器,例如将一批5组数据依次存入地址为30H~34H的存储单元中,按一般的方法系统先给出地址30H,选中地址为30H的存储单元,再将第1组数据存入该单元,然后给出地址31H,选中地址为31H的存储单元,再将第2组数据存入该单元,显然这样存取数据比较麻烦,采用堆栈可以很好地解决这个问题。
在数据存储器中划分堆栈的方法是:通过编程的方法设置寄存器SP的值,如让SP=2FH,寄存器SP就将存储器的2FH单元设置为堆栈的栈顶地址,2FH单元后面的连续存储单元就构成了堆栈,如图2-18所示。堆栈设置好后,就可以将数据依次存入堆栈或从堆栈中取出,在堆栈中存取数据按照“先进后出,后进先出”的规则进行。
图2-18 在数据存储器中划分堆栈
需要注意的是,寄存器SP中的值并不是堆栈的第一个存储单元的地址,而是前一个单元的地址,例如SP=2FH,那么堆栈的第一个存储单元的地址是30H,第1组数据存入30H单元中。在单片机通电复位后,寄存器SP的初始值为07H,这样堆栈第一个存储单元的地址就为08H。由于08H~1FH地址已划分给1~3组工作寄存器,在需要用到堆栈时,通常通过编程将堆栈设置在30H~7FH的数据缓存区(只要将寄存器SP的值设为2FH即可)。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。