51单片机初级入门实战教程
上QQ阅读APP看书,第一时间看更新

第3章 51单片机硬件系统及体系结构

单片机(single chip microcomputer)是一种集成芯片,主要功能是在单硅晶片上集成微型计算机的主要功能。简单地讲单片机是一个微型计算机系统,内部集成了输入/输出口、中央处理器(CPU)、随机数据存储器(RAM)、只读程序存储器(ROM)、定时器/计数器、以及串行通信等主要功能器件。目前,常用的是8051系列,不同51系列单片机的内部结构基本相同,本章以8051单片机为例,从初学者入门的角度针对性地介绍51单片机硬件系统和体系结构。

3.1 单片机基本结构与引脚功能

3.1.1 单片机基本结构

本书所讲的51系列单片机指的是MCS-51系列单片机,可能不同厂家生产的51系列单片机从表面到内部资源不完全一样,但是芯片的内部结构是一致的,都采用了8051内核。51单片机内部基本模块包括中央处理器(CPU)、存储器(数据存储器RAM和程序存储器ROM)、并行I/O口、串行通信口、定时/计数器、中断系统等功能器件,内部模块之间通信由总线连接,51单片机内部结构框图如图3-1所示。

8051单片机的内部结构由运算器、控制器、存储器(ROM及RAM)、数据总线和I/O接口组成。中央处理器CPU包括运算器、控制器以及若干寄存器等部件。

运算器电路包括ALU(算术逻辑单元)、ACC(累加器)、B寄存器、状态寄存器PSW、暂存器TMP1和暂存器TMP2等部件,运算器的功能是进行算术运算、逻辑运算和位运算。

1.累加器A

累加器为8位寄存器,是程序中最常用的专用寄存器,在指令系统中累加器的助记符为A。作用:作为暂存寄存器,用于提供操作数和存放运算结果。直接与内部总线相连,一般信息传递和交换都要经过ACC。

2.寄存器B

B寄存器为8位寄存器,主要用于乘除指令中。乘法指令的两个操作数分别取自累加器A和寄存器B,其中B为乘数,乘法结果的高8位存放于寄存器B中。除法指令中,被除数取自A,除数取自B,除法的结果商数存放于A,余数存放于B中。在其他指令中,B寄存器也可作为一般的数据单元来使用。

3.程序状态字PSW

程序状态字是一个8位寄存器,它包含程序的状态信息。在状态字中,有些位状态是根据指令执行结果,由硬件自动完成设置的,而有些状态位则必须通过软件方法设定。PSW中的每个状态位都可由软件读出,PSW的各位定义如下:

978-7-111-47690-0-Part01-77.jpg

图3-1 51单片机内部结构框图

978-7-111-47690-0-Part01-78.jpg

(1)CY:进位标志位

在执行某些算术和逻辑指令时,可以被硬件或软件置位或清零。在算术运算中它可作为进位标志,在位运算中,它作累加器使用,在位传送、位与和位或等位操作中,都要使用进位标志位。

(2)AC:辅助进位标志

进行加法或减法操作时,当发生低四位向高四位进位或借位时,AC由硬件置位,否则AC位被置“0”。在进行十进制调整指令时,将借助AC状态进行判断。

(3)F0:用户标志位

该位为用户定义的状态标记,用户根据需要用软件对其置位或清零,也可以用软件测试F0来控制程序的跳转。

(4)RS1和RS0:寄存器区选择控制位

该两位通过软件置“0”或“1”来选择当前工作寄存器区。

(5)OV:溢出标志位

当执行算术指令时,由硬件置位或清零来指示溢出状态。在带符号的加减运算中,OV=1表示加减运算结果超出了累加器A所能表示的符号数有效范围(-128~127),即运算结果是错误的,反之,OV=0,即无溢出产生。

(6)P:奇偶标志位

每个指令周期由硬件来置位或清零,用以表示累加器A中1的个数的奇偶性,若累加器中1的个数为奇数则P=1,否则P=0。

51单片机各部分功能介绍如下:

1)中央处理器(CPU) 单片机的核心,完成运算和控制功能,MCS-51的CPU能处理8位二进制数或代码。

2)内部数据存储器(内部RAM) 8051芯片中有128个RAM单元,用于存放可读写的数据,简称内部RAM。

3)内部程序存储器(内部ROM) 8051芯片内部有8KB掩膜ROM,用于存放程序或表格,因此称为程序存储器,简称内部ROM。

4)定时器/计数器 8051共有两个可编程的16位定时器/计数器,以实现定时或计数功能。

5)并行I/O口 MCS-51单片机共有4个可编程的8位I/O口(P0,P1,P2,P3),以实现数据的并行输入/输出。

6)串行口 MCS-51单片机有一个全双工的串行I/O口,以实现单片机和其他设备之间的串行数据传送。

7)中断控制系统 8051单片机拥有5个中断源,两个中断优先级的中断控制系统,以满足控制应用的需要。

8)时钟电路 由振荡电路得到一个基本的振荡信号,然后对振荡信号进行分频,从而得到相应的时钟。单片机的振荡电路有两种:内部振荡(电路设计时使用比较多)和外部振荡。

内部振荡如图3-2所示:MCS-51芯片的内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别为放大器的输入端和输出端,将其余外接的晶体振荡器和微调电容相连,构成内部自激振荡器产生振荡时钟脉冲,电容C1和C2电容容量选择范围为5~30pF,系统允许的晶振频率为1.2~12MHz(此种情况电路设计时使用比较多)。

