(玩电子) 电子技术学习与研究
当前位置单片机教程网 >> 基础教程 >> 浏览文章

18课:单片机的中断系统

作者:佚名   来源:本站原创   点击数:x  更新时间2007年08月14日   字体

     有关单片机中断系统的概念什么是中断我们从一个生活中的例程引入你正在家中看书突然电话铃响了你放下书本去接电话和来电话的人交谈然后放下电话回来继续看你的书这就是生活中的“中断”的现象就是正常的工作过程被外部的事件打断了仔细研究一下生活中的中断对于我们学习单片机的中断也很有么

第一什么可经引起中断生活中很多事件能引起中断有人按了门铃了电话铃响了你的闹钟闹响了你烧的水开了….等等诸如此类的事件我们把能引起中断的称之为中断源单片机中也有一些能引起中断的事件8031中一共有5个两个外部中断两个计数/定时器中断一个串行口中断

第二中断的嵌子优先级处理设想一下我们正在看书电话铃响了同时又有人按了门铃你该先做那样呢如果你正是在等一个很重要的电话你一般不会去理会门铃的而反之你正在等一个重要的客人则可能就不会去理会电话了如果不是这两者即不等电话也不是等人上门你可能会按你常常的习惯去处理总之这里存在一个优先级的问题单片机中也是如此也有优先级的问题优先级的问题不仅仅发生在两个中断同时产生的情况也发生在一个中断已产生又有一个中断产生的情况比如你正接电话有人按门铃的情况或你正开门与人交谈又有电话响了情况考虑一下我们会怎么办吧

第三中断的响应过程当有事件产生进入中断之前我们必须先记住现在看书的第几页了或拿一个书签放在当前页的位置然后去处理不一样的事情因为处理完了我们还要回来继续看书电话铃响我们要到放电话的地方去门铃响我们要到门那边去也说是不一样的中断我们要在不一样的地点处理而这个地点常常还是固定的计算机中也是采用的这种办法五个中断源每个中断产生后都到一个固定的地方去找处理这个中断的程序当然在去之前首先要保存下面将执行的指令的地址以便处理完中断后回到原来的地方继续往下执行程序具体地说中断响应能分为以下几个步骤1保护断点即保存下一将要执行的指令的地址就前这个地址送入堆栈2寻找中断入口根据5个不一样的中断源所产生的中断查找5个不一样的入口地址以上工作是由计算机自动完成的与编程者无关在这5个入口地址处存放有中断处理程序这是程序编写时放在嵌的如果话中断程序放在嵌就错了中断程序就不能被执行到3执行中断处理程序4中断返回执行完中断指令后就从中断处返回到主程序继续执小究竟单片机是怎么样找到中断程序所在位置又怎么返回的呢课们稍后再谈

MCS-51单片机中断系统的结构
5个中断源的符号名称及产生的条件如下
INT0和部中断0由P32端口线引入低电交下跳沿引起
INT1和部中断1由P33端口线引入低电交下跳沿引起
T0定时器计数器0中断由T0计满回零引起
T1定时器计数器l中断由T1计满回零引起
TIRI串行IO中断串行端口完成一帧字符发送接收后引起
整个中断系统的结构框技下图一所示


<51单片机中断系统结构>

如图所示由与中断有关的特殊功能寄存器中断入口次序查询逻辑电路等组成包括5个中断请求源4个用于中断控制的寄存器IEIPECON和SCON来控制中断类弄中断的开关和各种中断源的优先级确定

中断请求源

1外部中断请求源即外中断0和1经由外部管脚引入的在单片机上有两个管脚名称为INT0INT1也就是P3.2P3.3这两个管脚在内部的TCON中有四位是与外中断有关的IT0INT0触发方式控制位可由软件进和置位和复位IT0=0INT0为低电平触发方式IT0=1INT0为负跳变触发方式这两种方式的差异将在以后再谈IE0INT0中断请求标志位当有外部的中断请求时这位突置1这由硬件来完成在CPU响应中断后由硬件将IE0清0IT1IE1的用途和IT0IE0相同2内部中断请求源TF0定时器T0的溢出中断标记当T0计数产生溢出时由硬件置位TF0当CPU响应中断后再由硬件将TF0清0TF1与TF0类似TIRI串行口发送接收中断在串行口中再步⡣2中断允许寄存器IE在MCS51中断系统中中断的允许或禁止是由片内可进行位寻址的8位中断允许寄存器IE来控制的见下表EAX

