在復位電路中,按鍵復位的原理及其程序你知道是什么嗎?本文主要介紹就是關于按鍵復位及其程序的講解,為了方便大家更好的理解,我們首先來看一下什么是復位電路。
復位電路
復位電路是一種用來使電路恢復到起始狀態的電路設備,它的操作原理與計算器有著異曲同工之妙,只是啟動原理和手段有所不同。復位電路,就是利用它把電路恢復到起始狀態。就像計算器的清零按鈕的作用一樣,以便回到原始狀態,重新進行計算。
為什么需要復位
1:因為微處理器(如我們常說的電腦CPU芯片和高端ARM)和微控制器(單片機、低端ARM什么的)芯片都是數字電路芯片,其正常工作是只有0低電平和1高電平這兩個電平狀態,屬于離散系統。而供給芯片的電源輸入卻是模擬電路,屬于連續線性系統。合上開關,芯片的VDD和VSS之間的電壓要達到數字芯片可正常工作的電壓是需要幾毫秒到十幾毫秒的過程的。
2:而也因為微處理器和微控制器是數字電路芯片,其是需要時鐘信號才能工作。不管是內部芯片自帶的低頻RC振蕩器還是外接晶振或者其他時鐘電路,從上電到時鐘電路正常起振也是需要時間的。可以看下圖我用示波器測到的:ARM9上電那幾百毫秒內,電源輸入VCC對地電壓(黃線)、及18.492M時鐘(綠線)引腳對地電壓發生的情況。可以看到芯片在給電的10毫秒內電源開始升到正常供電水平,但至少500毫秒后晶振才開始正常輸出時鐘(之前的雖然有時鐘信號,也可以讓CPU工作,但波形不穩定,按此狀態運行的CPU容易出錯)
所以,需要在芯片上電的時候給復位端一個復位信號讓微處理器和微控制器內部的CPU在剛上電那段時間不要工作。
按鍵復位是什么
51的按鍵復位則是在阻容復位的基礎上增加了一個人工干預復位端的按鈕和一個限流電阻。如下圖,當正常工作的時候,復位端RST和+5V,等同于斷開,通過R7接地。當復位按鈕按下,復位端RST和+5V幾乎連起來,高電平使能芯片復位。并且釋放電容C的電能。
R6的作用是不讓電源+5直接沖擊芯片的復位端(直接沖擊可能會損害芯片,特別是8051這種IO驅動能力較弱的芯片),并且防止電容C因短路放電過快而被損壞。
按鍵復位電路的目的一般是為了開發者在調試電路或程序時候使用,也有在成型的產品使用過程中使其硬復位的功能,比如一些電腦還帶有復位按鈕,按一下機器強行復位,就是這個原理,當然電腦的復位按鍵后面的電路遠復雜于這個,不僅僅是復位一個芯片,主板上的其他芯片也會被強行復位)
(而且ARM和電腦CPU芯片一般不會直接用類似這種按鍵復位電路,使用專用復位芯片有自帶的按鍵接口引腳接按鍵)
單片機按鍵復位程序
void main(void)
{
???unsigned?char?code?rst[]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};??//?復位代碼
???(*((void?(*)())(rst)))();??//?執行上一行代碼,將rst數組當函數調用
}第一句定義一個數組rst[],數組內數據就是完成復位功能的匯編機器碼,具體對應關系為:
clr?a?==?0xe4、push?acc?==?0xc0,0xe0、reti?==0x32
可以看出其程序起到復位的作用,完全就是匯編機器碼的功勞。
而單片機復位的更好方法
clr?a??????????????????????//清除ACC=0
push?acc???????????????//壓0到堆棧——8位
push?acc???????????????//再壓0到堆棧——再8位
reti????????????????????????//返回到0地址,從新執行。
看過上面更簡單的復位方法,讓我們多加考慮一下,為什么要寫成0?別的不行嗎?換成別的后會是什么樣的效果呢?抱著這個想法,我親自經過KEIL V2.4.0編譯后的匯編程序:
可以看出若將(?????*?(??void?(*)(?)??)0?????)?(?);??
改成(?????*?(??void?(*)(?)??)3??????)?(?);
則程序會跳轉到main()函數開始,避開startup文件的初始化……
只所以我說的是會從main()開始,是因為我看過編譯后的匯編文件,找到main的實際物理地址而已,否則我也不會寫成3了。呵呵……下面就是編譯后的匯編結果
C:0x0003??? E4?????? CLR????? A
C:0x0004??? F508???? MOV????? 0x08,A
C:0x0006??? F509???? MOV????? 0x09,A
??? 14:??? while(1) {?
??? 15:???????? if(i == 10) {?
??? 16:??????????? //(??? *(?? ( void (*)( ) )?? (rst)??? )??? )();? // 執行上一行代碼,將rst數組當函數調用?
C:0x0008??? E509???? MOV????? A,0x09
C:0x000A??? 640A???? XRL????? A,#0x0A
C:0x000C??? 4508???? ORL????? A,0x08
C:0x000E??? 7005???? JNZ????? C:0015
??? 17:??????????? (??? *(?? ( void (*)( ) )?? (3)??? )??? )();? // 執行上一行代碼,將rst數組當函數調用?
C:0x0010??? 120003???LCALL??? main(C:0003)
??? 18:???????? } else {?
C:0x0013??? 80F3???? SJMP???? C:0008
??? 19:???????????????? i++;?
C:0x0015??? 0509???? INC????? 0x09
C:0x0017??? E509???? MOV????? A,0x09
C:0x0019??? 70ED???? JNZ????? C:0008
C:0x001B??? 0508???? INC????? 0x08
??? 20:???????? }
為了進行給大家一個很好的比較,從視覺上得到一定的感覺,我又再次將3改回成0,大家看看編譯后的匯編結果是什么樣子的;
下面的代碼是函數(?????*?(??void?(*)(?)??)0?????)?(?);?? 這個編譯后的結果
C:0x0003??? E4?????? CLR????? A
C:0x0004??? F508???? MOV????? 0x08,A
C:0x0006??? F509???? MOV????? 0x09,A
??? 14:??? while(1) {?
??? 15:???????? if(i == 10) {?
??? 16:??????????? //(??? *(?? ( void (*)( ) )?? (rst)??? )??? )();? // 執行上一行代碼,將rst數組當函數調用?
C:0x0008??? E509???? MOV????? A,0x09
C:0x000A??? 640A???? XRL????? A,#0x0A
C:0x000C??? 4508???? ORL????? A,0x08
C:0x000E??? 7005???? JNZ????? C:0015
??? 17:??????????? (??? *(?? ( void (*)( ) )?? (0)??? )??? )();? // 執行上一行代碼,將rst數組當函數調用?
C:0x0010??? 120000???LCALL??? C_STARTUP(C:0000)
??? 18:???????? } else {?
C:0x0013??? 80F3???? SJMP???? C:0008
??? 19:???????????????? i++;?
C:0x0015??? 0509???? INC????? 0x09
C:0x0017??? E509???? MOV????? A,0x09
C:0x0019??? 70ED???? JNZ????? C:0008
C:0x001B??? 0508???? INC????? 0x08
??? 20:???????? }
結語
簡而言之,復位電路的目的就是在上電的瞬間提供一個與正常工作狀態下相反的電平。一般利用電容電壓不能突變的原理,將電容與電阻串聯,上電時刻,電容沒有充電,兩端電壓為零,此時,提供復位脈沖,電源不斷的給電容充電,直至電容兩端電壓為電源電壓,電路進入正常工作狀態。
關于復位電路以及按鍵復位的介紹就到這了,希望通過本文能讓你對復位電路以及按鍵復位有更深的理解。
評論
查看更多