使用INT0外部中断触发输入引脚对按键进行响应,每按下一次按键,蜂鸣器引脚图发出“嘟…嘟…嘟”(嘟响三声

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
任务22基于外部中断控制的单键单灯闪烁控制设计
下载积分:1000
内容提示:任务22基于外部中断控制的单键单灯闪烁控制设计
文档格式:PPT|
浏览次数:16|
上传日期: 09:36:41|
文档星级:
该用户还上传了这些文档
任务22基于外部中断控制的单键单灯闪烁控制设计
官方公共微信AT89S51单片机P1口接有1个7段LED数码管,初始显示为0。外部中断输入引脚INT_百度知道
AT89S51单片机P1口接有1个7段LED数码管,初始显示为0。外部中断输入引脚INT
每当开关按钮按下1次时,该脚平时为高电平0反接有1个按钮开关,则产生一个负跳变的外中断请求,当按下第10次时,数码管从9再变为0,使数码管显示增1
n++.com/zhidao/wh%3D450%2C600/sign=3ead4ba67b4ec4bede7b80699acbbf6c,0x99.//中断子程序{& //这是IT0=1.h&gt./zhidao/wh%3D600%2C800/sign=9c8bf2435cfe405f8a5fd7b/574ede7b80699acbbf6c;}下图是仿真结果<img class="ikqb_img" src=" //按键计数void main(){EX0=1; if(n&9)n=0://h.com/zhidao/pic/item/574ede7b80699acbbf6c.hiphotos.unsigned char n. &&nbsp.reg51:#include&lt,0x90,0xb0,0x82,0x80程序如下,0xf9,0xf8.jpg" esrc=" P1=tab[n];IT0=1,0xa4://h://h,0x92,是下降沿中断EA=1
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁AVR单片机外部中断0、1、2 详解
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
AVR单片机外部中断0、1、2 详解
中断基本包含:
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&iom16v.h&
#include&macros.h&
#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&&ISC01);MCUCR&=~(1&&ISC00);//INT0 为低电平时产生中断请求
& &case 1:MCUCR&=~(1&&ISC01);MCUCR|=1&&ISC00;// INT0 引脚上任意的逻辑电平变化都将引发中断
& &case 2:MCUCR|=1&&ISC01;MCUCR&=~(1&&ISC00);//INT0 的下降沿产生异步中断请求
& &case 3:MCUCR|=1&&ISC01;MCUCR|=1&&ISC00;//INT0 的上升沿产生异步中断请求
& &default : MCUCR|=1&&ISC01;MCUCR&=~(1&&ISC00);//设置错误时,下降沿产生异步中断请求
void INTER_init_1(unsigned char a)//a取值0-3
&switch(a)
& &case 0:MCUCR&=~(1&&ISC11);MCUCR&=~(1&&ISC10);//INT1 为低电平时产生中断请求
& &case 1:MCUCR&=~(1&&ISC11);MCUCR|=1&&ISC10;// INT1 引脚上任意的逻辑电平变化都将引发中断
& &case 2:MCUCR|=1&&ISC11;MCUCR&=~(1&&ISC10);//INT1 的下降沿产生异步中断请求
& &case 3:MCUCR|=(1&&ISC11)|(1&&ISC10);//INT1 的上升沿产生异步中断请求
& &default : MCUCR|=1&&ISC11;MCUCR&=~(1&&ISC10);//设置错误时,下降沿产生异步中断请求
void INTER_init_2(unsigned char a)
& &MCUCSR|=(1&&ISC2);//上升沿触发;
& &MCUCSR&=~(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,INT1
&GIFR&=~(1&&INTF0)&~(1&&INTF1)&~(1&&INTF2);//清零中断标志
&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&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口输出,使得所有的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口输出
&PORTA|=BIT(4);//PA4=1,使能控制数码管数据口的573
&PORTB|=BIT(bit);//数码管位选
&PORTA&=~BIT(4);//数码管位选锁存
&delay(1);//稍微延时
///////////////////////////////////////////////////////////////////////////////
#include &smg.h&
#include &interrupt.h&
void main(void)
&SmgInit();
&InterruptInit();
&INTER_init_0(2);
&INTER_init_1(2);
&INTER_init_2(0);
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights Reserved【图文】第7讲
矩阵键盘电路的仿真实验_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
矩阵键盘电路的仿真实验
上传于||暂无简介
大小:525.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢

我要回帖

更多关于 buzzer蜂鸣器引脚 的文章

 

随机推荐