外部中断详解

外部中断详解
外部中断详解

7.1EXTI外部按键中断实验

前面我们学习了,LED灯和按键。实际上对于STM32来说,我们是学习了它的外设GPIO。这一节我们前面学习的内容,学习STM32的EXTI (External interrupt),即外部中断。

前面的按键章节中,我们检测按键是否被按下的方式是轮询检测的方式,这里我们改为使用中断检测的方式,提高CPU的效率。

7.1.1什么是中断

单片机中断系统的概念:什么是中断,我们从一个生活中的例程引入。比如说你在做A 事,但是突然间来了你想起来了更重要的B事,所以你马上去做B事了,做完之后再回来继续做A事,这个就是中断。

7.1.2什么是单片机的中断?

当CPU正在执行一个任务,但突然又发生了一个更高级的任务,CPU必须立即去执行的任务,所以CPU必须中断当前的任务,并保存该任务已经执行的状态和相关信息,然后转而去执行那个更加高级的任务,因此就引入了“中断”这个概念。

中断是指计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回现行程序的间断处,继续执行原程序。中断是单片机实时地处理内部或外部事件的一种内部机制。当某种内部或外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断的程序处,继续执行下去。

在程序里面也是一样的。举个例子可能会容易懂点,定时中断:比如你定时1ms,主程序在运行,每当1ms时间到后,就跑到定时中断子程序里面执行,执行完后再回到主程序(中断程序是1ms中断一次)。那对于整个系统来说中断能实现什么好处呢?下面我们给以说明:1)提高了CPU的效率

CPU是计算机的指挥中心,它与外围设备(如按键、显示器等)通讯的方法有查询和中断2种:查询的方法是无论外围IO是否需要服务,CPU每隔一段时间都要依次查询一遍,这种方法CPU需要花费一些时间在做查询服务工作。

中断则是在外围设备需要通讯服务时主动告诉CPU,这个时候CPU才停下当前工作去处理中断程序,不需要占用CPU主动去查询的时间,CPU可以在没有中断请求来临之前一直做自己的工作,从而提高了CPU效率。

2)可以实现实时处理

外设任何时刻都可能发出请求中断信号,CPU接到请求后及时处理,以满足实时系统的需要。

3)可以及时处理故障

计算机系统运行过程中难免会出现故障,有许多事情是无法预料的,如电源掉电、存储器出错、外围设备工作不正常等,这时可以通过中断系统向中断源CPU发送中断请求,由CPU及时转到相应的出错处理程序,从而提高计算机的可靠性。

7.1.3STM32中断的初步理解

神舟III号开发板的主芯片是STM32F103ZET6,它采用的是ARM公司的Cortex-M3内核。Cortex-M3内核支持256个中断,具有256级的可编程中断设置。但STM32并没有使用M3

内核的全部东西,而是只用了它的一部分。STM32只有84个中断(16个内核+68个外部),具有16级可编程的中断优先级。

Cortex-M3内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常(exception)和中断(interrupt),并把它们用一个表管理起来,这个表就称为中断向量表。而STM32对中断向量表重新进行了编排,把编号从-3至6的中断向量定义为系统异常,编号为负的内核异常不能被设置优先级,如复位(Reset)、不可屏蔽中断 (NMI)、硬错误(Hardfault)。从编号7开始的为外部中断,这些中断的优先级都是可以自行设置的。

STM32的部分中断向量表如下图,详细内容请参考ST公司提供的参考手册相关中断的章节。

图 中断向量表

STM32F103ZET6的芯片属于大容量的产品。虽然都是STM32的芯片,但是不同类型的产品中断向量表是有区别的。ST公司的参考手册中针对不同类型的产品,提供有不同的中断向量表。实际应用的时候我们可以从启动文件startup_stm32f10x_hd.s中查找,在启动文件中,已经有相应芯片可用的全部中断向量。我们编写代码的时候,在写中断服务函数时,可以从启动文件中定义的中断向量表查找中断服务函数名。

7.1.4STM32中断的初始化过程以及手册的查询

关于中断的更加深入的理解查阅手册之后,ST明确给出需要查看另外的几个文档

这两个手册都在光盘资料里可以找到,《STM32F10XXX参考手册》中主要介绍的是关于中断的屏蔽,哪根中断线进行上升沿或者下降沿触发等,如下手册目录截图:

.这里没有涉及到优先级的设定,优先级的设定具体细节在另外一个手册中就是

《STM32F10xxx Cortex-M3编程手册》,如下手册目录截图:

最后第三个手册是《CM3技术参考手册》主要是介绍理论上的,介绍整个NVIC的编程器模型,有兴趣的可以详细去研究一下:

这么用户手册,那么外部中断初始化的一般要经过那些步骤呢?请见下面:

1)初始化IO口为输入。

2)开启IO口复用时钟,设置IO口与中断线的映射关系。

3)初始化线上中断,设置触发条件等(需参考《STM32F10XXX参考手册》)4)配置中断分组(NVIC),并使能中断(需参考《STM32F10xxx Cortex-M3编程手册》)

5)编写中断服务函数。

通过以上几个步骤的设置,我们就可以正常使用外部中断了,关于IO口初始化中断之后,唯一复杂的就只剩下中断分组的优先级了,这个优先级原本在51单片机中是比较简单的,但在M3中就被设计得比较复杂一些,优先级无非就是这些任务按先后顺序进行切换,那么我们接来下做一些详细的分析:

7.1.5NVIC中断控制器

中断的数量到达一定的数量,控制起来变得麻烦,因此Cortex-M3给我们提供了NVIC (Nested Vectored Interrupt Controller),即向量中断控制器。ST提供的参考手册中,并没有关于NVIC 的描述。STM32的NVIC描述在手册《STM32F10xxx的Cortex-M3编程手册.pdf》中,特别是对相关寄存器的说明。

