中断的实验现象

点击打开在线编译器,边学边练

1.卡顿的流水灯

我们用一个实验现象来再一次理解中断函数。

在主函数里我们使八盏灯不停地左右快速流水,此时若是被外部因素触发了中断函数的执行,我们就在中断函数里实现蜂鸣器响一下,看看此时主函数里的流水灯是什么现象。

代码下载进去,我们随意按K4,观察流水灯。

#include <reg52.h> 
#include <function.h>//详见第六章第8讲

void main()
{  
    u8 i,dir;
    IT1 = 1;   //下降沿触发模式
    EX1 = 1;
    EA  = 1;
  
    LED_Init();//初始化LED硬件模块 
    KEY_Init();//初始化按键功能模块
    
    while(1)
    {
        if(i<8)dir=0;//向左移
        if(dir==0)P0=~(0x01<<i);
    
        if(i>=8)dir=1;//向右移 
        if(dir==1)P0=~( 0x80>>(i-7) );//当i大于等于8之后,(i-7)其实也还是在1~7之间变化
        delay_ms(50);
    
        i++;
        if(i>=15)i=1;//让i一直在1~14之间变化
    }
}
 
//请把P3.3和P2.3用杜邦线连接起来
void EXTI1_IRQHandler() interrupt 2
{
    u16 i;
    u8 x;
    for(i=0;i<2000;i++)
    {
        BEEP=!BEEP;
        for(x=0;x<75;x++);
    } 
}

可以看到流水灯在K4按下的时候触发了中断函数的执行,蜂鸣器响了一下,响的过程中流水灯停止了流水,说明在主函数里的CPU使用权被剥夺给了中断函数,导致了主函数的执行任务被暂停,蜂鸣器响完之后,也就是中断函数执行完了,CPU使用权给回了主函数,于是又接着执行流水灯的任务了,这些过程叫做保留现场和恢复现场。


2.中断的好处

我们再来领略一下中断的优势。

把下面的代码下载进去,蜂鸣器会一直响,然后随意按K4。

#include <reg52.h> 
#include <function.h>//详见第六章第8讲

void main()
{  
    u8 x;
    IT1 = 1;   //下降沿触发模式
    EX1 = 1;
    EA  = 1;
  
    LED_Init();//初始化LED硬件模块 
    KEY_Init();//初始化按键功能模块
    LED2=0;    //点亮LED2
    
    while(1)
    {
        BEEP=!BEEP;
        for(x=0;x<75;x++); 
    }
}
 
//请把P3.3和P2.3用杜邦线连接起来
void EXTI1_IRQHandler() interrupt 2
{
    static u8 i=1;
    P0=~(0x01<<i);
    i++;
    if(i>=8)i=0;
}

试想,我们没学过中断函数,在前面几章的基础知识中只在主函数里实现蜂鸣器一直响,然后按键还可以切换小灯的跳转,这样的功能我们可以做得到吗,我想应该有点难度。所以在中断函数的帮助下有种任务并列执行的优势。


本文固定URL:https://www.dotcpp.com/course/369

第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)