在復(fù)位電路中,按鍵復(fù)位的原理及其程序你知道是什么嗎?本文主要介紹就是關(guān)于按鍵復(fù)位及其程序的講解,為了方便大家更好的理解,我們首先來(lái)看一下什么是復(fù)位電路。
復(fù)位電路
復(fù)位電路是一種用來(lái)使電路恢復(fù)到起始狀態(tài)的電路設(shè)備,它的操作原理與計(jì)算器有著異曲同工之妙,只是啟動(dòng)原理和手段有所不同。復(fù)位電路,就是利用它把電路恢復(fù)到起始狀態(tài)。就像計(jì)算器的清零按鈕的作用一樣,以便回到原始狀態(tài),重新進(jìn)行計(jì)算。
為什么需要復(fù)位
1:因?yàn)?a target="_blank">微處理器(如我們常說(shuō)的電腦CPU芯片和高端ARM)和微控制器(單片機(jī)、低端ARM什么的)芯片都是數(shù)字電路芯片,其正常工作是只有0低電平和1高電平這兩個(gè)電平狀態(tài),屬于離散系統(tǒng)。而供給芯片的電源輸入?yún)s是模擬電路,屬于連續(xù)線性系統(tǒng)。合上開(kāi)關(guān),芯片的VDD和VSS之間的電壓要達(dá)到數(shù)字芯片可正常工作的電壓是需要幾毫秒到十幾毫秒的過(guò)程的。
2:而也因?yàn)槲⑻幚砥骱臀⒖刂破魇菙?shù)字電路芯片,其是需要時(shí)鐘信號(hào)才能工作。不管是內(nèi)部芯片自帶的低頻RC振蕩器還是外接晶振或者其他時(shí)鐘電路,從上電到時(shí)鐘電路正常起振也是需要時(shí)間的??梢钥聪聢D我用示波器測(cè)到的:ARM9上電那幾百毫秒內(nèi),電源輸入VCC對(duì)地電壓(黃線)、及18.492M時(shí)鐘(綠線)引腳對(duì)地電壓發(fā)生的情況。可以看到芯片在給電的10毫秒內(nèi)電源開(kāi)始升到正常供電水平,但至少500毫秒后晶振才開(kāi)始正常輸出時(shí)鐘(之前的雖然有時(shí)鐘信號(hào),也可以讓CPU工作,但波形不穩(wěn)定,按此狀態(tài)運(yùn)行的CPU容易出錯(cuò))
所以,需要在芯片上電的時(shí)候給復(fù)位端一個(gè)復(fù)位信號(hào)讓微處理器和微控制器內(nèi)部的CPU在剛上電那段時(shí)間不要工作。
按鍵復(fù)位是什么
51的按鍵復(fù)位則是在阻容復(fù)位的基礎(chǔ)上增加了一個(gè)人工干預(yù)復(fù)位端的按鈕和一個(gè)限流電阻。如下圖,當(dāng)正常工作的時(shí)候,復(fù)位端RST和+5V,等同于斷開(kāi),通過(guò)R7接地。當(dāng)復(fù)位按鈕按下,復(fù)位端RST和+5V幾乎連起來(lái),高電平使能芯片復(fù)位。并且釋放電容C的電能。
R6的作用是不讓電源+5直接沖擊芯片的復(fù)位端(直接沖擊可能會(huì)損害芯片,特別是8051這種IO驅(qū)動(dòng)能力較弱的芯片),并且防止電容C因短路放電過(guò)快而被損壞。
按鍵復(fù)位電路的目的一般是為了開(kāi)發(fā)者在調(diào)試電路或程序時(shí)候使用,也有在成型的產(chǎn)品使用過(guò)程中使其硬復(fù)位的功能,比如一些電腦還帶有復(fù)位按鈕,按一下機(jī)器強(qiáng)行復(fù)位,就是這個(gè)原理,當(dāng)然電腦的復(fù)位按鍵后面的電路遠(yuǎn)復(fù)雜于這個(gè),不僅僅是復(fù)位一個(gè)芯片,主板上的其他芯片也會(huì)被強(qiáng)行復(fù)位)
(而且ARM和電腦CPU芯片一般不會(huì)直接用類似這種按鍵復(fù)位電路,使用專用復(fù)位芯片有自帶的按鍵接口引腳接按鍵)
單片機(jī)按鍵復(fù)位程序
void main(void)
{
???unsigned?char?code?rst[]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};??//?復(fù)位代碼
???(*((void?(*)())(rst)))();??//?執(zhí)行上一行代碼,將rst數(shù)組當(dāng)函數(shù)調(diào)用
}第一句定義一個(gè)數(shù)組rst[],數(shù)組內(nèi)數(shù)據(jù)就是完成復(fù)位功能的匯編機(jī)器碼,具體對(duì)應(yīng)關(guān)系為:
clr?a?==?0xe4、push?acc?==?0xc0,0xe0、reti?==0x32
可以看出其程序起到復(fù)位的作用,完全就是匯編機(jī)器碼的功勞。
而單片機(jī)復(fù)位的更好方法
clr?a??????????????????????//清除ACC=0
push?acc???????????????//壓0到堆?!?位
push?acc???????????????//再壓0到堆棧——再8位
reti????????????????????????//返回到0地址,從新執(zhí)行。
看過(guò)上面更簡(jiǎn)單的復(fù)位方法,讓我們多加考慮一下,為什么要寫成0?別的不行嗎?換成別的后會(huì)是什么樣的效果呢?抱著這個(gè)想法,我親自經(jīng)過(guò)KEIL V2.4.0編譯后的匯編程序:
可以看出若將(?????*?(??void?(*)(?)??)0?????)?(?);??
改成(?????*?(??void?(*)(?)??)3??????)?(?);
則程序會(huì)跳轉(zhuǎn)到main()函數(shù)開(kāi)始,避開(kāi)startup文件的初始化……
只所以我說(shuō)的是會(huì)從main()開(kāi)始,是因?yàn)槲铱催^(guò)編譯后的匯編文件,找到main的實(shí)際物理地址而已,否則我也不會(huì)寫成3了。呵呵……下面就是編譯后的匯編結(jié)果
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)??? )??? )();? // 執(zhí)行上一行代碼,將rst數(shù)組當(dāng)函數(shù)調(diào)用?
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)??? )??? )();? // 執(zhí)行上一行代碼,將rst數(shù)組當(dāng)函數(shù)調(diào)用?
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:???????? }
為了進(jìn)行給大家一個(gè)很好的比較,從視覺(jué)上得到一定的感覺(jué),我又再次將3改回成0,大家看看編譯后的匯編結(jié)果是什么樣子的;
下面的代碼是函數(shù)(?????*?(??void?(*)(?)??)0?????)?(?);?? 這個(gè)編譯后的結(jié)果
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)??? )??? )();? // 執(zhí)行上一行代碼,將rst數(shù)組當(dāng)函數(shù)調(diào)用?
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)??? )??? )();? // 執(zhí)行上一行代碼,將rst數(shù)組當(dāng)函數(shù)調(diào)用?
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:???????? }
結(jié)語(yǔ)
簡(jiǎn)而言之,復(fù)位電路的目的就是在上電的瞬間提供一個(gè)與正常工作狀態(tài)下相反的電平。一般利用電容電壓不能突變的原理,將電容與電阻串聯(lián),上電時(shí)刻,電容沒(méi)有充電,兩端電壓為零,此時(shí),提供復(fù)位脈沖,電源不斷的給電容充電,直至電容兩端電壓為電源電壓,電路進(jìn)入正常工作狀態(tài)。
關(guān)于復(fù)位電路以及按鍵復(fù)位的介紹就到這了,希望通過(guò)本文能讓你對(duì)復(fù)位電路以及按鍵復(fù)位有更深的理解。
評(píng)論
查看更多