AVR单片机外部中断0、1、2详解
AVR外设汇总之中断
单片机外部中断
0003H 0013H来自五、外部中断应用实例例:利用外部中断INT0控制流水灯。具体 要求:单片机得电后,LED灯从左向右顺 序点亮;当产生外部中断后,全部LED灯 开始闪烁,闪烁3次后,中断停止,流水 灯继续流水。
(1)硬件接线图如下图所示:
VCC
R1
100
R2
100
R3
100
R4
100
R5
100
D2
D3
D4
D5
D6
D7
D8
18
XTAL2
9
RST
29 30 31
PSEN ALE EA
1 2 3 4 5 6 7 8
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51
K1
(2)参考程序如下:
ORG 0000H ; 复位入口 LJMP QQ ;转到初始化程序 ORG 0003H ;外部中断1入口地址 LJMP EXT0 ; 转移到中断处理程序 QQ:MOV A,#0FEH ;把数据11111110送进累加器A HH: SETB IT0 ;外部中断触发方式选择 SETB EX0 ;允许外部中断 SETB EA ;允许总中断 MOV P0,A ;把A的数据送到P0口,点亮一个LED ACALL YY ;调用延时子程序 RR A ;A的数据左移一位 LJMP HH ;转移到HH
EXT0: MOV P0,#0FFH ACALL YY MOV P0,#00H ACALL YY MOV P0,#0FFH ACALL YY MOV P0,#00H ACALL YY MOV P0,#0FFH ACALL YY MOV P0,#00H ACALL YY RETI
单片机外部中断详解及程序
单片机外部中断详解及程序单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。
比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。
在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。
如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。
但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。
因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。
实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。
下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。
电路结构和接线不变,仅把程序改为下面的形式。
#include ;unsigned int t=500; //定义一个全局变量t,并设定初始值为500次//===========延时子函数,在8MHz晶振时约1ms=============void delay_ms(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<1140;j++);}}//============主函数==================================void main( void ){DDRB = 0xFF; //设置端口B为输出方向PORTB = 0xFF; //设置端口B的输出为全高电平DDRD = 0x00; //设置端口D为输入方向PORTD = 0xFF; //设定端口D为内部上拉方式,无信号输入时处于高电平状态MCUCR = 0x0A; //设定INT0、INT1为下降沿触发GICR = 0xC0; //使能INT0、INT1中断SREG = 0x80; //使能总中断while(1){PORTB = 0x55; //让接在端口B上的LED显示01010101 delay_ms(t); //延时t个msPORTB = 0xAA; //让接在端口B上的LED显示01010101 delay_ms(t); //延时t个ms}}//============中断函数(外部0)==========================#pragma vector = INT0_vect__interrupt void INT0_Server(void){t = 100; //设定t的值为100次}//============中断函数(外部1)==========================#pragma vector = INT1_vect__interrupt void INT1_Server(void){t = 500; //设定t的值为500次}把上述程序进行编译并下载到单片机中,可以看到结果与第二个示例中的完全一致。
AVR单片机中断
AVR 单片机中断
关于AVR 中断:
系统在正常运行主程序时,如果突然有一个重要的任务要马上处理,那幺系统就要保存现在的工作,然后再去处理这个任务,执行这个重要任务完毕以后再返回原来的主程序继续运行,这就是中断。
主程序一旦进入中断服务程序,那幺AVR 芯片将自动的关闭全局中断,
在这个期间不再执行其它的中断请求,直到中断程序结束以后芯片才自动的重新开放全局中断。
(注意,在这个期间某些中断请求可能会被丢弃,某些请求会留下中断请求标致,一旦当前的中断执行完毕,这个有中断标致的请求就有可能马上得到响应,如INT0 的下降沿触发就会留下中断请求标致,而
低电平触发就不会流下中断请求标致)。
如果你想在执行中断服务程序时响应另外一个更重要的中断,那幺就要在中断服务程序中加入一条打开全局中断的语句。
使用ICC 快速建立中断服务程序程序文件
使用ICCAVR Application Builder 进行如下图所示的设置。
可以设置是否使用中断,上升延,下降延,低电平,任意的逻辑电平变化。
AVR笔记:外部中断
A VR学习笔记之【外部中断】【一】Mega16共有三个外部中断,外部中断相比定时器而言它的寄存器比较少,因此相对比较简单。
我们现在只关心需要用的部分,其他的暂且放弃不管。
和外部中断相关的特殊功能寄存器有:①MCU控制寄存器(MCUCR)在上面八位的寄存器中,白色的部分使我们要关心的,灰色部分就不用管了。
资料上对后面四位(第四位)的作用有介绍。
ISC11与ISC10控制中断1的触发方式。
下表为ISC10/11的值对应触发方式:SC11与ISC10控制中断0的触发方式。
下表为ISC00/01的值对应触发方式:我们在使用外部中断0和1的时候,其触发方式的设置便是通过以上ISC的不同值实现的。
至于INT2下面有介绍。
②MCU控制与状态寄存器(MCUCSR)这个寄存器只有一个BIT与外部中断相关。
ISC2,我们通过和INT0/1的对比可以发现ISC的后缀数字命名只有规律的,这会方便我们记忆。
同时在说明文档上说了很长一段关于ISC2的说明:他的意思说早了,他也就是想说:ISC=0的话INT2是下降沿出发中断,ISC=1是上升沿出发。
这才是应该说明的最重要的点。
他后面还说了:(1)如果你让ISC=0那么外部的低电平必须保持到当前正在运行的指令运行结束才会出发,换一句意思就是,如果外部时间过短,有可能导致INT2不被触发。
(2)他又说明,如果改变ISC2的值的话有可能触发中断,导致误判,因此如果你想改变其中断触发方式的话,首先把通用中断控制寄存器(GICR)里面控制INT2的中断开关关了,这样便不会触发中断了。
③通用中断控制寄存器(GICR)他就是个中断开关。
前面三位依次赋值便会打开响应中断。
当然总中断开关也要打开才行(SREG|=BIT(7))。
④通用中断标志寄存器(GIFR)他就是一个中断标志,我们也就是说在中断发生的时候中断对用的标志会变为1,此时程序会自动转到中断程序子函数。
然后有硬件自动清零,以等待下一次的中断发生。
外部中断0功能的使用方法过程
外部中断0功能的使用方法过程
嘿呀!今天咱们就来好好聊聊这个“外部中断0 功能的使用方法过程”呢!
首先呀,咱们得搞清楚啥是外部中断0 功能?哎呀呀,简单来说呢,它就是能让我们的系统在正常运行的时候,突然因为外部的某些信号或者事件,打断当前的任务,去处理更紧急更重要的事情哇!
那怎么开始使用这个神奇的功能呢?1. 准备工作可不能少呀!得先设置好相关的硬件连接,确保外部信号能准确无误地传进来呢。
2. 接下来,在软件编程方面,要配置好中断的触发条件和优先级,这可重要啦!要是设置不好,那可就乱套啦!
3. 还有还有,得编写中断服务程序,这就像是给外部中断0 功能安排了一个专门的“办公室”,它进来了,就在这里处理事情。
在实际操作的时候,要注意好多细节哟!比如说,中断响应的时间得控制好,要是太慢了,那可就耽误大事啦!还有哇,在中断服务程序里,处理的任务不能太复杂,不然会影响整个系统的运行效率呢!
哎呀呀,这外部中断0 功能用好了,那可真是能让我们的系统变得更加灵活和高效哇!比如说在一些实时监测的系统中,一旦发现异常情况,就能马上做出反应,是不是很厉害呀?
总之呢,掌握外部中断0 功能的使用方法过程不是一件轻松的事情,需要我们细心、耐心,不断地尝试和改进呢!哇,相信只要咱们用心去学,去实践,一定能把它玩转,让它为我们的工作和学习带来更多的便利哟!。
AVR学习笔记二、基本输入和外部中断实验
A VR学习笔记二、基本输入和外部中断实验-------基于LT_Mini_M162.1 利用按键控制发光二极管的亮灭2.1.1 实例功能在“点亮发光二极管”和“让发光二极管动起来”这两个例子中,都是通过单片机程序来控制发光二极管的亮灭。
如果想要控制发光二极管的亮灭,只有通过打开或者关闭电源来实现控制。
那么怎样实现人工参与控制呢?在有些应用场合,需要单片机对人工的开关信号作出相应的响应和处理,通过控制电源的通断会影响到单片机系统中的其他功能,所以通过控制电源的方法并不明智。
能不能通过按动一个按键来实现发光二极管的亮灭呢?当然可以,前面已经讲过,A VR单片机的I/O口都是双向的,也就是既能当作输出控制端口,也能当作输入检测端口。
既然我们可以通过控制端口输出不同的高低电平使发光二极管实现点亮和熄灭;那么为什么不能通过监测端口输入电平的状态来进行相应的处理呢。
在本例中,通过介绍利用按键开关控制发光二极管的亮灭来了解A VR单片机的端口检测外部信号的功能和方法。
本例中有3个功能模块,描述如下:●单片机系统:检测外界的按键开关信号,根据按键的开关状态控制发光二极管的亮灭状态。
●外围电路:首先是产生信号的按键电路,包括对按键去抖动电路的介绍;然后是发光二极管的控制电路。
●软件程序:通过读取AVR单片机相应端口的状态,编写相应的程序控制发光二极管的亮灭。
本例的目的在于希望读者完成本例后,能完成相关电路的设计和相应程序的编写,从而掌握以下知识点:◆了解AVR单片机端口输入功能,掌握使用AVR单片机端口输入功能检测外部信号的原理。
◆熟悉单片机端口输入输出功能的综合使用。
◆掌握AVR单片机按键的硬件去抖动的电路设计和原理。
◆掌握AVR单片机端口输入输出程序的编写。
◆掌握AVR单片机按键软件去抖动功能的实现。
2.1.2 器件和原理本例主要介绍A VR单片机外围电路中按键去抖电路的设计,分别介绍相应的软件和硬件解决方案。
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.状态寄存器SREGbit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0I T H S V N Z CI:全局中断使能位。
在I置位后,单独的中断使能由不同的中断寄存器控制。
若I为0,则禁止中断。
MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断触发控制位与通用 MCU 功能Bit 7 6 5 4 3 2 1 0SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00外部中断 1 由引脚 INT1 激发,如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。
单片机外部中断讲解
单片机外部中断讲解在单片机的世界里,外部中断就像是一位“紧急事务专员”,能够在关键时刻打断单片机正在进行的工作,让其优先处理更为重要和紧急的任务。
这一特性使得单片机在应对复杂多变的外部环境时变得更加灵活和高效。
首先,咱们来理解一下什么是外部中断。
简单来说,外部中断就是单片机从外部接收的一种信号,这个信号告诉单片机:“嘿,有重要的事情发生啦,你得马上停下来处理!”这个信号可以来自各种各样的外部设备,比如按键、传感器等等。
那么,单片机是如何感知到这些外部中断信号的呢?这就涉及到单片机的引脚配置。
通常,单片机都会有专门的引脚用于接收外部中断信号。
当外部设备产生中断信号并通过这些引脚输入到单片机时,单片机会立即响应。
外部中断有它自己的触发方式,常见的有边沿触发和电平触发。
边沿触发就像是一个瞬间的“脉冲”,可以是上升沿触发(也就是从低电平变为高电平的那一瞬间),也可以是下降沿触发(从高电平变为低电平的瞬间)。
而电平触发呢,则是根据引脚的高电平或者低电平状态来触发中断。
比如说,设置为高电平触发,那么只要引脚保持高电平,就会一直触发中断。
为了更好地管理外部中断,单片机一般都会有相应的中断控制寄存器。
通过对这些寄存器的配置,我们可以决定是否允许某个外部中断、选择触发方式、设置中断的优先级等等。
接下来,咱们说说外部中断的优先级。
想象一下,如果同时有多个外部中断信号来了,单片机该先处理谁呢?这就需要靠优先级来决定。
优先级高的中断会先得到处理,处理完后再去处理优先级低的中断。
在实际编程中,使用外部中断需要经过一系列的步骤。
首先,要对单片机进行初始化,包括设置中断相关的寄存器。
然后,编写中断服务函数。
这个函数就是单片机在响应中断后要执行的具体任务。
比如说,我们有一个基于单片机的温度监测系统,使用了一个温度传感器。
当温度超过设定的阈值时,传感器会给单片机发送一个外部中断信号。
在中断服务函数里,单片机可能会执行报警操作,比如点亮一个指示灯或者发出声音警报。
AVR第4讲中断
第4讲外部中断A VR提供了几种不同的中断源。
这些中断和复位向量在程序存储器空间内都有自己单独的程序向量。
所有中断都被分配一个私有的使能位,要想使能某一中断,就要向其使能位写入逻辑1,而且要把状态寄存器中的全局中断使能位置1。
程序存储器空间最低的一些地址,被默认定义为复位和中断向量。
完整的向量列表见“中断”部分。
该列表也决定了不同中断的优先级。
地址越小,优先级越高。
RESET具有最高的优先级,其次是INT0——外部中断请求0。
详细讨论见“中断”部分。
当某个中断产生时,全局中断使能位I被清零,所有中断都被禁止。
用户程序可以向I位写入1,以实现中断嵌套。
所有已使能的中断就可以中断当前的中断程序。
当从中断指令——RETI——的执行返回时,I位被自动置位。
基本上有两种类型的中断。
第一种是由事件触发的,把中断标志置位。
对于这些中断,程序计数器被引导到实际的中断向量,以执行中断处理程序,同时硬件把相应的中断标志清除。
通过向要清除的标志位位置写一个逻辑1,也可以被清除中断标志。
如果中断使能位被清除后,相应的中断条件发生时,中断标志将被设置,而后保持到中断被使能为止,或者由软件把标志清除。
类似地,如果在全局中断使能位被清除后,一个或多个中断条件产生时,相应的中断标志将被设置,并保持到全局中断使能位被设置为止,然后按优先级顺序执行。
第二种中断,只要中断条件存在,就会被触发。
这些中断没有必要具有中断标志。
如果中断条件在中断被使能前消失,那么中断将不被触发。
当A VR从一个中断中退出时,它一般会返回主程序,并且执行再执行一条指令后,才会响应后续的中断。
注意,当进入中断程序时状态寄存器不会自动保存,当从中断程序返回时,它也不会自动恢复。
这必须由用户软件来完成。
当使用CLI指令禁能中断时,中断将立即被禁能。
当CLI指令执行后,将没有中断再被执行,即使中断在CLI执行的同时发生。
下例所示为怎样使用CLI 指令来避免在定时的EEPROM写时序期间避免产生中断。
avr外部中断详细讲解
另外 ISC01,ISC00 和外部中断 0 设置触发方式有关:
ISC01 0 0 1 1 ISC00 0 1 0 1 说明 INT0 低电平触发中断 INT0 任意逻辑电平变化都触发中断 INT0 的下降沿产生异步中断请求 INT0 的上升沿产生异步中断请求
{ DDRB=0XFF; PORTB=0XFF; DDRD=0XF7; PORTD=0XFF;
//将 PB 口设置为输出 //PB 口输出 11111111,熄灭全部灯 //PD3 设置为输入,其余设置输出 //PD3 使能上拉电阻,其余都输出 1
MCUCR=0X08; //INT1 设置为下降沿触发 GICR=0X80; //使能 INT1 中断 SREG=0X80; //使能总中断 while(1) { PORTB=0X00; delay(100); PORTB=0XFF; delay(100); } }
MCUCR 是 MCU 控制寄存器,在中文版数据手册中 P65:
在这里我们只要关心它的 Bit 0-3,这四位跟外部中断才有关系。 对于上面的表格 Read/Write 代表可读可写,Initial Value 表示初始值,上面表示 默认值都为零。 其中 ISC11,ISC10 和外部中断 1 设置触发方式有关:
第 4 章 轻松掌握外部中断
4.1 什么是外部中断
“中断”这个词来自英文单词“interrupt” ,在单片机中中断的设置,大大提 高了单片机的工作能力。 对于中断的学习是单片机学习中的重点难点,只要掌握了中断,操纵单片机 让它做你想要实现复杂过程就容易多了。 从生活例子来看, 假如说在寝室里只有你一个人, 这个时候你在写一份作业, 写到一半,有人敲门,这时候,你放下笔,走过去开门,是隔壁寝室的同学来还 书,你收下书后,关上门,拿起笔继续写作业。这其中对于你写作业这个事情来 说就是发生了一次中断,而你能够处理这次“开门事件” ,就说明了你有“中断 能力” 。 反过来说,假如你没有中断能力,事情会这样发生:门外有人敲门的时候, 你的作业还没有写完, 你还是继续在写你的作业, 你甚至不知道外面有人在敲门, 于是便漏过了这件事情。 对应于单片机,假如有一段很长的程序要执行,当按键按下的时候,单片机 在执行前面的程序, 按键松开的时候还没有执行到按键扫描程序,一会儿到了执 行按键扫描程序的时候,扫描的结果是按键会是没有按下,这就发生了错误。 假如开启了外部中断,像上面人一样,执行写作业的动作的时候,外面一有 人在敲门,人便立刻知道了,然后放下手中的事情去开门。单片机开启中断后, 一旦有按键按下,单片机便立刻感知,马上去执行按键按下对应的程序。这样便 不会漏过按键对应的命令,保证了程序正常执行。
51单片机的中断系统解析
51单片机的中断系统解析在单片机的世界里,中断系统就像是一位高效的调度员,能够让单片机在处理主要任务的同时,及时响应并处理那些紧急或重要的事件。
51 单片机的中断系统就是这样一个强大而实用的功能模块,它为单片机的应用开发提供了极大的灵活性和高效性。
要理解51 单片机的中断系统,首先得知道什么是中断。
简单来说,中断就是单片机在正常执行主程序的过程中,由于内部或外部的事件触发,暂停当前正在执行的程序,转而去执行相应的中断服务程序,处理完中断事件后再返回原来被中断的地方继续执行主程序。
51 单片机的中断源共有 5 个,分别是外部中断 0(INT0)、外部中断 1(INT1)、定时器/计数器 0 溢出中断(TF0)、定时器/计数器 1溢出中断(TF1)和串行口中断(RI 或 TI)。
外部中断 0 和 1 是由单片机外部引脚的电平变化引起的。
当外部中断引脚(P32 对应 INT0,P33 对应 INT1)上的电平从高到低或从低到高发生变化时,就会触发相应的中断。
这在需要实时响应外部事件的场合非常有用,比如按键检测、外部信号的捕捉等。
定时器/计数器 0 和 1 溢出中断则是基于定时器/计数器的计数满溢出而产生的。
通过设置定时器/计数器的工作方式和初值,可以实现精确的定时或计数功能。
当计数器达到设定的值时,就会产生溢出中断,从而可以执行相应的定时处理任务,比如定时采样、定时控制等。
串行口中断是在串行通信过程中产生的。
当串行口接收完一帧数据或者发送完一帧数据时,就会触发相应的中断,以便及时处理接收到的数据或者准备发送下一组数据。
51 单片机的中断系统有两级控制,分别是总中断允许控制位 EA 和各中断源的允许控制位。
总中断允许控制位 EA 就像是一个总开关,只有当 EA 置 1 时,整个中断系统才有可能响应中断。
而各中断源的允许控制位则分别控制着相应中断源的开关,只有当对应的允许控制位也置 1 时,该中断源才能被响应。
单片机avr中断寄存器中断c语言函数外部中断INT0,INT1,INT3介绍
单片机avr 中断寄存器中断c语言函数外部中断INT0,INT1,INT3 介绍
简介:中断的概念,ATmega16中断向量表,avr中断寄存器SREG,MCU控制和状态寄存器MCUCSR,通用中断控制寄存器GICR, MCU控制寄存器MCUCR,ICCAVR中断函数格式介绍
中断就是暂停正在执行的程序语句,转去执行另一功能(函数)的程序语句,执行完后,立即返回原先暂停执行的语句处,继续执行。
单片机的中断系统解决了单片机运算速度快,外设(如键盘)速度慢之间的数据传输问题,提高了单片机的实时性和数据处理能力。
中断源:产生中断的地方,ATmega16具有20个中断源和一个复位中断,不同的单片机中断源的个数是不一样的。
单片机的中断源分为外部中断源和内部中断源,有三个外部中断源有INT0,INT1,INT2,当连接在单片机引脚的上
的外部电平发生变化时,将产生相应的中断。
内部中断源由单片机内部的功能单元如定时器,串行通讯产生的中断。
按是否可屏蔽可分为,非屏蔽中断,和可屏蔽中断,非屏蔽中断有系统复位(reset)中断,可屏蔽中断:屏蔽指的的是中断可由软件编程控制是否允许中断,或禁止中断,大部分都是可屏蔽中断。
中断向量:单片
机的每个中断源都有一个固定的入口地址,这个地址由单片机的硬件决定的,单片机相应中断后,自动跳转到相应的地址,这个地址就叫中断矢量。
外部中断的设置和一些寄存器的介绍
1)初始化IO 口为输入。
外部中断输入的IO 口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。
否则可能导致中断不停的触发。
在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。
①使能IO口的时钟②清除原来的相应的设置③设置成上拉输入0x80④把GPIO_ODR相应的位设置成 12)开启IO 口复用时钟,设置IO 口与中断线的映射关系。
STM32 的IO 口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO 口与中断线的对应关系。
才能把外部中断与中断线连接起来。
①使能复用时钟RCC_APB1ENR第0位AFIOEN:辅助功能IO时钟使能RCC->APB1ENR |= 1<<0②设置外部中断配置寄存器(AFIO_EXTICR1)总共有三个配置寄存器,分别对应着15个中段线。
每个寄存器存放四个。
如上图。
在设置这些位时仍然2步:首先:清除原来的设置。
AFIO->EXTICR[0]&=~(0x000F<<0); //清除中断线0的原来的设置然后:设置映射到那个端口。
AFIO->EXTICR[0]|=0<<0;//设置引脚为0000也就是A口扩展:事件控制寄存器(AFIO_EVCR)位7 EVOE:允许事件输出(Event output enable) 位7 该位可由软件读写。
当设置该位后,Cortex的EVENTOUT将连接到由PORT[2:0]和PIN[3:0]选定的I/O口。
位6:4PORT[2:0]:端口选择000:选择PA 001:选择PB 010:选择PC 011:选择PD 100:选择PE位3:0 PIN[3:0]:引脚选择(x=A…E)0000:选择Px0 0001:选择Px1 0010:选择Px2 0011:选择Px3 0100:选择Px4 0101:选择Px5 0110:选择Px6 0111:选择Px7 1000:选择Px8 1001:选择Px9 1010:选择Px10 1011:选择Px11 1100:选择Px12 1101:选择Px13 1110:选择Px14 1111:选择Px153)开启与该IO 口相对的线上中断/事件,设置触发条件我们要配置中断产生的条件,STM32 可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。
第十九课外部中断0的使用
RI(SCON.0),串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行 帧,由硬件置位 RI。同样,RI 必须由软件清除。
- 专业电子技术交流社区 电子工程师网上家园 -
电子
第 3页
外部中断 0 的使用
电子园
TI(SCON.1),串行口发送中断标志位。当 CPU 将一个发送数据写入串行口发送缓冲 器时,就启动了发送过程。每发送完一个串行帧,由硬件置位 TI。CPU 响应中断时,不能 自动清除 TI,TI 必须由软件清除。
void Int0_Init(void);
//外部中断 0 初始化
void Delayms(unsigned char ucDelay); //延时
- 专业电子技术交流社区 电子工程师网上家园 -
电子
第 5页
外部中断 0 的使用
电子园
//主函数 void main(void) {
2、 电子园分站点
电子园论坛
电子园百科
电子园商城
电子园家园
电子园网址
3、 电子园子站点
外部中断 0 的使用
电子园
51 单片机进阶篇
---外部中断 0 的使用
本文作者:Cepark 更新时间:2010/08/16 作者博客:
- 专业电子技术交流社区 电子工程师网上家园 -
电子
第 1页
外部中断 0 的使用
电子园
中断系统是单片机中一个非常重要的概念,所有的单片机系统中对事件的实时处理都是 通过中断来完成的。中断可以随时停止 CPU 正在处理的工作,转而去处理中断服务程序, 中断服务程序完成以后,再返回原来断点处继续执行。
要了解单片机的中断系统,首先要了解中断源。
单片机中断过程
引言:单片机中断是一种重要的处理方式,能够提高系统的响应速度和处理效率。
通过中断,可以在程序执行过程中立即响应来自外部或内部的事件或信号,并在中断服务程序中进行相应的处理。
本文将详细介绍单片机中断的相关知识和过程。
概述:单片机中断是指在程序执行的过程中,通过特定的中断接口,外部或内部设备向单片机提供中断请求信号,使单片机立即中断正在执行的程序,转而处理中断服务程序。
中断服务程序完成后,再返回到原来的程序继续执行。
正文:1.中断的类型1.1外部中断:外部中断是指通过单片机的外部引脚(如INT0、INT1等)与外部设备相连,当外部设备触发中断请求时,单片机将中断当前程序,转而执行外部中断服务程序。
1.2内部中断:内部中断是指通过单片机内部的一些设备(如定时器、串口等)产生中断请求,触发单片机执行对应的中断服务程序。
1.3软件中断:软件中断是由程序中的特定指令(如软中断指令)产生的中断请求,用于实现手动触发中断。
1.4异常中断:异常中断是指在程序执行过程中出现意外情况(如溢出、除零等)触发的中断请求,用于异常处理。
2.中断的优先级和向量2.1中断优先级:在一个系统中,可能会存在多个中断同时产生的情况,为了保证中断的处理顺序和时序性,每个中断都会有一个优先级,高优先级的中断会中断正在执行的低优先级中断。
2.2中断向量:中断向量是指每个中断具体对应的中断服务程序的地质。
不同的中断有不同的中断向量,通过中断向量表可以查找到对应的中断服务程序地质。
3.中断的触发和响应过程3.1触发过程:当中断请求条件满足时(如外部设备的触发信号、内部设备的计时器溢出等),中断请求信号将传递到中断控制器,中断控制器根据中断优先级和中断屏蔽的设置决定是否响应中断请求。
3.2响应过程:当中断请求被响应后,单片机立即中断正在执行的程序,保存当前程序的上下文信息(如程序计数器、寄存器等),然后转向相应的中断服务程序执行。
3.3中断服务程序:中断服务程序是中断触发后执行的一段特定的程序代码,用于对中断事件进行处理。
嵌入式学习笔记20——AVR单片机之中断
嵌入式学习笔记20——AVR单片机之中断
1.ATmega16单片机具有21个中断源。
每个中断源都有一个独立的中断向量作为中断服务程序的入口地址,而且所有的中断源都有自己独立的使能位。
如果全局中断I和相应的中断使能位都置位,则在中断标志位置位时将执行中
断服务程序。
2.一个中断产生后,全局中断使能位I将被清零,后的中断被屏蔽。
用户可以在中断服务程序里面对I置位从而开全局中断,在中断返回后全
局中断I将重新置位。
3.ATmega16单片机中断向量表介绍:
4.AVR单片机外部中断
ATmega16单片机具有3个外部中断,分别是INT0,INT1,INT2,这3个外部中断都是有单片机的引脚触发的。
需要注意的是,如果允许外部中断的话,即使INT0,INT1,INT2这3个引脚都设置为输出方式,外部中断也会触发。
INT0,INT1外部中断可以选择的触发方式有上升沿触发、下降沿触发以及低
电平触发;INT2只有跳变沿触发(即上升沿触发或下降沿触发),没有电平触发。
使用外部中断涉及到的寄存器有:MCU控制寄存器MCUCR,MCU控制欲状态寄存器MCUCSR,通用中断控制寄存器GICR,通用中断状态寄存器GIFR。
ISC11和ISC10外部中断1,ISC01和ISC00外部中断0
只需关心ISC2位,为零时下降沿触发中断;为1时上升沿触发中断。
第7位全中断使能位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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.状态寄存器SREGbit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0I T H S V N Z CI:全局中断使能位。
在I置位后,单独的中断使能由不同的中断寄存器控制。
若I为0,则禁止中断。
MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断触发控制位与通用 MCU 功能Bit 7 6 5 4 3 2 1 0SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00外部中断 1 由引脚 INT1 激发,如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。
在检测边沿前MCU 首先采样 INT1 引脚上的电平。
如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。
如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成。
SE:MCU休眠使能位SM1~SM0:MCU休眠模式选择SM2 SM1 SM0 休眠模式0 0 0 空闲0 0 1 ADC 噪声抑制模式0 1 0 掉电模式0 1 1 省电模式1 0 0 保留1 0 1 保留1 1 0 Standby(1) 模式1 1 1 扩展Standby(1) 模式ISC11 ISC10 说明0 0 INT1 为低电平时产生中断请求0 1 INT1 引脚上任意的逻辑电平变化都将引发中断1 0 INT1 的下降沿产生异步中断请求1 1 INT1 的上升沿产生异步中断请求外部中断 0 由引脚 INT0 激发,如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。
在检测边沿前MCU 首先采样 INT0 引脚上的电平。
如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。
如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成ISC01 ISC00 说明0 0 INT0 为低电平时产生中断请求0 1 INT0 引脚上任意的逻辑电平变化都将引发中断1 0 INT0 的下降沿产生异步中断请求1 1 INT0 的上升沿产生异步中断请求*//*MCU 控制与状态寄存器-MCUCSR-Bit 7 6 5 4 3 2 1 0JTD ISC2 – JTRF WDRF BORF EXTRF PORF * Bit 6 – ISC2: 中断 2 触发方式控制异步外中断 2 由外部引脚 INT2 激活,如果 SREG 寄存器的 I 标志和 GICR 寄存器相应的中断屏蔽位置位的话。
若 ISC2 写 0 , INT2 的下降沿激活中断。
若 ISC2 写 1 , INT2 的上升沿激活中断。
INT2 的边沿触发方式是异步的。
只要 INT2 引脚上产生宽度大于50ns(1s=1000ms,1 ms=1000μs,1μs=1000ns ) 所示数据的脉冲就会引发中断。
若选择了低电平中断,低电平必须保持到当前指令完成,然后才会产生中断。
而且只要将引脚拉低,就会引发中断请求。
改变 ISC2 时有可能发生中断。
因此建议首先在寄存器 GICR 里清除相应的中断使能位 INT2 ,然后再改变ISC2。
最后,不要忘记在重新使能中断之前通过对 GIFR 寄存器的相应中断标志位 INTF2 写 '1’使其清零。
*//*通用中断控制寄存器- GICRBit 7 6 5 4 3 2 1 0INT1 INT0 INT2 – – – IVSEL IVCE* Bit 7 – INT1: 使能外部中断请求 1 当 INT1 为 '1’ ,而且状态寄存器SREG 的I 标志置位,相应的外部引脚中断就使能了。
MCU通用控制寄存器– MCUCR的中断敏感电平控制1位 1/0 (ISC11与ISC10)决定中断是由上升沿、下降沿,还是 INT1 电平触发的。
只要使能,即使 INT1 引脚被配置为输出,只要引脚电平发生了相应的变化,中断可将产生。
* Bit 6 – INT0: 使能外部中断请求 0 当 INT0 为 '1’ ,而且状态寄存器SREG 的I 标志置位,相应的外部引脚中断就使能了。
MCU通用控制寄存器– MCUCR的中断敏感电平控制0位 1/0 (ISC01与ISC00)决定中断是由上升沿、下降沿,还是 INT0 电平触发的。
只要使能,即使 INT0 引脚被配置为输出,只要引脚电平发生了相应的变化,中断可将产生。
* Bit 5 – INT2: 使能外部中断请求 2 当 INT2 为 '1’ ,而且状态寄存器SREG 的I 标志置位,相应的外部引脚中断就使能了。
MCU通用控制寄存器– MCUCR 的中断敏感电平控制2位 1/0 (ISC2与ISC2)决定中断是由上升沿、下降沿,还是 INT2 电平触发的。
只要使能,即使 INT2 引脚被配置为输出,只要引脚电平发生了相应的变化,中断可将产生*//*通用中断标志寄存器- GIFRBit 7 6 5 4 3 2 1 0INTF1 INTF0 INTF2 – – – – –* Bit 7 – INTF1: 外部中断标志 1INT1引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF1。
如果SREG 的位I以及GICR寄存器相应的中断使能位INT1为”1” ,MCU即跳转到相应的中断向量。
进入中断服务程序之后该标志自动清零。
此外,标志位也可以通过写入 ”0” 来清零。
* Bit 6 – INTF0: 外部中断标志 0INT0引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF0。
如果SREG 的位I以及GICR寄存器相应的中断使能位INT0为”1” ,MCU即跳转到相应的中断向量。
进入中断服务程序之后该标志自动清零。
此外,标志位也可以通过写入 ”0” 来清零。
* Bit 5 – INTF2: 外部中断标志 2INT2引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF2。
如果SREG 的位I以及GICR寄存器相应的中断使能位INT2为”1” ,MCU即跳转到相应的中断向量。
进入中断服务程序之后该标志自动清零。
此外,标志位也可以通过写入 ”0” 来清零。
注意,当INT2中断禁用进入某些休眠模式时,该引脚的输入缓冲将禁用。
这会导致INTF2标志设置信号的逻辑变化*///外部中断0向量端口#pragma interrupt_handler INTER_0:iv_INT0//外部中断1向量端口#pragma interrupt_handler INTER_1:iv_INT1//外部中断2向量端口#pragma interrupt_handler INTER_2:iv_INT2void INTER_init_0(unsigned char a)//a取值0-3 {switch(a){case0:MCUCR&=~(1<<ISC01);MCUCR&=~(1<<ISC00);break;//INT0 为低电平时产生中断请求case1:MCUCR&=~(1<<ISC01);MCUCR|=1<<ISC00;break;//INT0 引脚上任意的逻辑电平变化都将引发中断case2:MCUCR|=1<<ISC01;MCUCR&=~(1<<ISC00);break;//INT0 的下降沿产生异步中断请求case3:MCUCR|=1<<ISC01;MCUCR|=1<<ISC00;break;//INT0 的上升沿产生异步中断请求default :MCUCR|=1<<ISC01;MCUCR&=~(1<<ISC00);break;//设置错误时,下降沿产生异步中断请求}}void INTER_init_1(unsigned char a)//a取值0-3 {switch(a){case0:MCUCR&=~(1<<ISC11);MCUCR&=~(1<<ISC10);break;//I NT1 为低电平时产生中断请求case1:MCUCR&=~(1<<ISC11);MCUCR|=1<<ISC10;break;//INT1 引脚上任意的逻辑电平变化都将引发中断case2:MCUCR|=1<<ISC11;MCUCR&=~(1<<ISC10);break;//INT1 的下降沿产生异步中断请求case 3:MCUCR|=(1<<ISC11)|(1<<ISC10);break;//INT1 的上升沿产生异步中断请求default :MCUCR|=1<<ISC11;MCUCR&=~(1<<ISC10);break;//设置错误时,下降沿产生异步中断请求}}void INTER_init_2(unsigned char a){if(a)MCUCSR|=(1<<ISC2);//上升沿触发;elseMCUCSR&=~(1<<ISC2);//下降沿触发;}void INTER_0(void){show(2,1);//add your code here!}void INTER_1(void){show(1,0);//add your code here!}void INTER_2(void){// show(3,2);//add your code here!}void InterruptInit(void){PORTD |= (1 << PD2)|(1 << PD3); //INT0、INT1端口输出高电平DDRD &= ~(1 << PD2)&~(1 << PD3); //方向:输入PORTB = (1 << PB3); //INT2端口输出高电平DDRB &= ~(1 << PB3); //方向:输入GICR |= (1 << INT0)|(1 << INT1)|(1<<INT2);//使能INT0,INT1GIFR&=~(1<<INTF0)&~(1<<INTF1)&~(1<<INTF2);//清零中断标志SREG|=0x80;//使能全局中断}///////////////////////////////////////////////////////////////////#include "smg.h"#pragma data:code//共阳数码管断码表consttable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xb6,0xff}; //**********1ms基准延时程序**********************************void delay(uint ms){uint i,j;for(i=0;i<ms;i++){for(j=0;j<1141;j++);}}//***********系统初始化************************* void SmgInit(void){DDRA|=BIT(PA2);//设置PA2为输出DDRB=0XFF;//设置PB口为输出PORTA|=BIT(PA2);//PA2=1,使能控制LED的74HC573 PORTB|=0XFF;//PB口输出1111 1111,使得所有的LED 熄灭PORTA&=~BIT(PA2);//PA2=0,禁止控制LED的573,使控制LED的数据锁存DDRA|=BIT(PA3);//设置PA3(smgd_lk)为输出DDRA|=BIT(PA4);//设置PA4(SMGB_LK)为输出DDRA|=BIT(PA6);//设置蜂鸣器控制口为输出PORTA&=~BIT(PA6);//关闭蜂鸣器}//***********数码管动态扫描程序*************************void show(uchar data,uchar bit){PORTA|=BIT(3);//PA3=1,使能控制数码管数据的74HC573PORTB=table[data];//送数码管断码数据PORTA&=~BIT(3);//关闭控制数码管数据的573,使得数码管数据锁存PORTB=0X00;//PB口输出0000 0000PORTA|=BIT(4);//PA4=1,使能控制数码管数据口的573 PORTB|=BIT(bit);//数码管位选PORTA&=~BIT(4);//数码管位选锁存delay(1);//稍微延时}///////////////////////////////////////////////// //////////////////////////////#include "smg.h"#include "interrupt.h"void main(void){// unsigned char i;SmgInit();InterruptInit();INTER_init_0(2);INTER_init_1(2);INTER_init_2(0);while(1) {;}}。