第二章 MCS51单片机 2007-12-31 15:31
§2-1 MCS-51单片机内部结构
MCS-51是Intel公司的单片机系列产品,其品种型号繁多,典型产品有 8051, 8031和 8751 三种型号。它们的结构基本相同,其主要差别反映在存储器的配置上有所不同。
8051内部设有4K字节的掩模 ROM程序存储器,
8031片内没有程序存储器
8751是将 8051片内 ROM换成 EPROM。
这里以 8051单片机为例,介绍MCS-51单片机的结构。
1、MCS-51单片机的在片资源
MCS-51单片机是在一块芯片中集成了 CPU、 RAM、 ROM、定时器/ 计数器和多种功能的I/O接口等一台计算机所需要的基本功能部件。单片机内包含下列几个部件:
·一个8位CPU;
·一个片内振荡器及时钟电路;
·4K字节ROM程序存储器:
·128字节RAM数据存储器;
·两个 16位定时器/计数器;
·可寻址 64K外部数据存储器和 64K外部程序存储器空间的控制电路;
·32条可编程的I/O线(四个6位并行I/O端口)
·一个可编程全双工串行口;
·具有五个中断源、两个优先级嵌套中断结构。
8051单片机框图如图2-1所示。各功能部件由内部总线联接在一起。
图中4K(4096)字节的ROM存储器部分用EPROM替换就成为8751;
图中去掉ROM部分就成为8031的结构图。

2、8051的引脚信号
MCS-51单片机都采用 40引脚的双列直播封装方式。图 2-2(A)为引脚排列图,(b)为逻辑符号图。

40条引脚说明如下:
⑴.主电源引脚Vss和Vcc
·Vss 接地。
·Vcc 正常操作时为十5伏电源。
⑵.外接晶体引脚XTAl1和XTAL2
·XTAL1 内部振荡电路反相放大器的输入端,是外接晶体的一个引脚。当采用外部振荡器时,此引脚接地(见图2-3(B))。
·XTAL2 内部振荡器的反相放大器的输出端,是外接晶体的另一端。当采用外部振荡器时,此引脚接外部振荡源。
⑶.控制或与其它电源复用引脚
RST/Vpd,ALE/PROG,PSEN 和EA/Vpp。
·RST/Vpd 当振荡器运行时。在此引脚上出现两个机器同期的高电平(由低到高跳变),将使单片机复位。
在 Vcc掉电期间,此引脚可接上备用电源,由 Vpd向内部 RAM提供备用电源,以保持内部RAM中的数据。
·ALE/PROG 正常操作时为ALE功能(允许地址钱存),提供把地址的低字节锁存到外部锁存器。ALE引脚以不变的频率(振荡周期的1/6)周期性地发出正脉冲信号。因此,它可用作对外输出的时钟,或用于定时目的。但要注意,每当访问外部数据存储器时,将跳过一个 ALE脉冲。 ALE端可以驱动(吸收或输出电流)八个 LSTTL电路。
对于 EPROM型单片机,在 EPROM编程期间,此引脚接收编程脉冲(PROG功能)。
·PSEN 外部程序存储器读选通信号输出端。在从外部程序存储器取指令(或数据)期间;PSEN 在每个机器周期内两次有效。 PSEN 同样可以驱动八个LSTTL输入。
·EA/Vpp EA为内部程序存储器和外部程序存储器选择端。当EA为高电平时,访问内部程序存储器(PC值小于4K)。当EA为低电平时,则访问外部程序存储器。对于EPROM型单片机,在EPROM编程期间,此引脚上加21VEPROM编程电源(Vpp)。
⑷.输入/输出引脚
P0.0~P0.7,P1.0~P1.7,P2.0~P2.7,P3.0~P3.7
·P0.0~P0.7: P0是一个 8位漏极开路型双向 I/O口。在访问外部存储器时,它是分时传送的低字节地址和数据总线。PO口能以吸收电流的方式驱动八个LSTTL负载。
·P1.0~P1.7: P1是一个带有内部提升电阻的 8位准双向 I/O口。它能驱动(吸收或输出电流)四个LSTTL负载。
·P2.0~P2.7: P2是一个带有内部提升电阻的8位准双向I/O口。在访问外部存储器时,它输出高8位地址。P2口可以驱动(吸收或输出电流)四个LSTTL负载。
· P3.0~P3.7:P3是一个带有内部提升电阻的 8位准双向 I/O口。能驱动(吸收或输出电流)四个LSTTL负载。P3口还用于第二功能请参看表2-1。

§2-2 CPU与时钟电路
1、CPU
CPU是单片机的核心部件。它由运算器和控制器等部件组成。
⑴、运算器
运算器的功能是进行算术运算和逻辑运算。可以对半字节(4位)、单字节等数据进行操作。例如能完成加、减、乘、除、加1、减1、BCD码十进制调整、比较等算术运算和与、或、异或、求补、循环等逻辑操作,操作结果的状态信息送至状态寄存器。
8051运算器还包含有一个布尔处理器,用来处理位操作。它是以进位标志位 C为累加器的,可执行置位、复位、取反、等于1转移、等于0转移、等于1转移且清0以及进位标志位与其他可位寻址的位之间进行数据传送等位操作。也能使进位标志位与其他可位寻址的位之间进行逻辑与、或操作。
⑵、程序计数器PC
程序计数器PC用来存放即将要执行的指令地址,共16位,可对64K程序存储器直接寻址。执行指令时, PC内容的低 8位经P0口输出,高 8位经P2口输出。
⑶、指令寄存器
指令寄存器中存放指令代码。CPU执行指令时,由程序存储器中读取的指令代码送入指令寄存器,经译码器泽码后由定时与控制电路发出相应的控制信号,完成指令功能。
2、定时与控制部件
⑴ 时钟电路
8051片内设有一个由反向放大器所构成的振荡电路,XTALl和XTAL2 分别为振荡电路的输入端和输出端。时钟可以由内部方式产生或外部方式产生。

内部方式时钟电路如图2-3(a)所示。在XTAL1 和XTAL2引脚上外接定时元件,内部振荡电路就产生自激振荡。定时元件通常采用石英晶体和电容组成的并联谐振回路。晶体可以在 1.2 MHZ到 12MHZ之间选择,电容值在 5~30 PF之间选择,电容的大小可起频率微调作用。外部方式的时钟电路如图2-3(b)所示,XTALl接地;XTAL2接外部振荡器。对外部振荡信号无特殊要求,只要保证脉冲宽度,一般采用频率低于 12MHZ的方波信号。
时钟发生器把振荡频率两分频,产生一个两相时钟信号从和地供单片机使用。P1在每一个状态S的前半部分有效。P2在每个状态的后半部分有效。
⑵ 时序
MCS-51典型的指令周期(执行一条指令的时间称为指令周期)为一个机器周期,一个机器周期由六个状态(12个振荡周期)组成。每个状态又被分成两个时相P1和P2。所以,一个机器周期可以依次表示为S1P1,S1P2 ,…,S6P1,S6P2。通常算术逻辑操作在P1时相进行,而内部寄存器传送在P2时相进行。

图2-4 给出了8051单片机的取指和执行指令的定时关系。这些内部时钟信号不能从外部观察到,所以用XTAL2振荡信号作参考。在图中可看到,低8位地址的锁存信号ALE在每个机器周期中两次有效:一次在S1P2 与S2P1期间,另一次在S4P2与S5P1期间。
对于单周期指令,当操作码被送入指令寄存器时,便从S1P2开始执行指令。如果是双字节单机器周期指令,则在同一机器周期的S4期间读入第二个字节。若是单字节单机器周期指令,则在S4期间仍进行读,但所读的这个字节操作码被忽略,程序计数器也不加1,在S6P2结束时完成指令操作。图 2-4的(a)和(b)给出了单字节单机器周期和双字节单机器周期指令的时序。
8051指令大部分在一个机器周期内执行完。乘(MUL)和除(DIV)指令是仅有的需要两个以上机器周期的指令,占用4个机器周期。
对于双字节单机器周期指令,通常是在一个机器周期内从程序存储器中读入两个字节,唯有MOVX指令例外。MOVX是访问外部数据存储器的单字节双机器周期指令。在执行MOVX指令期间,外部数据存储器被访问且被选通时跳过两次取指操作。图 2-4中(c)和(d)给出了一般单字节双机器周期指令的时序。
⑶ 复位电路
MCS-51单片机的复位电路如图2-5所示。在RESET(图中表示为RST)输入端出现高电平时实现复位和初始化。在振荡器运行的情况下,要实现复位操作,必须使RST引脚至少保持两个机器周期(24个振荡器周期)高电平。CPU在第二个机器周期内执行内部复位操作、以后每一个机器周期重复一次,直至 RST端电平变低。复位期间不产生 ALE及PSEN信号。

§2-3 存储器组织
MCS-51的存储器结构与常见的微型计算机的配置方式不同,它把程序存储器和数据存储器分开,各有自己的寻址系统、控制信号和功能。程序存储器为只读存储器(ROM),用来存放程序和始终要保留的常数。数据存储器为随机存取存储器(RAM),通常用来存放程序运行中所需要的常数或变量。
从物理地址空间看,MCS-51有四个存储器地址空间,
即:片内程序存储器;片外程序存储器;片内数据存储器;片外数据存储器。MCS-51的存储器结构如图2-6所示。

