单片机中断_范文大全

单片机中断

【范文精选】单片机中断

【范文大全】单片机中断

【专家解析】单片机中断

【优秀范文】单片机中断

范文一:单片机中断 投稿:曹覝覞

一、中断的概念

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);

CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);

待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断

二、中断源

在51单片机中有5个中断源

中断号优先级中断源中断入口地址

0 1(最高)外部中断0 0003H

1 2 定时器0 000BH

2 3 外部中断1 0013H

3 4 定时器1 0018H

4 5 串口中断 0023H

三、中断寄存器

单片机有9个寄存器主要与中断程序的书写控制有关

1.中断允许控制寄存器IE

2.定时器控制寄存器TCON

3.串口控制寄存器SCON

4.中断优先控制寄存器IP

5.定时器工作方式控制寄存器TMOD

6.定时器初值赋予寄存器(TH0/TH1,TL0/TL1)

3、寄存器功能与赋值说明

注:在用到中断时,必须要开总中断EA,即EA=1。//开总中断

1.中断允许控制寄存器IE

EX0(EX1):外部中断允许控制位

EX0=1 外部中断0开关闭合 //开外部0中断

EX0=0 外部中断0开关断开

EX1=1 外部中断1开关闭合 //开外部1中断

EX1=0 外部中断1开关断开

ET0(ET1):定时中断允许控制位

ET0=1定时器中断0开关闭合//开定时器中断0

ET0=0 定时器中断0开关断开

ET1=1定时器中断1开关闭合//开定时器中断1

ET1=0 定时器中断1开关断开

ES: 串口中断允许控制位

ES=1 串口中断开关闭合 //开串口中断

ES=0 串口中断开关断开

2.定时器控制寄存器TCON //控制外部中断和定时器中断

外部中断:

IE0(IE1):外部中断请求标志位

当INT0(INT1)引脚出现有效的请求信号,此位由单片机自动置1,cpu开始响应,处理终端,而当入

范文二:单片机_4中断 投稿:黄軾軿

例子1.定时器中断

MCS-51单片机中断系统

第一节 概述

一、中断的概念

中断是指计算机暂时停止原程序的执行转而为外部设备服务,并在服务完以后自动返回原程序执行的过程。

一个资源(CPU)面对多项任务,但由于资源有限,因此就可能出现资源竞争的局面,即几项任务来争夺一个CPU。而中断技术就是解决资源竞争的有效方法,采用中断技术可以使多项任务共享一个资源,所以中断技术实质上就是一种资源共享技术。

二、引入中断技术的优点:

1)提高了CPU的工作效率,实现了CPU和外部设备的并行工作。

2)实现实时控制。所谓实时控制,就是要求计算机能及时地响应被控对象提出的分析、计算和控制等请求,使被控对象保持在最佳工作状态,以达到预定的控制效果。由于这些控制参数的请求都是随机发出的,而且要求单片机必须作出快速响应并及时处理,对此,只有靠中断技术才能实现。

3)便于突发故障(如硬件故障、运算错误、电源掉电、程序故障等)的及时发现,提高系统可靠性。

4)能使用户通过键盘发出请求,随时可以对运行中的计算机进行干预。

三、中断源

向CPU发出中断请求的来源称之为中断源。MCS- 51是一个多中断源的单片机,以80C51为例,共5个中断源,分别是外部中断2个,定时中断2个和串行中断1个。

1、外中断

外中断是由外部信号引起的,共有2个中断源,即外部中断0和外部中断1。中断请求信号分别由引脚INT0(P3.2)INT1(P3.3)引入。

外部中断请求有两种信号方式,即电平方式和脉冲方式。可通过设置有关控制位进行定义。

电平方式的中断请求是低电平有效。只要单片机在中断请求引入端上采样到有效的低电平时,就激活外部中断。

脉冲方式的中断请求则是脉冲的后沿负跳有效。CPU在两个相随机器周期对中断请求引入端进行的采样中,如前一次为高电平,后一次为低电平,即为有效中断请求。

2、定时中断

定时中断足为满足定时或计数的需要而设置的。当计数结构发生计数溢出时,即表明定时时间到或计数值已满,请求是在单片机芯片内部发生的,无需在芯片上设里引入端。

3、串行中断

串行中断是为串行数据传送的需要而设置的。每当串行口接收或发送完一组串行数据时,就产生一个中断请求。请求是在单片机芯片内部自动发生的,不需在芯片上设里引入端。

第二节 中断控制

一、定时器控制寄存器(TCON)

该寄存器用于保存外部中断请求以及定时器的计数溢出。寄存器的内容及位地址表示

如下:

1、IE0和IE1 外中断请求标志位

当CPU采样到INT0(INT1)端出现有效中断请求时,IE0(IE1)位由硬件置“1”。在中断响应完成后转向中断服务时,再由硬件自动清“0”。

2、IT0和IT1 外中断请求触发方式控制位

IT0(IT1)=1 脉冲触发方式,后沿负跳有效。

IT0(IT1)=0 电平触发方式,低电平有效。

由软件置“1”或清“0"。

3、TF0和TF1 计数溢出标志位

当计数器产生计数溢出时,相应的溢出标志位由硬件置“1”。当转向中断服务时,再由硬件自动清“0"。计数溢出标志位的使用有两种情况:

采用中断方式时,作中断请求标志位来使用;

采用查询方式时,作查询状态位来使用。

二、串行口控制寄存器(SCON)

寄存器的内容及位地址表示如下:

1、TI 串行口发送中断请求标志位

当发送完一帧串行数据后,由硬件置“1”;在转向中断服务程序后,用软件清“0”。

2、RI 串行口接收中断请求标志位

当接收完一帧串行数据后,由硬件置“1”;在转向中断服务程序后,用软件清“0”。 串行中断请求由TI和RI的逻辑或得到。就是说,无论是发送标志还是接收标志,都会产生串行中断请求。

三、中断允许控制寄存器(IE)

寄存器地址0A8H,位地址0AFH~0A8H。寄存器的内容及位地址表示如下:

1、EA中断允许总控制位

EA=0 中断总禁止,禁止所有中断。

EA=1 中断总允许,总允许后中断的禁止或允许由各中断源的中断允许控制位进行设里。

2、EX0(EX1)外部中断允许拉制位

EX0(EX1)=0 禁止外中断

EX0(EX1)=l 允许外中断

3、ET1和ET0 定时/计数中断允许控制位

ET0(ET1)=0 禁止定时(或计数)中断

ET0(ET1)=1 允许定时(或计数)中断

4、ES串行中断允许控制位

ES=0禁止串行中断

ES=1允许串行中断

四、中断优先级控制寄存器IP

IP寄存器地址0B8H,位地址为0BFH~0B8H。寄存器的内容及位地址表示如下:

PX0外部中断0优先级设定位;

PT0定时中断0优先级设定位,

PX1外部中断1优先级设定位;

PT1定时中断1优先级设定位;

PS串行中断优先级设定位。

为“0”的位优先级为低;为"1"的位优先级为高。

五、中断优先级控制原则和控制逻辑

MCS- 51具有两级优先级,具备两级中断服务嵌套的功能。其中断优先级的控制原则是:

·低优先级中断请求不能打断高优先级的中断服务;但高优先级中断请求可以打断低优先级的中断服务,从而实现中断嵌套。

·如果一个中断请求已被响应,则同级的其它中断服务将被禁止。即同级不能嵌套。 ·如果同级的多个中断请求同时出现,则按CPU查询次序确定那个中断请求被响应。其查询次序为:外部中断

0 1 串行中断。

六、中断初始化与中断控制寄存器状态设置

外中断初始化共有三项内容:中断总允许、外中断允许和中断方式设定。定时中断则只有两项内容,没有中断方式控制。

第三节 中断系统的结构

一、 MCS-51中断系统的响应过程

中断过程:

中断过程的三步曲:中断响应、执行中断服务程序及中断返回。图中的中断源,就是指能提出中断请求的计算机内部电路与外部设备。

下面分析一下中断过程中的技术细节。

1、 中断响应

