2.2 MCS-51单片机内存空间

微型计算机通常只有一个逻辑空间,程序存储器ROM和数据存储器RAM都要统一编址,即一个存储器地址对应一个唯一的存储单元。单片机将程序存储器和数据存储器分开,它们有各自的寻址系统、控制信号和功能。

MCS-51单片机内部集成了一定容量的程序存储器(8031/8032等除外)和数据存储器,同时还具有强大的外部存储器扩展能力,MCS-51单片机存储器的配置图如图2-8所示。

MCS-51单片机的存储器在物理结构上可分为4个存储空间:内部数据存储器、内部程序存储器、外部数据存储器和外部程序存储器。从逻辑上分,即从用户使用的角度看,MCS-51单片机存储器分为3个逻辑空间:片内外统一编址的64KB程序存储器地址空间、256B或384B的内部数据存储器地址空间和64KB外部数据存储器地址空间。

图2-8 MCS-51单片机存储器配置图

2.2.1 数据存储器

数据存储器也称为随机存取数据存储器,是用于存放程序执行的中间结果和过程数据的。MCS-51的数据存储器均可读写,部分单元还可位寻址。

数据存储器分为内部数据存储器和外部数据存储器两种。无论是物理上还是逻辑上,其地址空间都是彼此独立的。内部数据存储器地址范围为00H~FFH,外部数据存储器最多可扩展64KB,其地址范围为0000H~FFFFH。

内部数据存储器在物理上和逻辑上都分为两个地址空间:00H~7FH单元组成的低128B数据存储器空间和80H~FFH单元组成的高128B特殊功能寄存器空间。

在51子系列内部,真正可用作数据存储器的,只有低128B数据存储器空间,地址为00H~7FH,如图2-9所示。它们划分为3个区域:工作寄存器区、位寻址区和用户RAM区,这几个空间是相连的。

在52子系列中,有256B数据存储器空间,高128B数据存储器空间与特殊功能寄存器空间的地址是重叠的,都是80H~FFH,如图2-9所示。

图2-9 MCS-51内部RAM功能配置图

1. 工作寄存器区(00H~1FH)

由32个字节的RAM单元组成,地址为00H~1FH,分成4个区,每个区由8个8位工作寄存器组成。8个工作寄存器R0、R1、R2、R3、R4、R5、R6、R7与8个存储单元一一对应。

这4个工作寄存器区在程序中怎么辨别和使用它们呢?使用的工作寄存器区是由程序状态字PSW中的第3位RS0和第4位RS1确定的,RS1、RS0可通过程序置位或清零,以达到选择不同工作区的目的,其余的可用作一般的数据缓冲器,如表2-3所示。

表2-3 工作寄存器选择

这4个工作寄存器区给软件设计带来了极大方便,在实现中断嵌套时可以灵活选择不同的工作寄存器区,完成现场保护。CPU在复位后,默认选择第0组工作寄存器。

2. 位寻址区(20H~2FH)

内部RAM的20H~2FH单元为位寻址区,既可作为一般单元用字节寻址,也可对它们的位进行寻址。位寻址区共有16个字节,128位,位地址为00H~7FH,如图2-10所示。

图2-10 内部RAM中位地址

CPU能直接寻址这些位,执行如置位、清零、求反、转移、传送和逻辑等操作。我们常说MCS-51具有布尔处理功能,布尔处理的存储空间指的就是这些位寻址区。

3. 用户RAM区(30H~7FH)

在内部RAM低128B单元中,工作寄存器占去32B,位寻址区占去16B,剩下的80B就是供用户使用的一般RAM区,地址单元为30H~7FH,这些RAM单元只能按字节寻址。对这部分区域的使用没有任何规定或限制,一般应用中常把堆栈开辟在此。单片机在复位时,SP的初值为07H,可在初始化程序中设定SP的值来确定堆栈区的范围,通常情况下将堆栈区设在30H~7FH。

2.2.2 特殊功能寄存器

高128B单元是供特殊功能寄存器使用的,也称为专用寄存器,单元地址为80H~FFH。单片机把CPU中的专用寄存器、并行端口锁存器、串行口与定时器/计数器内的控制寄存器集中安排到一个区域,离散地分布在地址为80H~FFH范围内,这个区域称为特殊功能寄存器(SFR)区。特殊功能寄存器字节地址分配如图2-11所示。

图2-11 特殊功能寄存器

某些SFR寄存器还可以位寻址,即可以对这些SFR寄存器8位中的任何一位进行单独的位操作,这一点与20H~2FH中的位操作是完全相同的。在SFR中,有12个特殊功能寄存器的字节地址能被8整除,这12个特殊功能寄存器的93位具有位寻址功能,其余3个为未定义位。

