在C51中如何实现软复位?
可以定义一个指向复位向量(0x0000)的函数指针,然后在C程序中需要软复位的地方调用该函数:
((void (code *) (void)) 0x0000) ();
例如,以下程序不断地复位:
void reset (void)
{
((void (code *) (void)) 0x0000) ();
}
void main (void)
{
reset ();
}
也许你会注意到前面所提到的复位程序并不恢复8051的中断系统,它也不去复位任何的8051外设 。若上述代码在一个中断例程中执行,则8051
【在C51中如何实现软复位?】
会阻止同级中断的产生 。因此,在中断服务例程中不能使用这个复位程序 。
以下的一小段汇编过程同样实现软复位,而且它可以在中断或者主程序中调用 。它通过将返回地址(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
推荐阅读
- AT89C51芯片烧录驱动源程序
- 中式装修风格特点 中式装修风格与新中式装修风格的区别
- 锌钢百叶窗特点 锌钢百叶窗的优势
- 2016最新房屋装修价格表 装修报价差距为何如此巨大
- 床有哪些尺寸睡张好床很有必要
- 双层床尺寸及其种类介绍
- 100平米三室二厅装修预算 小贴士:识破报价中的障眼法
- 豆浆机的保养与维护
- 三星已在印度市场上推出QLED电视
- 泉佳美硅藻泥怎么样泉佳美硅藻泥价格贵在哪