单片机的存储器结构是指单片机内部存储器的硬件组织形式。不同型号单片机的存储器结构会有所不同,但是原理是相似的。本章以最常用的51系列单片机为例,介绍其存储器结构。
51系列单片机采用哈佛结构,将程序代码存储器(ROM)
和数据存储器(RAM)
分开,各部分遵循各自的寻址机构
和寻址方式
。
51系列单片机的存储器被划分成几个不同的区域。为了C51的程序运行时可以方便地调取数据和程序代码,C51程序中的数据和程序代码被分类存放在单片机的不同存储区域内。51系列单片机及其兼容的单片机在物理上,可划分为以下4个不同的存储区。片内数据存储区(片内RAM)
、片外数据存储区(片外RAM)
、片内程序存储区(片内ROM)
、片外程序存储区(片外ROM)
。
51系列单片机的片内数据存储区(片内RAM)可以划分为如下所示的两大区域。
-
❑片内低128字节RAM区:地址范围为00H~7FH。该区域主要采用直接字节地址寻址方式,用来存储数据,也可存放堆栈和寄存器。
-
❑特殊功能寄存器区(SFR):地址范围为80H~0FFH。该区域可位寻址、字节寻址或字寻址,用以控制定时器、计数器、串口、I/O以及其他一些硬件资源。
其中,地址范围为00H~07FH的低128字节片内RAM区,又可进一步划分为如下所示的3个区域。
-
❑通用寄存器区。地址范围为00H~1FH,共有如下所示的4个寄存器组构成。
-
❑第0组寄存器:地址范围为00H~07H。
-
❑第1组寄存器:地址范围为08H~0FH。
-
❑第2组寄存器:地址范围为10H~17H。
-
❑第3组寄存器:地址范围为18H~1FH。
每个寄存器组都分别含有8个通用寄存器:R0、R1、R2、R3、R4、R5、R6、R7,即R0~R7。通用寄存器区总共有32个通用寄存器。每个通用寄存器既可以采用寄存器名寻址方式,也可以直接采用字节地址寻址方式,地址范围为00H~1FH。
-
❑可位寻址区。地址范围为20H~2FH,共16个字节单元,这些单元既可以采用按字节寻址方式,也可以采用按位寻址方式,共128位。
-
❑用户RAM区。地址范围为30H~7FH。这个区域只能采用字节地址寻址方式,可以在该区设置堆栈。
sfr
和sfr16
主要用于定义8051
的特殊功能寄存器
。其中sfr
用来定义8位
特殊功能寄存器,sfr16
用来定义16
位特殊功能寄存器,其一般形式如下。
sfr特殊功能寄存器名=特殊功能寄存器地址常数;
sfr16特殊功能寄存器名=特殊功能寄存器地址常数;
其中,sfr
和sfr16
为关键字。特殊功能寄存器的定义示例如下。
sfr P2=0xA0;//定义P2的I/O端口,其地址为A0H
sfr P1=0x90;//定义P1的I/O端口,其地址为90H
sbit
用于定义可位寻址对象,用于位寻址,从位寻址字节中定义位变量。例如,定义特殊功能寄存器某位为位变量。在C51语言中,有3种方式定义位变量。
❑sbit位变量名=位地址。该语句用于将位地址赋值给位变量名,示例如下。
sbit P1_1=0x91;//将位的绝对地址赋给位变量
头文件"reg51.h"
中定义了51
单片机常用的特殊功能寄存器。如果需要使用单片机的硬件资源,必须在C51源程序的开始处包含这个文件。该头文件中对寄存器用以上介绍的sfr
和sbit
扩展数据类型进行了定义。C51中的寄存器的地址是确定不变的,头文件"reg51.h"
中寄存器的定义和地址如下所示。
#ifndef__REG51_H__
#define__REG51_H__
/*BYTE Register*///字节型特殊功能寄存器
sfr P0=0x80;
sfr P1=0x90;
sfr P2=0xA0;
sfr P3=0xB0;
sfr PSW=0xD0;
sfr ACC=0xE0;
sfr B=0xF0;
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 IE=0xA8;
sfr IP=0xB8;
sfr SCON=0x98;
sfr SBUF=0x99;
/*BIT Register*///bit型特殊功能寄存器
/*PSW*///PSW寄存器
sbit CY=0xD7;
sbit AC=0xD6;
sbit F0=0xD5;
sbit RS1=0xD4;
sbit RS0=0xD3;
sbit OV=0xD2;
sbit P=0xD0;
/*TCON*///TCON寄存器
sbit TF1=0x8F;
sbit TR1=0x8E;
sbit TF0=0x8D;
sbit TR0=0x8C;
sbit IE1=0x8B;
sbit IT1=0x8A;
sbit IE0=0x89;
sbit IT0=0x88;
/*IE*///IE寄存器
sbit EA=0xAF;
sbit ES=0xAC;
sbit ET1=0xAB;
sbit EX1=0xAA;
sbit ET0=0xA9;
sbit EX0=0xA8;
/*IP*///IP寄存器
sbit PS=0xBC;
sbit PT1=0xBB;
sbit PX1=0xBA;
sbit PT0=0xB9;
sbit PX0=0xB8;
/*P3*///P3端口复用寄存器
sbit RD=0xB7;
sbit WR=0xB6;
sbit T1=0xB5;
sbit T0=0xB4;
sbit INT1=0xB3;
sbit INT0=0xB2;
sbit TXD=0xB1;
sbit RXD=0xB0;
/*SCON*///SCON寄存器
sbit SM0=0x9F;
sbit SM1=0x9E;
sbit SM2=0x9D;
sbit REN=0x9C;
sbit TB8=0x9B;
sbit RB8=0x9A;
sbit TI=0x99;
sbit RI=0x98;
#endif//结束