1
存储器、堆栈,SFR
2
?数据存储器 —— RAM( Random Access Memory)
?程序存储器 —— ROM( Read Only Memory)
?闪速存储器 —— Flash Memory
?EPROM—— ( UV) Erazible Programmable ROM
?EEPROM/E2PROM—— Electrical Erasable
Programmable ROM
?静态存储器 SRAM—— Static RAM
(动态存储器 DRAM—— Dynamic RAM)
?按字节寻址:每个字节 (8个位 )占一个地址
?按位寻址:有的存储器每一个位就有一个地址
单片机的存储器 —— 几个有关的概念:
3
8051的存储器组织
8051存储器可以分成两大类:
﹡ RAM,CPU在运行时能随时进行数据的写入和
读出,但在关闭电源时,其所存储的信息将丢失。
它用来存放暂时性的输入输出数据、运算的中间
结果或用作堆栈。
﹡ ROM是一种写入信息后不易改写的存储器。断
电后,ROM中的信息保留不变。用来存放固定的
程序或数据,如系统监控程序、常数表格等。
4
2.1.1普林斯顿结构
一般微机通常只有 一个逻辑空间, 可以随
意安排 ROM或 RAM。访问存储器时,同一地址对
应唯一的存储单元,可以是 ROM也可以是 RAM,
并用同类访问指令。 这种结构称为普林斯顿结
构。
5
2.1.2 哈佛结构
◆ 8051单片机与一般微机的存储器配置方
式很不相同。
◆ 51单片机的存储器在物理结构上分为程
序存储空间和数据存储空间,共有四个:
片内和片外程序存储空间以及片内和片外
数据存储空间,这种在物理结构上 把程序
存储器和数据存储器分开 的结构形式称为
哈佛结构。
6
7
89C51单片机存储器配置
? 片内 RAM 128字节( 00H— 7FH);
片内 RAM前 32个单元是工作寄存器区 (00H— 1FH)
片内 RAM有 128个可按位寻址的位,占 16个单元。
位地址编号为,00H— 7FH,分布在 20H— 2FH单元
? 片内 21个特殊功能寄存器 (SFR)中:地址号能被
8整除的 SFR中的各位 也可 按位寻址 ( P.33-34)
? 可寻址片外 RAM 64K字节 ( 0000H— FFFFH)
? 可寻址片外 ROM 64K字节 ( 0000H— FFFFH)
? 片内 Flash ROM 4K字节 ( 000H— FFFH)
8
★ 8051在逻辑上,即从用户角度上 8051有三
个存储空间:
片内外统一编址的 程序存储器
片内外不统一编址的 数据存储器
特殊功能寄存器(片内)
★ 访问这几个不同的逻辑空间时,采用的指令:
片内外程序存储器空间 ----MOVC
片内数据存储器空间和 SFR----MOV
片外数据存储器地址空间 ----MOVX
9
?52对应的 RAM有 384Byte,其中多出的 128Byte
只能进行间接寻址用 @
?而 C51是通过对自定义的数据类型来区分访问的
存储空间的:
片内外程序存储器空间 ----code
片内数据存储器空间和 SFR----data
片外数据存储器地址空间 ----xdata
片内间接寻址区间 -------idata
10
存储器配置 ( 片内 RAM)
? 片内 RAM 128字节 ( 00H— 7FH)
00H
20H
2FH
7FH
1FH
30H
80H
FFH
52子系列才有
的 RAM区
普通 RAM区
位寻址区
工作寄存器区
SFR分布在
80H-FFH
其中 92个位
可位寻址80H
FFH
所有的 RAM区 (包括位
寻址区、工作寄存器
区)都可以用于存放
数据,故也称为 数据
缓存寄存器
89C51
128字节
11
00H
20H
2FH
7FH
1FH
30H
80H
FFH
52子系列才有
的 RAM区
普通 RAM区
位寻址区
工作寄存器区 R0
R2
R1
R3
R4
R5
R6
R707H
02H
01H
00H
06H
04H
05H
03H
08H
1FH 工作寄存器区 3
工作寄存器区 2
工作寄存器区 1






