问:
在C51单片机源程序中怎样实现软件复位?
答:
您可以使用下面的程序跳到0000H实现软复位,下面的程序实际上是一个函数指针,指针指向了0000H地址。
((void(code*)(void))0x0000)();
下面的例子将实现软件自复位voidreset(void)
{
((void(code*)(void))0x0000)();
}
voidmain(void)
{
reset();
}
你可能注意到以上的软复位程序并不能清除8051的中断系统和某些8051的外围设备,当您在中断程序中调用上面的软件复位程序后,中断将再不能触发。因此,以上的软复位程序不能在中断子程序中调用。
下面的小段汇编函数可以在中断程序或主程序中调用,该函数将0x0000压栈,然后通过“RETI”出栈,这将清除中断环境并让程序从0000H重新开始运行。
?PR?RESETSEGMENTCODE
RSEG?PR?RESET
;Cprototype:voidreset(void);
PUBLICreset
reset:POPACCpopreturnaddress
POPACC
CLRApush0asnew
PUSHACCreturnaddresstostack
PUSHACC
RETIexecutereturnofinterrupt
END
以上程序在选择bank0寄存器组时工作良好,假如选择的不是bank0寄存器组,那么可能无法获得预料的结果。你应该在以上的程序或启动代码中加上“MOVPSW,#0”来选择bank0寄存器组。