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

相关文档
最新文档