当前位置:文档之家› AVR单片机教程13—第十三课 ATMEAG16L的外部中断编程实践

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

上海周兴华单片机培训中心 Http://www.zxmcu.com ——————————————————————————

周兴华单片机培训中心2010年6月制

第十三课 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中断实验 上海周兴华单片机培训中心 Http://www.zxmcu.com ——————————————————————————

周兴华单片机培训中心2010年6月制

平时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 上海周兴华单片机培训中心 Http://www.zxmcu.com ——————————————————————————

周兴华单片机培训中心2010年6月制

} //无限循环语句结束 } //主函数结束 //*************************************************** #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秒。 本文地址:http://www.zxhmcu.com/article-65-1.html

相关主题