中断响应的条件:

基本条件有:

·有中断源提出中断请求;

·中断总允许位EA=1,即CPU开放中断;

·申请中断的中断源的中断允许位为1,即没有被屏蔽。

MCS- 51的CPU在每个机器周期采样各中断请求标志位,如有置位,只要以上条件满足,且下列三种情况都不存在,那么,在下一周期CPU响应中断。否则,采样的结果被取消。这3种情况是:

·CPU正在处理同级或高级优先级的中断。

·现行的机器周期不是所执行指令的最后一个机器周期。

·正在执行的指令是RETI或访问IE、IP指令。CPU在执行RETI或访问IE、IP的指令后,至少需要再执行一条其他指令后才会响应中断请求。

MCS-51中断系统在中断响应时的技术措施为:

1)当前PC值送堆栈,也就是将CPU本来要取用的指令地址暂存到堆栈中保护起来,以便中断结束时,CPU能找到原来程序的断点处,继续执行下去。这一措施是中断系统自动保存完成。

2)保护现场时关闭中断,以防其他中断信号干扰。此时,中断系统关闭该中断源接收电路,其他中断请求均被禁止。这一措施需用指令完成

3)按中断源入口地址进人中断服务程序。

2、中断服务程序

在中断响应后,计算机调用的子程序称为中断服务程序。这是专门为外部设备或其他内部部件中断源服务的程序段,其结尾必须是中断返回指令RETI。

3、中断返回

计算机在中断响应时执行到RETI指令时,立即结束中断并从堆栈中自动取出在中断响应时压入的PC当前值,从而使CPU返回原程序中断点继续进行下去。

二、中断采样、中断查询

1、中断采样

采样就是CPU在每个机器周期对引脚INT0(P3.2)和INT1(P3.3)进行信号检测,根据采样结果设置TCON寄存器中相应的标志位,以便CPU在下一个机器周期检测这些中断标志位的状态,了解是否有外部中断申请,然后根据中断初始化情况决定是否响应。

对于T0、T1、串行口中断的中断请求,都发生在芯片内部,可以直接设置TCON寄存器和SCON寄存器中相应的标志位,无须采样。

1、 中断查询

CPU检测TCON寄存器和SCON寄存器中各标志位的状态,来决定有没有中断请求发生及是哪一个中断请求。

三、中断响应时间

定义:从检测到中断申请到转去执行中断服务程序所需的时间。

一般情况下中断响应时间在3-8个机器周期之间。

四、中断标志的清除方式

中断标志清除方式有三种情况:

1)定时器T0、T1及边沿触发方式的外部中断标志,TF0、TF1、IE0、IE1在中断响应后由硬件自动清除,无需采取其他措施。

2)电平触发方式的外部中断标志IE1、IE0不能自动清除,必须撤除/INT0或/INT1

的电平信号。

3)串行口中断标志TI、RI不能由硬件清除,需用指令清除,

内部程序存储器

80C51芯片内有4KROM存储单元,其地址为0000H~0FFFH。

0000H~0002H 系统的启动单元

中断向量号

0003H~000AH 外部中断0中断地址区 0

000BH~0012H 定时器/计数器0中断地址区 1

0013H~001AH 外部中断1中断地址区 2

001BH~0022H 定时器/计数器1中断地址区 3

0023H~002AH 串行中断地址区 4

中断响应后,系统能按中断种类,自动转到各中断区的首地址去执行程序。

由于各地址区容量有限,因此一般在第一个单元放置一条无条件转移指令以转移到程序实际存放位置。

在C语言程序中,通过中断向量号来识别是那个中断。

void Ex_int0() interrupt 0

void Timer0() interrupt 1

void Ex_int1() interrupt 2

void Timer1() interrupt 3

void UartINTSVC() interrupt 4

MCS-51的堆栈操作

堆栈是一种数据结构。数据写入堆栈称为入栈(PUSH)。数据从堆栈中读出称之出栈(POP)。

数据操作规则:“后进先出”LIFO。即先入栈的数据由于存放在栈的底部,因此后出栈;而后入栈的数据存放在栈的顶部,因此先出栈。

1、堆栈的功用

堆栈主要是为子程序调用和中断操作而设立的。其具体功能有两个:保护断点和保护现场。

2、堆栈的开辟

堆栈只能开辟在芯片的内部数据存储器中,即所谓的内堆栈形式。

3、堆栈指示器

堆栈指示器SP(Stack Pointer)的内容是堆栈栈顶的存储单元地址。SP是一个8位寄存器。

说明:系统复位后,SP的内容为07H,但由于堆栈最好在内部RAM的30H~7FH单元中开辟,所以在程序设计时应注意把SP值初始化为30H以后。

4、堆栈使用方式

堆栈的使用有两种方式。

自动方式:即在调用子程序或中断时,返回地址(断点)自动进栈。程序返回时,断点再自动弹回PC。

指令方式:即使用专用的堆栈操作指令,进行进出栈操作。其进栈指令为PUSH,出栈指令为POP。例如保护现场就是指令方式进行操作

范文三:单片机中断 投稿:李阁阂

STC90C51系列的中断系统

作者:超级鹏鹏

一.我们先来搞清楚有关90C51单片机的中断概况

1.什么叫中断?

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断

。这里是所有90C51的中断,依次是外部中断0,定时器0,外部中断1,定时器1,串口中断,定时器2,外部中断2,外部中断3。我们在这里先不一一讲述每种中断,用到哪种再讲哪种会更加清晰。

我们再来了解一下中断允许寄存器IE

EX0(IE.0),外部中断0允许位;

ET0(IE.1),定时/计数器T0中断允许位;

EX1(IE.2),外部中断0允许位;

ET1(IE.3),定时/计数器T1中断允许位;

ES(IE.4),串行口中断允许位;

ET2(IE.5),定时/计数器T2中断允许位;

EA(IE.7),CPU中断允许(总允许)位。

还有中断优先级寄存器IP.IPH

90C51单片机有四个中断优先级,即可实现四级中断服务嵌套。每个中断源的中断优先级由中断优先级寄存器IP和IPH中的相应位的状态来规定的。PX0(IP.0),外部中断0优先级设定位;

PT0(IP.1),定时/计数器T0优先级设定位;

PX1(IP.2),外部中断0优先级设定位;

PT1(IP.3),定时/计数器T1优先级设定位;

PS(IP.4),串行口优先级设定位;

PT2(IP.5),定时/计数器T2优先级设定位。

通过以上讲解,大家可能还是有许多不明白的地方,单片机的就是这样,只有通过实践才能把理论理解的更加深刻!!!

二.我们开始从最简单的编程开始理解中断,让我们先开始学习定时器中断吧

90C51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。我们一个个的介绍这两个寄存器。

首先是

TMOD

我们再来介绍一下

TCON

TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。

TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。

TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。

TR0(TCON.4):T0运行控制位,其功能与TR1类同。

IE1(TCON.3):外部中断1请求标志。

当IT1=0时,为电平触发方式,每个机器周期的S5P2采样INT1引脚时,若INT1引脚为低电平,则置1,否则清0。

当IT1=1时,INT1为跳变沿触发,当第一个机器周期采样到INT1为低电平时,则IE1置1。IE=1,表示外部中断1正在向CPU申请中断。当CPU响应中断,转向中断服务程序时,该位由硬件清0。

IT1(TCON.2):外部中断触发方式选择位。

IT1=0,为电平触发方式,引脚INT1上低电平有效。

IT1=1,为跳变沿触发方式,引脚INT1上的电平从高到低的负跳变有效。IE0,IT0与同上述。

接下来还有很重要的一点就是如何设置计数初值!!!我们的板子上的晶振频率是11.0592MHZ,所以我们可以计算得机器周期是12/11.0592MHZ≈1.09µs,所以当我们要t=50ms,那么N=50000/1.09≈45872,再利用方式1的计算公式X=65536-N,所以等于19664,转换成16进制是4CD0,把4C放入TH0,把D0放入TL0,就大功告成了,或者利用下面的公式:THX=(65536-N)/256,TLX=(65536-N)%256

