中断程序
简述中断的流程

中断的流程引言中断是计算机系统中一种重要的机制,用于处理硬件设备请求、异常情况和优先级较高的任务。
在任何计算机系统中,中断都起到极其关键的作用。
本文将详细探讨中断的流程。
中断的定义和分类中断是指计算机在执行某个任务的过程中,临时停止当前正在运行的程序,转而去执行另一段程序(中断服务程序),处理发生的事件。
中断可以分为硬件中断和软件中断两种类型。
硬件中断硬件中断是由外部设备的请求引起的中断,常见的硬件中断包括定时器中断、外部设备中断(如键盘、鼠标等)和异常中断(如除零错误、缺页错误等)。
软件中断软件中断是由程序员在程序中主动发出的中断请求,通过软件指令触发,实现用户与硬件的交互。
例如,在操作系统中,通过系统调用可以触发软件中断。
中断的流程中断的触发中断的触发是由硬件设备或软件指令生成的,当满足中断触发条件时,中断信号将被发送给中断控制器。
中断控制器收到中断信号后,会进行中断的响应。
它首先会保存当前的程序状态,包括程序指针、寄存器的值等,并将程序控制权转移给中断服务程序。
中断服务程序的执行中断服务程序是一个与中断相关的程序段,用于处理特定的中断事件。
它会根据中断类型进行相应的处理操作,如读取设备数据、更新系统状态等。
初始化中断服务程序中断服务程序在执行之前,需要进行初始化工作。
这包括保存当前状态、设置中断服务程序的入口地址等。
中断服务程序的执行过程中断服务程序一般分为两个阶段:前半部分和后半部分。
前半部分中断服务程序的前半部分主要是进行必要的初始化工作,以及保存当前的程序状态。
此阶段的目标是尽快地使中断事件得到响应,保证硬件设备的正常工作。
后半部分中断服务程序的后半部分是真正的中断处理过程,它会根据中断类型进行具体的处理操作。
处理完毕后,中断服务程序将恢复中断之前的状态,包括恢复寄存器的值、恢复程序的执行等。
中断服务程序的完成与返回中断服务程序的完成意味着中断处理的终结。
在完成之前,中断服务程序需要恢复中断之前的状态,并将程序控制权返回给被中断的程序或操作系统。
三菱FX系列中断指令与中断程序

三菱FX系列中断指令与中断程序主讲:雷老师湖北祥辉电气自动化培训中心三菱FX系列PLC的中断指令[IRET、El、DI(FNC03、FNC04、FNC05)] 1.中断指令的使用说明(1)IRET:中断子程序返回主程序;EI:允许中断;DI:禁止中断。
图6-19所示为中断指令使用说明。
EI~DI为允许中断区间,当中断条件出现在主程序此区间内则转向执行有中断标号的子程序。
(2)中断子程序开始有中断标号,由IRET返回。
中断子程序一般出现在主程序后面。
中断标号必须对应允许中断的条件。
在中断条件0~8中,0~5表示与输入条件X0~X5对应,在图6-19中中断标号1001表示X0为1在上升沿执行中断子程序I,I101表示X1为1在上升沿执行子程序Ⅱ;6~8为定时器中断条件(标号),如I610表示指定由定时器6每计时10ms执行一次中断子程序。
同理1899表示由定时器8每计时99ms执行一次中断子程序。
(3)中断子程序可嵌套最多二级,多个中断信号同时出现,中断标号低的有优先权。
(4)对中断标号为I00□~I50□的输入中断,对应M8050~M8055为1时中断被禁止。
对中断标号为I6□□~I8□□的定时器中断,对应M8056~M8058为1时中断被禁止。
(5)在特殊场合主程序设计中采用中断指令,可以有目的预先应付突发事件。
中断指令也适用于一些必须定时监控诊断的主程序中。
(6)中断要用EI允许中断指令和中断返回IRET,中断中需要使用计时器的话,请使用T192-T199和T246-T2492.应用举例(1)外部输入中断子程序。
图6-20所示为一外部输入中断子程序。
在主程序执行时,当特殊辅助继电器M8050=0时,标号I001的中断子程序允许执行。
当PLC外部输入信号X0有上升沿信号时,执行中断程序一次,执行完毕返回主程序。
Y10由M8013驱动每秒内一次,而Y0输出是当X0在上升沿脉冲时,驱动其为“1”信号,此时Y11输出就由M8013当时状态所决定。
单片机外部中断详解及程序

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

