×
单片机 > 单片机程序设计 > 详情

AVR单片机外部中断触发的流水灯程序

发布时间:2020-05-28 发布时间:
|
/*   program name : 外部中断程序;

                              这费了我好几个小时的心血!成功的喜悦难以用言语表达!  
              概述:
        8位流水非精确定时,一秒循环灯闪烁,等待外部中断一下降沿中断触发信号,
    外部中断一旦触发,等待触发按键弹起(此时流水灯暂停状态),中断按键一旦弹
起,继续运行上一级程序(流水灯继续运行);
                                 
               accomplish time : 2014-2-7 22:47:15;
*/


#include
#include   //中断必备的头文件;

typedef unsigned char uint8;
typedef unsigned int uint16;


void init_io()     //所有io口初始化函数;
{
    DDRA=0XFF;
PORTA=0X00;   //PA口输出0;

DDRB=0XFF;
PORTB=0X00;   //PB口输出0;

DDRC=0XFF;
PORTC=0X00;   //PC口输出0;

DDRD=~(1<<3);    //INT1引脚设为输入状态;
PORTD=0XFF;      //INT1引脚内部有上拉,其他引脚输出1;

 

}

void delay()
{
   uint16 u=0 ;
   uint8 s=0;

  for(s=0;s<200;s++)
   {
     for(u=0;u<50000;u++);   //5毫秒左右;
  
   }

}


void buzz()
{
   uint16 s=0;
   uint8 i=0;

   PORTC|=0X80;
   for(i=0;i<10;i++)
   {
   for(s=0;s<50000;s++);
    }
   PORTC&=~0X80;
}


int main(void)
{
     init_io();  //初始化io口;


             //* 1. 先设置好由那个引脚来触发外部中断, 和触发方式;
  
                  //  MCUCR 是中断触发模式控制寄存器;
     MCUCR|=1<<3;   //ISC11 被置一,其他位全部是零,代表 INT1 (外部中断1)下降沿产生异步中断;
                    //一旦 INT1 被拉低,就会进入中断子程序;
            //*  2. 开启中断使能位;
 
     GICR |=0X80;  //  GICR是中断使能寄存器,最高位被置一,表示外部INT1中断使能
                 //  (在MCUCR寄存器中,INT1被设置为下降沿异步中断触发方式);

     sei();//全局中断使能函数.没有此函数,中断将无法执行.(我不知道为什么!或许是甲鱼的屁股--规定!) 
   

    while(1)
 {
    PORTB|=1<<2;  //使能流水灯,此时PA口为全零(流水灯全亮);

    delay();  //非精确延时1秒左右;

         PORTB&=~(1<<2);  //关闭流水灯;

delay();  //非精确延时1秒左右;

 }


}
//==================中断服务子程序=============================

SIGNAL(SIG_INTERRUPT1) //外部中断INT1 中断服务子程序函数(中断一旦被触发,cpu将会进入此函数);
{
     buzz();
    while((PIND&(1<<3))==0);

}

关键字:AVR单片机  中断触发  流水灯 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计