×
单片机 > 单片机程序设计 > 详情

在C51中如何实现软复位?

发布时间:2020-05-26 发布时间:
|

可以定义一个指向复位向量(0x0000)的函数指针,然后在C程序中需要软复位的地方调用该函数:


((void (code *) (void)) 0x0000) ();

例如,以下程序不断地复位:



void reset (void)

{

  ((void (code *) (void)) 0x0000) ();

}


void main (void)

{

  reset ();

}


也许你会注意到前面所提到的复位程序并不恢复8051的中断系统,它也不去复位任何的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


若调用该复位过程时选择的不是寄存器组0,程序可能达不到期望的结果。这时应该在上面的汇编过程中或者在启动代码中添加一条选择寄存器组0的指令:


MOV  PSW, #0

 


关键字:C51  软复位

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC单片机的多路AD切换程序设计