特殊功能寄存器最低位的位地址与特殊功能寄存器的字节地址相同,次低位的位地址等于特殊功能寄存器的字节地址加1,依此类推,最高位的位地址等于特殊功能寄存器的字节地址加7。特殊功能寄存器的位地址分配如图2-12所示。

图2-12 SFR中的位地址

复位后,内部各寄存器的数据值如图2-13所示。

图2-13 复位后SFR的值

1. ACC累加器

累加器是一个最常用的特殊功能寄存器,它是实现各种寻址及运算的寄存器,而不是仅做加法的寄存器。在MCS-51指令系统中,所有算术运算、逻辑运算都要使用它,而对程序存储器和外部数据存储器的访问也只能通过它进行。

2. B寄存器

B是一个8位特殊功能寄存器,在做乘除运算时要使用它。

3. PSW程序状态字

PSW是一个8位特殊功能寄存器,用于存放程序运行中的各种状态信息,如图2-14所示。

图2-14 PSW程序状态字

(1)CY(PSW.7):高位进位标志位。当执行算术运算时,最高位向前进位或借位时,CY被置1。在执行逻辑运算时,可以被硬件或软件置位或清零。在布尔处理机中,它被认为是位累加器。

(2)AC(PSW.6):辅助进位标志位。进行加法或减法运算时,当低四位向高四位进位或借位时,AC被置位,否则就被清零。

(3)F0(PSW.5):用户标志位。是用户定义的一个状态标志,可以用软件来使它置位或清零,也可以用软件测试F0以控制程序的流向。

(4)RS1(PSW.4)、RS0(PSW.3):寄存器组选择位。可以用软件来置位或清零,以确定工作寄存器组,RSl、RS0与工作寄存器组的对应关系见表2-3。

(5)OV(PSW.2):溢出标志位。当执行算术运算时,对带符号数作加、减运算时,OV=1,表示加、减运算的结果超出8位带符号数的范围(+127~-128)。OV标志常用C6和C7的关系来表示:

OV=C6⊕C7

当进行加、减运算时,C6表示D6位向D7位有进位或借位,C7表示D7位向进位位有进位或借位。

(6)-(PSW.1):保留位,无定义。

(7)P(PSW.0):奇偶校验位。若累加器(ACC)中“1”的个数是奇数个,P=1;若为偶数个,P=0。

此标志位对串行通信中的数据传输有重要意义。在串行通信中,常用奇偶校验来检验数据传输中的误码率。在发送端,可根据P的值对数据的奇偶位置位或清零。若通信协议中规定采用奇校验的办法,则P=1,数据传输到接收端,若P=1,则表示传输过程中,奇偶无错误,可以接收,否则奇偶有错,不能接收。

注意

PSW是编程时特别需要关注的一个寄存器。如当前ACC累加器中数据的奇偶性(P)、做加减法时的进位与借位(CY)、4个工作寄存器组的选择(RS1、RS0),以及辅助进位(AC)和溢出标志位(OV)等。

4. DPTR数据指针(DPL和DPH)

DPTR是一个16位特殊功能寄存器,用来存放外部数据存储器的16位地址。DPTR可以分成两个8位寄存器:高位字节寄存器DPH和低位字节寄存器DPL,既可作一个16位寄存器用,也可作两个8位寄存器用。

5. SP堆栈指针

SP是一个8位特殊功能寄存器,复位初始化后,SP=07H,从08H开始存放。因为08H~1FH是1~3工作寄存器组,若用到这些区时,可重新设置SP。

6. P0、P1、P2和P3口

在前面介绍了MCS-51单片机有4个双向I/O口P0、P1、P2、P3。如果需要从指定端口输出一个数据,只需将数据写入指定I/O口即可。如果需要从指定I/O口输入一个数据,只需先将数据0FFH(全部为1)写入指定I/O口,然后再读指定I/O口即可。如果不先写入0FFH(全部为1),读入的数据有可能不正确。

2.2.3 “头文件包含”处理

“头文件”是指一个文件将另外一个文件的内容全部包含进来。

头文件一般在C:\KELL\C51\INC目录下。INC文件夹里面有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品的头文件。如果我们要使用自己写的头文件,只需把头文件放在INC文件夹里就可以了。

在单片机中用C语言编程时,往往第一行就是头文件或者其他的自定义头文件。以reg52.h头文件为例,根据前面介绍过的特殊功能寄存器知识,下面对reg52.h头文件进行初步解析。

1. 特殊功能寄存器在reg52.h中定义

打开reg52.h头文件,可以看到有关特殊功能寄存器的一些内容。

