搜档网
当前位置:搜档网 › 51单片机中断编程

51单片机中断编程

51单片机中断编程
51单片机中断编程

第6章中断系统

在CPU与外设交换信息时,存在一个快速的CPU与慢速的外设间的矛盾。为解决这个问题,采用了中断技术。良好的中断系统能提高计算机实时处理的能力,实现CPU 与外设分时操作和自动处理故障,从而扩大了计算机的应用范围。

当CPU正在处理某项事务的时候,如果外界或内部发生了紧急事件,要求CPU暂停正在处理的工作转而去处理这个紧急事件,待处理完以后再回到原来被中断的地方,继续执行原来被中断了的程序,这样的过程称为中断。向CPU提出中断请求的源称为中断源。微型计算机一般允许有多个中断源。当几个中断源同时向CPU发出中断请求时,CPU应优先响应最需紧急处理的中断请求。为此,需要规定各个中断源的优先级,使CPU 在多个中断源同时发出中断请求时能找到优先级最高的中断源,响应它的中断请求。在优先级高的中断请求处理完了以后。再响应优先级低的中断请求。

当CPU正在处理一个优先级低的中断请求的时候,如果发生另一个优先级比它高的中断请求,CPU能暂停正在处理的中断源的处理程序,转去处理优先级高的中断.请求,待处理完以后,再回到原来正在处理的低级中断程序,这种高级中断源能中断低级中断源的中断处理称为中断嵌套。

MCS-51系列单片机允许有五个中断源,提供两个中断优先级(能实现二级中断嵌套)。每一个中断源的优先级的高低都可以通过编程来设定。中断源的中断请求是否能得到响应,受中断允许寄存器IE的控制;各个中断源的优先级可以由中断优先级寄存器IP 中的各位来确定;同一优先级中的各中断源同时请求中断时,由内部的查询逻辑来确定响应的次序。这些内容都将在本节中讨论。

6 . 1 中断请求源和中断请求标志

1、中断请求源

MCS-51中断系统可用图6-1来表示。五个中断源是:

INT来自P3.2引脚上的外部中断请求(外中断0)。

◆0

INT来自P3.3引脚上的外部中断请求(外中断1)。

◆1

◆T0 片内定时器/计数器0溢出(TF0)中断请求。

◆T1片内定时器/计数器1溢出(TF1)中断请求。

◆串行口片内串行口完成一帧发送或接收中断请求源TI或RI。

每一个中断源都对应有一个中断请求标志位,它们设置在特殊功能寄存器TCON和SCON中。当这些中断源请求中断时,分别由TCON和SCON中的相应位来锁存。

INT0硬件查询INT1高级中断请求低级中断请求

图6-1 中断系统

2、中断标志

⑴ 定时器控制寄存器TCON

TCON 是定时器/计数器0和1(T 0,T 1)的控制寄存器,它同时也用来锁存T 0,T 1

的溢出中断请求源和外部中断请求源。TCON 寄存器中与中断有关的位如下图所示。

其中:

① TF 1 定时器/计数器1(T 1)的溢出中断标志。当T 1从初值开始加1计数到计数满,产生溢出时,由硬件使TF 1置“1”,直到CPU 响应中断时由硬件复位。

② TF 0 定时器/计数器0(T 0)的溢出中断标志。其作用同TF 1。

③ IE 1 外中断1中断请求标志。如果IT 1=1,则当外中断1引脚1INT 上的电平由1

变0时,IE1由硬件置位,外中断1请求中断。在CPU 响应该中断时由硬件清0。

④ IT 1 外部中断1(1INT )触发方式控制位。如果IT 1为1,则外中断1为负边沿触发

INT脚的输入电平,如果在一个周期中采样到方式(CPU在每个机器周期的S5P2采样1

高电平,在下个周期中采样到低电平,则硬件使IE1置1,向CPU请求中断);如果IT1

INT端的输入电平(低电为0,则外中断1为电平触发方式。此时外部中断是通过检测1

INT的外部中断源必须保持低电平有效,直到平)来触发的。采用电平触发时,输入到1

该中断被响应。同时在中断返回前必须使电平变高,否则将会再次产生中断。

INT上的电平由1变0时,IE0

⑤IE0外中断0中断请求标志。如果IT0置1,则当0

由硬件置位。在CPU把控制转到中断服务程序时由硬件使IE0复位。

⑥IT0外部中断源0触发方式控制位。其含义同IT1。

⑵、串行口控制寄存器SCON

串行口控制寄存器SCON中的低2位用作串行口中断标志,如下图所示。

其中:

RI 串行口接收中断标志。在串行口方式0中,每当接收到第8位数据时,由硬件置位RI;在其他方式中,当接收到停止位的中间位置时置位RI。注意,当CPU转入串行口中断服务程序入口时不复位RI,必须由用户用软件来使RI清0。

TI 串行口发送中断标志。在方式0中,每当发送完8位数据时由硬件置位TI;在其他方式中于停止位开始时置位。TI也必须由软件来复位。

6 . 2 中断控制

1、中断允许和禁止

在MCS-51中断系统中,中断允许或禁止是由片内的中断允许寄存器IE(IE为特殊功能寄存器)控制的,IE中的各位功能如下:

其中:

EA CPU中断允许标志。EA=0,CPU禁止所有中断,即CPU屏蔽所有的中断请求;EA=1,CPU开放中断。但每个中断源的中断请求是允许还是被禁止,还需由各自的允许

位确定(见D4~D0位说明)。

ES 串行口中断允许位。ES=1,允许串行口中断;ES=0,禁止串行口中断。

ET1 定时器/计数器1(T1)的溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。

EX1 外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。

ET0 定时器/计数器0(T0)的溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断。

EX0 外部中断0中断允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。

中断允许寄存器中各相应位的状态,可根据要求用指令置位或清0,从而实现该中断源允许中断或禁止中断,复位时IE寄存器被清0。

2、中断优先级控制

MCS-51中断系统提供两个中断优先级,对于每一个中断请求源都可以编程为高优先级中断源或低优先级中断源,以便实现二级中断嵌套。中断优先级是由片内的中断优先级寄存器IP(特殊功能寄存器)控制的。IP寄存器中各位的功能说明如下:

其中:

PS 串行口中断优先级控制位。PS=1,串行口定义为高优先级中断源;PS=0,串行口定义为低优先级中断源。

PT1 T1中断优先级控制位。PT1=1,定时器/计数器1定义为高优先级中断源;PT1=0,定时器/计数器1定义为低优先级中断源。

PX1 外部中断1中断优先级控制位。PX1=1,外中断1定义为高优先级中断源;PX1=0,外中断1定义为低优先级中断源。

PT0 定时器/计数器0(T0)中断优先级控制位,功能同PT1。

PX0 外部中断0中断优先级控制位。功能同PX1。

中断优先级控制寄存器IP中的各个控制位都可由编程来置位或复位(用位操作指令或字节操作指令),单片机复位后IP中各位均为0,各个中断源均为低优先级中断源。

3 中断优先级结构

MCS-51中断系统具有两级优先级(由IP寄存器把各个中断源的优先级分为高优先级和低优先级),它们遵循下列两条基本规则:

(1)低优先级中断源可被高优先级中断源所中断,而高优先级中断源不能被任何中断源所中断;

(2)一种中断源(不管是高优先级或低优先级)一旦得到响应,与它同级的中断源

不能再中断它。

为了实现上述两条规则,中断系统内部包含两个不可寻址的优先级状态触发器。其中一个用来指示某个高优先级的中断源正在得到服务,并阻止所有其它中断的响应;另一个触发器则指出某低优先级的中断源正得到服务,所有同级的中断都被阻止,但不阻止高优先级中断源。

当同时收到几个同一优先级的中断时,响应哪一个中断源取决于内部查询顺序。其优先级排列如下:

中断源同级内的中断优先级

外部中断0 最高

定时器/计数器0溢出中断

外部中断1

定时器/计数器1溢出中断

串行口中断最低

6 . 3 中断响应

