AT89S51单片机的存储器可分为程序存储器和数据存储器,又有片内和片外之分。
普林斯顿结构:程序存储器和数据存储器进行统一编址。
哈弗结构:数据存储器和数据存储器分开编制。(AT89S51)
(1)程序存储器和数据存储器截然分开,各有自己的地址系统、控制信号和特定的功能;
(2)程序存储器只存放程序和常数,数据存储器常用来存放放运行程序所需的大量数据;
(3)程序存储器一般为只读存储器(ROM或EPROM),数据存储器一般则采用静态随机存储器RAM;
(4)程序存储器和数据存储器、内部寄存器和外部寄存器、字节地址和位地址,这些存储器的地址多数从零开始编址,所以在地址上都有重叠;究竟是寻址到哪一个存储器空间,AT89S51单片机通过不同的指令形式或控制信号来区分;
(5)工作寄存器以RAM形式组成,I/O接口采用存储器对应方式;
(6)拥有有功能很强的布尔处理器,可寻址的位存储空间为256位。
AT89S51单片机由PC作为地址指针的片内4KB(0000H~0FFFH),外部EPROM也从0000H4KB+60KB(0000H~FFFFH)开始编址。
片外由数据指针作地址64KB数据存储器。
(1)片内4KB程序存储空间,其地址为0000H~FFFFH,外部EPROM也从0000H开始编址;
(2)地址为0000H~0FFFH内部地址有重叠,由EA引脚来控制内、外程序存储器的选择;
(3)EA=0,CPU访问外部程序存储器;
(4)程序存储器存放的常数。以指令形式的不同区分是访问数据存储器还是程序存储器,凡是从程序存储器常量表取数据时,都需要使用查表指令MOVC。
(1)数据存储器用于存放运算的中间结果,用作缓存和数据暂存,以及设置特征标志位等;
(2)数据存储分为片内和片外两部分;
(3)内部RAM编制为000H~7FH,外部RAM编制为0000H~FFFFH,地址有重叠,由指令形式区分;
(4)MOV指令:读/写内部数据寄存器、特殊功能寄存和位地址空间,使用MOVX指令时读写外部数据存储器。
(1)单片机内部存储器以RAM形式组成,即工作寄存器包含在内部数据存储器中。
(2)地址为00H~1FH,内部RAM由32B分为4个当前工作存储器,每个区由8个工作寄存器,编号为R0~R7。
(3)每个寄存器区可被选为CPU当前工作寄存器,用户通过改变程序状态PSW(Program Status Word)的RS1、RS0两位任选一个当前工作寄存器工作组,特点使AT89S51具有快速保护现场功能,提高效率和响应中断速度十分有利。
C51存储类型 | 描述 |
---|---|
DATA | 片内RAM的低128B,使用直接寻址 |
BDATA | 片内RAM的位寻址区(20H~2FH) |
IDATA | 片内的256B使用,间接寻址 |
XDATA | 外部数据存储区,使用PDATA间接寻址 |
PDATA | 外部存储区的256B,通过P0口的地址对其寻址 |
COODE | 程序存储,使用DPTR寻址 |
[存储器类型] 数据类型说明符变量名 _at_地址常数
(1)C51语言能识别各种数据类型,如果省略按照默认的存储器类型确定变量的存储区域。
(2)地址常数用于指定变量的绝对地址,必须位于有效的存储空间之内,使用_at_定义的变量必须为全局变量。
void main(void)
{
data unsigned char x1_at_0x40; //data区定义字节变量x1,其地址为0x40
xdata unsigend int x2_at_0x20000; //xdata区定义整形变量x2,其地址位0x2000
x1 = 0xff;
x2 = 0x1111;
/********************其他程序************************/
for(;;);
}
使用sfr访问:定义1个8位I/O口
使用sbit访问I/O口:定义1个I/O口
方式1:
sbit 位变量名 = 位地址
举例
sbit P1_1 = 0X91; //定义P1_1的位地址为0X91
方式2:
sbit 位变量名 = 字节地址^位的位置
举例
sbit P1_1 = 0X90^1;
方式3:
sbit 为变量名 = 特殊工程寄存器名^位位置,如
sfr P1 = 0X90; //先定义一个特殊功能寄存器名,再定义位变量名的位置
sbit P1_1 = P1^1;
使用存储类型的方法是在命令行中使用SMALL、COMPACT、LARGE控制命令行中的一个。
void fun1(void)
small{};
总述
SMALL模式
COMPACT模式
LARGE模式
C51提供了一个3B的通用指针。通用指针的声明和使用均与标准C语言相同。在定义它的同时还可以说明其存储类型。
long *star; //为一个指向long型的指针,而star本身则根据存储模式存入不同的RAM区
char *xdata ptr; //为一个指向char类型的指针,而ptr存入外部RAM区
(1)上面例子中,long、char指针指向的数据可存放与任何存储器中。
(2)通用指针产生的代码比指定存储区指针代码执行速度要慢,因为存储区在运行前是未知的,编译不能优化存储器空间,必须产生可以访问任何存储区的通用代码。
(3)如果优先考虑执行速度,应尽可能的使用指定存储类型的指针,而不用通用指针。
(4)通用指针使用3个字节保存,指针的第一个字节表明指针所存储的区的空间地址,另外两个字节存储在16位偏移量,但data、idata、pdata区。使用8位偏移量就可以了。
C51语言允许用户指定指针的存储段,这种指针成为存储区指针。
char data *str //str指向内部RAM字符型数据
int xdata *str1 //str1指向外部RAM整形数据
(1)存储类型子在编译时使确定的,通用指针所需的数据类型字节在指定存储器的指针中式不需要的,指定存储区只需要一个字节(idata、data、bdata、pdata指针)或两字节(code和xdata)。
(2)使用指定存储区指针的好处
节省存储空间,编译器不用为存储器选择和决定正确的存储器操作指令存储代码,使代码更加简短
但必须保证指针不指向所声明的存储器以外的位置,否则会产生错误。
(1)存储类型子在编译时使确定的,通用指针所需的数据类型字节在指定存储器的指针中式不需要的,指定存储区只需要一个字节(idata、data、bdata、pdata指针)或两字节(code和xdata)。
(2)使用指定存储区指针的好处
节省存储空间,编译器不用为存储器选择和决定正确的存储器操作指令存储代码,使代码更加简短
但必须保证指针不指向所声明的存储器以外的位置,否则会产生错误。