一、程序存储器

一、程序存储器

MCS-51单片机的程序存储器用于存放编好的程序和表格常数。片外最多能扩展64KB的程序存储器,片内外的程序存储器是统一编址的。程序存储器通过16位程序计数器PC寻址,寻址能力为64KB,这使得指令能在64KB的程序存储器地址空间内任意跳转。当端保持高电平时,若程序计数器PC的内容在片内ROM的地址空间内,单片机则执行片内ROM中的程序,若PC_的内容超出片内ROM的地址空间时,单片机则自动转向执行片外ROM中的程序;当端保持低电平时,则只能寻址片外ROM,片外ROM同样是从0000H开始编址。

以89C51为例,其片内Flash ROM的容量为4KB,地址空间为0000H~0FFFH;如果需要外部扩展ROM,地址从1000H开始,片内外总容量最多为64KB。

当引脚接高电平时,89C51的PC在0000 H~0FFFH地址范围内时,则执行片内Flash ROM中的程序;当指令地址超过0FFFH后,就自动转向片外ROM中去取指令。

当引脚接低电平(接地)时,89C51片内ROM不起作用,CPU只能从片外Flash ROM中取指令,此时,片外地址从0000 H开始编址。这种接法特别适用于片内不带ROM的单片机。例如,使用片内没有程序存储器的8031时必须使=0,以便能够从片外扩展的EPROM或Flash ROM中读取指令。

89C51从片内程序存储器和片外程序存储器取指令时,执行速度相同。

程序存储器低地址的40多个单元是留给系统使用的,见表2-2。

表2-2 保留的存储单元

其中0000 H~0002 H是复位后引导程序的存放单元。因为系统复位后,程序计数器(PC)=0000 H,所以单片机总是从0000 H单元开始取指令执行程序。如果程序不是从0000 H单元开始,应该在这3个单元中存放一条无条件转移指令,以便程序被引导到转移指令指定的ROM空间,去执行指定的程序。

还有一组特殊单元是0003 H~002AH,共40个单元。这40个单元被均匀地分为五段,每段8个字节,作为五个中断源的中断地址区。各中断源的中断矢量地址见表2-3,其中:

0003H~000AH外部中断0中断地址区。

000BH~0012H定时/计数器0溢出中断地址区。

0013H~001AH外部中断1中断地址区。

001BH~0022H定时/计数器1溢出中断地址区。

0023H~002AH串行口中断地址区。

表2-3 中断矢量地址表

CPU响应中断后,按中断种类自动转到各中断区的入口地址(表2-3)去执行程序,因此在中断地址区中理应存放中断服务程序。但是通常情况下,8个单元难以存放下一个完整的中断服务程序,因此通常也是在中断地址区首地址开始设置一条无条件转移指令,以便响应中断后,通过中断地址区再转到中断服务程序的实际入口地址。

例如,当外部中断引脚(P3.2)有效时,即引起中断申请,CPU响应中断后自动将其中断服务程序入口地址0003H装入PC,程序就自动转向0003H单元开始执行。如果事先在0003H~000AH存有引导(转移)指令,程序就被引导(转移)到指定的中断服务程序空间去执行。这里,0003H也称为中断矢量地址。

当89C51片内4KB Flash ROM容量不够时,可选择8KB、16KB、32KB的89C52、89C54、89C58等单片机。应尽量避免外扩程序存储器芯片而增加硬件的负担。

上述特殊单元除可以作为中断入口外,也可以作为一般的程序存储器使用。