AVR单片机教程13—第十三课 ATMEAG16L的外部中断编程实践

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

——————————————————————————
第十三课ATMEAG16L的外部中断编程实践
本教程节选自周兴华老师《手把手教你学AVR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书
实验器材,可登陆周兴华单片机培训中心网购部自助购买!
Atmega16L具有多达20个中断源,这里我们进行外部中断的实验,其它的等到介绍到相关内容时可进行适当的实验。

1.外部中断0
外部中断0由引脚INT0(PIND2)触发。

如果INT0引脚按照MCUCR寄存器中的ISC01、ISC00设置的方式发生跳变,则不管是否lNT0中断使能,INT0中断标志位INTF0都将置位。

如果SREG 寄存
器的全局中断位I和通用中断控制寄存器GICR中的INT0中断使能位INT0置位,则单片机培训开始
执行中断程序。

在进入中断服务程序时,INTF0被硬件清零。

必须指出,不管INT0(PIND2)引脚
方向位设置如何,只要INT0引脚发生规定的跳变,都会触发中断。

中断标志位INTF0只在满足发生
中断的条件时置位,一旦条件变化,INTF0被硬件清零。

向INTF0位写“1”也会对其清零。

2.外部中断1
外部中断0由引脚INT1(PIND3)触发。

如果INT1引脚按照MCUCR寄存器中的ISC11、ISC10设置的方式发生跳变,则不管是否lNT1中断使能,INT1中断标志位INTF1都将置位。

如果SREG 寄存
器的全局中断位I和通用中断控制寄存器GICR中的INT1中断使能位INT1置位,则开始执行中断程
序。

在进入中断服务程序时,INTF1被硬件清零。

必须指出,不管INT1(PIND3)引脚方向位设置
如何,只要INT1引脚发生规定的跳变,FPGA培训都会触发中断。

中断标志位INTF1只在满足发生
中断的条件时置位,一旦条件变化,INTF1被硬件清零。

向INTF1位写“1”也会对其清零。

3.外部中断2
外部中断2由引脚INT2(PINB2)触发。

如果INT2引脚按照MCUCR寄存器中的ISC2设置的方式发生跳变,则不管是否lNT2中断使能,INT2中断标志位INTF2都将置位。

如果SREG 寄存器的全局
中断位I和通用中断控制寄存器GICR中的INT2中断使能位INT2置位,则开始执行中断程序。

在进
入中断服务程序时,INTF2被硬件清零。

必须指出,不管INT2(PINB2)引脚方向位设置如何,只
要INT2引脚发生规定的跳变,都会触发中断。

中断标志位INTF2只在满足发生中断的条件时置位,
一旦条件变化,INTF2被硬件清零。

向INTF1位写“1”也会对其清零。

8.2.1 INT1中断实验
——————————————————————————
平时D1-D8 8个LED闪烁,点亮/熄灭时间约500mS。

一旦INT1触发中断后,蜂鸣器发出10秒的报警声。

INT1中断实验的电路原理见图8-1(作者注:使用Protel99se打开)。

图8-1 INT1中断实验的电路原理
在我的文档中新建一个ac8-1的文件夹。

建立一个ac8-1.prj的工程项目,最后建立源程序文件ac8-1.c。

输入下面的程序:
#include//包含头文件
#define uchar unsigned char//变量类型的宏定义
#define uint unsigned int
#define BZ_0 (PORTD=PORTD&0xdf)//定义蜂鸣器端口为低电平
#define BZ_1 (PORTD=PORTD|0x20)//定义蜂鸣器端口为高电平
Uint cnt;//全局变量
//=============================
void delay_ms(uint k)//定义毫秒级的延时子函数
{
uint i,j;
for(i=0;i< span="">
{
for(j=0;j<1140;j++)
;
}
}
//=============================
void main(void)//定义主函数
{//主函数开始
DDRB=0xff;//将PB端口设为输出
PORTB=0xff;// PB端口初始化输出11111111
DDRD=0xdf;//将PIND3设为输入
PORTD=0xff;// PD端口初始化输出11111111
MCUCR = 0x08;//INT1为下降沿触发
GICR = 0x80; //使能INT1中断
SREG=0x80;//使能总中断
while(1)//无限循环
{//无限循环语句开始
PORTB=0x00;// PB端口输出00000000
delay_ms(500);// 延时500mS
PORTB=0xff; // PB端口输出11111111
delay_ms(500); //延时500mS
——————————————————————————
}//无限循环语句结束
}//主函数结束
//***************************************************
#pragma interrupt_handler int1_isr:3//INT1中断服务子函数
void int1_isr(void)
{
for(cnt=0;cnt<5000;cnt++)//蜂鸣器发声10S
{BZ_1;delay_ms(2); BZ_0;}
}
编译通过后,可在AVR Studio集成开发环境中进行JTAG在线仿真或进行软件模拟仿真。

仿真完成后,将ac8-1.hex文件下载到AVR单片机综合试验板上。

注意,标示“LED”及“INT1”的
双排针应插上短路块。

我们看到,D1-D8发光管闪亮,间隔约0.5秒。

按下INT1键后,单片机进入
中断,蜂鸣器发声10秒。

本文地址:/article-65-1.html。

相关文档
最新文档