一、AT89S52的存储器结构
1.程序存储器(ROM)
图1是AT89S52单片机的存储器结构示意图。其程序存储器的寻址范围为0000H~FFFFH(64k字节)。
(1)单片机复位后程序总是从0000H单元开始执行;
(2)在程序存储器中有一个固定的中断入口地址区,该区域必须存放对应的中断程序的首条指令,不得随意被其他程序占用,因此在程序存储器的0000H中总是存放一条无条件转移指令,使程序跳过中断入口地址区,转到真正的主程序区执行。
AT89S52单片机有8个中断源、6个中断矢量,其中断人口地址如附表所示。通常,在0000H单元存放指令“AJMP 0030H”,跳过附表中的中断人口地址区,并从0030H单元开始存放主程序。
2.数据存储器(RAM)
AT89S52数据存储器的寻址范围从0000H-FFFFH(64k字节)。片内数据存储器分为低128字节、高128字节数据存储器,以及特殊功能寄存器(SFR)三部分。高128字节数据存储器和SFR占用相同的地址(80H~FFH),只是二者所采用的寻址方式不同。
二、AT89S52存储器的操作方式
1.程序存储器的操作方式程序存储器用于存放程序、表格和固定的常数,单片机需要借助三个特殊功能寄存器——即16位的程序计数器PC、16位的数据指针DPTR和8位的累加器A对程序存储器寻址。
程序计数器PC用于存放指令的地址;数据指针DPTR用于存放表格和固定常数的首地址,即基址;累加器A用于存放从表格和固定常数的首地址到待取数据的偏移量,即变址。下面分别加以说明。
(1)指令的自主操作 程序计数器PC是不可寻址的特殊功能寄存器。单片机在执行指令时,会自动修改程序计数器PC的值,使其指向将要执行的指令,实现顺序或转移操作。
如执行“MOV A,#01H”指令时,PC值自动加2,指向下一条指令;又如,执行“AJMP 0080H”指令时,自动将PC的值置为0080H,实现无条件转移至0080H处执行的操作。
(2)查表操作 对于存放在表格中的常数的读取,采用查表指令MOVC,通过PC或DPTR的基址变址的寻址方式进行操作。相关的指令有两条,即“MOVC A,@A+PC”和“MOVC A,@A+DPTR”。
2.片内数据存储器的操作方式
(1)片内数据存储器的结构 片内数据存储器的低128字节是基本数据存储器区;高128字节是只能间址寻址的数据存储器扩展区;特殊功能寄存器SFR是采用直接寻址方式访问的SFR区。图2是AT89S52片内数据存储器的结构图。需要记住的是,SFR区只能为已经定义或今后扩展新的功能时所要定义的特殊功能寄存器用,不能作一般数据存储器,故我们在谈到某单片机片内有多少字节数据存储器时,没有包括其片内的SFR。
(2)基本数据存储器区操作基本数据存储器区分为工作寄存器区、可按位寻址的寄存器区、堆栈区,以及数据缓冲区四部分,该区域可以采用直接寻址和间接寻址的方式进行数据传送。
1)工作寄存器区 从地址00H~lFH的32个工作寄存器分成O~3四组,每组8个寄存器。工乍寄存器的组选由SFR的程序状态字PSW的RSI和RS0位决定。RSl、RS0为00、01、10、11,分别选工作寄存器的0组、1组、2组、3组。
2)位寻址寄存器区从地址20H~2FH的16个字节RAM,除了可以作为普通的数据缓冲器外,突出的特点是每一位都可以用位寻址指令直接寻址,即可以直接对其中的任意一位清零或置l,或根据其状态实现程序的转移,使得控制方式更加灵活多样。在实际应用中,通常会将其作为用户程序运行状态的标志等来使用。
3)堆栈区 堆栈区是用于存放子程序调用、中断处理程序执行后的返回地址,以及一些需要恢复的寄存器的内容。AT89S52由SFR的堆栈指针SP设置。复位时,SP为07H,堆栈底为07H。通过指令“MOV SP,#xxH”可以修改SP,如“MOV SP,#30H”指令将堆栈底设置为30H。
4)数据缓冲区 以上三个区域未用的数据存储器,以及高128字节数据存储器均可作为数据缓冲区使用。