因此我们可以总结一下定时器中断初始化的几个步骤:

1.对TMOD赋值,以确定T0和T1的工作方式。

2.计算初值,并将其写入TH0、TL0或TH1、TL1。

3.中断方式时,则对IE赋值,开放中断。

4.使TR0或TR1置位,启动定时/计数器定时或计数。

我们通过以下实例来讲解定时器的用法:

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharnum=0;

sbitled=P0^0;//申明led

/*******************************************************************名称:Time0_Init()

作用:定时器0初始化

********************************************************************/voidTime0_Init()

{

TMOD=0x01;

TH0

TL0=(65536-45872)/256;=(65536-45872)%256;

//开总中断

//开定时器0中断

//启动定时器0//让定时器0工作在方式1//定时值50ms,还可以写成TH0=4C;TL0=D0;EA=1;ET0=1;TR0=1;

}

voidTime0_Int()interrupt1//中断服务程序记得这里用的是定时器0,所以就要写成interrupt1,1是T0的序号

{

TH0

TL0=(65536-45872)/256;=(65536-45872)%256;

//长度加1//重装初值num++;

}

/*******************************************************************/名称:main()

作用:使得led一亮一灭,间隔1s

********************************************************************/voidmain()

{

Time0_Init();

led=0;

while(1)

{

if(num==20)

20*50ms之后led取反状态,即每隔一秒亮一次

{//num相当于累加器,//初始化

num=0;

led=~led;

}

}

}

三.后记

通过这个例子相信大家已经明白了关于定时器中断的一些内涵,关于定时器中断的程序编写,我想可以分为三个板块:

1.对定时器的初始化,这是很关键的一步。

2.对于中断服务程序的编写,要弄清楚interrupt之后要跟数字几,接着还要重装初值。

3.Main函数的编写。

还有一个很需要注意的问题,就是在中断服务程序程序里不要写太多的语句,因为当语句过繁,程序代码还未执行完,下一次中断又来临,就会丢失中断,所以能在main函数里完成的功能就不要在中断函数中写,非要写的话,一定要高效简洁。

大家可能对于定时器中断还有其他中断有一种意犹未尽的感觉,不要心急,随着我们接下来的学习,这些会让你们应接不暇的!!

超级鹏鹏

于2012.2.7写于姥姥家

范文四:51单片机中断号 投稿:江涫涬

若51单片机使用C语言编程,51单片机中断号的排列顺序是按中断向量地址由低到高来排列中断号,不是按中断查询的优先级或者中断服务顺序的优先级来排列中断号的。

本内容简单介绍了C51单片机的中断号以及中断向量,方便大家了解和学习

关键词:中断向量C51单片机

一、中断号

二、interrupt 和 using 在C51中断中的使用

8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级

;128

字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务处理程序。中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。8051的中断向量表如下:

C51单片机的中断号以及中断向量

C51单片机的中断号以及中断向量

一、中断号

外部中断0 0

定时器T0 1

外部中断1 2

定时器T1 3

串口中断 4

二、interrupt 和 using 在C51中断中的使用

8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务处理程序。中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。8051的中断向量表如下:

中断源 中断向量 上电复位 0000H 外部中断0 0003H 定时器0 溢出 000BH 外部中断1 0013H 定时器1 溢出 001BH 串行口中断 0023H 定时器2 溢出 002BH

51单片机定时器中断号 电梯直达

发表于 2013-11-10 23:37:34 | 只看该作者

有用的中断号知识

void表示函数类型

interrupt 0 ←这里的0表示中断源编号

using 1 ←这里的1表示选用的寄存器组别

在MCS-51单片机中,单片机类型不同,中断源个数也有差别.例如8051有5

个中断源,8052有6个中断源.现以8051为例

中断源 中断服务入口地址 中断标志

外部中断INT0 0003H IE0

定时器T0 000BH TF0

外部中断INT1 0013H IE1 | |

定时器T1 001BH TF1 串行口TI/RI 00023H TI/RI 中断优先级别从上到下依次降低 interrupt 表示中断优先级,using表示所用工作寄存器组。 interrupt x using y 跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1 4 串行中断 其它的根据相应得单片机有自己的含义,实际上c在编译的时候就是把你这个函数的入口地址放到这个对应中断的跳转地址 using y 这个y是说这个中断函数使用的那个寄存器组就是51里面一般有4个 r0 -- r7寄存器,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会弹出来,节省代码和时间 void intsvr0(void) interrupt 0 using 1 定时/计数器T0 void timer0(void) interrupt 1 using 1 外部中断INT1 void intsvr1(void) interrupt 2 using 1 定时/计数器T1 void timer1(void) interrupt 3 using 1 串口中断 void serial0(void) interrupt4 using 1

范文五:8051单片机的5个中断源 投稿:丁祇祈

当几个中断源同时向CPU请求中断时,按所发生的实时事件的轻重缓急排队,优先处理最紧急事件的中断请求,于是单片机规定每个中断源的优先级别。

当CPU正在处理一个中断请求,又发生另一个优先级比它高的中断请求,CPU暂时中止对前一中断处理,转而去处理优先级更高的中断请求,待处理完后,再继续执行原来的中断处理程序,这样的过程称为中断嵌套,这样的中断系统称为多级中断系统。 由于外界异步事件中断CPU正在执行的程序时随机的,CPU转向去执行中断服务程序时,除了硬件会自动把断电地址,即16位PC程序计数器的值压入堆栈之外,用户还得注意保护有关工作寄存器,累加器,标志位等信息,这个过程通常称为保护现场 。以便在完成中断服务程序后,恢复原工作寄存器,累加器,标志位等的内容,这个过程称恢复现场;最后执行中断返回指令,自动弹出断电到PC,返回主程序,继续执行被中断的程序。

下面我们看看8051中断系统结构及中断控制:

8051单片机有五个中断请求源,四个用于中断控制的寄存器IE.IP.TCON和SCON,用于控制中断的类型,中断允许,中断起停和各种中断源的优先级别。

五个中断源有两个优先级,每个中断源可以编程为高优先级或低优先级中断,可以实现二级中断服务程序嵌套。8051的中断源包括:

INT0,INT1引脚输入的外部中断源

三个内部的中断源,即定时器T0的溢出中断源,定时器T1的溢出中断源和串行口的发送/接收中断源。关于内部中断源我们以后再讲,今天我们先学习外部中断源。

从INT0,INT1引脚输入的两个外部中断源和它们的触发方式控制位锁存在特殊功能寄存器TCON的低四位,其格式如下:

IE1,即TCON.3:

外部中断INT1请求标志位。当CPU检测到在INT1引脚上出现的外部中断信号时,由硬件置位IE1=1,请求中断。CPU执行中断服务程序后,IE1位被硬件自动清0.

IT1,即TCON.2:

外部中断INT1请求类型,触发方式控制位,由软件来置1或清0,以控制外部中断1的触发类型。

IT1=0,外部中断1被设置为电平触发方式,当引脚INT1输入低电平时,置位IE1,申请中断。CPU在每个机器周期的S5P2期间采样INT1的输入电平,当采样到低电平时,置IE1=1。采用电平触发方式时,输入到引脚INT1的外部中断源必须保持电平有效,直到该直到程序被CPU响应。同时,在该中断服务程序执行完之前,外部中断源有效电平必须被撤销,否则将产生,另一次中断。

IT1=1,外部中断1被设置为边缘触发方式,CPU在每个机器周期采样引脚INT1的电平。如果相继的两次采样中,一个周期采样到引脚INT1为高电平,接着下一个周期采样到引脚INT1为低电平,INE1由硬件自动清0.因为每个机器周期采样一次外部中断输入电平,外部中断源输入的高电平和低电平时间必须保持12个振荡周期以上,才能保证CPU检测到负跳变信号,即下降沿。

IEO,即TCON.1:外部中断请求标志位。IE0=1时,外部中断0向CPU请求中断,当CPU响应外部中断后,IE0由硬件清0。

