中断基本包含:
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 控制寄存器包含中断触发控制位与通用 MCU 功能
Bit 7 6 5 4 3 2 1 0
SM2 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 0
JTD 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’
使其清零。*/
/*通用中断控制寄存器- GICR
Bit 7 6 5 4 3 2 1 0
INT1 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 引脚被配置为输出,只
要引脚电平发生了相应的变化,中断可将产生*/
/*通用中断标志寄存器- GIFR
Bit 7 6 5 4 3 2 1 0
INTF1 INTF0 INTF2 – – – – –
* Bit 7 – INTF1: 外部中断标志 1
INT1引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF1。如果SREG 的位
I以及GICR寄存器相应的中断使能位INT1为”1” ,MCU即跳转到相应的中断向量。进入中
断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”0” 来清零。
* Bit 6 – INTF0: 外部中断标志 0
INT0引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF0。如果SREG 的位
I以及GICR寄存器相应的中断使能位INT0为”1” ,MCU即跳转到相应的中断向量。进入中
断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”0” 来清零。
* Bit 5 – INTF2: 外部中断标志 2
INT2引脚电平发生跳变时触发中断请求,并置位相应的中断标志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_INT2
void INTER_init_0(unsigned char a)//a取值0-3
{
switch(a)
{
case 0:MCUCR&=~(1<
case 1:MCUCR&=~(1<
case 2:MCUCR|=1<
case 3:MCUCR|=1<
default : MCUCR|=1<
}
}
void INTER_init_1(unsigned char a)//a取值0-3
{
switch(a)
{
case 0:MCUCR&=~(1<
case 1:MCUCR&=~(1<
case 2:MCUCR|=1<
case 3:MCUCR|=(1<
default : MCUCR|=1<
}
}
void INTER_init_2(unsigned char a)
{
if(a)
MCUCSR|=(1<
else
MCUCSR&=~(1<
}
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<
GIFR&=~(1<
SREG|=0x80;//使能全局中断
}
///////////////////////////////////////////////////////////////////
#include "smg.h"
#pragma data:code
//共阳数码管断码表
const table[]={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
关键字:AVR单片机 外部中断
引用地址:AVR单片机外部中断0、1、2 详解
{
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,使能控制数码管数据的74HC573
PORTB=table[data];//送数码管断码数据
PORTA&=~BIT(3);//关闭控制数码管数据的573,使得数码管数据锁存
PORTB=0X00;//PB口输出0000 0000
PORTA|=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)
{
;
}
}
上一篇:一种基于CAN总线的局部风机监控系统
下一篇:AVR定时器1的普通模式设置
推荐阅读最新更新时间:2024-03-16 13:48
MSP430F249外部中断P1.3口
/****************************************************************** ** ** File : DExternInterrupt.c | Interrupt | ** Version : 1.0 ** Description : Extern Interrupt ** Author : LightWu ** Date : 2013-4-16
[单片机]
AVR单片机对数码管的控制设计
//数码管数据P0口,数码管控制P2口 #include #include #include #include #include #define code PROGMEM #define uchar unsigned char #define uint unsigned int code const ucharLED_7[16] = {0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff};//common of + code const uchar posi ti on[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0x
[单片机]
AVR单片机的24C02通信程序
#include avr/io.h #define uchar unsigned char #define uint unsigned int #define setbit(sfr,bit) (sfr|=(1 bit)) #define clrbit(sfr,bit) (sfr&=~(1 bit)) #define SDA_out() setbit(DDRD,0) //设置SDA为输出 #define SCL_out() setbit(DDRD,2) //设置SCL为输出 #define SDA_in() clrbit(DDRD,0) //设置SDA为输入 #define SDA_high() setbit(PORTD
[单片机]
STM32-自学笔记(14.NVIC和外部中断,程序用到的库函数介绍)
1.GPIO_EXTILineConfig 函数原型:void GPIO_EXTILineConfig(u8 GPIO_PortSource,u8 GPIO_PinSource) 功能:选择GPIO引脚用作外部中断线路 参数: GPIO_PortSource:选择用作外部中断源的GPIO端口 GPIO_PinSource:待设置的外部中断引脚。该参数可以取GPIO_PinSourcex(x可以是0~15) 返回值:无 参数:GPIO_PortSource GPIO_PortSourceGPIOA 选择GPIOA GPIO_PortSourceGPIOB 选择GPIOB GPIO_Port
[单片机]
8051外部中断1解析
程序实现的功能: 在实验板上左下方有一个黑色的独立按键(K4), 当我们按下它时, D1(LED灯)的状态就会取反. (外部中断1和外部中断0在处理上类似, 红色的部分为不同之处) 中断处理程序标号: 外部中断0 ----------- 0 定时器0中断 ----------- 1 外部中断1 ----------- 2 定时器1中断 ----------- 3 串口中断 ----------- 4 独立按键电路原理图(K4对应P33): 程序源代码: #include STC89C5xRC.H void delay()//获得1ms延时
[单片机]
STM32F1笔记(五)外部中断EXTI
STM32的每个IO都可以作为外部中断的中断输入口。 STM32F103的中断控制器支持19个外部中断/事件请求。每个中断设有状态为,每个中断/事件都有独立的触发和屏蔽设置。 STM32F103的19个外部中断为: EXTI线0~15:对应外部IO口的输入中断。 EXTI线16:连接到PVD输出。(Programmable Votage Detector 可编程电压监测器。连到EXTI的电源电压检测(PVD)中断) EXTI线17:连接到RTC闹钟事件。 EXTI线18:连接到USB唤醒事件。 STM32供IO口使用的中断线只有16个,而STM32的IO口远超16个。 所以STM32的GPIOx.0
[单片机]
STM32学习笔记---基于UCOSII的EXTI外部按键中断实验
继做了基于UCOSII的IWDG独立看门狗实验后,继续进行第25个实验-基于UCOSII的EXTI外部按键中断实验,此实验在基于UCOSII的IWDG实验基础上添加EXTI而来,三个按键,分别按下串口输出按键信息!在多任务下添加了IWDG独立看门狗。 //EXTI按键任务---------------------------------------- static void Task_EXTI(void* p_arg) { (void) p_arg; while(1) { //看门狗更新设置喂狗操作 IWDGSET(); TESTKEY(); OSTimeDlyHMSM(0, 0, 0, 10); }
[单片机]
基于AVR单片机的有害气体红外感应及语音警示控制系统
0引言 利用红外感应系统感应附近有无有害气体,当红外感应系统感受到有有害气体接近时,送出持续一段时间的高电平;单片机通过开启中断,启动语音芯片,单片机通过串口通信,从上位机提取的有害气体参数提示给附近人体,并经过与安全值的比较判定当前环境是否安全。对语音芯片的使用,先将必要的文字、数字信息录制进去,放音时,通过单片机自动寻址,把实时参数读取出来。为便于以后系统改进或移植到其他系统,可设计录音、放音电路,通过切换录制不同内容。系统设计友好、方便,给人的信息也更加直接。 1系统总体设计方案 在气体浓度是现有可利用的数据的基础上,考虑了系统的衔接性和可移植性。系统总体方案见图1。 本系统分为四大模块:核心控制模块、语音电路
[工业控制]
小广播
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐
最新单片机文章
更多精选电路图
更多热门文章
更多每日新闻
更多往期活动
- Silicon Labs BG22-EK4108A 开发套件 用科技连接未来 申请进行时!
- 有奖问答|ADI应用之旅——水质与气体监测篇
- 【已结束】浩亭直播【电气控制柜如何快速低成本地进行线缆安装】
- 有奖直播|TI毫米波雷达在汽车领域的最新应用
- 直播:TI及安富利带你快速通过新能源汽车安全系统认证 预报名、看直播赢好礼!
- HDMI/ DP2.0 线上实测研讨会|是德科技
- 有奖活动|下载资料、预约视频 泰克 HDMI 2.1 测试方案
- EEWORLD十周年为你而任性——上百块ST开发板团购盛宴开始啦!49元包邮,发帖还返现
- 电子书下载|ADI 触摸屏测试解决方案
- Microchip 直播|时间同步的必要性及其解决方案
11月22日历史上的今天
厂商技术中心