STM32采用Cortex-M3内核。但是STM32并没有使用Cortex-M3内核全部的东西,因此它的NVIC是Cortex-M3内核NVIC的子集。

图 NVIC在内核中的位置

我们对NVIC(向量中断控制器)进行操作的时候,一般要调用两个函数,中断分组函数NVIC_PriorityGroupConfig( )和初始化函数NVIC_Init( )。我们先看一下,这两个函数怎么使用,然后再对重要的概念进行分析。

中断分组函数NVIC_PriorityGroupConfig( ),对于该函数只有一个参数,ST给我们提供了5个可用的参数,我们只需要直接调用即可。NVIC初始化函数NVIC_Init() ,它有一个参数。它的参数是一个NVIC_InitTypeDef 类型的结构体。这个结构体参数一般由我们进行设定。

我们看一下该结构体的成员:

NVIC_IRQChannel 需要配置的中断向量

NVIC_IRQChannelCmd 使能或关闭相应中断向量的中断响应

NVIC_IRQChannelPreemptionPriority配置中断向量抢先优先级

NVIC_IRQChannelSubPriority 配置中断向量的响应优先级

首先要用NVIC_IRQChannel参数来选择将要配置的中断向量,用NVIC_IRQChannelCmd 参数来进行使能(ENABLE)或关闭(DISABLE)该中断。这两个比较好理解。就是STM32的中断那么多,你要确认使用的是那一个,然后使能一下。

NVIC_IRQChannelPreemptionPriority成员配置中断向量的抢先优先级,在NVIC_IRQChannelSubPriority配置中断向量的响应优先级。这两个优先级也是蛮好理解的。中断可以停下CPU当前正在执行的任务,转去执行其它的任务。当一个系统中,有许多的中断时。大家都是中断,一个中断正在运行时,另一个中断发生,后一个中断是否能够将前一个中断停止,从而去执行其它的任务?当多个中断同时发送时,要先执行那个,后执行那个?这个就是优先级要解决的问题。优先级的作用就是制定“规则”。优先级只有在有多个中断的时候,才有意义。一个系统中,只有一个中断的话,优先级就没有什么意义了。

下面我们详细分析一下,中断分组和中断优先级。

● 抢先优先级和响应优先级

STM32的中断具有两个属性,一个为抢先属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。

抢先,是指打断其它中断的属性,即因为具有这个属性,会出现嵌套中断(在执行中断服务函数A的过程中被中断B打断,执行完中断服务函数B再继续执行中断服务函数A),抢先属性由NVIC_IRQChannelPreemptionPriority的参数配置。

而响应属性则应用在抢先属性相同的情况下,当两个中断向量的抢先优先级相同时,如果两个中断同时到达,则先处理响应优先级高的中断,响应属性由

NVIC_IRQChannelSubPriority的参数配置。

例如,现在有三个中断向量:

中断向量抢先优先级响应优先级

A 0 0

B 1 0

C 1 1

若内核正在执行C的中断服务函数,则它能被抢先优先级更高的中断A打断,由于B 和C的抢先优先级相同,所以C不能被B打断。但如果B和C中断是同时到达的,内核就会首先响应响应优先级别更高的B中断。

●NVIC的优先级组

在配置优先级的时候,还有一个优先级分组。这个分组,对前面我们提到的抢先优先级和响应优先级进行分组。就是说,一个中断系统中,有多少个抢先优先级,多少个响应优先级,可以由用户自行设定。

实际上,中断分组是由STM32的寄存器AIRC中PRIGROUP的值设定。寄存器AIRC 在ST官方提供的参考手册中并没有提到,而是在《STM32F10xxx的Cortex-M3编程手册.pdf》手册中。在底层的寄存器配置中,中断分组由4个位来决定。2^4=16,那么NVIC可以配置16种中断向量的优先级。对于这4bit的中断优先级控制位还分成2组。第一组是定义抢先

式优先级的位,第二组是定义子优先级的位。4bit的分组组合可以有以下5种形式:组别 4个bit的分配优先级状况

第0组 0:4 无抢先式优先级,16个子优先级

第1组 1:3 2个抢先式优先级,8个子优先级

第2组 2:2 4个抢先式优先级,4个子优先级

第3组 3:1 8个抢先式优先级,2个子优先级

第4组 4:0 16个抢先式优先级,无子优先级

第0组中,4个bit都用来配置抢先优先级,即NVIC配置的2^4 =16种中断向量都是只有抢先属性,没有响应属性。

第1组:最高1位用来配置抢先优先级,低3位用来配置响应优先级。表示有2^1=2种级别的抢先优先级(0级,1级),有2^3=8种响应优先级,即在16种中断向量之中,有8种中断,其抢先优先级都为0级,而它们的响应优先级分别为0~7,其余8种中断向量的抢先优先级则都为1级,响应优先级别分别为0~7。

依此类推,第4组中,所有4位用来配置响应优先级。即16种中断向量具有都不相同的响应优先级。

这5种中断分组ST官方已经给我们定义好,使用的时候非常的简单。我们在调用库函数NVIC_PriorityGroupConfig()的时候,可输入ST公司给我们定义好的参数:

NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4。

于是,有读者觉得疑惑了,STM32有几十个中断,NVIC只能配置16种中断向量,这怎么 够用?注意这里是16种,而不是16个。两个中断向量可以是同样的中断种类。

同时这里我们引入“中断通道”这个概念。比如一个STM2 单片机的所有I/O管脚可以配置为下降沿中断,上升沿中断和上升下降沿中断这三种模式。定时器(比如TIME2)本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢)、输入捕获、输出匹配、DMA申请等。所有TIME2的中断事件都是通过一个TIME2的中断通道向STM32内核提出中断申请。

外围设备通常具备若干个可以引起中断的中断源或中断事件。而该设备的所有的中断都只能通过该指定的“中断通道”向内核申请中断。当该中断通道的优先级确定后,也就确定了该外围设备的中断优先级,并且该设备所能产生的所有类型的中断,都享有相同的通道中断优先级。至于该设备本身产生的多个中断的执行顺序,则取决于用户的中断服务程序。