1、中断响应过程

CPU在每个机器周期的S5P2时刻采样中断标志,而在下一个机器周期对采样到的中断进行查询。如果在前一个机器周期的S5P2有中断标志,则在查询周期内便会查询到并按优先级高低进行中断处理,中断系统将控制程序转入相应的中断服务程序。下列三个条件中任何一个都能封锁CPU对中断的响应:

(1)CPU正在处理同级的或高一级的中断;

(2)现行的机器周期不是当前所执行指令的最后一个机器周期;

(3)当前正在执行的指令是返回(RETI)指令或是对IE或IP寄存器进行读/写的指令。

上述三个条件中,第二条是保证把当前指令执行完,第三条是保证如果在当前执行的是RETI指令或是对IE,IP进行访问的指令时,必须至少再执行完一条指令之后才会响应中断。

中断查询在每个机器周期中重复执行,所查询到的状态为前一个机器周期的S5P2时采样到的中断标志。这里要注意的是:如果中断标志被置位,但因上述条件之一的原因而未被响应,或上述封锁条件已撤消,但中断标志位已不再存在(已不再是置位状态)时,被拖延的中断就不再被响应,CPU将丢弃中断查询的结果。也就是说,CPU对中断标志置位后,如未及时响应而转入中断服务程序的中断标志不作记忆。

CPU响应中断时,先置相应的优先级激活触发器,封锁同级和低级的中断。然后根据中断源的类别,在硬件的控制下,程序转向相应的向量入口单元,执行中断服务程序。

硬件调用中断服务程序时,把程序计数器PC的内容压入堆栈(但不能自动保存程序

状态字PSW 的内容),同时把被响应的中断服务程序的入口地址装入PC 中。五个中断源服务程序的入口地址是:

中断源 入口地址

外部中断0 0003H

定时器0溢出 000BH

外部中断1 0013H

定时器1溢出 001BH

串行口中断 0023H

通常,在中断入口地址处安排一条跳转指令,以跳转到用户的服务程序入口。

中断服务程序的最后一条指令必须是中断返回指令RETI 。CPU 执行完这条指令后,把响应中断时所置位的优先级激活触发器清0,然后从堆栈中弹出两个字节内容(断点地址)装入程序计数器PC 中,CPU 就从原来被中断处重新执行被中断的程序。

2、中断响应时间 外部中断0INT 和1INT 的电平在每个机器周期的S5P2时被采样并锁存到IE0和IE1中,这个置入到IE0和IE1的状态在下一个机器周期才被查询电路查询,如果产生了一个中断请求,而且满足响应的条件,CPU 响应中断,由硬件生成一条长调用指令转到相应的服务程序入口。这条指令是双机器周期指令。因此,从中断请求有效到执行中断服务程序的第一条指令的时间间隔至少需要三个完整的机器周期。

如果中断请求被前面所述的三个条件之一所封锁,将需要更长的响应时间。若一个同级的或高优先级的中断已经在进行,则延长的等待时间显然取决于正在处理的中断服务程序的长度,如果正在执行的一条指令还没有进行到最后一个周期,则所延长的等待时间不会超过三个机器周期,这是因为MCS-51指令系统中最长的指令(MUL 和DIV)也只有四个机器周期;假若正在执行的是RETI 指令或者是访问IE 或IP 指令,则延长的等待时间不会超过五个机器周期(为完成正在执行的指令还需要一个周期,加上为完成下一条指令所需要的最长时间——四个周期,如MUL 和DIV 指令)。

因此,在系统中只有一个中断源的情况下,响应时间总是在三个机器周期到八个机器周期之间。

6 . 4外部中断触发方式

MCS-51的外部中断INTx (0INT 和1INT )可以用程序控制为电平触发或负边沿触发(通过编程对定时器/计数器控制寄存器TCON 中的IT0和IT1位进行清“0”或置“1”)。 若IT X (X=0,1)为0,则外部中断INTx 程控为电平触发,由INTx 引脚上所检测

到的低电平(必须保持到CPU 响应该中断时为止,并且还应在中断返回前变为高电平)触发。

若IT X =1,则外部中断INTx 由负边沿触发。即在相继的两个机器周期中,前一个周期从INTx 引脚上检测到高电平,而在后一个周期检测到低电平,则置位TCON 寄存器中的中断请求标志IE X (IE0或IE1),由IE X 发出中断请求。

由于外部中断引脚在每个机器周期内被采样一次,所以中断引脚上的电平应至少保持12个振荡周期,以保证电平信号能被采样到。对于负边沿触发方式的外部中断,要求输入的负脉冲宽度至少保持12个振荡周期(若晶振频率为6MHz ,则宽度为2μs ),以确保检测到引脚上的电平跳变,而使中断请求标志IE X 置位。

对于电平触发的外部中断源,要求在中断返回前撤销中断请求(使引脚上的电平变高)是为了避免在中断返回后又再次响应该中断而出错。电平触发方式适用于外部中断输入为低电平,而且能在中断服务程序中撤销外部中断请求源的情况。

(1)电平触发即8051每执行完一个指令都将INTx 的信号读入IE X (INTx =0,IEX=1;INTx =1,IEX=0),因此IEX 的中断请求信号随着INTx 变化。如果送入INTx 的中断请求信号,8051未能即时检查到,而INTx 的信号也产生变化,,IEX 的信号亦发生变化,这样就会漏掉INTx 的中断要求。

(2)负边沿触发即只要检测到送至INTx 上的信号由1变成0时,中断请求标志位IEX 就被设定为1,并且一直维持着1,直到此中断请求被接收为止,且必须用软件来清除IEX ,如JBC IE1,LOOP 。

6 . 5 多个外部中断源系统设计

MCS-51有两个外部中断源0INT 和1INT ,但在实际的应用系统中,外部中断请求源往往比较多,下面讨论两种多中断源系统的设计方法。

1、 定时器中断作为外部中断使用

把MCS-51的两个定时器/计数器(T0和T1)选择为计数器方式,每当P3.4(T0)或P3.5(T1)引脚上发生负跳变时,T0和T1的计数器加1。利用这个特性,可以把P3.4和P3.5引脚作为外部中断请求输入线,而定时器的溢出中断作为外部中断请求标志。应用举例如下:

设T0为方式2(自动装入常数)外部计数方式,时间常数为0FFH ,允许中断,并

CPU开放中断。其初始化程序为:

MOV TMOD,#06H ;数00000110B送方式寄存器TMOD。设T0为方式2,

计数器方式工作;

MOV TL0,#0FFH ;时间常数0FFH送T0的低8位TL0和高8位TH0寄存

器。

MOV TH0,#0FFH

SETB TR0,;置TR0为1,启动T0。

MOV IE,#82H ;置中断允许,即置中断允许寄存器IE中的EA位,ET0

位为1

:

当接在P3.4引脚上的外部中断请求输入线发生负跳变时,TL0加1溢出,TF0被置“1”向CPU发出中断请求。同时TH0的内容自动送入TL0,使TL0恢复初始值0FFH。这样,每当P3.4引脚上有一次负跳变时都置“1”于TF0,向CPU发中断请求,P3.4引脚就相当于边沿触发的外部中断请求源输入线。

同理,也可以把P3.5引脚作类似的处理。

2、中断和查询结合的方式

这种方法是把系统中多个外部中断源按它们的重要程度进行排队,把其中最高级别

