MCS-51单片机是美国Intel公司生产的一系列单片机的总称,这一系列单片机包括许多品种,如8031、8051、8751、8032、8052、8752等,其中8051是最早、最典型的产品,该系列其他单片机在8051的基础上进行了功能的增加或减少,所以人们习惯于用8051来称呼MCS-51单片机。
MCS-51单片机采用哈佛结构,采用超大规模集成电路技术把具有数据处理能力的中央处理器(CPU)、数据存储器(RAM)、程序存储器(ROM)、多种I/O端口和中断系统、定时器/计数器等功能集成到一块硅片上构成了一个小而完善的计算机系统,其内部结构如图2-1所示。
中央处理器(CPU):是整个单片机的核心,具有8位数据宽度,能处理8位二进制数据。CPU负责整个单片机的正常工作,完成算术运算、逻辑运算、输入/输出控制、中断处理等操作。
程序存储器:一般大小为4KB,主要用于存放程序代码和一些原始数据或表格。
定时器/计数器:两个16位定时器/计数器可实现定时或计数功能。有些单片机还有第三个定时器,用于特殊用途,如自动重装载、波特率设置等。
并行I/O端口:4组8位I/O端口(P0、P1、P2和P3),用于实现与外部设备的数据交换和控制。
全双工串行口:内置一个全双工串行口,用于与其他芯片或设备的串行数据传送,该串行口既可以用作异步通信收发器,也可以用作同步移位器。
中断系统:有5个中断源,分别为两个外部中断、两个定时器/计数器中断和一个串口通信中断,并具有2级的优先级别。
图2-1 MCS-51单片机的内部结构
时钟电路:用于产生整个单片机运行的脉冲时序,MCS-51单片机多数须外接振荡电容,但部分MCS-51单片机内置了时钟电路,片外不用配置振荡电容。
数据存储器(RAM):有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能存放控制指令,用户只能访问,不能存放用户数据。所以,用户能使用的RAM只有128个单元,可存放读/写的数据、运算的中间结果或用户定义的字型表。数据存储器结构见表2-1。
表2-1 数据存储器结构
MCS-51单片机包含51子系列和52子系列,如8051、8052等,其中52系列比51系列功能多一些,除基本结构相同外,不同之处主要体现在:数据存储器容量为256字节(51系列为128字节);程序存储器容量为8~32KB;有3个16位定时器/计数器;有6个中断源。在本书给出的MCS-51单片机的电路连接图或参考程序中,没有严格区分单片机AT89C51和AT89S51。
所有MCS-51单片机都包含了以上基本结构,编程基本兼容。但是,MCS-51单片机随着芯片技术的不断发展,内部结构越来越复杂,很多芯片除保持内部数据总线、地址总线和数据存储格式仍然为8位外,数据存储器和程序存储器容量、外部I/O端口控制、外部总线接口等发生了很大的变化。AD公司的ADU812集成了看门狗、温度采集模块等;C8051F系列的I/O端口进行了扩展,具备了串行总线接口、USB总线接口;P8xC591系列单片机内部集成了CAN总线接口。
MCS-51单片机中的80C51和80C52常采用40Pin的DIP封装或者44Pin的PLCC封装,如图2-2所示。
图2-2 80C51/80C52的引脚分布与封装图
1.电源及时钟信号引脚
V cc :正常工作或对内部EPROM烧写程序时,接+5V电源。
GND:地。
XTAL1:时钟信号输入引脚,内部振荡电路的输入端。
XTAL2:时钟信号输出引脚,内部振荡电路的输出端。
2.输入/输出引脚
MCS-51单片机有4组8位I/O端口:P0、P1、P2和P3端口,P1、P2和P3为准双向端口,P0端口则为双向三态输入/输出端口。在DIP封装中,引脚39~32为P0.0~P0.7输入/输出引脚,引脚1~8为P1.0~P1.7输入/输出引脚,引脚21~28为P2.0~P2.7输入/输出引脚,引脚10~17为P3.0~P3.7输入/输出引脚。
MCS-51单片机的P0端口可以作为地址总线低8位和数据总线,P2端口可作为地址总线高8位,其逻辑结构如图2-3所示。电路中包含一个数据输出锁存器和两个三态数据输入缓冲器,还有一个数据输出的驱动和控制电路。这两组线用作CPU与外部存储器(程序/数据)和I/O端口扩展时的数据总线和地址总线,其中P0、P2端口可以构成16位地址总线。此外,在读取外部存储器数据时,P0端口既作为低8位地址总线,也作为8位数据总线使用,即地址总线与数据总线采用分时复用,这一特点与8086微处理器的AD0~AD15相同。CPU输出地址时,由地址锁存信号ALE通知地址锁存芯片(如74LS573/74LS373)锁存P0.0~P0.7引脚上的地址信息。
图2-3 P0与P2端口的逻辑结构
P2端口作为外部数据存储器或程序存储器的地址总线的高8位输出(A8~A15),选通高位地址。P0端口作为低8位地址总线的输出,选通低位地址。当读取外部存储器数据时,P0端口送出低8位地址,同时P2端口送出高8位地址,合成16位地址信息。此时,ALE控制时序,先将低8位地址锁存,等外部存储器获取到地址信息后,P0端口随即送出或者读取8位数据。外部的程序存储器由PSEN信号选通,数据存储器则由 和 读/写信号选通。MCS-51单片机有16根地址线,故最大可外扩64KB的程序存储器和数据存储器。
图2-4所示为P1和P3端口逻辑结构。P1端口为8位准双向端口,每一位均可单独定义为输入或输出端口。当作为输入端口时,1写入锁存器,Q(非)=0,T 2 截止,内上拉电阻将电位拉至“1”,此时该端口输出1;当0写入锁存器,Q(非)=1,T 2 导通,输出0。
作为输入端口时,锁存器置1,Q(非)=0,T 2 截止,此时该位既可以把外部电路拉成低电平,也可由内部上拉电阻拉成高电平,因此P1端口称为准双向端口。作为输入端口使用时,有两种情况,一种是读锁存器的内容,进行处理后再写到锁存器中,这种操作是读→修改→写操作,如JBC(逻辑判断)、CPL(取反)、INC(递增)、DEC(递减)、ANL(与逻辑)和ORL(逻辑或)指令均属于这类操作。另一种是读P1端口状态时,打开三态门G 2 ,将外部状态读入CPU。
P3端口为准双向端口。P3端口的输入/输出、锁存器、中断、定时器/计数器、串行口与特殊功能寄存器有关。P3端口的第一功能和P1端口一样,可作为输入/输出端口,同样具有字节操作和位操作两种方式,在位操作模式下,每一位均可定义为输入或输出。P3端口第二功能表见表2-2。在MCS-51单片机实际应用场合中,P3端口的第二功能显得更为重要。
图2-4 P1和P3端口逻辑结构
表2-2 P3端口第二功能表
当P3端口工作为普通I/O端口时,第二功能信号线应保持高电平,与非门开通,以维持从锁存器到输出端口的数据输出通路畅通无阻;而使用P3端口的第二功能时,对应的锁存器置高电平,使与非门对第二功能信号的输出是畅通的,从而实现第二功能信号的输出。当P3端口的某个引脚为第二功能信号输入时,在输入通路增设一个缓冲器,输入的第二功能信号即从这个缓冲器的输出端取得,而作为I/O端口的输入端时,取自三态缓冲器的输出端。
3.控制线
RST:复位信号复用引脚。当89C51芯片通电后,时钟电路开始工作,在RST引脚上出现24个时钟周期(或者两个机器周期)以上的高电平就可以实现复位操作,系统恢复到初始状态。通电时,考虑到有一定的起振时间,该引脚上的高电平必须维持10ms以上才能保证有效复位。初始化后,程序计数器指向0000H,P0~P3端口全部为高电平,堆栈指针写入07H,指明堆栈的入口地址,其他专用寄存器被清0。RST由高电平下降为低电平后,系统即从0000H地址开始执行程序。
V cc 掉电期间,该引脚如果接备用电源(+5V±0.5V),可用于保存片内RAM中的数据,当 V cc 下降到某规定值以下,开始向片内RAM供电。
:地址锁存有效信号输出端。当访问外部程序存储器时,ALE(地址锁存)的输出用于锁存地址的低位字节。而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。当外部程序存储是EPROM时,在编程期间, 将用于输入编程脉冲。
:片外程序存储器读选通信号输出端,也称片外取指信号输出端,该信号在每个机器周期内两次有效。当访问外部程序存储器时,此脚输出低电平选通信号。8位或16位地址数据将出现在P0和P2端口上,外部程序存储器则把指令数据放到P0端口上,由CPU读入并执行。
EA/VPP:片外程序存储器的选用端,该引脚EA为低电平,则读取外部程序存储器指令。当EA为高电平并且程序地址小于4KB时,读取内部程序存储器指令,而超过4KB地址则读取外部指令。对内部无程序存储器的8031芯片,EA保持接地。另外,在对单片机内部EPROM进行编程时,EA/VPP引脚还要加上12V的编程电压。
MCS-51单片机的CPU由运算器和控制器构成,是单片机的核心部分。它的组成和工作原理与多数CPU有相似之处,具体介绍如下。
1.运算器
运算器以算术逻辑单元(ALU)为核心,包括累加器(A)、寄存器(B)、暂存寄存器、程序状态字寄存器(PSW)等部件。它的功能是完成算术和逻辑运算、位变量处理和数据传送等操作。
(1)算术逻辑单元由加法器和其他逻辑电路(如移位电路、控制门电路等)组成。它不仅能完成8位二进制数的加、减、乘、除、加1、减1及BCD加法的十进制调整等算术运算,还能对8位变量进行与、或、异或、循环移位、求补、清零等逻辑运算,并具有数据传送、程序转移以及位处理(布尔操作)等功能。
(2)累加器是一个8位寄存器,是CPU中使用最频繁的寄存器。通过暂存器与ALU相连,向ALU提供操作数并存放运算结果。
(3)寄存器是为ALU进行乘、除法运算而设置的,在乘、除法运算时用来存放一个操作数,也用来存放运算后的一部分结果,不进行乘、除法运算时,还可作为通用寄存器使用。
(4)暂存寄存器暂时存储数据总线或其他寄存器送来的操作数,作为ALU的数据源,向ALU提供操作数。
(5)程序状态字寄存器是一个8位的特殊寄存器,它保存ALU运算结果的特征和处理状态,以供程序查询和判别。其中各位状态信息通常是指令执行过程中自动形成的,也可以由用户根据需要加以改变。PSW各位见表2-3。
表2-3 PSW各位
① CY(PSW.7):进位标志。无符号数运算中,当加法或减法运算最高位有进位或借位时,CY=1;进行加法或减法运算时,最高位无进位或借位,CY=0。CY主要用在多字节的加减法运算中,CY可以写成C。
② AC(PSW.6):辅助进位标志。无符号数运算中,进行加法或减法运算时,低4位向高4位有进位或借位,AC=1;低4位向高4位无进位或借位,AC=0。AC常作为计算机进行BCD码修正的判断依据。
③ F0(PSW.5):用户标志位,无特别意义,供用户自定义。通过软件置位或清0,并根据F0=1或0来反映系统某一种工作状态,决定程序的执行方式。
④ RS1、RS0(PSW.4、PSW.3):工作寄存器组选择位,可用软件置位或清0,用于选定当前使用的4个工作寄存器组中的某一组,具体对应关系见表2-4。
表2-4 RS1、RS0取值与工作寄存器组(R0~R7)的对应关系
⑤ OV(PSW.2):溢出标志位,主要用于有符号数运算,运算结果超出范围时,OV=1;否则,OV=0。如为8位运算,结果超过了8位补码所能表示的范围时,OV=1。
⑥ P(PSW.0):奇偶标志位。在执行指令后,单片机根据累加器的8位二进制数中“1”的个数的奇偶,自动给该标志置位或清0。若累加器的8位二进制数中“1”的个数为奇数,则P=1;若累加器A中“1”的个数为偶数,则P=0。该标志对串行通信的数据传输非常有用,通过奇偶校验可检验传输的可靠性。
2.控制器
控制器由程序计数器、指令寄存器、指令译码器、数据地址指针(DPTR)、堆栈指针等组成。其功能是对来自程序存储器中的指令进行译码,通过定时控制电路,在规定的时刻发出各种操作所需的内部和外部的控制信号,使各部分协调工作,完成指令所规定的功能。
1)程序计数器(Program Counter, PC)
PC是一个16位的专用寄存器,并具有自动加1的功能。当CPU要取指令时,PC的内容送到地址总线上,从而指向程序存储器中存放当前指令的单元地址,以便从程序存储器中取出指令,加以分析、执行。同时PC自动加1,指向下一条指令,以保证程序按顺序执行。也可以通过控制转移指令改变PC的值,实现程序的转移。
2)指令寄存器(Instruction Register, IR)
指令寄存器是一个8位寄存器,用于暂存待执行的指令,等待译码。指令译码电路是对指令寄存器中的指令进行译码,将指令转变为执行此指令所需要的电信号,再经定时控制电路定时产生执行该指令所需要的各种控制信号。
3)指令译码器(Instruction Decoder, ID)
指令译码器将指令寄存器中的指令进行译码,产生一定序列的控制信号,完成指令所规定的操作。
4)数据地址指针(DPTR)
数据地址指针(DPTR)是一个16位的专用地址指针寄存器,它由DPH和DPL这两个特殊功能寄存器组成。DPH是DPTR的高8位,DPL是DPTR的低8位。
DPTR用于存放16位地址,可对外部数据存储器RAM 64KB(0000H~0FFFFH)地址空间寻址。
5)堆栈指针(Stack Pointer, SP)
在计算机或单片机中处理子程序调用和中断操作等问题时,通常需要保存返回地址和保护现场信息。在MCS-51单片机中,堆栈用来保存返回地址和保护现场信息,堆栈是在RAM中专门开辟的一个特殊的存储区。堆栈区域的位置就由堆栈指针指定。堆栈的访问原则是先进后出、后进先出,即先进入堆栈的数据后移出堆栈,后进入堆栈的数据先移出堆栈。堆栈一端的地址是固定的,称为栈底;另一端的地址是动态变化的,称为栈顶。堆栈有两种操作方式:数据进栈和数据出栈。进栈和出栈都在栈顶进行。
堆栈主要用来暂时存放数据,有两种情况:一种是CPU自动使用堆栈,当调用子程序或响应中断、处理中断服务程序时,CPU自动将返回地址存放到堆栈中,通过堆栈传递参数。另一种是程序员使用堆栈,用堆栈暂时存放数据。堆栈指针中为栈顶的地址,即指向栈顶。堆栈指针具有自动加1、自动减1功能,当数据进栈时,先自动加1,然后CPU将数据存入;当数据出栈时,CPU先将数据送出,然后自动减1。
Intel公司的MCS-51单片机的存储器体系采用哈佛结构。在MCS-51单片机中,不仅在片内预留了一定容量的程序存储器、数据存储器以及众多的特殊功能寄存器(SFR),而且还具备外部存储器扩展功能,程序存储器和数据存储器的最大寻址空间均可达64KB,寻址和操作简单方便,其存储器结构如图2-5所示。
图2-5 MCS-51单片机存储器结构
由图2-5可见,MCS-51单片机的存储器在物理上设有四个空间,即内部程序存储器、外部程序存储器、内部数据存储器和外部数据存储器。但由于内、外部程序存储器统一寻址,事实上只有3个逻辑空间,即内、外部统一寻址的64KB程序存储器地址空间、内部256B数据存储器地址空间和外部64KB的数据存储器地址空间,通过指令区分访问内部数据存储器还是外部数据存储器。在访问这3个逻辑空间时,应分别采用不同形式的指令,如MOVC(访问程序存储器)、MOV(访问内部数据存储器)和MOVX(访问外部数据存储器)等。内部数据存储器空间在物理上又包含两部分:对于51子系列单片机(如8031),从00H~7FH共128字节是真正的内部RAM空间,而80H~FFH仅其中20余字节用作特殊功能寄存器(SFR)空间,访问其他字节是无意义的;对于52子系列的单片机(如8032或8052),00H~7FH的含义与51子系列相同,而80H~FFH是内部数据存储器高端地址和特殊功能寄存器(SFR)端口地址的重叠区域。
1.程序存储器
程序存储器(Program Memory)主要用于存放应用程序、表格和常数。由于MCS-51单片机采用16位的程序计数器和16位的地址总线,因而程序存储器可扩展的地址空间为64KB,并且这64KB地址在空间分布范围上是连续和统一的。
单片机应用系统中的程序存储器一般采用半导体只读存储器,即ROM。这种存储器在计算机运行时只能对其执行读操作,即使整机掉电后存于其中的信息也不会丢失,显然适合于存放用户程序、常数和表格等。
MCS-51单片机的程序存储器为固定的只读存储器(ROM)。如8051中含有4KB容量的掩膜ROM,8751中含有4KB容量的EPROM,89C51中含有4KB容量的FlashROM。而8031/8032中不设程序存储器,使用过程中必须外扩ROM。
MCS-51单片机的整个程序存储器可以分为内部和外部两部分,CPU访问外部ROM时,PSEN引脚上产生选通信号。CPU读取内/外部的指令由EA引脚所接的电平决定。
(1)当EA引脚接高电平时,CPU可访问内部和外部ROM,并且程序自内部ROM开始执行,PC值超出内部ROM容量时,会自动转向外部ROM中的程序。
(2)当EA引脚接低电平时,总是寻址外部ROM,且从0000H开始编址,系统全部执行外部ROM中的程序。
所以,内部集成了ROM的8051/8751/89C51等单片机正常运行时,EA引脚应接高电平;而内部无ROM的8031/8032等单片机,外部必须扩展足够容量的专用ROM器件,且EA引脚必须接低电平,以迫使单片机运行时只能从外部ROM读取指令。
2.内部数据存储器
MCS-51单片机的内部数据存储器是最灵活的地址空间,由于集成在芯片内部,因此存取速度快、效率高,但数量少,常用于存放运算的中间结果、数据缓冲以及设置特征标志等。内部数据存储器在物理上分为两个不同的功能区,如图2-6所示。
(1)内部数据区:对51子系列(如8031/8051/AT89C51等)为该地址空间的低128B(00H~7FH),对52子系列(如8032/8052/AT89C52等)为全部256B的存储空间(00H~FFH)。内部数据访问与存储使用指令MOV。以AT89C51为例,内部RAM地址00H~1FH分配给R0~R7寄存器组,具体地址分配见表2-5;内部RAM地址20H~2FH的位地址对应关系见表2-6。
(2)特殊功能寄存器(Special Function Register, SFR)区:地址空间的高128字节(80H~FFH)。对于52子系列,高128字节RAM区与SFR区是重叠的,访问时要通过不同的寻址方式加以区别,即访问高128字节RAM区时使用间接寻址方式,而访问SFR区时,则应使用直接寻址方式。对于51子系列,高128字节RAM区仅为SFR区。8051和8052系列单片机的主要特殊功能寄存器符号与含义见表2-7。
图2-6 MCS-51单片机内部RAM结构
表2-5 工作寄存器组(R0~R7)与内部RAM地址对应关系
表2-6 内部RAM地址20H~2FH的位地址对应关系
表2-7 8051和8052系列单片机主要特殊功能寄存器符号与含义
续表
如果将DPTR寄存器拆分为两个独立的8位寄存器DPH和DPL,则MCS-51单片机主要有27个特殊功能寄存器,其中8051系列有11个寄存器具有位寻址功能,8052系列单片机由于扩展了一个定时器/计数器,则有12个寄存器具有位寻址功能,这些寄存器中的每一位都具有位地址,具有定义的位可以直接按位访问,可进行位寻址的SFR的分布见表2-8所列。需要注意的是,PC不占据RAM单元,在物理上是独立的,因此是不可寻址的寄存器。对专用寄存器只能使用直接寻址方式,编写程序的时候既可使用寄存器符号,也可使用寄存器单元地址。内部RAM及特殊功能寄存器各存储单元之间的数据传送用MOV指令。
表2-8 8051和8052系列单片机中可进行位寻址的SFR的分布
续表
注:表2-8中“—”表示该位没有使用,不能用指令进行读写操作;“*”表示该二进制位没有特殊含义,仅仅代表该寄存器的某一个二进制位,可以通过指令读写该位数据。
表2-5中,R0~R7寄存器组在汇编程序中可以通过设置RS1、RS0两个位,将寄存器分配到不同工作寄存器区,不同工作寄存器区的通用寄存器Rn(n=0~7)尽管编号n相同,但具有不同的RAM地址,因此通用寄存器共有8×4=32个。
表2-7中,寄存器T2CON、T2MOD、RCAP2L、RCAP2H、TL2、TH2是8052系列单片机扩展的定时器/计数器2的寄存器,在8051系列单片机中不存在。
由表2-8可知,能够按位访问的SFR其字节地址均为8的倍数,且每个SFR的字节地址为该寄存器最低位的位地址。比如:P2寄存器的字节地址为0A0H,最低位P2.0的位地址也是0A0H。由表2-6和表2-8可知,MCS-51单片机可以按位访问的位地址范围为00H~0F7H,其中位地址0AEH、0BEH、0BFH和0D1H共计4个位单元没有定义,读写操作没有意义;而ET2(0ADH)、PT2(0BDH)和T2CON的8个位适合具备定时器/计数器2的8052系列单片机,8051没有定时器/计数器2,读写操作没有意义。
3.外部数据存储器
由于MCS-51单片机内部数据存储器只有128B,往往不够用,这就需要扩展外部数据存储器。外部数据存储器最多可以扩到64KB,16位数据指针寄存器作为间接寻址的寄存器的地址指针,其寻址范围为64KB。当外部数据存储器小于256B时,可用R1、R0作为间接寻址寄存器的地址指针。访问外部数据存储器或扩展I/O口可用MOVX指令。