7.1.6EXTI外部中断

STM32F103ZET一共有7组GPIO,每组GPIO口都有16个管脚,分别是PA[15:0]、PB[15:0]、PC[15:0]、PD[15:0] 、PE[15:0] 、PF[15:0] 、PG[15:0]。STM32的所有GPIO管脚都可以作为中断输入源,但是如果每个GPIO都是一个独立的中断源,则需要112个中断源,这是不科学的,所以通过复用的方式使其对处理器来说来自GPIO的一共有16个中断Px[15:0]。具体实现是PA[0]、PB[0]、PC[0]、PD[0] 和PE[0]共享一个GPIO中断;PA[1]、PB[1]、PC[1]、PD[1] 和PE[1]共享一个GPIO中断;……PA[15]、PB[15]、PC[15]、PD[15] 和PE[15]共享一个GPIO 中断,如下图所示:

PAx~PGx端口的中断事件都连接到了EXTIx,即同一时刻EXTx只能相应一个端口的事件触发,不能够同一时间响应所有GPIO端口的事件,但可以分时复用。它可以配置为上升沿触发,下降沿触发或双边沿触发。EXTI 最普通的应用就是接上一个按键,设置为下降

沿触发,用中断来检测按键。

7.1.7硬件设计

神舟III号STM32开发板总共有4个功能按键,分别是WAKEUP按键和TAMPER按键及两个用于自定义功能按键,在不使用第二功能的情况下,这四个按键都可以作为通用的按键,由用户自定义其功能。这四个按键分别与PD3、PA8、PC13和PA0四个GPIO管脚连接,当按键按下时,对应的GPIO管脚为低电平,反之,当没有按键按下时,对应的GPIO管脚为高电平。其中PA0 (STM32的WKUP引脚)可以作为WK_UP功能,它除了可以用作普通输入按键外,还可以用作STM32的唤醒输入。PC13可以实现备份区寄存器的入侵功能。本实验中所有的按键均作为普通IO使用。

图表 1 按键输入电路

GPIO管脚与按键对应关系

按键按键对应的GPIO

USER1 PA8

USER2 PD3

KEY3/TAMPER PC13

KEY4/WAKEUP PA0

本实验需要使用的GPIO管脚与对应的LED灯关系如下:

LED灯 LED灯对应的GPIO

DS1 PF6

DS2 PF7

DS3 PF8

DS4 PF9

7.1.8软件设计

我们在目录Project文件夹下增加了exti.c和exti.h文件。在工程中User组下添加exti.c文件和stm32f10x_it.c文件。同时在组StdPeriph_DrIIIer中,添加stm32f10x_exti.c文件和misc.c 文件。如下图:

我们从main.c主函数开始分析。

主程序中,首先调用函数LED_Init()初始化板载的LED灯。函数SZ_STM32_KEYInit()初始化板载的按键。然后调用函数NVIC_GroupConfig()和函数EXTIX_Init()对按键中断进行配置。最后进入while循环。当没有按键中断发生的时候,板载的4个LED灯,呈流水灯的现象。按键中断发生时,执行相应的中断服务函数。而后再回过头来,执行流水灯的程序。

LED灯和按键,这两部分我们前面已经讲过,这里就不重复。这里我们主要分析关于中断的内容。

代码分析1:函数NVIC_GroupConfig() ,优先级分组。

本实验中我们将,2比特表示主优先级,主优先级合法取值为0、1、2、3共4个等级。2比特表示次优先级,次优先级合法取值为0、1、2、3。数值越低优先级越高。

代码分析2:函数void EXTIX_Init( ),外部中断配置,中断优先级配置。

代码中,首先定义了EXTI_InitTypeDef型的结构体EXTI_InitStructure,和

NVIC_InitTypeDef型的结构体NVIC_InitStructure。这两个结构体在后边我们会用到。这是C语言的知识。

● 使用代码RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)开启AFIO 的时钟。AFIO (alternate-function I/O),指GPIO端口的复用功能,GPIO除了用作普通的GPIO输入输出功能外,还可以作为片上外设的管脚。比如在STM32F103ZET 芯片中,PA9和PA10可以作为普通的GPIO管脚,但是它两通过复用可以用做串口的数据发送接收引脚。

当GPIO管脚用做EXTI外部中断时,必须打开AFIO时钟。

● EXTI的初始化配置。

使用代码GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource4),把GPIOC 的Pin4设置为EXTI的输入线。

给EXTI_InitStructure结构体赋值,该结构体有4个成员。

EXTI_InitStructure.EXTI_Line = EXTI_Line3; //中断线

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

给EXTI_Line成员赋值。选择EXTI_Line3线进行配置,因为按键的PD3连接到了

EXTI_Line3。

给EXTI_Mode成员赋值。把EXTI_Line3的模式设置为为中断模式

EXTI_Mode_Interrupt。这个结构体成员也可以赋值为事件模式EXTI_Mode_Event ,这个模式不会立刻触发中断,而只是在寄存器上把相应的事件标置位置1,应用这个模式要不停地查询相应的寄存器。

给EXTI_Trigger成员赋值。把中断触发方式(EXTI_Trigger)设置为下降沿触发

(EXTI_Trigger_Falling)。

给EXTI_LineCmd成员赋值。把EXTI_LineCmd设置为使能。 最后调用EXTI_Init()把EXTI初始化结构体的参数写入寄存器。

● NVIC中断优先级配置。

NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能外部中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure);

给NVIC_IRQChannel成员赋值。选择EXTI3_IRQn线进行配置,因为按键的PD3使用的是外部通道EXTI3_IRQn。

给NVIC_IRQChannelPreemptionPriority成员赋值。这里是设置抢先优先级。

