|
1.5 存储器结构 |
存储器其实就是一个容器的概念,用于存储单片机运行过程中的各种数据和信息。在单片机中根据功能和存储结构的不同,可以分为数据存储器(RAM)和程序存储器(ROM)。而如果按照存储空间来分,则可以更详细地分为4个存储空间。
●片内程序存储器(片内ROM):4KB,物理地址为0000H~0FFFH。
●片外程序存储器(片外ROM):64KB,物理地址为0000H~FFFFH,其中1000H~FFFFH 为外部ROM。
●片内数据存储器(片内RAM):256B,物理地址为00H~FFH。
●片外数据存储器(片外RAM):64KB,物理地址为0000H~FFFFH。
典型的8051单片机片内有4KB的片内程序存储器和256B的片内数据存储器,可满足一定的需要。对于大型的程序,还可以片外扩展至64KB程序存储器和64KB数据存储器。程序和数据一样,都是由机器码组成的代码串,只是程序代码存放于程序存储器中,而数据则存放在数据存储器中。
程序存储器用于存放用户的程序代码,这样单片机便可以独立地执行某项任务。在51系列单片机中,程序存储器是统一编址的,没有具体区分片内程序存储器和片外程序存储器。51系列单片机可以寻址64KB的程序存储空间,而一般单片机内部只有4KB左右的程序存储空间,其余的则编址在片外。此时,可以通过单片机的 EA 引脚来区分。
●当 EA 引脚接高电平时,单片机从片内的程序存储器中读取程序。当程序计数器PC的值超过片内程序存储器的容量时,将自动转向外部的程序存储器来读取外面的程序。
●当 EA 引脚接低电平时,单片机直接从片外的程序存储器中读取程序,并输出 PSEN 选通信号。
单片机程序在执行时,由16位的程序计数器PC指示当前指令的地址。单片机启动复位后,程序计数器PC的内容为0000H,系统将从0000H单元开始执行程序。如果 EA 引脚接高电平,0000H单元位于片内程序存储器,则直接从片内开始执行。如果 EA 引脚接低电平,则忽略片内程序存储器,0000H单元位于片外程序存储器,则直接从片外开始执行程序。
注意: 对于内部无程序存储器ROM的8031单片机,其程序存储器只能外接,因此必须使 EA =0。
在程序存储器中有几个特殊区域需要注意。
●起始区域:位于0000H~0002H单元,当单片机复位后,程序计数器PC为0000H,单片机从0000H单元开始执行程序。如果主程序不是从0000H单元开始执行的,那么便需要在起始区域中放置一条无条件转移指令,直接转移到主程序的首地址去执行用户指定的程序代码。
●中断向量区域:位于0003H~002AH单元,为中断源提供了入口地址,其定义如表1-4所示。
表1-4 中断入口地址
这里,每两个相邻的中断入口地址非常接近,无法放置一个完整的中断服务程序。因此,这里实际上放置的是一个无条件转移指令,指向程序存储器中真正存放中断服务程序的地址。这样中断响应后,CPU读到这条转移指令,便转向真正存放中断服务程序的地址,继续执行中断服务程序。
对于大型的设计项目,代码的体积往往比较大,单靠单片机片内的程序存储空间基本无法满足需求。此时便需要扩展外部程序存储器。扩展外部程序存储器的方法比较简单,主要包括如下几步。
选择合适容量的存储器。
采用单片机的P0和P2作为16位地址总线的低8位和高8位,同时,P0口还分时复用为8位数据总线。
将单片机的 EA 引脚接高电平。这样,在外部扩展程序存储器情况下,程序可以首先从片内的程序存储器开始顺序执行,然后会自动转向外部程序存储器。
当单片机访问外部程序存储器的时候,程序存储器指针PC的低8位地址由P0口输出,PC的高8位地址由P2口输出。P2口和P1口共同组成16位地址总线。外部程序存储器中的指令代码由P0口输入,即P0口是低8位地址线和8位数据线的分时复用。在实际使用过程中,还需要注意如下几点。
●为了保证在访问外部程序存储器期间,16位的地址码不变,并且能正确地从P0口读入程序代码,应该将P0端口输出的低8位地址在ALE信号的控制下存入地址锁存器,这样便可以将P0端口空出来读取8位的程序代码。
●如果 EA 引脚接低电平,则CPU直接从片外程序存储器的0000H地址开始执行,而不管单片机片内是否含有程序代码。
数据存储器用于存放程序运行过程中的中间运算结果,这样结果具有暂时性,且掉电后将丢失。51系列单片机内部RAM共有256个单元,地址为00H~FFH,如图1-13所示。从图1-13中可以看出,单片机的这256个单元按其功能还可以细分为4个部分。
1.通用寄存器区
通用寄存器区的地址为00H~1FH,等分为4组通用寄存器,每组均为R0~R7。在同一时刻只能有一组通用寄存器参与运算。在程序中,可以通过PSW寄存器的RS1和RS2位进行设置。当选择任意一组通用寄存器时,其余三组被屏蔽。
图1-13 数据存储器结构
2.位寻址区
位寻址区的地址为20H~2FH,共16个字节,可寻址128位。该区域可以采用字节寻址和位寻址两种方法,而且还可以进行置“1”、清“0”、求反、转移,传送和逻辑等位操作。
位寻址区字节地址与位地址的对应如表1-5所示。
表1-5 字节地址与位地址的对应
3.字节寻址区
字节寻址区的地址为30H~7FH,共80字节。可用做一般的RAM,用户可以存放变量,也可在此区域开辟堆栈。
4.特殊功能寄存器区
特殊功能寄存器区位于高128B片内RAM,地址空间为80H~FFH地址单元。8051单片机的特殊功能寄存器前面已介绍过,这里重点介绍一下可位寻址的特殊功能寄存器。如果某个特殊功能寄存器的地址能被8整除,那么这个寄存器便可以进行位寻址。访问这些寄存器中的各位时,在位寻址指令中,可以用“寄存器名。位”、“字节地址。位”、“位地址”、“位名称”等来表示。例如“B.5”表示寄存器B的第5位。可位寻址的特殊功能寄存器及其位地址如表1-6所示。
表1-6 可位寻址的特殊功能寄存器及其位地址
对于大型的设计项目,程序中所操作的数据量比较庞大,单靠单片机片内的数据存储空间基本无法满足需求。此时便需要扩展外部数据存储器。扩展外部数据存储器的方法比较简单,主要包括如下几步。
选择合适容量的数据存储器RAM。
采用P0和P2作为16位地址总线的低8位和高8位,此时,P0口还分时复用为8位数据总线。
然后,便可以在程序中访问外部数据存储器。
其实,访问外部数据存储器的硬件结构和访问外部程序程序器是相同的。访问外部数据存储器地址,可由工作寄存器R0或R1来寻址256B单元或由数据指针DPTR寻址54KB的空间。R0或R1的8位地址由P0口送入地址锁存器输出,DPTR的16位地址则由P0口输出低8位地址到锁存器中,P2口则输出高8位地址。读写的数据由P0口输入/输出,因此P0口仍然是地址/数据分时复用的。
在程序中,访问不同的数据存储区是根据指令和寻址方式来区别的,主要体现在如下几个方面。
●访问特殊功能寄存器只能用直接寻址方式。
●访问外部数据存储器则需选用MOVX类指令,MOVX指令是单字节双周期指令。
●对于只需寻址256字节单元的可采用R i 进行8位地址间接寻址,否则选用DPTR16位地址指针,寻址64KB地址空间。
另外,在访问外部数据存储器时,分为读和写操作,其中读选通信号为 RD ,写选通信号为 WR ,两者均为低电平有效。而单片机在访问外部程序和数据存储器时各有不同的地址指针PC、R i 、DPTR,各指针又有不同的读或读写选通信号 PSEN 、 RD / WR 。这就从结构上把程序存储器和数据存储器的访问截然分开。两者虽然均采用16位地址总线,但由于使用了完全不同的地址指针和读、读写选通信号,因此可以保证指令的执行不会出错。这便为单片机的应用提供了极大的方便。