1 书籍
《MCS-51单片机原理、系统设计与应用_12015401.pdf》
MCS-51 Intel 公司 的 8051 内核技术
MSC-51单片机(有史以来,最简单易懂教程).pdf
《新编MCS-51单片机应用设计.pdf》 ---- good
2 MCS-51 PC 指针
PC 是 单片机 CPU 内部的一个寄存器
总是指向程序存储器,存放下一条要执行指令的地址。
复位之后的的值为 0x0000H
CPU内部的寄存器包括:
寄存器 | 复位值 |
---|---|
PC | 0000H |
Acc | 00H |
B | 00H |
PSW | 00H |
SP | 07H |
DPTR | 0000H |
MCS-51 复位之后,(PC)= 0000H,
系统程序从0000H单元开始,0000H是复位入口地址,是系统程序的启动地址。
一般在该单元存放一条绝对跳转指令,从跳转地址开始存放初始化程序和主程序。
2 MCS-52 内部RAM划分
00H — 7FH ( 0 —127 )单元组成的128字节的RAM块
80H ---- FFH ( 128 — 255 )单元组成的 128字节的RAM块 (MCS-51中没有,这一个部分)
80H ---- FFH ( 128 — 255 )的 SFR 特殊功能寄存器块
在MCS-52 中,高128字节的RAM 和SFR块地址重叠,但是物理上是两个不同的地方。
访问的时候,根据指令的不同,来确定是访问RAM,还是方位SFR。
访问高80H ---- FFH RAM是 间接寻址方式。
访问SFR 是 直接寻址方式。
低128字节的RAM 间接 直接都可以。
SFR 这128个字节中仅仅有26个字节是有意义的。
3 MSC-51 低128字节 RAM划分 00H – 7FH
CPU寄存器 SP 指针 复位之后 指向 RAM地址 07H,
如果使用PUSH指令 ,会将数据存放在 RAM地址07H,08H,依次往上。
RAM 地址的 00H — 07H 是第一组 R0 — R7
RAM 地址的 08H — 0FH 是第二组 R0 — R7
RAM 地址的 10H — 17H 是第三组 R0 — R7
RAM 地址的 18H — 1FH 是第四组 R0 — R7
R0—R7 不是 和 PC SP 一样的 CPU内部的寄存器。
R0 – R7 叫做 工作寄存器区 位于 RAM
SFR 应该是位于CPU内部— 是特殊功能寄存器。
4 堆栈
用户RAM区,地址为30H — 7FH,这些地址只能按字节寻址。
复位的时候,SP指向07H单元,当用户使用堆栈的时候,应该首先设置堆栈,用户堆栈一般设置在30H—7FH范围之内。
SP 设置的越大,堆栈越浅。
堆栈 是在片内RAM中开辟出来的一个区域,其主要是为子程序调用和中断操作而设立的。
具体功能是:保护断点和保护现场。
无论是子程序调用,还是中断操作,都需要返回主程序。
堆栈指针SP 是一个8位的SFR,特殊功能寄存器,SP的内容指示堆栈顶部在内部RAM块中的位置。
它可以指向内部RAM 00H— 7FH的任何单元。
实际使用的时候,最好是SP的值,设置为1FH,或者更大的值。
堆栈的操作,也就是对SP指针的操作,是通过指令集中的PUSH和POP指令实现的。
操作两种:一种是数据压入(PUSH)堆栈,
另外一种是数据弹出(POP)堆栈。
堆栈的栈顶由SP自动管理。每次进入压入或者弹出操作以后,堆栈指针SP自动调整以保持指示栈顶位置。
当一个字节数据压入堆栈后,SP自动加1.
一个字节数据弹出堆栈之后,SP自动减1
MCS-51单片机的这种堆栈结构是属于向上生长型的堆栈。
5 堆栈操作指令
MCS-51 单片机内部 RAM,后进先出(Last In First Out),
进栈指令
Push direct
功能是,首先将SP 加1 ,然后将direct指向的地址的内容,放到SP指向的RAM单元中。
出栈指令
POP direct
栈指向的RAM中的内容放入 direct指向的地址中,
SP 减小1.
6 RET 子程序的放回指令
RET
指向指令的时候,
SP ---->PCH 然后 SP - 1 -----> SP
SP ---->PCL 然后 SP - 1 -----> SP
功能是从堆栈中退出PC的高8位和低8位字节,
把栈指针减小2,从PC值开始继续执行程序。不影响标志。
6 RETI 子程序的放回指令
和RET类似,本指令清除了中断响应时候,单片机内部的中断优先级状态。
7 长调用
8 中断
中断源向CPU提出处理请求。
CPU主动中止执行的程序,转去执行中断服务程序,
硬件自动将中断点的地址(16位程序计数器PC的值)压入堆栈中。
中断响应的主要内容是由硬件自动生成一条长调用指令LCALL addr16。
addr16 是程序存储区中的中断向量地址。
例如 对于 外部中断1的响应,产生的长调用指令是,
LCALL 0013H。
生成LCALL 指令后,由CPU直接执行该指令。
首先是将PC的内容压入堆栈保护断点,再将中断入口地址装入PC。