给NVIC_IRQChannelSubPriority成员赋值。这里是设置响应优先级。

给NVIC_IRQChannelCmd成员赋值。设置为ENABLE,使能外部中断通道。调用函数

NVIC_Init()把NVIC初始化结构体的参数写入寄存器。

代码分析3:中断服务函数。

在这个EXTI设置中我们把PD3连接到内部的EXTI3,GPIO配置为上拉输入,工作在下降沿中断。在外围电路上我们将PD3接到了key1上。当按键没有按下时,PD3始终为高,当按键按下时PD3变为低,从而PD3 上产生一个下降沿跳变,EXTI3会捕捉到这一跳变,并产生相应的中断,对应到的中断函数为EXTI3_IRQn(),可以在stm32f10x_it.c中找到这个对应的函数。

中断服务函数的名称是不能随意定义的,必须与启动文件startup_stm32f10x_hd.s中的中断向量表定义一致。

●这里需要说明一下,STM32的IO口外部中断函数只有6个,分别为:

EXPORT EXTI0_IRQHandler

EXPORT EXTI1_IRQHandler

EXPORT EXTI2_IRQHandler

EXPORT EXTI3_IRQHandler

EXPORT EXTI4_IRQHandler

EXPORT EXTI9_5_IRQHandler

EXPORT EXTI15_10_IRQHandler

中断线0-4每个中断线对应一个中断函数,中断线5-9共用中断函数EXTI9_5_IRQHandler,中断线10-15共用中断函数EXTI15_10_IRQHandler。

●关于函数EXTI_GetITStatus(EXTI_Line3)和EXTI_ClearITPendingBit(EXTI_Line3)做进一步分析在编写中断服务函数的时候会经常使用到两个函数。

第一个函数是判断某个中断线上的中断是否发生(标志位是否置位)。这个函数一般使用在中断服务函数的开头判断中断是否发生。

第二个函数是清除某个中断线上的中断标志位,这个函数一般应用在中断服务函数结束之前,清除中断标志位。

中断服务函数中,其它的内容就是我们讲按键的章节的内容一致,延时去抖,反转LED灯的状态。

7.1.9下载与验证

如果使用JLINK下载固件,请按错误!未找到引用源。错误!未找到引用源。下载固件到神舟III号开发板小节进行操作。

7.1.10实验现象

上电运行。在没有按键按下时,板载的4个LED灯,呈流水灯功能。有按键按下,相关的LED灯会随之发生变化,并且流水灯功能停止。按键松开,流水灯功能恢复。

STM32外部中断以及中断优先级

外部中断的初始化过程: 1.初始化IO为输入(可以设置上拉,下拉,浮空) 2.开启IO复用时钟 3.开启与该IO相对的线上(详解下) 4.配置NVIC,使能中断 5.编写中断服务函数 外部中断: Stm32中总共有19个外部中断 包括: 线0-15:IO输入中断(每条线上最多有7个IO,如GPIOA~GPIOG,但是每一条线每次只允许同时连接到一个IO)

线16:PVD 线17:RTC 线18:USB 关于优先级: CM3中内核支持256个中断(16个内核+240外部)和可编程256级中断优先级的设置

Stm32目前支持84个中断(16个内核+68个外部,注:不是指68个外部中断),16级可编程优先级(优先级设置寄存器中使用了4位)

注意:其中外部中断5-9和中断10-15向量存放在一起 优先级: 数值低的优先级要高于数值高的!!!!!! 上电复位后,系统默认使用的是组0; 一个系统只能使用一组优先级组,不可使用多个,优先级的设置不能超过组的范围,否则会产生不可预计的错误 1.高抢先级的中断可以打断低优先级的中断响应,构成中断嵌套 2.相同抢先级的中断不可以构成嵌套,系统会优先响应子优先级高的

3.当2(n)个相同抢先优先级和相同子优先级的中断出现,STM32首先响应中断通道所对应的中断向量地址低的那个中断 4.0号抢先优先级的中断,可以打断任何中断抢先优先级为非0号的中断;1号抢先优先级的中断,可以打断任何中断抢先优先级为2、3、4号的中断;……;构成中断嵌套。 5.所有外部中断通道的优先级控制字PRI_n也都是0,68个外部中断通道的抢先优先级都是0号,没有子优先级的区分。不会发生任何的中断嵌套行为,谁也不能打断当前正在执行的中断服务。当多个中断出现后,则看它们的中断向量地址:地址越低,中断级别越高,STM32优先响应

实验五 外部中断应用实验

外部中断应用实验 设计性试验 2012年11月28日星期三第三四节课 一、实验目的 1、掌握中断系统外部中断源的使用方法。 2、掌握延时程序的编程及使用方法。 3、掌握Proteus软件与Keil软件的使用方法。 4、掌握单片机系统的硬件和软件设计方法。 二、设计要求 1、用Proteus软件画出电路原理图,在单片机的P1.0口线上接按键K0 ,作为外部中断源0使用,用于开启波形,在单片机的 P1.1口线上接按键K1,作为外部中断源1使用,用于关闭波形。 2、在单片机的P1.2口线上产生周期50mS的连续方波,在P1.2口线上接示波器观察波形。 三、电路原理图

四、实验程序流程框图和程序清单及实验结果 /******************** 实验五外部中断应用实验 要求:(1)在单片机的P1.0口线上接按键K0 ,作为外部中断源0使用,用于开启波形,在单片机的 P1.1口线上接按键K1,作为外部中断源1使用,用于关闭波形。 (2)在单片机的P1.2口线上产生周期50mS的连续方波,在P1.2口线上接示波器观察波形。 **********************/ ORG 0000H START: LJMP MAIN ORG 0003H LJMP EXINT0 ORG 0013H LJMP EXINT1 ORG 000BH LJMP TTC0 ORG 0100H MAIN: MOV SP, #2FH ;堆栈指针初始化 MOV IE, #10000111B;EA - - ES ET1 EX1 ET0 EX0 MOV TMOD, #01H ;设置定时器T/C0为工作方式1 MOV TH0, #9EH ;设置定时器T0的计数初值为25ms MOV TL0, #58H SETB IT0 ;设置外部中断0为脉冲触发 SETB IT1 ;设置外部中断1为脉冲触发 HERE: LJMP HERE ;等待中断 /*定时器T0中断服务程序*/ ORG 0200H TTC0: CPL P1.2