其中EA是总开关如果它等于0则所有中断都不允许ES串行口中断允许ET1定时器1中断允许EX1外中断1中断允许ET0定时器0中断允许EX0外中断0中断允许如果我们要设置允许外中断1定时器1中断允许其它不允许则IE能是EAX

即8CH当然我们也能用位操作指令SETB EA

SETB ET1SETB EX1

来实现它3五个中断源的自然优先级与中断服务入口地址外中断00003H定时器0000BH外中断10013H定时器1001BH串行口0023H它们的自然优先级由高到低排小写到这里大家应当明白为什么前面有一些程序一始我们这样写

ORG 0000HLJMP START

ORG 0030H

START

这样写的目的就是为了让出中断源所占用的向量地址当然在程序中没用中断时直接从0000H开始写程序在原理上并没有错但在实际工作中最好不这样做优先级单片机采用了自然优先级和人工设置高低优先级的策略即能由程序员设定那些中断是高优先级哪些中断是低优先级由于只有两级必有一些中断处于同一级别处于同一级别的就由自然优先级确定

开机时每个中断都处于低优先级我们能用指令对优先级进行设置看表2中断优先级中由中断优先级寄存器IP来高置的IP中某位设为1对应的中断就是高优先级不然就是低优先级

XX

X

PS

PT1

PX1

PT0

PX0

例设有如下要求将T0外中断1设为高优先级其它为低优先级求IP的值IP的首3位没用可我取值设为000后面根据要求写就能了XX

因此最终IP的值就是06H例在上例中如果5个中断请求同时发生求中断响应的次序响应次序为定时器0就中断1就中断0实时器1串行中断

MCS51的中断响应过程

1中断响应的条件讲到这儿我们依然对于计算机响应中断感到神奇我们人能响应外界的事件是因为我们有多种“传感器“DD眼耳能接受不一样的信息计算机是如何做到这点的呢其实说穿了一点都不希奇MCS51工作时在每个机器周期中都会去查询一下各个中断标记看他们是否是“1“如果是1就说明有中断请求了所以所谓中断其实也是查询不过是每个周期都查一下而已这要换成人来说就相当于你在看书的时候每一秒钟都会抬起头来看一看查问一下是不是有人按门铃是否有电话很蠢不是吗可计算机本来就是这样它根本没人聪明了解了上述中断的过程就不难解中断响应的条件了在下列三种情况之一时CPU将封锁对中断的响应

CPU正在处理一个同级或更高级别的中断请求

中的机器周期不是当前正执行指令的最后一个周期我们知道单片机有单周期双周期三周期指令当前执行指令是单字节没有关系如果是双字节或四字节的就要日条指令都执行完了才能响应中断因为中断查询是在每个机器周期都可能查到的

当前正执行的指令是返回批令RETI或访问IPIE寄存器的指令则CPU至少再执行一条指令才应中断这些都是与中断有关的如果正访问IPIE则可能会开关中断或改变中断的优先级而中断返回指令则说明本次中断还没有处理完所以家等本指令处理结束再执行一条指令才能响应中断

2中断响应过程CPU响应中断时首先把当前指令的下一条指令就是中断返回后将要执行的指令的地址送入堆栈然后根据中断标记将对应的中断入口地址送入PCPC是程序指针CPU取指令就根据PC中的值PC中是什么值突到什么地方去取指令所以程序突转到中断入口处继续执小这些工作都是由硬件来完成的不必我们去考虑这里还有个问题大家是否注意到每个中断向量地址只间隔了8个单元如0003000B在如此少的空间中如何完成中断程序呢很简单你在中断处安排一个LJMP指令不就能把中断程序跳转到任何地方了吗一个完整的主程序看起来应该是这样的

ORG 0000HLJMP START

ORG 0003H

LJMP INT0 转外中断0ORG 000BH

RETI 没有用定时器0中断在此放一条RETI万一 “不小心“产生了中断也不会有太大的后果

中断程序完成后一定要执行一条RETI指令执行这条指令后CPU将会把堆栈中保存着的地址取出突PC那么程序突从主程序的中断处继续往下执行了注意CPU所做的保护工作是很有限的只保护了一个地址而其它的所有东西都不保护所以如果你在主程序中用到了如APSW等在中断程序中又要用它们还要保证回到主程序后这里面的数据还是没执行中断以前的数据就得自己保护起础

中断系统的控制寄存器
中断系统有两个控制寄存器IE和IP它们分别用来设定各个中断源的打开关闭和中断优先级此外在TCON中另有4位用于选择引起外部中断的条件并作为标志位