外部振荡:利用外部已有的时钟信号引入到单片机内部。对于HMOS 8051单片机外部时钟XTAL2用来输入外部时钟信号,XTAL1接地如图3-3所示;对于CHMOS 80C51单片机必须用XTAL1输入外部时钟信号,XTAL2悬空如图3-4所示。(注意:8051与80C51完全兼容,差别主要在芯片制造工艺上,80C51的制造工艺是在8051基础上进行了改进,8051采用HMOS工艺,高速度、高密度;80C51采用CHMOS工艺,高速度、高密度和低功耗)。

978-7-111-47690-0-Part01-79.jpg

图3-2 单片机内部振荡

978-7-111-47690-0-Part01-80.jpg

图3-3 HMOS8051单片机外部时钟

978-7-111-47690-0-Part01-81.jpg

图3-4 CHMOS80C51单片机

9)时序定时51单片机共有4个,分别为振荡周期、状态周期、机器周期和指令周期。

①振荡周期:为单片机提供时钟信号的振荡源周期,振荡信号若采用内部振荡则周期为石英晶振频率的倒数。

②状态周期:振荡源信号经二分频后形成的时钟脉冲信号,振荡信号若采用内部振荡则状态周期为石英晶振频率/2的倒数。

③机器周期:完成一个基本操作所需的时间。

④指令周期:CPU执行一条指令所需要的时间,一般一个指令周期含有1~4个机器周期。

3.1.2 单片机引脚功能

51单片机一般采用40引脚双列直插(DIP)封装,图3-5为单片机引脚排列图。其中40个引脚可以分为4类:电源、控制、I/O端口和时钟引脚。

978-7-111-47690-0-Part01-82.jpg

图3-5 单片机引脚排列图

单片机的引脚学习非常重要,通过引脚的功能定义可以对单片机进行硬件电路设计,尤其对于初学者知道每个引脚的功能方便对单片机开发应用。这里对单片机40个引脚从4大类分别详细介绍:

1.电源引脚

①40引脚VCC:供电电压5V。

②20引脚GND:接地。

2.I/O端口引脚

51单片机共有4个8位并行I/O端口,共32个可编程I/O引脚。每个端口介绍如下:

①P0口:32引脚(P0.7)~39引脚(P0.0)可作为普通的输入/输出端口用。访问外部存储器时,分时传送低8位地址信号和低8位数据信号。

②P1口:8引脚(P1.7)~1引脚(P1.0)只有通用I/O接口一种功能,作为普通的输入/输出端口用。

③P2口:28引脚(P2.7)~21引脚(P2.0)可作为普通的输入/输出端口用。访问外部存储器时传送高8位地址信号。

④P3:17引脚(P3.7)~10引脚(P3.0)可作为普通的输入/输出端口用。但大部分情况下用于第二功能,见表3-1。

表3-1 P3口的第二功能

978-7-111-47690-0-Part01-83.jpg

3.时钟引脚

时钟引脚XTAL1和XTAL2,电路设计时多采用内部振荡方式产生时钟脉冲。详细介绍参见3.1.1节。

19引脚XTAL1:接内部时钟工作电路的输入。

18引脚XTAL0:接内部时钟工作电路的输出。

4.控制引脚51单片机的控制线共有4根,分别为978-7-111-47690-0-Part01-84.jpg978-7-111-47690-0-Part01-85.jpgN、978-7-111-47690-0-Part01-86.jpg978-7-111-47690-0-Part01-87.jpg。其中3根是复用线为978-7-111-47690-0-Part01-88.jpg978-7-111-47690-0-Part01-89.jpg978-7-111-47690-0-Part01-90.jpg具有两种功能。

1)复位引脚RST:9引脚RST为单片机上电复位输入端,只要在该引脚上连续保持两个机器周期以上的高电平,单片机就可以实现复位操作。复位电路分为自动上电复位和手动复位,如图3-6、图3-7所示。

978-7-111-47690-0-Part01-91.jpg

图3-6 自动上电复位

978-7-111-47690-0-Part01-92.jpg

图3-7 手动复位

2)PSEN:29引脚PSEN为外部程序存储器ROM读选通信号。该引脚有效(低电平)时,当单片机读取外部程序存储器ROM的指令和数据时,每个机器周期内978-7-111-47690-0-Part01-93.jpg两次有效,PSEN相当于外部ROM芯片输出允许的选通信号。但读片内ROM和读片外RAM时,不会产生有效的P978-7-111-47690-0-Part01-94.jpg信号。

3)978-7-111-47690-0-Part01-95.jpg:30引脚978-7-111-47690-0-Part01-96.jpg为地址锁存允许/编程脉冲。访问外部存储器时,ALE用来锁存P0口送出的低8位地址信号。当ALE信号有效(高电平)时,P0口传送的是低8位地址信号;当ALE无效(低电平)时,P0口传送的是8位数据信号。

当不执行访问外部RAM指令时,ALE以时钟振荡频率1/6的固定频率输出,ALE信号可以作为外部芯片的时钟信号。但当CPU执行访问外部RAM时,ALE将丢失一个ALE脉冲。

978-7-111-47690-0-Part01-97.jpg:单片机对内部ROM编程时的编程脉冲输入端。

4)978-7-111-47690-0-Part01-98.jpg:31引脚978-7-111-47690-0-Part01-99.jpg为访问程序存储器控制信号。51型单片机的寻址范围为64KB,其中4KB在片内,60KB在片外,当EA为高电平时,先访问片内ROM,当程序长度超过4KB时将自动转向执行外部ROM中的程序。当978-7-111-47690-0-Part01-100.jpg为低电平时,单片机只访问外部ROM。

VPP:对片内EPROM编程,31引脚为高电平用于施加编程电源。

3.2 单片机存储器

51单片机存储器结构设计上采用哈佛结构,其程序存储器和数据存储器寻址空间完全分开,存储器包括内部数据、程序存储器、外部扩展的数据和程序存储器。51单片机存储器地址空间分配如图3-8所示。

3.2.1 程序存储器

