51单片机中断处理程序中关中断的问题

51单片机中断处理程序中关中断的问题,第1张

中断保护现场,是为了你中断子程序执行完以后能够返回到你程序中中断点,即产生中断的地方,使程序能够继续向下执行!!!!

如过你说的不用保护现场的话,那么程序执行完以后就不能够回到现场,那么你的程序将不知道要跳转到那里去了,也就是飞鸟,呵呵……

你说的中断嵌套,也是一样的,两者都要保护现场,不然你也不能够回到现场,程序也会飞的!!!!

而我们保护现场的数据都是放在堆栈中的,因此,你的中断次数也不能够超过堆栈的级数,那样数据也会丢失!!!!

说白了,中断它不同于子程序,子程序是固定好了的,返回的位置也固定了;而中断我们不能够预知它在那里发生中断,因此要保护现场,使中断子程序执行完后返回到中断的地方!!!

呵呵……说的太多了!!!

我知道你说的意思了,但是你要知道,中断现场保护是在中断子程序中进行的,因此当你高一级的中断发生的时候(他们不可能共用一个中断子程序,如果是同一中断,那也不可能,因为51中断中你进入中断子程序后要将禁止该中断再次中断,好象似的,嘿嘿……你可以试试),在高一级的中断子程序中也有现场保护,你的问题就是没有把现场保护放对地方!!!!!

============================================================

它们是把现场保护在同一堆栈中,我跟你打个比方吧,假如说堆栈的地址是80H,低一级的中断要保护的是1,2,3;高一级要保护的现场是4,5,6,那么在低一级的中断发生的时候,现场保护1,2,3将压如堆栈,(顺序书上应该有,这里是个比喻),那我先压入1,堆栈地址加1,压入2,堆栈地址再加1,如果这个时候高一级的中断发生,那么现在就应该跳到高一级中断的子程序,堆栈地址就是82H了,在将4,5,6分别压入堆栈,这样堆栈的地址就是85H,当高一级的中断子程序结束后,返回现场,堆栈的数据要从85H开始d出,这样现场返回的就是6,5,4,这个时候程序就会跳到中断之前的地方,即底一级的中断那里,将要继续将3保护到堆栈中,在执行低一级的中断子程序(其中,你要在中断保护现场完了后将中断标志清0啊,不然它始终会中断的,不可能去执行程序去了)

这样讲解你应该知道它们的过程了吧,呵呵!!!!!!

1、单片机的中断是一个很高明的办法。没有中断时单片机只会顺序执行主程序中的语句。

2、单片机的定时器有自己的时钟,打开51单片机的定时器后,单片机一边顺序执行主程序的语句时,一边定时器在计时。当计到你设定的值后,他需要产生中断,然后暂停主程序语句,转到中断程序中执行你的命令。执行完命令后返回到主程序的顺序语句中。然后知道下一次中断来临,再次产生中断。

3、要让他能产生中断,你就必须开中断。这就像一个控制开关,你不把开关打开,灯怎么会亮。

这样给你说吧。当单片机运行起来的时候是高速运转你while(1)里面的程序。但是这样是不够的,比如你想把某个信号传递给单片机让它处理,比如说:你按了某个键来控制某个灯的亮灭,这时候就需要单片机来响应你的动作,响应的方式就是中断。也就是说你在主程序中完成了某个中断的触发条件时,当达到这个条件时程序就会跳转到中断服务函数中去,执行完中断服务函数中的程序后再返回主程序中继续循环执行。你说的调用其实不太正确,中断服务函数只能触发,它是由单片机内特定的某些寄存器的标志位控制的,当这些满足触发条件的时候,标志位被硬件置1,然后自动执行你编写的中断服务函数。

说的不是很清楚,请见谅,中断是单片机内最重要的功能之一,与之对应的还有定时器(这是单片机的心脏),这些内容在51里面都是很简单的,但是到了32位单片机里面会变得特别复杂。

希望这些内容能给你一些帮助。

先附给你讲一下中断执行过程吧

所谓中断就是单片机在执行结构程序时,达到一定触发条件下,停止正在执行的当前程序,转而去执行中断里面的程序中断里面的程序执行完过好,再回头来执行当前的程序

专门给你写一个最简单的中断程序,自已体会一下希望能对你有所帮助

#include <reg51h>

sbit led1=P1^0;

sbit led2=P1^1;

void delay() //延时一段时间

{

unsigned int time;

time=5000;

while(time--);

}

void main()

{

IE=0x81; //开启中断

TCON=0x01;//采用电平中断方式

while(1)

{

led1=1;

delay();

led1=0;

delay();

}

}

void Int0( ) interrupt 0 //中断程序

{

led2=1;

delay();

led2=0;

delay();

}

程序执行的现象:

正常执行时,led1 一直进行循环闪烁 如果在此过程中,将P32接与地短接一次,则led2则会闪烁一次

中断是为了使时间更精确。使用中断一般要先设置使用哪个定时/计数器的模式几,之后再设置定时器的使能为,再打开总中断使能位,启动定时器。外部中断比定时器的优先级高,如果有更重要的事等着去处理则交给外部中断,当检测到有外部中断时,会去执行外部中断服务,执行完后回到之前未执行的地方接着继续执行;串口用到定时器,因为在串口的模式1和模式3中需要用定时器的溢出率来设置波特率。我说得不怎么详细,这个几句话说不清。这个你可以先把概念搞懂,之后用列子去理解概念会比较好,不懂的就多问问。

这是我在网上看到的一点资料

这个图未接入任何中断输入IO。中断程序写法是:

void ext0() interrupt 0  //外部中断0

{

//中断服务程序类容

}

void ext1() interrupt 2  //外部中断1

{

//中断服务程序类容

}

void time0() interrupt 1  //定时器0中断

{

//中断服务程序类容

}

void time1() interrupt 3  //定时器0中断

{

//中断服务程序类容

}

void uart() interrupt 4  //串口中断

{

//中断服务程序类容

}

51单片机,中断服务程序中,原则上可以通过按键控制中断的内容,但这么做有点弄巧成拙,偷梁换柱,没实际意义。就你的中断程序,是定时器中断,却在中断程序用按键计数,那定时中断完全失去意义。把按键计数这段程序放在主程序中,别浪费定时器中断。不能为了故意用中断却又不用中断,实在不理解你的本意是什么。

以上就是关于51单片机中断处理程序中关中断的问题全部的内容,包括:51单片机中断处理程序中关中断的问题、为什么51单片机定时器中断程序不执行、mcs-51单片机程序中可以直接调用中断服务程序吗为什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10128977.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存