PLC的中断功能PLC的中断功能是指在运行过程中发生特定事件时,可以中断当前的程序执行,转而执行中断程序。
中断是PLC控制系统中的一项重要功能,它可以使PLC在需要时立即响应一个外部事件,例如输入信号的变化或特定的计时事件。
本文将详细介绍PLC的中断功能及其应用。
PLC中断的基本原理是在程序执行过程中,当满足中断要求的条件时,PLC会中断当前的程序执行,转而去执行相应的中断程序。
这样可以在不影响当前程序执行的情况下,及时响应外部的事件,提高系统的响应速度和实时性。
PLC中断通常分为两种类型:硬中断和软中断。
硬中断是通过硬件电路来实现的,一般用于处理高速的输入信号。
软中断是通过编程软件来实现的,可以根据具体的需求进行灵活地配置。
在PLC中,中断功能的实现通常需要以下几个关键步骤:1.中断请求:当发生中断要求的事件时,PLC会接收到相应的中断请求信号。
中断请求可以由外部硬件电路产生,也可以由软件程序产生。
2.中断屏蔽:PLC在接收到中断请求后,会检测当前的中断屏蔽状态。
如果中断屏蔽被设置为禁止,PLC将忽略中断请求;如果中断屏蔽被设置为允许,PLC会继续执行下一步的中断处理。
3.中断服务程序:在中断处理过程中,PLC会中断当前的程序执行,转而执行中断服务程序。
中断服务程序可以是预先定义好的程序段,也可以是根据具体的需求编写的用户自定义程序。
4.中断结束:当中断服务程序执行完毕后,PLC会返回到之前中断发生的地方,恢复中断之前的程序执行状态。
1.高速输入信号处理:在一些应用中,需要对高速输入信号进行实时的处理。
通过使用PLC的中断功能,可以及时响应这些高速信号,提高系统的响应速度和准确性。
2.实时报警处理:在工业自动化控制系统中,对于一些故障或异常情况需要及时报警。
通过使用中断功能,可以在检测到异常事件时立即执行相应的报警程序,保证生产过程的安全和稳定。
3.特定事件触发:有些应用需要在特定的时间或条件下执行一些任务。
51单片机中断程序大全

//实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<> // 包含51单片机寄存器定义的头文件void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(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的模式1TH1=(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; //将引脚输出电平取反TH1=(65536-921)/256; //定时器T0的高8位赋初值TL1=(65536-921)%256; //定时器T0的高8位赋初值}}://实例44:将计数器T0计数的结果送P1口8位LED显示#include<> // 包含51单片机寄存器定义的头文件sbit S=P3^4; //将S位定义为引脚void main(void){// EA=1; //开总中断// ET0=1; //定时器T0中断允许TMOD=0x02; //使用定时器T0的模式2TH0=256-156; //定时器T0的高8位赋初值TL0=256-156; //定时器T0的高8位赋初值#TR0=1; //启动定时器T0while(1)//无限循环等待查询{while(TF0==0) //如果未计满就等待{if(S==0) //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示}TF0=0; //计数器溢出后,将TF0清0}}//实例45:用定时器T0的中断控制1位LED闪烁)#include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0^while(1);}函数功能:定时器T0的中断服务程序**************************************************************/void Time0(void) interrupt 1 using 0寄存器{D1=~D1; //按位取反操作,将引脚输出电平取反TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}|//实例46:用定时器T0的中断实现长时间定时#include<> // 包含51单片机寄存器定义的头文件sbit D1=P2^0; //将D1位定义为引脚unsigned char Countor; //设置全局变量,储存定时器T0中断次数void main(void){EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式2;TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0Countor=0; //从0开始累计中断次数while(1);}/**************************************************************函数功能:定时器T0的中断服务程序**************************************************************/ void Time0(void) interrupt 1 using 0{@Countor++; //中断次数自加1if(Countor==20) //若累计满20次,即计时满1s{D1=~D1; //按位取反操作,将引脚输出电平取反Countor=0; //将Countor清0,重新从0开始计数}TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}//实例47:用定时器T1中断控制两个LED以不同周期闪烁#include<> // 包含51单片机寄存器定义的头文件)sbit D1=P2^0; //将D1位定义为引脚sbit D2=P2^1; //将D2位定义为引脚unsigned char Countor1; //设置全局变量,储存定时器T1中断次数unsigned char Countor2; //设置全局变量,储存定时器T1中断次数void main(void){EA=1; //开总中断ET1=1; //定时器T1中断允许TMOD=0x10; //使用定时器T1的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值—TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1; //启动定时器T1Countor1=0; //从0开始累计中断次数Countor2=0; //从0开始累计中断次数while(1);}void Time1(void) interrupt 3 using 0{Countor1++; //Countor1自加1Countor2++; //Countor2自加1。
中断服务程序流程图

