2.2 中央处理单元
CPU是单片机的核心,是计算机的控制和指挥中心,8051内部CPU是一个字长为8位二进制的中央处理单元,也就是说它对数据的处理是按字节为单位进行的。CPU由运算器(ALU)和控制器(定时控制部件等)两部分电路组成。如图2-2所示为8051单片机CPU内部结构图。
图2-2 8051单片机CPU内部结构
1.运算器(ALU)
运算器ALU由一个加法器、两个8位暂存器(TMP1与TMP2)、8位的累加器A、寄存器B、程序状态寄存器PSW和布尔处理器组成。运算器ALU可以对4位、8位和16位数据进行算术运算和逻辑运算,并且能够完成数据传送、移位、判断和程序转移等操作。
(1)累加器ACC
累加器ACC,简称累加器A,它是一个8位寄存器,通过暂存器与ALU相连。在CPU中,累加器A是工作最频繁的寄存器。在进行算术运算和逻辑运算时,通常用累加器A存放一个操作数,而ALU的运算结果又存放在累加器A中。
(2)寄存器B
寄存器B也是一个8位寄存器。一般用于乘法、除法指令,它与累加器配合使用。运算前,寄存器B中存放乘数或除数,在乘法或除法完成后用于存放乘积的高8位或除法的余数。
(3)程序状态字寄存器PSW
PSW是一个8位寄存器,它的各位用来存放指令执行后的状态信息,作为程序查询或判别的条件,在有些计算机中又叫标志寄存器。PSW中各位状态信息通常是指令执行过程中自动形成的,但也可以由用户根据需要采用传送指令加以改变。它的各标志位定义如下。
① 进位标志位Cy。在进行加法(或减法)运算时,如果运算结果的最高位D7有进位(或借位)时,Cy=1;否则Cy=0。在进行位操作时,Cy作为位累加器C。此外,在进行移位操作和比较转移指令时也会影响Cy标志位。
例如:87H+9AH=121H(1000,0111+1001,1010=110010,0001),但实际的运算结果放在A中时是21H,最前面的1就成了进位,C=1。
② 半进位标志位AC。在进行加法(或减法)运算时,如果低半字节向高半字节有进位(或借位)时,AC=1;否则AC=0。
例如:57H+3AH=91H(01010111+00111010),AC=1。
③ 用户标志位F0。F0标志位的状态是由用户根据自己的需要通过软件对其置位和复位,可作为用户程序的流向标志。
④ 工作寄存器选择位RS1和RS0。8051 CPU有4组各8个8位的工作寄存器,每一组分别命名为R0~R7。这两位的值可决定选择哪一组工作寄存器为当前工作寄存器组。使用时由用户通过软件改变RS1和RS0的值来进行选择。工作寄存器R0~R7的物理地址和RS1、RS0之间的关系如表2-1所示。
表2-1 工作寄存器R0~R7的物理地址和RS1、RS0之间的关系
8051上电复位后,CPU自动选择第0组为当前工作寄存器组。R0~R7的物理地址变为00H~07H。
⑤OV:溢出标志。反映运算结果是否溢出,溢出时,OV=1;否则OV=0。溢出是指有符号数进行运算时,结果超出了+127~-128;而进位是指两个无符号数最前一位(D7位)相加(或相减)时有进位(或有借位)。
⑥ PSW1:无定义位。
⑦ 奇偶标志位P:用于标志运算结果的奇偶性。若累加器A中1的个数为奇数则P=1;否则P=0。
【例2-1】 设程序执行前F0=0,RS1RS0=00B,程序执行下列指令后,PSW中各位的状态是什么?
MOV A,#0FH;A←0FH ADD A,#08H;
解:程序的算式为
CP(最高进位位)= 1;CS(次高位进位位)=1;F0(用户标志)=0;RS0RS1(工作寄存器)=00B Cy(进位位)=1;AC(半进位)=1;P(奇偶标志位)=1;OV(溢出标志位)=0
2.控制器
(1)程序计数器PC
程序计数器PC是一个16位的专用计数器,用于存放CPU下一条要执行的指令地址,可寻址范围是0000H~0FFFFH,共64 KB。程序中的每条指令存放在ROM区的某一单元,并都有自己的存放地址。CPU要执行哪条指令时,就把该条指令所在单元的地址送上地址总线。在顺序执行程序中,当PC的内容被送到地址总线后,会自动加1,即(PC)←(PC)+1,又指向CPU下一条要执行的指令地址。在MCS-51 系列单片机中,当系统复位后,PC=0000H,CPU从这一固定入口地址开始执行程序。
(2)指令寄存器IR和指令译码器ID
其作用是在指令执行时,CPU根据PC所指地址,取出指令经指令寄存器IR送指令译码器ID进行译码,然后通过定时控制电路产生相应的控制信号,控制CPU内部及外部有关器件进行协调动作,完成指令所规定的各种操作。
(3)堆栈指针SP
堆栈是一种数据结构。数据写入堆栈称为入栈(PUSH),数据从堆栈中读出称为出栈(POP)。如图2-3所示为堆栈示意图。
图2-3 堆栈示意图
数据操作规则为“后进先出”。即先入栈的数据由于存放在栈的底部,因此后出栈;而后入栈的数据存放在栈的顶部,因此先出栈。
① 堆栈的功用。堆栈主要是为子程序调用和中断操作而设立的。其具体功能有两个:保护断点和保护现场。
② 堆栈的开辟。堆栈只能开辟在芯片的内部数据存储器中,即所谓的内堆栈形式。
③ 堆栈指示器。堆栈指示器SP(Stack Pointer)的内容是堆栈栈顶的存储单元地址,SP是一个8位寄存器,在进行操作之前,先用指令给SP赋值,以规定栈区在RAM区的起始地址(栈底层)。
系统复位后,SP的内容为07H,但由于堆栈最好在片内RAM的30H~7FH单元中开辟,所以在程序设计时应注意把SP值初始化为2FH以后。
(4)数据指针DPTR
数据指针DPTR是一个16位的寄存器,专门用来存放16位地址指针,作为间接寻址寄存器使用。它可以对64KB范围内的任一存储单元寻址,还可以分成两个8位独立的寄存器DPL和DPH使用,DPH为DPTR的高8位,DPL为DPTR的低8位。当对64KB片外数据存储器空间寻址时,作为间址寄存器用。在访问程序存储器时,用做基址寄存器。