INT脚),其余的中断源用的中断源接到MCS-51的一个外部中断源输入端(例如接到0

INT),并同时还接到一个I/O口,如线“或”的方法连接到另一个外部中断输入端(1

图6-2中接到P1口。中断请求由硬件电路产生,而中断源的识别由程序查询来处理,查询顺序由中断源的优先级决定。图6-3为五个外部中断源的连接电路,其中设备1~4经INT连接,

OC门与1

图6-2多个外部中断源系统设计

并连接到P1.0~P1.3,均采用电平触发方式。设备0为最高级中断源,单独作为外部中断0的输入信号。外部中断1的中断服务程序如下:

INTR:PUSH PSW ;程序状态字PSW内容压入堆栈保存

PUSH A ;累加器A内容压入堆栈保存

JNB P1.0,DVT1 ;P1.0引脚为0,转至设备1中断服务程序

JNB P1.1,DVT2 ;P1.1引脚为0,转至设备2中断服务程序

JNB P1.2,DVT3 ;P1.2引脚为0,转至设备3中断服务程序

JNB P1.3,DVT4 ;P1.3引脚为0,转至设备4中断服务程序

INTR1:POP A ;压入堆栈的内容送回到A

POP PSW ;恢复程序状态字PSW的内容

RETI ;中断返回

DVT1:;设备1中断服务程序入口

AJMP INTR1 ;跳转到INTR1所指示的指令

DVT2:;设备2中断服务程序入口

AJMP INTR1 ;跳转到INTR1

DVT3:;设备3中断服务程序入口

AJMP INTR1 ;跳转到INTR1

DVT4: ;设备4中断服务程序入口

AJMP INTR1 ;跳转到INTR1

6 . 6 MCS-51对中断请求的撤除

在中断请求被响应前,中断源发出的中断请求是由CPU 锁存在特殊功能寄存器TCON 和SCON 的相应中断标志位中的。一旦某个中断请求得到响应,CPU 必须把它的相应中断标志位复位成“0”状态。否则,MCS-51就会因为中断标志位未能得到及时撤除而重复响应同一中断请求,这是绝对不能容许的。

8031、8051和8751有5个中断源,但实际.分属于三种中断类型。这三种类型是:外部中断、定时器溢出中断和串行口中断。对于这三种中断类型的中断请求,其撤除方法是不相同的。现对它们分述如下:

1、 定时器溢出中断请求的撤除

TF 0和TF 1是定时器溢出中断标志位(见TCON ),它们因定时器溢出中断源的中断请求的输入而置位,因定时器溢出中断得到响应而自动复位成“0”状态。因此,定时器溢出中断源的中断请求是自动撤除的,用户根本不必专门为它们撤除。

2、 串行口中断请求的撤除

TI 和RI 是串行口中断的标志位(见SCON ),中断系统不能自动将它们撤除,这是因为MCS-51进入串行口中断服务程序后常需要对它们进行检测,以测定串行口发生了接收中断还是发送中断。为防止CPU 再次响应这类中断,用户应在中断服务程序的适当位置处通过如下指令将它们撤除。

CLR TI ;撤除发送中断

CLR RI ;撤除接收中断

若采用字节型指令,则也可采用如下指令:

ANL SCON ,#0FCH ;撤除发送和接收中断

3、 外部中断请求的撤除

外部中断请求有二种触发方式;电平触发和负边沿触发。对于这两种不同的中断触发方式,MCS-51撤除它们的中断请求的方法是不相同的。

在负边沿触发方式下,外部中断标志IE 0或IE 1,是依靠CPU 两次检测0INT 或1INT 上触发电平状态而置位的。因此,芯片 设计者使CPU 在响应中断时自动复位IE 0或IE 1就可撤除0INT 或1INT 上的中断请求,因为外部中断源在得到CPU 的中断服务时是不可能再在0INT 或1INT 上产生负边沿而使中断标志位IE 0或IE 1置位的。

在电平触发方式下,外部中断标志IE 0或IE 1是依靠CPU 检测0INT 或1INT 上低电平而置位的。尽管CPU 响应中断时相应中断标志IE 0或IE 1能自动复位成“0”状态,但若外部中断源不能及时撤除它在0INT 或1INT 上低电平,就会再次使已经变成“0”的中断标志IE 0或IE 1置位,这是绝对不能允许的。因此,电平触发型外部请求的撤除必须使0INT 或1INT 上低电平随着其中断被CPU 响应而变成高电平。一种可供采用的电平型外部中断的撤除电路如图6-4所示。由图可见,当外部中断源产生中断请求时,Q 触发器复位成“0”状态,Q 端的低电平被送到0INT 端,该低电平被8031检测到后就使中断标志IE 0置“1”。8031响应0INT 上中断请求便可转入0INT 中断服务程序执行,故我们可以在中断服务程序开头安排如下程序来撤除0INT 上低电平。

图6-3电平外部中断的撤除电路

INSVR :ANL P 1,#0FEH

ORL P 1,#01H

CLR IE 0

·

8031执行上述程序就可在P 1.0上产生一个宽度为二个机器周期的负脉冲。在该负脉冲作用下,Q 触发器被置位成“1”状态,0INT 上电平也因此而变高,从而撤除了其上的中断请求。

6 .

7 MCS-51中断系统的初始化

MCS-51中断系统功能,是可以通过上述特殊功能寄存器统一管理的,中断系统初始化是指用户对这些特殊功能寄存器中的各控制位进行赋值。

1、中断系统初始化

中断系统初始化步骤如下:

⑴ 开相应中断源的中断;

⑵ 设定所用中断源的中断优先级;

⑶ 若为外部中断,则应规定低电平还是负边沿的中断触发方式。

例5.1请写出1INT 为低电平触发的中断系统初始化程序。

解:①采用位操作指令

SETB EA

SETB EX 1 ;开1INT 中断

SETB PX 1 ;令1INT 为高优先级

CLR IT 1 ;令1INT 为电平触发

②采用字节型指令

MOV IE ,#84H ;开1INT 中断

ORL IP ,#04H ;令为1INT 高优先级

ANL TCON ,#0FBH ;令为1INT 电平触发

显然,采用位操作指令进行中断系统初始化是比较简单的,因为用户不必记住各控制位寄存器中的确切位置,而各控制位名称是比较容易记忆的。

2、外部中断设定的步骤:

① ORG 03H (13H ) 0INT (1INT )外部中断的起始地址

② JMP EXT 中断时跳至中断子程序EXT

③ MOV IE ,#10000001BH 0INT 中断使能

MOV IE ,#10000100BH 1INT 中断使能

INT中断优先

④MOV IP,#00000001BH 0

INT中断优先

MOV IP,#00000100BH 1

INT为电平触发)

⑤MOV TCON,#00000000B(设定0

INT为负边沿触发)

MOV TCON,#00000001B(设定0

INT为电平触发)

MOV TCON,#00000000B(设定1

INT为负边沿触发)

MOV TCON,#00000100B(设定1

3、TIMER0或TIMER1的中断请求

当计数溢出时会设定TF X=1,而对8051提出中断请求。TIMER0或TIMER1中断请求设定的步骤如下:

⑴定中断起始地址

ORG 0BH ;TIMER0

ORG 1BH ;TIMER1

⑵定工作方式

MOV TMOD ,#XXXXXXXXB

⑶设定计数值

MOV THX,#XXXX

MOV TLX,#XXXX

⑷设定中断使能

MOV IE,#1000X0X0

为了让学生理解中断的全过程,可在全软件仿真中调试如下程序,调试时打开硬件P1、P3口仿真图,置P3.2为低电平时,才能进入中断服务程序,

P1口指示灯移位程序,中断一次指示灯移动一位。若不变低,程序就不向下执行。 ORG 0000H

AJMP MAIN

ORG 0003H

AJMP WINT

ORG 0100H

MAIN: MOV A,#01H

SETB IT0

SETB EX0

SETB EA

LOOP: AJMP LOOP

ORG 0200H

WINT : PUSH ACC

PUSH PSW

MOV P1,A

RL A

POP PSW

POP ACC

RETI

END

6 . 8 应用举例

例1、外部中断(0INT /1INT )

⑴ 功能说明

主程序将P1的8个LED 做左移右移,中断时(按0INT 时)使P1的8个LED 闪烁5次。

⑵ 硬件:见第二章图2-16只是在第12脚(0INT )接一个按键,按键两端一端接12脚,另一端接地。

⑶ 程序:

ORG 0000H ;起始地址

JMP START ;跳到主程序START

ORG 0003H ;0INT 中断子程序起始地址

JMP EXT0 ;中断子程序

