51單片機軟件復(fù)位匯編代碼
POP ACC ; pop return address
POP ACC
;彈出PC
MOV SP,#30H ;復(fù)位后SP為07H ,這樣就會復(fù)位椎棧
MOV PSW,#00H ;清寄存器
CLR A ; push 0 as new
PUSH ACC ; return address to stack
PUSH ACC
;重置PC=0并壓到椎棧中
RETI ; execute return of interrupt
;程序又開始從0000H處開始運行,但寄存器內(nèi)的值不確定!
用C51實現(xiàn)軟件復(fù)位
方法1:
void(*SoftReset)();
SoftReset=0;
SoftReset();
解釋:利用函數(shù)型指針,使函數(shù)型指針指向的函數(shù)的入口地址為0。
方法2: 嵌入?yún)R編
#pragma asm
LJMP 0FFF0h;//ljmp 0000h
#pragma endasm
方法3: 在C51編程過程中,用一個不存在函數(shù),引起復(fù)位。
如下程序,編譯正常,但執(zhí)行到 reset()處即復(fù)位了。其時匯編代碼為
LCALL C:0000。
extern void rest(void); //實際并不存在。
void main()
{
rest(); //復(fù)位
}
方法4:如果有用看門狗,使用看門狗復(fù)位。
擴展閱讀:8位單片機 16位 32位區(qū)別?