51单片机芯片内部提供4KB字节的程序存储器,片外可用16位地址线扩展到64KB的ROM空间。CPU可以通过单片机31引脚978-7-111-47690-0-Part01-101.jpg选择由内部的程序区启动或者由外部的程序区启动,如图3-8所示:978-7-111-47690-0-Part01-102.jpg外部扩展ROM到64KB的空间,地址从0000H开始编码;978-7-111-47690-0-Part01-103.jpg,执行芯片内部程序,一旦程序存储器空间超过4KB字节时,CPU自动选择外部ROM执行程序。程序存储器有部分重叠,在某些单元被保留做特定程序入口地址见表3-2。

978-7-111-47690-0-Part01-104.jpg

图3-8 51单片机存储器映像图

表3-2 特定程序入口地址表

978-7-111-47690-0-Part01-105.jpg

3.2.2 数据存储器

51单片机数据存储器用于存放运算中间结果、数据暂存和数据缓冲、标志位等。数据存储器包括片内RAM和片外RAM两种,采用不同的方法访问,不存在重叠的现象,从图3-8所示片外RAM空间为64KB,地址范围从0000H~FFFFH,对51单片机低128B地址空间,00H~7FH为片内RAM作为处理问题的数据缓冲器;其地址分配如图3-9所示;51单片机有32个工作寄存器,00H~1FH为四组工作寄存器区,每组有8个工作寄存器见表3-3。CPU在复位后默认选择表3-3中第0组工作寄存器。

工作寄存器从20H~2FH为位寻址区,位寻址区的每一位可以由程序直接进行位处理,图3-9中给出了自己地址和位地址对应关系,竖向字节地址从20H~2FH,横向代表8位位地址分别为D7~D0,如图3-9中7FH为字节地址2FH,位地址D7位。

978-7-111-47690-0-Part01-106.jpg

图3-9 片内RAM地址分配图

表3-3 工作寄存器地址列表

978-7-111-47690-0-Part01-107.jpg

高128B地址空间,80H~FFH为特殊功能寄存器空间。其地址范围为80H~FFH,特殊功能寄存器地址空间分配如图3-10所示,详细描述见表3-4。

978-7-111-47690-0-Part01-108.jpg

图3-10 特殊功能寄存器地址分配图

表3-4 特殊功能寄存器说明

978-7-111-47690-0-Part01-109.jpg

表3-4中论述的特殊功能寄存器需要在程序中处理,实际应用中与硬件操作相结合,需要开发人员按功能需求进行控制。有部分寄存器将在定时/计数器、串口、中断内容中介绍,因为本书讨论单片机的软件编程采用C51来设计程序内容,所有对于采用C语言进行单片机编程的初学者SP、PSW、ACC、B、DPH、DPL不再是非常重要的特殊功能寄存器。所以这里主要讨论P0、P1、P2、P3端口锁存寄存器,P0~P4为4个8位特殊功能寄存器,分别是4个并行I/O端口的锁存器,每个端口有字节地址也有位地址,I/O线独立用作输出时,数据可以锁存,用作输入时,数据可以缓冲。

通过对P0~P3口地址的读和写改变I/O口状态,如下通过简单样例程序初步了解对P0口的读取和P2口的输出操作。

978-7-111-47690-0-Part01-110.jpg

若对某个I/O口引脚进行操作,可以参考下面的样例程序。

978-7-111-47690-0-Part01-111.jpg

3.3 单片机中断系统

3.3.1 中断定义

单片机中只有一个CPU,但在同一时间内可能会面临着处理很多任务的情况,在CPU执行过程中,外部发生了某一事件,如数据的输入和输出、定时/计数器溢出及一些更重要的中断请求CPU快速处理。CPU暂时中断当前的工作,转入处理所发生的事件,完成中断服务程序后,再回到原来被中断的地方,继续执行被中止的原程序过程。这样的处理模式称为中断。实现中断功能的部件称为中断系统。

对于初学者,学习中断,第一个问题先搞清楚中断的概念,第二个问题是中断优先级问题,如中断事件一旦发生,当多个中断源同时申请中断或者CPU正在处理某中断事件时,又有另一事件申请中断,CPU必须区分哪个中断源优先级更高优先处理,这时考虑中断优先处理问题,解决方案是优先级别高的事件可以中断CPU正在处理的低优先级的中断服务程序,待完成高优先级中断事件后,再继续执行被中断的低优先级中断事件,也可称为中断嵌套。

3.3.2 中断系统概述

51单片机系统有5个中断源,其中两个外部中断、3个内部中断,可分为2个优先级。

1)INT0单片机引脚P3.2,属于外部中断0。由定时/外部中断控制寄存器TCON中的IT0控制,TCON在3.3.3节中做详细介绍,当TCON中的IT0=1时是边沿触发,当IT0=0时是电平触发。

2)INT1单片机引脚P3.3,属于外部中断1。由定时/外部中断控制寄存器TCON中的IT1控制,TCON在3.3.3节中做详细介绍,当TCON中的IT1=1时是边沿触发,当IT1=0时是电平触发。

3)TF0定时/计数器T0溢出中断。定时功能时,计数脉冲来自芯片内部;计数功能时,计数脉冲来自芯片引脚P3.4脚。计数寄存器T0发生溢出时,发生中断请求。

4)TF1定时/计数器T1溢出中断。定时功能时,计数脉冲来自芯片内部;计数功能时,计数脉冲来自芯片引脚P3.5脚。计数寄存器T1发生溢出时,发生中断请求。

5)RI TI串行通信中断。单片机完成接收或者发送一组数据时,产生中断请求。

3.3.3 中断控制

