在C51中如何实现软复位?
扫描二维码
随时随地手机看文章
可以定义一个指向复位向量(0x0000)的函数指针,然后在C程序中需要软复位的地方调用该函数:
((void (code *) (void)) 0x0000) ();
例如,以下程序不断地复位:
void reset (void)
{
((void (code *) (void)) 0x0000) ();
}
void main (void)
{
reset ();
}
也许你会注意到前面所提到的复位程序并不恢复8051的中断系统,它也不去复位任何的8051外设。若上述代码在一个中断例程中执行,则8051
会阻止同级中断的产生。因此,在中断服务例程中不能使用这个复位程序。
以下的一小段汇编过程同样实现软复位,而且它可以在中断或者主程序中调用。它通过将返回地址(0x0000)压入堆栈并执行一条RETI指令(从
中断中返回)来实现复位目的。这个汇编过程会清掉中断状态然后从0000H开始执行程序:
?PR?RESET SEGMENT CODE
RSEG ?PR?RESET
; C prototype: void reset (void);
PUBLIC reset
reset: POP ACC ; pop return address
POP ACC
CLR A ; push 0 as new
PUSH ACC ; return address to stack
PUSH ACC
RETI ; execute return of interrupt
END
若调用该复位过程时选择的不是寄存器组0,程序可能达不到期望的结果。这时应该在上面的汇编过程中或者在启动代码中添加一条选择寄存器组0的指令:
MOV PSW, #0