成就最好的自己
先普及一下基础知识:
先放一个上一节的知识点,计算机的存储方式:
计算机在运行过程中执行程序并产生数据,程序在运行过程中一般很少变动,而产生的数据是可变的,先说一下计算机对于程序和数据的两种存储方式:
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问。
冯·诺依曼结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构。它的主要特点是将程序和数据存储在同一个逻辑的存储空间中,只是物理空间的不同(比如你电脑的内存条和主板的BIOS什么的),即统一编址,统一访问。
本文讲的8051使用的是哈佛结构,即程序与数据分开存。
程序指针寄存器PC(PC值),是CPU中控制器中的最基本的寄存器,是一个16位的寄存器,每执行一条程序自动加1,其存放的内容是CPU下一条将要执行的指令的地址,且无法用程序修改其内容,复位时重置为0000H;
数据指针寄存器DPTR,16位特殊功能寄存器寄存器,分为高8位DPH和低8位DPL,既可以作为16位寄存器,也可以拆开为两个8位寄存器使用,分别储存想要访问的片外RAM数据的高8位低8位地址,用于片外RAM数据的间接寻址;
下面进入正题:
程序存储器
程序存储器概括:
单片机能够按照一定的次序工作,是由于程序存储器中存放了烧录进去的程序;
程序存储器可以分为片内和片外两部分,但不管是片内还是片外,都是统一编址(不同物理空间,同一个逻辑空间);
AT89S51自带4KB的FLASH存储器,支持离线编程和ISP在线编程;
当片内不够用时,可进行片外拓展程序存储器,89S51最多支持64KB的编址空间;
下面详细讲解程序存储器空间:
程序执行时不需要修改,所以是只读存储器(ROM),存放程序和表格之类的固定常数。AT89S51内部ROM空间4KB,地址范围0000H~0FFFH(0~4*1024B);由于有16位宽地址总线,逻辑空间的最大寻址范围0000H~FFFFH(0~64*1024B);
使用时务必注意以下问题:
一.当同时有片内和片外程序存储器时,CPU先访问那个呢?
这个情况由单片机引脚EA非PIN脚控制(如图);
当EA非=1时,优从片内程序存储器读取指令,只有当程序计数器PC超出片内程序存储器地址编码范围4KB时(即PC值>0FFFH),才转到外部程序存储器中读取指令,此时外部64KB的空间最多只能访问到60KB(F000H),因为片内片外统一编址64KB(最大寻址空间FFFFH),片内已经有4KB空间了(0FFFH);
当EA非=0时,一律从片外程序存储器中读取指令,忽略片内的4KB寄存器;
片外最多访问64KB(即FFFFH);
二.5个中断源地址:
中断源 |
地址 |
外部中断0 |
0003H |
定时器T0 |
000BH |
外部中断1 |
0013H |
定时器1 |
001BH |
串行口 |
0023H |
单片机打开中断并产生中断后,PC程序储存器地址指针会直接跳到对应的中断入口地址,但是往往汇编时都在终端入口地址空间里放跳转指令,因为每个中断入口之间只有8个字节,是不够放中断程序的;
三.汇编细节操作
AT89S51复位后,PC程序储存器地址指针为0000H,意思是准备开始顺序执行0000H往后的内容,此时一般都在0000H放入跳转指令,跳向主程序入口处,因为0000H到外部中断0入口地址0003H太近会产生重合,程序执行紊乱。
数据存储器
数据存储器概括:
在程序执行过程中会产生数据,易变且根据程序执行情况大小随机,所以数据存储器为随机存储器(RAM);
数据存储器也可以分为片内和片外两部分,但片内和片外独立编址(不同物理空间,不同逻辑空间);
AT89S51自带128B(00H~7FH)的RAM,如果不够用可扩展最多64KB的片外RAM;
拓展的片外RAM由特殊功能寄存器DPTR进行间接寻址,编址空间从0000H开始,最大为FFFFH。
片内RAM各个寄存器区划分如下:
30H~7FH |
用户ROM区 (堆栈,数据缓冲区) |
20H~2FH |
可位寻址区 |
18H~1FH |
第3组工作寄存器区 |
10H~17H |
第2组工作寄存器区 |
08H~0FH |
第1组工作寄存器区 |
00H~07H |
第0组工作寄存器区 |
一.工作寄存器区
字节地址为00H~1FH的32B是4组通用工作寄存器区,可字节寻址不可位寻址,每个区包含8B的工作寄存器,编号为R7~R0;改变SFR中的程序状态字寄存器PSW中的RS1,RS0这两位切换当前工作寄存器区。
二.位寻址区
位寻址区位于字节地址为20F~2FH区间(16B),可字节寻址也可位寻址,此区间的寄存器可以位寻址,可以对它们进行位操作、位运算。
三.用户ROM区
字节地址为30H~7FH的空间为用户ROM区(大小为80B),可字节寻址不可位寻址,用于存放数据及堆栈。
特殊功能寄存器(简称SFR)
数据存储器概括:
AT89S51的26个SFR的字节地址离散的映射在片内RAM区的80H~FFH这128B单元中;这句话这么理解:数据RAM空间和SFR所在的RAM空间不在同一个物理空间内,只是把SFR字节地址映射到数据RAM区的逻辑后,使得逻辑空间上数据RAM区后直接就是SFR区。
另外,26B的SFR离散映射到128B的空间,剩下还有地方没有被映射,但是这些没有被映射(定义)的空间不能进行读写,否则会得到不确定的随机数。
下面先给出这26个SFR图表:
MCS-51单片机的特殊功能寄存器 |
||
符号 |
地址 |
功能介绍 |
F0H |
B寄存器 |
|
E0H |
||
D0H |
程序状态存储器 |
|
TH2* |
CDH |
定时器/计数器2(高8位) |
TL2* |
CCH |
定时器/计数器2(低8位) |
RLDH* |
CBH |
外部输入(P1.1)计数器/自动再装入模式时初值寄存器高八位 |
RLDL* |
CAH |
外部输入(P1.1)计数器/自动再装入模式时初值寄存器低八位 |
T2CON* |
C8H |
|
B8H |
中断优先级控制寄存器 |
|
B0H |
P3口锁存器 |
|
A8H |
中断允许控制寄存器 |
|
A0H |
P2口锁存器 |
|
SBUF |
99H |
|
98H |
||
P1 |
90H |
P1口锁存器 |
TH1 |
8DH |
定时器/计数器1(高8位) |
TH0 |
8CH |
定时器/计数器0(高8位) |
TL1 |
8BH |
定时器/计数器1(低8位) |
TL0 |
8AH |
定时器/计数器0(低8位) |
89H |
T0、T1定时器/计数器方式控制寄存器 |
|
88H |
T0、T1定时器/计数器控制寄存器 |
|
DPH |
83H |
数据地址指针(高8位) |
DPL |
82H |
数据地址指针(低8位) |
SP |
81H |
|
P0 |
80H |
P0口锁存器 |
PCON |
87H |
电源控制寄存器 |
上面的某些SFR我会单做一期进行讲解,部分SFR会在一些硬件电路上进行附带讲解;
位地址空间
可进行位寻址的单元可以进行位操作;
可进行位寻址的空间主要分为两部分:
片内RAM的可位寻址区(20H~2FH),空间大小16B(128b)
21个SFR中字节地址以0和8结尾的空间(比如:P0-80H,TCON-88H等)。