Atmega128外部中断程序

//static unsigned char tel[11]; static unsigned char zz=1; unsigned char ATma[20]; static unsigned char zz0=1; static unsigned char mmm=0; void exteral_interrupt6()//外部中断服务函数初始化 { CLI(); //关闭中断 // DDRE&=~(1<

单片机中断程序大全

单片机中断程序大全公司内部编号:(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单片机独立按键程序查询法和外部中断两种

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。51只是一个学习的基础平台,你懂得。 //程序在关键的位置添加了注释。 //用//11111111111111111代表第一个程序。//2222222222222222222222222代表第二个程序,以此类推 //1111111111111111111111111111111111111111111111111111111111111111111 //1111111111111111111111111111111111111111111111111111111111111111111 /****************************************************************************** * * 实验名: 左右流水灯实验 * 使用的IO : LED使用P2,键盘使用P3.1 * 实验效果: 按下K1键, * 注意: ******************************************************************************* / #include #include #define GPIO_LED P2 sbit K1=P3^1; void Delay10ms( ); //延时10ms /****************************************************************************** * * 函数名: main * 函数功能: 主函数 * 输入: 无 * 输出: 无 ******************************************************************************* / void main(void) { unsigned int i,j; j=0xfe; //1111_1110 while(1) { GPIO_LED=j; if(K1==0) //检测按键K1是否按下 { Delay10ms(); //消除抖动 if(K1==0) {

STM32中断

STM32外部中断详解 2012-07-02 21:59:24| 分类:嵌入式相关| 标签:|举报|字号大中小订阅 一、基本概念 ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。 4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组 第0组:所有4bit用于指定响应优先级; 第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级; 第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级; 第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级; 第4组:所有4位用于指定抢占式优先级。 所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。每一个中断源都必须定义2个优先级。 有几点需要注意的是: 1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果; 2)抢占式优先级别相同的中断源之间没有嵌套关系; 3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。 二、 GPIO外部中断 STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0 –EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。对于中断的控制,STM32有一个专用的管理机构:NVIC。 三、程序实现

AVR单片机外部中断0、1、2详解

AVR单片机外部中断0、1、2 详解 中断基本包含: 1.中断源 2.中断向量(中断入口地址) 3.中断优先级 4.中断函数 除此之外,在单片机中,中断的执行或者中断的触发必 须符合以下的规则:中断触发|执行= 全局中断使能位AND 中断源使能位AND 中断源标志位 单片机内部中断的触发必须完成,全局中断使能,中断 源使能,中断源标志位置一等条件。除此之外,如果是 外部中断0,1,2(INT0,1,2),必须设置引脚触发的规则。最后呢,就是需要在程序里建立处理中断的中断 函数。 在编程的时候的步骤大致如下:(无视INT2) 1. 初始化PD2,PD3 为输入状态。DDRD|=BIT(2)|BIT(3); 2. 设置INT0,1 引脚触发的规则,实验中为低电平触发。MCUCR=0xF0; 3. 设置INT0,1 中断源使能位为逻辑1。 GICR|BIT(7)|BIT(6); 4. 清除INT0,1 的中断标志位(软件写入,逻辑1 为清

除)。GIFR|=BIT(7);BIT(6); 5. 全局中断允许位使能。SREG|=BIT(7); 6. 编辑中断处理函数。 /*ATmega16提供3个外部中断,分别由INT0、INT1和INT2引脚触发。 需要注意的是,如果将ATmega16设置为允许外部中断,则即使把INT0、INT1和INT2引脚 设置为输出方式,外部中断仍然会被触发。外部中断可选择采用上升沿触发、下降沿触发和 低电平触发(INT2中断只能采用沿触发方式。 */ #include; #include; #include "smg.h" /*1.状态寄存器SREG bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 I T H S V N Z C I:全局中断使能位。 在I置位后,单独的中断使能由不同的中断寄存器控制。若I为0,则禁止中断。 MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断

ATMega16单片机外部中断的使用

ATMega16单片机外部中断的使用[日期:2010-09-24 ] [来源:本站原创作者:佚名] [字体:大中小] (投递新闻) // Crystal: 7.3728Mhz ,功能:学习外部中断0的程序 #include #include #define LED_COM PORTA ^= (1 << PA6) // void port_init(void) { PORTA = 0x40; DDRA = 0x40; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x04; DDRD = 0x00; } #pragma interrupt_handler int0_isr:2 void int0_isr(void)

