存储器/Memorey
单片机的存储器分为程序存储器ROM及数据存储器RAM,ROM为统一编址,RAM为独立编址。ROM和RAM又各自分为片内与片外
总线/Bus
地址总线
AB
P0、P2口,各8根共16根数据总线
DB
P0口共8根
- 控制总线
CB
ALE、EA、PSEN、WR、RD
ROM结构
统一编址
地址空间:64KB
片内4KB
片外可扩展64KB
片外的
0000H~0FFFH
与片内的4KB共用同一地址范围,通过EA引脚控制选择片内还是片外。EA为低电平时选择片外的0000H~0FFFH
;为高电平时选择片内。
各操作的入口地址
操作 | 入口地址 |
---|---|
复位 | 0000H |
外部中断0(INT0) | 0003H |
定时器/计数器0(T0)溢出 | 000BH |
外部中断1(INT1) | 0013H |
定时器/计数器1(T1)溢出 | 001BH |
串行口中断 | 0023H |
T2溢出或T2EX端负跳变(52子系列) | 002BH |
RAM结构
独立编址
两个地址空间
片内256B
00H~FFH
片外64KB
0000H~FFFFH
工作寄存器组
片内RAM地址
00H~1FH
每组工作寄存器组都有8个工作寄存器(R0-R7)组成;
每个工作寄存器对应一个固定的地址;
在单片机正常工作时,只有一组工作寄存器处于前台工作,其他的在后台等待;
工作寄存器组的选择由单片机中一个特殊功能寄存器来控制。
位寻址区
片内RAM地址
20H~2FH
可通过执行指令直接对某-位进行操作;
字节地址中的每一位都对应一个位地址,在使用时可以直接对位地址进行访问。
字节地址与位地址的关系见新版书 P62 表5.2
普通RAM区
片内RAM地址
30H~7FH
该区域内的字节地址都不可以进行位寻址;
作为堆栈区使用,要留出足够的空间,否则就会因为数据存储而破坏堆栈内容。
特殊功能寄存区
片内RAM地址
80H~FFH
SFR:管理和控制单片机的工作。可通过对SFR进行编程操作,即可管理与单片机有关的所有功能部件,并且可方便地完成各种操作和运算。
在SFR中,凡是能被8整除的都可被位寻址,如TCON(88H
)、SCON(98H
)、IE(A8H
)、IP(B8H
)。
特殊功能寄存器的地址表见新版书 P64 表5.3
PSW
Cy - 进位标志位:在算术运算时,最高位若有进位/借位Cy=1;否则,Cy=0;在位处理器中,它是位累加器
AC - 半进位标志位:在BCD码运算时,用作十进位调整即当D3位向D4位产生进位或借位时,Ac=1;否则,Ac=0
RS0、RS1 - 工作寄存器选择:选择片内RAM区中的4组工作寄存器区中的某一组为当前工作寄存区
OV - 溢出标志位:作加减法时:最高位或次高位之- -有进位或者借位,OV=1,否则为OV=0;作乘法时,积大于255 (B不为0)OV=1;作除法时,除数为0 (B为0),OV= 1
P - 奇偶标志位:指令执行完,累加器A中”1”的个数是奇数还是偶数;P=1,表示A中”1“的个数为奇数;P=0表示A中”1“的个数为偶数。
A、B
A | B |
---|---|
累加器 | 寄存器 |
使用最频繁 | 乘除指令需要,其他时候为普通寄存器 |
DPTR
DPTR0/DPTR1 - 数据指针寄存器
可作为一个16位寄存器来用,也可作为两个独立的8位寄存器DPH0 (或DPH1) 和DPL0 (或DPL1)来用;
DPS: 0 -> 选择DPTR0; 1 -> 选择DPTR1。
程序存储器扩展
当程序容量过大,单片机无法写入时,可选片外扩展存储器
当扩展了多片存储器时,需要进行存储器的选择,一般情况下有以下几种选择的方式
线选法 - 直接利用末用的某一高位地址线作为存储器芯片的”片选” 控制信号。
部分译码 - 存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线仅用一部分参加译码。
全译码 - 存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线全部参加译码。
关于外部扩展存储器的地址范围,这部分内容只可意会不可言传我不太会写,下面举一个全译码的例子来辅助理解。
程序存储器扩展地址范围计算
如图,P2.7-P2.5为片选信号,P2.4-P2.0为地址线,地址线接入了一个74LS138译码器,译码器的其中两个(Y0、Y1)输出分别接入两片存储器的CE口;
CE口为低电平有效,即当38译码器的Y0输出时选择第一片,Y1输出时选择第二片;
也就是说当P2.7-P2.5 = 000时,Y0输出,选择第一片;当P2.7-P2.5 = 001时,Y1输出,选择第二片。
地址线方面,每片的地址都是从0…0B到1…1B。
则每一片的地址范围如下:
P2.7 P2.6 P2.5 | 地址线 | |
---|---|---|
第一片 | 0 0 0 | 0…0 |
0 0 0 | 1…1 | |
第二片 | 0 0 1 | 0…0 |
0 0 1 | 1…1 |
即:
第一片为 0000 0000 0000 0000B~0001 1111 1111 1111B
第二片为 0010 0000 0000 0000B~0011 1111 1111 1111B
换算成16进制即为
第一片 | 第二片 |
---|---|
0000H ~ 1FFFH | 2000H ~ 3FFFH |
这里需要注意的是,只有高三位是片选信号,第四位开始就为地址信号了,因此每一片的地址范围高三位是不变的,变的只有后面的地址位。(即从全0到全1)
思考:采用2764 (8K*8)芯片扩展程序存储器,分配地址范围4000H~7FFFH;采用完全译码方式该如何设计呢? (答案见PPT 第20页)
如何识别扩展的存储器的大小
如上例所示,该存储器共有13根地址线(A0-A12),即为2^13=8KB,同时有D0-D7共8根数据线,因此一片的总容量为8*8=64KB
Byte与KB、MB等的换算:
设有2^nByte,每当n增长10,单位就增长一位,如n=10即为KB,n=20即为MB;在此基础上,2的n的个位次方(2^(n%10))就是换算后的数据
例如2^13B可看作2^(10+3)B -> 2^10B * 2^3 -> 1KB * 2^3 -> 8KB
扩展时三总线如何接
地址总线:低8位地址通过373锁存后接片外ROM低8位地址,剩余地址依次顺接P2口;P2口剩余高位地址译码后接片选端CE
控制总线:PSEN接OE端
数据总线:数据线接P0口
数据存储器扩展
RAM扩展地址范围计算方法与接法与ROM类似,只有控制总线变为OE端接单片机RD端,WE端接单片机WR端,在此不再过多赘述
存储器/Memorey