历史上的今天
返回首页

历史上的今天

今天是:2024年08月23日(星期五)

正在发生

2021年08月23日 | 51单片机-中断的实验现象

2021-08-23 来源:eefocus

1.卡顿的流水灯


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


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


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


#include  

#include //详见第六章第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<     

        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  

#include //详见第六章第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++;

    if(i>=8)i=0;

}


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


推荐阅读

史海拾趣

问答坊 | AI 解惑

青越锋软件常见操作性问题---(PCB库)

1、为什么我点击Tools-New Component的时候,没有元件导向功能啊? 答:我们的新元件导向器是通过Tools-Wizard Component来实现的,并非New Component这个命令,这个New Component命令是用来做那些不规则的元件的。 2、能不能将PCB库中初始设置 ...…

查看全部问答>

挖芯币活动每次最多能挖到多少芯币?

挖芯币活动每次最多能挖到多少芯币?…

查看全部问答>

三角形接法的电机在运行中开路。瞬间开路电压上多少

我单位发生一起越级跳闸。低压和高压都跳了,检查结果现场发现是一台75KW的电机角形开路所至。控制该电机电子开关发现进线空开有大量弧光烧黑。可控硅电源和阻容吸收电路炸断。电路绝缘全部破坏。请教一下各位同仁。是否是电机在运行过程中。外控没 ...…

查看全部问答>

有用广州倍思得BST-URD9201做过开发的高人请进

我现在做的毕业设计用的就是这款读卡器,需要自己开发一个新的程序包,但是该读卡器自带的说明书过于简单,对该款仪器的命令介绍不全,希望有用该读卡器做过相关项目的高人指点一下。…

查看全部问答>

高手请进,如何获取 ALT 组合键 ?

我的代码如下: if(uVirKey == VK_NUMPAD0 ) { int i = GetKeyState(VK_MENU) ; if( i < 0 ) dosomething(); } 为什么不能截取组合键?谢谢!…

查看全部问答>

jtaq 超级郁闷 求助啊。。。。

我想问一下 我做了一个430的板子 5跟线 连到14管脚的插针上 但是计算机不能识别 是什么问题呢?…

查看全部问答>

基于Stellaris M3的无刷直流电机控制系统

基于Stellaris M3的无刷直流电机控制系统…

查看全部问答>

如果把单片机C51学好了,再应该去学什么啊

如果把单片机C51学好了,再应该去学什么啊…

查看全部问答>

如何获得精度高的直流电源

请教各位大侠,怎样获得精度比较高的±50V(200mA)直流电源?…

查看全部问答>

应该怎样处理触摸按键的PCB?

STM32F0等单片机有Touch sensing controller,用于实现触摸按键功能。 对于双面PCB,应该怎么做这个按键呢? …

查看全部问答>