LED_COM; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); MCUCR = 0x00; GICR = 0x40; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void main() { init_devices(); while(1)

单片机外部中断实验(附C语言程序)

单片机外部中断实验(附c程序) 一、实验目的 掌握外部中断的C语言和汇编语言编程方法,会用外部中断解决实际应用问题。 。 二、实验内容 8051C51单片机P2.0接一个发光二极管LED1、P2.1接一个发光二极管LED2,P3.2接一个开关、P3.3接一个开关要求实现以下功能: (1)合上、P3.3断开时LED1闪烁 (2)P3.2断开、P3.3合上时LED2闪烁 (3)P3.2合上后(不断开)再合上P3.3,LED1闪烁LED2不闪烁 (4)P3.3合上后(不断开)再合上P3.2,LED2不闪烁LED1闪烁 试编写C语言和汇编语言程序 使用自然优先级就可以 也可 XO 高级X1低级PX0=1 PX1=0 四、实验电路 五、参考程序(自己完成) C程序: Include Sbit P2_0=P2^0; Sbit P2_1=P2^1; Sbit P3_2=P3^2; Sbit P3_3=P3^3; void delay02s(void) //延时0.2秒子程序 { unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); }

Void main { EA=1; EX0=1; EX1=1; ITO=1; IT1=1; PX0=1; PX1=0; While(1); } Void int0(void) interrupt 0 { if(!P3_2) { While(1) { P2_0=1; delay02s(); P2_0=0; delay02s(); } } } Void int1(void) interrupt 2 { if(!P3_3) { While(1) { P2_1=1; delay02s(); P2_1=0; delay02s(); } } }

单一外中断的应用

单一外中断的应用 在AT89S51单片机的P1口上接有8只LED。在外部中断0输入引脚INT0(P3.2)接有一只按钮开关k1。要求将外部中断0设置为电平触发。程序启动时,P1口上的8只LED全亮。每按一次按钮开关k1,使引脚INT0接地,产生一个低电平触发的外中断请求,在中断服务程序中,让低4位的LED与高4位的LED交替闪烁5次,然后从中断返回,控制8只LED再次全亮。原理电路及仿真结果如图所示。 参考程序如下: #include #define uchar unsigned char void Delay(unsigned int i) //延时函数Delay(),i为形式参数,不能赋初值 { unsigned int j; for(;i>0;i--) for(j=0;j<333;j++) //晶体震荡器为12MHz,j的选择与晶体振荡器的频率有关{;} //空函数 } void main() { EA=1; //总中断允许 EX0=1; //允许外部中断0中断 IT0=1; //选择外部中断0为跳沿触发方式 while(1) //循环 {P1=0;} //P1口的8只LED全亮 } void int0() interrupt 0 using 1 //外部中断0的中断服务函数

{ uchar m; //禁止外部中断0中断 EX0=0; //交替闪烁5次 for(m=0;m<5;m++) { P1=0x0f; //低4位LED灭,高4位LED亮 Delay(200); //延时 P1=0xf0; //高4位LED灭,低4位LED亮 Delay(200); //延时 EX0=1; //中断返回前,打开外部中断0中断} }

单片机课程设计外部中断控制流水灯变化

单片机课程设计报告 设计题目:外部中断控制流水灯变化 姓名

一.设计目的 通过学习单片机工作原理和各种工作方式及各管脚的功能,想通过P3口的俩管脚和第二功能,即外部中断来使CPU响应,达到控制流水灯的目的。 二.设计要求 主程序实现8个灯从到依次亮灭,灯与灯 之间间歇约秒.当口是低电平时,灯从到依次亮灭,灯与灯之之间间歇约秒.循环3次返回主程序.当口是低电平时,灯全灭,当口是高电平时,返回主程序.当同时使和为低电平时,灯全灭,因为外部中断0的优先级高于外部中断1的优先级. 三.MCS-51的硬件结构: 四.P3口的状态 P3口是双功能口,默认为第一功能(通用I/O口),通过编程可设置第二功能。

五.中断传送方式: 中断方式则是在外设为数据传送做好准备之后,就向CPU发出中断请求信号(相当于通知CPU)。CPU接收到中断请求信号之后立即作 出响应,暂停正在执行的原程序(主程序),而转去外设的数据输入输 出服务,待服务完之后,程序返回。CPU再继续执行被中断的原程序。六.外部中断 外部中断是指从单片机外部引脚输入请求信号。输入/输出的中断请求、实时事件的中断请求、掉电和设备故障的中断请求都可以作为 外部中断源,从引脚INT0、INT1输入。 外部中断请求、有两种触发方式:电平触发及跳变(边沿)触发。 这两种触发方式可以通过对特殊功能寄存器TCON编程来选择。七.电路原理逻辑图如下:

灯亮情况 00全灭 01全灭 10从到依次亮灭 11从到依次亮灭八.实验硬件电路图如下

九.程序流程图如下 十.程序清单 ORG 0000H AJMP START ORG 0003H AJMP SER ORG 0013H AJMP SER1 ORG 0030H START: MOV IE,#85H ;外部中断0和1都开

外部中断0实验程序

51单片机第十四课外部中断0实验 #include #define uchar unsigned char #define uint unsigned int sbit led0=P0^0; unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00}; unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78}; //************************************************ //延时函数,在12MHz的晶振频率下 //大约50us的延时 //************************************************ void delay_50us(uint t) { uchar j; for(;t>0;t--) for(j=19;j>0;j--); } //************************************************ //延时函数,在12MHz的晶振频率下 //大约50ms的延时 //************************************************ void delay_50ms(uint t) { uint j; for(;t>0;t--) for(j=6245;j>0;j--); } void main() {

外部中断详解

7.1EXTI外部按键中断实验 前面我们学习了,LED灯和按键。实际上对于STM32来说,我们是学习了它的外设GPIO。这一节我们前面学习的内容,学习STM32的EXTI (External interrupt),即外部中断。 前面的按键章节中,我们检测按键是否被按下的方式是轮询检测的方式,这里我们改为使用中断检测的方式,提高CPU的效率。 7.1.1什么是中断 单片机中断系统的概念:什么是中断,我们从一个生活中的例程引入。比如说你在做A 事,但是突然间来了你想起来了更重要的B事,所以你马上去做B事了,做完之后再回来继续做A事,这个就是中断。 7.1.2什么是单片机的中断? 当CPU正在执行一个任务,但突然又发生了一个更高级的任务,CPU必须立即去执行的任务,所以CPU必须中断当前的任务,并保存该任务已经执行的状态和相关信息,然后转而去执行那个更加高级的任务,因此就引入了“中断”这个概念。 中断是指计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回现行程序的间断处,继续执行原程序。中断是单片机实时地处理内部或外部事件的一种内部机制。当某种内部或外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断的程序处,继续执行下去。 在程序里面也是一样的。举个例子可能会容易懂点,定时中断:比如你定时1ms,主程序在运行,每当1ms时间到后,就跑到定时中断子程序里面执行,执行完后再回到主程序(中断程序是1ms中断一次)。那对于整个系统来说中断能实现什么好处呢?下面我们给以说明:1)提高了CPU的效率 CPU是计算机的指挥中心,它与外围设备(如按键、显示器等)通讯的方法有查询和中断2种:查询的方法是无论外围IO是否需要服务,CPU每隔一段时间都要依次查询一遍,这种方法CPU需要花费一些时间在做查询服务工作。 中断则是在外围设备需要通讯服务时主动告诉CPU,这个时候CPU才停下当前工作去处理中断程序,不需要占用CPU主动去查询的时间,CPU可以在没有中断请求来临之前一直做自己的工作,从而提高了CPU效率。 2)可以实现实时处理 外设任何时刻都可能发出请求中断信号,CPU接到请求后及时处理,以满足实时系统的需要。 3)可以及时处理故障 计算机系统运行过程中难免会出现故障,有许多事情是无法预料的,如电源掉电、存储器出错、外围设备工作不正常等,这时可以通过中断系统向中断源CPU发送中断请求,由CPU及时转到相应的出错处理程序,从而提高计算机的可靠性。 7.1.3STM32中断的初步理解 神舟III号开发板的主芯片是STM32F103ZET6,它采用的是ARM公司的Cortex-M3内核。Cortex-M3内核支持256个中断,具有256级的可编程中断设置。但STM32并没有使用M3