ITO,即TCON.0:外部中断0触发方式控制位。IT0=0,外部中断0被设置为边沿触发方式。IT0=1时,外部中断0被设置为边电平发方式。其功能和IT1类似。

中断控制:除特殊功能寄存器TCON和SCON中某些位与中断有关外,还有两个特殊功能寄存器IE和IP专门用于中断控制。

中断允许IE:

8051单片机中,特殊功能寄存器IE位中断允许寄存器,控制CPU对中断源总的允许或禁止以及每个中断源是否允许中断。其格式为:

EA:中断总允许位。EA=1,CPU允许中断;EA=0,CPU禁止所有的中断请求。

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

EX1:T0溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断。

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

8051系统复位后,IE中各位均被清0,即禁止所有中断。

中断优先级设定寄存器IP。8051单片机具有两个中断优先级,每个中断源可编程为高优先级中断或低优先级中断,并可实现二级中断嵌套。高优先级中断源可中断正在执行的低优先级中断服务程序;

同级或低优先级的中断源不能中断正在执行的中断程序。为此,在8051中断系统中,内部有两个优先级状态触发器,它们分别指示出CPU是否在执行高优先级或低优先级中断服务程序,从而分别屏蔽所有的中断申请和同一级的其他中断源申请。

特殊功能寄存器IP为中断优先级寄存器。

各中断源优先级的控制位,用户可用软件设定。其格式如下

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

PT1:T1中断优先控制位。PT1=1,设定定时器T1为高优先级中断;PT=0,为低优先级。

TX1:外部中断1中断优先级别控制位。PX1=1设定外部中断1为高优先级中断;PC1=0,为低优先级。 PT1:T1中断优先控制位。PT1=1,设定定时器T1为高优先级中断;PT1=0,为低优先级。

PT0:T0中断优先控制位。PT1=1,设定定时器T0为高优先级中断;PT0=0,为低优先级。

PX0:外部中断中断优先控制位。PX0=1,设定INT1为高优先级。PX0=0,为低优先级。

8051复位后,IP低五位全部清0,将所有中断源设置为低优级中断。

如果几个同优先级的中断源同时向CPU申请中断,哪一个申请得到服务,取决于它们在CPU内部动登记排队的序号。CPU通过内部硬件查询登记号,按自然优先级决定优先响应哪个中断请求。自然优先级按从高到低的顺序依次为:外中断0,定时器0,外中断1,定时器1,串行中断。

范文六:单片机中断系统 投稿:田穧穨

单片机中断系统

概念:引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。

80C51的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套(就是可以在嵌套过程中再次响应嵌套) 。

中断源1、INT0(P3.2),外部中断1。可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。

2、INT1(P3.3),外部中断2。可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。

3、TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。

4、TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。

5、RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。

中断请求标志1、TCON的中断标志

IT0(TCON.0):外部中断0触发方式控制位。

当IT0=0时:为电平触发方式。

当IT0=1时:为边沿触发方式(下降沿有效)。

IE0(TCON.1):外部中断0中断请求标志位。

IT1(TCON.2):外部中断1触发方式控制位。

IE1(TCON.3):外部中断1中断请求标志位。

TF0(TCON.5):定时/计数器T0溢出中断请求标志位。

TF1(TCON.7):定时/计数器T1溢出中断请求标志位。

2、SCON的中断标志

RI(SCON.0),串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。同样,RI必须由软件清除。

TI(SCON.1),串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI

必须由软件清除。

80C51中断的控制

中断允许控制

CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。

EX0(IE.0):外部中断0允许位;

ET0(IE.1):定时/计数器T0中断允许位;

EX1(IE.2):外部中断0允许位;

ET1(IE.3):定时/计数器T1中断允许位;

ES(IE.4):串行口中断允许位;

EA (IE.7): CPU中断允许(总允许)位。

中断优先级控制

80C51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的 。

PX0(IP.0),外部中断0优先级设定位;

PT0(IP.1),定时/计数器T0优先级设定位;

PX1(IP.2),外部中断0优先级设定位;

PT1(IP.3),定时/计数器T1优先级设定位;

PS? (IP.4),串行口优先级设定位;

PT2(IP.5),定时/计数器T2优先级设定位。

中断优先级规则:

CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。

正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。

正在进行的低优先级中断服务,能被高优先级中断请求所中断。

中断系统总结:TCON和SCON是中断请求,以及控制外部中断的有效方式。IE控制是否允许CPU响应中断,是否允许响应某一个中断。IP控制中断的优先级。

范文七:单片机的中断系统 投稿:许爩爪

项目五 中断系统的应用

任务一 认识MCS-51单片机的中断系统

中断系统是单片机中非常重要的组成部分,它是为了使单片机能够对外部或内部随机发生的事件实时处理而设置的。中断功能的存在,在很大程度上提高了单片机实时处理能力,它也是单片机最重要的功能之一,是我们学习单片机必须掌握的重要内容。我们不但要了解单片机中断系统的资源配置情况,还要掌握通过相关的特殊功能寄存器打开和关闭中断源、设定中断优先级,掌握中断服务程序的编写方法。

一、中断的概念

为了弄懂中断的概念,下面我们先来了解一下单片机与外设之间数据的输入/输出方式。 1.单片机的输入/输出方式

CPU与外设之间的信息交换称为输入/输出。在一个单片机系统中,输入/输出是必不可少的,CPU与外设之间以何种方式进行信息交换,将直接影响到信息交换的可靠性和CPU的效率。

例如:在一个与打印机相连的微机系统中,CPU将需要打印的数据输出给打印机,打印机接收到数据后便可进行打印。CPU是如何将要打印的数据输出给打印机的呢?如果打印机总是处于准备好的状态或者CPU总是知道打印机的状态,那么CPU无需查询打印机状态可直接进行输出,这种方式称为无条件传送方式。但外设的执行速度一般是很慢的,像打印机这样的外设不可能总处于准备好的状态,因此CPU在输出数据前需要先查询打印机是否空闲,若空闲则进行输出操作,若打印机处于忙状态则继续查询,直到打印机处于空闲状态再进行输出。这种方式称为查询传送方式。与无条件传送方式相比,虽然查询传送方式能有效地与慢速外设进行信息交换,提高了信息交换的可靠性,解决了外设与CPU速度不匹配的矛盾,但由于在外设未准备好的情况下,CPU需要不断的查询外设状态,不能进行其他操作,这样就浪费了CPU的资源,使CPU的利用率大大降低。为了提高CPU的工作效率,可将外设的“忙/闲”状态信息作为请求触发信号,这样,CPU就可以做自己的工作,当打印机处理完上一批数据后处于空闲状态时,向CPU提出中断请求信号,CPU接到中断请求时,就暂停当前正在进行的工作转去为打印机输出数据,输出一批数据后又返回到刚才中断的地方继续进行原来的工作,这种方式称为中断传送方式。

综上所述,CPU与外设之间信息交换有三种方式,其执行过程如图5-1所示。

(a)无条件传送方式

(b)查询传送方式

图5-1 输入/输出方式示意图

(c)中断传送方式 (c)中断传送方式

(1)无条件传送方式 这种方式的特点是:数据的传送取决于程序执行输入/输出指令,而与外设的状态无关。它适合于与CPU同步的快速设备或状态已知的外设,软、硬件系统简单。

(2)查询传送方式 查询方式是一种条件传送。在传送数据前,首先读取外设状态信息,并加以测试判断,若外设“准备就绪”,则CPU与外设进行数据交换,若外设处于“忙”状态,则CPU不与外设交换数据,并继续查询外设状态。其特点是:在硬件上不仅要考虑数据信息的传递,而且还要考虑状态信息的输入;在查询过程中CPU的利用率不高,适用于实时性能要求不高的场合。

(3)中断传送方式 中断方式也是一种条件传送。CPU可以与外设同时工作,并执行与外设无关的操作,一旦外设需要进行数据交换,就主动向CPU提出中断申请,CPU接到中断请求后,就暂停当前的工作转去为外设服务(执行中断处理程序),处理完毕后又返回到原来暂停处继续进行原来的工作(执行原来的程序)。因此,CPU不必浪费时间去查询外设状态,大大提高了效率。利用中断方式可以实现分时操作(使CPU可以同时处理多件事)、实时处理(对随时发生的事件进行及时处理),应用范围较广。

