单片机如何用C程序复位?

来源:百度知道 编辑:UC知道 时间:2024/05/17 11:04:16
本人在写个串口通讯程序中需要单片机回到初始状态,但是苦于无法让单片机复位。想请教有没有能让单片机复位的c语言程序?希望能提供代码。谢谢!
好像也可以,谢谢,我是想让单片机回到初始状态。为什么不推荐这样做呢,程序可读性下降吗?

可以使用下面的程序跳到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,可能有疏漏,欢迎提出。

很容