单片机外部中断线的作用

单片机外部中断线的作用 这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套。图中的蓝色虚线箭头,标出了外部中断信号的传输路径。 首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断挂起请求寄存器,最后经过编号4的与门输出到NVIC中断检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。 接下来是编号3的或门,这个或门的另一个输入是软件中断/事件寄存器,从这里可以看出,软件可以优先于外部信号请求一个中断或事件,即当软件中断/事件寄存器的对应位为“1”时,不管外部信号如何,编号3的或门都会输出有效信号。 一个中断或事件请求信号经过编号3的或门后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求寄存器中记录了外部信号的电平变化。 外部请求信号最后经过编号4的与门,向NVIC中断控制器发出一个中断请求,如果中断屏蔽寄存器的对应位为“0”,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽。明白了外部中断的请求机制,就很容易理解事件的请求机制了。图中红色虚线箭头,标出了外部事件信号的传输路径,外部请求信号经过编号3的或门后,进入编号5的与门,这个与门的作用与编号4的与门类似,用于引入事件屏蔽寄存器的控制;最后脉冲发生器的一个跳变的信号转变为一个单脉冲,输出到芯片中的其它功能模块。从这张图上我们也可以知道,从外部激励信号来看,中断和事件的产生源都可以是一样的。之所以分成2个部分,由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件,是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等;

外部中断详解

由于不少同学们,学习51单片机到了中断课程的时候,就开始进入一知半解的状态了,为此,开题一篇,以供大家搞明白,中断这回事。 我们还是用清晰点的逻辑来分析,围绕这四个部分来介绍,当然重点在于3和4部分。通篇我会以让初学者都能看懂的语言来说明。如果有专业一点的术语名词,我也尽量用简单易懂的描述。 注:本文旨在让大家理解什么是中断和怎么去设置。具体的东西有些考虑到深浅问题,则跳过不讲。如需了解,可自行查询资料 1.什么是中断? 2.为什么要有中断? 3.中断怎么触发? 4.怎么设置中断? 什么是中断? 举个老生常谈的例子——接电话。 在一个风和日丽的下午,你在电脑前看着视频,突然间,你桌上的手机来电话了,这时候你就该暂停视频,拿起手机接电话。 OK,回到单片机里来,我们之前写程序,都是在main函数里,甚至main 函数里的while(1)里执行我们的程序。这就相当于这个例子中的【看视频】,而【电话响了】这个过程,就相当于产生了中断,而【接电话】就是你在中断里做的事情。

为什么要有中断? 为什么要有中断,再举一个例子好了。 简单来讲,就是一些程序我们平时不执行,但到了某个特殊时刻,我们才去执行。所以我们就让这个特殊时刻产生一个中断,这时候,就跳去了我们特殊时刻才执行的函数里了。 什么情况会触发中断? 那么,我们什么情况下,单片机才会识别到中断,或者说,什么情况下,单片机才会跳入我们中断的函数里呢? 简单来讲,我们的中断大致分为三种,外部中断、定时器中断、串口中断。这三种的触发方式不一样。 外部中断:

顾名思义,就是单片机外部出现了一定的情况,才进入了中断。89c51有两个外部中断,一个是P3.2引脚,一个是P3.3引脚。分别是外部中断0和外部中断1。我们以外部中断0为例,当P3.2这个脚读到一个低电平(0)或者下降沿(由高电平变低电平)的时候,这时单片机自己就识别到了,所以就会自己跳入中断。 定时器中断: 定时器中断不再这详细说明,大致是讲,我们可以设置一个时间(或者叫闹钟),然后这个单片机会开始计时,当到了这个时间点,单片机就会跳入中断。串口中断: 串口中断也不再这赘述,大致是,当单片机的RX引脚接收到信号的时候,会自动进入中断。 怎么设置中断? OK,在了解这些之后,我们就可以开始来写程序,设置一个中断了。所有中断,如果要开启的话,我们就需要对单片机进行一个【初始化设置】,让单片机知道:“哦,你要老子开启外部中断。” 这时候,我们设置的东西,其实就是在设置单片机里的一些特殊功能寄存器。这时候涉及到一个新名词叫做寄存器,我们这么理解寄存器顾名思义他是存放数据的,需要的时候,我就把他拿出来。

单片机外部中断详解

单片机外部中断详解 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】

