2.1 微机系统结构
2.1.1 微机系统内部结构
MCS-51单片机的内部结构如图2-1所示。在单片机内部,除了CPU以外,还集成了存储器、中断系统、定时/计数器、并行I/O接口、串行口等外围设备,这些片上外设都经过内部总线与CPU相连。CPU通过写特殊功能寄存器对片上外设进行设置,通过读特殊功能寄存器获得片上外设的工作状态信息。
图2-1 MCS-51单片机结构框图
下面对MCS-51单片机的各个组成部分作进一步的说明。
1.CPU
CPU包括运算器和控制器两个部分。
MCS-51单片机的运算器可实现多种数据处理工作,具有二进制数据和BCD码数据的处理能力,其布尔运算能力尤其强大。运算器由算术逻辑单元ALU、累加器A、寄存器B和程序状态字PSW组成。
算术逻辑单元ALU(Arithmetic/Logic Unit)可实现8位二进制数据的加、减、乘、除等算术运算和逻辑与、或、异或、清零、取反等逻辑运算,并可实现数据传送、循环移位、测试跳转等功能。MCS-51单片机的算术逻辑单元还具有很强的位处理能力,可以对位变量(bit)进行数据传送、置位、清零、取反、测试跳转及逻辑与、或等运算。
累加器A是一个8位的寄存器,是CPU中使用最为频繁的寄存器。在算术运算和逻辑运算指令中一般用累加器A来存放参与运算的一个操作数和运算结果,一些特殊的运算如移位、取反等只能对累加器A中的数据进行。在数据传送指令中要读取程序存储器中的数据或读写外部数据存储器中的数据时,必须使用累加器A才能完成。在控制转移指令中也经常以累加器A的内容为判断依据。复位后累加器A的值为00H。
寄存器B也是一个8位的寄存器,主要用于配合累加器A实现乘法和除法运算。在乘法运算中,寄存器B存放一个乘数和乘积的高字节。在除法运算中,累加器A中存放被除数,寄存器B中存放除数,运算完成后,累加器A中存放商,寄存器B中存放余数。当不进行乘、除法运算时,寄存器B可用作通用寄存器。
程序状态字PSW(Program Status Word)中的各个位(bit)反映了CPU的当前工作状态,其定义如下:
Cy(PSW.7):进位标志位(Carry Flag),当按字节进行的加减法运算发生进位或借位时,Cy=1,否则Cy=0。Cy也用作位处理器的位累加器,多数位操作指令都用Cy作为操作数并存放运算结果。
AC(PSW.6):辅助进位标志位(Auxiliary Carry Flag),当加减法运算中发生低半字节和高半字节之间的进位或借位时,AC=1,否则AC=0。AC位可用于实现BCD码的运算。
F0(PSW.5):标志位0(Flag 0),是提供给用户使用的通用标志位。
RS1(PSW.4)和RS0(PSW.3):工作寄存器组选择位(Register Bank Select)。MCS-51单片机中有R0,R1,…,R7一共8个工作寄存器供用户编程时使用。这些寄存器有四组存储位置可供选择,通过设置RS1和RS0可选择工作寄存器组的当前存储位置,如表2-1所示:
表2-1 工作寄存器组选择表
OV(PSW.2):溢出标志位(Overflow Flag),当算术运算的结果发生溢出时OV=1,否则OV=0。
PSW.1:未定义位。该位的功能没有定义,在硬件上也没有实现,用户不能使用该位作为用户标志位。
P(PSW.0):奇偶标志位(Parity Flag),当累加器ACC的8个位中“1”的个数为奇数时,P=1;否则P=0。奇偶标志位P可用在串行通信的奇偶校验程序中。
在每条指令执行完成后,PSW中相应的位都会被硬件置位或清零,从而反映出CPU的当前工作状态。PSW中的各个位(未定义的除外)也可以用软件置位或清零。复位后PSW的值为00H。
控制器由指令寄存器IR、指令译码器ID、程序计数器PC、堆栈指针SP、数据指针DPTR等组成。控制器本质上是复杂的时序控制电路,CPU从程序存储器取得指令后放入指令寄存器,然后用指令译码器对指令进行译码,并发出各种控制信号,从而使计算机的各硬件部分与时钟信号的节拍协调一致、互相配合,最终实现各种功能。
程序计数器PC(Program Counter)是一个16位的寄存器,控制着程序的执行顺序。PC中始终存放着下一条将要执行指令的存储首地址。一条指令执行完成后,CPU自动从PC指向的下一条指令的存储地址取出一个字节,然后PC的值自动加1,指向下一个存储位置。如果当前执行的指令改变了PC的值,程序运行的顺序也就发生了变化,这就是程序跳转。单片机复位时,PC的值被清0,所以复位后执行的第一条指令总是存放在ROM中地址为0的存储单元。
堆栈(Stack)是在RAM中开辟出来的一块按照“先入后出”原则进行管理的存储区域。堆栈主要用于子程序调用和返回过程中的断点保护和现场保护,也可以用于主程序和子程序之间的参数传递。对堆栈进行操作时需要用一个堆栈指针来指示出堆栈的栈顶位置。在MCS-51单片机中,堆栈指针SP(Stack Pointer)是一个8位的寄存器。当执行PUSH,ACALL,LCALL指令以及响应中断(即调用中断服务子程序)时,SP的值会自动增加;当执行POP,RET,RETI指令时,SP的值会自动减少。当单片机复位时,SP的值为07H。
数据指针DPTR(Data Pointer)是一个16位的寄存器。MCS-51单片机的外部地址总线的宽度是16位的,当访问外部数据存储器或程序存储器时,可以用DPTR来进行寻址。DPTR的高字节寄存器用DPH来表示,低字节寄存器用DPL来表示,DPTR即可以作为一个16位的寄存器进行存取,也可以作为两个独立的8位寄存器进行操作。复位后DPTR的值为0000H。在一些新型的单片机中,为了提高C语言程序的执行效率,采用了双DPTR或多DPTR。
2.存储器
单片机的存储器按照功能可分为数据存储器(RAM)和程序存储器(ROM),按其存在的位置又可以分为片外存储器和片内存储器。在片内RAM区中,专门划分出一块区域用来存放特殊功能寄存器SFR(Special Function Register),称为特殊功能寄存器区。在片内RAM中,有一些特殊地址的存储单元的每一个二进制位都具有位地址,这些存储单元组成可位寻址区。片内RAM地址为00H~1FH的存储单元用作工作寄存器区。综上所述,单片机的整个存储器空间按照其所处的位置和功能可以划分为以下几个区域:内部程序存储器区、外部程序存储器区、低128字节的内部数据存储器区(包含工作寄存器区和位寻址区)、高128字节的内部数据存储器区、特殊功能寄存器区、外部数据存储器区等区域。MCS-51单片机的存储器结构如图2-2所示。
程序存储器(ROM)中存放的内容是程序、常数、表格等在程序运行中不改变的数据。MCS-51单片机的程序存储器可分为片内和片外两部分。MCS-51单片机的程序计数器PC是16位的寄存器,可寻址地址范围为0000H~FFFFH,寻址空间大小为64KB,但实际的单片机内部的程序存储器数量一般都小于64KB,如8051单片机片内具有4KB的掩模ROM,8751单片机片内具有4KB的EPROM,而8031单片机片内没有ROM。一些新型号的单片机片内具有更多或更方便应用的程序存储器,如AT89S51单片机片内具有4KB的Flash ROM,AT89S52单片机片内具有8KB的Flash ROM,AT89S8253单片机片内具有12KB的Flash ROM和2KB的EEPROM。
单片机上电或复位后,PC的值为0000H,自动从0000H存储单元读取指令开始执行。在图2-2中可以看到,当选用片内具有4KB ROM的单片机时,程序存储器地址0000H~0FFFH范围内存在一个地址对应内部和外部两个存储单元的现象,这时使用外部引脚来进行选择。当(接低电平)时,单片机复位后从外部程序存储器的0000H单元开始取指令执行;当(接高电平)时,单片机复位后从内部程序存储器的0000H单元开始取指令执行;当PC的值超出内部ROM的地址范围时,自动从外部ROM中取指令执行。对于片内没有程序存储器的单片机如8031、8032等,需要保持引脚接低电平。
图2-2 存储器结构图
在MCS-51单片机的程序存储器中有几个具有特殊用途存储单元。地址为0000H的单元中存放的是单片机复位后执行的第一条指令的首地址。此外还有5个单元地址分别对应于单片机的5个中断源,叫做中断服务程序入口地址,也称为中断向量,如表2-2所示。
表2-2 中断向量表
从表2-2可以看出,地址0000H和表中各中断向量地址之间的距离非常近,无法存放较大的程序,故在这些特殊地址处一般是放一条无条件转移指令,跳转到真正的主程序入口和中断服务程序入口。
MCS-51单片机的片内数据存储器可分为高128字节和低128字节两个区域。其中低128字节又可分为三个部分:地址为00H~1FH的32个字节用作工作寄存器区,分别存放4组(每组8个)工作寄存器,具体的地址分配见表2-1;地址20H~2FH的16个字节为位寻址区,这个区的每一个二进制位都拥有独立的位地址,共128个位,位地址范围为00H~7FH,见表2-3。地址为30H~7FH的区域为数据缓冲区,共80个字节。单片机复位后,堆栈指针SP的值为07H,第一个进栈的数据会存放在08H单元,如果用户程序执行中有可能进行工作寄存器组的切换,就要把堆栈的位置修改到数据缓冲区中,以免程序运行中出错。
表2-3 位寻址区的位地址表(HEX)
图2-2中片内数据存储器的高128字节是MCS-52子系列的MCS-51单片机才有的,MCS-51子系列的单片机没有这一个存储器区。高128字节的RAM区的地址范围为80H~FFH。
特殊功能寄存器的作用是设置单片机的工作模式,并指示单片机的当前工作状态。特殊功能寄存器区的地址范围为80H~FFH,与高128字节RAM区的地址是重合的,用不同的寻址方式加以区分。特殊功能寄存器区只能用直接寻址的方式访问,而高128字节RAM区只能用寄存器间接寻址的方式访问。特殊功能寄存器是单片机学习的重点,相关内容在下一节介绍。
MCS-51单片机内部的数据存储器只有128或256个字节,还要分出一部分用作工作寄存器和堆栈区,如果内部数据存储器的数量不能满足用户程序的需要,可以在片外扩展外部数据存储器。对外部数据存储器用MOVX指令进行访问,可使用R0、R1或数据指针DPTR作为间接寻址寄存器。DPTR是16位的寄存器,其寻址范围为0000H~FFFFH,一共64KB,即用户最多可以扩展64KB的外部数据存储器。当单片机本身具有的外部I/O接口不能满足需求时,可以在外部数据存储器的地址空间里进行I/O接口扩展,和外部数据存储器统一编址。
2.1.2 特殊功能寄存器
特殊功能寄存器在单片机中扮演着非常重要的角色,单片机内的各硬件组成部分如算术逻辑单元、并行I/O接口、串行口、定时器/计数器、中断系统等都有对应的特殊功能寄存器,用户程序通过特殊功能寄存器对各个硬件组成部分进行设置,并通过特殊功能寄存器获得各设备的当前工作状态。要想使用单片机的各项功能,必须对相关的特殊功能寄存器非常熟悉。
特殊功能寄存器本质上是一些具有特殊功能的存储单元,这些存储单元分布在内部数据存储器地址80H~FFH的存储区域,用直接寻址的寻址方式进行访问。MCS-51单片机的特殊功能寄存器在内存中的分布情况如表2-4所示。从表2-4可以看出,目前单片机中用到的特殊功能寄存器的存储位置远远少于128个字节,实际上MCS-51子系列单片机只用到了21个字节,MCS-52子系列的单片机用到了26个字节。在特殊功能寄存器区没有定义的字节被厂家保留用于后续扩展,用户不能把它们用作存储单元。
从表2-4还可以看到,字节地址可以被8整除的特殊功能寄存器(如80H单元的P0、88H单元的TCON等)是可以位寻址的,这些特殊功能寄存器既可以作为字节存取,也可以用位寻址的方式对其中的任何一个二进制位单独操作。在MCS-51单片机中,如果一个特殊功能寄存器是可以位寻址的,那么其最低位的位地址与其字节地址相等。
表2-4 MCS-51单片机的特殊功能寄存器的地址分布
MCS-51的特殊功能寄存器的具体功能和定义如表2-5所示。
表2-5 MCS-51的特殊功能寄存器的定义
2.1.3 微机系统的引脚功能
MCS-51系列单片机的基本型号主要采用40个引脚的双列直插(DIP)封装,其引脚功能定义如图2-3所示。也有一些型号的MCS-51单片机采用44个引脚的PLCC封装,此时有4个引脚内部不接线,实际使用的仍为40个引脚。
图2-3 MCS-51单片机引脚定义
单片机的40个引脚可以分为以下四类:
1.电源引脚
单片机正常运行或编程、校验时,VCC要接+5V电源,VSS要接地(GND)。
2.并行I/O接口
有四个并行I/O接口,称为P0、P1、P2和P3口,每个并行口都有8个引脚,一共32个引脚。
3.时钟引脚
XTAL1是内部反相振荡放大器的输入端,XTAL2是内部反相振荡放大器的输出端。
4.特殊功能引脚
RST复位引脚。在RST引脚上出现持续两个机器周期的高电平将导致单片机复位。常用的外部复位电路如图2-4所示。目前一些新型号的单片机在片内集成了上电复位电路。在一些关键场合可以选用专用的复位芯片如MAX813L,集成了电压监测、看门狗和手动复位等功能。
为地址锁存使能脉冲输出信号,用于在访问外部存储器时锁存P0口输出的低8位地址(A0~A7),ALE脉冲的频率大约为振荡器频率的1/6。在对内部程序存储器编程时,此引脚输入编程脉冲信号(用作功能)。
外部程序存储器使能信号,当引脚接Vss时,单片机从外部存储器读取指令运行,要让单片机从内部程序存储器读取指令,需要将引脚接高电平。在对8751的内部程序存储器进行编程时,需要给Vpp引脚接上21V的编程电源电压。
外部程序存储器的读选通信号。
图2-4 上电复位电路
2.1.4 时钟输入与机器周期
MCS-51单片机可以连接外部晶体,与片内的反相振荡放大器一起产生时钟信号,外部时钟电路如图2-5所示。不同型号的单片机允许使用的最高晶振频率不同,常见的有12MHz,24MHz,33MHz等。根据需要,晶振频率可在0Hz到最高晶振频率之间进行选择,通常选择6MHz或12MHz。当外部晶振使用石英晶体时,C1、C2的电容值可取30pF±10%。
MCS-51单片机也可以直接使用外部振荡器信号作为时钟信号,此时XTAL2为外部信号输入端,XTAL1需接地。对外部振荡器信号的占空比并无特殊要求,但高、低电平的保持时间需满足要求。
计算机完成一个基本操作所需要的时间称为机器周期。MCS-51系统中,一个机器周期由6个状态S1,S2,…,S6组成,每一个状态可分为两个相位P1,P2,每一个相位就是一个时钟周期,所以一个机器周期是由12个时钟周期组成的。
计算机执行一条指令需要的时间称为指令周期,每条指令的执行时间都是由一个或几个机器周期组成的,MCS-51系统中,有单周期指令、双周期指令和四周期指令。
图2-5 外部时钟电路
计算机内部的各个硬件部分需要步调一致地协调工作才能完成各项功能,这个协调各部分动作顺序的控制信号就是时钟。计算机系统中各个信号在时间上的顺序关系称为时序。
图2-6所示为单片机从外部程序存储器取指令的时序。从图中可以看出,地址锁存信号ALE在每个机器周期出现两次,分别是在S1P2和S4P2,持续时间都是一个状态周期。ALE信号出现一个相位后,从P0口上输出程序计数器PC的低字节,同时从P2口上输出程序计数器PC的高字节。再经过一个相位后,ALE信号拉低,将P0口输出的低8位地址锁存起来,然后PSEN信号出现有效低电平,外部程序存储器开始输出指定地址的内容。在S4P1时刻P0进行数据采样工作,取到一个字节的指令信息。从S4P2开始ALE信号又出现高电平,重复进行以上过程,从而实现单片机在一个机器周期中的两次取指令,使得双字节单周期的指令能够顺利执行。
图2-6 读外部程序存储器ROM时序
图2-7和图2-8为用MOVX指令读、写外部数据存储器时的时序。MOVX指令是单字节双周期的指令。在用MOVX指令访问外部数据存储器时,为了保留锁存器上锁存的数据存储器单元的低8位地址信息,第二个机器周期的S1P2时刻的ALE信号不再出现。
图2-7 读外部数据存储器的时序
图2-8 写外部数据存储器的时序
2.1.5 定时器/计数器
51子系列的MCS-51单片机具有两个16位的定时器/计数器(Timer/Counter),称为定时器/计数器0和定时器/计数器1,简称为T0和T1。定时器/计数器本质上都是计数器,当它们对内部时钟信号计数时,就为定时器;当它们对外部脉冲信号计数时,就为计数器。
当工作在定时器模式时,每个机器周期定时器的计数值都会加1,可以理解为是对机器周期进行计数。因为一个机器周期等于12个时钟周期,所以也可以理解为定时器是对时钟信号12分频后的信号进行计数。
当工作在计数器模式时,在每个机器周期的S5P2时刻,都会对外部脉冲信号输入引脚(T0或T1,均为P3口引脚的第二功能)的状态进行采样,当外部引脚上出现从1到0的负跳变时,对应计数器的计数值就会加1。因为检测到一次负跳变至少需要两个机器周期,所以最高计数频率是时钟频率的1/24。
定时器/计数器的启动、停止控制位和中断请求标志位都在定时器控制寄存器TCON中,TCON的定义如下:
TCON的字节地址是88H,可以位寻址,最低位(LSB)的位地址是88H,最高位(MSB)的位地址是8FH。TCON的高4位用于定时器/计数器的启停控制和中断控制。
TF1:定时器/计数器1的溢出标志位。当发生了计数值的溢出时,会自动将该位置1,向CPU请求中断;CPU响应该中断后会自动清除TF1标志。TF1也可以用软件置位和清除。
TR1:定时器/计数器1的运行控制位。TR1=1时,定时器/计数器1开始对机器周期或外部脉冲计数;当TR1=0时,定时器/计数器1停止计数。
TF0:定时器/计数器0的溢出标志位,作用与TF1类同。
TR0:定时器/计数器0的运行控制位,作用与TR1类同。
定时器/计数器0和定时器/计数器1既可以工作在定时器模式,又可以工作在计数器模式。无论是作为定时器还是计数器,都有四种工作方式可供选择。
定时器/计数器的工作模式和工作方式的配置是通过特殊功能寄存器TMOD来进行的。TMOD称为定时器/计数器方式寄存器,字节地址为89H,不能位寻址。TMOD的定义如下:
TMOD中的8个位分为两组,高4位用于定时器/计数器1,低4位用于定时器/计数器0。
GATE:门控位。当GATE=1时,T0和T1能否计数受到外部引脚电平的控制。当INT0引脚外接高电平时,T0可以进行计数,否则不能计数;当INT1外接高电平时,T1可以计数,否则不能计数。当GATE=0时,T0和T1能否计数不受外部引脚电平的控制。
C/T:计数器模式和定时器模式的选择位。C/T=0时,选择定时器模式,对机器周期进行计数;C/T=1时,选择计数器模式,对从外部引脚输入脉冲的负跳变进行计数。
M1和M0是工作方式选择位,可在四种工作方式中进行选择,如表2-6所示。
表2-6 工作方式选择
定时器/计数器0的当前计数值存放在TH0和TL0这两个特殊功能寄存器中,具体的存放方式由工作方式来确定。相应地,定时器/计数器1的计数值存放在TH1和TL1中。
下面对定时器/计数器的四种工作方式分别加以介绍。
1.工作方式0
当TMOD中的M1和M0的值为00时,定时器/计数器工作在方式0,计数长度为13位,计数值存放在TH的8位和TL的低5位中。工作方式0的逻辑框图如图2-9所示。
图2-9 工作方式0的逻辑框图
当GATE=0时,计数器0能否计数由TR0控制,与外部引脚无关;当GATE=1时,计数器0能否计数除了受TR0控制之外,还受到外部引脚INT0的控制,只有当INT0外接高电平时,TL0和TH0组成的13位计数器才能够计数。门控功能可以用来测量INT0上出现的正脉冲的宽度。
C/T=0时,对振荡器12分频的信号(即机器周期)进行计数;C/T=1时,对外部引脚上的负跳变进行计数。
当13位计数器计数到各个二进制位全是“1”以后,再加1就会产生溢出。这个溢出信号会把溢出标志位TF0置1,向CPU申请定时器/计数器中断;同时把13位计数器的值全部清0,等待下一个计数脉冲到来时从0开始继续计数。这种方式下计数器的计数长度为213,即8192。通过调节计数器的初值,可以设定溢出发生前能够计数的次数。例如将初值设定为8192–1000=7192,在这个条件下,经过1000次计数后,13位计数器就会计满溢出。因为溢出后会自动从0开始计数,如果想要得到固定的溢出时间间隔,需要在中断服务程序中重新设定初值。
2.工作方式1
工作方式1和工作方式0的唯一区别是工作方式0的计数器长度为13位,工作方式1的计数器长度为16位。计数值的低8位存放在TL中,高8位存放在TH中。其逻辑框图如图2-10所示。计数器长度的增加扩大了计数的范围,也增加了定时器中断的时间间隔(即周期)。方式1的计数长度为216,即65536,初值的范围为0~65535。
图2-10 工作方式1的逻辑框图
3.工作方式2
工作方式2也叫做自动重装载的8位定时器/计数器方式,其逻辑框图如图2-11所示。在这种工作方式下,计数器的长度为8位,计数值存放在TL中,在TH中存放的是8位的初值。每当TL中的8位计数值计满溢出时,一方面置位TF申请中断,另一方面自动把TH中存放的8位初值装载到TL中,自动重装载初值的这个功能在运行过程中不需要用户程序的参与,是自动完成的。在工作方式0和工作方式1下如果要重新装载初值,必须由用户程序指令来完成。
4.工作方式3
工作方式3对定时器/计数器0和定时器/计数器1的作用是不同的。工作方式3的逻辑框图如图2-12所示。
图2-11 工作方式2的逻辑框图
图2-12 工作方式3的逻辑框图
定时器/计数器0工作在方式3时,拆分为两个8位的定时器/计数器:TH0和TL0。其中TL0使用原来T0的各个控制位如C/T、GATE、INT0、TR0和TF0,除了计数长度为8位外,与工作方式0和工作方式1并无不同。而TH0只能对机器周期进行计数,即只能工作在定时器模式,并使用T1的运行控制位TR1和中断标志位TF1。
定时器/计数器1设定为工作方式3时将停止工作,效果和其他工作方式下设定TR1=0相同。
当定时器/计数器0工作在方式3时,TH0占用了T1的中断标志位TF1,此时T1不能申请中断,只能工作在不需要中断控制的场合。通常,T1用作串行口的波特率发生器时,T1才定义为方式3,以增加一个8位的计数器。
当定时器/计数器0工作在方式3时,TH0还占用了T1的运行控制位TR1,此时T1的运行控制是由设定其工作方式来实现的,设定为方式0~方式2时,T1开始运行,设定为方式3,则T1停止运行。
2.1.6 中断控制系统
在计算机执行程序的过程中,由于发生了内部或外部的某种事件,计算机暂停当前程序的执行,转去执行相应事件的服务程序,待相应事件处理完毕后,再返回原程序继续往下执行的过程称为中断。中断是计算机处理随机事件的一种工作方式,这种方式相对于定时查询方式具有工作效率高、实时性好的优点。中断系统也是计算机的一种硬件资源,不同种类的单片机中断资源是不同的,中断系统功能的强弱是评价计算机性能的重要指标之一。
1.中断系统的结构
51子系列MCS-51单片机有5个中断源,分别是外部中断0、定时器/计数器0、外部中断1、定时器/计数器1和串行口。这些中断源通过中断请求标志向CPU请求中断,CPU按照中断优先级查询电路的查询结果去响应优先级最高的中断请求。中断源和中断请求标志见表2-7。
表2-7 中断源和中断请求标志
MCS-51单片机有两个中断优先级,每个中断源都可以单独配置为高优先级或低优先级。当同一个优先级内有多个中断同时提出请求时,按照中断查询电路的查询顺序进行排序,这个查询顺序也称为内部优先级。
外部中断的触发方式选择位和中断请求标志在定时器控制寄存器TCON中,定时器/计数器的中断请求标志中断也在TCON中,串行口的中断请求标志在串行口控制寄存器SCON中。此外,中断系统用到的特殊功能寄存器还有中断允许控制寄存器IE和中断优先级控制寄存器IP。MCS-51单片机的中断系统逻辑框图如图2-13所示。
图2-13 MCS-51单片机中断系统
定时器控制寄存器TCON的高4位用作定时器/计数器的启停控制和中断请求标志,低4位用作外部中断方式控制和中断请求标志,其定义如下:
TF1:定时器/计数器1的溢出标志位。当发生了计数值的溢出时,会自动将该位置1,向CPU请求中断;CPU响应该中断后会自动清除TF1标志。TF1也可以用软件置位和清除。
TR1:定时器/计数器1的运行控制位。TR1=1时,定时器/计数器1开始对机器周期或外部脉冲计数;当TR1=0时,定时器/计数器1停止计数。
TF0:定时器/计数器0的溢出标志位,作用与TF1类同。
TR0:定时器/计数器0的运行控制位,作用与TR1类同。
IE1:外部中断1的请求标志位。
IT1:外部中断1的触发方式选择位。IT1=0为低电平触发,IT1=1为下降沿触发。
IE0:外部中断0的请求标志位。
IT0:外部中断0的触发方式选择位,作用与IT1类同。
串行口控制寄存器SCON用于控制和监视串行口的工作状态,其字节地址为98H,可以位寻址,位地址范围为98H~9FH。SCON的位定义如下:
SCON与中断系统有关的位是TI和RI,其功能如下:
TI:串行口接收中断标志位。串行口每发送完一帧数据后,硬件置位TI,CPU响应中断后不会自动清除TI,需要由用户用软件清除。
RI:串行口发送中断标志位。串行口每接收完一帧数据后,硬件置位RI,CPU响应中断后不会自动清除RI,需要由用户用软件清除。
TI和RI也可由用户软件置1,触发相应的中断请求。
2.中断允许和优先级
通过中断允许控制寄存器IE,任何一个中断源都可以被单独地设置为允许或者禁止产生中断。IE的字节地址是0A8H,可以位寻址,位地址范围是0A8H~0AFH。IE中各位的定义如下:
IE各个位的功能如下:
EA:总中断允许控制位。当EA=0时,所有中断都不能得到响应;当EA=1时,各中断能否得到响应由其对应的中断允许控制位决定。
ES:串行口中断允许控制位。ES=1时允许响应串行口中断,否则禁止中断。
ET1:定时器/计数器1中断允许位。ET1=1时,允许响应定时器/计数器1的中断请求信号,否则禁止定时器/计数器1申请中断。
EX1:外部中断1的中断允许位。EX1=1时,允许响应外部中断1,否则禁止中断。
ET0:定时器/计数器0中断允许位。ET0=1时,允许响应定时器/计数器0的中断请求信号,否则禁止定时器/计数器0申请中断。
EX0:外部中断0的中断允许位。EX0=0时,允许响应外部中断0,否则禁止中断。
IE复位后的值为00H,即默认关闭所有中断。要想让某个中断得到响应,必须把该中断对应的中断允许位置1,并把总中断允许位置1。
MCS-51单片机有两个中断优先级,可实现二级中断嵌套。一个正在执行的低优先级中断服务程序可以被高优先级的中断请求中断,从而暂停低优先级中断服务程序的执行,转去处理高优先级的中断服务程序,待高优先级的中断服务程序执行完毕,遇到中断返回指令RETI时,再返回到被中断的低优先级中断服务程序中继续执行,这个过程称为中断嵌套。
中断嵌套遵循下面的基本原则:
①低优先级的中断可被高优先级中断所中断,反之不能;
②一个中断服务程序一旦开始执行,与之同级的中断不能再中断它。
从上面两条原则可以知道,一个高优先级中断服务程序一旦开始执行,不可能被其他中断所中断。
如果有两个优先级不同的中断源同时提出中断申请,系统响应高优先级的中断;如果两个优先级相同的中断源同时提出中断申请,系统响应哪个中断则由中断优先级查询电路的内部顺序决定,这个内部优先级顺序也称为第二优先级。MCS-51单片机中断的内部优先级顺序见表2-7。
通过中断优先级控制寄存器IP,任何一个中断源都可被单独地设置为高优先级的中断或低优先级的中断。中断优先级寄存器IP的字节地址是0B8H,可以位寻址,位地址范围是0B8H~0BFH(实际只用到0BCH)。具体的各位定义如下。
IP各个位的功能如下:
PS:串行口中断优先级设置位。PS=1设定串行口中断为高优先级中断,否则为低优先级中断。
PT1:定时器/计数器1中断优先级设置位。PT1=1设定T1中断为高优先级中断,否则为低优先级中断。
PX1:外部中断1的优先级设置位。PX1=1设定外部中断1为高优先级中断,否则为低优先级中断。
PT0:定时器/计数器0中断优先级设置位。PT0=1设定T0中断为高优先级中断,否则为低优先级中断。
PX0:外部中断0的优先级设置位。PX0=1设定外部中断1为高优先级中断,否则为低优先级中断。
IP复位后的值为00H,即所有中断都默认为低优先级中断。
IP中有一些位没有定义,这些是为以后的功能升级预留的,用户程序不能使用这些位。
3.中断响应过程
每个机器周期的S5P2时刻都会对所有的中断请求标志位进行采样,在下一个机器周期对采样到的数据进行顺序查询,如果查询到某个中断请求标志位被置1了,中断系统将产生一条LCALL指令跳转到对应的中断服务程序,这条LCALL指令是隐含执行的,所以称为“隐指令”。
如果发生了以下几种阻断条件,LCALL指令将不能产生:
①同级或更高级别的中断服务程序已经在运行;
②当前机器周期(查询周期)不是正在执行指令的最后一个机器周期;
③正在执行的指令是RETI指令或写IE、IP的指令。
三个阻断条件中的任何一个满足,都不能产生LCALL指令,中断的响应过程被阻断。
阻断条件②确保多周期指令的执行不会被打断,条件③的作用是确保在执行了RETI或访问IE、IP的指令后,至少要执行一条其他指令后再响应中断,原因是这些指令的执行可能会改变中断优先级查询的结果。
如果一个被查询到的中断请求由于上述某个阻断条件没有立刻得到响应,则丢弃查询结果,在下一个机器周期重新进行查询。
“隐指令”LCALL执行时首先把当前PC中两个字节的数据压入堆栈,然后把中断源对应的中断服务程序入口地址(中断向量)装入PC,从而实现程序的跳转。各中断源对应的中断服务程序入口地址见表2-7。当中断服务程序执行中遇到RETI指令时,从堆栈中弹出两个字节的数据装入PC,实现中断返回。
单片机中针对每一个中断优先级都设置了一个中断服务程序执行标志,用来指示当前级别的中断服务程序是否正在运行。当“隐指令”LCALL执行时,自动置位当前级别的中断服务程序运行标志;当中断程序返回指令RETI执行时,会自动清除当前级别的中断服务程序运行标志,而普通子程序返回指令RET就没有这个功能。所以在中断服务程序的最后,必须放上一条RETI指令。
因为中断请求标志查询需要一个机器周期,“隐指令”LCALL的执行需要两个机器周期,执行时间最长的指令(MUL和DIV)需要四个机器周期,所以在只开放一个外部中断并屏蔽所有其他中断的系统中,从中断请求标志IE0或IE1被置位,到中断服务程序的第一条指令被执行,需要3~8个机器周期,如图2-14所示。
图2-14 中断响应的过程
2.1.7 串行口接口
1.串行口的结构
MCS-51单片机内部有一个功能很强的标准串行接口。该串行口可工作在全双工模式,即接收数据和发送数据可以同时进行。
串行口的接收数据缓冲器和发送数据缓冲器在物理上是独立的,但共用同一个字节地址99H,都通过特殊功能寄存器SBUF来进行访问,写SBUF将把数据写入发送数据缓冲器,读取SBUF将从接收数据缓冲器中读取数据。接收数据缓冲器具有双缓冲功能,也就是说在一帧数据接收完成,还没有被CPU读出时,可以同时进行第二帧数据的接收。
MCS-51单片机的串行口用到的特殊功能寄存器除SBUF外还有串行口控制寄存器SCON和电源控制寄存器PCON。
串行口控制寄存器SCON用于控制和监视串行口的工作状态,其字节地址为98H,可以位寻址,位地址范围为98H~9FH。SCON的位定义如下:
SCON各个位的功能如下:
SM0、SM1:串行口工作方式选择位,见表2-8。
SM2:方式2和方式3时的多机通信使能位。串行口工作在方式2或方式3时,如果SM2=1,则接收到的第9位数据(RB8)为0时不产生RI中断。在工作方式1中,如果SM2=1,则未接收到有效的停止位时不产生RI中断。在工作方式0中SM2必须清零。
REN:串行口接收使能位,由软件清0或置1。REN=1则允许接收数据,REN=0则禁止接收数据。
TB8:工作方式2、3中将被串行口发送的第9位数据。
RB8:工作方式2、3中存放串行口接收到的第9位数据。在方式1中,如果SM2=1,RB8表示接收到的停止位。方式0不使用RB8。
TI:串行口发送中断标志位。串行口每发送完一帧数据后,硬件置位TI,CPU响应中断后不会自动清除TI,需要由用户用软件清除。
RI:串行口接收中断标志位。串行口每接收完一帧数据后,硬件置位RI,CPU响应中断后不会自动清除RI,需要由用户用软件清除。
TI和RI也可由用户软件置1,触发相应的中断请求。
电源控制寄存器PCON用于省电运行模式的控制,其字节地址为87H,没有位寻址功能。PCON的位定义如下:
PCON各个位的功能如下:
SMOD:波特率加倍功能选择位。
GF1:通用标志位1。
GF0:通用标志位0。
PD:Power-Down状态选择位,PD=1激活Powered-Down省电模式。
IDL:Idle状态选择位,IDL=1激活Idle省电模式。
2.串行口的工作模式
串行口的工作方式一共有四种,由SCON中的SM0、SM1两位设定,见表2-8。
表2-8 串行口工作方式表
(1)方式0
串行口的方式0为同步移位寄存器输入、输出方式,可外接移位寄存器IC,扩展I/O接口。在方式0下,无论输入还是输出,RXD(P3.0)引脚总是用作数据线,TXD(P3.1)引脚总是用作同步时钟线。TXD引脚每输出一个移位脉冲,RXD上就输入或输出一个二进制位。TXD引脚的移位脉冲频率固定为时钟频率的1/12,即每个机器周期移位一次。
方式0的输出方式时序如图2-15所示。当一个字节的数据写入发送至缓冲器SBUF时,串行口将数据逐位从数据线(RXD)输出,低位在前,高位在后。发送完8位数据后中断标志位TI置1。
图2-15 方式0输出时序
方式0输入方式的时序如图2-16所示。SCON中的REN为串行口接收数据允许位,当REN=0时禁止接收,当REN=1时允许接收。当串行口选择工作方式0,并且REN=1时,串行口就工作在方式0的输入状态。TXD引脚输出移位脉冲,RXD引脚逐位读入数据,低位在前,高位在后。当接收到一个字节(8位)数据后,中断标志位RI置1。
图2-16 方式0输入时序
(2)方式1
串行口工作在方式1时为波特率可变的8位通用异步串行接口。一帧信息由10个二进制位组成,即1个起始位、8个数据位和1个停止位。
方式1时波特率为可变波特率,由下式计算:
式中,SMOD为特殊功能寄存器PCON的最高位,取值为0或1。
定时器T1对机器周期进行计数,T1的溢出率由其工作方式和初值决定。
CPU执行一条写入SBUF的指令就启动发送,当发送完成后,中断标志位TI置1。方式1发送数据的时序如图2-17所示。
图2-17 方式1发送数据时序图
串行口工作在方式1时,若REN=1,则进入允许接收状态,接收到的停止位放入RB8。串行口以选定波特率16倍的频率对RXD引脚的状态进行采样,每一个数据位期间有16个检测脉冲,用中间三次(即第7,8,9次)数据中的两个,作为该数据位的检测值,以抑制干扰。如果RXD引脚上出现了有效的起始位,即从“1”到“0”的状态改变,则启动接收过程,开始接收一帧信息。一帧信息的数据位接收完成后,如果接收到的停止位为“1”,则RI置1,完成一次接收过程,否则丢弃本帧信息。串行口以模式1工作时,SM2通常设置为0。方式1接收数据的时序如图2-18所示。
图2-18 方式1接收数据时序图
(3)方式2和方式3
串行口工作在方式2时为波特率固定的9位通用异步串行接口。一帧信息由11个二进制位组成,即1个起始位、8个数据位、第9位数据和1个停止位。发送时第9位数据是存放在TB8中的数据,接收时接收到的第9位数据放入RB8中。
方式2时波特率由下式计算:
当SMOD=0时,方式2的波特率为fosc/64;当SMOD=1时,方式2的波特率为fosc/32,fosc为晶振频率。
方式3的波特率为可变波特率,其波特率由下式计算:
定时器T1对机器周期进行计数,T1的溢出率由其工作方式和初值决定。
方式2和方式3只有波特率的计算方式不同,除此以外完全相同。
方式2和方式3在发送数据之前,SCON中的TB8可先用软件置1或清0,TB8可作为多机通信中地址或数据的标志位,也可以作为串行通信的奇偶校验位。CPU执行一条写入SBUF的指令就启动发送,当发送完成后,中断标志位TI置1。数据发送时序与方式1基本相同,区别只在于多了一个数据位。
方式2和方式3的接收过程也和方式1类似,区别在于接收到第9位数据送入RB8后,如果此时SM2=1且RB8=0,则丢弃本帧数据,不申请中断。只有在SM2=0或者RB8=1的情况下,才将RI置1,申请中断。利用串行口工作方式2和方式3的这个特点可实现多机通信。
3.多机通信
如前所述,串行口工作在方式2或方式3并设置SM2=1时,只有接收到的第9位数据RB8=1,数据才能装入接收缓冲器,并置中断标志RI为1,向CPU发出中断请求处理该数据。如果接收到的RB8=0,则丢弃接收到的数据,不产生中断信号。而当设置SM2=0时,无论第9位数据是0还是1,都会将接收的数据放入接收缓冲器,并产生中断信号。利用这个特点,可实现多个处理器间的多机通信,如图2-19所示为简单的主从式多机通信系统示意图。
图2-19 多机通信示意图
主机和从机串行口的波特率和数据帧长度应保持一致。从机串行口应初始化为方式2或方式3,置SM2=1,允许接收,允许串行口中断,为每一台从机分配一个独立的地址。当主机要发送一串数据给某一从机时,首先送出该从机的地址,并使其第9位数据位“1”,称为地址帧。各从机的串行口收到地址帧时,因第9位数据是1,都会置位RI申请中断,在RI中断处理程序中,检查收到的地址是否与本机地址相符,如果相符,则令SM2=0,否则保持SM2=1。接下来主机可发送数据帧,数据帧的第9位数据为0。从机收到数据帧时,因为第9位数据RB8为0,只有刚才令SM2=0的从机才会置位RI中断,对数据进行处理,而其他的从机因SM2=1,不符合接收数据的条件,都会丢弃数据帧。主机通过广播地址帧的方式选定从机之后,也可以按照事先的约定让从机发送数据、主机接收。这样就实现了串行口的多机通信。
4.波特率的设定
串行口每秒钟发送或接收的二进制数的位数(bit)称为波特率。假设发送一位数据所需时间为T,则波特率为1/T。
串行口在各工作方式下波特率的设定和计算方法前面已经做了介绍,这里给出串行口工作在方式1或方式3,用定时器T1工作在方式2(自动重装载初值方式)产生波特率时常用的波特率及其设置方法(见表2-9)。T1的溢出率与计数器重装载值TH1及晶振频率fosc有关。串行口工作在方式1或方式3时的波特率可由下式计算:
表2-9 常用波特率的设置(T1的重装载值)
2.1.8 输入/输出端口
MCS-51单片机有32个输入/输出引脚,组成4个8位的并行I/O接口,分别称为P0口、P1口、P2口和P3口,特殊功能寄存器P0,P1,P2和P3是它们的端口锁存器。四个并行口既可以作为字节操作,也可以按位操作。四个并行口都是双向口,既可以输入,也可以输出。
1.P1口
P1口在四个并行I/O接口中功能最为简单,图2-20为P1口1位的结构原理图,P1口的8个引脚结构是相同的。
图2-20 P1口1位结构原理图
图2-20中,锁存器的作用是锁存输出信息,P1口的8个锁存器组成特殊功能寄存器P1,场效应管V1与上拉电阻组成输出驱动器。读引脚信号和读锁存器信号各自控制一个三态门。
P1口用作输出时,通过内部总线把要输出的数据(0或1)写入到P1口每个引脚的锁存器上。如果输出的数据是0,则反相输出端将场效应管V1打开,外部引脚上出现低电平;如果输出的数据是1,则反相输出端会使场效应管V1截止,由于内部上拉电阻的作用,外部引脚上出现高电平。
P1口用作输入时,分为两种情况,一种是读引脚,一种是读锁存器。
当计算机执行读P1口的指令时,P1口工作于读引脚状态。假如P1的端口锁存器中为0,反相输出端将使场效应管V1始终打开,P1.x引脚将被箝位在低电平上,无法输入高电平。所以在读取P1口或P1某一位的引脚状态前,用户程序必须在对应的端口锁存器里面写上1。正因为如此,P1口也被称为准双向口。读取引脚状态的指令如MOV A,P1会发出读引脚信号,打开对应的三态门,引脚P1.x上的数据进入内部总线。
还有一些指令从锁存器中读取数据、进行处理、并把处理后的数据写回锁存器中,这些指令称为“读—修改—写”指令。在ANL,ORL,XRL,JBC,CPL,INC,DEC,DJNZ,MOV,CLR,SETB等指令中,当目标操作数是某一个I/O接口或I/O接口中的某一位时,这些指令均为“读—修改—写”指令。
2.P2口
P2口除了可用作一般I/O接口外,还可以用作高8位地址总线。图2-21是P2口的1位结构原理图。图中的模拟开关受内部控制信号的控制,用于选择P2口的工作状态。
当图中的模拟开关打在左边时,P2口用作一般I/O接口,此时和P1口的工作原理基本相同。输出0时场效应管V1导通,外部引脚输出低电平;输出1时V1截止,由于存在内部上拉电阻,外部引脚输出高电平。输入时必须保持端口锁存器的值为1,才能正常输入高电平。输入也分为读引脚状态和读锁存器状态,与P1口相同。
当图中模拟开关打在右边时,P2口输出高8位的地址信息。地址总线为单向总线,只能输出,不能输入。
图2-21 P2口1位结构原理图
3.P3口
P3口除了可用作一般I/O接口外,每一个引脚都具有第二功能,详见表2-10。图2-22是P3口1位的结构原理图。
P3口用作一般I/O接口时和P1口相同。
P3口的引脚使用其第二功能时,对应的锁存器里必须为“1”,否则图中的与非门输出始终为1,V1导通,引脚被箝位在低电平,不能正常工作。
表2-10 P3口的第二功能
图2-22 P3口1位结构原理图
4.P0口
P0口既可以工作在一般I/O接口方式,又可以分时复用作为数据总线和低8位地址总线。P0口的8个引脚结构是相同的,图2-23为P0口1位的结构原理图。
当控制信号C=0时,P0口用作一般I/O接口(见图2-23)。此时图中与门的输出为0,场效应管V2始终处于截止状态。当输出低电平时,端口锁存器的内容为“0”,V1导通,V2截止,外部引脚为低电平状态;当输出高电平时,端口锁存器的内容为“1”时,V1和V2都截止,外部引脚实际处于悬浮状态,需要外加上拉电阻,才能获得高电平状态。P0口用作一般I/O接口的输出时为“开漏”输出。用作输入时,端口锁存器的内容必须为“1”,此时P0口工作在高阻输入状态。输入也分为读引脚状态和读锁存器状态,这与P1口相同。
当控制信号C=1时,P0口分时复用为数据总线和低8位地址总线。当总线输出“0”时,V2截止,V1导通,外部引脚为低电平状态;当总线输出“1”时,V2导通,V1截止,外部引脚为高电平状态,此时P0口为“推挽”输出。需要数据总线输入的数据经过读引脚信号控制的三态门,进入内部总线。
图2-23 P0口1位结构原理图
5.I/O端口的驱动能力
P0口、P1口和P2口可以驱动4个LS TTL负载,即输出电流不小于400μA;
P0口的输出缓冲器可驱动8个LS TTL负载,作一般I/O接口使用时为“开漏”输出,需要外加上拉电阻,作数据/地址总线使用时不需要外加上拉电阻。
2.1.9 节电运行功能及工作方式
在电池供电的便携式设备等对功耗敏感的应用系统中,可以使用单片机的节电运行功能。采用COMS工艺的80C51单片机有两种省电模式,即空转(Idle)模式和掉电(Power-down)模式。在这两种省电模式下电源都从VCC引脚输入。电源控制寄存器PCON用于省电运行模式的控制,其字节地址为87H,没有位寻址功能。PCON的位定义如下:
PCON各个位的功能如下:
SMOD:波特率加倍功能选择位。
GF1:通用标志位1。
GF0:通用标志位0。
PD:Power-Down状态选择位,PD=1激活Power-Down省电模式。
IDL:Idle状态选择位,IDL=1激活Idle省电模式。
图2-24说明了实现这两种省电模式的内部逻辑电路。当PCON中的IDL位为1时,单片机进入空转模式,时钟发生器继续运行,中断系统、串行口、定时器/计数器等部分继续获得时钟信号,但通向CPU的时钟信号被屏蔽。当PCON中的PD位为1时,单片机进入掉电模式,时钟发生器停止工作。如果PCON的IDL位和PD位都为1,则PD位的功能优先。
1.空转(Idle)模式
若一条指令将PCON.0(即IDL位)置1,这条指令就成为单片机进入空转模式前执行的最后一条指令。由于CPU不能得到时钟信号,程序的执行过程将中止,CPU的当前状态被完整地保存起来,包括堆栈指针SP、程序计数器PC、程序状态字PSW、累加器A以及所有工作寄存器的值都不再发生改变,并行I/O接口也保持进入空转时的状态,ALE和输出逻辑高电平。
图2-24 省电模式的内部逻辑框图
在空转模式下,中断系统、定时器/计数器、串行口可正常工作,可产生中断。
有两种方式可以退出空转模式,即响应中断和硬件复位。
空转模式下对任何中断的响应都会导致硬件清除PCON中的IDL位,从而结束空转模式,转去执行中断服务程序。中断服务程序执行完成之后会返回主程序,继续执行进入空转模式的那条指令之后的指令。如果在将IDL位置1的指令中同时设置GF0和GF1这两个通用标志位,当中断服务程序执行时去查询这两个标志位的状态,就可以判断出当前执行的中断服务程序是在正常工作模式下激活的,还是在空转模式下激活的。
硬件复位也会清除IDL位,从而使单片机退出空转模式,回到正常工作模式。
2.掉电(Power-Down)模式
若一条指令将PCON.1(即PD位)置1,这条指令就成为单片机进入掉电模式前执行的最后一条指令。在掉电模式下,单片机内部的所有部分都停止工作,内部RAM和特殊功能寄存器的值被保留。并行I/O接口保持进入掉电时的状态,ALE和。
只有一种方式可以退出掉电模式,即硬件复位。硬件复位将重置相关特殊功能寄存器的值,但不会改变内部RAM的值。
在进入掉电模式后,VCC的电压值降低至2V仍可保持内部RAM的内容。但在进入掉电模式之前和从掉电模式退出之前,必须确保VCC电压值在正常的工作范围,否则单片机可能会出现工作异常。