3.3.2节中讨论的外部中断IT0、IT1和定时/计数TF0、TF1以及串行中断RI和TI,这些中断请求信号分别锁存在特殊功能寄存器TCON(定时/外部中断控制寄存器)和SCON(串行中断控制寄存器)中。其中TCON和SCON只有一部分用于中断控制,通过对中断控制寄存器各位进行配置,可实现各种中断控制功能。

(1)定时器/计数器控制寄存器TCON,字节地址88H,中断请求格式见表3-5。

表3-5 TCON中断请求格式

978-7-111-47690-0-Part01-112.jpg

其中断有关控制位有4位,分别为IT0、IT1、IE0、IE1,功能如下:

1)IT0:外部中断0类型控制位,通过软件置“1”或清“0”,用于控制外部中断触发信号。当IT0=1时是边沿触发,单片机P3.2脚输入电平由高到低下降沿有效;当IT0=0时是电平触发。单片机P3.2脚输入低电平有效。

2)IE0:外部边沿触发中断0请求标志,当CPU采样到P3.2引脚出现有效中断请求信号时,触发IE0置“1”,当CPU响应该中断后,转向中断服务程序时由片内硬件自动清0(只适用于边沿触发方式)。

3)IT1:外部中断1请求方式控制位,使用方法和IT0相同。

4)IE1:外部边沿触发中断1请求标志位,使用方法和IE0相同。

(2)串行口中断控制寄存器SCON,字节地址98H,中断请求格式见表3-6。

表3-6 SCON中断请求格式

978-7-111-47690-0-Part01-113.jpg

其中中断有关控制位有两个,分别为SCON低二位锁存串行口的接收中断和发送中断标志,功能如下:

1)RI:串行口接收中断标志。若串行口接收器以方式0工作,每接收完一个串行数据帧,RI被置1;RI被置1表示串行口接收器正在向CPU请求中断,同样RI标志必须由中断服务程序清“0”。

2)TI:串行口发送中断标志。串行口以方式0发送时,每发送完8位数据后由硬件使TI置1。TI=1表示串行发送器正向CPU发出中断请求,向串行口的数据缓冲器SBUF写入一个数据后就立即启动发送器继续发送。但是CPU响应中断请求后,转向执行中断服务程序时,TI并不清“0”,TI必须由用户的中断服务程序清“0”。

51单片机有两级中断优先级,中断优先级可以由程序设定,中断源是否响应中断通过中断寄存器IE控制,而中断优先级则有中断优先级寄存器IP控制,若优先级别相同,并且同时要求中断,解决方案是以内部查询逻辑确定响应次序,具体IE、IP控制如下:

(1)中断允许控制寄存器IE各位定义见表3-7。

表3-7 IE中断请求各位

978-7-111-47690-0-Part01-114.jpg

其中与中断有关的控制位有6个,各位功能如下:

1)EX0:外中断0中断控制位。EX0=1,允许外部中断0中断,EX0=0,禁止外部中断0中断。

2)ET0:定时/计数器T0中断控制位。ET0=1,允许定时器T0中断,ET0=0,禁止定时器T0中断。

3)EX1:外部中断1中断控制位。EX1=1,允许外部中断1中断,EX1=0,禁止外部中断1中断。

4)ET1:定时/计数器T1中断控制位。ET1=1,允许T1中断,ET1=0,禁止T1中断。

5)ES:串行口中断控制位。ES=1允许串行口中断,ES=0,禁止串行口中断。

6)EA:中断允许位,EA=1,每个中断源是允许还是禁止,由各自的允许位决定。EA=0,CPU禁止所有中断。

(2)中断优先级控制寄存器IP各位定义见表3-8。

表3-8 IP中断请求各位

978-7-111-47690-0-Part01-115.jpg

其中与IP有关的中断控制位有5个,各位功能如下:

1)PX0:外部中断0优先级控制位。PX0=1,声明外中断0为高优先级中断,PX0=0定义外中断0为低优先级中断。

2)PT0:定时器0优先级控制位。PT0=1,声明定时器0为高优先级中断,PT0=0定义定时器0为低优先级中断。

3)PX1:外部中断1优先级控制位。PX1=1,声明外中断1为高优先级中断,PX1=0定义外中断1为低优先级中断。

4)PT1:定时器1优先级控制位。PT1=1,声明定时器1为高优先级中断,PT1=0定义定时器1为低优先级中断。

5)PS:串行口中断优先级控制位。PS=1,串行口中断声明为高优先级中断,PS=0,串行口定义为低优先级中断。

系统复位后IP寄存器中各位均为0,此时全部设定为低中断优先级,中断执行过程中,低中断优先级被高中断优先级中断,但是高中断优先级无法被低中断优先级中断;同级中断不能互相中断,CPU按照硬件次序决定优先权。同级优先权级别如图3-11所示。

978-7-111-47690-0-Part01-116.jpg

图3-11 同级优先权级别

对于IE控制位可以通过置“1”和清“0”允许或禁止中断源中断申请,IE中的EA位相当于中断允许的总开关,中断系统结构如图3-12所示。

978-7-111-47690-0-Part01-117.jpg

图3-12 中断结构框图

3.3.4 中断处理

CPU对中断处理过程包括中断初始化、中断响应、保护现场、中断服务程序处理、中断撤销和中断返回。

1.中断初始化

中断初始化设置,对中断的允许位和中断优先级设置,包括TCON、SCON、IE、IP与中断有关的功能位置进行设置,如3.3.3节所述。

2.中断响应

单片机一旦响应中断,首先设置响应的优先级,通过执行硬件程序调用把断点地址压入堆栈,并与各中断源对应的中断服务程序首地址送到程序计数器PC,同时清除中断请求标志(TI和RI除外),从而控制程序转移到中断服务程序,中断响应过程由中断系统自动完成。

3.保护现场

