单片机开发与典型工程项目实例详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 MCS-51单片机的存储器组织

MCS-51存储器结构与常见的微型计算机的配置方式不同,它把程序存储器和数据存储器分开,各有自己的寻址系统、控制信号和功能。程序存储器用来存放程序和始终要保留的常数,例如所编程序经汇编后的机器码。数据存储器通常用来存放程序运行中所需要的常数或变量,例如做加法时的加数和被加数、做乘法时的乘数和被乘数、模/数转换时,实时记录的数据等。

从物理地址空间看,MCS-51有4个存储器地址空间,即:片内程序存储器和片外程序存储器以及片内数据存储器和片外数据存储器。

MCS-51系列各芯片的存储器在结构上有些区别,但区别不大,从应用设计的角度可分为如下几种情况:片内有程序存储器和片内无程序存储器、片内有数据存储器且存储单元够用和片内有数据存储器且存储单元不够用。

1.4.1 程序存储器

程序存储器用来存放程序和表格常数。程序存储器以程序计数器PC作地址指针,通过16位地址总线,可寻址的地址空间为64K字节。片内、片外统一编址。

1.片内有程序存储器且存储空间足够

在8051/8751片内,带有4K字节ROM/EPROM程序存储器(内部程序存储器)。4K字节可存储约2000多条指令,对于一个小型的单片机控制系统来说就足够了,不必另加程序存储器。若不够还可选8KB或16KB内存的单片机芯片。例如89C52等。总之,尽量不要扩展外部程序存储器,这会增加成本、增大产品体积。

2.片内有程序存储器且存储空间不够

若开发的单片机系统较复杂,片内程序存储器存储空间不够用时,可外扩展程序存储器。具体扩展多大的芯片要计算一下,由2个条件决定:一是看程序容量大小,二是看扩展芯片容量大小。64KB总容量减去内部4KB即为外部能扩展的最大容量,2764容量为8KB、27128容量为16KB、27256容量为32KB、27512容量为64KB。若再不够就只能换芯片,选16位芯片或32位芯片都可。定了芯片后就要算好地址,再将引脚接高电平,使程序从内部ROM开始执行。当PC值超出内部ROM的容量时,会自动转向外部程序存储器空间。

对8051/8751而言,外部程序存储器地址空间为1000H~FFFFH。对这类单片机,若把接低电平,可用于调试程序,即把要调试的程序放在与内部ROM空间重叠的外部程序存储器内,进行调试和修改。调试好后再分两段存储,再将接高电平,就可运行整个程序。

3.片内无程序存储器

8031芯片无内部程序存储器,需外部扩展EPROM芯片,地址从0000H~FFFFH都是外部程序存储器空间。在设计时应始终接低电平,使系统只从外部程序储器中取指令。

MCS-51单片机复位后程序计数器PC的内容为0000H,因此系统从0000H单元开始取指,并执行程序。它是系统执行程序的起始地址,通常在该单元中存放一条跳转指令,而用户程序从跳转地址开始存放程序。

1.4.2 数据存储器

在一些单片机的结构中,数据存储器和程序存储器的地址空间相互独立;而在另一些单片机中,两者的地址空间没有区分,而是以不同的寻址指令加以判别。

1.内部数据存储器

MCS-51单片机的数据存储器无论在物理上或逻辑上都分为2个地址空间:一个为内部数据存储器,访问内部数据存储器用MOV指令,另一个为外部数据存储器,访问外部数据存储器用MOVX指令。

MCS-51系列单片机各芯片内部都有数据存储器,是最灵活的地址空间。它分成物理上独立的且性质不同的几个区:00H~7FH(0~127)单元组成的128字节地址空间的RAM区;80H~FFH(128~255)单元组成的高128字节地址空间的特殊功能寄存器(又称SFR)区。

注意:8032/8052单片机将高128字节作为RAM区。

在8051、8751和8031单片机中,只有低128字节的RAM区和128字节的特殊功能寄存器区。两区地址空间是相连的,特殊功能寄存器(SFR)地址空间为80H~FFH。

注意:128字节的SFR区中只有26个字节是有定义的,若访问的是这一区中没有定义的单元,则得到的是一个随机数。

