原创 C51软件复位

2013-12-24 17:14 1105 18 18 分类: MCU/ 嵌入式
 用C51实现软件复位
 
下面的例子将实现软件自复位void reset (void)
{
((void (code *) (void)) 0x0000) ();
}
 
void main (void)
{
reset ();
}
 
 
你可能注意到以上的软复位程序并不能清除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
 
 
以上程序在选择bank 0寄存器组时工作良好,假如选择的不是bank0寄存器组,那么可能无法获得预料的结果。你应该在以上的程序或启动代码中加上“MOV  PSW, #0”来选择bank 0寄存器组。
 
 
 
 
 
 

文章评论0条评论)

登录后参与讨论
我要评论
0
18
关闭 站长推荐上一条 /2 下一条