《计算机硬件及网络第3章80C51单片机的存储器结构》由会员分享,可在线阅读,更多相关《计算机硬件及网络第3章80C51单片机的存储器结构(57页珍藏版)》请在金锄头文库上搜索。
1、 计算机硬件及网络计算机硬件及网络 第第3 3章章-80C51-80C51单片机的存储器单片机的存储器结构结构3.1 存储器的分类 存储器的的作用是用来存放程序和数据,存储器可分为磁存储和半导体存储器,半导体存储器按功能又可分为只读存储器ROM和随机存储器RAM,如图3-1所示。单片机存储器结构中都采用半导体存储器。1. 只读存储器ROM 只读存储器在正常工作状态下只能从中读出数据,用户不能快速地随时修改或者重新写入数据,数据可长时间的保存。(1)可编程ROM,可通过专用设备(编程器)将数据写入ROM。 PROM:用户可一次编程; EPROM:紫外线擦除,电改写(多次); EEPROM:电擦除
2、,电改写(多次); FLASHROM:闪存(多次)。(2)掩膜ROM 用户不能将数据写入,由厂家写入数据。 由于上述特点,所以在单片机中一般做为程序由于上述特点,所以在单片机中一般做为程序存储器。存储器。2. 随机存取存储器RAM 在加电期间,可以随时向存储器里写入数据或从中读出数据,但掉电后,数据丢失。 SRAM:静态存储器,加电期间数据可以长久保存,掉电信息丢失。 DRAM:动态存储器,即使在加电期间数据也会丢失(数据要刷新)。 由于上述特点,所以在单片机中一般作由于上述特点,所以在单片机中一般作为数据储存器。为数据储存器。3.2 计算机中储存器的两种结构 在计算机中存储器的用途是存放程序
3、和数据,它有两种结构:冯诺伊曼结构和哈佛结构。 冯诺伊曼结构:程序和数据共用一个存储器逻辑空间,统一编址。 哈佛结构:程序与数据分为两个独立存储器逻辑空间,分开编址。注: 个人电脑(PC机)采用的是冯诺伊曼结 构; 单片机一般采用哈佛结构(8051); 8051(80C51)单片机,数据存储器用的是 SRAM程序存储器用的是ROM。3.3 80C51单片机的储存器3.3.1 8051(80C51)系列存储器结构1. 物理空间有四个部分 (1)内部数据存储器(128B SRAM)。 (2)外部扩展数据存储器(最大64K RAM)。 (3)内部程序存储器(4K FlashROM AT89S51)。
4、 (4)外部扩展程序存储器(最大64K RAM)。2. 逻辑空间有三个部分 (1)程序存储器ROM:包括内部和外部,共用一个64K的寻址空间。 (2)内部数据存储器RAM(128B),独立的一个128B的寻址空间。 (3)外部数据存储器RAM(64K),独立的一个64K的寻址空间。如图3-2所示。内部数据存储器和外部数据存储器相互之间独立编址,内部数据存储器和外部数据存储器相互之间独立编址,内部程序存储器和外部程序存储器统一编址,共用一个内部程序存储器和外部程序存储器统一编址,共用一个64K的寻址空的寻址空间。间。3.3.2 数据储存器 数据存储器是采用了静态随机存储器(SRAM)的结构,掉电
5、信息丢失,故用于暂存数据及运算的中间结果。1. 内部数据存储器的结构 内部数据储存器它由工作寄存器区、位寻址区、用户区三个部分组成,地址范围00H7FH,共128个单元。用户对这些单元的访问,可以用可以用“直接寻址直接寻址”的方法,即在指令中用的方法,即在指令中用“direct”表示,表示,指的就是00H7FH这128个地址单元,指令中直接给出操作数所在单元地址的这种寻址方式称之为“直接寻址”。 何为寻址方式,即寻找操作数的方法。图3-3 内部数据存储器结构(1)工作寄存器区(00H1FH) 共32个单元,又分为4组,每组8个单元,都用R0R7表示,如图3-4所示,个寄存器对应的地址见表3-1
6、所示 在内部工作寄存器中的地址是唯一,但寄存器名重名,一个寄存器名对应有4个单元,为了解决重名问题,单片机用特殊功能寄存器PSW中的RS1、RS0来选择,也就是说,单片机在工作时不会同时使用这4组寄存器,在某一时刻,只能选择其中的一组。工作寄存器组地址寄存器名RS1RS00组00H07HR0R7001组08H0FHR0R7012组10H17HR0R7103组18H1FHR0R711 在指令系统中对于这些空间的访问有以下方法:直接使用地址,在指令系统中用直接使用地址,在指令系统中用“direct”表示,这表示,这种方式称之为直接寻址。种方式称之为直接寻址。 如:指令 MOV A , direct
7、 ;指令中的“direct”就是指内部数据存储器中的地址(00H7FH) 该指令就是把direct这个单元中的操作数传送到A中。操作数是指指令中参与操作的数据。 指令系统中出现的“direct”,在实际编程的过程中不能出现,必须写对应的实际地址“00H7FH”,这一点非常重要。 如:MOV A , 30H ;就是将30H中的数送给A。直接使用寄存器名R0R7,指令系统中用指令系统中用“Rn”表表示这示这8个寄存器,这种方式的寻址称之为个寄存器,这种方式的寻址称之为“寄存器寻寄存器寻址址”,就是操作数放在寄存器中。 如:指令 MOV A , Rn ;指令中的“Rn”就是指工作寄存器R0R7。该指
8、令就是把Rn中的操作数传送到A中。 指令系统中出现的“Rn”,在实际编程的过程中不能出现,必须写对应的寄存器“R0R7”。 如:MOV A , R3 ;就是将工作寄存器R3中的数传送到A中。R0和R1这两个寄存器还有一种用法,称之为称之为“寄寄存器间接寻址存器间接寻址”,用“Ri”表示,i=0、1。R0和R1存放的是操作数所在单元的地址。 如:MOV A, Ri ; 指令中的“Ri”就是指工作寄存器R0和R1。该指令就是把Ri中的数取出作为所取数据的单元地址。指令系统中出现“Ri”,在实际编程的过程中不能出现,必须写 “R0或R1”。 如:MOV A , R0 ;就是将R0中的数取出,作为所取
9、数据的地址,将该地址单元的数取出送到A中。如图3-5所示, R0所指的操作数就是10101010B(AAH)。3-5所示, 指令MOV A , R0 操作示意。可以用(R0)=(40H)=AAH表示。 注: 在寄存器寻址中(Rn),这4组寄存器,由用户使用中通过PSW中的RS1和RS0的设定,来确定用户使用的组。 这32个单元可以使用“直接寻址” 方式,也可使用“寄存器寻址”方式来进行访问。 4组中的R0和R1除了“直接寻址”和“寄存器寻址”外,还可采用“寄存器间接寻址”方式来访问。(2) 位寻址区(20H2FH) 这16个RAM 单元具有双重功能。它们既可以像普通RAM 单元一样按字节存取,
10、即“直接寻址(direct)”也可以对每个RAM 单元中的任何一个二进制位单独存取,这就是位这就是位寻址寻址(bit),80C51单片机为这些区域专门设置了位处理器(一个1位的CPU),用于这些空间的访问,如图3-6所示。图3-6,位地址表。 在指令系统中对于这些空间的访问有以下方法: 可以采用“直接寻址”的方式去访问这16个单元; 如:MOV A , 20H (MOV A , direct) 也可以采用“位寻址(bit)”的方式去访问这128个二进制位。 如:MOV C , 00H (MOV C , bit) 该指令就是把00H中的一个二进制数送到C中。 指令中“bit”,指的就是位地址“0
11、0H7FH”。注: 字节地址:20H2FH,位地址:00H7FH。 为了区分位地址“00H7FH”和内部数据存储器的地址“00H7FH”,提到位寻址区中的位地址时,必须注明位地址。单元地址,称之为字节地址,也可简称地址。(3)数据缓冲区(用户区)(30H7FH) 数据缓冲区共有80个RAM 单元,用于存放用户数据或作堆栈区使用,也称用户RAM区。80C51对用户RAM区中每个RAM单元只能按字节存取的(不可位寻址)。 在指令系统中对于这些空间的访问只有一种方法,即直接寻址(即直接寻址(direct)。)。如:MOV A , 40H (MOV A , direct)内部数据存储器小结: 内部数据
12、存储器中所有的单元(128B)都可以用直接寻址的方法来进行访问(direct)。 工作寄存器区也可以用寄存器寻址(Rn)的方法来访问,指令系统中一般都用寄存器寻址(Rn)的方法来访问该空间。除了寄存器寻址的方式,R0和R1也可采用寄存器间接寻址Ri的方式,在使用中R0和R1必须先满足间接寻址方式,有多余的可用于寄存器寻址方式。 位寻址区,对这16个单元可以使用直接寻址方式,这16个单元中的128个位(都有位地址),还可以用位寻址的方式来访问。 用户区只能用直接寻址的方式来访问。 指令系统中所有的数据处理、运算都是在内部数据存储器中完成,所以指令系统也是非常丰富的(大部分指令都是针对该空间)。2
13、. 外部数据存储器 当内部数据存储器不够用时,在单片机的外总线上可以最大扩展64K的RAM,可独立寻址,有专用指令系统(MOVX传送指令),不能用于数据的运算及处理,所以仅有4条指令,两条读,两条写,用于一般数据的存放,地址为0000HFFFFH。寻址方式采用寄存器间接寻址的方式,如MOVX A , DPTR.,指令中DPTR,开辟在特殊功能寄存器(SFR)中,是一个16位的数据存储器(数据指针),用于访问外部数据存储器和程序存储器,一般用于存放的是外部数据存储器和程序存储器的地址(外部数据存储器的地址也是16位)。存储器结构见图3-7所示。图3-7 外部数据存储器结构3.3.3 特殊功能寄存
14、器(SFR) 80C51系列单片机内的锁存器、定时器、串行口、数据缓冲器及各种控制寄存器、状态寄存器都以特殊功能寄存器(SFR)的形式出现,它们离散地分布在高128位片内RAM 80HFFH中。51子系列共有18个特殊功能寄存器,占用21个单元,其余107个单元用户不好使用(AT89C51)。表3-2 SFR地址映像表 这18个特殊功能寄存器,其中有15个特殊功能寄存器占用1个单元,另外3个特殊功能寄存器占用2个单元,这就是为什么18个特殊功能寄存器占用21个单元的原因。这18个特功能寄存器我们先学5个,其余的放在以后学习。 1累加器ACC(E0H) 累加器ACC 是80C51型单片机中最常用
15、的寄存器。许多指令的操作数取自ACC,许多运算的结果存放在ACC 中。乘除法指令必须通过ACC 进行。累加器ACC 的指令助记符为。 简单的讲就是一个8位的存储器,使用非常频繁,很多指令中必须用到ACC。 在指令系统中,可直接使用寄存器名ACC(A)和字节地址E0H对这八个二进制位进行操作,前者称之为寄存器寻址,后者称之为直接寻址(direct),用户一般使用寄存器寻址,即寄存器寻址,在特殊条件下才会使用直接寻址。累加器ACC也是一个可以对8个二进制位进行位寻址的寄存器,8个二进制位都有唯一的位地址,指令中只能使用位地址(bit),也称之为位寻址,若使用位编号,编译软件会将位编号转换成位地址,
16、再进行编译,最后形成目标文件。 2寄存器(F0H) 80C51单片机乘除法指令中要用到寄存器,用于存放操作数和操作结果。也可作为通用存储器器使用。 在乘除指令中,直接使用寄存器名B,称之为寄存器寻寄存器寻址址。用作通用存储器时只能使用地址F0H称之为直接寻址直接寻址,若用寄存器名B,编译软件会将其转换成地址F0H来使用。寄存器B是可以进行位寻址的单元,8个二进制位都有唯一的位地址,在对二进制位寻址时,指令中只能使用位地址(bit),称之为位寻址,若使用位编号,编译软件会将位编号转换成位地址,再进行编译,最后形成目标文件,见图3-9所示。3程序状态字寄存器程序状态字寄存器PSW(D0H) 程序状
17、态字寄存器程序状态字寄存器PSW也称为标志寄存器,存放各有也称为标志寄存器,存放各有关标志和对工作寄存器的选择设置。其结构和定义如图关标志和对工作寄存器的选择设置。其结构和定义如图3-10所示。在指令系统中该单元只能使用字节地址所示。在指令系统中该单元只能使用字节地址D0H来访问,来访问,称之为称之为直接寻址直接寻址(direct),若用寄存器名),若用寄存器名PSW,编译软件,编译软件会将其转换成地址会将其转换成地址D0H来使用。程序状态字寄存器来使用。程序状态字寄存器PSW是可是可以进行位寻址的单元,以进行位寻址的单元,8个二进制位都有唯一的位地址,在个二进制位都有唯一的位地址,在对二进制
18、位寻址时,指令中只能使用位地址(对二进制位寻址时,指令中只能使用位地址(bit),称之为),称之为位寻址位寻址,若使用位定义或位编号,编译软件会将位定义和位,若使用位定义或位编号,编译软件会将位定义和位编号转换成位地址,再进行编译,最后形成目标文件。编号转换成位地址,再进行编译,最后形成目标文件。 该单元各位的定义如下:该单元各位的定义如下:CY:进(借)位标志位,有进(借)位(:进(借)位标志位,有进(借)位(CY)1,否则,否则 (CY)0,主要用于加减运算中。,主要用于加减运算中。AC:辅助进(借)位标志位,低四位向高四位的进(借):辅助进(借)位标志位,低四位向高四位的进(借) 位,有
19、进(借)(位,有进(借)(AC)=1,否则(,否则(AC)=0,主要用,主要用 于加减运算中。于加减运算中。RS1、RS0:工作寄存器组的选择位,见表:工作寄存器组的选择位,见表3-3所示。所示。字字节地址地址寄存器名寄存器名RS1RS1RS0RS00 0组00H00H07H07HR0R0R7R70 00 01 1组08H08H0FH0FHR0R0R7R70 01 12 2组10H10H17H17HR0R0R7R71 10 03 3组18H18H1FH1FHR0R0R7R71 11 1OV:溢出标志位,:溢出标志位,80C51单片机单片机CPU的位数是的位数是8位,则表示位,则表示 带符号数的
20、位数只能是带符号数的位数只能是8位,最高位是符号位,数据位位,最高位是符号位,数据位 只有只有7位,数的范围在位,数的范围在-128+127之间,若运算的结果之间,若运算的结果 超出这个范围,溢出(结果出错)。计算机中判断结超出这个范围,溢出(结果出错)。计算机中判断结 果溢出的算法是果溢出的算法是 公式:公式:OV =Cy6Cy7 ; 式中,式中,Cy6表示表示D6位向位向D7位的进位或借位,位的进位或借位, Cy7表示表示D6位向位向CY的进位或借位。的进位或借位。F0:用户位,用户可以作为一般的一位二进制数的存储器使:用户位,用户可以作为一般的一位二进制数的存储器使 用。用。P:奇偶标志
21、位,累加器:奇偶标志位,累加器A中中1的个数为奇数时(的个数为奇数时(P)=1,否,否 则(则(P)=0,只要,只要A中的数值发生变化,就影响中的数值发生变化,就影响P(实时(实时 反映累加器反映累加器A中中1的个数的奇偶性)。的个数的奇偶性)。注:注: CY、AC、OV、P这这4个标志位由指令运行后,对其个标志位由指令运行后,对其 产生影响(由硬件产生各标志),主要用于算术运算产生影响(由硬件产生各标志),主要用于算术运算 类指令,除了类指令,除了CY一般这一般这3位不会用于数据的存储,位不会用于数据的存储, CY也是位处理器(也是位处理器(1位的位的CPU)中的累加器,在位操)中的累加器,
22、在位操 作中使用较为频繁。作中使用较为频繁。 P 在任何一条指令中,只要有累加器在任何一条指令中,只要有累加器A出现并且出现并且A中的中的 值发生变化,就会影响值发生变化,就会影响P。 RS1、RS0是工作寄存器组的选择位,由用户根据需是工作寄存器组的选择位,由用户根据需 要通过指令来设定,去选择寄存器组(软件设定)。要通过指令来设定,去选择寄存器组(软件设定)。例例1:X=13,Y=6,求X+Y的补码运算。解:解:X补码=F3H,Y补码=FAH, X+Y补码,则: X补码 : 1 1 1 1 0 0 1 1 B Y补码 : + 1 1 1 1 1 0 1 0 B X补码+Y补码 : 1 1
23、1 1 0 1 1 0 1 B 在单片机中,上述运算后,(CY)=1,(AC)=0, (OV)= Cy6Cy7=11=0(结果正确),(P)=0。 4数据指针数据指针DPTR(83H、82H) 数据指针数据指针DPTR是一个是一个16位的特殊功能寄存器,不可位位的特殊功能寄存器,不可位寻址,由两个位寄存器寻址,由两个位寄存器DPH(83H) 和和DPL(82H) 组组成,成,DPH 是是DPTR的高位,的高位,DPL是是DPTR的低位,的低位,DPTR既可合并作为一个既可合并作为一个16位寄存器,又可分开按位寄存位寄存器,又可分开按位寄存器单独操作,见图器单独操作,见图3-11所示。所示。 在
24、指令中一般都是以一个在指令中一般都是以一个16位的寄存器位的寄存器DPTR使用使用,用于用于存放外部数据存储器的地址和程序程序器的地址,访问外部存放外部数据存储器的地址和程序程序器的地址,访问外部数据存储器是用数据存储器是用DPTR,称之为,称之为寄存器间接寻址寄存器间接寻址;访问程;访问程序存储器是用序存储器是用A+DPTR,称之,称之为变址寻址为变址寻址。作为两个独立。作为两个独立的的8位寄存器(位寄存器(DPH、DPL)使用时,只能使用其地址,在)使用时,只能使用其地址,在指令系统中会详解。指令系统中会详解。5堆栈指针堆栈指针SP(81H) 堆栈是堆栈是CPU 用于暂时存放部分数据的用于
25、暂时存放部分数据的“仓库仓库”,它的作用是它的作用是用来保护现场和保护断点。在用来保护现场和保护断点。在80C51中,由内部数据存储器中,由内部数据存储器中若干存储单元组成,可由用户自定义单元地址,一般开辟中若干存储单元组成,可由用户自定义单元地址,一般开辟在内部数据存储器在内部数据存储器30H7FH这个空间。存储单元的个数称这个空间。存储单元的个数称为堆栈的深度,可理解为仓库容量。为了实现上述数据保护为堆栈的深度,可理解为仓库容量。为了实现上述数据保护的需要,数据的存取,要遵循先进后出,后进先出的原则。的需要,数据的存取,要遵循先进后出,后进先出的原则。80C51单片机中用堆栈指针单片机中用
26、堆栈指针SP(81H)来实现数据的先进后)来实现数据的先进后出,后进先出,即不可位寻址。它开辟在特殊功能寄存器出,后进先出,即不可位寻址。它开辟在特殊功能寄存器81H中,没有位地址,即不可位寻址,如图中,没有位地址,即不可位寻址,如图3-12所示所示 堆栈指针堆栈指针SP是用来存放堆栈数据区的地址,如图是用来存放堆栈数据区的地址,如图3-13所所示。一般为了书写方便,堆栈的示意图,如图示。一般为了书写方便,堆栈的示意图,如图3-14所示。所示。 堆栈数据的存取又称之为进栈和出栈。进栈时,首先堆堆栈数据的存取又称之为进栈和出栈。进栈时,首先堆栈指针加栈指针加1,即,即(SP) (SP)+1,然后
27、数据进栈;出栈时,先,然后数据进栈;出栈时,先取堆栈的数据,然后堆栈指针减取堆栈的数据,然后堆栈指针减1,即,即(SP) (SP)-1。 数据的进栈和出栈,又有两种操作形式,一是硬件操作,数据的进栈和出栈,又有两种操作形式,一是硬件操作,计算机执行某个操作时,硬件自动进栈(中断、调用)和出计算机执行某个操作时,硬件自动进栈(中断、调用)和出栈(返回指令),用于保护断点。二是软件操作,由指令栈(返回指令),用于保护断点。二是软件操作,由指令PUSH direct(进栈)和指令(进栈)和指令POP direct(出栈)来实现。(出栈)来实现。不管是硬件操作还是软件操作,进栈时,首先堆栈指针加不管是
28、硬件操作还是软件操作,进栈时,首先堆栈指针加1,然后数据进栈;出栈时,先取堆栈的数据,然后堆栈指针,然后数据进栈;出栈时,先取堆栈的数据,然后堆栈指针减减1。下面以软件操作加以说明。下面以软件操作加以说明。例例2:已知:已知(SP)=2FH,(40H)=22H,(41H)=33H执行下列程序。执行下列程序。 PUSH 40H PUSH 41H POP 40H POP 41H解:根据初始条件,得示意图,存储器中没有提到单元的数据解:根据初始条件,得示意图,存储器中没有提到单元的数据为任意值。为任意值。 执行第一条指令执行第一条指令 PUSH 40H,首先,首先(SP) (SP)+1=2FH+1=
29、30H,然后将,然后将40H中的数据中的数据22H,送入堆栈指针,送入堆栈指针SP指向的单元指向的单元30H中,如图中,如图3-16(a)所示。第一个进栈的数)所示。第一个进栈的数据不是堆栈指针指向的初始单元,在计算机中数据的传送,据不是堆栈指针指向的初始单元,在计算机中数据的传送,不是完全给予的意思,而是复制,不是完全给予的意思,而是复制,40H单元数据进栈后,影单元数据进栈后,影响了堆栈指针指向的单元,但不影响响了堆栈指针指向的单元,但不影响40H这个单元的原始数这个单元的原始数据,所以据,所以40H的数据仍为的数据仍为22H。 执行第二条指令执行第二条指令 PUSH 41H,进栈过程同第
30、一条指令。,进栈过程同第一条指令。进栈后,示意图如图进栈后,示意图如图3-16(b)所示。)所示。 执行第三条指令执行第三条指令 POP 40H,首先是取堆栈指针指向单,首先是取堆栈指针指向单元的数据给元的数据给40H,则,则40H的数据为的数据为33H,然后将,然后将(SP) (SP)-1=31H-1=30H,执行完后,示意图如图,执行完后,示意图如图3-16(c)所示。)所示。 执行第四条指令执行第四条指令 POP 41H,出栈过程同第四条指令,出栈过程同第四条指令,示意图如图示意图如图3-16(d)所示。当数据取出后,堆栈指针又回)所示。当数据取出后,堆栈指针又回到初始状态,如图到初始状
31、态,如图3-15所示。但原来进栈的数还存于堆栈中,所示。但原来进栈的数还存于堆栈中,直到下次进栈的数据将其覆盖。直到下次进栈的数据将其覆盖。 该程序,是将该程序,是将40H和和41H的数据交换,进栈两次,出栈的数据交换,进栈两次,出栈两次,所以堆栈指针两次,所以堆栈指针SP的值,仍为初始值的值,仍为初始值2FH,堆栈指针的,堆栈指针的初始值指向的单元,是不能用于存放堆栈数据的,第一个入初始值指向的单元,是不能用于存放堆栈数据的,第一个入栈的数据,是该单元的地址加栈的数据,是该单元的地址加1单元。单元。 系统复位时堆栈指示器的值为系统复位时堆栈指示器的值为07H,即指向的是工作寄,即指向的是工作
32、寄存器区存器区0组的组的R7单元,如图单元,如图3-17所示,第一个入栈的数放于所示,第一个入栈的数放于08H单元,但堆栈一般开辟在用户区(单元,但堆栈一般开辟在用户区(30H7FH)中。堆栈)中。堆栈的深度是由数据连续进栈的次数来决定的。若根据某个程序的深度是由数据连续进栈的次数来决定的。若根据某个程序设计的需要,需要设计的需要,需要16个单元堆栈来存储数据,堆栈开辟在个单元堆栈来存储数据,堆栈开辟在40H到到4FH单元,则堆栈指示器单元,则堆栈指示器SP的初始值应付的初始值应付3FH,第一,第一个入栈的数放入个入栈的数放入40H中,在程序的设计中,中,在程序的设计中,40H41H中不能中不
33、能用于其它的数据的存放,否则数据被覆盖。若实际进栈的数用于其它的数据的存放,否则数据被覆盖。若实际进栈的数据超出了据超出了16个单元,则堆栈溢出,溢出的单元在个单元,则堆栈溢出,溢出的单元在50H以上,以上,这些单元没有数据,则没有影响,否则影响原有数据。堆栈这些单元没有数据,则没有影响,否则影响原有数据。堆栈指针始终指向的是堆栈的栈顶位置。指针始终指向的是堆栈的栈顶位置。注:注: 51子系列中,共有子系列中,共有18个个SFR(特殊功能寄存器),(特殊功能寄存器), 占用占用21个单元,我们先学个单元,我们先学5个个SFR(共(共6个单元),个单元), 其余其余SFR在后面的学习中,会逐步的
34、给大家介绍。在后面的学习中,会逐步的给大家介绍。 这这18个个SFR,21个单元中,字节地址能被个单元中,字节地址能被8整除的单整除的单 元是可以进行位寻址的,也就是说字节地址的后面元是可以进行位寻址的,也就是说字节地址的后面 一位是一位是0或者或者8,都是可以进行位寻址的(,都是可以进行位寻址的(bit)。)。 可位寻址的单元,可以用位地址、位编号或位定可位寻址的单元,可以用位地址、位编号或位定 义,在寻址中都称之为位寻址(义,在寻址中都称之为位寻址(bit)。)。 系统复位后,各寄存器的值如表系统复位后,各寄存器的值如表3-4所示。所示。3.3.4 程序存储器程序存储器 程序存储器的作用是
35、用来存放程序和数表(固定不变的程序存储器的作用是用来存放程序和数表(固定不变的常数)。常数)。AT89S51单片机内部有单片机内部有4K的程序存储器的程序存储器FlashROM,外部最多可扩展,外部最多可扩展64K的程序存储器,内外程序的程序存储器,内外程序存储器采用统一编址的方法,即共用存储器采用统一编址的方法,即共用64K的地址,地址范围的地址,地址范围0000HFFFFH,不管是内部还是外部都是用指令,不管是内部还是外部都是用指令MOVC来来访问。如图访问。如图3-18所示。所示。1.程序存储器的结构程序存储器的结构 8051(80C51)系列有系列有64K ROM 的寻址区,地址范围的
36、寻址区,地址范围0000HFFFFH,用于存放程序。用于存放程序。 其中低其中低4K(0000H0FFFH) 的地址区可以为片内的地址区可以为片内ROM 和和片外片外ROM共用,但不能同时使用共用,但不能同时使用(由外引脚由外引脚 决定决定)。 高高60K(1000HFFFFH) 的地址区为片外的地址区为片外ROM所专用。所专用。注:注: 低低4K共用地址,这样出现一个地址两个单元,地址不能共用地址,这样出现一个地址两个单元,地址不能 唯一,这在计算机中是不允许的;唯一,这在计算机中是不允许的; 解决方法,通过单片机的外引脚解决方法,通过单片机的外引脚 来实现:来实现: a、当、当 EA=0时
37、,时,CPU直接访问直接访问ROM(0000HFFFFH), 内部不用;内部不用; b、 当当 EA=1时,时,CPU先访问内部先访问内部ROM(0000H0FFFH) 结束后,再去访问外部结束后,再去访问外部ROM (1000HFFFFH),外部低),外部低4K不用,也不用,也 就是说外部低就是说外部低4K无需扩展,这种情况下,无需扩展,这种情况下, 外部最多可扩展外部最多可扩展60K。2. CPU对程序存储器中程序的访问对程序存储器中程序的访问 CPU对存储器的访问也就是执行程序,程序存储器的主对存储器的访问也就是执行程序,程序存储器的主要作用是用来存放程序,那要作用是用来存放程序,那CP
38、U怎么去执行程序呢?怎么知怎么去执行程序呢?怎么知道哪一条指令先执行?哪一条指令后执行呢?其实计算机根道哪一条指令先执行?哪一条指令后执行呢?其实计算机根本不认程序,只认程序存储器的单元地址,先从低字节地址本不认程序,只认程序存储器的单元地址,先从低字节地址单元开始取指令执行,然后取高字节地址单元指令执行,而单元开始取指令执行,然后取高字节地址单元指令执行,而CPU这些操作,都是通过程序计数器这些操作,都是通过程序计数器PC(程序指针)来实(程序指针)来实现,现,PC是一个是一个16位的寄存器,不可寻址(无地址),用户位的寄存器,不可寻址(无地址),用户不可操作,系统复位后(不可操作,系统复位
39、后(PC)0000H,每取一个单元程,每取一个单元程序执行后,序执行后,PC会由硬件自动加会由硬件自动加1,去取下一个单元来执行,去取下一个单元来执行,以此类推,直到遇到转移指令为止,转移时以此类推,直到遇到转移指令为止,转移时CPU会将转移位会将转移位置的地址直接付给置的地址直接付给PC,从这个新的地址开始,又重复上述,从这个新的地址开始,又重复上述过程。过程。 由于由于CPU只认存储器的地址不认程序,哪怎样保证程序只认存储器的地址不认程序,哪怎样保证程序的正确执行呢?只能由用户,根据的正确执行呢?只能由用户,根据CPU访问程序存储器的特访问程序存储器的特点,将目标程序(二进制语言程序)按上
40、述特点来存放,也点,将目标程序(二进制语言程序)按上述特点来存放,也就是将先要执行的指令,放在低字节单元,后执行的指令放就是将先要执行的指令,放在低字节单元,后执行的指令放在高字节单元。又由于在高字节单元。又由于PC复位后指向复位后指向0000H单元,故主程单元,故主程序的第一条指令必须放在序的第一条指令必须放在0000H开始的单元,开始的单元,0000H也就是也就是主程序的入口地址。主程序的入口地址。 目标程序的存放是通过编译软件中的伪指令来实现的,目标程序的存放是通过编译软件中的伪指令来实现的,编译软件的作用是检查语法错误和生成目标程序(二进制语编译软件的作用是检查语法错误和生成目标程序(
41、二进制语言程序),伪指令用于编译的过程(汇编)中,其中伪指令言程序),伪指令用于编译的过程(汇编)中,其中伪指令ORG就是给出程序存放在程序存储器中的起始地址。就是给出程序存放在程序存储器中的起始地址。3CPU对程序存储器中数表的访问对程序存储器中数表的访问 数表即在数据处理过程中用到的一些固定不变的常数,数表即在数据处理过程中用到的一些固定不变的常数,如如 值值3.14等,要由指令来读出。等,要由指令来读出。80C51单片机中,仅有两条单片机中,仅有两条指令,即指令,即MOVC A , A+PC和和MOVC A , A+DPTR,这,这两条指令比较麻烦,我们在后面给大家介绍。两条指令比较麻烦
42、,我们在后面给大家介绍。注:注: 不管是程序还是数表,在程序存储器中都是二进制不管是程序还是数表,在程序存储器中都是二进制 数,程序只能由数,程序只能由CPU直接访问并执行,数表只能由直接访问并执行,数表只能由 上述的两条指令来读取,在编程时要注意避免将数表上述的两条指令来读取,在编程时要注意避免将数表 当程序来执行。当程序来执行。 由于由于ROM只能读不能写(软件),那程序和数表的只能读不能写(软件),那程序和数表的 存入,需要专用的设备,即编程器,编程器就是将编存入,需要专用的设备,即编程器,编程器就是将编 译软件编译成的目标程序和数表存放到指定的程序译软件编译成的目标程序和数表存放到指定的程序 存储器的位置中。存储器的位置中。结束结束