51单片机中 定时器定时到了,进入中断

服务程序后,处理完后,是回到主程序吗?如果主程序中有延时函数,且比定时器的要长,当下次中断处理完后,回到主程序,从哪里开始执行?若在中断服务程序中加延时函数,且时间比定时器长,那么延时函数下面的程序不就不能执行了吗?那也进不了主程序了?

记得在介绍51单片机对中断服务程序的处理时,说的是中断发生时不管在处理什么程序都会停下来转去处理中断服务程序,并保存当前pc地址,以能在中断服务程序处理完成之后能返回这个地址继续处理之前未处理完毕的程序。所以呢,若是在中断发生之前有一个比中断发生时间更长的延时函数,不外乎就两种情况,要么保存当前pc地址,待中断服务程序处理完成重新开始执行被中断处的函数,要么保存当前pc地址并记录程序状态,待处理完成后接着延时,不重新延时。
如果刚才所说的没帮到你,我建议你自己写一个实验程序,就用定时器产生中断,4.5s一次吧,在写一个简单的延时函数,多延时一些,尽量大于4.5s,然后延时函数中用到的变量使用全局变量以方便在主函数中读取值并显示。如果每次读取为0,那么就是重新开始延时,如果每次都不一样,说明保存了状态的,中断服务程序用来读取值。
希望我的回答能帮助到你。追问

我认为执行中断服务程序后,是继续回到主程序中执行,这个可以理解。如果在中断服务程序中又有延时函数,并且比定时长,那么延时函数后的程序就永远不会执行,因为每次时间到,就重新执行中断服务程序。我想问下,执行中断服务程序,也保存中断服务程序中的pc值? 不是只保存主函数中的pc值吗?

追答

首先,我说的pc就是主程序的pc值,然后,中断发生后产生中断请求,这个期间如果有个很长的延时我的确还不知道会不会继续计数,可以写个程序实验一下,毕竟动手得出的结论比看到的要深刻得多,当然办法是人想的,如果你只是想解决这个问题,你可以在进入中断的时候关闭中断计数,TRx=0就行,如果你想弄清楚其中的原理,网上可以搜索,自己可以写实验程序。最后,愿你成功。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-26
哪里进中断, 就回哪里去追问

若在中断服务程序中加延时函数,延时比定时器要长,那么每次进中断的时候,延时函数后的程序就不能执行了呀。每中断一次,不是执行一次服务程序吗?那延时后的程序就不能执行,因为每次延时还没完,就中断了。

追答

你说的是两个中断吗?

如果是, 他们之间有优先级的, 优先级高的先执行, 执行完了还是会返回原来的程序中运行的

追问

不是,就是在中断服务程序中有一个大于定时时间,的延时函数,延时函数后面还有程序,那么延时还没完,就又一次重新执行中断服务程序了,因为时间到执行中断服务程序,那么延时函数后面的程序,就永远不会执行了。

追答

中断没退出, 是不可能再次进中断的, 除非有更高优先级中断产生

一般中断服务程序尽量简短, 不然实时性会比较差