2.中断的概念

为了能让大家更容易理解中断的概念,我们先来看生活中的一个事例:你正在家中看书,突然门铃响了,你放下书去开门,处理完事情后回来继续看书;突然电话铃又响起来了,你又放下书去接电话,通话完毕后你又回来继续看书。这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。

对于单片机来讲,中断是指CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理(中断发生);CPU接到中断请求后,暂停当前正在进行的工作(中断响应),转去处理事件B(执行相应的中断服务程序),待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。

中断的有关关概念总结如下:

 中断 CPU正在执行主程序的过程中,由于CPU之外的某种原因,有必要暂停主程序的执行,转而去执行相应的处理(中断服务)程序。待处理程序结束之后,再返回原程序断点处继续运行的过程。

 中断源 可以引起中断的事件称为中断源。单片机中也有一些可以引起中断的事件。MCS-51单片机中共有5种中断源:两个外部中断(INT0、INT1)、两个定时/计数器中断(T0、T1)和一个串行口中断。

 中断系统 实现中断过程的软、硬件系统。

 主程序与中断服务程序 CPU正在执行的当前程序称为主程序;中断发生后,转去对突发事件的处理程序称为中断服务程序。

 中断优先级 当多个中断源同时申请中断时,为了使CPU能够按照用户的规定先处理最紧急的事件,然后再处理其他事件,就需要中断系统设置优先级机制。通过设置优先级,排在前面的中断源称为高级中断,排在后面的称为低级中断。设置优先级以后,若有多个中断源同时发出中断请求时,CPU会优先响应优先级较高的中断源。如果优先级相同,则将按照它们的自然优先级顺序响应默认优先级较高的中断源。

五个中断源默认的自然优先级是由硬件的查询顺序决定的,由高到低的顺序依次是:外部中断0、定时/计数器0中断、外部中断1、定时/计数器1中断、串行口中断。中断源的优先级需由用户在中断优先级寄存器IP中设定,后面将会讲到这一知识点。

 中断嵌套 当CPU响应某一中断源请求而进入该中断服务程序中处理时,若更高级别的中断源发出中断申请,则CPU暂停执行当前的中断服务程序,转去响应优先级更高的中断,等到更高级别的中断处理完毕后,再返回低级中断服务程序,继续原先的处理,这个过

程称为中断嵌套。在51单片机的中断系统中,高优先级中断能够打断低优先级中断以形成中断嵌套,反之,低级中断则不能打断高级中断,同级中断也不能相互打断。

二、MCS-51单片机的中断系统

MCS-51单片机的中断系统的内部结构框图如图5-2所示。

图5-2 MCS-51单片机的中断系统内部结构组成框图

由图可知,51单片机的中断系统有5个中断源,4个用于中断控制的寄存器TCON、SCON、IE、IP来控制中断类型、中断的开关和各种中断源的优先级确定。

1.中断源(5个)

(1)外部中断源(2个)

外部中断0和外部中断1,是由单片机的P3.2和P3.3端口引入的,名称分别为INT0和INT1,低电平或下降沿触发。

(2)定时/计数器中断源(2个)

MCS-51单片机内部有2个16位的定时/计数器,分别是T0和T1。当计数器计满溢出时就会向CPU发出中断请求。

(3)串行口中断源(1个)

MCS-51单片机内部有1个全双工的串行通信接口,可以和外部设备进行串行通信,当串行口接收或发送完一帧数据后会向CPU发出中断请求。

2.中断标志

TCON即定时/计数器控制寄存器,这是一个可位寻址的8位特殊功能寄存器,即可以对其每一位单独进行操作,其字节地址为88H。它不仅与两个定时/计数器的中断有关,也与两个外部中断源有关。它可以用来控制定时/计数器的启动与停止,标志定时/计数器是否计满溢出和中断情况,还可以设定两个外部中断的触发方式、标志外部中断请求是否触发。因此,它又称为中断请求标志寄存器。单片机复位时,TCON的全部位均被清0。其各位名称如表5-1所示。

表5-1 定时/计数器控制寄存器TCON的各位功能说明

TCON寄存器的各位功能介绍如下:

IT0:外部中断0(INT0)的触发方式控制位。当IT0=0时,INT0为电平触发方式,低电平触发有效;当IT0=1时,INT0为边沿触发方式,下降沿触发有效。

IE0:外部中断0(INT0)的中断请求标志位。当外部中断0(INT0)的触发请求有效时,硬件电路自动将该位置1,否则清0。换句话说,当IE0=1时,表明外部中断0正在向CPU申请中断;当IE0=0时,则表明外部中断0没有向CPU申请中断。当CPU响应该中断后,由硬件自动将该位清0,不需用专门的语句将该位清0。

IT1:外部中断1(INT1)的触发方式控制位。当IT1=0时,INT1为电平触发方式,低电平触发有效;当IT1=1时,INT1为边沿触发方式,下降沿触发有效。

IE1:外部中断1(INT1)的中断请求标志位。当外部中断1(INT1)的触发请求有效时,硬件电路自动将该位置1,否则清0。换句话说,当IE1=1时,表明外部中断1正在向CPU申请中断;当IE1=0时,则表明外部中断1没有向CPU申请中断。当CPU响应该中断后,由硬件自动将该位清0,不需用专门的语句将该位清0。

TR0:定时/计数器0(T0)的启动控制位。当TR0=1时,T0启动计数;当TR0=0时,T0停止计数;

TF0:定时/计数器0(T0)的溢出中断标志位。当定时/计数器0计满溢出时,由硬件自动将TF0置1,并向CPU发出中断请求,当CPU响应该中断进入中断服务程序后,由硬件自动将该位清0,不需用专门的语句将该位清0。需要说明的是:如果使用定时/计数器的中断功能,则该位完全不用人为操作,硬件电路会自动将该位置1、清0,但是如果中断被屏蔽,使用软件查询方式去处理该位时,则需用专门语句将该位清0。

TR1:定时/计数器1(T1)的启动控制位。其功能及使用方法同TR0。 TF1:定时/计数器1(T1)的溢出中断标志位。其功能及使用方法同TF0。 3.中断允计寄存器IE

在MCS-51单片机的中断系统中,中断的允许或禁止是在中断允许寄存器IE中设置的。IE也是一个可位寻址的8位特殊功能寄存器,即可以对其每一位单独进行操作,当然也可以进行整体字节操作,其字节地址为A8H。单片机复位时,IE全部被清0。其各位定义如表5-2所示。

表5-2 中断允许寄存器IE的各位功能定义

中断允许寄存器IE的各位功能定义说明如下:

EA:即Enable All的缩写,全局中断允许控制位。当EA=0时,则所有中断均被禁止;当EA=1时,全局中断允许打开,在此条件下,由各个中断源的中断控制位确定相应的中断允许或禁止。换言之,EA就是各种中断源的总开关。

EX0:外部中断0(INT0)的中断允许位。如果EX0置1,则允许外部中断0中断,否则禁止外部中断0中断。

ET0:定时/计数器0的中断允许位。如果ET0置1,则允许定时/计数器0中断,否则禁止定时/计数器0中断。

EX1:外部中断1(INT1)的中断允许位。如果EX1置1,则允许外部中断1中断,否则禁止外部中断1中断。

ET1:定时/计数器1的中断允许位。如果ET1置1,则允许定时/计数器1中断,否则禁止定时/计数器1中断。

例如:如果我们要设置允许外部中断0、定时/计数器1中断允许,其他中断不允许,则IE寄存器各位取值如表5-3所示。

表5-3 IE寄存器的各位取值

即IE=0x89。当然,我们也可以用位操作指令来实现:EA=1,EX0=1,ET1=1。 4.中断优先级寄存器IP

前面已讲到中断源优先级的概念。在MCS-51单片机的中断系统中,中断源按优先级分为两级中断:1级中断即高级中断,0

