知识链接
一、中断及中断处理过程
在生活中,中断现象随处可见,假如你在看一本书,突然手机铃响了,这时,你会放下书本,去接电话。电话接完后,你再继续看书。这一过程就是中断的“产生—处理—返回”过程,相对于看书而言,电话这一事件就是看书的中断源。中断也是单片机处理器必备的基本功能,通过中断可以有效地提高处理器应对突发事件的能力,使其在执行一个任务的同时,监视和处理其他几个任务,达到“一芯多用”,提高CPU工作效率的目的。
8051系列单片机对中断的处理可以概括为中断请求、中断响应、中断返回3个过程。8051系列单片机对中断的处理流程如图4-3-2所示。
当中断发生时,中断源向CPU提出请求;CPU接收到中断源的中断请求后,开始对事件进行处理;当CPU处理完事件后,会返回到主程序停止处,继续执行主程序,这一过程称为中断返回。

图4-3-2 中断处理流程
1.中断源
引起CPU中断的触发源称为中断源。8051系列单片机的中断源分为外部中断源(触发源来自单片机外部)和内部中断源(触发源来自单片机内部)。单片机中断源见表4-3-1。
表4-3-1 单片机中断源

2.中断系统的结构
中断系统的结构如图4-3-3所示。它由与中断有关的特殊功能寄存器、中断入口、顺序查询逻辑电路等组成。中断系统包括5个中断源和4个特殊寄存器(IE、IP、TCON和SCON),共同用于控制中断的类型。5个中断源有两个优先级,每个中断源可以被编程为高优先级或低优先级,可以实现二级中断嵌套。5个中断源有对应的5个固定中断入口地址。

图4-3-3 中断系统的结构
二、定时/计数器
定时/计数器是单片机系统的一个重要部件,其工作方式灵活、编程简单、使用方便,可用来实现定时控制、延时、频率测量、信号检测等。此外,定时/计数器还可作为串行通信中的特率发生器。
1.定时/计数器的结构
单片机内部的定时/计数器的结构如图4-3-4所示,定时/计数器T0由特殊功能寄存器TL0和TH0构成,定时/计数器T1由特殊功能寄存器TL1和TH1构成。特殊功能寄存器TMOD控制定时/计数器的工作方式,TCON控制定时/计数器的启动和停止,同时管理定时/计数器的溢出标志等。程序开始时需对TL0、TH0、TL1、TH1和TCON进行初始化编程,定义它们的工作方式和控制定时/计数器T0和T1的启动和停止。

图4-3-4 定时/计数器的结构
2.定时/计数器控制寄存器TMOD
特殊功能寄存器TMOD是用来控制定时/计数器的工作方式。其基本格式见表4-3-2,其中高4位用于对定时器T1的方式进行控制,而低4位用于对定时器T0的方式进行控制,由于TMOD只能进行字节寻址,因此对T0和T1的工作方式只能整字节写入。其功能如下:
表4-3-2 定时/计数器方式控制寄存器TMOD的格式

●GATE:门控位。由GATE、软件控制位TR(1/0)和INT(1/0)共同决定定时/计数器的打开和关闭。
GATE=0:只要用指令置TR(1/0)为1即可启动定时/计数器,不管INT的状态如何。
GATE=1:只有INT(1/0)为高电平且TR(1/01)为1时,才能启动定时/计数器。
●
:定时/计数器选择位。
:以计数器方式工作。
:以定时器方式工作。
●M1M0:定时器工作方式选择位。通过对M1M0的设置,可使定时器以4种工作方式之一进行工作。
M1M0=00:定时器以方式0工作;
M1M0=01:定时器以方式1工作;
M1M0=10:定时器以方式2工作;
M1M0=11:定时器以方式3工作。
3.定时/计数器控制寄存器TCON
特殊功能寄存器TCON,高4位为定时/计数器的运行控制和溢出标志,低4位与外部中断有关,其中高4位的含义见表4-3-3所示。
表4-3-3 定时/计数器控制寄存器TCON的格式