CPU在执行任务过程中由于中断响应执行中断事件,为了在执行完中断服务程序后,回头执行原先程序时,知道程序原来在何处打断,各有关寄存器的内容如何,必须在转入执行中断服务程序前,将当前状态内容进行备份以便保护好现场。一旦缺乏现场保护和恢复现场,程序运行混乱,单片机无法正常工作。所以在进入中断服务子程序后,一般都要保护现场,再执行中断服务程序,返回主程序前再恢复现场,用户在编制中断处理程序时必须要考虑上述问题。

4.中断服务程序处理

中断服务程序一般以子程序的形式出现,所有的中断都要转去执行中断服务程序,进行中断服务。C51编辑器支持在C语言程序中直接编写51单片机的中断服务程序,C51编译器对函数的定义进行了扩展,无需考虑堆栈出栈保护问题,增加了一个扩展关键字inter-rupt。关键字interrupt是函数定义时的一个选项,加上此选项可以对函数定义为中断服务函数。定义中断服务函数的格式如下:

函数类型 函数名(形式参数)[interrupt n][using n]

关键字interrupt中的n是中断号,n的取值为0~31单片机芯片型号不同n不同。

在C语言中定义中断服务函数:

void intersvr0(void)interrupt 0 using 1//定义外部中断0,使用第一组寄存器。

5.中断请求撤销

CPU响应中断请求后,执行中断服务子程序,一旦中断任务执行完毕,必须清除中断请求标志,否则中断响应返回后将再次进入该中断,从而进入死循环。

中断撤销方式有4种方式:

1)对定时/计数器T0、T1中断,CPU响应中断时就用硬件自动清除相应的中断请求标志TF0或TF1。

2)对外部中断INT0、INT1,若采用边沿触发方式,CPU响应中断后,内部硬件自动复位中断标志IE0或IE1。

3)对串行中断,CPU响应中断后并不自动清除相应的中断标志位TI或RI,用户应在串行中断服务程序中用软件清除TI或RI。

4)若CPU对中断引脚的信号缺乏控制能力,可以利用单稳态触发器对中断信号进行整形,使其符合要求。

6.中断返回

中断任务处理完成后,CPU需要返回到中断的地方继续执行。同时需把保存现场内容从堆栈中弹出,恢复寄存器和存储单元的原有内容。正常中断响应时间至少为3~8个机器周期,如果有同级或高级中断服务,将延长中断响应时间。

以上为中断内容的详细描述,关于中断的实际应用在中断章节第8章单片机外部中断控制项目中重点介绍。

3.4 单片机定时/计数系统

单片机定时/计数器可以实现定时控制、频率测量、脉宽测量、信号发生等功能,其工作方式灵活、编程简单,减轻CPU工作负担同时简化单片机外围电路设计。定时/计数器有定时和计数两大功能,对外部事件脉冲计数是计数器;对片内机器周期脉冲计数是定时器。51单片机有两个定时/计数器T0和T1,在使用过程中与特殊功能寄存器TMOD和TCON息息相关。

3.4.1 定时/计数器结构及工作原理

51单片机定时/计数器内部结构框图如图3-13所示,内部设置两个定时/计数器T0和T1,具有计数器和定时器两种工作方式以及4种工作模式,在特殊功能寄存器TMOD中都有一个控制位,它选择T0及T1为定时器还是计数器。

用作定时器时,每个机器周期寄存器加1,每输入一个脉冲计数值加1,脉冲数乘以脉冲间隔时间为定时时间;用作计数器时,单片机输入端P3.4或者P3.5有一个输入脉冲负跳变时加1,此时脉冲源为间隔不等的外部脉冲发生器,对外部事件计数。

图3-13中可以看到,定时器T0由TL0(低8位)和TH0(高8位)构成,定时器T1由TL1(低8位)和TH1(高8位)构成。TCON则用于控制定时器T0和T1的启动和停止计数,同时管理定时器T0和T1的溢出标志等。程序开始时需对TL0、TH0、TL1和TH1进行初始化,定义其工作方式。

978-7-111-47690-0-Part01-118.jpg

图3-13 定时/计数器结构框图

3.4.2 定时/计数器特殊控制寄存器TMOD、TCON

特殊功能寄存器TMOD和TCON用于控制和确定定时/计数功能和工作模式,寄存器的内容由软件设定,系统复位时所有位均被清零。

1.定时/计数器工作方式寄存器TMOD

TMOD低4位控制定时器T0,高4位控制定时器T1,字节地址89H,只能字节寻址,TMOD各位定义见表3-9:

表3-9 TMOD各位定义

978-7-111-47690-0-Part01-119.jpg

M1、M0:工作方式选择位,定时/计数器有4种工作方式由M1、M0定义见表3-10:

表3-10 M1和M0工作方式

978-7-111-47690-0-Part01-120.jpg

C/T:定时/计数方式选择位。

C/T=1时为计数方式,内部计数器的输入来自单片机引脚P3.4和P3.5端口的外部脉冲,负跳变脉冲有效。

C/T=0时为定时工作方式,内部计数器的机器周期脉冲计数,用作定时器。

GATE:选通控制。

GATE=0时TR0或者TR1为1时,定时/计数器选通工作,与INT0或者INT1无关。

GATE=1时INT0或者INT1引脚为高电平且TR0或者TR1为1时,定时/计数器选通开始工作。

2.定时/计数器控制寄存器TCON

TCON是逐位定义8位寄存器,可字节寻址也可以位寻址,字节地址为88H,TCON各位定义见表3-11:

表3-11 TCON各位定义

978-7-111-47690-0-Part01-121.jpg

1)TF1:定时/计数器T1溢出标志。当定时/计数器1溢出时,由硬件置位,CPU响应中断后由硬件自动对TF1清“0”。

2)TR1:定时/计数器T1运行控制位。靠软件置位或清除,当TR1=1时启动T1运行,TR1=0则T1停止运行。

