<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > MCS-51系列單片機的軟件復位方法

MCS-51系列單片機的軟件復位方法

作者: 時(shí)間:2012-10-09 來(lái)源:網(wǎng)絡(luò ) 收藏

  在系統的應用中,我們經(jīng)常需要用到復位技術(shù)來(lái)實(shí)現抗干擾。有的(如8098)有專(zhuān)門(mén)的復位指令,某些增強型雖然沒(méi)有復位指令,但片內集成了WATCHDOG電路,可以很容易實(shí)現復位。而普及型單片機(如8031和8032)既無(wú)復位指令,又不帶硬件WATCHDOS,如果不外接硬件WATCHDOG,就必須采用技術(shù)。所謂就是用一系列指令來(lái)模仿復位操作。在單片機中,只要用指令使程序從起始地址(0x0000)開(kāi)始執行,就可以復位單片機。本文介紹三種用C語(yǔ)言實(shí)現的簡(jiǎn)單方法

  方法一:

  void Reset(void)

  { unsigned char code rst[ ]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};

  (*((void (*)(void))(rst)))();

  }

  先來(lái)看一下這段程序編譯后的匯編碼:

  C:0x0015 E4 CLR A //清除ACC=0

  C:0x0016 C0E0 PUSH ACC(0xE0) //壓0到堆?!?位

  C:0x0018 C0E0 PUSH ACC(0xE0) //再壓0到堆?!?位

  C:0x001A 32 RETI // 清除中斷激活標志并返回到0x0000執行

  C:0x001B 020015 LJMP C:0015

  可以發(fā)現,數組rst[]中的內容恰恰是上面前四行的匯編機器碼,即程序中將代碼當作數組的數據來(lái)存儲。再來(lái)研究后面的那句函數調用(*((void (*)(void))(rst)))(),rst是數組名(即數組首元素地址),(void(*)(void))是函數指針的強制類(lèi)型轉換運算,(void(*)(void))(rst)是將數組名rst強制轉換成一個(gè)無(wú)參數無(wú)返回值的函數的指針,指向rst的首地址。只需調用(*((void (*)(void))(rst)))(),即可將數組中的數據當作函數代碼來(lái)運行,因為無(wú)論是數據還是代碼都是以二進(jìn)制存儲的,本質(zhì)上是相同的。

  方法二:

  void Reset(void)

  { ( * ( void (*)( ) )0 ) ( );

  }

  這段程序摘自《C缺陷與陷阱》,比方法一中的更為簡(jiǎn)潔。與方法一類(lèi)似,它也是使用函數指針的強制類(lèi)型轉換運算將函數指針指向一個(gè)非函數的地址,但不同的是它直接指向程序起始地址0x0000,方法一先指向數組rst,再利用數組中的機器碼使程序跳轉到0x0000。它編譯后的匯編只有一句LCALL C_STARTUP(C:0000)。

  方法三:

  void Reset(void)

  { VoidFunc(); //請注意,函數VoidFunc()在程序中未定義

  }

  上面的VoidFunc()函數雖然沒(méi)有定義,但在Keil環(huán)境中編譯時(shí)只是警告,并不報錯。編譯后的匯編碼為L(cháng)JMP C_STARTUP(C:0000),同方法二極為相似,使程序跳轉到0x0000開(kāi)始執行,同樣實(shí)現了軟件復位的功能。這種做法最為簡(jiǎn)單,但不符合ANSI C標準中函數應先定義后調用的要求,在其它某些環(huán)境中可能無(wú)法編譯通過(guò),因此不推薦。

  總結

  我們知道,在MCS-51單片機的所有指令中,只有RETI指令能清除中斷請求標志。因此只有方法一能在中斷子程序中被調用,方法二和方法三都不能,否則系統復位后,中斷請求標志仍在,可能造成系統剛復位就錯誤地進(jìn)入了中斷子程序。實(shí)際應用中應根據實(shí)際情況,選擇合適的方法。

51單片機相關(guān)文章:51單片機教程


c語(yǔ)言相關(guān)文章:c語(yǔ)言教程


單片機相關(guān)文章:單片機教程


單片機相關(guān)文章:單片機視頻教程


單片機相關(guān)文章:單片機工作原理




關(guān)鍵詞: MCS-51系列 單片機 軟件復位

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>