
你还没有理解中断的意义!中断产生了,单片机就停止执行主函数,进入中断执行中断(中断得打开),当执行完中断后,单片机又回到主函数执行。就像我现在在看别人提出的问题,当我看到你的问题时(中断产生),我就进来回答(执行中断),回答完后我得继续看别人提出的问题(返回主函数),我回去看别人提出的问题时既不会从头看起,也不会往后看很多,而是从你问题后的问题继续看!
我告诉你思路,例子就不举了,很简单:
1、定义一个dword变量xxx用以存储原来的中断向量(所谓中断向量即中断发生时执行的子程序入口地址)
2、编写自己的中断处理过程(yyy proc far),该处理过程内应保存所有可能修改的寄存器,并在返回前恢复原状;一般情况下,如果还需要执行原有中断处理过程,那么调用jmp far xxx链接到原来的中断过程;如果不需要执行原有过程,那么直接以iret返回即可
3、在主程序开始时,先调用int 35h,获取指定中断号的中断向量,将返回的中断向量存储在xxx变量中
4、调用int 25h,将指定的中断号的中断向量指向自己的过程yyy
5、当前程序在退出前,应再次调用int 25h,将被修改掉的中断号的中断向量恢复为xxx变量的值
理论上来说,中断完成后,程序指针回到断点,继续往下执行
但如果你要转到指定地点执行的话,我提供个方法,如下
你可以在中断中设置一个全局变量,如果中断后,改变这个全局变量,在程序的关键部位检测这个变量是否改变,如果改变了执行“goto +标签;”的跳转指令,就可以让程序到指定位置
但该方式不能中断立即跳转到指定位置,但是因为单片机的运算速度实在太快了,知道你在关键部位写如个检测程序,如if(k==1)goto L1;//中断改变全局变量k=1,如果改变了k,那跳转到指定地址L1
这样的方式,只要你在程序关键部位设置合理,是完全能满足设计要求的
会造成数据混乱。
在中断服务程序中,由于中断服务程序与主程序并行执行,因此,中断服务程序使用的变量必须是局部变量或静态变量,不能使用全局变量,而框架程序中使用的extern关键字则是声明全局变量,因此在中断服务程序中不能使用,否则会造成数据混乱。
extern是C语言的一个关键字,它通常的作用是用来修饰全局变量或者函数。被修饰的变量和函数在别的地方已经声明定义过,在另一个文件c文件引用可以它的对应h头文件引入,就用extern来实现。
可能我的理解有点偏差,如果你是避免在主程序中使用时也改变了这个全局变量的话,你可以这样处理:再定义一个变量就可以了,在主程序里面先把中断里面的那个全局变量赋值给新增加的这个变量,然后在进行相应处理
如果你是想这个变量再主程序用完后,再对这个值进行初始化的话,你可以在使用这个值的时候,就把相应的中断关掉(或者改变相应的标志位,保证在中断出现的时候,也不会再修改这个全局变量),用完并对这个值重新初始化,再打开中断(或置相应的标志位)
可以定义一个全局变量标志,例如flag,初值为0。
一旦进入中断,就置位,flag=1。
子程序里加个对flag的判断:if(flag) {flag=0;return;}//标志清零,返回主程序。
不过不知道你这程序是否复杂,如果子程序一层套一层的就可能比较麻烦,要加好多flag的判断。
while(IR==0);while(IR==1);中断里面这样用,如果等待不到反馈信号不就死在那里了么有点死循环的味道最好用一个全局布耳变量来在主程序调用子程序(内容就是中断里面的语句),而中断程序只是负责改写布耳变量的状态。可以的话考虑看门狗复位或者多线程机制编程。
以上就是关于51系列单片机在处理中断时影响主程序吗处理中断程序时主程序还在继续执行吗还是已经停止了全部的内容,包括:51系列单片机在处理中断时影响主程序吗处理中断程序时主程序还在继续执行吗还是已经停止了、汇编中断程序!、中断服务程序完成后怎样跳到main函数指定位置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)