/ *------------------------------------------------ 
Byte Registers 
------------------------------------------------* / 
sfr P0      = 0x80; 
sfr SP      = 0x81; 
sfr DPL     = 0x82; 
sfr DPH     = 0x83; 
sfr PCON    = 0x87; 
sfr TCON    = 0x88; 
sfr TMOD    = 0x89; 
sfr TL0     = 0x8A; 
sfr TL1     = 0x8B; 
sfr TH0     = 0x8C; 
sfr TH1     = 0x8D; 
sfr P1      = 0x90; 
sfr SCON    = 0x98; 
sfr SBUF    = 0x99; 
sfr P2      = 0xA0; 
sfr IE      = 0xA8; 
sfr P3      = 0xB0; 
sfr IP      = 0xB8; 
sfr T2CON   = 0xC8; 
sfr T2MOD   = 0xC9; 
sfr RCAP2L  = 0xCA; 
sfr RCAP2H  = 0xCB; 
sfr TL2     = 0xCC; 
sfr TH2     = 0xCD; 
sfr PSW     = 0xD0; 
sfr ACC     = 0xE0; 
sfr B       = 0xF0; 

根据图2-11不难看出,这里都是一些有关特殊功能寄存器符号的定义,即规定符号名与地址的对应关系。

如:

sfr P1=0x90;

这条语句是定义P1与地址0x90对应,其目的是要使用P1这个符号,即通知C编译器,程序中所用的P1是指单片机的P1端口,而不是其他变量。P1口的地址就是0x90,0x90是C语言中十六进制数的写法,相当于汇编语言中的90H。

2. 特殊功能寄存器的位符号定义

打开reg52.h头文件,可以看到有关特殊功能寄存器位符号定义的一些内容,比如TCON的位符号定义。

/ *------------------------------------------------ 
TCON Bit Registers 
------------------------------------------------* / 
sbit TF1   = TCON^7;  //位地址0x8F 
sbit TR1   = TCON^6;  //位地址0x8E 
sbit TF0   = TCON^5;  //位地址0x8D 
sbit TR0   = TCON^4;  //位地址0x8C 
sbit IE1   = TCON^3;  //位地址0x8B 
sbit IT1   = TCON^2;  //位地址0x8A 
sbit IE0   = TCON^1;  //位地址0x89 
sbit IT0   = TCON^0;  //位地址0x88

根据图2-12不难看出,这里都是一些有关TCON中每位的定义,即规定符号名与位地址的对应关系。如:

sbit IT0   = TCON^0;  //位地址0x88 

这条语句是定义IT0与位地址0x88对应,其目的是要使用IT0这个符号,即通知C编译器,程序中所用的IT0是指单片机TCON的第0位,而不是其他位变量。reg52.h头文件其他部分可以参考以上说明,以后再详细介绍。

注意

reg52.h头文件没有对I/O端口的位符号进行定义,若需要可以自己定义,比如P1.0的位符号定义语句可以是“sbit P1_0=P1^0;”或者“sbit P10=P1^0;”。在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以要给它另起一个名字,这里起的名字为P1_0。

2.2.4 程序存储器

程序存储器用于存放用户程序、数据和表格等,它以程序计数器PC作为地址指针。MCS-51单片机的程序计数器PC是16位的,所以具有64KB程序存储器寻址空间。

1. 程序存储器配置

对于内部无ROM的8031单片机,它的程序存储器必须外接,空间地址为64KB,此时单片机的50421-00-060-1端必须接地,强制CPU从外部程序存储器读取程序。

对于内部有ROM的单片机,正常运行时,需接高电平,使CPU先从内部的程序存储器中读取程序,当PC值超过内部ROM的容量时,才会转向外部的程序存储器读取程序。51系列程序存储器内部有4KB的程序存储单元,其地址为0000H~0FFFH,如图2-15(a)所示;52系列程序存储器内部有8KB的程序存储单元,其地址为0000H~1FFFH,如图2-15(b)所示。

图2-15 MCS-51ROM配置图

50421-00-060-3=1时,程序从内部存储器开始执行,PC值超过内部ROM容量时会自动转向外部ROM空间。当50421-00-060-4=0时,程序从外部存储器开始执行,例如前面提到的内部无ROM的8031单片机,在实际应用中就要把8031的引脚接为低电平。

2. 具有特殊功能的地址

在程序存储器中有一些功能特殊的地址,在使用中应加以注意。

(1)启动地址。单片机启动复位后,程序计数器的内容为0000H,所以系统必须从0000H单元开始执行程序。因而0000H是启动地址,也称为系统程序的复位入口地址。一般是在0000H~0002H这3个单元中存放一条无条件转移指令,从转移地址开始存放初始化程序及主程序,让CPU直接去执行用户指定的程序。

(2)中断服务程序入口地址。其特殊功能地址分别为各种中断源的中断服务程序入口地址,如表2-4所示。

表2-4 各种中断服务程序入口地址

*表中第6个中断源为52系列芯片所特有

表2-4列出了专门用于存放中断服务程序的地址单元,中断响应后,按中断的类型自动转到各自的入口地址去执行程序。