- 单片机原理及接口技术
- 陈贵银 祝福主编
- 6319字
- 2020-08-26 15:30:19
2.4 89C51单片机的主要组成部分
无论什么型号的微型计算机,一般都由中央处理器、存储器和I/O接口组成,89C51单片机也是如此。
2.4.1 CPU
CPU是单片机的核心部分,它的作用是读入和分析每条指令,根据每条指令的功能要求,控制各个部件执行相应的操作。89C51 单片机内部有一个8位的CPU,它是由运算器和控制器组成的。
1.运算器
运算器主要包括算术和逻辑运算部件ALU、累加器ACC、寄存器B、暂存器YMP1、TMP2、程序状态字寄存器PSW、布尔处理器及十进制调整电路等。
运算器主要用来实现数据的传送、数据的算术运算和逻辑运算,以及位变量处理等。
2.控制器
控制器包括时钟发生器、定时控制逻辑、指令寄存器、指令译码器、程序计数器PC、程序地址寄存器、数据指针寄存器DPTR和堆栈指针SP等。
控制器是用来统一指挥和控制计算机进行工作的部件。它的功能是从程序存储器中提取指令,送到指令寄存器,再进入指令译码器进行译码,并通过定时和控制电路,在规定的时刻发出各种操作所需要的全部内部控制信息及 CPU外部所需要的控制信号,如 ALE、PSEN、RD、WR等,使各部分协调工作,完成指令所规定的各种操作。
2.4.2 存储器
89C51单片机在物理上有4个存储空间:片内程序存储器和片外程序存储器,片内数据存储器和片外数据存储器。89C51片内有4 KB的程序存储器和128 B数据存储器。除此之外还可以在片外扩展64 KB的程序存储器和64 KB的数据存储器。
其中64 KB的程序存储器中,有4 KB地址对于片内程序存储器和片外程序存储器是公共的,这4 KB的地址为0000H~0FFFH,从1000H~FFFFH是外部程序存储器的地址,也就是说4 KB内部程序存储器的地址是从0000H~0FFFH,64 KB外部程序存储器的地址也是从0000H~FFFFH;128 B的片内数据存储器地址是从00H~7FH(用8位地址),而64 KB外部数据存储器的地址是从0000H~FFFFH。图2-4示出了89C51存储器结构。
图2-4 89C51存储器结构示意图
下面分别叙述程序存储器和数据存储器的配置。
1.程序存储器
程序存储器用于存放编好的程序、表格和常数。如前所述,89C51 内部有4 KB Flash ROM,片外最多可扩展64 KB ROM,两者是统一编址的,CPU的控制器专门提供一个控制信号EA来区分内部ROM和外部ROM的公用地址区0000H~0FFFH:当EA接高电平时,单片机从片内4 KB Flash ROM中取指令,而当指令地址超过0FFFH后,就自动地转向片外ROM取指令。当EA接低电平时,89C51片内Flash ROM不起作用,CPU只从片外ROM取指令,地址可以从0000H开始编址。
使用89C51时,EA必须接高电平,以使用片内资源。
在程序存储器中,有6个单元具有特殊功能。
0000H~0002H:是所有执行程序的入口地址,89C51复位后,CPU总是从0000H单元开始执行程序。
0003H:外部中断0入口。
000BH:定时器0溢出中断入口。
0013H:外部中断1入口。
001BH:定时器1溢出中断入口。
0023H:串行口中断入口。
使用时,通常在这些入口地址处存放一条绝对跳转指令,使程序跳转到用户安排的中断程序起始地址,或者从0000H起始地址跳转到用户设计的初始程序上。
2.数据存储器
数据存储器分为内、外两部分,89C51内部有128B RAM,地址为00H~7FH;片外最多可扩展64 KB RAM,地址为0000H~FFFFH。内、外RAM地址有重叠,可通过不同的指令来区分:“MOV”是对内部RAM进行读写的操作指令;“MOVX”是对外部RAM进行读写的操作指令。
89C51内部128 B RAM其应用最为灵活,可用于暂存运算结果及标志位等。按其用途还可以分为三个区域。
(1)工作寄存器区 从00~1FH安排了4组工作寄存器,每组占用8个RAM字节,记为R0~R7。在某一时刻,CPU只能使用其中的一组工作寄存器,工作寄存器组的选择由程序状态字寄存器PSW中两位来确定。工作寄存器的作用相当于一般微处理器中的通用寄存器。
(2)位寻址区 占用地址20H~2FH,共16个字节,128位。这个区域除了可以作为一般RAM单元进行读写之外,还可以对每个字节中的每一位单独进行操作,并且对这些位都规定了固定的位地址,从20H单元的第0位起到2FH单元的第7位止共128位,用位地址00H~7FH分别与之对应。对于需要进行按位操作的数据,可以存放到这个区域。
(3)用户RAM区 地址为30H~7FH,共80个字节。这是真正给用户使用的一般RAM区,用户对该区域的访问是按字节寻址的方式进行的。该区域主要用来存放随机数据及运算的中间结果,另外也常把堆栈开辟在该区域中。
3.特殊功能寄存器(SFR)
89C51内部有21个特殊功能寄存器(Special Function Register,SFR),它们离散地分布在80H~FFH中(与片内RAM统一编址),未占用的地址单元无定义,用户不能使用,如果对无定义的单元进行读/写操作,得到的是随机数,而写入的数据将会丢失。表2-2 列出了这些特殊功能寄存器的符号、名称及地址(89C52内部有26个特殊功能寄存器)。
表2-2 89C51特殊功能寄存器一览表
访问这些特殊功能寄存器仅允许使用直接寻址方式,在指令中,既可以使用特殊功能寄存器的符号,也可以使用它们的地址,使用寄存器符号更能提高程序的可读性。
在21个特殊功能寄存器中有11个寄存器可以位寻址,在表2-2中符号左边带“*”号的特殊功能寄存器都是可以位寻址的。这些特殊功能寄存器的特征是地址可以被8整除,下面把可位寻址的特殊功能寄存器的字节地址及位地址一并列于表2-3中。
表2-3 可位寻址的特殊功能寄存器及其位地址表
访问这些可位寻址的寄存器中各位时,既可使用它的位符号,也可以使用它的位地址,还可用“寄存器名.位”来表示,如ACC.0表示ACC寄存器的第0位,B.7表示B寄存器的第7位等,使用位符号可使程序易读。
特殊功能寄存器反映了单片机的状态,它们实际上就是单片机的状态字及控制字寄存器,故也称为专用寄存器,它大致分为两类:一类与芯片的引脚有关,另一类做芯片内部控制用。特殊功能寄存器的应用几乎贯穿89C51单片机研讨的始终,下面介绍在CPU中使用的特殊功能寄存器,其余的特殊功能寄存器将在后面章节陆续介绍。
(1)程序计数器PC是一个16位的计数器。用于存放将要执行的指令地址,CPU每读取指令的一个字节PC便自动加1,指向本指令的下一个字节或下一条指令地址,从而实现程序的顺序执行,PC可寻址64 KB范围ROM。
PC在物理结构上是独立的,它不属于内部RAM的SFR范围,它没有地址,是不可寻址的。因此用户无法对其进行读写,但可以通过转移、调用和返回等指令改变其内容,以实现程序的转移。
(2)累加器A是一个最常用的8位特殊功能寄存器,它既可用于存放操作数,也可用来存放运算的中间结果。在89C51单片机中,大部分单操作数指令的操作数就取自累加器。许多双操作数指令中的一个操作数,也取自累加器。指令系统中A表示累加器,用ACC表示A的符号地址。
(3)寄存器B是一个8位寄存器,主要用于乘法和除法运算。乘法运算时,B中存放乘数,乘法操作后,乘积的高8位又存于B中;除法运算时,B中存放除数,除法操作后,B又存放余数。在其他指令中,寄存器B可作为一般的寄存器使用,用于暂存数据。
(4)状态字寄存器PSW是8位寄存器,用于存放程序运行的状态信息,其格式如下。
CY(PSW.7):进位标志,是累加器A的溢出位,如果操作结果在最高位有进位输出(加法)或借位输入(减法)时由硬件置位,否则清零。
AC(PSW.6):辅助进位标志,是低半字节的进位位,加减运算中当低4位向高4位进位或借位时,由硬件置位,否则清零。CPU根据AC标志对BCD码的算术运算结果进行调整。
FO(PSW.5):用户标志位,用户可根据自己的需要用软件方法置位或复位,并根据 F0=0 或 1 来决定程序的执行方式。
RS1(PSW.4)、RS0(PSW.3):工作寄存器组选择位,由用户用软件改变RS1和RS0的组合,来选择片内RAM中的4组工作寄存器之一,作为当前工作寄存器组,其组合关系如表2-4所示。
表2-4 RS1、RS0与工作寄存器组的关系
OV(PSW.2):溢出标志位,当执行算术指令时,由硬件置位或清零,根据计算方法的不同,OV代表的意义也不同,说明如下。
在有符号数的加减运算中,当运算结果超出-128~+127的范围时,即产生溢出,则OV由硬件自动置1,表示运算结果错误;否则OV由硬件清零,表示运算结果正确。
在无符号数的乘法运算中,当乘积超出255时,OV=1,表示乘积的高8位放在B中,低8位放在A中;若乘积未超出255,则OV=0,表示乘积只放在A中。
在无符号数的除法运算中,当除数为0时,OV=1,表示除法不能进行;否则,OV=0,表示除法可正常进行。
P(PSW.0):奇偶标志位,该位始终跟踪累加器A内容的奇偶性。如果有奇数个“1”,则P置1;否则置0。
在89C51的指令系统中,凡是改变累加器A中内容的指令均影响奇偶标志位P。
(5)堆栈指针SP。所谓堆栈,顾名思义就是一种以“堆”的方式工作的“栈”。堆栈是在内存中专门开辟出来的按照“先进后出、后进先出”的原则进行存取的RAM区域。
堆栈的用途是保护现场和断点地址。在CPU响应中断或调用子程序时,需要把断点处的PC值及现场的一些数据保存起来,在微型计算机中,它们就是保存在堆栈中的。同样,当发生中断嵌套(高级中断中断低级中断)或子程序嵌套(在执行一个子程序中,又调用另一个子程序)时,也要把各级断点处的PC值及一些现场数据都要保护起来,为了能保证逐级正确返回,要求后保存的值先取回,即符合“先进后出、后进先出”的原则。堆栈正是为此目的而设计的。
堆栈可设置在内部RAM的任意区,堆栈共有两种操作:进栈和出栈。但不论是数据进栈还是数据出栈,都是对堆栈的栈顶单元进行的,即对栈顶单元进行读、写操作。最后进栈的数据所在单元称为栈顶,为了指示栈顶地址,需要设置堆栈指示器,在89C51 单片机中由一个特殊功能寄存器SP来管理堆栈的栈顶。
SP称为堆栈指示器,也称为堆栈指针,它是一个8位寄存器,堆栈指针SP的初值称为栈区的栈底,每当一个数据送到堆栈中(称为压入堆栈)或从堆栈中取出(称为弹出堆栈),堆栈指针都要随之做相应的变化,它始终指向栈顶地址。
堆栈有两种类型:向上生长型和向下生长型,如图2-5所示。89C51的堆栈属于向上生长型,在数据压入堆栈时,SP的内容自动加 1 作为本次进栈的地址指针,然后再存入信息,所以随着信息的存入,SP的值越来越大,在信息从堆栈弹出以后, SP的值随之减少;向下生长型的堆栈则相反,栈底占用较高地址,栈顶占用较低地址。
图2-5 两种不同类型的堆栈
89C51单片机复位后,堆栈指针SP总是初始化到内部RAM地址07H。从08H开始就是89C51的堆栈区,这个位置与工作寄存器组1 的位置相同。因此,在实际应用中,通常要根据需要在主程序开始处通过指令改变SP的值,从而改变堆栈的位置。
(6)数据指针DPTR是一个16位寄存器,由高位字节DPH和低位字节DPL组成,用来存放16位存储器的地址,以便对外部数据存储器RAM数据进行读写。DPTR的值可通过指令设置和改变。
对于89C52芯片来说,内部RAM是256 B。其高128 B与特殊功能寄存器的地址重叠,地址也为80H~FFH,在使用时,可以通过指令的寻址方式加以区别。
2.4.3 并行I/O口
89C51中有4个8位并行输入/输出端口,记作P0、P1、P2和P3,共32根线。实际上它们就是特殊功能寄存器中的4个。每个并行I/O口都能用做输入和输出,所以称它们为双向I/O口。但这4个通道的功能不完全相同,所以它们的结构也设计得不同。在这里将详细地介绍这些I/O口的结构,以便于掌握它们的结构特点,在使用中采取不同的策略。
1.P0口的结构
P0口有两个用途,第一是作为普通I/O口使用;第二是作为地址/数据总线使用。当用做第二个用途时,在这个口上分时送出低8位地址和传送数据,这种地址与数据同用一个I/O口的方式,称为地址/数据总线。下面分别介绍。
图2-6是P0口某一位的结构图。它由一个锁存器、两个三态输入缓冲器1和2、场效应管VT1和VT2、控制与门、反向器和转换开关MUX组成。当控制线C=0时,MUX开关向下, P0口作为普通I/O口使用;当C=1时,MUX开关向上,P0口作为地址/数据总线使用。
图2-6 P0口线逻辑电路图
1)P0口作为普通I/O口使用
当控制线C=0时,MUX开关向下,P0口作为普通I/O口使用。这时与门输出为0,场效应管VT1截止。
(1)P0口作为输出口。当CPU在P0口执行输出指令时,写脉冲加在锁存器的CP端,这样与内部数据总线相连的D端数据经锁存器Q端反相,再经场效应管VT2反相,在P0端口出现的数据正好是内部数据总线的数据,实现了数据输出。值得注意的是,P0口作为I/O口使用时场效应管VT1是截止的,当从P0口输出时,必须外接上拉电阻才能有高电平输出。
(2)P0口作为输入口。当P0口作为输入口使用时,应区分读引脚和读端口两种情况。所谓读引脚,就是读芯片引脚的数据,这时使用缓冲器2,由读引脚信号将缓冲器打开,把引脚上的数据经缓冲器通过内部总线读进来;所谓读端口,则是指通过缓冲器1读锁存器Q端的状态。为什么要有读引脚和读端口两种输入呢?这是为了适应对口进行“读—修改—写”类指令的需要。例如,指令“ANL P0,A”,执行该指令时,先读P0 端口的数据,再与A的内容进行逻辑与,然后把结果送回P0口。不直接读引脚而读锁存器是为了避免可能出现的错误,因为在端口处于输出的情况下,如果端口的负载是一个晶体管基极,导通的PN结就会把端口引脚的高电平拉低,而直接读引脚会使原来的“1”误读为“0”。如果读锁存器的Q端,就不会产生这样的错误。
由于P0口作为I/O使用时场效应管VT1是截止的,当P0口作为I/O口输入时,必须先向锁存器写“1”,使场效应管VT2截止(即P0口处于悬浮状态,变为高阻抗),以避免锁存器为“0”状态时对引脚读入的干扰。这一点对P1、P2、P3口同样适用。
2)P0口作为地址/数据总线使用
在实际应用中,P0口大多数情况下是作为地址/数据总线。这时控制线C=1,MUX开关向上,使数据/地址线经反向器与场效应管VT2接通,形成上下两个场效应管推拉输出电路(VT1导通时上拉,VT2导通时下拉),大大增加了负载能力,而当输入数据时,数据信号仍然从引脚通过输入缓冲器2进入内部总线。
2.P1口的结构
P1口只用做普通I/O口,所以它没有转换开关MUX,其结构见图2-7。
图2-7 P1口线逻辑电路图
P1口的驱动部分与P0口不同,内部有上拉电阻,其实这个上拉电阻是两个场效应管并在一起形成的。当P1 口输出高电平时,可以向外提供拉电流负载,所以不必再接上拉电阻,当输入时,与P0口一样,必须先向锁存器写“1”,使场效应管截止。由于片内负载电阻较大,约20~40 kΩ,所以不会对输入数据产生影响。
3.P2口的结构
P2口也有两种用途:一是作为普通I/O口,二是作为高8位地址线,其结构见图2-8。
图2-8 P2口线逻辑电路图
P2口的位结构比P1口多了一个转换控制部分。当P2口作为通用I/O口时,多路开关MUX倒向锁存器输出Q端,其操作与P1口相同。
在系统扩展片外程序存储器时,由P2口输出高8位地址(低8位地址由P0口输出)。此时MUX在CPU的控制下,转向内部地址线的一端。因为访问片外程序存储器的操作往往连接不断,P2口要不断送出高8位地址,所以这时P2口无法再作为通用I/O口。
在不需要外接程序存储器而只需扩展较小容量的片外数据存储器的系统中,使用“MOVX @Ri”类指令访问片外RAM时,若寻址范围是256 B,则只需低8位地址线就可以实现。P2口不受该指令影响,仍可作为通用 I/O口。若寻址范围大于 256 B,又小于64 KB,可以用软件方法只利用P1~P3口中的某几根口线送高位地址,而保留P2中的部分或全部口线作为通用I/O口。
若扩展的数据存储器容量超过256 B,则使用“MOVX @DPTR”指令,寻址范围是64 KB,此时高8位地址总线由P2口输出。在读/写周期内,P2口锁存器仍保持原来端口的数据,在访问片外RAM周期结束后,多路开关自动切换到锁存器 Q端。由于CPU对RAM的访问不是经常的,在这种情况下,P2口在一定的限度内仍可用做通用I/O口。
4.P3口的结构
P3口是一个多功能端口,其结构见图2-9。与 P1 口相比,P3 口增加了与非门和缓冲器3,它们使P3口除了有准双向I/O功能外,还具有第二功能。
图2-9 P3口线逻辑电路图
与非门的作用实际上是一个开关,它决定是输出锁存器上的数据,还是输出第二功能 W的信号。当输出锁存器Q端的信号时,W=1;当输出第二功能W的信号时,锁存器Q端为1。
通过缓冲器 3,可以获得引脚的第二功能输入。不管是作为 I/O 口的输入,还是作为第二功能的输入,此时锁存器的D端和第二功能线W都应同时保持高电平。
不用考虑如何设置P3口的第一功能或第二功能。当CPU把P3口当做专用寄存器进行寻址时(包括位寻址),内部硬件自动将第二功能线W置1,这时P3口为普通I/O口;当CPU不把P3口当成专用寄存器使用时,内部硬件自动使锁存器Q端置1,P3口成为第二功能端口。