单片机原理(3):中断、定时/计数、串行通信

中断(Interrupt)是指在计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

定时器/计数器(Timer/Counter)在实时控制系统中,实现对于外界事件的定时延时及计数功能。

串行通信(Serial Communicate)是计算机与外界交换信息的一种基本通信方式。

中断系统

中断过程中,请求产生中断的事件称为中断源,中断源向CPU提出的请求为中断请求(Interrupt Requst,IRQ),CPU通过上下文切换保存好当前的工作状态后,转而去处理中断请求,也就是产生中断响应。直到处理完中断请求事件,才返回原来的工作状态,继续工作。整个过程如下图所示:

中断过程

51单片机中断系统的结构图如下:

中断系统结构

中断源

51单片机中有5个中断源,如下表所示:

中断号 优先级 中断源 中断入口地址
0 1(最高级) 外部中断0 0003H
1 2 定时器0 000BH
2 3 外部中断1 0013H
3 4 定时器1 001BH
4 5(最低级) 串口中断 0023H

每个中断源都分配了对应的中断号及中断服务入口地址,在这个中断入口地址里,存放着跳转到相应中断服务程序的跳转指令。当多个中断源同时向CPU提出中断请求时,CPU将根据中断源的优先级来依次响应中断。

相关寄存器

SFR中与中断有关的寄存器有:

IE

IE(Interrupt Enable),中断允许寄存器,可位寻址,其各位定义如下:

位地址 AFH AEH ADH ACH ABH AAH A9H A8H
定义 EA - (ET2) ES ET1 EX1 ET0 EX0

* EA(Enable All):CPU中断总控制位,EA=1,CPU对所有中断开放,EA=0,CPU禁止一切中断响应。
* ES(Enable Serial):串口中断允许控制位,ES=1,允许串行口接受、发送中断。
* ET0/ET1(Enable Timer):定时/计数器0/1中断允许控制位,ET0/ET1=1,允许T0/T1中断。52系列单片机里还有ET2。
* EX0/EX1(Enable Exterior):外部中断INT0/INT1中断允许控制位,EX0/EX1=1,允许外部中断INT0/INT1中断。

IP

IP(Interrupt Priority),中断优先级寄存器,可位寻址,其各位定义如下。未设置时或复位后,IP各位均为”“则按照系统默认的优先级

位地址 BFH BEH BDH BCH BBH BAH B9H B8H
定义 - - (PT2) PS PT1 PX1 PT0 PX0

* PS(Priority Serial):串行口优先级设定位,PS=1,串行口为高优先级。
* PT0/PT1(Priority Timer):定时/计数器0/1优先级设定位,PT0/PT1=1,定时/计数器0/1为高优先级。
* PX0/PX1(Priority Exterior):外部中断INT0/INT1优先级设定位,PX0/PX1=1,外部中断INT0/INT1为高优先级。

TCON

TCON(Timer Control),定时/计数器控制寄存器,可位寻址,其各位定义如下:

位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H
定义 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

* TF0/TF1(Timer Flag):定时/计数器0/1溢出标志位,当定时/计数器计满溢出时,由硬件自动置“1”,并申请中断;在进入中断服务程序后,又由硬件自动置“0”。
* TR0/TR1(Timer Run):定时/计数器0/1启停控制位,TR0/TR1=1,启动定时/计数器。
* IE0/IE1(Interrupt Exterior):外部中断INT0/INT1中断请求标志位,外部中断源有请求时,对应的标志位IE0/IE1由硬件置“1”,当CPU响应该中断后,又由硬件自动置“0”。
* IT0/IT1(Interrupt Touch):外部中断INT0/INT1的触发方式选择位,IT0/IT1=0,对应外部中断设置为低电平触发方式,IT0/IT1=1,对应外部中断设置为边沿触发方式。

中断处理过程

51单片机在CPU的每个机器周期的S5 P2期间,将自动查询TCON中各个中断申请标志,若查询到某个中断标志位被置位,将启动中断机制。

