专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

atmege16外部中断程序

作者:韩冰   来源:本站原创   点击数:  更新时间:2013年11月29日   【字体:

/******************************************

功能:演示ATMEGA16的3个外部中断程序

编辑环境:ICCAVR

 

******************************************/

 

#include<iom16v.h>

#include<macros.h>

 

#define uint unsigned int

#define uchar unsigned char

 

#define beep_0 (PORTD&=~(1<<PD7))

#define beep_1 (PORTD|=(1<<PD7))

//蜂鸣器响

uint count;

/*******************************************

三个外部中断声明,注意中断向量号

*******************************/

#pragma interrupt_handler Exint0:2

#pragma interrupt_handler Exint1:3

#pragma interrupt_handler Exint2:19

/*************************************

系统延时函数

************************************/

void delay(uint ms)

{

  uint i,j;

    for(i=0;i<ms;i++)

           {

             for(j=0;j<1140;j++);

           }

}

/**************************************

端口初始化每个外部中断端口是固定的

****************************************/

void port_init()

{

 DDRA=0XFF;

 PORTA=0XFF;

 DDRB&=(0<<PB2);//INT2

 PORTB|=(1<<PB2);

 DDRD&=(0<<PD2);//INT0

 PORTD|=(1<<PD2);

 DDRD&=(0<<PD3);//INT1

 PORTD|=(1<<PD3);

}

 

/***********************************

外部中断初始化

*******************************/

void INT_init()

{

 SREG=0X80;//打开全局中断

 GICR|=(1<<INT0)|(1<<INT1)|(1<<INT2);//三个中断使能

 MCUCR=(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00);//INT0,INT1下降沿触发

 MCUCSR=(0<<ISC2);//INT2下降沿触发中断

 

}

/*****************************************

流水灯函数

****************************************/

void LED_1()

{

  uchar i;

  for(i=0;i<8;i++)

   {

    PORTA=~BIT(i);

          delay(200);

   }

}

/***********************************

LED_2函数

**********************************/

void LED_2()

{

  PORTA=0X0F;

  delay(500);

  PORTA=0XF0;

  delay(500);

}

/********************************

LED_3函数

************************************/

void LED_3()

{

  PORTA=0X81;

  delay(500);

  PORTA=0X7E;

  delay(500);

}

/************************************

外中断0函数

**********************************/

void Exint0()

{

 LED_2();

}

/**********************************

外中断1函数

***********************************/

void Exint1()

{

  LED_3();

}

/************************

外中断2函数

***********************/

void Exint2()

{

 DDRD=(1<<PD7);

 for(count=0;count<4;count++)

  {

   beep_0;delay(200);

         beep_1;delay(200);

  }

}

/*********************************

主函数

*********************************/

void main()

{

 port_init();//端口初始化

 INT_init();//中断初始化

 while(1)// 当非0值时执行下面函数

  {

    LED_1();//流水灯函数

  }

}
 

关闭窗口

相关文章