您的位置 首页 传感器

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

*programname:外部中断程序;这费了我好几个小时的心血!成功的喜悦难以用言语表达!概述:8位流水非精确定时,一秒循环灯闪烁,等待

/*programname : 外部中止程序;

这费了我好几个小时的汗水!成功的高兴难以用言语表达!
概述:
8位流水非准确守时,一秒循环灯闪耀,等候外部中止一下降沿中止触发信号,
外部中止一旦触发,等候触发按键弹起(此刻流水灯暂停状况),中止按键一旦弹
起,持续运转上一级程序(流水灯持续运转);

accomplish time : 2014-2-7 22:47:15;
*/

#include <avr/io.h>
#include interrupt.h> //中止必备的头文件;

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);

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/317490.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部