总体架构
1.1 8051 内核
1.1.1 简介
标准 8051 即 MCS-51 为 12 周期的 8051 CPU,而 WS51F7030 系列芯片采用的是单周期 8051 CPU,完全兼容MCS-51 指令集。
1.1.2 寻址方式
8051 的内核寻址方式有:立即寻址、直接寻址、间接寻址、寄存器寻址、相对寻址、变址寻址和位寻址。
1.1.2.1 立即寻址
立即寻址是在指令操作数中直接给出参与运算的操作数,指令举例如下:
MOV A, #60H (这条指令把 60H 直接送到累加器 A)
1.1.2.2 直接寻址
直接寻址指令操作数给出的是参与运算操作数的地址。直接寻址方式只能用于特殊功能寄存器、内部数据区和位地址空间,而特殊功能寄存器和位地址空间只能用直接寻址方式访问。指令举例如下:
ANL 50H, #91H (把 50H 单元中的数与 91H 相“与”,结果存放在 50H 单元中,其中 50H 为内部 RAM的地址)
1.1.2.3 间接寻址
间接寻址采用 R0 或 R1 前添加”@”符号。假设 R1 中的数据是 40H,内部数据存储器 40H 单元的数据为 55H,则指令为MOV A, @R1 (把数据 55H 传送至累加器 A)
1.1.2.4 寄存器寻址
寄存器寻址对选定的工作寄存器 R7-R0、累加器 A、通用寄存器 B、地址寄存器和进位 C 中的数进行操作,其中寄存器 R7-R0 由指令码的低 3 位,ACC、B、DPTR 及进位 C 隐含在指令码中。因此,寄存器寻址也包含一种隐含寻址方式。工作寄存器工作区由状态寄存器 PSW 的 RS1、RS0 决定。指令操作数指定的寄存器均指当前工作区的寄存器。
INC R0 (R0 中的数据+1 写回 R0)
1.1.2.5 相对寻址
相对寻址是将程序计数器 PC 中的当前值与指令第二字节给出的数相加,其结果作为转移指令的转移地址。转移地址也成为转移目的地址,PC 中的当前值成为基地址,指令第二字节给出的数成为偏移量。由于目的地址是相对于 PC 中的基地址而言,所以这种寻址方式成为相对寻址。偏移量为带符号的数,范围为+127--128。这种寻址方式主要用于转移指令。
JC $+50H (若进位位 C 为 0,则程序计数器 PC 中的内容不改变,即不转移。若进位位 C 为 1,则以 PC 中的当前值及基地址,加上偏移量 50H 后得到的结果作为该转移指令的目的地址)
1.1.2.6 变址寻址
在变址寻址方式中,指令操作数制定一个存放变址基址的变址寄存器。变址寻址时,偏移量与变址基值相加,其结果作为操作数的地址。变址寄存器有程序计数器 PC 和地址寄存器 DPTR。
MOVC A, @A+DPTR (累加器 A 为偏移量寄存器,其内容与地址寄存器 DPTR 中的内容相加,其结果作为操作数的地址,取出该单元中的数送入累加器 A 中)
1.1.2.7 位寻址
位寻址是指对一些可进行位操作的内部 RAM 和特殊功能寄存器进行位操作时的寻址方式。在进行位操作时,借助于进位位 C 作为位操作累加器,指令操作数直接给出该位的地址,然后根据操作码对该位进行位操作。MOV C, 20H (将地址为 20H 的位操作寄存器值送入进位位 C 中)
1.1.3 寄存器描述
1.1.3.1 程序计数器 PC
程序计数器 PC 寄存器为 16 位,是专门用来控制指令执行顺序的寄存器,它没有寄存器地址。单片机上电或复位后,PC 值为 0,单片机从零地址开始执行程序。
1.1.3.2 累加器 ACC
累加器 ACC 是一个常用的专用寄存器,指令系统中采用 A 作为累加器的助记符,常用于存放算术或逻辑运算的操作数及运算结果。
1.1.3.3 通用寄存器 B
B 在乘除法运算中需要和 ACC 配合使用。MUL AB 指令把 ACC 和 B 中 8 位无符号数相乘,所得的 16 位乘积的低字节存放在 A 中,高字节存放在 B 中。DIV AB 指令用 B 除以 A,整数商存放在 A 中,余数存放在 B 中。寄存器 B 还可以用作通用暂存寄存器。
1.1.3.4 堆栈指针 SP
堆栈指针 SP 是一个 8 位专用寄存器。它指示出堆栈顶部在内部 RAM 块中的位置。系统复位后,SP 初始化位 07H,使得堆栈事实上由 08H 单元开始,考虑 08H-1FH 单元分别属于工作寄存器组 1-3,若在程序设计中用到这些区,则 SP 改变为 80H 或更大的为宜。在程序调试中,经常出现堆栈溢出的情况,为了方便找到程序故障,设置了一个记录堆栈的寄存器 SPMAX,可以通过 Debug 接口读出,地址 0x1A。
1.1.3.5 数据指针 DPTR
数据指针 DPTR0/DPTR1 是两个 16 位专用寄存器,它们的高位字节寄存器用 DP0H/DP1H,低位字节寄存器用 DP0L/DP1L ,通过 DPS(PSW.1)可选择使用 DPTR0/DPTR1。每个 DPTR 既可以作为一个 16 位寄存器来处理,也可以作为 2 个独立的 8 位寄存器 DP0H/DP1H 和 DP0L/DP1L 来处理。
1.1.3.6 状态寄存器 PSW
状态寄存器 PSW 是 CPU 的状态寄存器。在 CPU 做算术运算或者逻辑运算时,对应的 PSW 状态位会发生改变。