第一讲:第六章I/O接口原理—接口、端口、编址回顾:微机系统的层次结构,CPU、主机、接口电路及外部设备之间的结构关联,输入/输出的一般概念。
重点和纲要:微机系统主机与外部设备之间的数据传送,包括I/O端口的寻址方式,输入/输出的传送控制方式。
讲授内容:6。
1 输入/输出数据的传输控制方式一、输入/输出的一般概念1.引言输入/输出是微机系统与外部设备进行信息交换的过程。
输入/输出设备称为外部设备,与存储器相比,外部设备有其本身的特点,存储器较为标准,而外部设备则比较复杂,性能的离散性比较大,不同的外部设备,其结构方式不同,有机械式、电动式、电子式等;输入/输出的信号类型也不相同,有数字信号,也有模拟信号;有电信号,也有非电信号;输入/输出信息的速率也相差很大。
因此,CPU与外部设备之间的信息交换技术比较复杂.CPU与外设之间的信息交换,是通过它们之间接口电路中的I/O端口来进行的,由于同一个外部设备与CPU之间所要传送的信息类型不同,方向不同,作用也不一样(例如数据信息、状态信息、控制信息、输入/输出等),所以接口电路中可以设置多个端口来分别处理这些不同的信息.2.输入/输出端口的寻址方式微机系统采用总线结构形式,即通过一组总线来连接组成系统的各个功能部件(包括CPU、内存、I/O端口),CPU、内存、I/O端口之间的信息交换都是通过总线来进行的,如何区分不同的内存单元和I/O端口,是输入/输出寻址方式所要讨论解决的问题。
根据微机系统的不同,输入/输出的寻址方式通常有两种形式:(1).存储器对应的输入、输出寻址方式这种方式又称为存储器统一编址寻址方式或存储器映象寻址方式。
方法:把外设的一个端口与存储器的一个单元作同等对待,每一个I/O端口都有一个确定的端口地址,CPU与I/O端口之间的信息交换,与存储单元的读写过程一样,内存单元与I/O端口的不同,只在于它们具有不同的的地址。
优点:①CPU对I/O端口的读/写操作可以使用全部存储器的读/写操作指令,也可以用对存储器的不同寻址方式来对I/O端口中的信息,直接进行算术、逻辑运算及循环、移位等操作。
单片机指令的中断处理方法
单片机指令的中断处理方法中断是指单片机在执行某个程序的过程中,突然暂停当前的工作,去处理另外一个优先级更高的任务,待处理完后再回到原来的地方继续执行。
在单片机系统中,中断处理是一种重要的功能,能够提高系统的实时性和可靠性。
本文将介绍常见的单片机中断处理方法。
1. 软件中断处理方法软件中断是一种通过修改程序计数器(PC)的值,使之指向中断服务程序的起始地址的中断方式。
在单片机中,软件中断通常使用特殊的指令来触发,比如软中断指令"INT"。
具体步骤如下:(1)在程序中插入软中断指令,指定软中断号。
(2)程序执行到软中断指令时,自动跳转到中断服务程序的起始地址。
(3)中断服务程序执行完毕后,使用"RETI"指令返回到中断发生前的位置继续执行。
2. 硬件中断处理方法硬件中断是指通过外部硬件设备的信号触发单片机的中断,使其进行相应的中断处理。
通常,硬件中断由硬件的工作方式决定,例如计时器溢出、外部中断引脚的边沿触发等。
具体步骤如下:(1)配置中断使能位和中断标志位。
(2)设置中断服务程序的起始地址。
(3)当中断事件发生时,单片机暂停当前任务,自动跳转到中断服务程序的起始地址执行。
(4)中断服务程序执行完毕后,自动返回到中断发生前的位置继续执行。
3. 嵌套中断处理方法嵌套中断是指在中断服务程序执行期间,有更高优先级的中断事件发生,导致当前中断服务程序被打断,处理更高优先级的中断事件,然后再返回到之前的中断服务程序中继续执行。
嵌套中断可以保证对高优先级事件的及时响应。
具体步骤如下:(1)配置中断优先级,确定各个中断的优先级关系。
(2)当低优先级中断发生时,中断服务程序会被高优先级中断打断。
(3)处理完高优先级中断后,返回到低优先级中断服务程序的被打断位置继续执行。
(4)低优先级中断被完全处理后,才会回到主程序中继续执行。
总结:中断处理在单片机系统中起着重要作用,能够实现对多个任务的快速切换和响应。
单片机中断定时程序
参考程序:
MOV IE, #00H ;禁止中断 MOV TMOD, #60H ;设置定时器1为方式2 MOV TH1, #9CH ;保存计数初值 MOV TL1, #9CH ;预置计数初值 SETB TR1 ;启动定时 JBC TF1, LOOP ;查询计数溢出 AJMP DEL INC A ;累加器加1 AJMP DEL ;重复循环
任务: 1)T0工作方式的设定: 选择方式1(16位方式),最大定时131ms,本 题拟定时时长为100ms。因此TMOD为01H。
2)定时常数的设定: X=216-100ms/2us =15536=3CB0H 即:TH0应装3CH,TL0应装0B0H。 3)中断管理: 允许T0中断,开放总中断 即:IE应装10000010B。 4)启动定时器T0: SETB TR0 5)设置软件计数器初值:(如使用R7) 即R7应装0AH 6)动态停机:SJMP $
参考程序:
MOV IE, #00H ;禁止中断 MOV TMOD, #02H ;设置定时器0为方式2 MOV TH0, #0CEH ;保存计数初值 MOV TL0, #0CEH ;预置计数初值 SETB TR0 ;启动定时 JBC TF0, LOOP1 ;查询计数溢出 AJMP LOOP CPL P1.0 ;输出方波 AJMP LOOP ;重复循环
;恢复定时常数
;重装R7初值
ORG 0000H 完整程序如下: AJMP MAIN ORG 000BH AJMP T0INT ORG 0030H MAIN: MOV TMOD, #01H;设定T0为方式1定时 MOV TH0, #3CH ;装入定时常数高8位 MOV TL0, #0B0H ;装入定时常数低8位 MOV IE, #82H ;开放T0中断 SETB TR0 ;启动T0 MOV R7, #0AH ;设置软件计数器 SJMP $ T0INT:MOV TH0, #3CH ;恢复定时常数 MOV TL0, #0B0H DJNZ R7, NEXT CPL P1.0 MOV R7, #0AH NEXT:RETI END
mcu 中断处理流程
mcu 中断处理流程
MCU(微控制器)的中断处理流程通常包括以下几个步骤:
1. 检测中断:MCU不断监视外部事件或内部事件,以检测是否有中断发生。
一旦检测到中断,MCU将暂停当前正在执行的程序,保存当前的程序状态,以便在中断处理完毕后恢复执行。
2. 判断中断源:MCU通过中断向量表或中断控制器来确定发生中断的具体源。
不同的中断源对应不同的处理程序入口地址。
3. 保存现场:MCU将保存当前的程序状态,以便在处理完中断后能够正确地恢复程序的执行。
4. 跳转到中断处理程序:MCU通过跳转指令将程序的执行跳转到对应的中断处理程序入口地址。
5. 执行中断处理程序:MCU执行中断处理程序,完成相应的操作。
6. 恢复现场:在中断处理程序执行完毕后,MCU将恢复之前保存的程序状态,以便能够正确地继续执行程序。
7. 返回主程序:MCU通过返回指令将程序的执行返回到被中断的程序,继续执行。
以上是MCU中断处理的一般流程,具体实现可能会因不同的MCU型号而有所不同。
在实际应用中,需要根据具体的MCU型号和中断源,编写相应的中断处理程序。
定时器中断流程图
定时器中断流程图定时器中断是指在特定时间间隔内触发的一种中断方式,它可以用来实现定时任务、定时采样等功能。
在嵌入式系统中,定时器中断是非常常见的应用场景,下面我们来看一下定时器中断的流程图。
首先,定时器中断的触发是由硬件定时器来完成的。
硬件定时器通常包括计数器、比较器和中断控制器等部分。
当计数器的值达到比较器设置的值时,就会触发中断请求,然后中断控制器会将中断信号发送给CPU。
接着,CPU在接收到定时器中断的中断请求后,会根据中断向量表找到对应的中断服务程序。
中断服务程序是由用户编写的,它通常包括中断处理函数和中断返回指令。
中断处理函数是用来处理定时器中断事件的,它可以执行一些特定的操作,比如更新定时器的计数值、执行定时任务等。
而中断返回指令则是用来结束中断服务程序,将CPU的控制权返回给原来的程序。
最后,当中断服务程序执行完毕后,CPU会继续执行原来的程序。
如果定时器中断是周期性的,那么硬件定时器会在下一个周期内再次触发中断请求,整个流程就会循环执行。
总的来说,定时器中断的流程图可以简单描述为,硬件定时器触发中断请求 -> CPU响应中断请求 -> 执行中断服务程序 -> 中断服务程序结束 -> CPU恢复原程序执行。
这样的流程图清晰地展现了定时器中断的工作原理和执行过程。
在实际应用中,定时器中断的流程图可以根据具体的硬件平台和软件需求进行定制和优化。
比如可以根据不同的定时任务设置不同的定时器中断周期,也可以通过中断嵌套或者优先级设置来实现多个定时器中断的协同工作。
因此,对于嵌入式系统开发人员来说,熟练掌握定时器中断的流程图和原理是非常重要的。
总之,定时器中断是嵌入式系统中常用的中断方式,它通过硬件定时器和CPU的配合,实现了定时任务的精确执行。
通过上面的流程图,我们可以清晰地了解定时器中断的工作流程,这对于嵌入式系统的开发和调试都具有重要的指导意义。
希望本文对您有所帮助,谢谢阅读!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AVR外部中断范例 interrupt
AVR仿真器 AVR编程器 二合一 AVR JTAG与ISP 二合一V2.5 【经典推荐】 ¥298.00元 国产 AVR JTAG ICE mkII 仿真下载器(ATJTAGICE2) 【推荐】 ¥650.00元 ATmega128 开发板 学习板 EasyAVR M128 SK-A 四合一(核心板、开发板、仿真器、下载烧录器) ¥498.00元 单片机实验箱 AVR单片机实验箱 AVR单片机实验仪 高校首选AVR单片机学习实验箱 ¥798.00元 EasyAVR ATmega16开发
板 仿真器 编程
器 三合一 特价
(开发板、仿真
器、下载烧写器)
¥298.00元
你现在的位置:AVR与虚拟仪器>>AVR使用范例>>AVR外部中断范例论坛
AVR使用范例--AVR外部中断范例
本页关键词: 单片机外部中断 外部中断的应用 AVR外部中断 INTERUPTS
关于AVR中断:
系统在正常运行主程序时,如果突然有一个重要的任务要马上处理,那么系统就要保存现在的工作,
然后再去处理这个任务,执行这个重要任务完毕以后再返回原来的主程序继续运行,这就是中断。
主程序一旦进入中断服务程序,那么AVR芯片将自动的关闭全局中断,在这个期间不再执行其它的
中断请求,直到中断程序结束以后芯片才自动的重新开放全局中断。(注意,在这个期间某些中断请求可能
会被丢弃,某些请求会留下中断请求标致,一旦当前的中断执行完毕,这个有中断标致的请求就有可能马
上得到响应,如INT0的下降沿触发就会留下中断请求标致,而低电平触发就不会流下中断请求标致)。如
果你想在执行中断服务程序时响应另外一个更重要的中断,那么就要在中断服务程序中加入一条打开全局
中断的语句。
使用ICC快速建立中断服务程序 程序文件[txt]
使用ICCAVR Application Builder进行如下图所示的设置。 可以设置是否使用中断,上升延,下降
延,低电平,任意的逻辑电平变化。
将生成的程序进行修改,DDRA = 0x01;PORTD = 0x0C; ,添加MAIN函数,如下
//ICC-AVR application builder : 2006-12-8 17:04:44
// Target : M16
// Crystal: 7.3728Mhz
#include
#include
unsigned int i=0;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x01;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x0C; //使INT0,INT1对应口上拉电阻有效
DDRD = 0x00; //必须设置INT0,INT1对应口为输入
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0
i++; //在中断里进行操作
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
//external interupt on INT1
PORTA = 0x01; //在中断里进行操作
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x08; //INT1 的下降沿产生异步中断请求,INT0上升延
GICR = 0xC0; //INT0和INT1使能
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{
init_devices();
while(1) //死循环等待中断
;
}
相关解释
1. #pragma interrupt_handler int0_isr:2
2. 中断的约定表示方法:int0_isr有一个与之对应的应用程序void int0_isr(void),2为中断向量,值
越小,优先级越高,INT0的优先级仅次于复位。
3. MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断触发控制位与通用MCU 功能
4. 通用中断控制寄存器- GICR 使能或禁用外部中断请求
使用过程中:为了降低干扰,中断引脚请加上一个4.7K的上拉电阻,还可以根据实际需要,加上电
容滤波,防抖动。
更详细的内容,AVR外部中断,时钟中断,串行通信,IIC综合实例 一个中断示例程序[txt]
AVR 与虚拟仪器欢迎交换链接,