1、程序存储器
程序存储器用来存放编制好的始终保留的固定程序和表格常数。
程序存储器以程序计数器 PC作地址指针,通过 16位地址总线,可寻址的地址空间为 64K字节。
在 8051/8751片内,分别驻留最低地址空间的4K字节 ROM/EPROM程序存储器(内部程序存储器),而在8031片内,则无内部程序存储器,需外部扩展EPROM 。
MCS-51单片机中,64K字节程序存储器的地址空间是统一的。对于有内部ROM的单片机,在正常运行时,应把EA引脚接高电平,使程序从内部ROM开始执行。当PC值超出内部ROM的容量时;会自动转向外部程序存储器空间。因此外部程序存储器地址空间为1000H~FFFFH。对这类单片机,若把EA接低电平,可用于调试程序,即把要调试的程序放在与内部ROM空间重叠的外部程序存储器内,进行调试和修改。8031单片机无内部程序存储器,地址从 0000H~ FFFFH都是外部程序存储器空间。因此 EA应始终接低电平,使系统只从外部程序存储器中取指。
MCS-51单片机复位后程序计数器 PC的内容为 0000H,因此系统从0000H单元开始取指,并执行程序,它是系统执行程序的起始地址。通常在该单元中存放一条跳转指令,而用户程序从跳转地址开始存放。
2、内部数据存储器
MCS-51单片机的数据存储器无论在物理上或逻辑上都分为两个地址空间,一个为内部数据存储器,访问内部数据存储器用MOV指令;另一个为外部数据存储器,访问外部数据存储器用MOVX指令。
内部数据存储器是最灵活的地址空间,它分成物理上独立的且性质不同的几个区;
00H~7FH(0~127)单元组成的低 128字节地址空间的RAM区;
80H~FFH(128~255)单元组成的高128字节的 RAM区(仅在 8032/8052单片机中有这一区);
128字节地址空间的专用寄存器(又称特殊功能寄存器)区。
在8051,8751和8031单片机中,只有低128字节的RAM区和128字节的专用寄存器区,两区地址空间是相连的,专用寄存器(SFR)地址空间为80H~FFH。注意: 128字节的SFR区中只有26个字节是有定义的,若访问的是这一区中没有定义的单元,则得到的是一个随机数。

内部RAM区中不同的地址区域功能结构如图2-7所示。
其中:
00H~1FH(0~31)共32个单元是四个通用工作寄存器区,每一个区有八个工作寄存器;编号为R0~R7。每一区中R0~R7地址见表2-2。

当前程序使用的工作寄存器区是由程序状态字PSW(特殊功能寄存器,字节地址为D0H)中的D4,D3位(RS1和RS0)来指示的,PSW的状态和工作寄存器区对应关系见表2-3。CPU通过对PSW中的D4,D3位内容的修改,就能任选一个工作寄存器区。这个特点使MCS-51具有快速现场保护功能。如果用户程序不需要四个工作寄存器区,则不用的工作寄存器区单元可以作一般的RAM使用。

内部RAM的20H~2FH为位寻址区域(见表2-4),这16个单元的每一位都有一个位地址,位地址范围为 00H~7FH。位寻址区的每一位都可以视作软件触发器,由程序直接进行位处理。通常把各种程序状态标志、位控制变量设在位寻址区内。同样,位寻址区的RAM单元也可以作一般的数据缓冲器使用。

在一个实际的程序中,往往需要一个后进先出的RAM区,以保存CPU的现场,这种后进先出的缓冲器区称为堆栈。MCS-51的堆栈原则上可以设在内部RAM的任意区域内,但一般设在30H-7FH的范围内。栈顶的位置由栈顶指针SP指出。
3、外部数据存储器
MCS-51具有扩展64K字节的外部数据存储器和 I/O口的能力,这对很多应用领域已足够使用。对外部数据存储器的访问采用MOVX指令,用间接寻址方式,R0,R1和DPTR都可作间址寄存器。
外部数据存储器的扩展见§3.2 数据存储器的扩展。
4、专用功能寄存器
MCS-51单片机内的锁存器、定时器、串行口数据缓冲器以及各种控制寄存器和状态寄存器都是以专用功能寄存器(或称特殊功能寄存器)的形式出现的,它们分散地分布在内部RAM地址空间范围(80H~FFH)内,表 2-5列出了这些专用功能寄存器(SFR)的助记标识符、名称及地址。

其中,凡字节地址可以被8整除的专用功能寄存器都可以位寻址。其位地址见表2-6。

大部分寄存器的应用将在后面有关章节中评述,这里仅作简单介绍。
·累加器ACC
累加器是一个最常用的专用寄存器。大部分单操作数指令的操作取自累加器。很多双操作数指令的一个操作数取自累加器。加、减、乘、除算术运算指令的运算结果都存放在累加器A或AB寄存器对中。指令系统中用A作为累加器的助记符。
·B寄存器
在乘除指令中,用到了B寄存器。乘法指令的两个操作数分别取自A 和B 其结果存放在AB寄存器对中。除法指令中,被除数取自A,除数取自B,商数存放于A,余数存放于B。在其它指令中,B寄存器可作为RAM中的一个单元来使用。
·程序状态字PSW
程序状态字是一个8位寄存器,它包含了程序状态信息。此寄存器各位的含义参见图2-8。