中断源发出中断请求后。要使CPU能够响应中断,IE中的中断总允许位EA及对应的中断允许位(ES/ET/EX)都需要置为“1”。

处理外部中断时,若外部中断设为低电平触发方式,则CPU在每个查询中断申请标志时也将对INTi引脚进行采样,测得INTi=0,则认为有中断申请,随即将IEi标志位置位,否则测得INTi=1,则认为无中断请求,而清除IEi标志位。所以施加在INTi引脚上的低电平持续时间应该大于一个机器周期,且小于中断服务程序得执行时间。

若外部中断设为边沿触发方式,则CPU在每个查询中断申请标志时将对INTi引脚进行采样,若在连续两个机器周期采样到先高后低的电平变化,则认为有中断申请,随即将IEi标志位置位,否则测得INTi=1,则认为无中断请求,而清除IEi标志位。所以,为了保证CPU在两个机器周期内能够检测到由高到低跳变得电平,输入的高低电平持续时间至少要保持12个振荡周期(即一个机器周期)时间。

在中断处理过程中,如果正在执行同级或高优先级的中断服务程序,或是正在执行的指令还没完成,则中断响应会受到阻断。51单片机的中断响应时间最短为3个机器周期,其他情况的中断响应时间一般是3~8个周期。

在CPU响应中断后,应该撤除该中断请求,否则会再次产生中断,进入死循环。

中断程序的编写

由中断的处理过程可知,在编写中断管理与控制程序时应该考虑一下几个方面:
* CPU开中断和关中断
* 某个中断源中断请求的允许或屏蔽
* 各中断源优先级别的设定
* 外部中断请求的触发方式

中断程序基本编写格式如下:

汇编:

                ;中断入口设置
                ORG 0000H   ;起始地址
                LJMP MAIN   ;跳转到主程序
                ORG 0003H   ;中断入口地址1
                LJMP INT1    ;跳转到外部中断INT0服务程序
                ORG 000BH   ;中断入口地址2
                LJMP INT2    ;跳转到定时器0中断服务程序,没有则不写或写成“RETI”,下同
                ORG 0013H   ;中断入口地址3
                LJMP INT3    ;跳转到外部中断INT1服务程序
                ORG 001BH   ;中断入口地址4
                LJMP INT4    ;跳转到定时器1中断服务程序
                ORG 0023H    ;中断入口地址5
                LJMP INT5    ;跳转到串口中断服务程序

                ;主程序
                ORG 0030H   ;起始地址
          MAIN: SETB IT0   ;IT0=1,边沿触发
                SETB EA   ;EA=1,开启总中断
                SETB EX0   ;EX0=1,允许外部中断INT0
                ……
          LOOP: NOP
                LJMP LOOP   ;死循环

                ;中断服务程序
                ORG 0100H   ;起始地址
          INT1: PUSH ACC   ;保存原来状态,下同
                PUSH PSW  ;
                ……
          INT2: ……
                ……
                POP PSW   ;恢复原始状态,下同
                POP ACC   ;
                RETI            ;中断返回

                END            ;结束

C语言:

#include "reg51.h"

// 主程序
void main() {
  IT0 = 1//注释同汇编
  EX0 = 1 EA = 1while (1) {
    ……
  }
}

// 中断处理程序
void int0() interrupt 0 {  // 外部中断INT0服务程序
  ……
}

定时/计数器

51单片机内部有两个16位可编程的定时/计数器0和1,分别用T0及T1表示。它们的工作方式、定时时间、量程、启动方式、等均可通过程序来设置和改变。

计数功能用于统计从T0(P3.4)、T1(P3.5)引脚输入的脉冲负跳变数量,每输入一个脉冲负跳变,计数器就加1。负跳变指的是一个机器周期采样为高电平,后一个机器周期采样为低电平。

定时功能是单片机通过对内部机器脉冲信号计数实现的,计数值乘以机器周期即是相应的时间。如单片机采用12MHz晶振,机器内部脉冲频率为1MHz,机器周期为1us,计数1000次,即1ms时间。