内部RAM区中不同的地址区域功能结构,如图1-13所示。其中00H~1FH(0~31)共32个单元是4个通用工作寄存器区,每1个区有8个工作寄存器,编号为R0~R7。每一区中R0~R7,地址见表1-5所示。

图1-13 MCS-51内部RAM存储器结构

表1-5 寄存器和RAM地址对照表

当前程序中使用的工作寄存区是由程序状态字PSW(特殊功能寄存器,字节地址为0D0H)中的D4、D3位(RS1和RS0)来指示,PSW的状态和工作寄存区对应关系如表1-6所示。

表1-6 工作寄存器区选择

CPU通过对PSW中的D4、D3位内容的修改,就能任选1个工作寄存器区。例如:

    SETB  PSW.3
                CLR  PSW.4  ;选定第1区
    SETB  PSW.4
    CLR   PSW.3  ;选定第2区
    SETB PSW.3
    CLR   PSW.4  ;选定第3区

不设定为第0区,也叫默认值。这个特点使MCS-51具有快速现场保护功能。特别注意的是:如果不加设定,在同一段程序中R0~R7只能用一次,若用两次程序会出错。

如果用户程序不需要4个工作寄存器区,则不用的工作寄存器单元可以作一般的RAM使用。内部RAM的20H~2FH为位寻址区,如表1-7所示。这16个单元和每一位都有一个位地址,位地址范围为00H~7FH。位寻址区的每一位都可以视作软件触发器,由程序直接进行位处理。通常把各种程序状态标志和位控制变量设在位寻址区内。同样,位寻址区的RAM单元也可以作一般的数据缓冲器使用。

表1-7 RAM位寻址区位地址映像

在一个实际的程序中,往往需要一个后进先出的RAM区,以保存CPU的现场。这种后进先出的缓冲器区称为堆栈(堆栈的用途详见指令系统和中断的章节)。堆栈原则上可以设在内部RAM的任意区域内,但一般设在30H~7FH的范围内。栈顶的位置由栈指针SP指出。

2.外部数据存储器

MCS-51具有扩展64KB外部数据存储器和I/O口的能力。这对很多应用领域已足够使用。对外部数据存储器的访问采用MOVX指令,用间接寻址方式。R0、R1和DPTR都可作间址寄存器。

若系统较小,内部的RAM(30H~7FH)足够的话,就不要再扩展外部数据存储器RAM。若确实要扩展就用串行数据存储器24C系列,也可用并行数据存储器。

1.4.3 特殊功能寄存器

MCS-51单片机内的锁存器、定时器、串行口数据缓冲器以及各种控制寄存和状态寄存器,都是以特殊功能寄存器的形式出现的,它们分散地分布在内部RAM地址空间范围。

表1-8列出了这些特殊功能存储器的助记标识符、名称及地址,这里仅作简单介绍。

表1-8 特殊功能寄存器

1.累加器A

累加器是最常用的特殊功能寄存器。大部分单操作数指令的操作数取自累加器,很多双操作数指令的一个操作数取自累加器。加、减、乘、除算术运算指令的运算结果都存放在累加器A或A、B寄存器对中。指令系统中用A作为累加器的助记符。

2.B寄存器

B寄存器是乘除法指令中常用的寄存器。乘法指令的2个操作数分别取自A和B,其结果存放在A、B寄存器对中。除法指令中,被除数取自A,除数取自B,商数存在放于A,余数存放于B。

在其他指令中,B寄存器可作为RAM中的1个单元来使用。

3.程序状态字PSW

程序状态字是一个8位寄存器,包含了程序状态信息。此寄存器各位的含义参见下图,其中PSW.1未用。其他各位说明如下:

● C(PSW.7)进位标志。在执行某些算术和逻辑指令时,可以被硬件或软件置位或清零。在布尔处理机中它被认为是位累加器,其重要性相当于一般中央处理机中的累加器A。

● AC(PSW.6)辅助进位标志。当进行加法或减法操作而产生由低4位数(BCD码一位)向高4位数进位或借位时,AC将被硬件置位,否则就被清零。AC被用于BCD码调整。详见DA A指令。

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