0
0FH10H
17H
18H
? 片内 RAM前 32个单元是 工作寄存器区
(00H— 1FH)
存储器配置 ( 片内 RAM)
12
00H
20H
2FH
7FH
1FH
30H
80H
FFH
52子系列才有
的 RAM区
普通 RAM区
位寻址区
工作寄存器区
27H
22H
21H
20H
26H
24H
25H
23H
28H
2FH
单元地址
07 06 05 04 03 02 01 00
0F 0E 0D 0C 0B 0A 09 08
17 16 15 14 13 12 11 10
1F 1E 1D 1C 1B 1A 19 18
27 26 25 24 23 22 21 20
2F 2E 2D 2C 2B 2A 29 28
37 36 35 34 33 32 31 30
3F 3E 3D 3C 3B 3A 39 38
47 46 45 44 43 42 41 40
7F 7E 7D 7C 7B 7A 79 78
位地址
总共
128
个可
按位
寻址
的位
? 片内 RAM中有 128个可按位寻址的位。
位地址,00H— 7FH
分布在,20H— 2FH单元
存储器配置 ( 片内 RAM)
13
? 这些可位寻址的空间,可通过执行指令直接对某
一位进行操作,如置 1、清 0或判 1、判 0等,可
用作软件标志位或用于位(布尔)处理。 这是一
般微机所不具备的,这种位寻址能力是 8051所
独有的。
? 20H~2FH:既可以字节操作,又可以位操作,
但是要用不同的指令来区分;
? mov 20h,a
? setb 00h
? setb 20.0
14
存储器配置 ( 片内 RAM)
? 89C51片内 RAM 128字节 ( 00H— 7FH)
? 89C52片内 RAM 256字节 ( 00H— 0FFH)
00H
20H
2FH
7FH
1FH
30H
80H
FFH
52子系列才有
的 RAM区
普通 RAM区
位寻址区
工作寄存器区
SFR分布在
80H-FFH
其中 92个位
可位寻址80H
FFH
89C51
128字节
89C52
256字节
只能直接寻址
只能寄存器间接寻址 (P14)
既可间接寻址,又可直接寻址
15
程序存储器
外部
ROM
内部
ROM
(EA=1)
外部
ROM
(EA=0)0000H 0000H
0FFFH 0FFFH
1000H
FFFFH
16
在程序存储器中,有 6个单元具有特殊功能
0003H,外部中断 0入口 。
000BH,定时器 0溢出中断入口 。
0013H,外部中断 1入口 。
001BH,定时器 1溢出中断入口 。
0023H,串行口中断 入口。
?52还有 002BH对应 T2中断。
使用时,通常在这些入口地址处存放一条绝对跳转
指令,使程序跳转到用户安排的中断程序起始地址,或
者从 0000H起始地址跳转到用户设计的初始程序上。
0000H,8051复位后,PC= 0000H,即程序从 0000H
开始执行指令。
17
org 0000h
jmp main
(跳过中断入口地址区)
org 0100h
main,mov p1,#55h
mov r0,#3fh
Loop,djnz r0,loop
cpl a
mov p1,a
jmp main
end
18
? 可寻址片外 RAM 64K字节 ( 0000H— FFFFH);
? 可寻址片外 ROM 64K字节 ( 0000H— FFFFH);
? 片内 Flash ROM 4K字节 ( 0000H— FFFH);
FFFFH
0000H
可寻址
片外
RAM
64K
字节
FFFFH
0000H
可寻址
片外
ROM
64K
字节FFFH
000H
可寻址
片内
Flash
ROM
4K
字节
89C51
7FH
00H
片内 RAM
128字节
FFH
80H
存储器配置 ( 片内 RAM)
19
堆栈,
在 片内 RAM中,常常要指定一个专门的区域来
存放某些 特别的 数据,它遵循 先进后出 和 后进
先出 (LIFO/FILO)的原则,这个 RAM区 叫 堆栈 。
功用,
1)子程序调用 和 中断服务 时 CPU自动将当前 PC
值 压栈保存,返回时自动将 PC值弹栈。
2)保护现场 /恢复现场
3)数据传输
20
00H
20H
2FH
7FH
1FH
30H
80H
FFH
52子系列才有
的 RAM区
普通 RAM区
位寻址区
工作寄存器区
SP
栈顶 下一个进栈的数据将存在此
数据
进栈
已经进栈的数
据存放在此
初始
SP
复位后 SP=07H,数据进栈时,首先
SP+1指向 08H单元,第一个放进堆栈
的数据将放进 08H单元,然后 SP再自
动增 1,仍指着栈顶 ……
堆栈区由特殊功能寄存器 堆栈指针 SP管理
堆栈区可以安排在 RAM区任意位置,一般不安排在
工作寄存器区和可按位寻址的 RAM区,通常 放在 RAM
区的 靠后 的位置。
21
从堆栈取出数据时, 取出的数据是
最近放进去的一个数据,也就是当
前栈顶的数据。然后 SP再自动减 1,
仍指着栈顶 ……
00H
20H
2FH
7FH
1FH
30H
80H
FFH
52子系列才有
的 RAM区
普通 RAM区
位寻址区
工作寄存器区
SP
栈顶 当前要出栈的数据
数据
出栈
SP-1指向下一个
将要出栈的数据
初始
SP
堆栈区由特殊功能寄存器 堆栈指针 SP管理
堆栈区可以安排在 RAM区任意位置,一般不安排在
工作寄存器区和可按位寻址的 RAM区,通常 放在 RAM
区的 靠后 的位置。
22
从堆栈取出数据时, 取出的数据是
最近放进去的一个数据,也就是当
前栈顶的数据。然后 SP再自动减 1,
仍指着栈顶 ……
00H
20H
2FH
7FH
1FH
30H
80H
FFH
52子系列才有
的 RAM区
普通 RAM区
位寻址区
工作寄存器区
SP-1 指向新的栈
顶,也就是下一个
将要出栈的数据
数据
出栈
初始
SP
堆栈区由特殊功能寄存器 堆栈指针 SP管理
堆栈区可以安排在 RAM区任意位置,一般不安排在
工作寄存器区和可按位寻址的 RAM区,通常 放在 RAM
区的 靠后 的位置。
23
在实际应用中,常需在 RAM区设置堆栈。
80C51的 堆栈一般设在 30H~7FH的范围内。
栈顶的位置由 SP寄存器指示。 复位时 SP的初
值为 07H,在系统初始化时可以重新设置。
24
? push a
? push b
? push PSW
? ……….
?
? pop a
? pop b
? pop PSW
? 这样的指令顺序对不对?
25
89C51特殊功能寄存器 (SFR)
▼ 特殊功能寄存器 SFR(专用寄存器)
专用于 控制、选择、管理、存放 单片机内部各部分
的工作 方式、条件、状态、结果 的寄存器 。
▼ 不同的 SFR管理不同的硬件模块,负责不同的功
能 —— 各司其职
换言之:要让单片机实现预定的功能,必须有相应
的硬件和软件,而软件中最重要的一项工作就是对
SFR写命令(要求) 。
26
标识符号 地址 寄存器名称
ACC 0E0H 累加器
B 0F0H B寄存器
PSW 0D0H 程序状态字
SP 81H 堆栈指针
DPTR 82H,83H 数据指针 (16位 )含 DPL和 DPH
IE 0A8H 中断允许控制寄存器
IP 0B8H 中断优先控制寄存器
P0 80H I/O口 0寄存器
P1 90H I/O口 1寄存器
P2 0A0H I/O口 2寄存器
27
标识符号 地址 寄存器名称
P3 0B0H I/O口 3寄存器
PCON 87H 电源控制及波特率选择寄存器
SCON 98H 串行口控制寄存器
SBUF 99H 串行数据缓冲寄存器
TCON 88H 定时控制寄存器
TMOD 89H 定时器方式选择寄存器
TL0 8AH 定时器 0低 8位
TH0 8CH 定时器 0高 8位
TL1 8BH 定时器 1低 8位
TH1 8DH 定时器 1高 8位
28
P0,P1,P2,P3:
四个并行输入 /输出口的寄存器。它里面的内容对应着管
脚的输出。
SCON (Serial Control Register)
SBUF (Serial Date Buffer)
PCON (Power Control Register)
与端口相关的( 7个)
与定时 /计数器相关的( 6个)
TMOD (Timer/Counter Mode Register)
定时器工作模式寄存器。
TCON (Timer/Counter Control Register)
定时器控制寄存器。
TH0,TL0, TH1,TL1,分别是 T0,T1的记数初值寄存器。
29
IP (Interrupt Priority Register)
IE (Interrupt Enable Register)
与中断相关的( 2个)
30
程序计数器 PC( Program Counter)
PC 不是 一个特殊功能寄存器 SFR,但其作 用又
十分重要和特殊 !!!
特点:
▼ 它是 16位 的按机器周期 自动增 1计数器
▼ 一切 分支 /跳转 /调用 /中断 /复位 等操作的 本质
就是,改变 PC 值
▼ 总指向下一条指令所在首地址 (当前 PC值 )
特殊功能寄存器 (PC)
31
DPTR (Data Pointer)( 分成 DPH,DPL两个 ):
数据指针可以用它来访问外部数据存储器中的任
一单元,也可以作为通用寄存器来用,由我们自已决
定如何使用。
32
? 数据指针寄存器 DPTR
? 数据指针 DPTR是一个 16 位的专用寄存器,
其高位字节寄存器用 DPH表示,低位字节寄存器
用 DPL表示。既可作为一个 16 位寄存器 DPTR
来处理,也可作为两个独立的 8 位寄存器 DPH和
DPL来处理。
? DPTR 主要用来存放 16 位地址,当对 64
KB外部数据存储器空间寻址时,作为间址寄存器
用。在访问程序存储器时,用作基址寄存器。
? mov a,@a+dptr
33
89C51有 21个 SFR(89C52有 26个 ) P.33~ 34
已知的 P0,P1,P2,P3等四个 8位 I/O口 分别由名
为 P0,P1,P2,P3四个 SFR代表。
堆栈指针寄存器 SP( Stack Pointer),总是指
向栈顶,压栈时先 (SP)+1 然后数据进栈;弹栈
时数据先出栈 然后 (SP)-1。
累加器 ACC:一个被众多指令用得最频繁的特殊
功能寄存器 (如:运算、数据传输 … )。
副累加器 B:一个经常与 ACC 配合在一起使用的
特殊功能寄存器 (如:乘法、除法 ),此外,它也
经常当作普通寄存器使用。
特殊功能寄存器 (P0— P3,SP,A,B)
34
程序状态字寄存器 PSW:
CY AC F0 RS0 OV PRS1
PSW.7 PSW.0
▼ CY(PSW.7)进位 /借位标志位 。若 ACC在运算过程
中发生了进位或借位,则 CY=1;否则 =0。它也
是 布尔处理器 的 位累加器,可用于布尔操作。
▼ AC(PSW.6)半进位 /借位标志位。 若 ACC在运算过
程中,D3位向 D4位发生了进位或借位,则 CY=1,
否则 =0。机器在执行, DA A”指令时 自动 要判
断这一位,我们可以暂时不关心它。
▼ F0 (PSW.5)可由用户定义的标志位。
PSW.6 PSW.5
特殊功能寄存器 (PSW)
35
程序状态字寄存器 PSW:
CY AC F0 RS0 OV PRS1
PSW.7 PSW.0PSW.6 PSW.5
特殊功能寄存器 (PSW)
例,78H+97H
0111 1000
+1001 0111
1 0000 1111
有进位
CY=1
没有半进位
AC=0
36
程序状态字寄存器 PSW(续),
CY AC F0 RS0 OV PRS1
PSW.7 PSW.0
▼ RS1(PSW.4),RS0(PSW.3)工作寄存器组选择位 。
RS1,RS0 = 0 1 则选择了工作寄存器组 1 区
R0~ R7分别 代表 08H ~ 0FH单元。
RS1,RS0 = 1 0 则选择了工作寄存器组 2 区
R0~ R7分别 代表 10H ~ 17H单元。
RS1,RS0 = 1 1 则选择了工作寄存器组 3 区
R0~ R7分别 代表 18H ~ 1FH单元。
PSW.4 PSW.3
RS1,RS0 = 0 0 则选择了工作寄存器组 0 区
R0~ R7分别 代表 08H ~ 0FH单元。
37
? 片内 RAM前 32个单元 (00H— 1FH)是工作寄存器
区 (由 PSW中的 RS1,RS0决定 )
00H
20H
2FH
7FH
1FH
30H
80H
FFH
52子系列才有
的 RAM区
普通 RAM区
位寻址区
工作寄存器区 R0
R2
R1
R3
R4
R5
R6
R707H
02H
01H
00H
06H
04H
05H
03H
08H
1FH 工作寄存器区 3
工作寄存器区 2
工作寄存器区 1