其中PSW.1未用。其它各位说明如下:
·CY(PSW.7)进位标志
在执行某些算术和逻辑指令时,可以被硬件或软件置位或清零。在布尔处理机中它被认为是位累加器;其重要性相当于一般中央处理机中的累加器A 。
· AC(PSW.6)辅助进位标志
当进行加法或减法操作而产生由低4位数(十进制的一个数引向高4位数进位或借位时,AC将被硬件置位,否则就被清零。Ac被用于十进制调整。详见DAA指令。
·FO(PSW.5)标志O
是用户定义的一个状态标记,可以用软件来使它置位或清零,也可以用软件测试FO以控制程序的流向。
·RS1,RS0(PSW.4, PSW.3)寄存器区选择控制位 1和0
可以用软件来置位或清零以确定工作寄存器区。RS1,RS0与寄存器区的对应关系如下:
RS1 RS0
0 0 —— 区 0(00H~07H)
0 1 —— 区 1(08H~0FH)
1 0 —— 区 2(10H~17H)
1 1 —— 区 3(18H~1FH)
·OV(PSW.2) 溢出标志
当执行算术指令时,由硬件置位或清零,以指示溢出状态。当执行加法指令ADD时,若用 C6'表示 D6位向 D7位有进位,用C7'表示D7向进位位有进位,则有:
OV=C6 '⊕C7'
即当位6向位7有进位而位7不向Cy进位时,或位6不向位7进位而位7向CY有进位时;溢出标志OV置位,否则清零。
同样,在执行减法指令SUBB时C6和C7表示有借位。因此,溢出标志在硬件上可以用一个异或门获得。
溢出标志常用于用ADD和SUBB指令对带符号数作加减运算时,OV= 1表示加减运算的结果超出了目的寄存器A所能表示的带符号数(2的补码)的范围(-128~+127),参见第三章中关于 ADD和 SUBB指令的说明。
在MCS-51中,无符号数乘法指令MUL的执行结果也会影响溢出标志。若置于累加器A和寄存器B的两个数的乘积超过255时,OV=1, 否则OV=0。此积的高8位放在B 内,低 8位放在 A内。因此, OV= 0意味着只要从 A中取得乘积即可;否则要从 BA寄存器对中取得乘积。
除法指令DIV也会影响溢出标志。当除数为0时,OV= 1,否则OV=0。
·P(PSW.0)奇偶标志
每个指令周期都由硬件来置位或清0,以表示累加器A中1的位数的奇偶数。若1的位数为奇数,则P置位,否则清0。此标志位对串行通信中的数据传输有重要的意义。在串行通信中常用奇偶校验的办法来检验数据传输的可靠性。在发送端可根据P的值对数据的奇偶位置位或清零。若通信协议中规定采用奇校验的办法,则P=0时,应对数据(假定由A取得)的奇偶位置位;否则就清0。
·栈指针SP
栈指针SP是一个8位专用寄存器。它指示出堆栈顶部在内部RAM中的位置。系统复位后,SP初始化为07H,使得堆栈事实上由08H单元开始。考虑到08H~lFH单元分属于工作寄存器区 1~3,若程序设计中要用到这些区,则最好把SP值改置为 1FH或更大的值。SP的初始值越小,堆栈深度就可以越深。堆栈指针的值可由软件改变,因此堆伐在内部 RAM中的位置比较灵活。
除用软件直接改变SP值外,在执行PUSH,POP指令,各种子程序调用,中断响应,子程序返回(RET)和中断返回(RETI)等指令时,SP值将自动增量或减量。
·数据指针DPTR
数据指针DPTR是一个16位专用寄存器,其高位字节寄存器用DPH表示;低位字节寄存器用 DPL 表示。既可以作为一个 16位寄存器 DPTR来处理,也可以作为两个独立的8位寄存器DPH和DPL来处理。DPTR主要用来存放16位地址,当对 64KB外部数据存储器空间寻址时,可作为间址寄存器用。
传送指令有下列两条:
MOVX A,@DPTR
MOVX @DPTR,A
在访问程序存储器时,DPTR可用作基址寄存器,有一条采用基址个变址寻址方式的指令MOVX A,@A + DPTR,常用于读取存放在程序存储器内的表格常数。
·端口P0~P3
专用寄存器P0,P1,P2和P3分别是 I/O 端口P0~P3的锁存器。P0~P3作为专用寄存器还可用直接寻址方式参与其它操作指令。
·串行数据缓冲器SBUF
串行数据缓冲器 SBUF用于存放欲发送或已接收的数据,它实际上由两个独立的寄存器组成,一个是发送缓冲器,另一个是接收缓冲器。当要发送的数据传送到SBUF时,进的是发送缓冲器。当要从SBUF读数据时,则取自接收缓冲器,取走的是刚接收到的数据。
·定时器/计数器
MCS-51系列中有两个16位定时器/计数器T0和T1。它们各由两个独立的 8位寄存器组成,共有四个独立的寄存器:TH0,TL0,TH1 ,TL1。可以对这四个寄存器寻址,但不能把T0,T1 当作一个16位寄存器来寻址。
·其它控制寄存器
IP,IE,TMOD,TCON,SCON和PCON寄存器分别包含有中断 系统、定时器/计数器、串行口和供电方式的控制和状态位,这些寄存器将在本章有关节中叙述。
§2-4 并行I/O端口
MCS-51单片机设有四个 8位双向 I/O端口(P0, P1, P2,P3),每一条 I/O线都能按位编程设置,独立地用作输入或输出。它们都被定义为特殊功能寄存器,可以进行位寻址,也可按字节寻址。
P0口为三态双向口,能带8个LSTTL 电路,作为一般的I/O口使用时,P0口也是一个准双向口。P1,P2,P3口为准双向口(用作输入线时,口锁存器必须先写入“1”,故称为准双向口),负载能力为 4个LSTTL电路。
接口名 字节地址 位地址 负载能力
P0 80H 80H-87H 8个LSTTL 电路
P1 90H 90H-97H 4个LSTTL 电路
P2 A0H A0H-A7H 4个LSTTL 电路
P3 B0H B0H-B7H 4个LSTTL 电路
1、端口功能
·P0口 ① 作为输入输出口,
② 作为地址/数据总线口,即低8位地址与数据线分时使用P0口。低8位地址由ALE信号的负跳变使它锁存到外部地址锁存器中;而高8位地址由P2口输出。
·P1口 P1口每一位都能作为可编程的输入或输出线。
·P2口 ① 作为输入口或输出口使用
②外接 I/O设备时,又作为扩展系统的地址总线,输出高 8位地址,与P0口一起组成 16位地址总线。对于 8031单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连试。
·P3口 ① 作为第一功能使用时,其功能同P1口。
② 当作第二功能使用时;每一位功能定义如表2-7所示。

2、端口结构与操作
四个端口的功能有所不同,所以它们的电路结构也不完全一样;但工作原理基本相似。图 2-9表示四个端口每一个典型位的功能图解。

⑴.P0口
其中包含一个输出锁存器、两个三态缓冲器、一个输出驱动电路和一个输出控制电路。输出驱动电路由两个场效应管T1和T2组成,其工作状态受输出控制电路的控制。控制电路包括一个与门、一个反相器和模拟转换开关MUX。模拟开关的位置由来自CPU的控制信号决定。
当控制信号为低电平时,它把输出级与锁存器的Q端接通。同时,因为与门输出为低电平,输出级中的场效应管T1处于截止状态,因此输出级是漏极开路的开漏电路。这种情况P0口可用作一般的I/O线。
其输出和输入操作如下:
当CPU向端口输出数据时,写脉冲加在触发器的时钟端CL上,此时与内部总线相连的D端的数据经反向后出现在 Q端上,再经T2管反相,于是在P0口这一位引脚上出现的数据正好是内部总线上的数据(当P0口作输出口使用时;输出级属开漏电路,在驱动NMOS电路时应外接上拉电阻。)
当输入操作时,端口中的两个三态缓冲器用于读操作。图中下面一个缓冲器用于读端口引脚的数据。当执行一般的端口输入指令时,读引脚脉冲把三态缓冲器打开,于是端口上的数据将经过缓冲器输送到内部总线;上面一个缓冲器读取锁存器中Q端的数据。Q端的数据实际上与引脚处的数据是一致的,结构上的这种安排是为了适应所谓“读- 修改- 写”这类指令的需要。这类指令的特点是:先读端口,随之可以对读入的数据进行修改,然后再写到端口上。例如,逻辑与指令(ANL P0,A),此指令的功能是先把P0口的数据读入CPU,随后同累加器A中的数据接位进行逻辑与操作(即对读入的数据作修改)最后把结果写回P0口。
对于“读- 修改- 写”这类指令,不直接读引脚上的数据而读锁存器Q端上的数据是为了避免可能错读引脚上的电平信号。例如,用一条口线去驱动一个晶体管的基极,当向此口线写1时,晶体管导通并把引脚上的电平拉低。这时,若从引脚上读取数据,就把该数错读为0(实际上应是1),而从锁存器Q端读入,则得到正确的结果。
由图2-9(a)可知,当该引脚操作(输入)时,引脚上的外部信号既加在三态缓冲器2的输入端上,又加在输出级场效应管(T2)的漏极上,若此时T2是导通的(例如曾输出过数据0)。则引脚上的电位被钳在0电平上。为使引脚上输入的逻辑电平能正确地读入,在输入数据时,要先向锁存器写入使其Q端为0,使输出级T1和T2两个管子均被截止,引脚处于悬浮状态;作高阻抗输入。因此,作为一般的I/O口使用时,Po口也是一个准双向口。
当P0口作为地址/数据总线分时使用时,这时控制信号为高电平;转换开关MUX把反相器输出端与T2接通,同时把与门开锁。输出的地让或数据信号通过与门驱动T1管,同时通过反相器驱动T2管,完成信息传送。
⑵. P1口
P1口是一个准双向口,作通用的I/O口使用。其结构如图2-9(b)所示,在输出驱动部分接有内部提升电阻。当用作输出线时,将1写入锁存器,使输出驱动器T管截止,输出线由内部提升电阻拉成高电平(输出1);将0写入锁存器时,T导通,输出0。P1口作为输入线时,必须先将1写入锁存器,使T截止;把该口线由内部提升电阻拉成高电平。于是,当外部输入为高电平信号时,该口线为1;输入为低电平信号时,该口线为0,使输入端的电平随输入信号而变,读入正确的数据信息。P1口作为输入时,可被任何TTL电路和MOS电路所驱动。
由于具有内部提升电阻,也可以直接被集电极开路或漏极开路的电路驱动而不必外加提升电阻。
CPU读P1口有两种情况:读引脚和读锁存器状态。读引脚时,打开三态门2,读入引脚上的输入状态(如 MOV A, P1指令);读锁存器状态时,打开三态门1。与P0口的I/O功能一样;Pl口可以进行“读- 修改- 写”操作。
⑶.P2口
P2口为准双向口。每一位的结构如图 2-9中的(c)所示。P2口可以作为通用 I/O口使用,外接 I/O设备;也可以作为扩展系统时的地址总线口(输出高 8位地址),由控制信号控制转换开关来实现。当转换开关(MUX)倒向左边时,P2口作通用的I/O口使用,作用和P1口相同。当作为地址总线口使用时,MUX在CPU的控制下倒向右边,从而在P2口的引脚上输出地址(A5-A8)。P2口的地址信息来源于PCH, DPH。对于8031单片机来说,P2口通常 只作为地址总线口使用,而不作I/O口线直接与外部设备连接。
⑷. P3口
P3口为双功能口,其每一位的结构如图2-9中的(d)所示。当它作为第一功能口(通用的I/O口)使用时,工作原理与P1口和P2口类似,但第二输出功能线保持为高电平,使与非门3对锁存器输出端(Q 端)是畅通的(与非门3的输出只取决于Q的状态)。
当P3口作为第二功能使用时,相应位的锁存器必须为“1”状态,使与非门3的输出电平由第二输出功能线的状态来确定,或使此口线允许输入第二功能信号。对P3口不管是作通用输入口或作第二功能输入口,相应位的锁存器和第二输出功能端都必须为1。
在P3口的引脚信号输入通道中有两个缓冲器2和4,第二输入功能信号取自缓冲器4的输出端,通用输入信号取自缓冲器2的输出端。
§2-5 定时器/计数器
MCS-51单片机内部有两个16位可编程的定时器/计数器,即定时器和定时器T0(8052提供3个,这第三个称为定时器T2)。它们既可用作定时器方式,又可用作计数器方式。
1、基本结构
定时器/计数器的基本结构如图2-10所示。基本部件是两个8位的计数器(其中TH1,TL1是T1的计数器, TH0,TL0是T0的计数器)。

在作定时器使用时,输入的时钟脉冲是由晶体振荡器的输出经12分频后得到的,所以定时器也可看作是对计算机机器周期的计数器(因为每个机器周期包含12个振荡同期,故每一个机器周期定时器加1,可以把输入的时钟脉冲看成机器周期信号)。故其频率为晶振频率的1/12。如果晶振频率为 12 MHz,则定时器每接收一个输入脉冲的时间为1us。
当它用作对外部事件计数时,接相应的外部输入引脚T0(P3.4)或T1(P3.5)。在这种情况下,当检测到输入引脚上的电平由高跳变到低时,计数器就加1(它在每个机器周期的S5P2时采样外部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,则计数器加l)。加1操作发生在检测到这种跳变后的一个机器周期中的S3P1,因此需要两个机器周期来识别一个从“1”到“0”的跳变,故最高计数频率为晶振频率的1/24。这就要求输入信号的电平要在跳变后至少应在一个机器周期内保持不变;以保证在给定的电平再次变化前至少被采样一次。
定时器/计数器有四种工作方式,其工作方式的选择及控制都由两个特殊功能寄存器(TMOD和TCON)的内容来决定。用指令改变TMOD或TCON内容后,则在下一条指令的第一个机器周期的S1P1时起作用。
2、两个特殊功能寄存器
⑴、定时器的方式寄存器 TMOD
特殊功能寄存器TMOD为定时器的方式控制寄存器;寄存器中每位的定义如图2-11所示。高4位用于定时器1,低4位用于定时器0。

其中:·M1、M0 用来确定所选的工作方式,如表2-8所示。

·C/T 定时器方式或计数器方式选择位。C/T=1 时,为计数器方式;
C/T=0 时,为定时器方式。
·GATE 定时器/计数器运行控制位,用来确定对应的外部中断请求引脚(INT0,INT1)是否参与T0或T1的操作控制。
当GATE=0时,只要定时器控制寄存器TCON中的TR0(或TR1)被置1时,T0(或T1)被允许开始计数(TCON各位含义见后面叙述);
当GATE=1时,不仅要TCON中TR0或TR1置位;还需要P3口的INT0或INTl引脚为高电平;才允许计数。
⑵、定时器控制寄存器TCON
特殊功能寄存器 TCON用于控制定时器的操作及对定时器中断的控制。其各位定义如图2-12所示。其中D0~D3位与外部中断有关,在中断系统一节中介绍。

·TR0,T0的运行控制位。该位置1或清0用来实现启动计数或停止计数。
·TF0,T0的溢出中断标志位。当T0计数溢出时由硬件自动置1;在CPU中断处理时由硬件清为0;
·TR1,T1的运行控制位,功能同TR0。
·TF1,T1的溢出中断标志位,功能同TF0。
TMOD和TCON寄存器在复位时其每一位均清零。
3、工作方式
如前所述,MCS-51 片内的定时器/计数器可以通过对特殊功能寄存器TMOD中的控制位C/T的设置来选择定时器方式或计数器方式;通过对M1M0两位的设置来选择四种工作方式,现以T0为例加以说明。
⑴.方式0
当M1;M0设置为0时,定时器选定为方式0工作。在这种方式下,16位寄存器只用了13位,TL0的高三位未用。由TH0的8位和TL0的低5位组成一个13位计数器。工作方式0的逻辑图如图2-13所示;

当GATE=0时,只要TCON中的TR0为1,TL0及TH0组成的13位计数器就开始计数:当GATE=1时,此时仅TR0=1仍不能使计数器计数,还需要INT0引脚为1才能使计数器工作。由此可知,当GATE=1和TR0=1时,THO和TL0是否计数取决于INT0引脚的信号,当INT0已由0变1时,开始计数;当INT0由1变0时,停止 计数,这样就可以用来测量在INT0端出现的脉冲宽度。
当13位计数器加1到全“1”以后,再加1就产生溢出。这时,置TCON的TF0位为1;同时把计数器变为全“0”。
⑵.方式1
方式1和方式0的工作相同,唯一的差别是TH0和TL0组成一个16位计数器(见图2-14)。

⑶. 方式2
方式2把TL0配置成一个可以自动恢复初值(初始常数自动重新装入)的8位计数器,TH0作为常数缓冲器,如图2-15所示。TH0由软件预置值;当TL0产生溢出时,一方面使溢出标志TF0置1,同时把TH0中的8位数据重新装入TL0中。

方式2常用于定时控制。例如希望每隔250us 产生一个定时控制脉冲,则可以采用12MHz的振荡器,把TH0预置为6,并使C/T=0就能实现。方式2还用作串行口波特率发生器。
⑷. 方式3
方式3对定时器T0和定时器T1是不相同的。若T1设置为方式3,则停止工作(其效果与TR1=0相同)。所以方式3只适用于T0。
方式3使MCS-51具有三个定时器/计数器(增加了一个附加的8位定时器/计数器)。当T0设置为方式3时,将使TL0和TH0成为两个相互独上的8位计数器,如图2-16所示。

由图可见,TL0利用了T0本身的一些控制(C/T,GATE,TR0,INT0和TF0),它的操作与方式0和方式1类似。而TH0被规定为只用作定时器功能,对机器周期计数,并借用了T1的控制位TR1和TF1。在这种情况下THO控制了T1的中断。这时T1还可以设置为方式0~2,用于任何不需要中断控制的场合,或用作串行口的波特率发生器。
通常;当TI用作串行口波特率发生器时,T0才定义为方式3以增加一个8位计数器。
4、定时器/计数器的应用
⑴. 可编程接口的特征
① 提供多种工作方式可供选择。
② 按约定的规则,向有关控制寄存器写入控制字,即可选定一种工作方式。
⑵. 使用可编程接口的要素
① 要弄清如何选择工作方式
② 要弄清有关控制寄存器各控制位的功能,以便写入控制字。
③ 在用户程序中设置相应的指令,以预置控制字,达到选择工作方式的目的。
⑶. MCS51定时器/计数器的使用要素
① 选择计数脉冲源
即选定:定时器方式还是计数器方式
② 选择工作方式
即选定:方式0、方式1、方式2、方式3
③ 选择启停的操作方式。
④ 对计数器置初值。
⑤ 若要使用中断,还要作相应的中断设置。
⑷.计数器方式时间常数计算
设 T0为方式2工作时(自动装入时间常数的8位计数器),在外界发生一次事件时产生中断请求。
时间常数的计算:
方式2工作时,当计数到28时计数器就产生溢出。设时间常数值为 X,当发生一次外界事件时就溢出;则
X+1= 28
X= 28-1 = 11111111=FFH
⑸.定时器方式时间常数计算
设方式0工作时,定时时间为 lms,时钟振荡频率为 6 MHz,
计算:1个机器周期为:
12 × 1/f= 12 ×(1/6MHz)× 10- 6=2us
设时间常数为X,则
(213-X)×2us = lms = 1000us
X= 213-500= 7692
化成二进制数为:
X = 1111 0000 0 1100
F 0 0 C
根据 13位定时器/计数器特性,高8位 F0H送至 TH0;低 5位 0CH送 TL0,可用下列指令实现:
MOV TL0,#0CH ;低 5位送 TL0寄存器
MOV TH0,#0F0H ;高8位送TH0寄存器
⑹.定时器/计数器初始化程序举例
设T1作定时器,以方式1工作,定时时间为 10 ms ; T0作计数器,以方式 2工作,外界发生一次事件即溢出。T1的时间常数为:
(210一 X)* 2 us= 10 ms
X= EC78H
初始化程序:
MOV TMOD,#16H ;T1定时方式1,T0计数方式2,
即置TMOD寄存器的内容为 00010110
MOV TL0,#0FFH ;此时间常数送TL0
MOV TH0,#0FFH ;T0时间常数送 TH0
MOV TL0, #78H ;T1时间常数(低 8位)送 TL0
MOV TH1,#0ECH ;T1时间常数(高 8位)送TH1。
SETB TR0 ;置 TR0为 1允许T0启动计数
SETB TR1 ;置TR1 为1允许T1启动计数
§2-6 串行接口
MCS-51单片机内部的串行接口是全双工的,即它能同时发送和接收数据。发送缓冲器只能写入不能读出;接收缓冲器只能读出不能写入。串行口还有接收缓冲作用,即从接收寄存器中读出前一个已收到的字节之前就能开始接收第二字节。
1、结构
在串行口的内部,设置有发送和接收电路,分别完成发送和接收的操作。其硬件结构简化图见图2-17。

发送部分主要有发送数据缓冲寄存器、发送控制逻辑等组成。发送数据时,由一条写SBUF指令(例:MOV SBUF, A)将待发数据输入发送数据缓冲器,同时启动一次发送。数据按规定格式发送完后,将自动将SCON(串行控制寄存器)中的TI位置“1”,同时发出中断请求。
接收部分主要有接收数据缓冲器、移位寄存器和接收控制逻辑等组成。接收时,在接收控制逻辑的作用下,按确定的波特率进行移位操作。将RXD脚输入的状态逐位移入移位寄存器中,待接收完一个字节的数据后,自动将其并行地装入接收缓冲寄存器中,同时将SCON中的RI置“1”,发出中断请求。
在读SBUF之前,允许再接收,若新的数据接收完仍未读取,将自动刷新。
串行口发送/接收完一个字节数据后,都会发出中断请求,CPU相应串行口中断时,并不知道是RI还是TI发出的请求,因此,在中断服务程序中,首先应测试RI和TI的状态,以便作相应的处理。
2、与串行I/O口有关的特殊功能寄存器
⑴. SBUF (串行口数据缓冲器)
两个串行口数据缓冲器(实际上是两个寄存器)通过特殊功能寄存器SBUF来访问。写入SBUF的数据储存在发送缓冲器,用于串行发送;从SBUF读出的数据来自接收缓冲器。两个缓冲器共用一个地址 99H(特殊功能寄存器 SBUF的地址)。
⑵. SCON (串行口控制寄存器 )
特殊功能寄存器SCON用于定义串行口的操作方式和控制它的某些功能。其字节地址:为 98 H。寄存器中各位内容如图2-18。

·SM0,SM1 串行口操作方式选择位
两个选择位对应于四种状态,所以串行口能以四种方式工作,(UART ---异步通讯口)见表2-9。

· SM2 允许方式 2和 3的多机通信使能位
在方式 2或 3中,若 SM2 置为1。接收到的第 9位数据( RB 8)为 0,则接收中断标志 RI不会被激活。
在方式 1中,若 SM2=1,则只有收到有效的停止位时才会激活RI 。
在方式0中 SM2 必须置为0。
·REN 允许串行接收位。
由软件置位或清零,使允许接收或禁止接收。
·TB8 是在方式 2 和3中要发送的第 9位数据可按需要由软件置位或复位。
·RB8 是方式2和3中已接收到的第9位数据。
在方式1中,若SM2=0 RB8是接收到的停止位,
在方式0中,不使用RB8位。
·TI 发送中断标志。
在方式0中当串行发送完第8位数据时由硬件置位;
在其他方式中,在发送停止位的开始时由硬件置位。当TI=1时,申请中断,CPU相应中断后,发送下一帧数据。在任何方式中,该位都必须由软件清0。
·RT 接收中断标志
在方式0中串行接收到第8位结束时由硬件置位。
在其他方式中,在接收到停止位的中间时刻由硬件置位。RI=1时申请中断,要求CPU取走数据。但在方式1中,当SM2=1时,若未接收到有效的停止位,则不会对RI置位。
在任何工作方式中,该位都必须由软件清0。在系统复位时,SCON中的所有位都被清0。
⑶.PCON(功耗控制寄存器)中的波特率选择位
PCON是一个特殊功能寄存器(如图2-19所示),没有位寻址功能,字节地址为87H。

其中D7位(SMOD)为波特率选择位。其他均无意义。复位时的SMOD值为0。可用 MOV PCON, #80H或 MOV 87H, #80H指令使该位置 1。
当 SMOD= 1时;在串行口方式1,2或3情况下,波特率提高一倍。
3、串行接口工作方式
串行口的操作方式由SM0,SM1定义。
⑴. 串行口的工作方式0
------为移位寄存器输入输出方式,可外接移位寄存器,以扩展I/O口,也可外接同步输入输出设备。
格式:一次收发过程,收发8位二进制数,低位在前,逐位收发,在TXD引脚输出移位时钟。
收发波特率固定为单片机振荡频率的1/12。
方式0输出(发送)
串行数据通过RXD引脚输出,而在TXD引脚输出移位时钟,作移位脉冲输出端。
发送条件:当一个数据写入串行口数据缓冲器时;就开始发送。
发送过程:发送控制器送出移位信号,使发送移位寄存器的内容右移一位。直至最高位(D7位)数字移出后,停止发送数据和移位时钟脉冲。完成了发送一帧数据的过程,并置TI为1。就申请中断。若CPU响应中断,则从0023H单元开始执行串行口中断服务程序。
方式0输入(接收)
当串行口定义为方式0输入时,RXD端为数据输入端,TXD端为同步脉冲信号输出端。接收器以振荡频率的1/12的波特率接收RXD端输入的数据信息。
接收条件:REN(SCON.4)为串行口接收器允许接收控制位。
当REN=0 时,禁止接收;REN=1,允许接收。
当串行口置为方式0,且满足REN=1和RI(SCON.0)=0的条件时,就会启动一次接收过程。
接收过程:在机器周期的S6P2时刻,接收控制器向输入移位寄存器写入11111110,并使移位时钟由TXD端输出。从RXD端(P3.0引脚)输入数据,同时使输入移位寄存器的内容左移一位,在其右端补上刚由RXD引脚输入的数据。这样,原先在输入移位寄存器中的1就逐位从左端移出,而在RXD引脚上的数据就逐位从右端移入。当写入移位寄存器中的最右端的一个 0移到最左端时,其右边已经接收了 7位数据。这时,将通知接收控制器进行最后一次移位并把所做收的数据装入SBUF。在启动接收过程开始后的第 10个机器周期的S1P1时刻,SCON中的RI位被置位、从而发出中断申请。至此,完成了一帧数据的接收过程。
若CPU响应中断,就会执行由0023H作为入口地址的中断服务程序。
方式0主要用于使用CMOS或TTL移位寄存器进行I/O扩展的场合。见图2-20。

方式0发送或接收完8位数据后由硬件置位发送中断标志TI或接收中断标志RI。但CPU响应中断请求转入中断服务程序时并不清TI或RI。因此,中断标志TI或RI必须由用户在程序中清0(可用CLR TI或CLR RI ;也可以用ANL SCON,#0FEH或ANL SCON,#0FDH 等指令)。以方式0工作时SM2位(多机通信控制位)必须为“0”。
⑵.方式1.
串行口工作于方式 1时,被控制为波特率可变的8位异步通信接口。
格式:传送一帧信息为10位,即1位起始位(0),8位数据位(低位在先)和1位停止位(1)。数据位由TXD发送,由RXD接收。
波特率是可变的,取决于定时器1或2的溢出速率。
方式1 发送
发送条件:CPU执行任何一条以SBUF为目标寄存器的指令。就启动发送。
发送过程:先把起始位输出到TXD,然后把移位寄存器的输出位送到TXD。接着发出第一个移位脉冲(SHIFT),使数据右移一位,并从左端补入0。此后数据将逐位由TXD端送出;而其左面不断补入0。发送完数据位时,置位中断标志位TI。
方式1接收
接收条件:串行口以方式1输入时,当检测到RXD引脚上有1到O的跳变时开始接收过程,并复位内部 16分频对数器,以实现同步。
计数器的 16个状态把l位时间等分成16份,并在第 7,8,9个计数状态时采样RXD的电平,因此每位数值采样三次,当接收到的三个值中至少有两个值相同时,这两个相同的值才被确认接收。这样可排除噪声干扰。如果检测到起始位的值不是0,则复位接收电路,并重新寻找另一个l到0的跳变。
接收过程:当检测到起始位有效时,才把它移入移位寄存器并开始接收本帧的其余部分。一帧信息也是10位;即 1位起始位,8位数据位(先低位),1位停止位。在起始位到达移位寄存器的最左位时,它使控制电路进行最后一次移位。
在产生最后一次移位脉冲时能满足下列两个条件;
① RI = 0、
② 接收到的停止位为1或SM2= 0时
停止位进入RB8,8位数据进入SBUF、且置位中断标志RI。
如果上述两个条件中任何一个不满足。将丢失接收的帧。中断标志RI必须由用户在中断服务程序中清0。通常串行口以方式1 工作时, SM2 置为“0”。
⑶ 方式2和方式3
串行口工作于方式2和方式3时,被定义为9位的异步通信接口。
格式:发送(通过TXD)和接收(通过RXD)一帧信息都是 11位: 1位起始位(0), 8位数据位(低位在先),1位可编程位(即第9位数据)和1位停止位(1)。
方式2和方式3的工作原理相似,唯一的差别是方式2的波特率是固定的。为fosc/32或fosc/64;方式3的波特率是可变的,利用定时器1或定时器2作波特率发生器。
方式2和方式3发送
发送条件:方式2和方式3的发送过程是由执行任何一条以SBUF作为目的寄存器的指令来启动的。由“写入SBUF”信号把8位数据装入SBUF、同时还把TB8装到发送移位寄存器的第9位位置上(可由软件把TB8赋予 0或1)。并通知发送控制器要求 进行一次发送。
发送过程:发送开始,把一个起始位(0)放到TXD端。经过一位时间后,数据由移位寄存器送到TXD端。通过第一位数据,出现第一个移位脉冲。
在第一次移位时,把一个停止位“1”由控制器的停止位送入移位寄存器的第9位。此后,每次移位时;把0送入第9位。
因此,当TB8的内容移到移位寄存器的输出位置时;其左面一位是停止位“1”,再往左的所有位全为0。这种状态由零检测器检测到后,就通知发送控制器作最后一次移位,然后置TI=1,请求中断。
第9位数据(即SCON中的TB8的值)由软件置位或清0,可以作为数据的奇偶校验位,也可以作为多机通信中的地址、数据标志位。如果把 TB8作为奇偶校验位;可以在发送中断服务程序中、在数据写入SBUF之前,先将数据的奇偶位写入TB8。
方式2和方式3接收
方式2和3的接收条件和接收过程与方式1 类似。
数据从RXD端输入;接收过程由RXD端检测到负跳变时开始(CPU对RXD不断采样,采样速率为所建立的波特率的18倍)。当检测到负跳变,16分频计数器就立即复位,同时把1FFH写入输入移位寄存器。计数器的16个状态把一位时间等分成16份,在每一位的第7、8、9个状态时,位检测器对RXD端的值采样。如果所接收到的起始位不是0,则复位接收电路,等待另一个负跳变的来到。若起始位有效(=0),则起始位移入输入移位寄存器,并开始接收这一帧的其余位。当起始位0移到最左面时,通知接收控制器进行最后一次移位,把8位数据装入接收缓冲器,第9位数据装入SCON中的RB8、并置中断标志RI=1。数据装入接收缓冲器和RB8,并置位RI。只在产生最后一个移位脉冲时,并且要满足下列条件: RI=0 SM2=0 接收到的第9位数据为1时,才会进行。如果不满足上述条件接收到的数据信息就会丢失,而且中断标志:RI不置1。
请注意与方式1的区别。 在方式2和3中装入RB8的是第9位数据,而不是停止位(方式1中装入的是停止位)。所接收的停止位的值可用于多机处理(多机通信中的地址/数据标志位),也可作奇偶校验位。
⑷.多机通信
如前所述,串行口以方式 2或 3接收时,若 SM2 (串行口控制寄存器 SCON中的 SM2 为多机通信控制位)为1。则只有当接收器收到的第9位数据为1时,数据才装入接收缓冲器,并将中断标志RI置“1”,向CPU发中断申请;如果接收到的第9位数据为0。则不产生中断标志;信息将丢失。而当SM2为0时,则接收到一个数据字节后,不管第9位数据是1还是0,都产生中断标志(RI=1),接收到的数据装入接收缓冲器。
利用这个特点,可实现多个 MCS-51之间的通信。
从机系统由从机的初始化程序(或相关的处理程序)将串行口编程为方式2或方式3接收,且置SM2为1,允许串行口中断。
当主机要发送一数据块给从机时,它先送出一地址字节,以辨认目标从机。地址字节与数据字节可用第9位来区别,发出地址信息时第 9位为 1,发数据(包括命令)信息时第9位为0,当主机发送地址时,各从机的串行口接收到第9位信息(RB8)为1,则把中断标志RI置“1”。这样,使每一台从机都检查一下所接收到的主机发送来的地址是否与本机相符。若为本机地址,则清除SM2(=0),并准备接收即将来到的数据〔或命令)。没有被寻址的从机,则保持SM 2= 1状态,这些从机将不理睬进入到串行口的数据字节。
在主机发送数据时;各从机串行口接收到 RB8为0信息。只有被寻址的从机(已清 SM 2)激活中断标志RI,接收主机的数据(或执行主机的命令),实现和主机的信息传送。其余从机因SM2≠0 ,且第9位 RB8为0,不满足接收数据的条件,即将所接收到的数据丢失。
4、波特率
串行口每秒钟发送(或接收)的位数称为波特率。假设发送一位数据所需要的时间为T,则波特率为 1/T。
串行口以方式0工作时,波特率固定为振荡器频率的1/12。为方式2时波特率为振荡器频率的1/64或1/32。它取决于特殊功能寄存器PCON中的SMOD位的状态。如果SMOD=0 (复位时SMOD=0)。波特率为振荡器频率的1/64。如果SMOD= 1,波特率为振荡器频率的1/32。
方式1 和3的波特率由定时器1的溢出率所决定。当定时器1作波特率发生器时,波特率由下式确定:
波特率= (定时器1溢出率)/ n
式中:定时器1溢出率= 定时器1的溢出次数/ 秒,n为32或16,取决于特殊功能寄存器PCON中的 SMOD位的状态。
若 SMOD=0,则 n=32,
若 SMOD=1,则 n=16。
对于定时器的不同工作方式,得到的波特率的范围是不一样的,这主要由定时器1的计数位数不同所决定。对于非常低的波特率,应选择16位定时器方式(即TMOD.5=0,TMOD.4=1),并且在定时器1中断程序中实现时间常数重新装入。在这种情况下,应该允许定时器1中 断(IE.3=1)。
在任何情况下,如果定时器1的C/T=0,则计数率为振荡器频率的1/12。若C/T=1 ,则计数率为外部输入频率,它的最大可用值为振荡器频率的1/24。
§2-7 中断系统
1、中断请求源和中断请求标志
⑴.中断请求源
MCS-51中断系统可用图2-21来表示。

五个中断源是:
·INT0 来自P3.2引脚上的外部中断请求(外中断0)。
·INT1 来自P3.3引脚上的外部中断请求(外中断l)。
·T0 片内定时器/计数器0溢出(TF0)中断请求。
·T1 片内定时器/计数器 1溢出 (TF1)中断请求。
·RI + TI 片内串行口完成一帧发送或接收中断请求源TI或RI。
⑵. 中断请求标志
每一个中断源都对应有一个中断请求标志位,它们设置在特殊功能寄存器TCON和 SCON中。当这些中断源请求中断时,分别由TCON和SCON中的相应位来锁存。
① 定时器/计数器的中断请求标志
TCON是定时器/计数器0和1(T0,T1)的控制寄存器,它同时也用来锁存T0,T1的溢出中断请求源和外部中断请求源,TCON寄存器中与中断有关的位如图2-22所示。

其中:
·TF1 定时器/计数器1(T1)的溢出中断标志。
当T1从初值开始加1计数到产生溢出时;由硬件使TF1置“1”,直到CPU响应中断时由硬件复位。
·TF0 定时器/计数器0(T0)的溢出中断标志。其作用同 TF1 。
·IE1 外中断 1中断请求标志。
如果 IT1= 1,则当外中断 1引脚 INT1 上的电平由 1变0时,IE由硬件置位,外中断1 请求中断;在CPU响应该中断时由硬件清0。
·ITl 外部中断1(INTl)触发方式控制位。
如果ITl为1,则外中断1为跳变触发方式(CPU在每个机器周期的S5P2采样 INT1(P3.3)的输入电平,如果在一个周期中采样到高电平,在下个周期中采样到低电平,则硬件使IEl置1,向 CPU请求中断);
如果IT1为0,则外中断1为电平触发方式。此时外部中断是通过检测INT1端的输入电平(低电平)来触发的。采用电平触发时,输入到INTI的外部中断源必须保持低电平有效,直到该中断被响应。同时在中断返回前必须使电平变高,否则将会再次产生中断。
·IE0 外中断 0中断请求标志。
如果 IT0置 1,则当 INT0上的电平由 1变 0时,IE0由硬件置位。在CPU把控制转到中断服务程序时由硬件使IE0复位。
·IT0 外部中断源0触发方式控制位。其含义同IT1。
② 串行口的中断请求标志
串行口控制寄存器SCON中的低2位用作串行口中断标志,如图2-23所示。

其中:
RI 串行口接收中断标志。
在串行口方式0中,每当接收到第8位数据时,由硬件置位RI;
在其他方式中,当接收到停止位的中间位置时置位RI。
注意,当CPU转入串行口中断服务程序入口时不复位 RI,必须由用户用软件来使 RI清0。
TI 串行口发送中断标志。
在方式0中,每当发送完8位数据时由硬件置位TI;
在其他方式中,于停止位开始时置位。TI也必须由软件来复位。
2、中断控制
⑴.中断允许和禁止
在 MCS-51中断系统中,中断允许或禁止是由片内的中断允许寄存器 IE (IE为特殊功能寄存器)控制的,IE中的各位功能如图2-24。

其中:
·EA CPU 中断允许标志。
EA= 0, CPU 禁止所有中断,即 CPU屏蔽所有的中断请求;
EA= 1,CPU 开放中断。但每个中断源的中断请求是允许还是被禁止,还需由各自的允许位确定(见D4~D0)位说明)。
·ES 串行口中断允许位。
ES=1,允许串行口中断;
ES=0,禁止串行口中断。
·ET1 定时器/计数器1(T1 )的溢出中断允许位。
ET1=1,允许T1中断;
ET1=0,禁 止 T1中断。
·EX1 外部中断1中断允许位。
EXl= 1,允许外部中断1中断;
EX1= 0,禁止外部中断1中断。
·ET0 定时器/计数器0(T0)的溢出中断允许位。
ET0=1,允许T0中断;
ET0=0, 禁止T0中断。
·EX0 中断0中断允许位。
EX0= 1,允许外部中断0中断;
EX0= 0,禁止外部中断0中断。
中断允许寄存器中各相应位的状态,可根据要求用指令置位或清0,从而实现该中断源允许中断或禁止中断,复位时IE寄存器被清0。
⑵.中断优先级控制
MCS-51中断系统提供两个中断优先级,对于每一个中断请求源都可以编程为高优先级中断源或低优先级中断源,以便实现二级中断嵌套。中断优先级是由片内的中断优先级寄存器I P(特殊功能寄存器)控制的。
IP寄存器中各位的功能说明如下见图2-25:

