



各种型号的微型计算机,一般都由中央处理器、存储器和I/O接口等组成,MCS-51系列单片机也是如此。下面主要介绍MCS-51系列单片机的主要组成部分。
MCS-51系列单片机内部是一个字长 8 位二进制的中央处理单元。由运算器、控制器和专用寄存器三部分组成。
1.运算器
运算器由定时控制逻辑电路、指令译码器ID、指令寄存器IR和震荡器OSC等组成,以进行算术运算(加,减,乘,除,乘除运算与寄存器B有关)、逻辑运算及移位运算等。通过读取并翻译指令(程序)控制计算机完成相应的工作。指令寄存器IR用来存放当前要执行指令的内容,它包括操作码和地址码两部分。指令译码器ID是分析指令功能的部件。震荡器OSC是产生一定频率的脉冲信号。
运算器以完成二进制的算术/逻辑运算部件(ALU)为核心,再加上暂存器TMP、累加器ACC、寄存器B、程序状态标志寄存器PSW及布尔处理器。累加器ACC是一个8位寄存器,它是CPU中工作最频繁的寄存器。在进行算术、逻辑运算时,累加器ACC往往在运算前暂存一个操作数(如被加数),而运算后又保存其结果(如代数和)。寄存器B主要用于乘法和除法操作。标志寄存器PSW也是一个8位寄存器,用来存放运算结果的一些特征,如有无进位、借位等。如PSWCYAC FORS1 RS0 OV—P对用户来讲,最关心的是以下四位。其每位的具体含意如下所述。
进位标志CY(PSW7)。它表示了运算是否有进位(或借位)。如果操作结果在最高位有进位(加法)或者借位(减法),则该位为 1,否则为 0。
辅助进位标志AC。它又称半进位标志,反映了两个8位数运算低四位是否有半进位,即低四位相加(或减)有否进位(或借位),如有则AC为 1 状态,否则为 0。
溢出标志位OV。MCS-51反映带符号数的运算结果是否有溢出,有溢出时,此位为1,否则为 0。
奇偶标志P。反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数个 1(如11001100B,其中有 4 个 1),则P为 0,否则,P=1。
PSW的其他位,将在以下章节介绍。由于PSW存放程序执行中的状态,故又叫程序状态字。运算器中还有一个按位(bit)进行逻辑运算的逻辑处理机,又称布尔处理机。
2.控制器
控制器是CPU的神经中枢,它包括定时控制逻辑电路、指令寄存器IR、指令译码器ID、地址指针DPTR及程序计数器PC、堆栈指针SP等。这里程序计数器PC是由 16 位寄存器构成的计数器。要单片机执行一个程序,就必须把该程序按顺序预先装入存储器ROM的某个区域。单片机动作时应按顺序一条条取出指令来加以执行。因此,必须有一个电路能找出指令所在的单元地址,该电路就是程序计数器PC。
当单片机开始执行程序时,给PC装入第一条指令所在地址,它每取出一条指令(如为多字节指令,则每取出一个指令字节),PC的内容就自动加 1,以指向下一条指令的地址,使指令能顺序执行。只有当程序遇到转移指令、子程序调用指令,或遇到中断时,PC才转到所需要的地方去。8051CPU通过指定的地址,从ROM相应单元中取出指令字节放在指令寄存器中寄存,然后,指令寄存器中的指令代码被译码器译成各种形式的控制信号,这些信号与单片机时钟振荡器产生的时钟脉冲在定时与控制电路中相结合,形成按一定时间节拍变化的电平和时钟,即所谓控制信息,在CPU内部协调寄存器之间的数据传输、运算等操作。
3.专用寄存器
8051 内部专用寄存器主要包括程序计数器PC,累加器A,程序状态寄存器PSW,堆栈指示器SP,数据指针DPTR及通用寄存器B。它们主要用来指示当前要执行指令的内存地址、存放操作数和指令执行后的状态,配合运算器和控制器完成各项计算工作。
(1)程序计数器(ProgramCounter,简称PC)。专门用来存放需要执行指令的内存地址,决定程序执行顺序,能自动加 1。CPU执行指令时先根据程序计数器中的地址从存储器中取出当前需要执行的指令码,并将它送给控制器进行分析执行,随后程序计数器PC中地址码自动加 1,为CPU读取下一条指令做准备。由于PC是 16 位的,故 8051 中PC最大能形成的地址是FFFFH,即最大寻址空间是2的16次方即 64K。8051的应用程序最长不能超过64K。PC的值可以被强行改写,如:遇到跳转指令PC将不自动加 1,而是指向应执行的下一条指令地址。
(2)累加器A。并不是进行加法操作的场所,是专门用来存放操作数或运算结果的一个8位寄存器,CPU运算前,两个操作数中的一个通常应放在累加器A中,运算完成后,累加器A中便可得到运算结果。累加器A运算结构图如图2-11所示。
(3)通用寄存器B。是专门为乘法和除法设计的一个 8 位寄存器。该寄存器在乘法或除法前,用来存放乘数或除数,在乘法或除法完成后用于存放乘积的高8位或除法的余数。通用寄存器B运算原理图如图 2-12 所示。
图 2-11 累加器A运算结构图
图 2-12 通用寄存器B运算原理图
例如:
(4)程序状态寄存器PSW。用于存放指令执行后的状态。PSW中各位状态通常是在指令执行过程中形成。它的各标志位格式及定义如下:
·辅助进位位AC,用于表示加减运算中低 4 位有无向高位进位或借位,如有进位、借位AC=1,否则AC=0。
·用户标志位FO,由用户设定,可用于程序跳转等。
·寄存器选择位RS1 和RS0,用于选择工作寄存器所在的地址空间。其工作寄存器R0~R7 的物理地址和RS1、RS0 之间的关系如表 2-2 所示。
表 2-2 RS1、RS0 对工作寄存器的选择
·益处标志位OV,若运算结果超出带符号数的表示范围时,即计算出错,OV=1 否则OV=0。
·奇偶校验位P,用于指示运算结果中1的个数是奇数还是偶数,若累加器中1的个数是奇数则P=1,否则P=0。
(5)堆栈指示器SP。专门用来存放栈顶地址,能自动加1减1,字长是8位。计算机中存放大量现场数据或中间结果时,常在RAM中划出部分空间,按“先进后出”的原则,组织存放这些数据,这种存放数据的方法称“堆栈”,该空间可大可小,常称为堆栈区。堆栈示意图如图 2-13 所示。
·压栈,向堆栈中增加数,符号PUSH。
·出栈,从堆栈中取出数,符号POP。
·指定栈底地址,即向堆栈指针赋初值,格式为:MOV SP,#data。如:
(6)数据指针DPTR:是16位寄存器,用来对片外64K范围内的数据存储器进行操作。例如:
就是把片外数据存储器中2000H中的数据放到累加器A中。如图2-14所示。
图 2-13 堆栈示意图
图 2-14 数据指针DPTR操作示意图
数据指针DPTR可以分成高 8 位DPH,和低 8 位DPL,可以分别访问DPH和DPL。
存储器是计算机的基本组成部分,是用来存储信息的部件。存储器一般都用半导体存储器,分为只读存储器(ROM)和随机存储器(RAM),存储器的地址一般称为存储单元。8051单片机有16根地址线,因此,它有2 16 =65536个单元(一般称为64KB),每个单元的内容为一个字节(Byte),它的单元地址为0000H~FFFH。
1.存储器组织结构概述
以 8051 单片机为例,对其存储器组织结构进行介绍。8051 单片机存储器的分类从物理结构上,包括片内、片外程序存储器与片内、片外数据存储器 4 个部分;从寻址空间分布,包括程序存储器、内部数据存储器和外部数据存储器 3 大部分;从功能上包括程序存储器、内部数据存储器、特殊功能寄存器、位地址空间和外部数据存储器 5 大部分。如图2-15 所示,给出了 8051 单片机的四个独立的存储器空间。64KB的片外程序存储器;64 KB的片外数据存储器;256 个字节的片内数据存储器包括 128 个字节的特殊功能寄存器(SFR)区及 128 个字节的片内RAM区;4KB的片内程序存储器空间。
图 2-15 8051 存储器组织结构
上述四个存储器空间都是从0000H或00H单元开始的,它们必然有地址重叠现象,可以用如下方法加以区别。
(1)使用MOV、MOVX、MOVC三种指令,区分内部RAM、外部RAM和程序存储器空间(详见第3章)。
(2)使用控制信号
读取片外程序存储器的内容,而利用
和
信号来读写片外RAM的内容。
(3)单片机
引脚接地,应该从片外程序存储器开始取指令;如果该引脚接+5V,则从片内程序存储器开始取指令。
(4)程序存储器一定要使用16位地址,外部数据存储器也使用16位地址,而片内RAM和特殊功能寄存器(SFR)只能使用 8 位地址。
2. MCS-51系列单片机程序存储器地址空间
对于8051 单片机来说,程序存储器(ROM)的内部地址为 0000H~FFFH,共4KB;外部地址为 1000H~FFFH,共 60KB。对于单片机
引脚接+5V的情况,则从片内程序存储器开始取指令。当程序计数器由内部 0FFFH执行到外部1000H时,会自动跳转;对于 8751 来说,内部有4KB的EPROM,将它作为内部程序存储器;8031内部无程序存储器,必须外接程序存储器,此时,单片机
引脚必须接地,从片外程序存储器开始取指令。
计算机的工作是按照事先编制好的程序命令一条条循序执行的,程序存储器就是用来存放这些已编好的程序和表格常数,它由只读存储器ROM或可擦除可编程只读存储器EPROM组成。
单片机使用程序计数器PC作为程序存储器的地址指针,且PC总是指向将要执行的下一条指令所在的程序存储器单元地址。PC用于存放CPU下一条要执行的指令地址,是一个 16 位的专用寄存器,可寻址范围是 0000H~0FFFFH共 64 KB。程序中的每条指令存放在ROM区的某一单元,并都有自己的存放地址。CPU要执行哪条指令时,就把该条指令所在的单元的地址送上地址总线。在顺序执行程序中,当PC的内容被送到地址总线后,会自动加 1,即(PC)←(PC)+1,即指向CPU下一条要执行的指令地址。
实际应用时,程序存储器的容量由用户根据需要扩展,而程序地址空间原则上也可由用户任意安排。对于 8051 单片机,其中有 6 个单元地址具有特殊用途,是保留给系统使用的,它们分别是:0000H单元是系统的起始地址(单片机复位后程序计数器PC的内容为0000H,故必须从 0000H单元开始取指令来执行程序),一般在该单元存放一条无条件转移指令,用户设计的程序是从转移后的地址开始存放执行的。0003H、000BH、0013H、001BH和 0023H对应 5 种中断源的中断服务入口地址。程序存储器中的复位和中断源共 6 个固定的入口地址见表 2-3。表中 002BH是 8052 单片机的定时器 2 的入口地址。
表 2-3 MCS-51单片机复位、中断入口地址
3. MCS-51系列单片机内部数据存储器地址空间
使用内部RAM比使用外部RAM快得多,故应尽量使用片内RAM。8051 单片机片内RAM的配置如表 2-4 所示。片内RAM为 256B,地址范围为 00H~FFH,分为两大部分:低128B(00H~7FH)为真正的RAM区;高 128B(80H~FFH)为特殊功能寄存器区SFR。
(1)内部数据存储器(RAM)和堆栈
内部低 128BRAM区可分为工作寄存器区、位寻址区和数据缓冲区三部分。
①工作寄存器区,00H~1FH这 32 单元,称为通用工作寄存器区。它又可分成四个区,分别称为 0 区、1 区、2 区、3 区。每一个区有 8 个通用寄存器R0~R7(每个区的 8个字节从低到高被称为R0~R7)。工作寄存器和RAM地址对应关系如表 2-4 所示。
表 2-4 工作寄存器和RAM地址对照表
续表
通用工作寄存器共有 4 组,但编写软件时,每次只使用 1 组,其他各组不工作。哪 1组寄存器工作由程序状态字PSW中的PSW.3(RS0)和PSW.4(RS1)两位来选择,其对应关系如表 2-5 所示。复位时,PSW的值等于 00H,所以复位后自动使用 0 区。
表 2-5 RS1、RS0 与片内工作寄存器组的对应关系
②位寻址区,20H~2FH单元为位寻址区,每个单元等于 8 位,这 16 个单元(共计128位)的每1位都有一个8位表示的位地址,位地址范围为00H~7FH,如表2-6所示。位寻址区的每1位都可被用户当作软件标志,以 0或1 表示程序中需记忆和查询的标志,由程序直接进行位处理。通常可以把各种程序状态标志、位控制变量存于位寻址区内。同样,位寻址的RAM单元也可以作为一般的数据缓冲,按字节操作。
表 2-6 内部RAM中位地址表
续表
③数据缓冲区,30H~7FH是数据缓冲区,也即用户RAM区,共80个单元。数据缓冲区一般用于存放运算数据和结果。实际上,不使用的可以位寻址的字节和不使用的通用工作寄存器区都可以作为数据缓冲区使用。
④堆栈,在程序实际运行中,往往需要一个后进先出的RAM区,在子程序调用、中断服务处理等场合用以保护CPU的现场,这种后进先出的缓冲区称为堆栈。MCS-51单片机堆栈区不是固定的,原则上可设在内部RAM的任意区域内,但为了避开工作寄存器区和位寻址区,一般设在30H以后的范围内,栈顶的位置由专门设置的堆栈指针寄存器SP(8位)指出。
(2)特殊功能寄存器
特殊功能寄存器(SFR),又称为专用寄存器。实际上SFR是微处理器的内部寄存器或I/O口,只是按同一编址的原则,把它们的地址定在 80H~FFH。它不是用于存储一般的数据,而是专用于控制、管理单片机内算术逻辑部件、并行I/O口锁存器、串行口数据缓冲器、定时器/计数器、中断系统等功能模块的工作。8051单片机内部设置了18个特殊功能寄存器,对用户来说,这些SFR是可读可写的,相当于内部RAM。在SFR里,凡是字节地址末尾为0 或 8 的,表示可以进行位寻址,并且最低位的位地址即是它的字节地址。如表 2-7 所示给出了这 18 个SFR的名称、标识符、地址。18 个寄存器中有 3 个 16 位的寄存器,所以共占据了 21 个地址单元。另外可以进行位寻址的SFR共有 11 个,也在表 2-7 中予以详示。
表 2-7 特殊功能寄存器名称、标识符和地址表
续表
①程序状态字(Programe StateWord,简称PSW),地址为0D0H,可位寻址。PSW的各位定义如下:
· CY(PSW.7) :进位标志位。
· AC(PSW.6) :辅助进位(或称半进位)标志。
· F0(PSW.5) :由用户定义的标志位。
· OV(PSW.2) :溢出标志位。由硬件置位或清1零。
· PSW.1 :未定义位。
· P(PSW.0) :奇偶标志位。
· RS1(PSW.4) 、 RS0(PSW.3) :工作寄存器组选择位。
②累加器(Accumulator,简称ACC),是8位累加器,其地址为0E0H,可位寻址。所有的加法指令和减法指令,其中一个操作数必须是累加器A。它是最忙碌和最重要的一个寄存器。例如:
③寄存器B,是一个辅助寄存器,也叫乘除法寄存器。其地址为0F0H,可位寻址。乘法时,必须是一个数放在A,一个数放在B;乘积结果中高8位放在B中,低8位放在A中。除法时,被除数必须放在累加器A,除数放在B;结果中商放在A,余数放在B。例如:
④堆栈指针(Stack Pointer,简称SP),是 8 位的堆栈指针,地址是 81H,不可位寻址。系统复位后,SP初始化为 07H,第一个断点保护数据将装入 08H单元。实际应用时,一般设在 30H以后的范围内(为了避开工作寄存器区和位寻址区)。
⑤I/O端口控制/数据寄存器P0~P3,P0(80H)、P1(90H)、P2(A0H)和P3(B0H)口作为通用I/O口时,为准双向口。即当其用作输入方式时,各口对应的锁存器必须先置“1”,然后才能进入输入操作。例如:
⑥数据指针寄存器DPTR(地址 82H/83H),是一个 16 位的专用寄存器,其高位字节寄存器用DPH表示,低位字节寄存器用DPL表示。既可作为一个 16 位寄存器DPTR来处理,也可作为两个独立的 8 位寄存器DPH和DPL来处理。
DPTR主要用来存放 16 位地址,当对 64KB外部数据存储器空间寻址时,作为间址寄存器用。在访问程序存储器时,用作基址寄存器。
⑦两个 16 位的定时/计数器T0 和T1,定时/计数器 0 和 1 分别占用两个单元。T0 由TH0 和TL0 两个 8 位计数器组成,字节地址分别是 8CH和 8AH。T1 由TH1 和TL1 两个 8位计数器组成,字节地址分别是 8DH和 8BH。详见第4章。
需要说明的是:因为都有复位值,故凡用到的寄存器,在复位后应考虑是否重新赋初值,以便与系统的初始状态匹配。18个特殊功能寄存器地址散布在片内RAM的80H~FFH之间。它们共只占据了这 128 个字节单元中的 21 个地址单元,其余未用的地址单元,用户不能使用。
(3)位寻址空间
在MCS-51单片机的内部数据寄存器RAM块和特殊功能寄存器SFR块中,有一部分地址空间可以按位寻址,按位寻址的地址空间又称之为位寻址空间。位寻址空间一部分在内部RAM的20H~2FH的16个字节内,共128位;另一部分在SFR的80H~FFH空间内,凡字节地址能被 8 整除的专用寄存器都有位地址,共 93 位。因此,MCS-51系列单片机共有 221 个可寻址位,其位地址见表 2-6、表 2-7 所示。
布尔处理(即位处理)是MCS-51单片机ALU所具有的一种功能。单片机指令系统中的布尔指令集(17 条位操作指令),存储器中的位地址空间,以及借用程序状态标志寄存器PSW中的进位标志CY作为位操作“累加器”,构成了单片机内的布尔处理机。
4. MCS-51系列单片机外部数据存储器地址空间
外部数据存储器一般由静态RAM构成,其容量大小由用户根据需要而定,最大可扩展到 64 KB RAM,地址是 0000H~0FFFFH。MCS-51单片机访问外部数据存储器可用 1 个特殊功能寄存器——数据指针寄存器DPTR进行寻址。由于DPTR为 16 位,可寻址的范围可达 64 KB,所以扩展外部数据存储器的最大容量是 64 KB。CPU通过MOVX指令访问外部数据存储器,用间接寻址方式,R0、R1 和DPTR都可作间接寄存器。注意,外部RAM和扩展的I/O接口是统一编址的,所有的外扩I/O口都要占用 64 KB中的地址单元。
MCS-51系列单片机片内有一个串行I/O端口,通过引脚RXD(P3.0)和TXD(P3.1)可与外设电路进行全双工的串行异步通信。
1.串行端口的基本特点
8031单片机的串行端口有4种基本工作方式,通过编程设置,可以使其工作在任一方式,以满足不同应用场合的需要。其中,方式 0 主要用于外接移位寄存器,以扩展单片机的I/O电路;方式 1 多用于双机之间或与外设电路的通信;方式 2,3 除有方式1的功能外,还可用作多机通信,以构成分布式多微机系统。
串行端口有两个控制寄存器,用来设置工作方式、发送或接收的状态、特征位、数据传送的波特率(每秒传送的位数)以及作为中断标志等。
串行端口有一个数据寄存器SBUF(在特殊功能寄存器中的字节地址为 99H),该寄存器发送和接收占用相同的地址空间。发送时,只写不读;接收时,只读不写。在一定条件下,向SBUF写入数据就启动了发送过程;读SBUF就启动了接收过程。
串行通信的波特率可以程控设定。在不同工作方式中,由时钟振荡频率的分频值或由定时器T1的定时溢出时间确定,使用十分方便灵活。
2.串行端口的工作方式
(1)方式 0
8 位移位寄存器输入/输出方式。多用于外接移位寄存器以扩展I/O端口。波特率固定为fosc/12。其中,fosc为时钟频率。
在方式 0 中,串行端口作为输出时,只要向串行缓冲器SBUF写入一字节数据后,串行端口就把此 8 位数据以等的波特率,从RXD引脚逐位输出(从低位到高位);此时,TXD输出频率为fosc/12 的同步移位脉冲。数据发送前,仅管不使用中断,中断标志T1 还必须清零,8位数据发送完后,T1自动置1。如要再发送,必须用软件将T1清零。
串行端口作为输入时,RXD为数据输入端,TXD仍为同步信号输出端,输出频率为fosc/12的同步移位脉冲,使外部数据逐位移入RXD。当接收到8位数据(一帧)后,中断标志R1 自动置。如果再接收,必须用软件先将R1 清零。
方式 0 发送和接收的时序过程如图 2-16 所示。
图 2-16 串行方式 0 发送接收时序图
(2)方式 1
10位异步通信方式。其中,1个起始位(0),8个数据位(由低位到高位)和1个停止位(1)。波特率由定时器T1 的溢出率和SMOD位的状态确定。
一条写SBUF指令就可启动数据发送过程。在发送移位时钟(由波特率确定)的同步下,从TXD先送出起始位,然后是 8 位数据位,最后是停止位。这样的一帧 10 位数据发送完后,中断标志T1 置位。
在允许接收的条件下(REN=1),当RXD出现由1到0的负跳变时,即被当成是串行发送来的一帧数据的起始位,从而启动一次接收过程。当 8 位数据接收完,并检测到高电平停止位后,即把接收到的 8 位数据装入SBUF,置位R1,一帧数据的接收过程就完成了。
方式1的数据传送波特率可以编程设置,使用范围宽,其计算式为:
波特率=2SMOD/32 ×(定时器T1 的溢出率)
其中,SMOD是控制寄存器PCON中的一位程控位,其取值有0和1两种状态。显然,当SMOD=0时,波特率=1/32(定时器T1溢出率),而当SMOD=1 时,波特率=1/16(定时器T1溢出率)。所谓定时器的溢出率,就是指定时器一秒钟内的溢出次数。波特率的算法,以及要求一定波特率时定时器定时初值的求法,后面将详细讨论。
串行方式 1 的发送和接收过程的时序如图 2-17 所示。
(3)方式 2,3
11 位异步通信方式。其中,1 个起始位(0),8 个数据位(由低位到高位),1 个附加的第 9 位和 1 个停止住(1)。方式 2 和方式 3 除波特率不同外,其他性能完全相同。方式 2,3 的发送、接收时序如图 2-18 所示。
图 2-18 串行方式 2,3 发送接收时序图
由图 2-18 可见,方式 2 和方式 3 与方式1的操作过程基本相同,主要差别在于方式 2,3 有第 9 位数据。
发送时,发送机的这第 9 位数据来自该机SCON中的TB8,而接收机将接收到的这第9位数据送入本机SCON中的RB8。这个第9位数据通常用作数据的奇偶检验位,或在多机通信中作为地址/数据的特征位。
方式 2 和方式 3 的波特率计算式如下:
方式 2:波特率=2SMOD/64 ×fosc
方式 3:波特率=2SMOD/32 ×定时器T1 的溢出率
由此可见,在晶振时钟频率一定的条件下,方式 2只有两种波特率,而方式3 可通过编程设置成多种波特率,这正是这两种方式的差别所在。
3.串行端口的控制寄存器
串行端口共有2个控制寄存器SCON和PCON,用以设置串行端口的工作方式、接收/发送的运行状态、接收/发送数据的特征、波特率的大小,以及作为运行的中断标志等。