●TF1/TF0:T1/T0溢出标志位。当T1或T0产生溢出时,由硬件自动置位中断触发器TF(1/0),并向CPU申请中断。如果用中断方式,则CPU在响应中断服务程序后,TF(1/0)被硬件自动清0。如果用软件查询方式对TF(1/0)进行查询,则在定时/计数器回0后,应当用指令将TF(1/0)清0。
●TR1/TR0:T1/T0运行控制位。可用于对TR1或TR0进行置位或清0,即可启动或关闭T1或T0的运行。
4.定时/计数器工作方式
T0或T1的定时器功能可由TMOD中的C/T位选择,而T0、T1的工作方式则由TMOD中的M1M0共同决定。定时/计数器的4种工作方式中,方式0、方式1、方式2的T0和T1完全相同,方式3只有T0。
●工作方式0
工作方式0的逻辑电路结构如图4-3-5所示。定时/计数器工作方式0为13位计数器工作方式,由TL(1/0)的低5位和TH(1/0)高8位构成13位计数器。(https://www.daowen.com)
当
时,T(1/0)为定时器。定时信号来自单片机内的机器周期进行计数定时。
当
时,T(1/0)为计数器。计数脉冲信号来自引脚T(1/0)的外部信号。
T1/T0能否启动工作,取决于TR1/TR0、GATE、引脚INT1/INT0的状态。
当GATE=0时,只在TR1/TR0为1时可启动T1/T0工作;
当GATE=1时,只有TR1/TR0和INT1/INT0为1时,才能启动T1/T0工作。

图4-3-5 工作方式0
●工作方式1
定时/计数器工作方式1是16位计数器方式,由TL1/TL0和TH1/TH0共同构成16位计数器。工作方式1与工作方式0的基本工作过程相似,但由于工作方式1是16位计数器,因此,它比工作方式0有更宽的定时/计数范围。
●工作方式2
定时/计数器工作方式2是自动再装入时间常数8位计数器方式。TH1/TH0仅用来存放TL1/TL0初次置入的时间常数。在TL1/TL0计数满后,即置位TF1/TF0,向CPU申请中断,同时存放在TH(1/0)中的时间常自动装入TL1/TL0,然后重新开始定时或计数。
●工作方式3
定时/计数器工作方式3是两个独立的8位计数器,仅T0有这种工作方式,如果将T1置为工作3方式,则T1将处于关闭状态。
当T0工作于方式3时,TL0构成8位计数器可工作于定时/计数状态,并使用T0的控制位和TF0的中断源。TH0则只能工作于定时器状态,使用T1中TR1、TF1的中断源。
5.定时/计数中定时/计数初值的设定
设单片机时钟电路的振荡频率为11.059 2 MHz,则12分频后得到的机器周期为:

单片机的定时/计数器T1和T0都是增量计数器,因此不能直接将要计数的值作为初值放入寄存器,而是将计数的最大值(溢出值)减去实际要计数的值,将差值存入寄存器。所以定时/计数器计数初值的计算公式如下:
计数初值=2n-实际计数值
式中,n为由工作方式决定的定时/计数器位数。
工作方式0:n=13,213=8 192。
工作方式1:n=16,216=65 536。
例如:在工作方式1下,要用定时器T0定时50 ms,在C语言程序设计中,要做以下工作:
●设置定时/计数器T0工作方式
TMOD=0x01;//TMOD=0000 0001B,低4位GATE=0,C/T=0,M1M0=01
●计算实际计数值

●确定定时器T0的计数初值
定时/计数器T0计数初值要放入寄存器TH0和HL0中,语句如下:
TH0=(65 536-46 083)/256; //定时器T0高8位赋初值
TL0=(65 536-46 083)%256;//定时器T0低8位赋初值
●启动定时器
TR0=1;//启动定时器T0
三、数码管取模软件的使用
LED代码查询软件,可以快速查询共阳和共阴数码管的代码,如图4-3-6所示。

图4-3-6 LED代码查询软件
左边选择数码管的类型:共阳极、共阴极。右边选择取模方式。对于单个数字或字符而言,采用手动取模,分别把相应的字段点亮即可。
例如:共阳数码管“0”的编码如图4-3-7所示。
在数字或字母比较多的情况下,通常采用定义数组的形式,该软件自动把所有数字或字母以数组的形式生成十六进制代码,再复制出来即可。以共阳数码管为例,C语言代码如图4-3-8所示。

图4-3-7 共阳数码管“0”的编码

图4-3-8 生成C语言代码