有关单片机中止体系的概念:什么是中止,咱们从一个日子中的例程引进。你正在家中看书,忽然电话铃响了,你放下书本,去接电话,和来电话的人攀谈,然后放下电话,回来持续看你的书。这便是日子中的“中止”的现象,便是正常的作业进程被外部的作业打断了。细心研讨一下日子中的中止,关于咱们学习单片机的中止也很有优点。
榜首、什么可经引起中止,日子中许多作业能引起中止:有人按了门铃了,电话铃响了,你的闹钟闹响了,你烧的水开了….等等诸如此类的作业,咱们把能引起中止的称之为中止源,单片机中也有一些能引起中止的作业,8031中一共有5个:两个外部中止,两个计数/守时器中止,一个串行口中止。
第二、中止的嵌套与优先级处理:想象一下,咱们正在看书,电话铃响了,一起又有人按了门铃,你该先做那样呢?假如你正是在等一个很重要的电话,你一般不会去理睬门铃的,而反之,你正在等一个重要的客人,则或许就不会去理睬电话了。假如不是这两者(即不等电话,也不是等人上门),你或许会按你常常的习气去处理。总归这儿存在一个优先级的问题,单片机中也是如此,也有优先级的问题。优先级的问题不仅仅发生在两个中止一起发生的状况,也发生在一个中止已发生,又有一个中止发生的状况,比方你正接电话,有人按门铃的状况,或你正开门与人攀谈,又有电话响了状况。考虑一下咱们会怎样办吧。
第三、中止的呼应进程:当有作业发生,进入中止之前咱们有必要先记住现在看书的第几页了,或拿一个书签放在当时页的方位,然后去处理不一样的作业(因为处理完了,咱们还要回来持续看书):电话铃响咱们要到放电话的当地去,门铃响咱们要到门那儿去,也说是不一样的中止,咱们要在不一样的地址处理,而这个地址常常仍是固定的。核算机中也是选用的这种办法,五个中止源,每个中止发生后都到一个固定的当地去找处理这个中止的程序,当然在去之前首先要保存下面将履行的指令的地址,以便处理完中止后回到原本的当地持续往下履行程序。具体地说,中止呼应能分为以下几个进程:1、维护断点,即保存下一即将履行的指令的地址,便是把这个地址送入仓库。2、寻觅中止进口,依据5个不一样的中止源所发生的中止,查找5个不一样的进口地址。以上作业是由核算机主动完结的,与编程者无关。在这5个进口地址处寄存有中止处理程序(这是程序编写时放在那儿的,假如没把中止程序放在那儿,就错了,中止程序就不能被履行到)。3、履行中止处理程序。4、中止回来:履行完中止指令后,就从中止处回来到主程序,持续履行。终究单片机是怎样样找到中止程序所在方位,又怎样回来的呢?咱们稍后再谈。
MCS-51单片机中止体系的结构:
5个中止源的符号、称号及发生的条件如下。
INT0:外部中止0,由P3.2端口线引进,低电平或下跳沿引起。
INT1:外部中止1,由P3.3端口线引进,低电平或下跳沿引起。
T0:守时器/计数器0中止,由T0计满回零引起。
T1:守时器/计数器l中止,由T1计满回零引起。
TI/RI:串行I/O中止,串行端口完结一帧字符发送/接纳后引起。
整个中止体系的结构框图见下图一所示。
如图所示,由与中止有关的特别功用寄存器、中止进口、次第查询逻辑电路等组成,包含5个中止恳求源,4个用于中止操控的寄存器IE、IP、ECON和SCON来操控中止类弄、中止的开、关和各种中止源的优先级确认。
中止恳求源:
(1)外部中止恳求源:即外中止0和1,经由外部管脚引进的,在单片机上有两个管脚,称号为INT0、INT1,也便是P3.2、P3.3这两个管脚。在内部的TCON中有四位是与外中止有关的。IT0:INT0触发办法操控位,可由软件进和置位和复位,IT0=0,INT0为低电平触发办法,IT0=1,INT0为负跳变触发办法。这两种办法的差异将在今后再谈。IE0:INT0中止恳求标志位。当有外部的中止恳求时,这位就会置1(这由硬件来完结),在CPU呼应中止后,由硬件将IE0清0。IT1、IE1的用处和IT0、IE0相同。(2)内部中止恳求源TF0:守时器T0的溢出中止符号,当T0计数发生溢出时,由硬件置位TF0。当CPU呼应中止后,再由硬件将TF0清0。TF1:与TF0相似。TI、RI:串行口发送、接纳中止,在串行口中再解说。2、中止答应寄存器IE在MCS-51中止体系中,中止的答应或制止是由片内可进行位寻址的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、五个中止源的天然优先级与中止服务进口地址外中止0:0003H守时器0:000BH外中止1:0013H守时器1:001BH串行口: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->串行中止。
MCS-51的中止呼应进程:
1、中止呼应的条件:讲到这儿,咱们仍然关于核算机呼应中止感到奇特,咱们人能呼应外界的作业,是因为咱们有多种“传感器“――眼、耳能承受不一样的信息,核算机是怎么做到这点的呢?其实说穿了,一点都不希奇,MCS51作业时,在每个机器周期中都会去查询一下各个中止符号,看他们是否是“1“,假如是1,就阐明有中止恳求了,所以所谓中止,其实也是查询,不过是每个周期都查一下罢了。这要换成人来说,就相当于你在看书的时分,每一秒钟都会抬起头来看一看,查询一下,是不是有人按门铃,是否有电话。。。。很蠢,不是吗?可核算机原本便是这样,它底子没人聪明。了解了上述中止的进程,就不难解中止呼应的条件了。在下列三种状况之一时,CPU将封闭对中止的呼应:
CPU正在处理一个同级或更高等级的中止恳求。
现行的机器周期不是当时正履行指令的最终一个周期。咱们知道,单片机有单周期、双周期、三周期指令,当时履行指令是单字节没有关系,假如是双字节或四字节的,就要等整条指令都履行完了,才干呼应中止(因为中止查询是在每个机器周期都或许查到的)。
当时正履行的指令是回来批令(RETI)或拜访IP、IE寄存器的指令,则CPU至少再履行一条指令才应中止。这些都是与中止有关的,假如正拜访IP、IE则或许会开、关中止或改动中止的优先级,而中止回来指令则阐明本次中止还没有处理完,所以都要等本指令处理完毕,再履行一条指令才干呼应中止。
2、中止呼应进程CPU呼应中止时,首先把当时指令的下一条指令(便是中止回来后即将履行的指令)的地址送入仓库,然后依据中止符号,将对应的中止进口地址送入PC,PC是程序指针,CPU取指令就依据PC中的值,PC中是什么值,就会到什么当地去取指令,所以程序就会转到中止进口处持续履行。这些作业都是由硬件来完结的,不用咱们去考虑。这儿还有个问题,咱们是否留意到,每个中止向量地址只间隔了8个单元,如0003-000B,在如此少的空间中怎么完结中止程序呢?很简单,你在中止处组织一个LJMP指令,不就能把中止程序跳转到任何当地了吗?一个完好的主程序看起来应该是这样的:
ORG 0000HLJMP START
ORG 0003H
LJMP INT0 ;转外中止0ORG 000BH
RETI ;没有用守时器0中止,在此放一条RETI,假如 “不小心“发生了中止,也不会有太大的结果。。
中止程序完结后,一定要履行一条RETI指令,履行这条指令后,CPU将会把仓库中保存着的地址取出,送回PC,那么程序就会从主程序的中止处持续往下履行了。留意:CPU所做的维护作业是很有限的,只维护了一个地址,而其它的一切东西都不维护,所以假如你在主程序顶用到了如A、PSW等,在中止程序中又要用它们,还要确保回到主程序后这儿面的数据仍是没履行中止曾经的数据,就得自己维护起来。
中止体系的操控寄存器:
中止体系有两个操控寄存器IE和IP,它们别离用来设定各个中止源的翻开/封闭和中止优先级。此外,在TCON中还有4位用于挑选引起外部中止的条件并作为标志位。
1.中止答应寄存器--IE
IE在特别功用寄存器中,字节地址为A8H,位地址(由低位到高位)别离是A8H-AFH。
IE用来翻开或关断各中止源的中止恳求,根本格局如下图二所示:
EA:大局中止答应位。EA=0,封闭悉数中止;EA=1,翻开大局中止操控,在此条件下,由各个中止操控位确认相应中止的翻开或封闭。
×:无效位。
ES:串行I/O中止答应位。ES=1,翻开串行I/O中止;ES=0,封闭串行I/O中止。
ETl;守时器/计数器1中止答应位。ETl=1,翻开T1中止;ETl=O,封闭T1中止。
EXl:外部中止l中止答应位。EXl=1,翻开INT1;EXl=0,封闭INT1。
ET0:守时器/计数器0中止答应位。ET0=1,翻开T0中止;ET0=0,封闭TO中止。
EXO:外部中止0中止答应位。Ex0=1,翻开INT0;EX0=0,封闭INT0.
中止优先寄存器--IP:
IP在特别功用寄存器中,字节地址为B8H,位地址(由低位到高位)别离是B8H一BFH,IP用来设定各个中止源归于两级中止中的哪一级,IP的根本格局如下图三所示:
×:无效位。
PS:串行I/O中止优先级操控位。PS=1,高优先级;PS=0,低优先级。
PTl:守时器/计数器1中止优先级操控位。PTl=1,高优先级;PTl=0,低优先级。
Pxl:外部中止1中止优先级操控位。Pxl=1,高优先级;PXl=O,低优先级。
PT0:守时器/计数器o中止优先级操控位。PT0=1,高优先级;PTO=0,低优先级。
Px0:外部中止0中止优先级操控位。Px0=1,高优先级;Px0=0,伤优先级。
在MCS-51单片机系列中,高档中止可以打断初级中止以构成中止嵌套;同级中止之间,或初级对高档中止则不能构成中止嵌套。若几个同级中止一起向CPU恳求中止呼应,则CPU按如下次序确认呼应的先后次序:
INT0一T0---INT1一T1一RI/T1.
中止的呼应进程
若某个中止源经过编程设置,处于被翻开的状况,并满意中止呼应的条件,并且①当时正在履行的那条指令已被履行完
1、当时末呼应同级或高档中止
2、不是在操作IE,IP中止操控寄存器或履行REH指令则单片机呼应此中止。
在正常的状况下,从中止恳求信号有用开端,到中止得到呼应,一般需求3个机器周期到8个机器周期。中止得到呼应后,主动铲除中止恳求标志(对串行I/O端口的中止标志,要用软件铲除),将断点即程序计数器之值(PC)压入仓库(以备康复用);然后把相应的中止进口地址装入PC,使程序转入到相应的中止服务程序中去履行。
各个中止源在程序存储器中的中止进口地址如下:
中止源 进口地址
INT0(外部中止0) 0003H
TF0(TO中止) 000BH
INT1(外部中止1) 0013H
TFl(T1中止) 001BH
RI/TI(串行口中止) 0023H
因为各个中止进口地址相隔甚近,不便于寄存各个较长的中止服务程序,故一般在中止进口地址开端的二三个单元中,组织一条搬运类指令,以转入到组织在那儿的中止服务程序。以T1中止为例,其进程下如图四所示。
因为5个中止源各有其间止恳求标志0,TF0,IEl,TFl以及RI/TI,在中止源满意中止恳求的条件下,各标志主动置1,以向CPU恳求中止。假如某一中止源提出中止恳求后,CPU不能当即呼应,只需该中止恳求标志不被软件人为铲除,中止恳求的状况就将一向坚持,直到CPU呼应了中止停止,对串行口中止而言,这一进程与其它4个中止的不同之处在于;即便CPU呼应了中止,其间止标志RI/TI也不会主动清零,有必要在中止服务程序中设置铲除RI/TI的指令后,才会再一次地提出中止恳求。
CPU的现场维护和康复有必要由被呼应的相应中止服务程序去完结,当履行RETI中止回来指令后,断点值主动从栈顶2字节弹出,并装入PC寄存器,使CPU持续履行被打断了的程序。
下面给出一个运用守时器中止的实例。
现要求编制一段程序,使P1.0端口线上输出周期为2ms的方波脉冲。设单片机晶振频率
Fosc=6MHZ.
1、办法:运用守时器T0作1ms守时,到达守时值后引起中止,在中止服务程序中,使P1.0的状况取一次反,并再次守时1ms。
2、守时初值:机器周期MC=12/fosc=2us。所以守时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一9FH。SCON的格局如图五所示。
SMo,SMl:
串行口作业办法操控位。
00--办法0;01--办法1;
10--办法2;11--办法3。
SM2:
仅用于办法2和办法3的多机通讯操控位
发送机SM2=1(要求程控设置)。
当为办法2或办法3时:
接纳机 SM2=1时,若RB8=1,可引起串行接纳中止;若RB8=0,不
引起串行接纳中止。SM2=0时,若RB8=1,可引起串行接纳中止;若
RB8=0,亦可引起串行接纳中止。
REN:
串行接纳答应位。
0--制止接纳;1--答应接纳。
TB8:
在办法2,3中,TB8是发送机要发送的第9位数据。
RB8:
在办法2,3中,RB8是接纳机接纳到的第9位数据,该数据正好来自发
送机的TB8。
TI:
发送中止标志位。发送前有必要用软件清零,发送进程中TI坚持零电平,
发送完一帧数据后,由硬件主动置1。如要再发送,有必要用软件再清零。
RI:
接纳中止标志位。接纳前,有必要用软件清零,接纳进程中RI坚持零电
平,接纳完一帧数据后,由片内硬件主动置1。如要再接纳,有必要用软件
再清零。
电源操控寄存器PCON
PCON的字节地址为87H,无位地址,PCON的格局如图六所示。需指出的是,对80C31单片机而言,PCON还有几位有用操控位。
SMOD:波特率加倍位。在核算串行办法1,2,3的波特率时;0---不加倍;1---加倍。
串行中止的运用特色:
8031单片机的串行I/O端口是一个中止源,有两个中止标志RI和TI,RI用于接纳,TI用于发送。
串行端口不管在何种作业办法下,发送/接纳前都有必要对TI/RI清零。当一帧数据发送/接纳完后,TI/RI主动置1,如要再发送/接纳,有必要先用软件将其铲除。
在串行中止被翻开的条件下,对办法0和办法1来说,一帧数据发送/接纳完后,除置位TI/RI外,还会引起串行中止恳求,并履行串行中侧目务程序。但对办法2和办法3的接纳机而言,还要视SM2和RB8的状况,才可确认RI是否被置位以及串行中止的敞开:
SM2 RB8 接纳机中止标志与中止状况
0 1 激活RI,引起中止
1 0 不激活RI,不引起中止
1 1 激活RI,引起中止
单片机正是运用办法2,3的这一特色,完结多机间的通讯。串行端口的常用运用办法见相关章节。
波特率的确认:
对办法0来说,波特率已固定成fosc/12,跟着外部晶振的频率不同,波特率亦不相同。常用的fosc有12MHz和6MHz,所以波特率相应为1000×103和500×103位/s。在此办法下,数据将主动地按固定的波特率发送/接纳,彻底不用设置。
对办法2而言,波特率的核算式为2SMOD·fosc/64。当SMOD=0时,波特率为fm/64;当SMOD=1时,波特率为fosc/32。在此办法下,程控设置SMOD位的状况后,波特率就确认了,不需求再作其它设置。
对办法1和办法3来说,波特率的核算式为2SMOD/32×T1溢出率,依据SMOD状况位的不同,波特率有Tl/32溢出率和T1/16溢出率两种。因为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 | ;中止回来 |
文章谈论