3)TF0:定时/计数器0溢出标志。当定时/计数器0溢出时,硬件置位,申请中断,进入中断服务后被硬件自动清除。

4)TR0:定时/计数器0运行控制位。软件置位时,T0工作,清“0”时停止工作。

5)IE1:外部沿触发中断1请求标志,检测到在INT引脚上出现外部中断信号的下降沿时,硬件置位,请求中断,进入中断程序后被硬件自动清除。

6)IT1:外部中断1控制位,IT1=1时,后沿触发,IT1=0时,低电平触发。

7)IE0:外部沿触发中断0请求标志,检测到在INT引脚上出现外部中断信号的下降沿时,硬件置位,请求中断,进入中断程序后被硬件自动清除。

8)IT0:外部中断1控制位,IT0=1时,后沿触发,IT0=0时,低电平触发。

3.4.3 定时/计数器工作方式

定时/计数器具有定时和计数两种功能,每种功能具有4种工作方式,TMOD控制寄存器通过对M0、M1的设置选择4种不同工作方式,把计数初始值写入TH和TL中控制计数长度;通过对TCON的有关位置数和清零启动定时器工作和停止计数。定时/计数器T1与定时/计数器T0的描述完全一致,下面以T0为例讨论4种工作方式。

1.工作方式0

当M1 M0=00时T0工作在工作方式0模式下,其工作方式0电路结构如图3-14所示,工作方式0是13位定时/计数器,其中TL0的高3位没有使用,计数器由TH0的高8位和TL0的低5位构成。当TL0低5位溢出时向TH0进位,TH0溢出向中断标志TF0进位,申请中断。关于T0计数溢出通过查询TF0是否置位或者产生定时器T0中断获得。

978-7-111-47690-0-Part01-122.jpg

图3-14 T0工作方式0电路结构图

当C/T=0时,多路开关接通振荡脉冲的12分频输出,13位计数器依次进行计数。这就是定时工作方式。

当C/T=1时,多路开关与引脚(P3.4)相连,外部计数脉冲由引脚T0输入。当外部信号电平发生1到0跳变时,计数器加1,此时T0为外部事件计数器。

当GATE=0时,封锁或门输出常为1,使得引脚P3.2输入信号无效。TR0控制定时器T0开启和关闭,当TR0=1时,启动定时器T0,TR0=0则关闭控制开关停止计数。

当GATE=1且TR0=1时,或门与门全部打开,外部信号电平通过INT0开启或者关闭定时器计数,输入1电平时,计数工作,输入0电平时,停止计数。

(1)作为计数工作

计数范围:1~213

计数值计算公式:计数值=213-计数初值

针对T0定时器,其计数初值为TH0高8位和TL0低5位的初始值。

(2)作为定时器工作

定时范围:1~213机器周期

定时计算公式:定时时间=(213-定时初值)×机器周期

针对T0定时器,其定时初值为TH0高8位和TL0低5位的初始值。

机器周期时间=12/fosc,其中fosc为晶体振荡频率。

2.工作方式1

当M1 M0=01时,定时/计数器处于工作方式1,方式1和方式0工作模式几乎完全相同,区别就在于工作方式1定时器寄存器TH0和TL0是16位计数结构,定时/计数器电路结构如图3-15所示。

978-7-111-47690-0-Part01-123.jpg

图3-15 定时/计数器工作方式1电路结构图

方式16位定时/计数器,TH0作为高8位,TL0为低8位,有关控制状态字(GATA、978-7-111-47690-0-Part01-124.jpg、TF0、TR0)和工作方式0相同。

(1)作为计数器工作

计数范围:1~216

计数值计算公式:计数值=216-计数初值

针对T0定时器,其计数初值为TH0高8位和TL0低8位的初始值。

(2)作为定时器工作

定时范围:1~216机器周期

定时时间计算公式:定时时间=(216-定时初值)×机器周期

针对T0定时器,其定时初值为TH0高8位和TL0低8位的初始值。

机器周期时间=12/fosc,其中fosc为晶体振荡频率。

3.工作方式2

当M1 M0=10时,定时/计数器处于工作方式2。此时定时器寄存器TL0配置为可以自动重装载的8位计数器,TH0作为预置寄存器。TL0计数溢出时,TF0置1同时TH0中的内容重装载到TL0中,TH0的内容由软件预置,重装载后内容不变。电路结构如图3-16所示。

978-7-111-47690-0-Part01-125.jpg

图3-16 定时/计数器工作方式2电路结构图

初始化时,TL0和TH0赋初值,当TL0计数溢出时,置位TF0的同时把预置寄存器TH0中的初值自动加载TL0,TL0重新计数。如此反复,这一过程省去了用户程序中重装指令,有利于提高定时精度,但这种工作模式计数值有限,最大只能到256。所以这种工作方式很适合于连续定时和计数应用。

(1)作为计数器工作

计数范围:1~28

计数值计算公式:计数值=28-计数初值

针对T0定时器,其计数初值为TH0高8位和TL0低8位的初始值。

(2)作为定时器工作

定时范围:1~216机器周期

定时时间计算公式:定时时间=(28-定时初值)×机器周期

针对T0定时器,其定时初值为TH0高8位和TL0低8位的初始值。

机器周期时间=12/fosc,其中fosc为晶体振荡频率。

4.工作方式3

当M1 M0=11时,定时/计数器处于工作方式3,此时T0分成两个独立的8位计数器TL0和TH0。其中TL0既可作计数器,也可作为定时器使用,前3种工作方式下,定时/计数器的使用完全相同,但是在工作方式3下,两个定时/计数器工作是不同的,电路结构如图3-17所示。

978-7-111-47690-0-Part01-126.jpg

图3-17 定时/计数器工作方式3电路结构图