1中断允许寄存器--IE
IE在特殊功能寄存器中字节地址为A8H位地址(由低位到高位)分别是A8H-AFH
IE用来打开或关断各中断源的中断请求基本格式如下图二所示
 

EA全局中断允许位EA0关闭全部中断EA1打开全局中断控制在此条件下由各个中断控制位确定相应中断的打开或关闭
×无效位
ES串行IO中断允许位ES1打开串行IO中断ES0关闭串行IO中断
ETl定时器计数器1中断允许位ETl1打开T1中断ETlO关闭T1中断
EXl和部中断l中断允许位EXl1打开INT1EXl0关闭INT1
ET0定时器计数器0中断允许位ET01打开T0中断ET00关闭TO中断
EXO和部中断0中断允许位Ex01打开INT0;EX0=0,关闭INT0.


中断优先寄存器--IP
IP在特殊功能寄存器中字节地址为B8H位地址(由低位到高位)分别是B8H一BFH,IP用来设定各个中断源属于两级中断中的哪一级IP的基本格式如下图三所示

×无效位
PS串行IO中断优先级控制位PS1高优先级PS0低优先级
PTl定时器计数器1中断优先级控制位PTl1高优先级PTl0低优先级
Pxl和部中断1中断优先级控制位Pxl1高优先级PXlO低优先级
PT0定时器计数器o中断优先级控制位PT01高优先级PTO0低优先级
Px0和部中断0中断优先级控制位Px01高优先级Px00伤优先级
在MCS-51单片机系列中高级中断能够打断低级中断以形成中断嵌套同级中断之间或低级对高级中断则不能形成中断嵌套若几个同级中断同时向CPU请求中断响应则CPU按如下顺序确定响应的先后顺序

INT0一T0---INT1一T1一RIT1.

中断的响应过程

若某个中断源通过编程设置处于被打开的状态并满足中断响应的条件而且当前正在执行的那条指令已被执行完
1当前末响应同级或高级中断
2不是在操作IEIP中断控制寄存器或执行REH指令则单片机响应此中断
在正常的情况下从中断请求信号有效开始到中断得到响应通常需要3个机器周期到8个机器周期中断得到响应后自动清除中断请求标志(源行IO端口的中断标志要用软件清除)将断点即程序计数器之值(PC)压入堆栈(以备指用)然后把相应的中断入口地址装入PC使程序转入到相应的中断服务程序中去执小
各个中断源在程序存储器中的中断入口地址如下
中断源 入口地址
INT0(外部中断0) 0003H
TF0(TO中断) 000BH
INT1(外部中断1) 0013H
TFl(T1中断) 001BH
RITI(串行口中断) 0023H
由于各个中断入口地址相隔甚近不便于存放各个较长的中断服务程序故通常在中断入口地址开始的二三个单元中安排一条转移类指令以转入到安排在嵌的中断服务程序以T1中断为例其过程下如图四所示
由于5个中断源各有其中断请求标志0TF0IElTFl以及RITI在中断源满足中断请求的条件下各标志自动置1以向CPU请求中断如果某一中断源提出中断请求后CPU不能立即响应只要该中断请求标志不被软件人为清除中断请求的状态就将一直保持,直到CPU响应了中断为止,源行口中断而言这一过程与其它4个中断的不同之处在于即使CPU响应了中断其中断标志RITI也不会自动清零必须在中断服务程序中设们除RITI的指令后才会再一次地提出中断请求
CPU的现场保护突指必须由被响应的相应中断服务程序去完成当执行RETI中断返回指令后断点值自动从栈顶2字节弹出并装入PC寄存器使CPU继续执行被打断了的程序
下面给出一个应用定时器中断的实例
现要求编制一段程序使P10端口线上输出周期为2ms的方波脉冲设单片机晶振频率
Fosc6MHZ
1方法利用定时器T0作1ms定时达到定时值后引起中断在中断服务程序中使P10的状态取一次反并再次定时1ms
2定时初值机器周期MC12/fosc2us所以定时lms所需的机器周期个数为500D亦即0lF4H设T0为工作方式1(16位方式)则定时初值是(01F4H)求补FEOCH

START MOV TMOD#01H T0为定时器状态工作方式1
MOV TL0#0CH T0的低位定时初值
MOV TH0#0FEH T0的高位定时初值
MOV TCON#10H 打开T0
SETB ET0 1ET0即允许T0中断
SETB EA 1EA即充许全局中断
AJMP $ 动态暂存
000BH AJMP IST0 转入T0中断服务程序入口地址IST0
IST0 MOV TL0#0CH 重置定时器初值
MOV TH0#0FEH 重置定时器初值
CPL P1.0 P1.0取反
RET1 中断返回

