久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

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

作者:文于鷹   來源:本站原創   點擊數:  更新時間:2013年12月06日   【字體:

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

 

方法一:

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執行

C:0x001B  020015  LJMP   C:0015

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

方法二:

void Reset(void)

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

}

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

方法三:

void Reset(void)

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

}

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

總結

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

關閉窗口

相關文章

主站蜘蛛池模板: 日韩α片 | 综合久久99 | 中文字幕 视频一区 | 日韩在线视频一区 | 亚洲一二三区在线观看 | av在线免费观看网站 | 成人网av | 国产欧美日韩综合精品一 | 中文字字幕在线中文乱码范文 | 亚洲精品一区二区 | 六月成人网| 狠狠av | 精品国产一区二区三区性色av | 国产精品一区二区久久精品爱微奶 | 成人精品一区二区 | 日韩av一区在线观看 | 欧美日韩亚洲一区 | 色999视频 | 黄色成人在线网站 | 综合久久综合久久 | 色本道| 超碰人人爱| 免费av手机在线观看 | 五月婷婷在线播放 | 粉嫩一区二区三区四区公司1 | 色爱综合网 | 九九热免费在线观看 | 大学生a级毛片免费视频 | 欧美成人精品一区二区男人看 | 黑人巨大精品欧美一区二区免费 | 亚洲三区在线观看 | 久久51| 欧美精品网站 | 久久精品久久综合 | 精品久久99 | www.国产精品 | 在线播放日韩 | 亚洲精品乱码 | 一区中文字幕 | 羞羞网站在线观看 | 亚洲精品乱码久久久久久久久 |