80C51復位標志位的設置與應用分析
對于沒有配備備用電源的單片機應用系統(tǒng),還可以考慮利用E2PROM在斷電之前的瞬間來轉(zhuǎn)存復位標志位,以便在斷電之后也不會徹底消失。該情況下既可選用外掛E2PROM數(shù)據(jù)存儲器(如8腳串行的24C01、93C46或25C040等)的電路方案,也可選用內(nèi)部本身帶有E2PROM數(shù)據(jù)存儲器的單片機型號,如AT89S8252等。這樣在斷電之前的瞬間,利用電源濾波電容C2上的少量殘留能量,即可完成對于E2PROM的燒寫操作。
一般的初始化程序段落的編寫方法很簡單,不過它僅適用于那些要求不高、功能也很簡單的單片機項目。這類項目(如一些小家電之類的單片機應用)幾乎不存在很強的“過程性”或“不間斷性”,對于隨時可能發(fā)生的復位操作以及重新從頭運行的用戶程序,不會帶來太大的影響或破壞性后果。
而對于“過程性”或“不間斷性”要求很強的單片機項目,一旦發(fā)生偶然性復位操作,并且重新從頭運行用戶程序,那么將會帶來極大的負面影響或破壞性后果。例如,單片機控制的面包機,在一次加工面包的過程中,會經(jīng)歷攪拌、加熱等工序;假若其間發(fā)生意外復位并且重新從頭執(zhí)行程序,則會導致成為廢品或者燒焦。電腦控制的手術機器人,在一次手術過程中如果發(fā)生意外復位并且返工,將會帶來難以想象的嚴重后果。電腦控制的導彈,在對準目標發(fā)射之后的飛行過程中,如果發(fā)生意外復位并且重新從頭執(zhí)行程序,那么將會產(chǎn)生難以預料的結(jié)果。
綜上所述,單片機在工作過程中,受到意外干擾而進行復位操作,如果說是不可避免的,那么復位之后從何處或在何種背景下開始運行程序,則是可以人為安排的。因此,復位標志位的應用方法實質(zhì)上就是復位處理程序的編寫方法。復位處理程序的處理流程如圖2所示。
圖2 復位處理程序流程
類似于編寫UART串口通信中斷服務程序的思路,在進入中斷程序之后首先要檢測中斷標志位,看是一次接收中斷(RI=1)還是一次發(fā)送中斷(SI=1),然后再進入不同程序分支進行針對性服務。從圖2中可以看出,在從復位矢量0000H開始執(zhí)行用戶程序時,首先應該檢測復位標志寄存器,判斷是電源初始加電還是其他復位源引起的復位或程序計數(shù)器PC清零。
① 如果是電源初始加電,則進行原始狀態(tài)的初始化。這種情況最簡單。
?、?如果屬于程序跑飛引起的軟件復位、軟硬件復位、非法地址復位,或者人工強行復位,則應該依據(jù)具體情況盡量恢復數(shù)據(jù)或修正參數(shù),以便盡最大可能不影響或少影響程序的正常運行(恢復和修正數(shù)據(jù)的具體算法這里不再深入探討)。
?、?如果是欠壓復位,則盡量從被打斷的程序斷點處重新開始執(zhí)行程序。具體的實現(xiàn)方法和步驟可以是: 復位之前——單片機響應PFO中斷請求而進入其服務程序后,保存堆棧指針SP當前值到指定RAM單元,把單片機推入停機狀態(tài);復位之后——待電源恢復后,MAX813L得電而從RESET端送出高電平信號,喚醒停機狀態(tài)下的單片機。若喚醒后的單片機再檢測到是欠壓復位,則首先復原先前的SP值,再利用一條RET(或RETI)指令彈出停機之前的程序斷點到PC,從而可以繼續(xù)執(zhí)行前面的任務。
評論