一.外部中断相关寄存器 1.定时器/计数器控制寄存器控制寄存器(TCON)? ? IT0:外部中断0触发方式控制位? 当IT0=0时,为电平触发方式(低电平有效)? 当IT0=1时,为边沿触发方式(下降沿有效)? IT1:外部中断1触发方式控制位? 当IT1=0时,为电平触发方式(低电平有效)? 当IT1=1时,为边沿触发方式(下降沿有效) 2.中断允许控制寄存器(IE)? ?

EX0:外部中断0允许位;? EX1:外部中断1允许位;? EA :CPU中断允许(总允许)位。 二.外部中断的处理过程 1、设置中断触发方式,即IT0=1或0,IT1=1或0? 2、开对应的外部中断,即EX0=1或EX1=1;? 3、开总中断,即EA=1;? 4、等待外部设备产生中断请求,即通过P3.2,P.3.3口连接外部设备产生中断? 5、中断响应,执行中断服务函数 三.程序编写 要求:通过两位按键连接外部中断0和1,设定外部中断0为下降沿触发方式,外部中断1为低电平触发方式,按键产生中断使数字加减,用一位共阳极数码管来显示数值。? 目的:感受外部中断对程序的影响,体会低电平触发和下降沿触发的区别。

#include#define uint unsigned int #define uchar unsign ed char uchar code dat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x f8,0x80,0x90};uint num; void main() { EA=1; //开总中断 IT0=1; //下降沿触发 IT1=0; //低电平触发 EX0=1; //外部中断0允许 EX1=1; //外部中断1允许 while(1) { P0=dat[num%10]; } } void plus() interrupt 0???? //外部中断0 {

单片机外部中断实验(附C语言程序)复习进程

单片机外部中断实验(附C语言程序)

单片机外部中断实验(附c程序) 一、实验目的 掌握外部中断的C语言和汇编语言编程方法,会用外部中断解决实际应用问题。 。 二、实验内容 8051C51单片机P2.0接一个发光二极管LED1、P2.1接一个发光二极管LED2,P3.2接一个开关、P3.3接一个开关要求实现以下功能:(1)合上、P3.3断开时LED1闪烁 (2)P3.2断开、P3.3合上时LED2闪烁 (3)P3.2合上后(不断开)再合上P3.3,LED1闪烁LED2不闪烁 (4)P3.3合上后(不断开)再合上P3.2,LED2不闪烁LED1闪烁 试编写C语言和汇编语言程序 使用自然优先级就可以 也可 XO 高级X1低级PX0=1 PX1=0 四、实验电路 五、参考程序(自己完成)

C程序: Include Sbit P2_0=P2^0; Sbit P2_1=P2^1; Sbit P3_2=P3^2; Sbit P3_3=P3^3; void delay02s(void) //延时0.2秒子程序{ unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0;j--) for(k=248;k>0;k--); } Void main { EA=1; EX0=1; EX1=1 ; ITO=1 ; IT1=1 ; PX0=1; PX1=0; While(1) ; } Void int0(void) interrupt 0 { if(!P3_2) { While(1) { P2_0=1; delay02s(); P2_0=0; delay02s(); } } } Void int1(void) interrupt 2 { if(!P3_3) {

单片机外部中断的使用

哈尔滨理工大学荣成学院 单片机原理及应用Protues 仿真实验 班级: 学号: 姓名: 日期:

实验三单片机外部中断的使用 一、实验名称:单片机外部中断的使用 二、实验目的 1.掌握在Keil环境下建立项目、添加、保存源文件文件、编译源程序的方法; 2.掌握运行、步进、步越、运行到光标处等几种调试程序的方法; 3.掌握在Proteus环境下建立文件原理图的方法; 4..实现Proteus与Keil联调软件仿真。 三、使用仪器设备编号、部件及备件 1.实验室电脑; 2.单片机实验箱。 四、实验过程及数据、现象记录 在Proteus 环境下建立如下仿真原理图,并保存为文件;

原理图中常用库元件的名称: 无极性电容:CAP 极性电容:CAP-ELEC 单片机:AT89C51 晶体振荡器:CRYSTAL 电阻:RES 按键:BUTTON 发光二极管:红色LED-RED 绿色LED-GREEN 蓝色LED-BLUE 黄色LED-YELLOW 在Keil环境下建立源程序并保存为.ASM文件,生成.HEX文件;汇编语言参考程序如下:ORG 0000H

LJMP MAIN ORG H ;外部中断0程序入口地址LJMP EXINT0 ORG 0030H MAIN: MOV SP,#60H ;堆栈指针初始化 SETB ;设置外部中断 0 为边沿触发 SETB ;开外部中断0 SETB ;开CPU总中断MOV A,#01H LOOP: MOV P1,A RL A CALL DELAY SJMP LOOP DELAY: MOV R1,# ;延时250ms子程序DL1: MOV R2,# DL2: MOV R3,# DJNZ R3,$ DJNZ R2,DL2 DJNZ R1,DL1 ;延时子程序返回EXINT0: PUSH PUSH CLR RS1 SETB RS0 MOV R0,# LP: MOV P1,#0FFH CALL DELAY MOV P1,#00H CALL DELAY DJNZ R0,LP POP PSW POP ACC ;中断返回END 将以上程序补充完整,流水时间间隔,闪烁时间间隔为250ms。C51语言参考程序: #include #include #define uchar unsigned char #define uint unsigned int void delay_ms(uint x) { uint i; uchar j; for(i=0;i

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开始响应,处理终端,而当入

单片机外部中断详解及程序

单片机外部中断详解及程序 单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。 实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。电路结构和接线不变,仅把程序改为下面的形式。 #include ;

unsigned int t=500; //定义一个全局变量t,并设定初始值为500次 //===========延时子函数,在8MHz晶振时约 1ms============= void delay_ms(unsigned int k) { unsigned int i,j; for(i=0;i

相关文档
最新文档