级中断即低级中断。中断源的优先级需在中断优先级寄存器IP中设置。IP也是一个可位寻址的8位特殊功能寄存器,即可以对其每一位单独进行操作,当然也可以进行整体字节操作,其字节地址为B8H。单片机复位时,IP全部被清0,即所有中断源为同级中断。如果在程序中不对中断优先级寄存器IP进行任何人为操作,则当多个中断源发出中断请求时,CPU会按照其默认的自然优先级顺序优先响应自然优先级较高的中断源。IP的各位定义如表5-4所示。

表5-4 中断优先级寄存器IP的各位功能定义

PX0、PT0、PX1、PT1、PS分别为外部中断0、定时/计数器0中断、外部中断1、定时/计数器1中断、串行口中断的优先级控制位。当某位置1时,则相应的中断就是高级中断,否则就是低级中断。优先级相同的中断源同时提出中断请求时,CPU优先响应自然优先级较高的中断。

5.中断初始化及中断服务程序结构

中断初始化实质上就是对4个与中断有关的特殊功能寄存器TCON、SCON、IE和IP进行管理和控制,具体实施如下:

① CPU的开、关中断(即全局中断允许控制位的打开与关闭,EA=1或EA=0); ② 具体中断源中断请求的允许和禁止(屏蔽); ③ 各中断源优先级别的控制; ④ 外部中断请求触发方式的设定。

中断管理和控制(中断初始化)程序一般都包含在主函数中,也可单独写成一个初始化函数,根据需要通常只需几条赋值语句即可完成。中断服务程序是一种具有特定功能的独立程序段,往往写成一个独立函数,函数内容可根据中断源的要求进行编写。

C51的中断服务程序(函数)的格式如下:

void 中断处理程序函数名( ) interrupt 中断序号 using 工作寄存器组编号 {

中断处理程序内容 }

中断处理程序函数不会返回任何值,故其函数类型为void,函数类型名void后紧跟中断处理程序的函数名,函数名可以任意起,只要合乎C51中对标识符的规定即可;中断处理函数不带任何参数,所以中断函数名后面的括号内为空;interrupt即“中断”的意思,是为区别于普通自定义函数而设,中断序号是编译器识别不同中断源的唯一符号,它对应着汇编语言程序中的中断服务程序入口地址,因此在写中断函数时一定要把中断序号写准确,否则中断程序将得不到运行。函数头最后的“using 工作寄存器组编号”是指这个中断函数使用单片机RAM中4组工作寄存器中的哪一组,如果不加设定,C51编译器在对程序编译时会自动分配工作寄存器组,因此“using 工作寄存器组编号”通常可以省略不写。

51单片机的5个中断源的中断序号、默认优先级别、对应的中断服务程序的入口地址如表5-5所示:

表5-5 51单片机的中断源的中断序号、默认优先级及对应的中断服务程序入口地址

任务二 防盗报警器的制作

一、任务分析

二、硬件电路设计

三、程序设计

任务三 8路抢答器的制作

一、任务分析

二、硬件电路设计

三、程序设计

项目拓展

知识巩固

范文八:51单片机中断 投稿:魏芤芥

Yybmec

51 单片机中断系统

51 单片机中断级别

中断源 INIT0---外部中断 0 T0---定时器/计数器 0 中断 INIT1---外部中断 1 T1----定时器/计数器 1 中断 TI/RI---串行口中断 T2---定时器/计数器 2 中断 默认中断级别 最高 第2 第3 第4 第5 最低 中断序号(C 语言用) 0 1 2 3 4 5

中断允许寄存器 IE

位序号 符号位 DB7 EA DB6 ------DB5 ET2 DB4 ES DB3 ET1 DB2 EX1 DB1 ET0 DB0 EX0

EA---全局中允许位。 全局中允许位。 全局中允许位 EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。 EA=0,关闭全部中断。 -------,无效位。

ET2---定时器 计数器 2 中断允许位。 定时器/计数器 中断允许位。 定时器

ET2=1,打开 T2 中断。 ET2=0,关闭 T2 中断。 ES---串行口中断允许位。 串行口中断允许位。 串行口中断允许位 ES=1,打开串行口中断。 ES=0,关闭串行口中断。 ET1---定时器 计数器 1 中断允许位。 定时器/计数器 中断允许位。 定时器 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 PS DB3 PT1 DB2 PX1 DB1 PT0 DB0 PX0

-------,无效位。 PS---串行口中断优先级控制位。 串行口中断优先级控制位。 串行口中断优先级控制位

1

Yybmec

PS=1,串行口中断定义为高优先级中断。 PS=0,串行口中断定义为低优先级中断。 PT1---定时器 计数器 1 中断优先级控制位。 定时器/计数器 中断优先级控制位。 定时器 PT1=1,定时器/计数器 1 中断定义为高优先级中断。 PT1=0,定时器/计数器 1 中断定义为低优先级中断。 PX1---外部中断 1 中断优先级控制位。 外部中断 中断优先级控制位。 PX1=1,外部中断 1 中断定义为高优先级中断。 PX1=0,外部中断 1 中断定义为低优先级中断。 PT0---定时器 计数器 0 中断优先级控制位。 定时器/计数器 中断优先级控制位。 定时器 PT0=1,定时器/计数器 0 中断定义为高优先级中断。 PT0=0,定时器/计数器 0 中断定义为低优先级中断。 PX0---外部中断 0 中断优先级控制位。 外部中断 中断优先级控制位。 PX0=1,外部中断 0 中断定义为高优先级中断。 PX0=0,外部中断 0 中断定义为低优先级中断。

定时器/计数器工作模式寄存器 TMOD

位序号 位符号 DB7 GATE DB6 C/T\ DB5 M1 DB4 M0 DB3 GATE DB2 C/T\ DB1 M1 DB0 M0

|

-----------------定时器 1------------------------|--------------------定时器 0----------------------| GATE---门控制位。 门控制位。 门控制位 GATE=0,定时器/计数器启动与停止仅受 TCON 寄存器中 TRX(X=0,1)来控制。 GATE=1,定时器计数器启动与停止由 TCON 寄存器中 TRX(X=0,1)和外部中断引脚(INT0 或 INT1)上的电平状态来共同控制。 C/T\---定时器和计数器模式选择位。 定时器和计数器模式选择位。 定时器和计数器模式选择位 C/T\=1,为计数器模式;C/T\=0,为定时器模式。 M1M0---工作模式选择位。 工作模式选择位。 工作模式选择位

M1 0 0 1 1 位序号 符号位 M0 0 1 0 1 DB7 TF1 工作模式 方式 0,为 13 位定时器/计数器 方式 1,为 16 位定时器/计数器 方式 2,8 位初值自动重装的 8 位定时器/计数器 方式 3,仅适用于 T0,分成两个 8 位计数器,T1 停止工作 DB6 TR1 DB5 TF0 DB4 TR0 DB3 IE1 DB2 IT1 DB1 IE0 DB0 IT0

定时器/控制器控制寄存器 定时器 控制器控制寄存器 TCON

TF1---定时器 1 溢出标志位。 定时器 溢出标志位。 当定时器 1 记满溢出时,由硬件使 TF1 置 1,并且申请中断。进入中断服务程序后,由硬件 自动清 0。需要注意的是,如果使用定时器中断,那么该位完全不用人为去操作,但是如果 使用软件查询方式的话,当查询到该位置 1 后,就需要用软件清 0。 TR1---定时器 1 运行控制位。 定时器 运行控制位。 由软件清 0 关闭定时器 1。当 GATE=1,且 INIT 为高电平时,TR1 置 1 启动定时器 1;当 GATE=0 时,TR1 置 1 启动定时器 1。 TF0---定时器 0 溢出标志,其功能及其操作方法同 TF1。 定时器 溢出标志, 。 TR0---定时器 0 运行控制位,其功能及操作方法同 TR1。 定时器 运行控制位, 。 IE1---外部中断 1 请求标志。 外部中断 请求标志。

2

Yybmec

