第1章 8051单片机的基本组成
1.1 8051单片机的特点与基本结构
8051系列单片机是在美国Intel公司于20世纪80年代推出的MCS-51系列高性能8位单片机的基础上发展而来的,它在单一芯片内集成了并行I/O口、异步串行口、16位定时器/计数器、中断系统、片内RAM和片内ROM以及其他一些功能部件。现在8051系列单片机已经有了很大的发展,除Intel公司之外,Philips、Siemens、AMD、Fujutsu、OKI、Atmel、SST、Winbond等公司都推出了以8051为核心的新一代8位单片机,这种新型单片机的集成度更高,在片内集成了更多的功能部件,如A/D、PWM、PCA、WDT及高速I/O口等。不同公司推出的8051具有各自的功能特点,但它们的内核都是以Intel公司的MCS-51为基础的,并且指令系统兼容,从而给用户带来了广阔的选择范围,同时又可以采用相同的开发工具。
8051系列单片机可分为无片内ROM型和带片内ROM型两种。对于无片内ROM型的芯片,必须外接EPROM才能应用(典型芯片为8031)。带片内ROM型的芯片又分为片内EPROM型(典型芯片为87C51)、片内Flash型(典型芯片为89C51)、片内掩模ROM型(典型芯片为8051),一些公司还推出了一种带有片内一次性可编程ROM(One Time Programming,简称OTP)的芯片(典型芯片为97C51)。一般来说,片内EPROM型或片内Flash型芯片适合于开发样机和需要现场进一步完善的场合,当样机开发基本成功后,可以采用OTP型芯片进行小批量试生产,完全成功后再采用带掩模ROM的8051进行大批量生产。
8051系列单片机在存储器的配置上采用所谓的“哈佛”结构,即在物理上具有独立的程序存储器和数据存储器,而在逻辑上则采用相同的地址空间,利用不同的指令和寻址方式进行访问,可分别寻址64 KB的程序存储器空间和64 KB的数据存储器空间,充分满足工业测量控制的需要。8051系列单片机共有111条指令,其中包括乘除指令和位操作指令。中断源有5个(8032/8052为6个),分为两个优先级,每个中断源的优先级是可编程的。
在8051系列单片机的内部RAM区中开辟了4个通用工作寄存区,共有32个通用寄存器,可以适用于多种中断或子程序嵌套的情况。另外还在内部RAM中开辟了1个位寻址区,利用位操作指令可以对位寻址区中每个单元的每一个位直接进行操作,特别适合于解决各种开关控制和逻辑问题。ROM型8051在单芯片应用方式下其4个并行I/O口(P0~P3)都可以作为输入/输出之用,在扩展应用方式下则需要采用P0和P2口作为片外扩展地址总线之用。8051单片机内部集成了两个(8032/8052为3个)16位定时器/计数器,可以十分方便地进行定时和计数操作,还集成了一个全双工的异步串行接口,可同时发送和接收数据,为单片机之间的相互通信或与上位机通信带来极大的方便。
8051单片机的基本组成如图1.1所示,一个单片机芯片内包括:
● 中央处理器CPU,它是单片机的核心,用于产生各种控制信号,并完成对数据的算术逻辑运算和传送;
● 内部数据存储器RAM,用以存放可以读/写的数据;
● 内部程序存储器ROM,用以存放程序指令或某些常数表格;
● 4个8位的并行I/O接口P0、P1、P2和P3,每个口都可以用做输入或者输出;
● 两个(8051)或三个(8052)定时器/计数器,用来作为外部事件计数器,也可用来定时;
● 内部中断系统具有5个中断源,两个优先级的嵌套中断结构,可实现二级中断服务程序嵌套,每一个中断源都可用软件程序规定为高优先级中断或低优先级中断;
● 一个串行接口,可用于异步接收/发送器;
● 内部时钟,但晶体和微调电容需要外接,振荡频率可以高达40 MHz。
以上各部分通过内部总线相连接。
图1.1 8051单片机的基本组成
在很多情况下,单片机还要和外部设备或外部存储器相连接,连接方式采用三总线(地址、数据、控制)方式,但在8051单片机中,没有单独的地址总线和数据总线,而是与通用并行I/O口中的P0口及P2口共用的,P0口分时作为低8位地址线和8位数据线,P2口则作为高8位地址线用,可形成16条地址线和8条数据线。
一定要建立一个明确的概念,即单片机在进行外部扩展时的地址线和数据线都不是独立的总线,而是与并行I/O口公用的,这是8051单片机结构上的一个特点。
图1.2所示为8051单片机内部结构图,其中中央处理器CPU包含运算器和控制器两大部分,运算器完成各种算术和逻辑运算,控制器在单片机内部协调各功能部件之间的数据传送和运算操作,并对单片机外部发出若干控制信息。
1.运算器
运算器以算术逻辑单元ALU为核心,加上累加器ACC、暂存寄存器TMP和程序状态字寄存器PSW等所组成。ALU主要用于完成二进制数据的算术和逻辑运算,并通过对运算结果的判断影响程序状态字寄存器PSW中有关位的状态。累加器ACC是一个8位的寄存器(在指令中一般写为A),它通过暂存寄存器TMP与ALU相连,ACC的工作最为繁忙,因为在进行算术逻辑运算时,ALU的一个输入多为ACC的输出,而大多数运算结果也需要送到ACC中,在进行乘除运算时,B寄存器用来存放一个操作数,它也用来存放乘除运算后的一部分结果,在不进行乘除操作时,B寄存器可用做通用寄存器。程序状态字寄存器PSW也是一个8位寄存器,用于存放运算结果的一些特征,格式如下:
图1.2 8051单片机的内部结构
其中D7~D0各标志位的意义如下:
CY:进位标志。在进行加法或减法运算时,若运算结果的最高位有进位或借位,CY=1,否则CY=0,在执行位操作指令时,CY作为位累加器。
AC:辅助进位标志。在进行加法或减法运算时,若低半字节向高半字节有进位或借位,AC=1,否则AC=0,AC还作为BCD码运算调整时的判别位。
F0:用户标志。用户可根据自己的需要对F0赋以一定的含义,例如,可以用软件来测试F0的状态以控制程序的流向。
RS1和RS0:工作寄存器组选择。可以用软件来置位或复位。它们与工作寄存器组的关系如表1.1所示。
表1.1 RS1和RS0与工作寄存器组的关系
OV:溢出标志。当两个带符号的单字节数进行运算,结果超出-12~+127的范围时,OV=1,表示有溢出,否则OV=0表示无溢出。
D1:PSW中的D1位为保留位,对于8051来说没有意义,对于8052来说为用户标志,与F0相同。
P:奇偶校验标志。每条指令指行完毕后,都按照累加器A中“1”的个数来决定P值,当“1”的个数为奇数时,P=1,否则P=0。
2.控制器
控制器包括定时控制逻辑、指令寄存器、指令译码器、程序计数器PC、数据指针寄存器DPTR、堆栈指针SP、地址寄存器和地址缓冲器等。它的功能是对逐条指令进行译码,并通过定时和控制电路在规定的时刻发出各种操作所需的内部和外部控制信号,协调各部分的工作。下面简单介绍其中主要部件的功能。
程序计数器PC:用于存放下一条将要执行指令的地址。当一条指令按PC所指向的地址从程序存储器中取出之后,PC的值会自动增加,即指向下一条指令。
堆栈指针SP:用来指示堆栈的起始地址。8051单片机的堆栈位于片内RAM中,而且属于“上长型”堆栈,复位后SP被初始化为07H,使得堆栈实际上由08H单元开始。必要时可以给SP装入其他值,重新规定栈底的位置。堆栈中数据操作规则是“先进后出”,每往堆栈中压入一个数据,SP的值自动加1,随着数据的压入,SP的值将越来越大,当数据从堆栈弹出时,SP的值将越来越小。
指令译码器:当指令送入指令译码器后,由译码器对该指令进行译码,即把指令转变成为所需要的电平信号,CPU根据译码器输出的电平信号使定时控制电路产生执行该指令所需要的各种控制信号。
数据指针寄存器DPTR:它是一个16位寄存器,由高位字节DPH和低位字节DPL组成,用来存放16位数据存储器的地址,以便对片外64 KB的数据RAM区进行读/写操作。
采用40引脚双列直插封装(DIP)的8051单片机引脚分配如图1.3所示,其引脚功能如下。
图1.3 8051系列单片机引脚分配图
Vss(20):接地。
Vcc(40):接+5 V电源。
XTAL1(19)和XTAL2(18):在使用单片机内部振荡电路时,这两个端子用来外接石英晶体和微调电容,如图1.4(a)所示。在使用外部时钟时,则用来输入时钟脉冲,但对NMOS和CMOS芯片接法不同,图1.4(b)所示为NMOS芯片8051外接时钟,图1.4(c)所示为CMOS芯片80C51外接时钟。
图1.4 80C51单片机的时钟接法
RST/VPD(9):RST是复位信号输入端。当此输入端保持两个机器周期(24个振荡周期)的高电平,就可以完成复位操作。此引脚的第二功能是VPD,即备用电源输入端,当主电源发生故障,降低到规定的低电平以下时,VPD将为片内RAM提供备用电源,以保证存储在RAM中的信息不丢失。
ALE/(30):ALE是地址锁存允许信号,在访问外部存储器时,用来锁存由P0口送出的低8位地址信号。在不访问外部存储器时,ALE以振荡频率1/6的固定速率输出脉冲信号。因此它可用做对外输出的时钟。但要注意,只要外接有存储器,则ALE端输出的就不再是连续的周期脉冲信号了。第二功能是用于对8751片内EPROM编程的脉冲输入端。
(29):它是外部程序存储器ROM的读选通信号。在执行访问外部ROM指令的时候,会自动产生信号,而在访问外部数据存储器RAM或访问内部ROM时,不产生信号。
/VPP(31):访问外部存储器的控制信号。当为高电平时,访问内部程序存储器,但当程序计数器PC的值超过0FFFH(对于8051/8051/8751单片机)或1FFFH(对于8052单片机)时,将自动转向执行外部程序存储器内的程序。当保持低电平时,则只访问外部程序存储器,而不管是否有内部程序存储器。该引脚的第二功能VPP为对8751片内EPROM的21V编程电源输入。
P0.0~P0.7(39~32):双向I/O口P0。P0口首先作为双向I/O功能,其第二功能是在访问外部存储器时,可分时用做低8位地址和8位数据线,在对8751编程和校验时,用于数据的输入和输出。P0口能以吸收电流的方式驱动8个LS型TTL负载。
P1.0~P1.7(1~8):双向I/O口P1。P1口能驱动(吸收或输出电流)4个LS型TTL负载。在对EPROM编程和程序验证时,它接收低8位地址。在8052单片机中,P1.0还用作定时器2的计数触发输入端T2,P1.1还用做定时器2的外部控制端T2EX。
P2.0~P2.7(21~28):双向I/O口P2。P2口可以驱动(吸收或输出电流)4个LS型TTL负载。其第二功能是在访问外部存储器时,输出高8位地址。在对EPROM编程和校验时,它接收高位地址。
P3.0~P3.7(10~17):双向I/O口P3。P3口能驱动(吸收或输出电流)4个LS型TTL负载。P3口的每条引脚都有各自的第二功能。