外部中断

 

一、  实验目的:

1、了解外部中断的库函数;

2、熟悉外部中断的特性;

                  3、掌握外部中断的使用。

二、实验仪器:ATmage16实验板  一块

PC   一台

三、实验原理:

外部中断通过引脚INT0 INT1 PCINT23..0 触发。只要使能了中断,即使引脚INT0INT1 PCINT23..0 配置为输出,只要电平发生了合适的变化,中断也会触发。这个特点可以用来产生软件中断。 只要使能, PCINT23..16 引脚上的电平变化将触发外部中断PCI2 PCINT14..8 引脚上的电平变化将触发外部中断PCI1 PCINT7..0 将触发外部中断PCI0PCMSK2PCMSK1 PCMSK0 寄存器则用来检测是哪个引脚上的电平发生了变化。PCINT23..0 外部中断的检测是异步的。也就是说,和其他中断方式一样,这些中断也可以用来将器件从休眠模式唤醒。INT0 INT1 中断可以由下降沿、上升沿,或者是低电平触发。具体由外部中断控制寄存器A EICRA 的设置来确定。当INT0 INT1 中断使能且设定为电平触发时,只要引脚电平被拉低,中断就会产生。若要求INT0 INT1 在信号下降沿或上升沿触发中断,则I/O时钟必须工作(请参见P 23 时钟系统及其分布” 了解更多信息)INT0INT1 的低电平中断检测是异步的。也就是说它可以用来将器件从休眠模式唤醒。在休眠过程( 除了空闲

模式) I/O 时钟是停止的。通过电平中断将MCU 从掉电模式唤醒时,要保证低电平保持一定的时间以使MCU 完成唤醒过程并触发中断。如果触发电平在启动时间结束前就消失, MCU 将被唤醒,但中断不会被触发。启动时间由熔丝位SUT CKSEL 决定。详见 P 23 系统时钟及其选项”

外部中断控制寄存器MCUCR 外部中断控制寄存器 A 包括决定中断触发方式的控制位。

实验步骤及内容:

输入程序:本程序一开始是IO口中的A口以流水灯工作,一旦有外部中断请求,就是B口以流水灯工作,循环一次后回到被中断处继续运行。

程序如下:

#include <iom16v.h>

#include <macros.h>

//*******************延时 us

void delay_us(int t)

{

do

   t--;

       while(t>1);

}

//*******************延时  ms

void delay_ms(unsigned int t)

{

while(t!=0)

{

delay_us(1142);

t--;}

}

#pragma interrupt_handler INT_0:2      //外部中断0执行函数

void  INT_0 (void)

{ 

 PORTC=0XFF;

    PORTB=~0X01;

    delay_ms(1000);

    PORTB=~0X02;

    delay_ms(1000);

    PORTB=~0X04;

    delay_ms(1000);

    PORTB=~0X08;

    delay_ms(1000);

    PORTB=~0X10;

    delay_ms(1000);

    PORTB=~0X20;

    delay_ms(1000);

    PORTB=~0X40;

    delay_ms(1000);

    PORTB=~0X80;

    delay_ms(1000);

    PORTB=0XFF;

    }

void main(void)

{

DDRA = 0xff;       /*输出 */

DDRB = 0xff;       /*输出 */

   DDRC = 0xff;      /*输出*/

   DDRD = 0xff;  /*输出*/

   PORTA=0XFF;

   PORTB=0XFF;

   PORTC=0XFF;

   PORTD=0XFF;

MCUCR=0X02;   //定义外部中断INT0为下降沿产生中断请求

   GICR=0X40;     //中断屏蔽寄存器开INT0

   SEI();           //******开全局中断

   for (;;)

  {  

    PORTA=~0X01;

    delay_ms(1000);

    PORTA=~0X02;

    delay_ms(1000);

    PORTA=~0X04;

    delay_ms(1000);

    PORTA=~0X08;

    delay_ms(1000);

    PORTA=~0X10;

    delay_ms(1000);

    PORTA=~0X20;

    delay_ms(1000);

    PORTA=~0X40;

    delay_ms(1000);

PORTA=~0X80;

    delay_ms(1000);

    }

  }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值