·PS 串行口中断优先级控制位。
PS=1,串行口定义为高优先级中断源;
PS=0,串行口定义为低优先级中断源。
·PT1 定时器/计数器1(T1)中断优先级控制位。
PT1=1,定时器/计数器1定义为高优先级中断源;
PT1=0,定时器/计数器1定义为低优先级中断源。
·PX1 外部中断 1中断优先级控制位。
PX1=1,外中断 1定义为高优先级中断源;
PX1=0,外中断1定义为低优先级中断源。
·PT0 定时器/计数器0(T0)中断优先级控制位。
功能同PT1 。
·PX0 外部中断0中断优先级控制位。
功能同PX1。
中断优先级控制寄存器IP中的各个控制位都可由编程来置位或复位(用位操作指令或字节操作指令)。单片机复位后 lP中各位均为0。各个中断源均为低优先级中断源。
3、中断优先级结构
⑴. 响应中断的基本规则
MCS-51中断系统具有两级优先级(由IP寄存器把各中断源的优先级分为高优先级和低优先级),它们遵循下列两条基本规则:
① 低优先级中断源可被高优先级中断源所中断,而高优先级中断源不能被任何中断源所中断;
② 一种中断源(不管是高优先级或低优先级)一旦得到响应,与它同级的中断源不能再中断它。
⑵. 中断优先级结构
为了实现上述两条规则,中断系统内部包含两个不可寻址的优先级状态触发器。其中一个用来指示某个高优先级的中断源正在得到服务,并阻止所有其它中断的响应;另一个触发器则指出某低优先级的中断源正得到服务;所有同级的中断都被阻止,但不阻止高优先级中断源。
⑶. 内部查询顺序
当同时收到几个同一优先级的中断时,响应哪一个中断源取决于内部查询顺序。其优先级排列如下:
中断源 同级内的中断优先级
外部中断0 最高
定时器/计数器0溢出中断
外部中断 1
定时器/ 计数器1溢出中断
串行口中断 最低
4、中断响应过程
⑴. 采样
CPU在每个机器周期的S5P2时刻采样中断标志,而在下一个机器周期对采样到的中断进行查询。
⑵. CPU不能响应中断的条件
下面的任何一个都能封锁CPU对中断的响应:
① CPU正在处理同级的或高一级的中断;
② 现行的机器周期不是当前所执行指令的最后一个机器周期;
③ 当前正在执行的指令是返回(RETI)指令或是对IE或IP寄存器进行读/写的指令。
上述三个条件中,第二条是保证把当前指令执行完,第三条是保证如果在当前执行的是 RETI指令或是对IE、IP进行访问的指令时,必须至少再执行完一条指令之后才会响应中断。
⑶.查询
如果在前一个机器周期的S5P2有中断标志,则在查询周期内便会查询到并按优先级高低进行中断处理,中断系统将控制程序转入相应的中断服务程序。
中断查询在每个机器周期中重复执行,所查询到的状态为前一个机器周期的S5P2时采样到的中断标志。这里要注意的是:如果中断标志被置位,但因上述条件之一的原因而未被响应,或上述封锁条件已撤消,但中断标志位已不再存在(已不再是置位状态)时;被拖延的中断就不再被响应,CPU将丢弃中断查询的结果。也就是说,CPU对中断标志置位后,如未能及时响应而转入中断服务程序的中断标志不作记忆。
⑷. 中断处理
CPU响应中断时,先置相应的优先级激活触发器,封锁同级和低级的中断。然后根据中断源的类别,在硬件的控制下,程序转向相应的向量入口单元,执行中断服务程序。
硬件调用中断服务程序时,把程序计数器PC的内容压入堆栈(但不能自动保存程序状态字PSW的内容),同时把被响应的中断服务程序的入口地址装入PC中。
⑸. 五个中断源服务程序的入口地址是:
中断源 入口地址
外部中断0 0003H
定时器 0溢出 000BH
外部中断1 0013H
定时器1溢出 001BH
串行口中断 0023H
通常,在中断入口地址处安排一条跳转指令,以跳转到用户的服务程序入口。中断服务程序的最后一条指令必须是中断返回指令 RETI。 CPU执行完这条指令后,把响应中断时所置位的优先级激活触发器清0,然后从堆栈中弹出两个字节内容(断点地址)装入程序计数器PC中;CPU就从原来被中断处重新执行被中断的程序。
5、外部中断触发方式
MCS-51的外部中断INTx(INT0和INT1)可以用程序控制为电平触发或跳变触发(通过编程对定时器/计数器控制寄存器 TCON中的 IT0和 IT1 位进行清“0”或置“1”)。
若ITx(X=0,1)为0,则外部中断INTx程控为电平触发,由INTx引脚上所检测到的低电平(必须保持到CPU响应该中断时为止,并且还应在中断返回前变为高电平)触发。
若ITx=1,则外部中断INTx由跳变触发。即在相继的两个机器周期中,前一个周期从INTx引脚上检测到高电平,而在后一个周期检测到低电平,则置位TCON寄存器中的中断请求标志IEx(IE0或IE1),由IEx发出中断请求。
由于外部中断引脚在每个机器周期内被采样一次,所以中断引脚上的电平应至少保持12个振荡周期,以保证电平信号能被采样到。对于跳变触发方式的外部中断,要求输入的负脉冲宽度至少保持 12个振荡周期(若晶振频率为 6MHZ,则宽度为 2us),以确保检测到引脚上的电平跳变,而使中断请求标志IEx置位。
对于电平触发的外部中断源,要求在中断返回前撤销中断请求(使引脚上的电平变高)是为了避免在中断返回后又再次响应该中断而出错。电平触发方式适用于外部中断输入为低电平,而且能在中断服务程序中撤销外部中断请求源的情况。
6、中断响应时间
外部中断INT0和INT1的电平在每个机器周期的S5P2时被采样并锁存到 IE 0和 IE1中,这个置入到IE0和IEl的状态在下一个机器周期才被查询电路查询。如果产生了一个中断请求,而且满足响应的条件,CPU响应中断,由硬件生成一条长调用指令转到相应的服务程序入口。这条指令是双机器周期指令。因此,从中断请求有效到执行中断服务程序的第一条指令的时间间隔至少需要三个完整的机器周期。
如果中断请求被前面所述的三个条件之一所封锁,将需要更长的响应时间。
① 若一个同级的或高优先级的中断已经在进行,则延长的等待时间显然取决于正在处理的中断服务程序的长度;
② 如果正在执行的一条指令还没有进行到最后一个周期,则所延长的等待时间不会超过二个机器周期,这是因为MCS-51指令系统中最长的指令(MUL和DIV)也只有四个机器周期;
③ 假若正在执行的是RETI指令或者是访问IE或IP指令,则延长的等待时间不会超过五个机器周期(为完成正在执行的指令还需要一个周期,加上为完成下一条指令所需要的最长时间四个周期,如MUL和DIV指令)。
因此,在系统中只有一个中断源的情况下,响应时间总是在三个机器周期到八个机器周期之间。
7、MCS-51的单步操作
如前所述,MCS-51中断结构有一个重要的特性,即执行中断返回指令RETI后至少还要执行一条指令,才响应新的中断。因此,一但进入了某中断服务程序,在中断返回后、至少还需要再执行一条被中断的程序,在这以前是不会重新进入中断服务程序的。利用这一特点,可实现单步操作。方法之一是利用外部中断引脚(例如INT0)上的低电平实现单步运行。
例如,INT0设置为电平触发方式,其中断服务程序由下列指令结束:
WAIT1: JNB P3.2, WAIT1 ; 若P3.2引脚(INT0)为低电平,仍执行本条指令,即原处等待,直到INT0 引脚变为高电平。顺序执行下条指令
WAIT2:JBP3.2, WAIT2 ;原处等待,直到INT0引脚变为低电平。
RETI ;返回。
如果INT0 引脚(P3.2)保持低电平,则CPU响应中断,进入外部中断0的服务程序,由于中断服务程序末尾有上述三条指令,就会停留在JNB指令处,直到INT0引脚上出现一个正脉冲(从低一高-低)时,程序才往下执行,随后执行返回指令RET1,返回被中断的程序,执行一条指令后,又再次进入外部中断0服务程序,等待在INT0 引脚出现下一个正脉冲,这样,在INT0端每出现一次正脉冲,就执行一条主程序中的指令,实现了单步操作的目的。要注意的是,这个正脉冲的高电平持续时间不应小于三个机器周期,以确保 CPU能采集到高电平信号。
8、多个外部中断源系统设计
MCS-51 只有两个外部中断源INT0和INT1,但在实际的应用系统中,外部中断请求源往往比较多。因此,需要对中断源入口进行扩展。
下面讨论两种多中断源系统的设计方法。
⑴.定时器中断作为外部中断使用
把MCS-51的两个定时器/计数器(T0和T1)选择为计数器方式,每当P3.4(T0)或P3.5(T1)引脚上发生负跳变时,T0和T1的计数器加1,利用这个特性,可以把P3.4和P3.5引脚作为外部中断请求输入线,而定时器的溢出中断作为外部中断请求标志。
应用举例如下:
设T0为方式2(自动装入常数)外部计数方式,时间常数为0FFH,允许中断,并且CPU开放中断。其初始化程序为:
MOV TMOD,#06H;数00000110B送方式寄存器TMOD。设T0为方式2,计数器方式工作;
MOV TL0,#0FFH ;时间常数 OFFH送T0的低 8位 TLO和高 8位 TH0寄存器
MOV TH0, #0FFH
SETB TR0 ;置TR0为1,启动T0
MOV IE, #82H ;置中断允许,即置中断允许寄存器 IE中的 EA位,ET0位为1
当接在P3.4引脚上的外部中断请求输入线发生负跳变时,TL0加1溢出,TF0被置“1”向CPU发出中断请求。同时 TH0的内容自动送入 TL0,使 TL0恢复初始值 0FFH。这样,每当P3.4引脚上有一次负跳变时都置“1”于TF0,向CPU发中断清求,P3.4引脚就相当于边沿触发的外部中断请求源输入线。
同理,也可以把P3.5引脚作类似的处理。
⑵.中断和查询结合的方式
这种方法是把系统中多个外部中断源按它们的重要程度进行排队,把其中最高级别的中断源接到MCS-51的一个外部中断源输入端(例如接到INT0脚),其余的中断源用线或的方法连接到另一个外部中断输入端(INT1),并同时还接到一个 I/O口,如图 2-26中接到 P1口。中断请求由硬件电路产生,而中断源的识别由程序查询来处理,查询顺序由中断源的优先级决定。图 2-26为五个外部中断源的连接电路,其中设备 1~4经 OC门与INT1连接,并连接到P1.0~Pl.3。均采用电平触发方式。设备0为最高级中断源,单独作为外部中断0的输入信号。