TH0规定只用作定时器,由T1控制位TR1和TF1控制,计数溢出置位TF1、TR1控制TH0定时的启动和停止。由于TL0既能作定时器也能作计数器使用,而TH0只能作定时器不能作计数器,因此在工作方式3模式下,定时/计数器0可以构成两个定时器或者一个定时器和一个计数器。

总之,若T0设置为工作方式3,T1只能设置为方式0、1、2,因为T0占据TR1和TF1,此时TF1作为串行口波特率发生器,计数溢出输入串行口,决定串行通信的速率。

经过上述对定时/计数器的讨论,对定时/计数器初始化,首先设定定时器工作方式,设置TMOD工作方式控制字,根据需要给978-7-111-47690-0-Part01-127.jpg赋初值确定定时时间或计数初值;设置中断允许寄存器IE控制字,开放中断和设定中断优先级;设置TCON启动或禁止978-7-111-47690-0-Part01-128.jpg运行。关于定时/计数器的实际应用在第10章单片机定时控制项目中重点介绍。

3.5 单片机串行通信系统

51单片机具有一个全双工的串行通信端口,能同时进行发送和接收。它可以作为UART(通用异步接收和发送器)使用,也可作为同步移位寄存器使用。

串行通信都具有多种操作模式,常用于数据通信的传输方式有单工、半双工、全双工和多工方式。

单工方式:通信双方数据按一个固定方向传送,这种传输方式单向传输用途有限,常用于串行口打印数据传输与简单系统间数据采集。

半双工方式:通信双方具有收发器,数据可实现双向传送,但不能同时进行,通信时以某种协议实现收/发开关转换。

全双工方式:通信双方具有收发器,允许双方同时进行数据双向传送,但传输方式线路和设备较复杂。

多工方式:通过使用多路复用器或多路集线器,采用频分、时分或码分复用技术,利用线路资源,实现同一线路上资源共享功能。

3.5.1 串行通信结构与原理

51单片机是一个可编程全双工串行通信口,用作异步通信方式(UART),与串行传送外部设备相连接,或用于通过标准异步通信协议进行全双工51单片机多机系统,也可以通过同步方式,使用TTL或CMOS移位寄存器来扩充I/O口。

图3-18为51单片机串行口结构原理图,通过单片机引脚RXD(P3.0串行数据接收端)和引脚TXD(P3.1串行数据发送端)与外围电路进行通信,既可以用于网络通信,亦可实现串行异步通信,还可以构成同步移位寄存器使用。51单片机内部的SBUF串行口缓冲寄存器(SBUF)是一个可寻址的专用寄存器,包括接收器和发送器,可实现全双工通信。具有相同的名字和地址空间,因为只有一个能被CPU读出数据,另一个只能被CPU写入数据,所以不会出现冲突。通信过程只要向发送缓冲器写入数据即可发送数据,从接收缓冲器读出数据即可接收数据。如果在串行口的输入、输出引脚加上电平转换器,将串口转换为标准的RS232接口实现与PC等设备通信。

3.5.2 串行控制与状态寄存器

1.串行中断控制寄存器(SCON)

串行口控制与状态寄存器(SCON)是一个逐位定义的8位寄存器,用于定义串行口工作方式以及实施接收和发送控制,字节地址为98H,位地址98H~9FH。SCON各位结构定义见表3-12。

1)SM0、SM1串行口工作方式选择位,两个选择位对应4种工作方式,其实fosc为晶振频率,表3-13所示SM0和SM1工作方式选择位。

978-7-111-47690-0-Part01-129.jpg

图3-18 串行口结构图

表3-12 SCON各位结构定义

978-7-111-47690-0-Part01-130.jpg

表3-13 SM0和SM1串行口工作方式选择位

978-7-111-47690-0-Part01-131.jpg

2)SM2:多机通信控制位。工作方式0中,SM2置0,工作方式1中,若SM2为1,则只有接收到有效停止位时,RI置1被激活。SM2位主要用于工作方式2和方式3,当SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI置1发出中断申请,否则会将接收到的数据放弃。当SM2=0时,则接收数据RI不会被激活。

3)REN:允许串行接收位。REN用于控制数据接收的允许和禁止,由软件置位或者清除,当REN=1时,允许串行接收,REN=0时,禁止串行接收。

4)TB8:在方式2或方式3中,为要发送的第9位数据。也可作为奇偶校验位,根据需要由软件置1和清零,在多机通信中,该位用于表示地址帧或者数据帧。

5)RB8:接收到数据第9位。在方式0中不使用RB8。在方式1中,若(SM2)=0,RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。

6)TI:发送中断标志。在方式0中,第8位发送结束时,由硬件置位。在其他方式的发送停止位前,由硬件置位。TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的方法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。在任何工作方式中,都必须由软件清除TI。

7)RI:接收中断标志位。在方式0,当接收完第8位数据后由硬件置位。在其他工作方式中,在接收到停止位的中间时刻由硬件置位。RI=1时,申请中断,要求CPU读数。在工作方式1中,SM2=1且未接收到有效的停止位时,不会对RI置位。任何工作方式中,都必须由软件清除RI。

2.电源控制寄存器(PCON)

PCON主要是为CHMOS型51单片机实现电源控制而设置的专用寄存器,其中最高位是SMOD,它是与串行口的波特率设置有关的选择倍增位。单元地址是87H,表3-14所示为PCON电源管理寄存器各位定义如下:

表3-14 PCON电源管理寄存器各位定义

978-7-111-47690-0-Part01-132.jpg

SMOD:串行口波特率倍增位,当SMOD=1时,方式1或者3,波特率=定时器1溢出率/16;方式2,波特率=定时器1溢出率/32;当SMOD=0时,方式1或者3,波特率=定时器1溢出率/32;方式2,波特率=定时器1溢出率/64。

