51單片機軟件復(fù)位
我們知道51單片機可以把數(shù)據(jù)放在程序存儲器里面,也就是程序和數(shù)據(jù)沒有本質(zhì)區(qū)別,都是一些特定的數(shù)據(jù)。如果我們將一段程序,以數(shù)組數(shù)據(jù)的形式存儲在程序存儲器里面,那么是不是也可以執(zhí)行呢?答案是肯定的。言歸正傳,先來看看這個數(shù)組數(shù)據(jù) 0xe4,0xc0,0xe0,0xc0,0xe0,0x22,中Keil的匯編窗口看出,它其實是四條匯編語句:
CLR A ;編譯后為 0XE4
PUSH ACC ;編譯后為 0XC0 0XE0
PUSH ACC ;編譯后為 0XC0 0XE0RET ;函數(shù)返回 編譯后為 0X22可以看出,其實這就是51單片機的匯編復(fù)位指令。其實這里只是C復(fù)位代碼的寫法難看而已,rst是一個指向程序存儲器的字節(jié)指針,我們把它轉(zhuǎn)換為指向返回為空的函數(shù)的指針,返回為空的函數(shù)指針的格式為:void (*)(),這個表達式比較復(fù)雜因運算符優(yōu)先級關(guān)系,用括號括號括起來,就成了(void (*)())rst,這樣rst就成函數(shù)指針了,再來看看求函數(shù)指針的一般格式(*p)(),把p代換成(void (*)())rst括起來就成了(*((void (*)())rst))(),這說將這個復(fù)位的全部面紗揭開了。以下為測試,驗證程序:#include <AT89X51.h>
main()
{
unsigned char code rst[6]={0xe4,0xc0,0xe0,0xc0,0xe0,0x22};//定義一個code類型的數(shù)組,一定要為code類型
while(1)//循環(huán)測試
{
TMOD=5;//測試用可以是任何語名
TI=1;
P1=0;
P1=1;
P2=2;
P3=3;
(*((void (*)())rst))();//復(fù)位
SCON=0x50;
}
}
編輯:admin 最后修改時間:2019-08-05