ATMega16单片机外部中断的使用
- 格式:doc
- 大小:26.00 KB
- 文档页数:3
atmege16外部中断程序/****************************************** 功能:演示ATMEGA16的3个外部中断程序编辑环境:ICCAVR******************************************/#include<iom16v.h>#include<macros.h>#define uint unsigned int#define uchar unsigned char#define beep_0 (PORTD&=~(1<<PD7)) #define beep_1 (PORTD|=(1<<PD7))//蜂鸣器响uint count;/******************************************* 三个外部中断声明,注意中断向量号*******************************/#pragma interrupt_handler Exint0:2#pragma interrupt_handler Exint1:3#pragma interrupt_handler Exint2:19/*************************************系统延时函数************************************/void delay(uint ms){uint i,j;for(i=0;i<ms;i++){for(j=0;j<1140;j++);}}/**************************************端口初始化每个外部中断端口是固定的****************************************/void port_init(){DDRA=0XFF;PORTA=0XFF;DDRB&=(0<<PB2);//INT2PORTB|=(1<<PB2);DDRD&=(0<<PD2);//INT0PORTD|=(1<<PD2);DDRD&=(0<<PD3);//INT1PORTD|=(1<<PD3);}/***********************************外部中断初始化*******************************/void INT_init(){SREG=0X80;//打开全局中断GICR|=(1<<INT0)|(1<<INT1)|(1<<INT2);//三个中断使能MCUCR=(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00);//I NT0,INT1下降沿触发MCUCSR=(0<<ISC2);//INT2下降沿触发中断}/***************************************** 流水灯函数****************************************/ void LED_1(){uchar i;for(i=0;i<8;i++){PORTA=~BIT(i);delay(200);}}/*********************************** LED_2函数**********************************/void LED_2(){PORTA=0X0F;delay(500);PORTA=0XF0;delay(500);}/********************************LED_3函数************************************/ void LED_3(){PORTA=0X81;delay(500);PORTA=0X7E;delay(500);}/************************************ 外中断0函数**********************************/ void Exint0(){LED_2();}/********************************** 外中断1函数***********************************/ void Exint1(){LED_3();}/************************外中断2函数***********************/void Exint2(){DDRD=(1<<PD7);for(count=0;count<4;count++) {beep_0;delay(200);beep_1;delay(200);}}/********************************* 主函数*********************************/ void main(){port_init();//端口初始化INT_init();//中断初始化while(1)// 当非0值时执行下面函数{LED_1();//流水灯函数}}。
AVR单片机中断实现ATmega16 INT ISR(INT0_vect)内容来源:本站发布时间:[2010-11-28]查看次数:42332.21 实例功能前面例子中分别介绍了按键控制发光二极管的亮灭,但是我们注意到,在程序中需要一直检测按键的状态,这样明显的浪费了单片机的资源,降低了单片机的工作效率,。
那么有没有一种方法可以让单片机不用一直检测按键的状态,而只在有按键动作时才去响应呢?当然有!单片机中除了具有基本输入输出功能的作用外,还有专门检测外界信号并作出响应的中断系统。
在本例中,通过利用外部中断实现单片机对按键事件的响应和处理。
本例中三个功能模块描述如下:● 单片机系统:对按键事件产生的中断时间作出响应,并在数码管上显示按键按下的次数。
● 外围电路:通过将按键连接到单片机的外部中断检测端口,实现中断产生电路,数码管显示电路用于指示按键的按下状态。
● 软件程序:编写AVR单片机的外部中断服务程序,从而实现对中断事件的响应。
2.2.2 器件和原理1单片机的中断系统关于中断的概念可以在一般的教材中找到,本例中只做简要叙述,不再详细说明。
中断属于一种对事件的实时处理过程。
中断源可能随时停止单片机当前正在处理的工作,转而去处理中断事件,待中断时间处理完毕之后,再返回原来工作的断点处,继续原来的工作。
对于单片机的中断系统,需要了解这几个概念:中断源、中断信号、中断向量、中断优先级、中断嵌套、中断控制(屏蔽)、中断响应条件、中断响应过程(中断服务程序)。
●中断源中断源是指能够向单片机发出中断请求信号的部件和设备。
对于单片机来讲,往往存在多个中断源。
中断源一般可分为内部中断源和外部中断源。
单片机内部集成的许多功能模块,如定时器、串行通讯口、模/数转换器等,它们在正常工作时往往无需CPU参与,而当处于某种状态或达到某个规定值需要程序控制时,会通过发出中断请求信号通知CPU。
这一类的中断源位于单片机内部,称作内部中断源。
单片机外部中断详解及程序单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。
比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。
在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。
如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。
但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。
因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。
实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。
下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。
电路结构和接线不变,仅把程序改为下面的形式。
#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次}把上述程序进行编译并下载到单片机中,可以看到结果与第二个示例中的完全一致。
实验5-外部中断外部中断是指由CPU外部发出的中断请求,例如外部设备的输入/输出请求或定时器中断。
在此实验中,我们将学习如何使用ATmega16的外部中断功能。
硬件连接:- 将按钮连接到MCU的外部中断引脚(INT0或INT1)- 将LED连接到MCU的输出引脚软件实现:1. 配置外部中断在ATmega16中,外部中断引脚被分为INT0和INT1,可以使用MCU的寄存器来配置它们。
下面是一些相关的寄存器:- MCUCR:MCU控制寄存器,用于设置外部中断引脚的触发方式(如下降沿、上升沿、逻辑电平等)。
- GICR:全局中断控制寄存器,用于启用/禁用外部中断。
下面是一些示例代码来配置INT0为下降沿触发:```c// 设置INT0引脚的触发方式为下降沿MCUCR |= (1 << ISC01);MCUCR &= ~(1 << ISC00);// 启用INT0中断GICR |= (1 << INT0);```2. 实现中断服务程序中断服务程序(ISR)是在响应中断时自动调用的函数。
在此实验中,我们将为INT0编写一个简单的ISR,使连接到MCU的LED闪烁。
```c#include <avr/io.h>#include <avr/interrupt.h>#define LED PB0#define BUTTON PD2// INT0中断服务程序ISR(INT0_vect){PORTB ^= (1 << LED); // 翻转LED状态}// 启用全局中断sei();while (1){// 延时一段时间for (volatile uint16_t i = 0; i < 10000; i++);}}```在ISR中,我们将LED引脚的状态翻转,以使其闪烁。
注意,ISR应该尽可能地短,以便快速地响应中断请求。
3. 测试实验现在将MCU连接到计算机,并上传上述代码。
ATmega16定时器/计数器中断及编程Atmega16内部有三个定时器/计数器T/C0,T /C1.T/C2,其中T/C0,T/C2为8为定时器,T/C1为16定时器,这里从高级语言编程的使用出发,简要介绍T/C0的使用。
定时器中断的过程是:当中断发生时,程序控制立即从主程序转移到中断服务程序,执行完中断服务程序后再返回到主程序的中断处继续执行后续的程序。
利用中断可以节省CPU资源。
先了解几个寄存器。
MCUCR---MCU控制寄存器;MCUCSR-----MCU控制与状态寄存器;GICR-----通用控制寄存器;GIFR-----通用中断标志寄存器;TIFR---定时器中断标志寄存器,TIMSK----定时器中断屏蔽寄存器。
这几寄存器保留默认设置即可,需要编程时了解并设置的寄存器为TCCR0----T/C0控制寄存器,TCNT0----T/C0的计数初始值,OCR0----输出比较寄存器,OC0/PB3----输出比较引脚。
TCCR0为8位寄存器,从高位到低位的名称依次是:FOC0,WGM00,COM01,COM00,WGM01,CS02,CS01,CS00.TCCR0各个控制位的作用:(1) CS02,CS01,CS00控制时钟选择和预分频,如100表示预分频为256(2) WGM01,WGM00控制波形产生模式,分为普通模式(用于普通计时),CTC模式(用于频率发生),快速PWM模式(用于PWM调速,功率调节),相位修正PWM模式。
如10表示CTC模式。
(3) COM01,COM00控制比较匹配输出模式。
在不同的波形产生模式下其逻辑值功能表不同,如在普通模式或CTC模式下01表示比较匹配发生OC0取反。
(4)FOC0,中断标志位,设为零即可。
至于上述控制位的逻辑值功能表可查阅Atmega16的中文数据手册,在官方网上会有英文版。
完成TCCR0的设定,接下来是设置TCNT0,OCR0寄存器了。
关于溢出中断不管是哪个单片机都是不断累加,使其寄存器溢出触发中断,然后跳转到中断函数处执行中断服务程序。
对于定时器初值的设定可以加深对定时器的工作原理的理解。
ATMega16 里面有8位和16位两种定时器,他们何时会溢出这个是固定的,也就是到达他们的计数范围的最大值就会产生中断,8位的定时器的最大计数范围是0~256(2的8次方),就是累加到256后他就会产生中断,16位的定时器最大计数范围是0~65536(2的16次方),累加到65536时他就会产生中断。
而我们所谓的计数初值是就是要设定定时器在什么地方开始计数,以8位定时器为例比如:初值为100,所以定时器从100开始累加,累加了156次,加到256后产生中断,这就是中间消耗的时间和指令周期就是我们要去设定的时间;再比如:初值是200,所以定时器从200开始累加,累加了56次,加到256后产生中断,可以看到第一定时要累加156次才会中断而第二次只要累加56次就会产生中断,显然第一次设定的时间要比第二次的长。
定时器不仅可以定时,而且我们用到定时器的时候往往是需要精确定时的时候。
我们可以计算出我们设定的初值会在多长时间后进入中断。
下面的是8位定时器设定的时候需要用的寄存器:实验平台:ATMega16晶振: 11.0592 MHz对初值的计算:1,11059200 / 1024 = 10800 设定为1024倍分频,得到每1秒需要进行多少次累加2,10800 / 100 = 108 得到10ms 的定时需要进行多少次累加(第一步计算出每一秒进行的累加次数,由于一秒是100个10ms,故除数为100)3,256 - 108 = 148 计算范围最大值(8位寄存器)减去要累加的时间,得到初值,即从哪里开始累加才能在溢出时为10ms的时间。
4,148 <==> 0x94 得到十六进制值,赋值给TCNT0#实验代码:定时10ms_ICCAVR#include <iom16.h>unsigned char flag = 0;void timer_init(void){TCCR0 = 0x05; //进行1024分频TCNT0 = 0x94; //赋计数初值TIMSK_TOIE0 = 1; //开使能SREG_I = 1; //开总中断}#pragma vector = TIMER0_OVF_vect__interrupt void time0_normal(void){TCNT0 = 0x94; //重新赋初值flag++;}void main(void){timer_init();DDRB_Bit0 = 1;while(1){if(flag == 100) //10ms 重复100次,即为1秒 {PORTB_Bit0 = ~PORTB_Bit0; //让LED闪烁flag = 0;}}}//+++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++//实验平台:ATMega16晶振:11.059216位定时器初值设定:1,11059200 / 256 = 43200 设定256倍分频,得到每1秒需要进行多少次累加2,65536 - 43200 = 22336 计算范围最大值减去要累加的时间,得到初值,即从哪里开始累加才能在溢出时为1s的时间。
一、引言在单片机的学习和应用中,外部中断是一个非常重要的功能。
蓝桥杯单片机外部中断的基本操作,对于单片机编程的初学者来说是一个重要的知识点。
本文将从蓝桥杯单片机外部中断的定义、原理、具体操作以及个人观点等方面进行全面的介绍和讨论。
二、蓝桥杯单片机外部中断的定义和原理蓝桥杯单片机外部中断是指当单片机在执行程序时,外部的某个事件(比如按键触发、传感器检测等)发生时,可以通过中断的方式及时通知单片机,使单片机停止当前的工作,转而去处理这个事件,处理完成后再返回原来的工作。
外部中断的原理是通过单片机的外部中断引脚,当引脚的电平变化时,让单片机执行相应的中断服务程序。
三、蓝桥杯单片机外部中断的具体操作1. 设置外部中断引脚:首先需要配置单片机的外部中断引脚,使其能够检测到外部事件的变化。
2. 初始化外部中断:在程序中需要对外部中断进行初始化,包括中断触发方式(上升沿触发、下降沿触发等)、中断服务程序的位置区域等。
3. 编写中断服务程序:针对不同的外部事件,编写相应的中断服务程序,确保可以及时响应外部中断。
4. 开启外部中断:在程序运行过程中,需要开启外部中断功能,以便单片机能够正常地接收外部中断请求。
四、个人观点和理解对于蓝桥杯单片机外部中断的基本操作,我认为非常重要且实用。
通过外部中断,单片机可以更加灵活地响应外部事件,提高系统的实时性和可靠性。
在实际的项目开发中,合理地运用外部中断能够有效地简化系统的设计,并提高系统的整体性能。
五、总结蓝桥杯单片机外部中断的基本操作对于单片机编程的学习和应用具有重要的意义。
通过本文的介绍,我们对外部中断的定义、原理、具体操作以及个人观点有了更深入的了解。
希望能够在今后的学习和实践中,充分利用外部中断这一功能,提高单片机系统的性能和可靠性。
六、结语通过本文的介绍,相信读者对蓝桥杯单片机外部中断的基本操作有了更深入的了解。
希望读者在今后的学习和实践中,能够充分利用这一功能,提高单片机系统的性能和可靠性。
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,此时程序会自动转到中断程序子函数。
然后有硬件自动清零,以等待下一次的中断发生。
atmege16外部中断程序/****************************************** 功能:演示ATMEGA16的3个外部中断程序编辑环境:ICCAVR******************************************/#include;#include;#define uint unsigned int#define uchar unsigned char#define beep_0 (PORTD&=~(1<<PD7))#define beep_1 (PORTD|=(1<<PD7))//蜂鸣器响uint count;/******************************************* 三个外部中断声明,注意中断向量号*******************************/#pragma interrupt_handler Exint0:2#pragma interrupt_handler Exint1:3#pragma interrupt_handler Exint2:19/************************************* 系统延时函数************************************/void delay(uint ms){uint i,j;for(i=0;i<ms;i++){for(j=0;j<1140;j++);}}/************************************** 端口初始化每个外部中断端口是固定的****************************************/ void port_init(){DDRA=0XFF;PORTA=0XFF;DDRB&=(0<<PB2);//INT2PORTB|=(1<<PB2);DDRD&=(0<<PD2);//INT0PORTD|=(1<<PD2);DDRD&=(0<<PD3);//INT1PORTD|=(1<<PD3);}/*********************************** 外部中断初始化*******************************/void INT_init(){SREG=0X80;//打开全局中断GICR|=(1<<INT0)|(1<<INT1)|(1<<INT2);//三个中断使能MCUCR=(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00) ;//INT0,INT1下降沿触发MCUCSR=(0<<ISC2);//INT2下降沿触发中断}/*****************************************流水灯函数****************************************/ void LED_1(){uchar i;for(i=0;i<8;i++){PORTA=~BIT(i);delay(200);}}/***********************************LED_2函数**********************************/void LED_2(){PORTA=0X0F;delay(500);PORTA=0XF0;delay(500);}/********************************LED_3函数************************************/ void LED_3(){PORTA=0X81;delay(500);PORTA=0X7E;delay(500);}/************************************ 外中断0函数**********************************/ void Exint0(){LED_2();}/********************************** 外中断1函数***********************************/void Exint1(){LED_3();}/************************外中断2函数***********************/void Exint2(){DDRD=(1<<PD7);for(count=0;count<4;count++){beep_0;delay(200);beep_1;delay(200);}}/********************************* 主函数*********************************/ void main(){port_init();//端口初始化INT_init();//中断初始化while(1)// 当非0值时执行下面函数 {LED_1();//流水灯函数}}。
单片机中断机制与外部中断引脚应用原理解读单片机中断机制是指在单片机运行过程中,当某个特定事件发生时,可以中断正在执行的程序,转而去处理这个事件。
中断机制可以提高单片机的响应速度和效率,在许多实时控制系统和嵌入式系统中被广泛应用。
本文将解读单片机中断机制的原理,并重点介绍外部中断引脚的应用。
一、中断机制的原理单片机中断机制的核心是中断向量表和中断优先级控制。
当中断事件发生时,中断请求线将信号发送给单片机,单片机根据中断源的优先级以及当前正在执行的程序的状态来判断是否执行中断处理程序。
1. 中断源常见的中断源包括外部中断、定时器中断和串口中断等。
外部中断是通过单片机的外部引脚与外部设备连接,当外部设备触发中断条件时,会发送中断请求信号给单片机。
定时器中断是通过单片机内部的定时器模块来触发的,可以用来实现精确的时间控制。
串口中断是通过单片机与外部设备进行串口通信时,当接收到数据或发送完成时触发的中断。
2. 中断处理程序当中断事件发生时,单片机会执行对应的中断处理程序,中断处理程序是一段特定的代码,用来处理中断事件和保存现场。
中断处理程序执行完毕后,会根据中断优先级控制来判断是否返回到原来的程序继续执行。
3. 中断向量表中断向量表是存储中断处理程序地址的表格,它们按照中断源的编号排列。
当中断事件发生时,单片机会根据中断源的编号找到对应的中断向量表项,从而确定要执行的中断处理程序。
4. 中断优先级控制中断优先级控制是用来确定在多个中断事件同时发生时,单片机选择哪个中断事件优先响应的机制。
通过设置中断源的优先级,单片机可以根据优先级来选择执行对应的中断处理程序。
二、外部中断引脚的应用原理外部中断引脚是单片机上的专门引脚,用于接收外部设备发送的中断请求信号。
外部中断引脚通常分为多个引脚,每个引脚可以连接一个外部设备。
在外部设备满足中断触发条件时,会向单片机发送中断请求信号,单片机根据引脚的电平变化来判断中断事件的发生。