串行端口的控制寄存器

串行端口共有2个控制寄存器SCON和PCON用以设置串行端口的工作方式接收发送的运行状态接收发送数据的特征波特率的大小以及作为运行的中断标志等
串行口控制寄存器SCON
SCON的字节地址是98H位地址(由低位到高位)分别是98H一9FHSCON的格式如图五所示

SMoSMl
串行口工作方式控制位
00--方式001--方式1
10--方式211--方式3
SM2
仅用于方式2和方式3的多机通讯控制位
发送机SM21(要求程控设置)
当为方式2或方式3时
接收机 SM21时若RB81可引起串行接收中断若RB80不
引起串行接收中断SM20时若RB81可引起串行接收中断若
RB80亦可引起串行接收中断
REN:
串行接收允许位
0--禁止接收1--允许接收
TB8:
在方式23中TB8是发送机要发送的第9位数据
RB8:
在方式23中RB8是接收机接收到的第9位数据该数据正好来自发
送机的TB8
TI:
发送中断标志位发送前必须用软件清零发送过程中TI保持零电平
发送完一帧数据后由硬件自动置1如要再发送必须用软件再清零
RI:
接收中断标志位接收前必须用软件清零接收过程中RI保持零电
平接收完一帧数据后由片内硬件自动置1如要再接收必须用软件
再清零

电源控制寄存器PCON

PCON的字节地址为87H无位地址PCON的格式如图六所示需指出的是对80C31单片机而言PCON还有几位有效控制位

SMOD波特始倍位在计算串行方式123的波特率时0---不加倍1---加倍

串行中断的应用特点

8031单片机的串行IO端口是一个中断源有两个中断标志RI和TIRI用于接收TI用于发送
串行端口无论在何种工作方式下发送接收前都必须对TIRI清零当一帧数据发送接收完后TI/RI自动置1如要再发送接收必须先用软件将其清除
在串行中断被打开的条件下对方式0和方式1来说一帧数据发送接收完后除置位TIRI外还会引起串行中断请求并执行串行中侧课程序但对方式2和方式3的接收机而言还要视SM2和RB8的状态才可确定RI是否被置位以按行中断的开放
SM2 RB8 接收机中断标志与中断状态
0 1 激活RI引起中断
1 0 不激活RI不引起中断
1 1 激活RI引起中断
单片机正是利用方式23的这一特点实现多机间的通信串行端口的常用应用方法见相关章节

波特率的确定

对方式0来说波特率已固定成fosc12随着外部晶振的频什同波特率亦不相同常用的fosc有12MHz和6MHz所以波特率相应为1000×103和500×103位s在此方式下数据将自动地按固定的波特率发送接收完全不用设置
对方式2而言波特率的计算式为2SMOD·fosc64当SMOD0时波特率为fm64当SMOD1时波特率为fosc32在此方式下程控设置SMOD位的状态后波特率就确定了不需要再作其它设置
对方式1和方式3来说波特率的计算式为2SMOD32×T1溢出率根据SMOD状态位的不同波特率有Tl32溢出率和T116溢出率两种由于T1溢出率的设置是方便的因而波特率的选择将十分灵活
前研及定时器Tl有4种工作方式为了得到其溢出率而又不必进入中断服务程序往往使T1设置在工作方式2的运行状态也就是8位自动加入时间常数的方式由于在这种方式下T1的溢出率(次秒)计算式可表达成

下面一段主程序和中断服务程序是利用串行方式l从数据00H开始连续不断增大地串行发送一片数据的程序例设单片机晶振的频率为6MHZ波特率为1200位秒

ORG 2000H ;1200位/秒的定时器初值
MOV TL1,#0F3H
MOV TH1,#0F3H ;使SMOD=0
MOV PCON,#00H ;T1方式2
MOV TMOD,#20H
SETB EA
CLR ET1 ;关闭T1中断
SETB ES ;开串行中断
SETB TR1 ;开T1定时
MOV SCON,#40H ;串行方式1
CLR A
MOV SBUF,A ;串行发送
JNB T1,$ ;等待发送完
CLR T1, ;清标志
SJMP $
ORG 0023H ;串行中断入口地址
MOV SBUF,A ;连续发送
JNB T1,$
INC A
CLR T1
RET1 ;中断返回

发表评论告诉好友收藏此文关闭窗口

文章评论

ձһhƬձƵ ձƵɫwww ձƵ:ɫ