当计数值溢出后,定时计数器给出中断请求,进而使CPU去处理中断事件。

51单片机定时/计数器结构如下:

定时/计数器结构

相关寄存器

除前面介绍过的中断相关寄存器外,SFR中与定时/计数器有关的寄存器有:

TMOD

TMOD(Timer Mode),定时/计数器模式控制寄存器,不可位寻址,其各位定义如下。其中TMOD的高半字节D4~D7用来控制定时/计数器1,低半字节D0~D3用来控制定时/计数器0。

位号 D7H D6H D5H D4H D3H D2H D1H D0H
定义 GATE C\T M1 M0 GATE C\T M1 M0

* GATE:门控制位,用来控制定时/计数器的启动方式。GATE=1,由外部中断引脚INT0/INT1来启动定时器T0/T1, 当INT0/INT1引脚为高电平且TR0/TR1置位,启动定时器T0/T1;GATE=0,仅由TR0/TR1置位而启动定时器T0/T1。
* C\T:功能选择位,C\T=0,为定时模式,计数脉冲由内部提供,计数周期等于机器周期;C\T=1,为计数模式,计数脉冲由外部引脚T0或T1引入。
* M0/M1:工作方式控制位,用于设置定时/计数器的工作方式,如下表:

M0 M1 工作方式 功能
0 0 方式0 13位计数器
1 0 方式1 16位计数器
0 1 方式2 8位重装计数器
1 1 方式3 定时器0分为两个独立8位计数器
T0、T1

T0、T1(Timer),两个定时/计时器的初始赋值寄存器,不可位寻址,用于存放定时/计数的初始值。它们是两个16位寄存器,均可分为两个独立的8位寄存器,高8位记为TH,即TH0、TH1,低8位记为TL,即TL0、TL1。使用定时/计数器时,当外部或系统时钟振荡器输入一个脉冲时,对应寄存器的值便自动加1。

编程时需要注意,16位计数初始值要分两次写入对应初始值寄存器。

定时/计数过程

51单片机定时/计数器的工作模式、工作方式、计数初始值及启停操作均需要在使用前进行初始化。

首先是通过TMOD中的GATE位来设置定时/计数器T0/T1的启动操作方式,工作在定时还是计数模式则是通过C/T位来设置。其次就是选择它们的工作方式。

工作方式0、1、3为非自动重装方式,在初始化程序和对应中断服务程序中均需要对初始数据寄存器THi、TLi装载。方式0是一个13位定时/计数器,只用了16位寄存器的高8位THi和TLi的低5位0~4位,TLi高3位未用,装入数据时需要注意。方式1为16位寄存器。

方式3只适用于定时/计数器T0,一般在定时/计时器T1作串行口波特率发生器时,才会选择这个工作模式。此时T0拆分为两个独立8位计数寄存器TH0和TL0,其中TL0下为8位定时/计数器,操作方式同方式0、1;TH0只做简单的内部定时功能,它借用定时/计时器1的控制位TR1和溢出标志位TF1,占用T1的中断资源,启动和停止也仅受TR1控制,此时T1仅可用在不需要中断的场合。

方式2为8位重装寄方式,仅由TLi作为工作寄存器,THi的值一直保持不变。TLi溢出时,THi的值作为装载值由CPU自动装入TLi,自动完成计数值初始化。所以此种方式下需要初始化时在THi和TLi中放入相同的计数值。

T0/T1寄存器中的初值X与定时/计数器的工作方式、工作模式有关。

在工作方式0下,为13位寄存器,也就是说最大的计数值M= 213 =8192,超过这个数字就会溢出,触发中断。工作方式为1下,为16位寄存器,M= 216 =65536。工作方式为2下,为8位寄存器,M= 28 =256。工作方式为3下,定时/计数器0分为高8位和低8位两个独立8位计数器,THi、TLi的M均为 28

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值