• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

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

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

    作者: 時間:2012-10-09 來源:網(wǎng)絡 收藏

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

      方法一:

      void Reset(void)

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

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

      }

      先來看一下這段程序編譯后的匯編碼:

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

      C:0x0016 C0E0 PUSH ACC(0xE0) //壓0到堆棧——8位

      C:0x0018 C0E0 PUSH ACC(0xE0) //再壓0到堆棧——再8位

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

      C:0x001B 020015 LJMP C:0015

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

      方法二:

      void Reset(void)

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

      }

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

      方法三:

      void Reset(void)

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

      }

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

      總結(jié)

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

    51單片機相關文章:51單片機教程


    c語言相關文章:c語言教程


    單片機相關文章:單片機教程


    單片機相關文章:單片機視頻教程


    單片機相關文章:單片機工作原理




    評論


    相關推薦

    技術專區(qū)

    關閉
    主站蜘蛛池模板: 海晏县| 银川市| 绥棱县| 梧州市| 大化| 青海省| 汉川市| 永寿县| 保定市| 随州市| 隆昌县| 什邡市| 安康市| 樟树市| 兰溪市| 兴海县| 寿光市| 阿瓦提县| 周宁县| 宁晋县| 绍兴市| 东明县| 郴州市| 谢通门县| 青冈县| 盐城市| 社旗县| 齐河县| 吉首市| 乡宁县| 扶风县| 滁州市| 越西县| 平安县| 万山特区| 阳新县| 宝丰县| 理塘县| 西宁市| 波密县| 遂宁市|