51单片机中 定时器定时到了,进入中断
服务程序后,处理完后,是回到主程序吗?如果主程序中有延时函数,且比定时器的要长,当下次中断处理完后,回到主程序,从哪里开始执行?若在中断服务程序中加延时函数,且时间比定时...
服务程序后,处理完后,是回到主程序吗?如果主程序中有延时函数,且比定时器的要长,当下次中断处理完后,回到主程序,从哪里开始执行?若在中断服务程序中加延时函数,且时间比定时器长,那么延时函数下面的程序不就不能执行了吗?那也进不了主程序了?
展开
2个回答
展开全部
记得在介绍51单片机对中断服务程序的处理时,说的是中断发生时不管在处理什么程序都会停下来转去处理中断服务程序,并保存当前pc地址,以能在中断服务程序处理完成之后能返回这个地址继续处理之前未处理完毕的程序。所以呢,若是在中断发生之前有一个比中断发生时间更长的延时函数,不外乎就两种情况,要么保存当前pc地址,待中断服务程序处理完成重新开始执行被中断处的函数,要么保存当前pc地址并记录程序状态,待处理完成后接着延时,不重新延时。
如果刚才所说的没帮到你,我建议你自己写一个实验程序,就用定时器产生中断,4.5s一次吧,在写一个简单的延时函数,多延时一些,尽量大于4.5s,然后延时函数中用到的变量使用全局变量以方便在主函数中读取值并显示。如果每次读取为0,那么就是重新开始延时,如果每次都不一样,说明保存了状态的,中断服务程序用来读取值。
希望我的回答能帮助到你。
如果刚才所说的没帮到你,我建议你自己写一个实验程序,就用定时器产生中断,4.5s一次吧,在写一个简单的延时函数,多延时一些,尽量大于4.5s,然后延时函数中用到的变量使用全局变量以方便在主函数中读取值并显示。如果每次读取为0,那么就是重新开始延时,如果每次都不一样,说明保存了状态的,中断服务程序用来读取值。
希望我的回答能帮助到你。
追问
我认为执行中断服务程序后,是继续回到主程序中执行,这个可以理解。如果在中断服务程序中又有延时函数,并且比定时长,那么延时函数后的程序就永远不会执行,因为每次时间到,就重新执行中断服务程序。我想问下,执行中断服务程序,也保存中断服务程序中的pc值? 不是只保存主函数中的pc值吗?
追答
首先,我说的pc就是主程序的pc值,然后,中断发生后产生中断请求,这个期间如果有个很长的延时我的确还不知道会不会继续计数,可以写个程序实验一下,毕竟动手得出的结论比看到的要深刻得多,当然办法是人想的,如果你只是想解决这个问题,你可以在进入中断的时候关闭中断计数,TRx=0就行,如果你想弄清楚其中的原理,网上可以搜索,自己可以写实验程序。最后,愿你成功。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询