● RS1, RS0(PSW.4, PSW.3)寄存器区选择控制位。可以用软件来置位或清零以确定工作寄存器区。RS1, RS0与寄存器区的对应关系见表1-5所示。

● OV(PSW.2)溢出标志。当执行算术指令时,由硬件置位或清零,以指示溢出状态。

当执行加法指令ADD,位6向位7有进位而位7不向CY进位时,或位6不向位7进位而位7向CY进位时,溢出标志OV置位,否则清零。

溢出标志常用于ADD和SUBB指令对带符号数作加减运算时。OV=1表示加减运算的结果超出了目的寄存器A所能表示的带符号数(2的补码)的范围(-128~+127)。

在MCS-51中,无符号数乘法指令MUL的执行结果也会影响溢出标志。若置于累加器A和寄存器B的两个数的乘积超过255, OV=1,否则OV=0。此积的高8位放在B内,低8位放在A内。因此,OV=0意味着只要从A中取得乘积即可,否则要从A、B寄存器对中取得乘积。

除法指令DIV也会影响溢出标志。当除数为0时,OV=1,否则OV=0。

● P(PSW.0)奇偶标志。每个指令周期都由硬件来置位或清“0”,以表示累加器A中1的位数的奇偶数。若1的位数为奇数,P置“1”,否则P清“0”。

P标志位对串行通信中的数据传输有重要的意义,在串行通信中常用奇偶校验的办法来检验数据传输的可靠性。在发送端,可根据P的值对数据的奇偶置位或清零。通信协议中规定采用奇校验的办法,则P=0时,应对数据(假定由A取得)的奇偶位置位,否则就清0。

● 堆栈指针。堆栈指针SP是一个8位特殊功能寄存器。它指示出堆栈顶部在内部RAM中的位置。系统复位后,SP初始化为07H,使得堆栈事实上由08H单元开始。考虑到08H~1FH单元分属于工作寄存器区1~3,若程序设计中要用到这些区,则最好把SP值改置为1FH或更大的值。SP的初始值越小,堆栈深度就可以越深,堆栈指针的值可以由软件改变。因此,堆栈在内部RAM中的位置比较灵活。

除用软件直接改变SP值外,在执行PUSH和POP指令,各种子程序调用,中断响应,子程序返回(RET)和中断返回(RETI)等指令时,SP值将自动调整。

● 数据指针。数据指针DPTR是一个16位特殊功能寄存器,其高位字节寄存器用DPH表示,低位字节寄器用DPL表示。既可以作为一个16位寄存器DPTR来处理,也可以作为2个独立的8位寄存器DPL和DPL来处理。

DPTR主要用来存放16位地址,当对64KB外部存储器寻址时,可作为间址寄存器用。可用下列2条传送指令:“MOVX A, @DPTR和MOVX @DPTR, A”。在访问程序存储器时,DPTR可用作基址寄存器。采用基址+变址寻址方式的指令MOVC A, @A+DPTR,读取存放在程序存储器内的表格常数。

● 端口P0~P3。特殊功能寄存器P0、P1、P2和P3分别是I/O端口P0~P3的锁存器。P0~P3作为特殊功能寄存器还可用直接寻址方式参与其他操作指令。

● 串行数据缓冲器。串行数据缓冲器SBUF用于存放欲发送或已接收的数据,实际上由2个独立的寄存器组成:一个是发送缓冲器,另一个是接收缓冲器。当要发送的数据传送到SBUF时,进的是发送缓冲器。当要从SBUF读数据时,则取自接收缓冲器,取走的是刚接收到的数据。

● 定时器/计数器。MCS-51系列中有2个16位定时器/计数器T0和T1。它们各由2个独立的8位寄存器组成,共有4个独立的寄存器:TH0、TL0、TH1和TL1。可以对这4个寄存器寻址,但不能把T0或T1当作1个16位寄存器来寻址。

● 其他控制寄存器。IP、IE、TMOD、TCON、SCON和PCON寄存器,分别包含有中断系统、定时器/计数器、串行口和供电方式的控制和状态位。