外部中断1的中断服务程序如下:
INTR:PUSH PSW ;程序状态字PSW内容压入堆找保存
PUSH ;累加器A内容压入堆栈保存
JNB P1.0,DVT1 ;P1.O引脚为0,转至设备1中断服务程序
JNB P1.1,DVT2 ; P1.1引脚为0,转至设备2中断服务程序
JNB P1.2,DVT3 ;P1.2引脚为0,转至设备 3中断服务程序
JNB P1.3,DVT4 ;P1.3引脚为0,转至设备4中断服务程序
INTR1: POP A ;压入堆栈的内容送回到 A
POP PSW ;恢复程序状态字PSW的内容
RETI ;中断返回
DVT1: ; 设备1中断服务程序入口
AJMP INTR1 ;跳传到 INTR1所指示的指令
DVT2: ;设备 2中断服务程序入口
AJMP INTR1 ;跳转到 INTR1
DVT3: ;设备 3中断服务程序入口
AJMP INTRl ;跳转到INTR1
DVT4: ;设备4中断服务程序入口
AJMP INTRl ;跳转到 INTR1
§2-8 总线
MCS-51单片机属总线型结构,通过地址/数据总线可以与存储器(RAM EPROM)、并行I/O接口芯片相连接。
在访问外部存储器时, P2口输出高 8位地址, P0口输出低 8位地址,由 ALE(地址锁存允许)信号将P0口(地址/数据总线)上的低 8位锁存到外部地址锁存器中,从而为P0口接受数据作准备。
在访问外部程序存储器(即执行MOVC指令)时,PSEN(外部程序存储器允许)信号有效。在访问外部数据存储器(即执行 MOVX指令)时,由P3口自动产生读/写(RD/WR)信号,通过P0口对外部数据存储器单元进行读/写操作。
MCS-51 单片机所产生的地址、数据和控制信号使与外部存储器和并行I/O接口芯片连接简单、方便。
§2-9 复位和复位电路
内部复位操作使堆栈指示器SP为07H,各端口都为1(P0~P3口的内容均为0FFH),特殊功能寄存器都复位为0,但不影响 RAM 的状态。当RST引脚返回低电平以后, CPU从0 地址开始执行程序。复位后,各内部寄存器状态如下:
寄存器 内容
PC 0000H
Acc 00H
B 00H
PSW 00H
SP 07H
DPTR 0000H
P0~P3 0FFH
IP xxx00000
IE 0xx00000
TMOP 00H
TCON 00H
TH0 00H
TL0 00H
TH1 00H
TL1 00H
SCON 00H
SBUF 不定
PCON 0xxxxxxx
图2-27(A)为加电自动复位电路。加电瞬间,RST端的电位与Vcc相同,随着RC电路充电电流的减小, RST端的电位逐渐下降。只要 RST端保持 10毫秒以上的高电平就能使MCS-51单片机有效地复位。复位电路中的RC参数通常由实验调整。当振荡频率选用6 MHZ时, Cr选 22uF, Rr 选 1k 便能可靠地实现加电自动复位。若采用 RC电路接斯密特电路的输入端,斯密特电路输出端接MCS-51和外围电路的复位端,能使系统可靠地同步复位。

