可以使用下面的程序跳到0000H实现软复位,下面的程序实际上是一个函数指针,指针指向了0000H地址。
((void (code *) (void)) 0x0000) ();
下面的例子将实现软件自复位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寄存器组。
以上文章由龙啸九天翻译自KEIL FAQ,可能有疏漏,欢迎提出。
呵呵,设置下看门狗,然后进入死循环,这样就自动复位了哦,呵呵
不过要条件设置好,否则每次都进入复位了,也有些是有复位命令的,要具体看单片机了。
第一种方法是不管哪种单片机都适用的。
很容易实现啊,不够需要外接复位芯片 比如:MAX813L,用一个IO口连接至MAX813L的第8脚,置0后就可以使MAX813输出复位信号。详细可参看MAX813L的资料。当然用别的复位芯片也行。
我不明白你需要这样有什么用,回到初始状态只是内存和特殊寄存器回到初始状态。完全可以用程序回复啊。
很不推荐这样做
真的非得这样的话
那么
void main(void)
{
start:
....
其他代码
串口相关代码
goto start;
}
补充:主要是优秀的代码是需要依靠优秀的软件结构的,使用goto语句直接破坏了这种结构,goto语句使得原来的局部变量和堆栈中的数据全部失效了
这么干好像不是太好