START :MOV IE ,#10000001B ;0INT 中断使能

MOV IP ,#00000001B ;0INT 中断优先

MOV TCON ,#00000000B ;0INT 为电平触发

MOV SP ,#70H ;设定堆栈指针

LOOP : MOV A ,#0FFH ;左移初值

CLR C ;c=0

MOV R2,#08 ;设定左移8次

LOOP1:RLC A ;含C 左移一位

MOV P1,A ;输出至P1

ACALL DELAY ;延时0.2秒

DJNZ R2,LOOP1 ;左移8次?

MOV R2,#07 ;设定右移7次

LOOP2:RRC A ;含C 右移一位

MOV P1,A ;输出至P1

ACALL DELAY ;延时0.2秒

DJNZ R2,LOOP2 ;左移7次?

JMP LOOP ;重复

EXT0: PUSH ACC ;将累加器的值压入堆栈保存

PUSH PSW ;将PSW 的值压入堆栈保存

SETB RS0 ;设定工作寄存器组1

CLR RS1

MOV A ,#00 ;为使P1全亮

MOV R2,#10 ;闪烁5次(全亮,全减计10次)

LOOP3:MOV P1,A ;将A 输出至P1

ACALL DELAY ;延时0.2秒

CPL A ;将A 的值反相

DJNZ R2,LOOP3 ;闪烁5次(亮减10次)?

POP PSW ;从堆栈取回PSW 的值

POP ACC ;从堆栈取回A 的值

RETI ;返回主程序

DELAY : MOV R5,#20 ;0.2秒

D1: MOV R6,#20 ;10毫秒

D2: MOV R7,#248 ;0.5秒

DJNZ R7,$

DJNZ R6,D2

DJNZ R5,D1

RET

END

例2、 两个中断(0I N T ,1I N T )同时使用

⑴ 相关知识

1)两个中断同时存在时,设置IP 寄存器(中断优先)有两种方法 :

① 同一层中断:IP=00000000B

先按键者先中断,后按键者后中断(按键见图2-16),不分高低中断优先。

② 高低优先中断:如本题1INT 为高优先,而0INT 为低优先。

IP=00000100B ,两个中断同时产生(或即使0INT 已产生中断),1INT 先中断(0INT 停止中断),执行中断子程序后,再产生0INT 中断(0INT 中断必须为负边沿触发)。

2)TCON 的设定不同,也会造成不同的结果。说明如下:(以本题为例) ① TCON=00000000B ;0INT 、1INT 均为电平触发

(A )0INT ,1INT 同时产生中断,则跳至EXT1中断子程序执行后返回

主程序。

(B )0INT 中断期间,1INT 产生中断,则0INT 中断暂停,跳至EXT1

中断子程序执行后,再跳至EXT0中断子程序执行未完的程序,然

后返回主程序。

(C )1INT 中断期间,0INT 产生中断,对1INT 中断不影响,执行EXT1

中断后返回主程序。

② TCON=00000001B ;1INT 为电平触发,0INT 为负边沿触发

(A )0INT 、1INT 同时中断,则跳至EXT1中断子程序执行后,再跳至

EXT0中断子程序执行,然后返回主程序。

(B )0INT 中断期间,1INT 产生中断,则0INT 中断暂停,跳至EXT1

中断子程序执行后,然后再跳至EXT0中断子程序执行未完的程序,

返回主程序。

(C )1INT 中断期间,0INT 产生中断,对1INT 中断不影响,继续执行

EXT1中断子程序后,再跳至EXT0中断子程序执行后,返回主程序。

⑵ 功能说明

主程序:P1接8个LED ,使8个LED 闪烁。

INT0控制的中断要求:使P1口的8个LED 做一个灯的左移右移3次。

INT1控制的中断要求:使P1口的8个LED 做二个灯的左移右移3次。

⑶ 硬件:见第二章图2-16只是在第12脚(0INT )和第13(1INT )脚各接一个按键,

⑷ 程序:

ORG 0000H ;主程序起始地址

JMP START ;跳至主程序START

ORG 0003H ;0INT 中断子程序起始地址

JMP EXT0 ;跳至0INT 中断子程序EXT0

ORG 0013H ;1INT 中断子程序起始地址

JMP EXT1 ;跳至1INT 中断子程序EXT1

START : MOV IE ,#10000101B ;0INT 、1INT 中断使能

MOV IP ,#00000100B ;INT1中断优先

MOV TCON ,#00000000B ;0INT 、1INT 为电平触发

MOV SP ,#70H ;设定堆栈在(70H )

MOV A ,#00

MOV P1,A

MOV A ,#00 ;使P1闪烁

LOOP : MOV P1,A

ACALL DELAY ;延时0.2秒

CPL A ;将A 反相(使全亮)

JMP LOOP ;重复循环

EXT0: PUSH ACC ;将A 压入堆栈暂时保存

PUSH PSW ;将PSW 压入堆栈暂时保存

SETB RS0 ;设定工作寄存器组1 RS1=0 RS0=1

CLR RS1

MOV R3,#03 ;左右移3次

LOOP1:MOV A ,#0FFH ;左移初值

CLR C ;c=0

MOV R2,#08 ;设定左移8次

LOOP2:RLC A ;含C 左移一位

MOV P1,A ;输出至P1

ACALL DALAY ;延时0.2秒

DJNZ R2,LOOP2 ;左移8次?

MOV R2,#07 ;设定右移7次

LOOP3: RRC A ;含C 右移一位

MOV P1,A ;输出至P1

ACALL DELAY ;延时0.2秒

DJNZ R2,LOOP3 ;左移7次?

DJNZ R3,LOOP1 ;左右移3次?

POP PSW ;至堆栈取回PSW的值

POP ACC ;至堆栈取回A的值

RETI ;返回主程序

EXT1:PUSH ACC ;将A压入堆栈暂时保存

PUSH PSW ;将PSW压入堆栈暂时保存

SETB RS ;设定工作寄存器组2 RS1=1RS0=0

CLR RS0

MOV R3,#03 ;左右移3次

LOOP4:MOV A,#0FCH ;左移初值

MOV R2,#06 ;设定左移6次

LOOP5:RL A ;左移一位

MOV P1,A ;输出至P1

ACALL DELAY ;延时0.2秒

DJNZ R2,LOOP5 ;左移6次?

MOV R2,#06 ;设定右移6次

LOOP6:RR A ;右移一位

MOV P1,A ;输出至P1

ACALL DELAY ;延时0.2秒

DJNZ R2,LOOP6 ;

DJNZ R3,LOOP4 ;

POP PSW ;

POP ACC ;

RETI ;

DELAY:MOV R5,#20 ;

D1:MOV R6,#20 ;

D2:MOV R7,#248 ;

DJNZ R7,$ ;

DJNZ R6,D2 ;

DJNZ R5,D1 ;

RET ;

END

例3、广告灯左移(计时中断法)

⑴功能说明

①令P1的8个LED每隔1秒左移1次

②令TIMER0工作在MODE1(16bit定时器),每隔10000μs产生一次中断,而中断100次就是1秒。

③定时器在FFFFH时,再加1会变成0000H而产生溢出,并设定中断标志位TF0为1,以对CPU提出中断要求。因此在中断产生时,定时器内部的16bit全部为0,若在此时不重新设定定时器的计数值,则定时器就从0000H开始计数,当下次溢出产生时,

2=65536个脉冲(即65536μs),所以在定时器溢出时,必须重新设计数值,(如共计数16

本题10000μs)。另一个问题是,如果从定时器提出中断请求,必须经POP A、MOV TH0,#HIGH(65536-10000)、MOV TL0,#LOW(65536-10000),计3个指令6个机器周期后才开始计时,即有6μs的计时误差,这是8051的TIMER在MODE0、MODE1、MODE3的缺点。可将此6μs计入,即可改进此缺点。如本题重新设计的计数值可为9996(10000)。另外可由MODE2来改进这一缺点,因为MODE2在溢出时可以将预存在THX的计数值载入定时器TLX,这样可以不受软件的影响。