0
38
程序状态字寄存器 PSW(续),
CY AC F0 RS0 OV PRS1
PSW.7 PSW.0
▼ OV (PSW.2)溢出标志位。
OV=1时特指累加器在进行带符号数 (-128— +127)
运算时出错(超出范围); OV=0时未出错。
▼ PSW.1 未定义 。
▼ P (PSW.0)奇偶标志位。
P=1表示累加器中, 1”的个数 为奇数
P=0表示累加器中, 1”的个数 为偶数
CPU随时监视着 ACC中的, 1”的个数,并反映在 PSW

PSW.2 PSW.1
例:某运算结果是 78H( 01111000), P=0。
它常用在校验串行通信中的数据是否出错。
39
89C51单片机存储器配置
? 片内 RAM 128字节( 00H— 7FH);
片内 RAM前 32个单元是工作寄存器区 (00H— 1FH)
片内 RAM有 128个可按位寻址的位,占 16个单元。
位地址编号为,00H— 7FH
分布在,20H— 2FH单元
? 片内 21个特殊功能寄存器 (SFR)中:地址号能被
8整除的 SFR中的各位 也可 按位寻址
? 可寻址片外 RAM 64K字节 ( 0000H— FFFFH)
? 可寻址片外 ROM 64K字节 ( 0000H— FFFFH)
? 片内 Flash ROM 4K字节 ( 000H— FFFH)
小结
40
存储器配置 (片内 RAM)
? 片内 RAM 128字节 ( 00H— 7FH)
00H
20H
2FH
7FH
1FH
30H
80H
FFH
52子系列才有
的 RAM区
普通 RAM区
位寻址区
工作寄存器区
SFR分布在
80H-FFH
其中 92个位
可位寻址80H
FFH
所有的 RAM区 (包括位寻址
区、工作寄存器区)都可
以用于存放数据,故也称
为 数据缓存寄存器
128字节
小结
41
单片机存储器配置 (片外 RAM/ROM)
? 可寻址片外 RAM 64K字节 ( 0000H— FFFFH);
? 可寻址片外 ROM 64K字节 ( 0000H— FFFFH);
? 片内 Flash ROM 4K字节 ( 000H— FFFH);
FFFFH
0000H
可寻址
片外
RAM
64K
字节
FFFFH
0000H
可寻址
片外
ROM
64K
字节FFFH
000H
可寻址
片内
Flash
ROM
4K
字节
89C51
7FH
00H
片内 RAM
128字节
FFH
80H
小结