当 IT1=0 时, 位电平触发方式, 每个机器周期的 S5P2 采样 INT1 引脚, NIT1 脚为定电平, 若 则置 1,否则 IE1 清 0。 当 IT1=1 时,INT1 为跳变沿触发方式,当第一个及其机器周期采样到 INIT1 为低电平时, 则 IE1 置 1。IE1=1,表示外部中断 1 正向 CPU 中断申请。当 CPU 响应中断,转向中断服 务程序时,该位由硬件清 0。 IT1 外部中断 1 触发方式选择位。 触发方式选择位。 IT1=0,为电平触发方式,引脚 INT1 上低电平有效。 IT1=1,为跳变沿触发方式,引脚 INT1 上的电平从高到低的负跳变有效。 IE0---外部中断 0 请求标志,其功能及操作方法同 IE1。 外部中断 请求标志, 。 IT0---外部中断 0 触发方式选择位,其功能及操作方法同 IT1。 外部中断 触发方式选择位, 。 从上面的知识点可知, 每个定时器都有 4 种工作模式, 可通过设置 TMOD 寄存器中的 M1M0 位来进行工作方式选择。 方

式 1 的计数位数是 16 位,对 T0 来说,由 TL0 寄存器作为低 8、TH0 寄存器作为高 8 位, 组成了 16 位加 1 计数器。 关于如何确定定时器 T0 的初值问题。 定时器一但启动, 它便在原来的数值上开始加 1 计数, 若在程序开始时, 我们没有设置 TH0 和 TL0, 它们的默认值都是 0, 假设时钟频率为 12MHz, 12 个时钟周期为一个机器周期,那么此时机器周期为 1us,记满 TH0 和 TL0 就需要 216 -1 个数,再来一个脉冲计数器溢出,随即向 CPU 申请中断。因此溢出一次共需 65536us,约等 于 65.6ms,如果我们要定时 50ms 的话,那么就需要先给 TH0 和 TL0 装一个初值,在这个 初值的基础上记 50000 个数后,定时器溢出,此时刚好就是 50ms 中断一次,当需要定时 1s 时,我们写程序时当产生 20 次 50ms 的定时器中断后便认为是 1s,这样便可精确控制定时 时间啦。 要计 50000 个数时, TH0 和 TL0 中应该装入的总数是 65536-50000=15536., 15536 把 对 256 求模:15536/256=60 装入 TH0 中,把 15536 对 256 求余:15536/256=176 装入 TL0 中。 以上就是定时器初值的计算法,总结后得出如下结论:当用定时器的方式 1 时,设机器周期 为 TCY,定时器产生一次中断的时间为 t,那么需要计数的个数为 N=t/TCY ,装入 THX 和 TLX 中的数分别为: THX=(65536-N)/256 , TLX=(65536-N)%256 中断服务程序的写法 void 函数名()interrupt 中断号 using 工作组 { 中断服务程序内容 } 在写单片机的定时器程序时, 在程序开始处需要对定时器及中断寄存器做初始化设置, 通常 定时器初始化过程如下: (1)对 TMOD 赋值,以确定 T0 和 T1 的工作方式。 (2)计算初值,并将初值写入 TH0、TL0 或 TH1、TL1。 (3)中断方式时,则对 IE 赋值,开放中断。 (4)使 TR0 和 TR1 置位,启动定时器/计数器定时或计数。 例:利用定时器 0 工作方式 1,实现一个发光管以 1s 亮灭闪烁。 程序代码如下: #include #define uchar unsigned char #define uint unsigned int

3

Yybmec