⑵硬件:见第二章图2-16

⑶程序:

ORG 00H

JMP START

ORG 0BH

JMP TIM0

START: MOV TMOD,#00000001B

MOV TH0,#LOW(65536-10000)

MOV TL0,#HIGH(65536-10000)

SETB TR0

MOV IE,#1000010B

MOV R5,#100

MOV P1.#0FEH

JMP $

TIM0: PUSH ACC

MOV TH0,#HIGH(65536-10000)

MOV TL0,#LOW(65536-10000)

DJNZ R5,LOOP

MOV R5,#100

MOV A,P1

RL A

MOV P1,A

LOOP: POP ACC

RETI

END

例4、计时中断与外部中断同时存在

⑴功能说明

①令P1的8个LED每隔1秒左移1次。

②按INT0时,8个LED闪烁5次。

INT)接一个按键,按键两端一端接

⑵硬件:见第二章图2-16只是在第12脚(0

12脚,另一端接地。

⑶程序:

ORG 0000H ;主程序起始地址

JMP START ;跳至主程序

ORG 0003H

JMP EXT0

ORG 000BH ;TIMER0中断起始地址

JMP TIM0 ;跳至TIMER0中断子程序TIM0 START:MOV SP,#70H ;设堆栈

MOV TMOD,#00000001B ;设定TIMER0工作在MODE1

MOV TH0,#HIGH(65536-10000) ;10000微秒

MOV TL0,#LOW(65536-10000)

SETB TR0 ;启动TIMER0

MOV IE,#10000011B ;TIMER0中断使能,INT0外部中断

MOV IP,#00000001B

MOV R5,#100 ;设中断100次即1秒

MOV R1,#0FEH ;左移初值

JMP $ ;无穷循环

TIM0:PUSH ACC ;将A的值暂存于堆栈

PUSH PSW

MOV TH0,#HIGH(65536-10000) ;重设计时次数

MOV TL0,#LOW(65536-10000)

DJNZ R3,LOOP ;中断100次?不是则到LOOP

MOV R3,#100 ;是则重设R5=100

MOV A,R1 ;读入P1的数据至A

MOV P1,A

RL A ;将A左移一位

MOV R1,A ;存入左移初值

LOOP:POP PSW ;至堆栈取回A的值

POP ACC

RETI ;返回主程序

51单片机中断程序大全

//实例42 :用定时器T0 查询方式 P2 口8 位控制LED 闪烁 //#include单片机寄存器定义的头文件 51包含 /******************************************************* *******函数功能:主函数 ******************************************************** ******/void main(void){ // EA=1;开总中断// 中断允许T0 // 定时器// ET0=1; 1的模式TMOD=0x01;// 使用定时器T0 位赋初值定时器T0 的高8 TH0=(65536-46083)/256; // 位赋初值的高8 TL0=(65536-46083)%6; // 定时器T0 T0启动定时器TR0=1;// TF0=0;P2=0xff; 无限循环等待查询while(1)// {while(TF0==0); TF0=0;P2=~P2; 位赋初值的高8 定时器TH0=(65536-46083)/256; // T0 位赋初值T0 TL0=(65536-46083)%6; //

定时器的高8 }} 1KHzT1:用定时器43 实例// 音频查询方式控制单片机发出 #include 单片机寄存器定义的头文件51 // 包含sbit sound=P3^7;将// 引脚sound P3.7 位定义为 /********************************************************** **** 函数功能:主函数 ******************************************************** ******/void main(void){// EA=1;开总中断// 中断允许ET0=1;// // 定时器T0 1的模式使用定时器// T1 TMOD=0x10; 位赋初值// TH1=(65536-921)/256; T1 定时器的高8 TL1=(65536-921)%6; // 定时器T1 的高8 位赋初值 TR1=1;// 启动定时器T1TF1=0; while(1)// 无限循环等待查询{while(TF1==0); TF1=0;

单片机中断程序大全

单片机中断程序大全公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-

//实例42:用定时器T0查询方式P2口8位控制L E D闪烁#include // 包含51单片机寄存器定义的头文件void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频

#include // 包含51单片机寄存器定义的头文件sbit sound=P3^7; //将sound位定义为P3.7引脚 void main(void) {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0); TF1=0; sound=~sound; //将P3.7引脚输出电平取反 TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%256; //定时器T0的高8位赋初值 } } //实例44:将计数器T0计数的结果送P1口8位LED显示 #include // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为P3.4引脚

51单片机中断程序大全

//实例42:用定时器T0查询方式P2口8位控制LED闪烁#include // 包含51单片机寄存器定义的头文件 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 } } //实例43:用定时器T1查询方式控制单片机发出1KHz音频#include // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为P3.7引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值

51单片机利用中断控制灯频率和顺序

#include //包含51单片机寄存器定义的头文件#include int e=0,f=0,d=1,a=0,b=0,c=0,delay=10,m=1,V=128; G=1; /******************************************* 函数功能:主函数 ******************************************/ void main(void) { EA=1; //开放总中断 EX0=1; //允许使用外中断 ET0=1; //定时器0开 EX1=1; TMOD=0X01; IT0=1; //选择负跳变来触发外中断 IT1=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; while(1) ; //无限循环,防止程序跑飞 }

/************************************************************** 函数功能:外中断T0的中断服务程序 **************************************************************/ Time() interrupt 1 //外中断0的中断编号为0 { if(m%delay==0) { m=1; switch(e) { case 0: P1=G; a++; G=P1<<1; // P1=G; if(a==8) { a=0; G=1; } break; case 1: //反序 P1=V; b++; V=P1>>1; // P1=V; if(b==8) { b=0; V=128; } break; case 2: //中间到两边 P1=pow(2,4+c)+pow(2,3-c); c++; if(c==4) { c=0; }

51单片机定时中断C语言的写法步骤

51单片机定时中断C语言的写法步骤 程序说明:51单片机定时器0工作于方式一,定时50ms中断一次 晶振为12M #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 ET0 = 1; //开定时器0中断 EA = 1; //开总中断 TR0 = 1; //启动定时器0 while(1) { ; } } void Timer0_int() interrupt 1 { //重新装初值 TH1 = (65536-50000)/256; //高八位装入初值 TL1 = (65536-50000)%256; //低八位装入初值 } /****************************************************************************** *********************************/ 上面是比较好理解的。如果实在要求简洁的话,看下面的,跟上面功能一样 #include void main { TOMD = 0X01;//配置定时器0工作于方式一 TH1 = 0x3c; //高八位装入初值 TL1 = 0xb0; //低八位装入初值 IE = 0x82;//开总中断并开定时器0中断 TR0 = 1; //启动定时器0 while(1) { ; } }

