单片机技术一学就会
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 单片机的存储器

1.3.1 存储器的常用单位和数制

1. 位(bit)

位是计算机内部数据储存的最小单位,常用b来表示。一个二进制位只可以表示1和0两种状态。

2. 字节(Byte)

字节是计算机中数据处理的基本单位,常用B来表示。计算机中以字节为单位存储和解释信息,规定一字节由8位二进制位构成。1Byte =8bit。8 位二进制数最小为00000000,最大为11111111。

3. 数制

数制就是数的进位制。单片机中还常使用二进制、八进制和十六进制。

1)进位计数制

按进位的原则进行计数的方法称为进位计数制。在采用进位计数制的数字系统中,如果用r个基本符号(如0,1,2,…,r-1)表示数值,则称其为基r数制,r称为该数制的基(也称为权)。例如,日常生活中常用的十进制数,就是r=10,即基本符号为0,1,2,…,9。如果取r =2,即基本符号为0,1,则为二进制数。计算机中常用的几种进制数的表示如表1-2所示。

表1-2 计算机中常用的几种进制数的表示

2)二、八、十六进制数(非十进制数)转换为十进制数

非十进制数转换为十进制数的方法是:将各位数码与位权相乘求和,就能得到十进制数。二、八、十六进制数转换为十进制数的举例如表1-3所示。

表1-3 二、八、十六进制数转换为十进制数的举例

3)十进制数转换为二、八、十六进制数

十进制数转换成二进制数的方法:除2取余,即将十进制数依次除2,并记下余数,一直除到商为0,最后把余数按相反次序排列,得到的就是相应的二进制数。例如,将十进制数30转换成二进制数的过程如下所示:

将十进制数转换为八进制数和十六进制数也可采用除8取余和除16取余的方法,但相对比较麻烦,可借助二进制数进行转换。因为23 =8,24 =16,所以可以进行以下转换。

十进制数转换为八进制数:30D=011110B=36O。

十进制数转换为十六进制数:30D=00011110B=1EH。

1.3.2 存储器的配置

1. 分类

在单片机中,用户设计的程序及程序运行时的数据将存放到存储器中。程序设计完成后写到存储器中,在单片机运行时程序只能从存储器中被读取,不能再修改,否则将发生运行错误。这种用来存放程序的只能读不能写的存储器,称为只读存储器(ROM)。而在单片机运行时的数据将随着程序的运行发生变化,因此存放数据的存储器既可读又可写,将这样的存储器称为数据存储器或随机存储器(RAM)。

51系列单片机有两种存储器(程序存储器和数据存储器),它们又分为4个物理存储空间(内部程序存储器、外部程序存储器、内部数据存储器、外部数据存储器),如图1-18所示。

图1-18 单片机的存储器配置图

2. 存储容量与地址分配(如表1-4所示)

表1-4 存储容量与地址分配

3. 程序存储器

AT89C51单片机的程序存储器为16位地址,可寻址范围为64KB(外部存储器的最大容量为64KB,内部程序存储器最大容量为4KB)。它从物理结构上分为内部程序存储器和外部程序存储器两部分,在逻辑结构上为一个部分,采用同一指令MOVC进行访问。用外部引脚EA电平的高低来区分4KB空间访问的是内部程序存储器还是外部程序存储器。

1)内部数据存储器

AT89C51单片机的内部数据存储器的地址为8位,可寻址范围为256B。其地址分配和用途如表1-5所示。

表1-5 内部数据存储器的地址分配与用途

(1)21个特殊功能寄存器,如表1-6所示。

表1-6 特殊功能寄存器

表1-6中的其他寄存器会在相应的章节详细介绍。

(2)程序状态字PSW的各位定义及功能如表1-7所示。

表1-7 程序状态字PSW的各位定义及功能

2)外部数据存储器

AT89C51单片机的外部数据存储器为16位地址,最多可扩充到64KB。内部RAM和外部RAM的低256B的地址相同,但它们却是两个不同的地址空间。区分这两个地址空间的方法是采用不同的指令:访问内部RAM用MOV,访问外部RAM用MOVX。

1.3.3 寻址方式

所谓寻址方式就是单片机指令中提供的操作数的形式,也就是寻找操作数或操作数所在地址的方式。在51系列单片机中,存放数据的存储器空间有4种:内部RAM、特殊功能寄存器SFR、外部RAM和程序存储器ROM。其中,内部RAM和特殊功能寄存器SFR统一编址,外部RAM和程序存储器ROM是分开编址的。为了区别指令中操作数所处的地址空间,对于不同存储器的数据操作,采用不同的寻址方式,共有七种:立即数寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、位寻址、相对寻址。