sbit led1=P1^0; uchar num; void main() { TMOD=0x01; //设置定时器 0 位工作模式 1(M1,M0 位 0,1) TH0=(65536-45872)/256; //装初值 11.0592M 晶振定时 50ms 数为 45872 TL0=(65536-45872)%256; //开总中断 EA=1; ET0=1; //开定时器 0 中断 TR0=1; //启动定时器 0 while(1) { if(num==20) //如果到了 20 次,说明 1 秒时间 { led1=~led1; //让发光管状态取反 num=0; } } } void T0_time()interrupt 1 { TH0=(65536-45872)/256; //重新装载初值 TL0=(65536-45872)%256; num++; }

4

范文九:单片机中断程序 投稿:夏籺类

单片机中断程序

单片机中断程序

|2009-07-05 11:32_woodpecker| 分类:编程语言| 浏览6268次

求高人帮我分析下这段C程序

小弟刚学单片机,对于中断定时器了解不是很好

#include // 头文件

#define uchar unsigned char

uchar deda=0; // 5mS计数单元清零

uchar sec=0; // 秒单元清零

void init_timer(); // 声明定时函数

void sc(); // 声明输出函数

//--------------------------------------------------- 主函数 ----------------------------------------------

main()

{

init_timer(); // 调用定时函数

while(1) // 无限循环

{

sc ( ) ; // 调用输出函数

}

}

//--------------------------------------------------- 定时函数 ---------------------------------------------

void init_timer()

{

TMOD=0x01; // 设置定时器T0工作模式1

TH0=-(4800/256); // 加载高字节计数初值

TL0=-(4800%256); // 加载低字节计数初值

IE=0x82; // 启用定时器T0中断产生

TR0=1; // 启动定时器T0开始计时

}

//---------------------------------------------- 中断服务函数 --------------------------------------------

void T0_srv(void) interrupt 1

{

TH0=-(4800/256); // 重置定时器计时初始值

TL0=-(4800%256);

deda++; // 计数单元deda 值递增

}

//------------------------------------------------- 输出模块 -----------------------------------------------

void sc ( )

{

if(deda>=200){sec++;deda=0;} // 中断200次秒加1,deda清0

if(sec==30){P1_0=~P1_0;sec=0;} // 满30次后,反相输出1次,清0

}

程序的大致意思是采用中断的方法来产生一个精确的时间

可我不太熟悉计数器定时器,希望能给我说的通俗点哦

谢谢啦

| 2009-07-05 11:47 提问者采纳

一般而言,计时器的值是一个字,也就是双字节,最大值是65535. 计数器在每一个周期增加1.这个周期和芯片的晶振有关,你查一下单片机的及晶振资料就知道是多少了。假设一个周期是2微妙。那么每隔2微妙计数器增加1.如果你设置计数器的初始值是55535,那么第一个周期过后,也就是2微妙后计数器的值变为55536.当过10000个周期后,计数器的值从55535增加到65535,再增加一个数,计数器就会产生中断。这时时间过了10000*2微秒,也就是20毫秒。那么你就产生了一个精确的时间20毫秒。循环50次就是20微秒*50=1秒。

 提问者评价 谢谢两位的回答,“计数器在每一个周期增加1”让我明白了

评论(3)|赞同25

黑客之源|六级采纳率21%

擅长:暂未定制

按默认排序|按时间排序

其他1条回答

|2009-07-05 17:11sxp1982|六级

看样子,程序不是你的,呵呵

结构很规矩,这个程序。

先跟你讲中断吧,一般情况,运行完死循环前面的程序(,你这里就是

init_timer(); // 应该叫初始化定时器,比价合适,让定时器安尼的要求工作 )

接下来就是死循环了。主要任务一般在这里处理。中断,就是在处理一些特殊任务,比如按键,定时处理的程序,外部一个不知道什么时间发生的任务,通信任务等等。你在主循环的时候,无论在什么时候,中断请求来了(可以理解为需要处理比较紧急任务,优先处理),就会停止主循环,进入对应中断服务程序。运行完,在回主循环的终端地方,继续死循环。

定时器中断,就是每过一定时间,运行一下中断服务程序。常用来计时和产生脉冲信号

评论(1)|赞同6

其他类似问题

 2010-02-03单片机定时中断程序5 2013-05-11单片机中断程序1 2012-06-18关于单片机中断程序 2011-02-28急求单片机外部中断程序31

 2010-06-26单片机中断程序15

更多关于单片机中断程序的问题>>

单片机的相关知识

 2009-04-2951单片机时钟程序设计33 2008-09-25单片机秒表程序设计32 2010-05-05单片机程序设计9 2010-12-16单片机程序设计 循环彩灯4

 2010-07-07单片机程序设计指针问题3

更多关于单片机:程序设计的问题>>

 2009-09-17单片机的中断系统是什么?13 2007-05-2351单片机中断系统的组成:9

 2011-08-03单片机中断系统工作原理2 2013-05-1451单片机中断系统问题1

 2013-02-2351单片机 中断系统1

更多关于单片机:中断系统的问题>>

 2011-01-19求51单片机C程序一:要求通过按键输入控制8个流水灯的顺流、逆流、...24 2010-12-17求 单片机计算器C程序4 2013-08-01单片机c程序中的问题 2012-12-02单片机 c程序问题

 2011-05-19单片机C程序求助!

更多关于单片机:c程序的问题>>

 2011-10-28单片机流水灯程序43 2011-05-05单片机流水灯程序 1616 2009-12-11急求单片机流水灯程序6 2009-03-2451单片机流水灯程序纠错5

 2011-04-08新手提问单片机流水灯程序18

更多关于单片机:流水灯程序的问题>>

等待您来回答

 2回答不知这种植物叫什么啊? 1回答小米2S手机系统是安卓版的还是MIUI版?为什么它不能安装 Google Chr... 2回答小米1S被盗了怎么办? 0回答360手机助手为什么总是连接不上小米2a? 0回答我新建的网络共享,为什么朋友的苹果都能连接上去,我的小米2S连搜... 2回答10植物大战僵尸2下载地址 0回答大家好,请问这上面的英文是什么字体,麻烦大家了,谢谢。 1回答手机磨砂套如何看出坏点~要撕下保护膜吗

没有感兴趣的问题?试试更多等待您来回答的问题>>

分享到:

推广链接单片机程序解密 100%成功 不成功不收费

单片机程序解密 上海超扬专业,精通单片机程序解密,BOM单制作, 单片机程序解密,快速..www.chaoyangdz.com.cn

单片机程序解密 100%成功,强大的技术团队鼎力合作

深圳微芯光电科技专业单片机程序解密,单片机程序解密,电子产品克隆复制,BOM制作,生..www.pcbcbpcbcb.com

单片机单片机报名网![专科以上学历]

汇文单片机就业培训课程热招中,100%就业.学员就业薪资平均4550元,年薪8-15万.汇文名..www.huiwen.com/

查看文档来源:http://zhidao.baidu.com/question/104802795.html

范文十:单片机中断51单片机中断应用(全) 投稿:熊莇莈

单片机中断:51单片机中断应用(全)

疯狂代码 http://CrazyCoder.cn/ ĵ:http:/CrazyCoder.cn/NetworkProgramming/Article25409.html

/*****一直想把51的中断做一个总结,总是没有什么时间或被什么事给中断,现在终于弄好了^_^*****/ /*******最近一直做32位的,8位的都快忘记得差不多了,写在这里也好想用的时候有个地方查*******/ /************************************************************

*51单片机各中断初始化及子程序模板,几乎包括了传统51单片机的全部中断

*1、外部中断0

*2、定时器中断0

*3、外部中断1

*4、定时器中断1

*5、串行中断

*6、定时器中断2---本中断在52时才有

*在使用定时中断的时候需要根据实际需要重设定时器的初值和工作方式

*在串行通讯中,使用11.0592M晶振,通讯波特率为9600bps

*为了保证文件的单一和方便保存,本项目只用了一个文件,

*************************************************************/

#include/*如果是使用51单片机,则应该是reg51.h,且不能使用定时器2*/

#include/*以下两个包含文件在本代码中实际不需要,但经常用到,所以列出*/

#include

typedef unsigned char uchar;

typedef unsigned int uint;

#define TimeDelay 2

/*程序所用变量声明*/

bit Time0Int;

bit Int0Flag,Int1Flag;

uchar Time0Count,Time1Count,Time2Count;

uchar ReceiveData;

/*程序所用函数声明*/

void McuInitial(void);

void InitialTime0(void);

void InitialTime1(void);

void InitialTime2(void);

void IntialSerialComm(void);

void SerialSend(uchar SendData);

void delay(uint n);

/************************************************************

*Function: 主函数

*************************************************************/

void main(void)

{

uchar i;

McuInitial();

delay(TimeDelay);

while(1)

{

if(Int0Flag==1)/*各中断的具体处理*/

{

Int0Flag = 0;

}

if(Int1Flag==1)

{

Int1Flag = 0;

}

if(Time0Count==5)

{

Time0Count = 0;

}

if(Time1Count==5)

{

Time1Count = 0;

}

if(Time2Count==5)

{

Time2Count = 0;

}

SerialSend(i++);

if(i>=0xff)

i=0;

}

}

/************************************************************

*Function: 单片机初始化处理

*************************************************************/

void McuInitial(void)

{

/*外部中断0初始化*/

IT0 = 1;

EX0 = 1;

/*外部中断1初始化*/

IT1 = 1;

EX1 = 1;

InitialTime0();/*定时器0初始化*/

//InitialTime1();/*定时器1初始化*/

InitialTime2();/*定时器2初始化*/

IntialSerialComm();/*串行中断初始化,占用定时器1,如果用串行中断,定时器1不能用于定时*/

EA = 1;/*打开中断*/

}

/************************************************************

*Function: 定时器0初始化

*************************************************************/

void InitialTime0 (void)

{

TMOD |= 0x01;//16位定时器

TH0 = 0x06;//8ms

TL0 = 0xed;

ET0 = 1;//使能中断

TR0 = 1;//打开定时器

}

/************************************************************ *Function: 定时器1初始化

*************************************************************/ void InitialTime1 (void)

{

TMOD |= 0x10;//16位定时器

TH1 = 0x06;//8ms

TL1 = 0xed;

ET1 = 1;//使能中断

TR1 = 1;//打开定时器

}

/************************************************************ *Function: 定时器2初始化,本中断仅在52时才有

*************************************************************/ void InitialTime2 (void)

{

T2CON=0x04;

RCAP2H=0x04;

RCAP2L=0x00;

ET2 = 1;

}

/************************************************************ *Function: 串行中断初始化

*************************************************************/ void IntialSerialComm(void)

{

TMOD |= 0x20;

SCON=0xf0;

TH1=0xfd;//fd

TL1=0xfd;//fd

TR1=1;

ES=1;

}

/************************************************************ *Function: 外部中断0中断服务子程序

*************************************************************/ void Interrupt0 (void) interrupt 0

{

Int0Flag = 1;

}

/************************************************************ *Function: 外部中断1中断服务子程序

*************************************************************/ void Interrupt1 (void) interrupt 2

{

Int1Flag = 1;

}

/************************************************************ *Function: 定时器0中断服务子程序

*************************************************************/ void InterruptTime0(void) interrupt 1

{

TH0 = 0x06;//8ms

TL0 = 0xed;

Time0Count++;

}

/************************************************************ *Function: 定时器1中断服务子程序

*************************************************************/ void InterruptTime1(void) interrupt 3

{

TH1 = 0x06;//8ms

TL1 = 0xed;

Time1Count++;

}

/************************************************************ *Function: 定时器2中断服务子程序

*************************************************************/ void InterruptTime2(void) interrupt 5

{

TF2=0;

Time2Count++;

}

/************************************************************ *Function: 串行接收中断服务子程序

*************************************************************/ void InterruptSerialComm(void) interrupt 4

{

if(RI)

{

RI = 0;

ReceiveData = SBUF;

}

}

/************************************************************ *Function: 串行发送程序

*************************************************************/ void SerialSend(uchar SendData)

{

SBUF = SendData;

while(TI==0);

TI = 0;

}

/************************************************************ *Function: 延时

*************************************************************/ void delay(uint n)

{

while((n--)!=0);

} 2008-11-30 18:08:00

疯狂代码 http://CrazyCoder.cn/

字典词典自主招生范文自主招生范文【范文精选】自主招生范文【专家解析】形容不善辞令形容不善辞令【范文精选】形容不善辞令【专家解析】两学一做党课结束语两学一做党课结束语【范文精选】两学一做党课结束语【专家解析】