void Timer0_int() interrupt 1 { //重新装初值 TH1 = 0x3c; //高八位装入初值TL1 = 0xb0; //低八位装入初值}

51单片机中断总结

51单片机中断总结: 1. 查询优先级为固定的(外部中断0>定时器0>外部中断1>定时器1>串行中断)。 2. 执行优先级可以通过IP寄存器进行设置(高/低)。 3. CPU同时收到多个中断请求时,首先响应优先级较高者,然后相应优先级较低者;如果 优先级相同,则按照查询优先级顺序依次响应。 4. 正在执行的中断服务,不能被同级或更低级的中断请求打断,但会被更高级的中断请求 打断。推论(1)高优先级的中断不能被任何其它中断所打断(2)低优先级的中断只能在没有任何中断服务运行时得到响应。 5. 对于定时器和外部中断,在进入中断服务后,其中断标志位会自动清零;对于串行中断,由于有两个中断源,需要手动查询并清零RI或/和TI。 if (RI) { // processing RI = 0; } if (TI) { // processing TI = 0; } 6. 如果是使用汇编写中断服务,需要保护累加器、状态寄存器、寄存器组等 8051 Tutorial: Interrupts https://www.sodocs.net/doc/8916904225.html,/tutint.php As the name implies, an interrupt is some event which interrupts normal program execution. As stated earlier, program flow is always sequential, being altered only by those instructions which expressly cause program flow to deviate in some way. However, interrupts give us a mechanism to "put on hold" the normal program flow, execute a subroutine, and then resume normal program flow as if we had never left it. This subroutine, called an interrupt handler, is only executed when a certain event (interrupt) occurs. The event may be one of the timers "overflowing," receiving a character via the serial port, transmitting a character via the serial

51单片机中断程序大全

//实例42 :用定时器TO查询方式P2 口8位控制LED闪烁#include // 包含 51 单片机寄存器定义的头文件/************************************************************** 函数功能:主函数 void main(void) { // EA=1; // 开总中断 // ETO=1; // 定时器 TO 中断允许 TMOD=OxO1; // 使用定时器 TO 的模式 1 THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值 TLO=(65536-46O83)%256; // 定时器 TO 的高 8 位赋初值 TRO=1; // 启动定时器 TO TFO=O; P2=Oxff; while(1)// 无限循环等待查询 { while(TFO==O) TFO=O; P2=~P2; THO=(65536-46O83)/256; // 定时器 TO 的高 8 位赋初值

TL0=(65536-46083)%256; // 定时器 T0 的高 8 位赋初值 } // 实例43 :用定时器T1 查询方式控制单片机发出1KHz 音频#include // 包含 51 单片机寄存器定义的头文件 sbit sou nd=P3^7; // 将 sound 位定义为 P3.7 引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; // 开总中断 // ET0=1; // 定时器 T0 中断允许 TMOD=0x10; // 使用定时器 T1 的模式 1 TH1=(65536-921)/256; // 定时器 T1 的高 8 位赋初值 TL1=(65536-921)%256; // 定时器 T1 的高 8 位赋初值 TR1=1; // 启动定时器 T1 TF1=0; while(1)// 无限循环等待查询 {

51单片机中断详解

一、中断的概念 CPU在处理某一事件A时,发生了另一事件B请求C PU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待C PU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断二、中断源 在51单片机中有5个中断源 中断号优先级中断源中断入口地址 0 1(最高)外部中断0 0003H 1 2 定时器0 000BH 2 3 外部中断1 0013H 3 4 定时器1 0018H 4 5 串口总段0023H 三、中断寄存器 单片机有10个寄存器主要与中断程序的书写控制有关 1.中断允许控制寄存器IE 2.定时器控制寄存器TC ON 3.串口控制寄存器SCON 4.中断优先控制寄存器IP 5.定时器工作方式控制寄存器TMOD 6.定时器初值赋予寄存器(TH0/TH1,TL0/TL1)

四、寄存器功能与赋值说明 注:在用到中断时,必须要开总中断EA,即EA=1。//开总中断 1.中断允许控制寄存器IE EX0(EX1):外部中断允许控制位 EX0=1 外部中断0开关闭合//开外部0中断 EX0=0 外部中断0开关断开 ET0(ET1):定时中断允许控制位 ET0=1 定时器中断0开关闭合//开内部中断0 ET0=0 定时器中断0开关断开 ES: 串口中断允许控制位 ES=1 串口中断开关闭合//开串口中断 ES=0 串口中断开关断开 2.定时器控制寄存器TCON //控制外部中断和定时器中断 外部中断: IE0(IE1):外部中断请求标志位 当INT0(INT1)引脚出现有效的请求信号,此位由单片机自动置1,cpu开始响应,处理终端,而当入

51单片机中断程序大全

( //实例42:用定时器T0查询方式P2口8位控制LED闪烁 #include<> // 包含51单片机寄存器定义的头文件 void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 : TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; ] TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 //实例43:用定时器T1查询方式控制单片机发出1KHz音频 #include<> // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为引脚 void main(void) ( {// EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 — { while(TF1==0); TF1=0;

51单片机中断系统编程

51单片机中断系统编程 51单片机中断系统编程 上传的图片 抱歉,您所在的组无权下载附件,请注册或登陆中断是指如下过程(如下图所示):CPU 与外设同时工作,CPU执行主程序,外设做准备工作。当外设准备好时向CPU发中断请求信 号,若条件满足,则CPU终止主程序的执行,转去执行中断服务程序。在中断服务程序中 CPU与外设交换信息,待中断服务程序执行完后,CPU再返回刚才终止的主程序继续执行。 5.3.1 中断系统 MCS-51单片机提供了5个固定的可屏蔽中断源,3个在片内,2个在片外,它们在程序存储 器中各有固定的中断入口地址,由此进入中断服务程序。5个中断源的符号、名称及产生 的条件如下。 ? INT0:外部中断0,由P3.2端口线引入,低电平或下跳沿引起。 ? INT1:外部中断1,由P3.3端口线引入,低电平或下跳沿引起。 ? T0:定时器/计数器0中断,由T0计数溢出引起。 ? T1:定时器/计数器l中断,由T1计数溢出引起。 ? TI/RI:串行I/O中断,串行端口完成一帧字符发送/接收后引起。 中断源有两级中断优先级,可形成中断嵌套。两个特殊功能寄存器用于中断控制和条件设 置。整个中断系统的结构框图如图所示。 上传的图片 抱歉,您所在的组无权下载附件,请注册或登陆 中断系统结构框图 2 中断系统的控制寄存器 中断系统有两个控制寄存器(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;定时器/计数器T1中断允许位。ETl=1,允许T1中断;ETl=0,禁止T1中断。 ? EXl:外部中断l中断允许位。EXl=1,允许外部中断1中断;EXl=0,禁止外部中断1中 断。 ? ET0:定时器/计数器T0中断允许位。ET0=1,允许T0中断;ET0=0,禁止TO中断。 ? EX0:外部中断0中断允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中 断。 (2)中断优先级寄存器IP IP在特殊功能寄存器中,字节地址为B8H,位地址(由低位到高位)分别是B8H一BFH。 MCS-51单片机的中断分为两个优先级,IP用来设定各个中断源属于两级中断中的哪一级, 其基本格式如下: 上传的图片

51单片机外部中断实验

实验6 外部中断实验 (仿真部分) 一、实验目的 1. 学习外部中断技术的基本使用方法。 2. 学习中断处理程序的编程方法。 二、实验内容 在INT0和INT1上分别接了两个可回复式按钮,其中INT0上的按钮每按下一次则计数加一,其中INT1上的按钮每按下一次则计数减一。P1.0~ P1.3接LED灯,以显示计数信号。 三、实验说明 编写中断处理程序需要注意的问题是: 1.保护进入中断时的状态,并在退出中断之前恢复进入时的状态。 2.必须在中断处理程序中设定是否允许中断重入,即设置EX0位。 3.INT0和INT1分别接单次脉冲发生器。P1.0~ P1.3接LED灯,以查看计数信号. 四、硬件设计 利用以下元件:AT89C51、BOTTON、CAP、CAP-POL、CRYSTAL、RES、NOT、LED-Yellow。设计出如下的硬件电路。晶振频率为12MHz。 五、参考程序框图 设置P1.0~ 3初始状态

主程序框图 INT0中断处理程序框图 实验6 外部中断实验 (实验箱部分) 1.实验目的 认识中断的基本概念 学会外部中断的基本用法 学会asm和C51的中断编程方法 2.实验原理 图按键中断 【硬件接法】 控制LED,低电平点亮 INT1接按键,按下时产生低电平 【运行效果】 程序工作于中断方式,按下按键K2后,LED点亮,秒后自动熄灭。

8051单片机有/INT0和/INT1两条外部中断请求输入线,用于输入两个外部中断源的中断请求信号,并允许外部中断源以低电平或下降沿触发方式来输入中断请求信号。/INT0和/INT1中断的入口地址分别是0003H和0013H。 TCON寄存器(SFR地址:88H)中的IT0和IT1位分别决定/INT0和/INT1的触发方式,置位时为下降沿触发,清零时为低电平触发。实际应用时,如果外部的中断请求信号在产生后能够在较短时间内自动撤销,则可以选择低电平触发。在中断服务程序里要等待其变高后才能返回主程序,否则会再次触发中断,产生不必要的麻烦。 如果外部的中断请求信号产生后可能长时间后才能撤销,则为了避免在中断服务程序里长时间无谓等待,可以选择下降沿触发。下降沿触发是“一次性”的,每次中断只会有1个下降沿,因此中断处理程序执行完后可以立即返回主程序,而不必等待中断请求信号恢复为高电平,这是一个重要的技巧。 3. 实验步骤 参考实验例程,自己动手建立Keil C51工程。注意选择CPU类型。Philips半导体的P89V51RB2。 编辑源程序,编译生成HEX文件。 ISP下载开关扳到“00”,用Flash Magic软件下载程序HEX文件到MCU BANK1,运行。 运行Flash Magic软件。各步骤操作如下: Step 1: COM Port:选择实际使用的串行口,通常为COM1; Baud Rate:波特率不可设置得过高,推荐用9600; Device:请选择正确的型号89V51RB2; Interface:选择None(ISP)。 Step 2:请勾中“Erase blocks used by Hex File”。 Step 3:装入你的程序文件,注意必须为HEX格式。 Step 4: 请勾中“Verify after programming”(编程后校验); 对其它几项如果不了解,请不要勾中。 Step 5: 请先给电路板上电,同时按住复位键不松手,然后点击Flash Magic软件的“Start”按

51单片机中断控制LED

单片机作业 题目要求: 设计这样一个系统:在一个51单片机最小系统板上,P1口低四位接四个四角按键,高四位接四个LED灯。按键中断作为总中断,当接中断的按键按下后,所有灯均可按照对应的按键进行点亮。当没有中断按下时,无论怎么按接在P1口低四位的按键,均不能是按键点亮。 实现步骤: 第一:电路搭建: 电路搭建说明: 1.采用AT89C52单片机,DIP40封装。 2.选用12M,并使晶振尽可能接近单片机,采用22pf的电容接在晶振两边并接地,使晶振更容易起振。 3.标号为D18的LED是中断触发指示灯,一旦中断触发,D18会一直亮着。没有中断触发时会一直灭着。 4.key1,key2,key3,key4分别控制D1,D2,D3,D4,D 5. 5.D5为复位指示灯,当复位按键按下时,D5亮。反之灭。 第二:程序实现: 本程序十分简单,秉着杜绝抄袭,自助设计的理念,本程序完全有本人设计完成。没有采用老师讲解的例程。程序的注释已经将程序称述的很明白,现做简要说明: 本人将按键查询部分都放在中断处理函数中处理。当中断触发按键按下时,D18亮,程序进入中断函数,开始不断查询按键值,并点亮相应led.。这样的程序 对CPU的占有率较高,但由于这样写代码更加简单明了,有由于题目对cpu占有率的并没有明确要求,本着开发周期尽可能短的原则,本程序选择了简单方案。

现将代码复制如下: 将KEIL与PROTEUS联调,调试结果如下: 1.启动程序: ,可以看到图中三角符号变绿。此时:

此时,图中所有led灭,无现象。 1.此时按下任意按键,比如key1,key2两个(为了方便截图,直接将开关用导线短路): 现象如下: 可以看到,并没有认可指示灯亮。 2.按复位按键观察是否正常(为了方便截图,直接将开关用导线短路):

51单片机中断系统程序实例

51单片机中断系统程序实例(STC89C52RC) 51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。 单片机的学习不难,只要掌握学习方法,学起来并不难。什么是好的学习方法呢,一定要掌握二个要点: 1. 要知道寄存器的英文全拼,比如IE = interrupt中断 不知道全拼,要去猜,去查。这样就可以理解为什么是这个名称,理解了以后就不用记忆了。 2. 每个知识点要有形像的出处 比如看到TF0,脑子里马上要形像地定位到TCON寄存器的某位 看到ET0, 马上要形像地定位到IE寄存器的第2位 https://www.sodocs.net/doc/8916904225.html,/tuenhai/独家揭秘:形像是记忆的最大技巧。当人眼看到某个图时,是把视觉信号转化成电信号,再转化成人能理解的形像。当我们回忆形像时,就是在重新检索原先那个视觉信号,并放大。在学习过程中,不断练习检索、放大信号,我们的学习能力就会越来越强。 写程序代码时,也要把尽量把每行代码形像化。 51单片机内中断源 8051有五个中断源,有两个优先级。与中断系统有关的特殊功能寄存器有IE(中断允许寄存器)、IP(中断优先级控制寄存器)、中断源控制寄存器(如TCON、SCON的有关位)。51单片机的中断系统结构如下图(注意,IF0应为TF0):

8052有6个中断源,它比8051多一个定时器/计数器T2中断源。 8051五个中断源分别是: (1)51单片机外部中断源 8051有两个外部中断源,分别是INT0和INT1,分别从P3.2和P3.3两个引脚引入中断请求信号,两个中断源的中断触发允许由TCON的低4位控制,TCON的高4位控制运行和溢出标志。 INT0也就是Interrupt 0。在这里应该看一下你的51单片机开发板的电路原理图。离开形像的记忆是没有意义的。读到上面这句,你应该回忆起原理图上的连接。任何记忆都转化为形像,这是学习的根本原理,我们通过学习单片机要学会这种学习方法,会让你一辈子受益无穷。 TCON的结构如下图: (a)定时器T0的运行控制位TR0

51单片机中断详解

一.中断的概念 1.中断发生 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理 2.中断响应和中断服务 CPU暂时中断当前的工作,转去处理事件B 3.中断返回 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A 这一过程称为中断 二.中断过程示意图 三.MCS51中断系统的结构

MCS51的中断系统有5个中断源(8052有6个),2个优先级,可实现二级中断嵌套 四.中断寄存器 单片机有10个寄存器主要与中断程序的书写控制有关 1.中断允许控制寄存器IE 2.定时器控制寄存器TCON 3.串口控制寄存器SCON 4.中断优先控制寄存器IP 5.定时器工作方式控制寄存器TMOD 6.定时器初值赋予寄存器(TH0/TH1,TL0/TL1) 五.部分寄存器详解

1.中断允许控制寄存器(IE) EX0:外部中断0允许位; ET0:定时/计数器T0中断允许位; EX1:外部中断1允许位; ET1:定时/计数器T1中断允许位; ES :串行口中断允许位; EA :CPU中断允许(总允许)位。 2.定时器/计数器控制寄存器控制寄存器(TCON) IT0:外部中断0触发方式控制位 当IT0=0时,为电平触发方式(低电平有效) 当IT0=1时,为边沿触发方式(下降沿有效) IE0:外部中断0中断请求标志位 IT1:外部中断1触发方式控制位 IE1:外部中断1中断请求标志位

TF0:定时/计数器T0溢出中断请求标志位 TF1:定时/计数器T1溢出中断请求标志位 3.串行口控制寄存器(SCON) RI:串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。 TI:串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。 4.中断优先级控制寄存器(IP) PX0:外部中断0优先级设定位 PT0:定时/计数器T0优先级设定位 PX1:外部中断0优先级设定位 PT1:定时/计数器T1优先级设定位

51单片机汇编语言教程:18课单片机中断系统

51单片机汇编语言教程:第18课-单片机中断系统

MCS-51单片机中断系统的结构: 5个中断源的符号、名称及产生的条件如下。 INT0:外部中断0,由P3.2端口线引入,低电平或下跳沿引起。 INT1:外部中断1,由P3.3端口线引入,低电平或下跳沿引起。 T0:定时器/计数器0中断,由T0计满回零引起。 T1:定时器/计数器l中断,由T1计满回零引起。 TI/RI:串行I/O中断,串行端口完成一帧字符发送/接收后引起。整个中断系统的结构框图见下图一所示。

<51单片机中断系统结构> 如图所示,由与中断有关的特殊功能寄存器、中断入口、次序查询逻辑电路等组成,包括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它们的自然优先级由高到低排列。写到这里,大家应当明白,为什么前面有一些程序一始我们这样写: ORG0000HLJMP START ORG0030H START:。 这样写的目的,就是为了让出中断源所占用的向量地址。当然,在程序中没用中断时,直接从0000H开始写程序,在原理上并没有错,但在实际工作中最好不这样做。优先级:单片机采用了自然优先级和人工设置高、低优先级的策略,即能由程序员设定那些中断是高优先级、

51单片机中断编程

第6章中断系统 在CPU与外设交换信息时,存在一个快速的CPU与慢速的外设间的矛盾。为解决这个问题,采用了中断技术。良好的中断系统能提高计算机实时处理的能力,实现CPU 与外设分时操作和自动处理故障,从而扩大了计算机的应用范围。 当CPU正在处理某项事务的时候,如果外界或内部发生了紧急事件,要求CPU暂停正在处理的工作转而去处理这个紧急事件,待处理完以后再回到原来被中断的地方,继续执行原来被中断了的程序,这样的过程称为中断。向CPU提出中断请求的源称为中断源。微型计算机一般允许有多个中断源。当几个中断源同时向CPU发出中断请求时,CPU应优先响应最需紧急处理的中断请求。为此,需要规定各个中断源的优先级,使CPU 在多个中断源同时发出中断请求时能找到优先级最高的中断源,响应它的中断请求。在优先级高的中断请求处理完了以后。再响应优先级低的中断请求。 当CPU正在处理一个优先级低的中断请求的时候,如果发生另一个优先级比它高的中断请求,CPU能暂停正在处理的中断源的处理程序,转去处理优先级高的中断.请求,待处理完以后,再回到原来正在处理的低级中断程序,这种高级中断源能中断低级中断源的中断处理称为中断嵌套。 MCS-51系列单片机允许有五个中断源,提供两个中断优先级(能实现二级中断嵌套)。每一个中断源的优先级的高低都可以通过编程来设定。中断源的中断请求是否能得到响应,受中断允许寄存器IE的控制;各个中断源的优先级可以由中断优先级寄存器IP 中的各位来确定;同一优先级中的各中断源同时请求中断时,由内部的查询逻辑来确定响应的次序。这些内容都将在本节中讨论。 6 . 1 中断请求源和中断请求标志 1、中断请求源 MCS-51中断系统可用图6-1来表示。五个中断源是: INT来自P3.2引脚上的外部中断请求(外中断0)。 ◆0 INT来自P3.3引脚上的外部中断请求(外中断1)。 ◆1 ◆T0 片内定时器/计数器0溢出(TF0)中断请求。 ◆T1片内定时器/计数器1溢出(TF1)中断请求。 ◆串行口片内串行口完成一帧发送或接收中断请求源TI或RI。 每一个中断源都对应有一个中断请求标志位,它们设置在特殊功能寄存器TCON和SCON中。当这些中断源请求中断时,分别由TCON和SCON中的相应位来锁存。

基于单片机AT89C51控制的中断控制流水灯课程设计报告

宁波技师学院 摘要 随着计算机技术的迅猛发展,计算机越来越广泛地应用于人们工作和生活的各个领域。作为计算机领域里的一个重要方面单片机及其应用技术近年来也得到了长足的发展。 单片机被广泛地应用在工业自动化控制、智能仪器仪表、数据采集、通讯以及家用电器等领域。单片机以其与通用微机完全不同的发展模式,不断满足工业测控、恶劣环境下可靠运行的要求。、单片机已成为现代工业领域中不可缺少的重要角色。 单片机技术的发展速度十分迅速,速度更快、功能更强的16位、32位单片机以及陆续问世,但8位机,特别是新一代高档8位机具有优异的性能,已能满足大部分单片机应用领域的需要,另外,它还具有可靠性高、外围芯片配套、系统结构简单、应用软件丰富、技术成熟、开发应用方便等优点,在单片机市场中依旧据有一定地位。

目录 一总体设计方案 (1) 1.1系统设计方案 (1) 1.2系统结构框图 (1) 二系统硬件设计 (2) 2.1晶振电路 (2) 2.2复位电路 (3) 2.3数码管电路 (4) 2.4LED指示电路与模式电路 (5) 三软件设计 (6) 3.1主程序流程图 (6) 3.2程序图 (7) 四制作与调试 (10) 五结论 (11) 六致谢 (12) 附录1系统实物图 (13) 2实验原理图 (13) 3系统仿真图 (14) 4 PCB原理图 (15)

一总体设计方案 1.1系统设计方案 流水灯系统主要由:复位电路、晶振电路、数码管显示电路、LED灯指示电路、速度与方式选择电路等部分电路组成。 各器件的选用: 1 单片机的选用: 单片机芯片选用A T89C51。 2数码管的选用: 数码管选用共阳极数码管。 3晶振的选用: 晶振选用的是12MHZ。 1.2系统结构框图 框图如图1.2-1。 图1..2-1系统结构框图

51单片机中断程序大全

void main(void) { // EA=1; // // ET0=1; // TMOD=0x10; // TH1=(65536-921)/256; // 开总中断 定时器T0中断允许使用定时器T1的模式1 定时器T1的高8位赋初值 //实例42 :用定时器TO查询方式P2 口8位控制LED闪烁 #include<> // 包含51 单片机寄存器定义的头文件 /************************************************************** 函数功能:主函数 void main(void) { // EA=1; // // ETO=1; // TMOD=OxO1; // 开总中断 定时器TO 中断允许使用定时器TO 的模式1 TH0=(65536-46083)/256; // 定时器TO的高8位赋初值 TL0=(65536-46083)%256; // 定时器TO的高8位赋初值 TR0=1; // 启动定时器T0 TF0=0; P2=0xff; while(1)// 无限循环等待查询{ while(TF0==0) TF0=0; P2=~P2; TH0=(65536-46083)/256; // 定时器T0的高8位赋初值 TL0=(65536-46083)%256; // 定时器T0的高8位赋初值 } } // 实例43:用定时器T1 查询方式控制单片机发出 #include<> // 包含51 单片机寄存器定义的头文件 sbit sou nd=P3^7; // 将sou nd 位定义为引脚 /************************************************************** 函数功能:主函数 **************************************************************/ 1KHz音频

51单片机中断系统详解(定时器、计数器)

51单片机中断系统 51单片机中断级别 中断源默认中断级别序号(C语言用) INT0---外部中断0 最高0 T0---定时器/计数器0中断第2 1 INT1---外部中断1 第3 2 T1----定时器/计数器1中断第4 3 TX/RX---串行口中断第5 4 T2---定时器/计数器2中断最低 5 中断允许寄存器IE 位序号DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 符号位EA ------- ET2 ES ET1 EX1 ET0 EX0 EA---全局中允许位。 EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。EA=0,关闭全部中断。 -------,无效位。 ET2---定时器/计数器2中断允许位。EA总中断开关,置1为开; ET2=1,打开T2中断。EX0为外部中断0(INT0)开关,…… ET2=0,关闭T2中断。ET0为定时器/计数器0(T0)开关,……ES---串行口中断允许位。EX1为外部中断1(INT1)开关,…… ES=1,打开串行口中断。ET1为定时器/计数器1(T1)开关,…… ES=0,关闭串行口中断。ES为串行口(TX/RX)中断开关,…… ET1---定时器/计数器1中断允许位。ET2为定时器/计数器2(T2)开关,…… ET1=1,打开T1中断。 ET1=0,关闭T1中断。 EX1---外部中断1中断允许位。 EX1=1,打开外部中断1中断。 EX1=0,关闭外部中断1中断。 ET0---定时器/计数器0中断允许位。 ET0=1,打开T0中断。 ET0=0,关闭T0中断。 EX0---外部中断0中断允许位。 EX0=1,打开外部中断0中断。 EX0=0,关闭外部中断0中断。 中断优先级寄存器IP 位序号DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 位地址--- --- --- PS PT1 PX1 PT0 PX0 -------,无效位。 PS---串行口中断优先级控制位。

相关主题