1. 立即数寻址

指令中直接给出操作数的寻址方式称为立即数寻址。立即数用前面加“#”号的8位数表示(#data,如#30H)或16位数(#data16,如#2052H)表示。

例:MOV A,#80H;80H→A

MOV DPTR,#2000H;2000H→DPTR

2. 直接寻址

指令中直接给出操作数地址(direct)的寻址方式称为直接寻址。寻址对象为:内部数据存储器,在指令中以直接地址表示;特殊功能寄存器SFR,在指令中用寄存器名称表示。

例:MOV A,25H;内部RAM的(25H)→A

MOV P0,#45H;45H→P0,P0为直接寻址的SFR

MOV 30H,20H;内部RAM的(20H)→(30H)

3. 寄存器寻址

以通用寄存器的内容为操作数的寻址方式称为寄存器寻址。通用寄存器包括A、B、DPTR、R0~R7。其中B寄存器仅在乘法、除法指令中为寄存器寻址,在其他指令中为直接寻址。A寄存器既可以为寄存器寻址,又可以为直接寻址(此时记为ACC)。直接寻址和寄存器寻址的差别在于:直接寻址时,寻址地址为操作数所在的字节地址(占1字节);寄存器寻址时,寄存器编码出现在指令码中。寄存器寻址的速度比直接寻址要快。除了上面所介绍的几个寄存器外,其他特殊功能寄存器一律为直接寻址。

例:MOV A,R0;R0→A,R0为寄存器寻址

MUL AB;A × B→BA,A,B为寄存器寻址

MOV B,R0;R0→B,R0为寄存器寻址,B为直接寻址

PUSH ACC;A的内容入栈,A为直接寻址

ADD A,ACC;A为寄存器寻址,ACC为直接寻址

4. 寄存器间接寻址

以寄存器中的内容为地址,该地址的内容为操作数的寻址方式称为寄存器间接寻址。能够进行寄存器间接寻址的寄存器有R0、R1、DPTR,用前面加@表示,如@R0、@R1、@DPTR。寄存器间接寻址的存储空间包括内部数据存储器和外部数据存储器。由于内部数据存储器共有128B,所以用1B的R0和R1可间接寻址整个空间。而外部数据存储器最大可达64KB,仅R0或R1无法寻址整个空间,为此需要由P2端口提供外部RAM高8位地址,由R0或R1提供低8位地址,由此共同寻址64KB范围。也可用16位的DPTR寄存器间接寻址64KB存储空间。

在指令中,是对内部RAM还是对外部RAM寻址,区别在于对外部RAM的操作仅有数据传送指令,并且用MOVX作为操作助记符。

例:MOV@R0,A;A→以R0内容为地址的内部RAM中

MOVX @DPTR,A;A→以DPTR内容为地址的外部RAM中

5. 变址寻址

由寄存器DPTR或PC中的内容加上A累加器内容之和而形成操作数地址的寻址方式称为变址寻址。变址寻址只能对程序存储器中的数据进行寻址操作。由于程序存储器是只读存储器,所以变址寻址只有读操作而无写操作。在指令符号上采用MOVC的形式。

例:MOVC A,@A+DPTR;(A+DPTR)→A

MOVC A,@A+PC;(PC)+1→PC((A)+(PC))→A

6. 位寻址

对位地址中的内容进行位操作的寻址方式称为位寻址。由于单片机中只有内部RAM和特殊功能寄存器的部分单元有位地址,所以位寻址只能对有位地址的空间进行寻址操作,内部RAM位寻址区为20H~2FH单元,共有16B,128位,位地址为00H~7FH,位地址分配表如表1-8所示。位寻址是一种直接寻址方式,由指令给出直接位地址。与直接寻址不同的是,位寻址只给出位地址,而不是字节地址。

表1-8 内部RAM位寻址区的位地址分配表

例:SETB 20H;1→20H位

MOV 32H,C;进位CY(即指令中的C)→32H位

7. 相对寻址

以当前程序计数器PC的内容为基址,加上指令给出的1B补码数(偏移量)形成新的PC值的寻址方式称为相对寻址。相对寻址方式只修改PC值,因此它主要用于实现程序的分支转移。

例:SJMP 08H;PC+2 +08H→PC(该指令为2B,所以有PC+2)