中断(外部中断0、外部中断1、定时器中断0、定时器中断1)

中断

在这里插入图片描述

TMOD:定时器/计数器工作方式寄存器

TCON:定时器/计数器控制寄存器

在这里插入图片描述

IE:中断允许控制寄存器

在这里插入图片描述

IP:中断优先级控制寄存器

外部中断0

外部0中断触发:(P3.2口触发;P3.2触发;P3.2触发

若IT0=0,则为低电平触发

若IT0=1,则为下降沿触发

外部中断0初始化:

初始化方法一:

void Init_INT0()
{
 IT0=1;//设置外部中断0;下降沿触发 
 EX0=1;//开启外部中断0; 
 EA=1;//开启中断总开关 
 } 


初始

化方法二:

void Init_INT0()
{ 
 TCON=TCON|0x01;//0000 0001->0x01相当IT0=1;设置下降沿触发中断
 IE=0x81;//1000 0001->0X81;
     //第一个1是EA=1;即中断总开关
     //第二个1是EX0=1;即中断分支开关
}


外部0

中断子函数:

void RSI_INT0() interrupt 0
{
 P0=~P0;//当触发中P0口的LED取反 
}

主函数:

void main()
{
 P0=0xff;//灯全熄灭
 Init_INT0();//初始化外部中断0
 while(1);
}


 

外部中断1:

外部1中断触发:(P3.3口触发;P3.3触发;P3.3触发

若IT1=0,则为低电平触发

若IT1=1,则为下降沿触发

外部中断1初始化:

方法一:

void Init_INT1()
{
 IT1=1;//设置外部中断1;下降沿触发 
 EX1=1;//开启外部中断1; 
 EA=1;//开启中断总开关 
 } 


 

方法二:

void Init_INT1()
{ 
// IT1=1;//设置下降沿触发
// EX1=1;//外部中断1的分支开关
// EA=1;//中断总开关
  
  TCON=TCON|0x04;//0000 0100->0x04相当IT1=1;设置下降沿触发
  IE=0x84;//IE=1000 0100->0x84
     //第一个1相当EA=1;第二个1相当EX1=1
}


 

外部1

中断子函数:

void ISR_Int1() interrupt 2
{
  P0=~P0;//取反 
}

主函数:(P3.3给了下降沿,软件触发)

void main()
{
 P0=0xff;//熄灭所有的灯
 Init_INT1();//外部中断1初始化
 while(1){
  Int1=1;
  Int1=0;//P3.3由1->0;下降沿触发
 }
}

该主函数可进行Dobug,查看函数的走向。

例题:(中断嵌套)

利用外部中断0,进行3次流水灯;

利用外部中断1,进行3次闪耀;

且外部中断1的优先级高于外部中断1。

不进行中断时LED灯处于熄灭状态。

#include <reg51.h>

 

//延时程序

void delay()

{

       int i,j;

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

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

}

//外部中断0和1初始化

void Init_INT01()

{      

       TCON=TCON|0x05;//0000
0101->0x01相当IT0=1,IT1=1;设置下降沿触发中断

       IE=0x85;//1000 0101->0X85;

                                   //第一个1是EA=1;即中断总开关

                                   //第二个1是EX1=1;即中断1分支开关

               //第二个1是EX0=1;即中断0分支开关

       IP=IP|0x04;//设置外部中断1优先级高于外部中断0

}

 

//LED右移程序

void lelf(unsigned int n)

{

       unsigned int i,j;

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

       {

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

              {

                     P0=~(0x80>>j);

                     delay();

              }

       }

       P0=0xff;

}

 

//闪耀程序

void flash(unsigned int n)

{

       unsigned int i;

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

       {

              P0=~P0;

              delay();

       }

}

void main()

{

       Init_INT01();

       while(1);

}

//外部中断0子程序

void out_INT0() interrupt 0

{

       lelf(3);

       

}

//外部中断1子程序

void out_INT1() interrupt 2

{

       flash(4);

}

定时器0中断:

中断触发:

定时/计数时间到触发中断

定时/计数原理:

脉冲下降沿,定时器/计数的值加 1

初始化程序:
//定时器/计数器0初始化

void tminer0_Init()
{
 TMOD&=0XFC;//选择定时模式C/T=0;计数模式C/T=1;
 TMOD|=0x01;//选择定时器0;工作模式1,16位定时/计数
 TH0=0xFF;  //装初值
 TL0=0xFE;  //定时1us
 ET0=1;     //定时器0开关
 EA=1;      //中断总开关
 TR0=1;     //启动定时器0
}

中断子程序:

//定时器中断0子程序
void time0() interrupt 1
{
 TH0=0xFF;//重新装初值
 TL0=0xFE;//定时1us
 P0=~P0;
}

主程序:

void main()
{
 tminer0_Init();
 while(1);
}
 

定时器1中断:

#include
<reg51.h>
//定时器/计数器1初始化

void
tminer1_Init()

{

       TMOD&=0XCF;//选择定时模式C/T=0;计数模式C/T=1;

       TMOD|=0x10;//选择定时器1;工作模式1,16位定时/计数

       TH1=0xFF;//装初值

       TL1=0xFE;//定时1us

       ET1=1;//定时器1开关

       EA=1;//中断总开关

       TR1=1;//启动定时器1

}

void
main()

{

       tminer1_Init();

       while(1);

}

//定时器中断1子程序

void
time0() interrupt 3

{

       TH1=0xFF;//重新装初值

       TL1=0xFE;//定时1us

       P0=~P0;

}
  • 17
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值