我是个单片机新手,自己感觉有性趣就在学!但现在优先级的问题不知道怎么写求各位知道的帮帮忙……谢谢!假如是1~5,1为最高级5为最低级 现在只自己用中断但不知道怎么写优先级,求知道的帮帮忙!
有些单片机的中断优先级在默认的情况下是确定的,不需要设置,例如51单片机,其优先级从高到低以及向量地址是:00H 复位中断 优先级0(最高)03H 外部中断0 10BH 定时器0 213H 外部中断1 31BH 定时器1 423H 串口 5单片机在运行时,当发生中断时,CPU会自动把相应的中断向量地址装载到PC中,也就是程序会自动跑到相应中断的向量地址上面去。例如发生定时器0中断,在发生中断前PC的值不管多少,一发生中断,PC的值就会变成0BH。在执行完中断服务程序后会返回到发生中断时的程序地址。所以,相应的中断服务程序必须写在对应的中断向量的地址,但是由于两个相邻向量的地址之间的间隔太小,不能放下太多的指令,所以在用汇编写程序的时候一般是在其向量地址上面放一条跳转指令,而正真的中断服务程序写在别的地方。例如:ORG 0BH;定时器0中断向量地址 LCALL TIMER0;跳转到真正的中断服务程序。...... ;其他主程序TIMER0: ;真正的中断服务程序 ..........RETI ;返回到主程序而用C语言就更简单了,把中断服务程序就是一个函数,不过这个函数加个interrupt的关键字来修饰就是了。而interrupt后面加的是个中断的中断号。由于复位中断的发生是不可逆的,发生后不可能再返回到发生中断之前。所以复位中断没有服务程序,也就没有中断号。各个中断的中断号就是上表中的优先级再减1。例如定时器0的中断函数。void Timer0(void) interrupt 1{// add your code} 各个中断的优先级是在上面那个表中,从上到小依次降低的。高优先级的中断可以打断低优先级的中断,同等级的中断不能相互打断。不过通过设置IP寄存器的值,可以改变中断的优先级。例如我想把定时器0的优先级设置得比外部0高,我就把IP寄存器中的PT0位设置为1,其他位为0就可以了。
温馨提示:答案为网友推荐,仅供参考
第1个回答 推荐于2016-09-08
1、正常情况下,优先顺序为:
外部中断0
定时器0
外部中断1
定时器1
串口
定时器2
2、IP中的位控制中断优先级,分别为:
PX0:外部中断0
PT0:定时器0
PX1:外部中断1
PT1:定时器1
PS:串口
PT2:定时器2
3、当其为1时,该位对应的中断将设为高优先级。中断响应是:同级中断比如IP各位都为0 或都为1时,同时到达时优先按如上顺序响应中断,当一个中断在执行时,其他中断只能排队等候。当其中一位为1比如PS=1时,那么无论为0的任何中断在执行中都将被打断,优先响应高级中断。因此,要保证需要的中断享有至高权限,将相应的控制位设为1就可以了,比如串口优先保证那么初始化时加入:PS=1;就OK。
外部中断0
定时器0
外部中断1
定时器1
串口
定时器2
2、IP中的位控制中断优先级,分别为:
PX0:外部中断0
PT0:定时器0
PX1:外部中断1
PT1:定时器1
PS:串口
PT2:定时器2
3、当其为1时,该位对应的中断将设为高优先级。中断响应是:同级中断比如IP各位都为0 或都为1时,同时到达时优先按如上顺序响应中断,当一个中断在执行时,其他中断只能排队等候。当其中一位为1比如PS=1时,那么无论为0的任何中断在执行中都将被打断,优先响应高级中断。因此,要保证需要的中断享有至高权限,将相应的控制位设为1就可以了,比如串口优先保证那么初始化时加入:PS=1;就OK。
第2个回答 2013-04-22
一般这样写 void 函数名(自己定义的)() interrupt N 函数名 自己定义的 如 定时器0 void timer0() interrupt 2 interrupt 为 关键字 表示 中断符号 N 为 中断优先级 例如 0 为 外部中断0 有时还会看见后面跟 using 整数 这 是表示选用的寄存器 完整的例子 外部中断0 void Ex0() interrupt 0 { // add your code}
第3个回答 2013-04-22
分两级,高级和低级,通过给IE寄存器赋值来确定中断源的优先级。
如IE=0x01;就是将外部中断0设置为高级中断源。
如IE=0x01;就是将外部中断0设置为高级中断源。
第4个回答 2013-04-22
写那么中断嵌套干嘛,你是要实现什么功能?51里面又可以控制中断优先级的寄存器,自己可以随便写写然后看下效果嘛,具体功能的话再发问题,你这样,即使高手来了,也不知道你想要问什么,而且单片机这东西,别人给你写好了程序,在人家的板子上可以用,在你的板子上就未必可以有想要的效果。