如何使用单片机C语言实现复位

Python015

如何使用单片机C语言实现复位,第1张

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

第一,直接使用硬件来复位,将原本要接到P3.3的电平接到硬件复位上,当然需要一定的设计

第二,还是硬件,直接将此电平接到看门狗电路上

第三,软件,前提是你的单片机支持软件复位(包括直接复位和内置的看门狗)