[C] 第4章 C51存储结构

文章目录

  • 第5章 C51存储结构
    • AT89S51系统单片机的存储结构
      • 存储器结构
      • 存储器特点
      • 存储器地址分配
      • 程序存储器
      • 数据存储器
    • 寄存器
      • 位寻址空间
      • 堆栈和数据缓冲区
      • C51的存储类型
      • C51的扩展数据类型
      • C51存储模式
      • C51存储指针

第5章 C51存储结构

AT89S51单片机的存储器可分为程序存储器和数据存储器,又有片内和片外之分。

AT89S51系统单片机的存储结构

  • 单片机的存储结构(存储内容)
普林斯顿结构:程序存储器和数据存储器进行统一编址。
哈弗结构:数据存储器和数据存储器分开编制。(AT89S51)

存储器结构

  • 程序存储器:内部程序存储器、外部程序存储器
  • 数据存储器:特殊功能寄存器区、数据缓存区堆栈区、位寻址区、4组通用寄存器R0~R7也可可作为RAM使用

存储器特点

(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具有快速保护现场功能,提高效率和响应中断速度十分有利。

位寻址空间

堆栈和数据缓冲区

  • 原则上AT89S51单片机的堆栈可以设在内部RAM的任意区域内,但是一般设在30H~7FH的分为内。
  • 栈顶的位置由堆栈指针SP指出。堆栈指针为8位,而且堆栈指针使向上生成的。
  • 复位时,SP=07H,30H~7FH可作为数据缓存区使用。工作寄存器区、位地址区、对没用上的RAM空间都可作为数据缓存区。

C51的存储类型

C51存储类型 描述
DATA 片内RAM的低128B,使用直接寻址
BDATA 片内RAM的位寻址区(20H~2FH)
IDATA 片内的256B使用,间接寻址
XDATA 外部数据存储区,使用PDATA间接寻址
PDATA 外部存储区的256B,通过P0口的地址对其寻址
COODE 程序存储,使用DPTR寻址
  • 访问单片机地址存储器空间绝对地址时通过_at_实现的,一般形式:
[存储器类型] 数据类型说明符变量名 _at_地址常数
  • 注意
(1)C51语言能识别各种数据类型,如果省略按照默认的存储器类型确定变量的存储区域。
(2)地址常数用于指定变量的绝对地址,必须位于有效的存储空间之内,使用_at_定义的变量必须为全局变量。
  • 举例:使用_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(;;);
}

C51的扩展数据类型

  • 使用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;
      

C51存储模式

使用存储类型的方法是在命令行中使用SMALL、COMPACT、LARGE控制命令行中的一个。

  • 举例:指定存储类型为SMALL
void fun1(void)	
small{};
  • 总述

    • C51语言编程,如果在定义时省略存储类型的标识符,编译器会自动默认存储类型。
    • 默认的存储类型由SMALL、COMPACT、LARGE存储模式指令限制。
    • 例如:若声明char i,则在SMALL存储模式下,i被定位在data存储器;在COMPACT模式下,i将被定义在Idata区;在LARGE模式下,i将被定位在xdata存储区。
  • SMALL模式

    • 在SMALL模式中,所有变量都默认位于51单片机内部的数据存储器。这与使用data
    • 指定存储器类型方式的方式一样。
    • 在SMALL模式下,变量访问的效率很高,但所有的数据对象和堆栈必须使用内部RAM。
  • COMPACT模式

    • 在COMPACT模式中,所有变量都默认位于51单片机外部存储器的一页内。这与使用pdata指定存储类型的方式一样。
    • COMPACT模式适用于变量不超过256B的情况。
    • 与SMALL模式相比,该存储器模式效率比较低,对变量的访问速度也要慢一些。
  • LARGE模式

    • 在LARGE模式中,所有的变量都默认位于51单片机外部的数据存储器中。这与使用xdata指定存储器类型的方式一样。
    • LARGE比SMALL模式和COMPACT模式的效率都要低。

C51存储指针

  • 通用指针
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)使用指定存储区指针的好处
	节省存储空间,编译器不用为存储器选择和决定正确的存储器操作指令存储代码,使代码更加简短
	但必须保证指针不指向所声明的存储器以外的位置,否则会产生错误。

你可能感兴趣的:(C,c语言,开发语言,笔记,单片机,51单片机)