习题二
1、8031、8051和8751的主要区别在哪里?
2、8051在一块芯片上集成了_______ 个_______ 位的CPU,_______ 个片内振荡器及时钟电路,_______ 字节ROM的程序存储器,_______ 字节RAM的数据存储器,_______ 个_______ 位的定时计数器, 可寻址外存(_______ 字节RAM、_______ 字节ROM ) 的控制电路,_______ 条可编程的I/O口线,_______ 个全双工串行口,_______ 个中断源,_______ 个优先级嵌套中断结构。
3、 EA引脚的作用是什么?在下列情况下,EA引脚应接何种电平?(2分×5 = 10分)
① 只有片内ROM;
② 只有片外ROM;
③ 有片内ROM和片外ROM;
④ 有片内ROM和片外ROM,片外ROM所存为调试程序。
4、51单片机的数据总线有多少根?地址总线有多少根?实际应用时数据总线和地址总线是怎样形成的?
5、MCS-51单片机的时钟频率范围是多少?若采用内部时钟(如图2-3(a)),外接的电容起什么作用?
6、若单片机的时钟为6MHz,则其状态周期、机器周期和指令周期分别为多少?
7、MCS-51机的程序存储器与数据存储器在物理上和逻辑上都是_______ ,各有自己的_______ 、_______ 和_______ 。程序存储器用来存放_______ 和始终要保持的_______ ;数据存储器用来存放程序运行中所需要的_______ 或_______ 。
8、8031内部 RAM 区中,有_______ 个工作寄存器区,它们的字节地址范围分别是_______ 、_______ 、_______ 、_______ ,要选择当前的工作寄存器区,应对_______ 寄存器的_______和_______位进行设置。
9、8031内部 RAM 区中,可位寻址区的字节地址范围是_______,位地址范围是_______ 。
10、MCS-51机的内部RAM分为:
① 区,地址范围为_______ ;
② 区,地址范围为_______ ;
③ 区,地址范围为_______ ;
11、MCS-51机的数据存储器在物理上和逻辑上都_______,访问_______用MOV指令,访问_______用MOVX指令。
12、MCS-51机的程序存储器是_______编址的,要使程序从内部ROM开始执行,应将/EA接_______,要使程序从外部ROM开始执行,应将EA接_______。
13、8051的特殊功能寄存器中哪些寄存器可以位寻址 ?
14、简述程序状态字PSW中各位的含义。
15、8051复位时后 , 各内部寄存器的状态为:
PC_______、 A_______、 B _______
PSW_______、 SP_______、 DPTR _______
P0--P3_______、 TMOP_______、 TCON_______
TH0_______、 TL0_______、 TH1_______
TL1_______、 SCON_______、 SBUF _______
16、MCS-51机的并行I/ O 口是准双向口 , 要输入数据必须先 。
17、简述MCS-51机的 P3 口的第二功能。
18、试分析I/O端口的两种读操作(读端口引脚和读锁存器),读-修改-写操作是由哪一种操作进行的?
19、TMOD是什么寄存器?它的作用是什么?请说明每一位的定义。
20、TCON是什么寄存器?它的作用是什么?请说明每一位的定义。
21、8051中的定时器/计数器有几种工作方式?怎样设置?
22、若单片机的时钟为6MHz,问:
① 定时器处于方式0,最大定时范围是多少?
② 定时器处于方式1,最大定时范围是多少?
③ 定时器处于方式2,最大定时范围是多少?
④ 定时器处于方式3,最大定时范围是多少?
23、若单片机的时钟为6MHz,要求用T0定时150μs,问
① 定时器处于方式0,定时的初值是多少?
② 定时器处于方式1,定时的初值是多少?
③ 定时器处于方式2,定时的初值是多少?
24、8051中的定时器/计数器设置为计时器方式时,最大计数频率为多少?
25、PCON是什么寄存器?它的作用是什么?请说明每一位的定义。
26、SCON是什么寄存器?它的作用是什么?请说明每一位的定义。
27、MCS-51机的串行口有哪些有几种工作方式?怎样设置?
28、串行口工作于方式1和方式3时,采用___________作为波特率发生器。
29、简述MCS-51机的多机通讯原理。
30、串行口工作于不同方式时,其波特率如何计算?
31、IE是什么寄存器?它的作用是什么?请说明每一位的定义。
32、IP是什么寄存器?它的作用是什么?请说明每一位的定义。
33、MCS-51机有几个中断源?几个中断优先级?各个中断源的优先级是怎样确定的?在同一个优先级中各个中断源的优先次序如何确定?
34、请指出MCS-51机各个中断源的中断标志和中断服务程序的入口地址。
35、MCS-51机的外部中断有那两种触发方式?如何选择?对外部中断源的触发脉冲或电平有何要求?
36、MCS-51机怎样实现单步操作?