本节书摘来自异步社区《51单片机应用开发范例大全(第3版)》一书中的第1章,第1.1节,作者 张杰,宋戈,黄鹤松,员玉良,更多章节内容可以访问云栖社区“异步社区”公众号查看。
单片微型计算机(Single Chip Micro Computer)现已正名为微控制器(MCU,Micro Controller Unit),单片机的称谓只是其习惯称呼。它把组成微型计算机的各功能部件(包括中央处理单元CPU、随机存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行口等)集成在一块电路芯片上。由于单片机的硬件结构与指令系统的功能都是按工业控制要求而设计的,因此常用在工业检测、控制装置中。
MCS-51是指美国Intel公司生产的一系列单片机的总称。这一系列单片机包括很多种,如8031、8051、8751、8032、8052、8752等。其中8051是最早、最典型的产品,该系列其他单片机都是以8051为核心发展起来的,都具有8051的基本结构和软件特征。8051单片机内部包含了作为微型计算机所必需的基本功能部件,各部件相互独立地集成在同一块芯片上。其基本功能特性如下:
下面详细介绍8051单片机的基本工作原理和内部各功能模块等基础知识。
标准8051单片机有几种不同的封装形式。本书以目前市场上最常见,也是最廉价的PDIP40(塑料双列直插40引脚)封装的8051为主要描述对象,其引脚排列如图1-1所示。
40个引脚功能说明如下。
(1)主电源引脚VSS和VCC。
(2)外接晶振引脚XTAL1和XTAL2。
(4)输入/输出引脚P0口、P1口、P2口、P3口。
这里主要介绍组成8051系列单片机的基本功能结构,如图1-2所示。
从图1-2中可以看到,8051单片机主要包含中央处理器(CPU)、程序存储器(ROM)、数据存储器(RAM)、定时器/计数器、并行接口、串行接口和中断系统几大功能模块及数据总线、地址总线和控制总线等,将在后面的小节中详细介绍。
此外,8051单片机还有8位内部总线,作为数据、地址及控制信号传输的高速通道,负责将各个外围模块以及核心区域的各功能部件(累加器A、算术/逻辑运算单元ALU、程序计数器PC、程序状态字寄存器PSW、数据指针DPTR、ROM、RAM、特殊功能寄存器SFR等)联系起来。
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入/输出功能等操作。它由运算器、控制器(定时控制部件)和专用寄存器组3部分部件组成。
1.运算器(ALU)
运算器的功能是进行算术运算和逻辑运算。可以对半字节、单字节等数据进行操作,既能够完成加、减、乘、除等四则运算,也可以完成加1、减1、BCD码十进制调整、比较等算术运算和与、或、异或、求补、循环等逻辑运算。
8051运算器还包含有一个布尔处理器,用来处理位操作,以进位标志位C为累加器,可执行置位、复位、取反、等于1转移、等于0转移、等于1转移且清0以及进位标志位与其他可寻址的位之间进行数据传送等位操作。也能使进位标志位与其他可寻址的位之间进行逻辑与、或操作。
2.控制器
(1)时钟电路。
8051片内设有一个由反向放大器所构成的振荡电路,XTAL1和XTAL2分别为振荡电路的输入和输出端,时钟可以由内部方式产生或外部方式产生。内部方式时钟电路如图1-3所示。在XTAL1和XTAL2引脚上外接定时元件,内部振荡电路就产生自激振荡。定时元件通常采用石英晶体和电容组成的并联谐振回路。晶振频率可以在1.2MHz~12MHz之间选择,电容在5pF~30pF之间选择,电容的大小可起频率微调作用。
外部方式的时钟很少用,若要用时,只要将XTAL1接地,XTAL2接外部振荡器就行,如图1-4所示。对外部振荡信号无特殊要求,只要保证脉冲宽度,一般采用频率低于12MHz的方波信号。
时钟频率越高,单片机控制器的控制节拍就越快,运算速度也越快,但同时消耗的功率也更大,对外界的干扰也更强。因此,不同型号、不同场合的单片机所需要的时钟频率是不一样的。
(2)振荡周期、时钟周期、机器周期和指令周期。
一条指令译码产生的一系列微操作信号在时间上有严格的先后次序,这种次序就是计算机的时序。8051的主要时序将在后续章节中介绍,这里先介绍其基本时序周期。
振荡周期、时钟周期、机器周期和指令周期的关系如图1-5所示。
3.专用寄存器组
专用寄存器组主要用来指示当前要执行的内存地址、存放操作数和指示指令执行后的状态等,是任何一台计算机的CPU不可或缺的组成部件。8051的专用寄存器组主要包括累加器(ACC)、通用寄存器(B)、程序状态字(PSW)、堆栈指示器(SP)、数据指针(DPTR)和程序计数器(PC)等,下面分别对这些寄存器进行介绍。
(1)累加器(ACC)。
累加器是最常用的特殊功能寄存器,是一个二进制8位寄存器,运算大部分单操作数指令的操作数取自累加器,双操作数指令的一个操作数取自累加器。加、减、乘、除算术运算指令的运算结果都存放在累加器ACC或A、B寄存器中。指令系统中用A或ACC作为累加器的助记符。
【实例1】使用累加器进行简单加法运算:
MOV A,#02H ;A←02H
ADD A,#06H ;A←A+06H
指令“MOV A,#02H”是把加数2预先送到累加器A,为指令“ADD A,#06H”的执行做准备,因此,指令“ADD A,#06H”执行前累加器A中为加数2,在执行后变为两数之和8。
(2)通用寄存器(B)。
B寄存器是乘除法指令中常用的寄存器。乘法指令的两个操作数分别取自A和B,其结果存放在B(高8位)、A(低8位)寄存器中。除法指令中,被除数取自A,除数取自B,商数存放于A,余数存放于B。在其他指令中,B寄存器可作为RAM中的一个单元来使用。
【实例2】使用B寄存器进行简单乘法运算:
MOV A,#02H ; A←2
MOV B,#06H ; B←6
MUL AB ; BA←A*B=6*2
前面两条是传送指令,是进行乘法前的准备指令,乘法指令执行前累加器A和通用寄存器B中分别存放了两个乘数,乘法指令执行后,积的高8位自动存放在B中,低8位自动存放在A中。
(3)程序状态字(PSW)。
程序状态字是一个8位寄存器,包含了程序的状态信息,寄存器各位代表的含义如图1-6所示。
其中PSW1未用。其他各位说明如下。
【实例3】通过设置RS1、RS0选择工作寄存器区1:
CLR PSW.4 ; PSW.4←0
SETB PSW.5 ; PSW.5←1
(4)堆栈指针(SP)。
栈指针SP一个8位特殊功能寄存器,其作用为指示堆栈顶部在内部RAM中的位置。系统复位后,SP初始化为07H,使得堆栈事实上由08H单元开始。考虑到08H~1FH单元分属于工作寄存器区1~3,若程序设计中要用到这些区,则最好把SP值设置为1FH或更大的值,SP的初始值越小,堆栈深度就可以越深。堆栈指针的值可以由软件改变,因此堆栈在内部RAM中的位置比较灵活。
(5)数据指针(DPTR)。
数据指针DPTR是一个16位特殊功能寄存器,其高位字节寄存器用DPH表示,低位字节寄存器用DPL表示,既可以作为一个16位寄存器DPTR来处理,也可以作为两个独立的8位寄存器DPH和DPL来处理。DPTR主要用来存放16位地址,当对64KB外部存储器寻址时,可作为间址寄存器使用。
【实例4】使用数据指针DPTR访问外部数据数据存储器:
MOV DPTR, #data16 ; DPTR←data16
MOVX A, @ DPTR ; A←((DPTR))
MOVX @ DPTR, A ; (DPTR)←A
(6)程序计数器(PC)。
程序计数器(PC)用来存放即将要执行的指令地址,共16位,可对64KB的程序存储器直接寻址。读取存储在外部程序存储器中的指令时,PC内容的低8位经P0口输出,高8位经P2口输出。
【实例5】使用程序计数器PC查表:
MOV A, #data ;A←data
MOVC A, @ A+DPTR ; PC←(PC)+1 ,A←((A)+(PC))
MCS-51单片机的存储器编址方式采用与工作寄存器、I/O口锁存器统一编址的方式,程序存储器和数据存储器空间是互相独立的,各有自己的寻址系统和控制信号,物理结构也不同。程序存储器为只读存储器(ROM),数据存储器为随机存储器(RAM)。
从物理地址空间看,MCS-51有4个存储器地址空间,即片内程序存储器和片外程序存储器以及片内数据存储器和片外数据存储器,其组织结构如图1-7所示。
1.程序存储器
程序存储器用来存放程序和表格常数。程序存储器以程序计数器PC作地址指针,通过16位地址总线,可寻址的地址空间为64KB。片内、片外统一编址。
在8051/8751片内,带有4KB的ROM/EPROM程序存储器。因此当接高电平时,将从内部ROM开始运行整个程序,其中外部程序存储器地址空间为1000H-FFFFH。若将接低电平,可用于调试外部ROM内的程序,即把要调试的程序放在与内部ROM空间重叠的外部程序存储器内,进行调试和修改。
在程序存储器中有些特殊的单元在使用中应加以注意。其中一组特殊单元是0000H~0002H单元,系统复位后,PC为0000H,单片机从0000H单元开始执行程序,该单元是系统执行程序的起始地址,通常在该单元中存放一条跳转指令,而用户程序从跳转地址开始存放程序。
另一组特殊单元是0003H~002AH,这40个单元专门用于存放中断处理程序,按中断的类型被均匀地分为5段,其定义如下。
2.数据存储器
MCS-51单片机的数据存储器无论在物理上或逻辑上都分为两个地址空间,一个为内部数据存储器,访问内部数据存储器用MOV指令;另一个为外部数据存储器,访问外部数据存储器用MOVX指令。
MCS-51系列单片机各芯片内部都有数据存储器,是最灵活的地址空间,分成物理上独立的且性质不同的几个区。8051内部有128个8位用户数据存储单元和128个专用寄存器单元,这些单元是统一编址的,专用寄存器只能用于存放控制指令数据。所以,用户能使用的RAM只有00H~7FH(0~127)单元组成的128字节地址空间,可存放读写的数据或运算的中间结果;80H~FFH(128~255)单元组成的高128字节地址空间的特殊功能寄存器(又称SFR)区只能访问,而不能用于存放用户数据。
注意
8032/8052单片机将80H~FFH(128~255)单元组成的高128字节地址空间作为RAM区。
对于片内RAM的低128字节(00H~7FH)还可以分成工作寄存器区、可位寻址区和一般RAM区3个区域,其功能特点如下。
特殊功能寄存器中只有一部分是定义了的,对其他没有定义的地址进行操作会导致不确定的结果。8051内部特殊功能寄存器符号及地址如表1-2所示,其中带“*”号的特殊功能寄存器都是可以位寻址的,并可以用“寄存器名.位”来表示,如ACC.0、B.7等。
MCS-51可以扩展64KB外部数据存储器,这对很多应用领域已足够使用,对外部数据存储器的访问采用MOVX指令,用间接寻址方式,R0、R1和DPTR都可用作间址寄存器。
8051片内有两个16位的可编程定时器/计数器T0和T1,用于定时或计数产生中断控制程序执行,它们各由两个独立的8位寄存器组成,用于存放定时或计数时的时间常数。T0由两个8位寄存器TH0和TL0组成,其中TH0为高8位,TL0为低8位。和T0类同,T1也由TH1和TL1两个8位寄存器组成,其中TH1为高8位,TL1为低8位。TH0、TL0、TH1和TL1均为SFR特殊功能寄存器,用户可以通过指令对他们进行数据存取。
T0和T1有定时器和计数器两种工作模式,在每种模式下又分为若干工作方式。在定时器模式下,T0和T1通过对每个机器周期的计数,即一个机器周期定时器加1,当定时器的数值与TH0/1和TL0/1中的时间常数相等时,执行指定动作。在计数器模式下,T0和T1的计数脉冲可以从P3.4和P3.5引脚上输入,在输入引脚的电平由高到低出现跳变时计数器加1。对T0和T1的控制由两个8位特殊功能寄存器完成:一个称为定时器方式选择寄存器TMOD,用于确定是定时器工作模式还是计数器工作模式;另一个叫做定时器控制寄存器TCON,用于决定定时器或计数器的启动、停止以及进行中断控制。
I/O端口也叫做I/O通道或I/O通路,是MCS-51单片机对外部实现控制和信息交换的必经之路。I/O端口有串行和并行之分,串行I/O端口一次只能传送一位二进制信息,并行I/O端口一次能传送一组二进制信息。
MCS-51单片机有P0、P1、P2、P3等4个8位双向I/O端口,每一条I/O线都能独立地用做输入和输出,其内部结构和功能如下。
在实际应用中,P3口的第二功能更为重要,表1-3列出了P3口的各位的第二功能。
每个I/O端口内部都有一个8位数据输出锁存器和一个8位数据输入缓冲器,4个数据输出锁存器与端口号P0、P1、P2和P3同名,都是特殊功能寄存器。因此,CPU数据从并行I/O端口输出时可以得到锁存,数据输入时可以得到缓冲。
4个并行I/O端口作为通用I/O口使用时,共有写端口、读端口和读引脚3种操作方式。写端口实际上就是输出数据,是将累加器A或其他寄存器中数据传送到端口锁存器中,然后由端口自动从端口引脚线上输出。读端口不是真正的从外部输入数据,而是将端口锁存器中输出数据读到CPU的累加器。读引脚才是真正的输入外部数据的操作,是从端口引脚线上读入外部的输入数据。
8051有一个全双工的可编程串行I/O端口。这个串行I/O端口既可以在程序控制下将CPU的8位并行数据编程串行数据一位一位地从发送数据线TXD发送出去,也可以把串行接收到的数据变成八位并行数据送给CPU,而且这种串行发送和串行接收可以单独进行,也可以同时进行。
8051串行发送和串行接收利用了P3口的第二功能,即利用P3.1引脚作为串行数据的发送线TXD,利用P3.0引脚作为串行数据的接收线RXD,如表1-3所示。串行I/O口的电路结构还包括串行口控制器SCON、电源及波特率选择寄存器PCON和串行数据缓存器SBUF等,这些寄存器都属于特殊功能寄存器(SFR)。其中PCON和SCON用于设置串行口工作方式和确定数据的发送和接收波特率,串行数据缓冲器SBUF用于存放欲发送或已接收的数据。SBUF实际上由两个相互独立的发送缓冲器和接收缓冲器组成,当要发送的数据传送到SBUF时,进的是发送缓冲器;当要从SBUF读数据时,则取自接收缓冲器,取走的是刚接收到的数据。
8051的中断系统可以接受5个独立的中断源的中断请求,这5个中断源即2个外部中断、2个定时器/计数器中断和1个串行口中断。
外部中断源产生的中断请求信号可以从P3.2和P3.3引脚上输入,有电平或边沿两种触发方式;内部中断源T0和T1的两个中断是在其从全“1”变为全“0”溢出时自动向中断系统提出的;内部串行口中断源的中断请求是在串行口每发送完一个8位二进制数据或接收到一组输入数据(8位)后自动向中断系统提出的。
8051的中断系统主要由IE(Interrupt Enable,中断允许)控制器和中断优先级控制器IP等电路组成。其中,IE用于控制5个中断源中哪些中断请求被允许向CPU提出,哪些中断源的中断请求被禁止,IP用于控制5个中断源的中断请求的优先级。
MCS-51单片机属总线型结构,其总线通常分为地址总线、数据总线和控制总线等3种,其功能分别如下。
在访问外部存储器时,P2口输出高8位地址,P0输出低8位地址,由ALE(地址锁存允许)信号将P0口(地址/数据总线)上的低8位锁存到外部地址锁存器中,从而为P0口接收数据做准备。