当前位置:首页 > 单片机 > 单片机
[导读]可以定义一个指向复位向量(0x0000)的函数指针,然后在C程序中需要软复位的地方调用该函数:((void (code *) (void)) 0x0000) ();例如,以下程序不断地复位:void reset (void){  ((void (code *) (void)) 0x0000)

可以定义一个指向复位向量(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


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