GF1、GF0:通用标志位,用户使用软件置位、复位。

PD:掉电方式位。

IDL:待机方式位,当IDL=1,则进入待机工作位。如果PD=1、IDL=1,则进入掉电工作方式。复位时PCON所有位均为0。

3.5.3 串行通信工作方式

8051单片机全双工串行口具有4种工作方式,可通过软件编程选择。

(1)方式0为移位寄存器输入/输出方式。可外接移位寄存器扩展I/O口,也可以外接同步输入/输出设备。其数据传输波特率固定为fosc/12,8位串行数据由RXD(P3.0引脚)输入或输出,同步移位时钟由TXD(P3.1引脚)输出。

串行数据发送:CPU将数据写入发送寄存器时,立即启动发送,内部定时保证写入SBUF与激活发送之间有一个完整的机器周期,将8位数据以fos/12的固定波特率从RXD输出,低位在前,高位在后。发送完一帧数据后,发送中断标志TI由硬件置位。

串行数据接收:当REN=1且接收中断标志RI位清除时,启动接收过程。当(RI)=0和(REN)=1同时满足时,开始接收。当接收到第8位数据时,将数据移入接收寄存器,并由硬件置位RI。

(2)方式1为波特率可变的10位异步通信接口方式。其传输波特率由定时/计数器1的计数溢出率来决定,波特率=2SMOD×(定时器1溢出率)/32,发送或接收一帧信息为10位,包括1个起始位0,8个数据位和1个停止位1。

串行数据发送:当执行任何一条写SBUF的指令时,启动串行数据发送。在串行口由硬件自动加入起始位和停止位,构成一个完整的帧格式,在移位脉冲作用下串行数据从TXD引脚输出。发送完一帧数据后TXD一直维持在“1”状态下,由硬件置位TI通知CPU可以发送下一个字符。

数据接收:当REN=1且RI位清除后,串行口采样RXD引脚,若在RXD引脚上监测到一个1~0的跳变,立即启动一次接收过程。只有当RI=0且停止位为1或者SM2=0时,停止位进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;否则信息丢失。所以在方式1接收时,应先用软件清零RI和SM2标志。

(3)方式2为固定波特率的11位UART方式。波特率由PCON中的选择位SMOD来决定,当SMOD=1时,传输波特率为fosc/32,当SMOD=0时,传输波特率为fosc/64。发送和接收的一帧信息为11位,即1个起始位,9个数据位和1个停止位。发送时可编程位TB8可赋值0或者1,接收时可编程位进入SCON中的RB8。

数据发送:发送的串行数据由TXD端输出一帧信息为11位,附加的第9位来自SCON寄存器的TB8位,用软件置位或复位。准备好第9个数据位之后,当CPU执行一条数据写入SUBF的指令时,就启动发送器发送。发送一帧信息后,置位中断标志TI,其过程与方式1相同。

数据接收:方式2的接收过程也与方式1基本相同,不同之处在于第9个数据位,串行口把收到的8位数据送入SBUF,把收到的第9位数据送入RB8。

(4)方式3为波特率可变的11位UART方式。除波特率外,其余与方式2相同。

3.5.4 波特率设置

波特率是串行通信中的一个重要概念。波特率(bitpersecond)是单位时间里传输的数据位数,单位为波特(或bit/s)。如数据传送速率是200字符/s,每个字符包含10位,则传送波特率为2000波特。波特率的倒数就是传送每位数据所需要的时间。相互通信的双方必须具有相同的波特率,否则无法成功地完成数据通信。

在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。51单片机串行口的4种工作方式,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。

1.工作方式0

波特率由振荡器频率fosc确定:波特率=fosc/12

定时器T1工作方式0:溢出所需周期数=8192-x,x为初始值。

2.工作方式1

波特率由定时/计数器T1的溢出率和SMOD共同决定,其中:

波特率=2SMOD×(定时器1溢出率)/32

T1溢出率=T1计数率/产生溢出所需的周期数

定时器T1工作于方式1:溢出所需周期数=65536-x,x为初始值。

3.工作方式2

波特率由振荡器频率fosc和SMOD(专用寄存器PCON的最高位)确定。

波特率=2SMOD×fosc/64,若SMOD=1时,波特率=fosc/32;若SMOD=0时,波特率=fosc/64。

定时器T1工作于方式2:溢出所需周期数=256-x,x为初始值。

4.工作方式3

波特率由定时/计数器T1的溢出率和SMOD共同决定,其中:

波特率=2SMOD×(定时器1溢出率)/32

T1溢出率=T1计数率/产生溢出所需的周期数

上述讨论中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。因为方式2为自动重装入初值的8位定时/计数器模式,所以用它来做波特率发生器最恰当。

注意:进行单片机电子系统设计时,时钟频率一般选用11.05926MHz时,可以获得标准的波特率,所以51单片机选用这个看起来很“怪”的晶振。因为方式0和2波特率是固定传输,方式1和3波特率是可变的,表3-15给出方式1和方式3常用波特率设置。

表3-15 常用波特率设置表

978-7-111-47690-0-Part01-133.jpg

单片机的串行通信方法较为多样,传统的串行通信方式是通过单片机自带的串行口进行RS232方式的通信。串行通信适合远距离数据传送,处于两地的计算机之间,采用串行通信成本低廉,另外关于51单片机串行通信应用在第12章单片机串口通信项目中重点介绍。

3.6 本章小结

本章主要阐述了51单片机硬件系统以及体系结构的基础知识,从51单片机的引脚配置、存储器、中断、定时/计数器以及串行通信几个方面进行了重点介绍。通过本章的学习,对于初学单片机的读者对单片机的一些基础知识有了入门了解,为后面单片机软件的学习和综合系统设计打下坚实的基础。