閱讀相關系列章節(jié)
單片機關鍵技術(shù)基礎詳解(一)
一、CPU與單片機的復位電路的作用及基本復位方式
在上電或復位過程中,控制CPU的復位狀態(tài):這段時間內(nèi)讓CPU保持復位狀態(tài),而不是一上電或剛復位完畢就工作,防止CPU發(fā)出錯誤的指令、執(zhí)行錯誤操作,也可以提高電磁兼容性能。
無論用戶使用哪種類型的單片機,總要涉及到單片機復位電路的設計。而單片機復位電路設計的好壞,直接影響到整個系統(tǒng)工作的可靠性。許多用戶在設計完單片機系統(tǒng),并在實驗室調(diào)試成功后,在現(xiàn)場卻出現(xiàn)了“死機”、“程序走飛”等現(xiàn)象,這主要是單片機的復位電路設計不可靠引起的。
基本的復位方式
單片機在啟動時都需要復位,以使CPU及系統(tǒng)各部件處于確定的初始狀態(tài),并從初態(tài)開始工作。89系列單片機的復位信號是從RST引腳輸入到芯片內(nèi)的施密特觸發(fā)器中的。當系統(tǒng)處于正常工作狀態(tài)時,且振蕩器穩(wěn)定后,如果RST引腳上有一個高電平并維持2個機器周期(24個振蕩周期)以上,則CPU就可以響應并將系統(tǒng)復位。單片機系統(tǒng)的復位方式有:手動按鈕復位和上電復位。
1、手動按鈕復位
手動按鈕復位需要人為在復位輸入端RST上加入高電平(圖1)。一般采用的辦法是在RST端和正電源Vcc之間接一個按鈕。當人為按下按鈕時,則Vcc的+5V電平就會直接加到RST端。手動按鈕復位的電路如所示。由于人的動作再快也會使按鈕保持接通達數(shù)十毫秒,所以,完全能夠滿足復位的時間要求。

?
圖1
2、上電復位
AT89C51的上電復位電路如圖2所示,只要在RST復位輸入引腳上接一電容至Vcc端,下接一個電阻到地即可。對于CMOS型單片機,由于在RST端內(nèi)部有一個下拉電阻,故可將外部電阻去掉,而將外接電容減至1?F。上電復位的工作過程是在加電時,復位電路通過電 容加給RST端一個短暫的高電平信號,此高電平信號隨著Vcc對電容的充電過程而逐漸回落,即RST端的高電平持續(xù)時間取決于電容的充電時間。為了保證系統(tǒng)能夠可靠地復位,RST端的高電平信號必須維持足夠長的時間。上電時,Vcc的上升時間約為10ms,而振蕩器的起振時間取決于振蕩頻率,如晶振頻率為10MHz,起振時間為1ms;晶振頻率為1MHz,起振時間則為10ms。在圖2的復位電路中,當Vcc掉電時,必然會使RST端電壓迅速下降到0V以下,但是,由于內(nèi)部電路的限制作用,這個負電壓將不會對器件產(chǎn)生損害。另外,在復位期間,端口引腳處于隨機狀態(tài),復位后,系統(tǒng)將端口置為全“l(fā)”態(tài)。如果系統(tǒng)在上電時得不到有效的復位,則程序計數(shù)器PC將得不到一個合適的初值,因此,CPU可能會從一個未被定義的位置開始執(zhí)行程序。

?
圖2
3、積分型上電復位
常用的上電或開關復位電路如圖3所示。上電后,由于電容C3的充電和反相門的作用,使RST持續(xù)一段時間的高電平。當單片機已在運行當中時,按下復位鍵K后松開,也能使RST為一段時間的高電平,從而實現(xiàn)上電或開關復位的操作。
根據(jù)實際操作的經(jīng)驗,下面給出這種復位電路的電容、電阻參考值。
圖3中:C:=1uF,Rl=lk,R2=10k

?
圖3 積分型上電復位電路
二、編制單片機應用程序的步驟和難點
1前言
如何編寫單片機應用程序,這是一個實踐性很強的題目,也是1項艱苦而細致的工作。如果按照一定的步驟并且找出難點,事先對這些難點加以處理,能夠收到事半功倍的效果。下面根據(jù)實際工作中的經(jīng)驗,談談實際開發(fā)中必經(jīng)的幾個步驟和可能遇到的難處理。對于1個單片機應用程序,其編制過程如圖1所示。

?
2編制步驟
2.1搞清功能和編寫方案
接到一個單片機項目設計文件之后,并不是馬上動手編寫程序,而是仔細研究用戶提出的技術(shù)要求或者技術(shù)說明,根據(jù)這些技術(shù)要求和技術(shù)說明,也就是客戶要求,把程序應該具備的主要功能寫清楚,寫仔細,這是最關鍵的工作。如不清楚,應向客戶和使用者問清楚,否則在設計完成以后會發(fā)現(xiàn)有些功能由于事先沒有考慮清楚再重新設計將會很麻煩,可能有些需要重新增加的功能很容易補充,而有些可能由于沒有事先考慮周全而無法實現(xiàn)。
2.2編寫總流程圖和各功能模塊流程圖
根據(jù)要完成的程序功能寫出總流程圖,根據(jù)總流程圖把整個程序劃分成幾個主要的功能模塊,每個功能模塊都要寫出基本流程圖,這主要是為以后的程序編寫起到一個指導作用。當然,在實際的程序編寫過程中肯定會有一些改動,1個基本的流程會指導您在寫程序的過程中不會出現(xiàn)太大的偏差。例如,編寫鍵盤掃描并且區(qū)分是功能鍵還是數(shù)字鍵的子程序,如果是功能鍵就轉(zhuǎn)相應的功能處理程序;如果是數(shù)字鍵就在相應的數(shù)碼管上顯示出來;可以寫出其流程圖,如圖2所示。

?
這些資料主要是編程語言方面的書籍、雜志等。因為程序語言的有些資料任何編程人員都不可能記得太清楚,如每條指令的含義,具體操作每條指令所牽涉的硬件電路等。如果資料準備得比較充分,可以放在案邊,若有需要,順手查閱。
2.4人機界面的編程
用單片機實現(xiàn)的項目人機界面相對簡單。若為LED顯示,應根據(jù)LED的位數(shù)選取簡單、明燎、用戶一看便知的提示符;顯示的數(shù)據(jù)位數(shù)應充分考慮用戶提出的技術(shù)要求。
2.5分析編程的難點和技術(shù)解決方案
即使1個熟練的編程人員,編程過程中會遇到一些困難。為了能比較順利地完成程序設計,應根據(jù)程序所完成的功能和程序流程對整個程序的框架分析一下,并根據(jù)自己掌握的技能定位整個程序的難點,然后找到最佳的算法。例如對于稍微大一點的項目,鍵盤掃描和顯示部分的程序編制應該是單片機編程的難點。
(1)無論是鍵盤掃描還是顯示過程都和硬件部分息息相關
送片選信號選取鍵盤就必須搞清單片機芯片是高電平選通還是低電平選通;選通鍵盤后,還需要讀回鍵盤的狀態(tài)。對讀回的鍵盤狀態(tài)還要進行防抖處理;若鍵盤抖動,放棄讀回的數(shù)據(jù),重新讀鍵盤狀態(tài);若確定為鍵盤按下,才能對按鍵值進行處理;處理后的鍵值送顯示或作為其它使用。由此可知以上的每一過程都和硬件電路打交道。
(2)鍵盤掃描和顯示牽涉到的算法比較復雜
因為掃描鍵盤的過程就是遍歷每個按鍵,識別抖動,識別按鍵是否松開等過程;除此之外還要延遲合適的時間,以便再次讀取鍵值。顯示過程也要遍歷每個數(shù)碼管或液晶字符;其中查表過程,送顯示過程都要用到比較復雜的循環(huán)遍歷算法。
(3)數(shù)字鍵和功能鍵的區(qū)分
是數(shù)字鍵就送顯示,是功能鍵就轉(zhuǎn)相應的功能子程序,把兩者結(jié)合起來就構(gòu)成比較復雜的散轉(zhuǎn)程序。MCS51單片機有現(xiàn)成的散轉(zhuǎn)子程序可供參閱,PIC可以參照MCS51的散轉(zhuǎn)子程序套用。
以上3點都是單片機編程的難點部分,在編程之前都應該找出來仔細分析。通過分析,將所有可能成為難點之處都一一找出并找出相應的算法,在以后的程序編寫過程中也相應地比較順利。
2.6寫程序
在上面的準備工作完成后,就可以著手編寫程序。因為有了明確的程序流程,有了充足的資料,可能遇到的難點基本上找到了解決方法;這樣,事先準備得比較充分,即使在以后的程序編寫過程中遇到困難,也較易解決。這樣就可以節(jié)省很多時間,以便靜下心來認真按照方案和流程編寫程序。另外,一般寫完1個功能程序就進行調(diào)試,通過后再編寫另外1個功能代碼,這樣可以防止全部代碼編寫完畢后再調(diào)試可能帶來的相互影響,從而可以搞清楚到底是哪部分程序有問題。
2.7程序調(diào)試
程序的調(diào)試過程是1個比較復雜的過程,有些需要高度的技巧和一定的方法。一般的編程軟件都提供單步、單步越過、斷點、運行到光標處等基本方法,一般掌握這幾種基本方法就可以解決絕大部分問題。經(jīng)過長時間的調(diào)試實踐之后自然就可以掌握一定的調(diào)試技巧,即熟能生巧。
3結(jié)束語
以上是編程一般單片機程序必須經(jīng)過的7大步驟,假如這7個過程的工作做得比較充分,一定能夠編寫出令人滿意的單片機程序。
三、關于單片機中的flash和eeprom
FLASH的全稱是FLASH EEPROM,但跟常規(guī)EEPROM的操作方法不同
FLASH 和EEPROM的最大區(qū)別是FLASH按扇區(qū)操作,EEPROM則按字節(jié)操作,二者尋址方法不同,存儲單元的結(jié)構(gòu)也不同,F(xiàn)LASH的電路結(jié)構(gòu)較簡單,同樣容量占芯片面積較小,成本自然比EEPROM低,因而適合用作程序存儲器,EEPROM則更多的用作非易失的數(shù)據(jù)存儲器。當然用FLASH做數(shù)據(jù)存儲器也行,但操作比EEPROM麻煩的多,所以更“人性化”的MCU設計會集成FLASH和EEPROM兩種非易失性存儲器,而廉價型設計往往只有 FLASH,早期可電擦寫型MCU則都是EEPRM結(jié)構(gòu),現(xiàn)在已基本上停產(chǎn)了。
至于那個“總工”說的話如果不是張一刀記錯了的話,那是連基本概念都不對,只能說那個“總工”不但根本不懂芯片設計,就連MCU系統(tǒng)的基本結(jié)構(gòu)都沒掌握。在芯片的內(nèi)電路中,F(xiàn)LASH和EEPROM不僅電路不同,地址空間也不同,操作方法和指令自然也不同,不論馮諾伊曼結(jié)構(gòu)還是哈佛結(jié)構(gòu)都是這樣。技術(shù)上,程序存儲器和非易失數(shù)據(jù)存儲器都可以只用FALSH結(jié)構(gòu)或EEPROM結(jié)構(gòu),甚至可以用“變通”的技術(shù)手段在程序存儲區(qū)模擬“數(shù)據(jù)存儲區(qū)”,但就算如此,概念上二者依然不同,這是基本常識問題。
沒有嚴謹?shù)墓ぷ骶?,根本無法成為真正的技術(shù)高手。
EEPROM:電可擦除可編程只讀存儲器,F(xiàn)lash的操作特性完全符合EEPROM的定義,屬EEPROM無疑,首款Flash推出時其數(shù)據(jù)手冊上也清楚的標明是EEPROM,現(xiàn)在的多數(shù)Flash手冊上也是這么標明的,二者的關系是“白馬”和“馬”。至于為什么業(yè)界要區(qū)分二者,主要的原因是 Flash EEPROM的操作方法和傳統(tǒng)EEPROM截然不同,次要的原因是為了語言的簡練,非正式文件和口語中Flash EEPROM就簡稱為Flash,這里要強調(diào)的是白馬的“白”屬性而非其“馬”屬性以區(qū)別Flash和傳統(tǒng)EEPROM。
Flash的特點是結(jié)構(gòu)簡單,同樣工藝和同樣晶元面積下可以得到更高容量且大數(shù)據(jù)量下的操作速度更快,但缺點是操作過程麻煩,特別是在小數(shù)據(jù)量反復重寫時,所以在MCU中Flash結(jié)構(gòu)適于不需頻繁改寫的程序存儲器。
在很多應用中,需要頻繁的改寫某些小量數(shù)據(jù)且需掉電非易失,傳統(tǒng)結(jié)構(gòu)的EEPROM在此非常適合,所以很多MCU內(nèi)部設計了兩種EEPROM結(jié)構(gòu),F(xiàn)LASH的和傳統(tǒng)的以期獲得成本和功能的均衡,這極大的方便了使用者。隨著ISP、IAP的流行,特別是在程序存儲地址空間和數(shù)據(jù)存儲地址空間重疊的MCU系中,現(xiàn)在越來越多的MCU生產(chǎn)商用支持IAP的程序存儲器來模擬EEPROM對應的數(shù)據(jù)存儲器,這是低成本下實現(xiàn)非易失數(shù)據(jù)存儲器的一種變通方法。為在商業(yè)宣傳上取得和雙EEPROM工藝的“等效”性,不少采用Flash程序存儲器“模擬”(注意,技術(shù)概念上并非真正的模擬)EEPROM數(shù)據(jù)存儲器的廠家紛紛宣稱其產(chǎn)品是帶EEPROM的,嚴格說,這是非常不嚴謹?shù)模倘擞猩倘说哪康暮头椒?,用Flash“模擬”EEPROM可以獲取更大商業(yè)利益,所以在事實上,技術(shù)概念混淆的始作俑者正是他們。
從成本上講,用Flash“模擬”EEPROM是合算的,反之不會有人干,那么那位“總工”和樓上某網(wǎng)友所說的用EEPROM模擬Flash是怎么回事呢?這可能出在某些程序存儲空間和數(shù)據(jù)存儲空間連續(xù)的MCU上。這類MCU中特別是存儲容量不大的低端MCU依然采用EEPROM作為非易失存儲器,這在成本上反而比采用Flash和傳統(tǒng)EEPROM雙工藝的設計更低,但這種現(xiàn)象僅僅限于小容量前提下。因Flash工藝的流行,現(xiàn)在很多商人和不夠嚴謹?shù)募夹g(shù)人員將程序存儲器稱為Flash,對于那些僅采用傳統(tǒng)EEPROM工藝的MCU而言,他們不求甚解,故而錯誤的將EEPROM程序存儲器稱為“ 模擬Flash”,根本的原因是他們未理解Flash只是一種存儲器結(jié)構(gòu)而非存儲器的用途,錯誤的前提自然導致錯誤的結(jié)論。商業(yè)上講,用EEPROM模擬 Flash是不會有人真去做的愚蠢行為,這違背商業(yè)追求最大利益的原則,技術(shù)上也不可行,而對于技術(shù)人員而言,尤其是IC業(yè)內(nèi)的“總工”如果再這么講那只能說明他或她要么根本不了解相關技術(shù)細節(jié),要么非常不嚴謹,這都不符合“總工”的身份。本質(zhì)的問題是Flash是一種存儲器類型而非MCU中的程序存儲器,即使MCU的程序存儲器用的是Flash,但其逆命題不成立。
在此寫此文,一方面是要澄清技術(shù)概念,另一方面更是不想令錯誤的說法誤人子弟,搞技術(shù)也需要嚴謹?shù)目茖W精神。
28系列是最早的EEPROM,28F則是最早的Flash,甚至Flash一詞是Intel在1980S為推廣其28F系列起的“廣告名”,取其意“快”,僅此而已。當年的Flash不比傳統(tǒng)EEPROM容量更大只是容量起點稍高。至于現(xiàn)在的手冊中有無EEPROM字樣并不重要,非要“較枝”的話,看看內(nèi)容有無“電可擦除”存儲器的說法,至少我隨手打開SST的Flash手冊上都寫的很清楚,不過這些根本就是無意義的皮毛,典型的白馬非馬論。
至于AVR的地址連續(xù)問題是我隨手之誤,應指68HC系列,但即使如此,就算我沒有用過包括AVR在內(nèi)的任何MCU也跟Flash的性質(zhì)毫無關系。
四、自制AVR仿真器
自制AVR仿真器用JtagICE仿真Mega16芯片進行開發(fā),開發(fā)成功后,才移植到M8/48/88/168上。只要開發(fā)時留意一下,移植并不會有困難。
使用貼面IC的效果圖:
?
但使用貼面IC一個不好的地方是,芯片無法拆下來(如果我們要重新燒錄芯片的ROM,能拆下來就方便多了)。所以,這個活動,我們推薦使用DIP40封裝的Mega16. 以下是實物圖:
?
?
網(wǎng)上關于自制Jtag的線路有許多種。根據(jù)搜集到的資料,設計出本文介紹的最簡易、制作最容易的 JTAG。RS232接口是用分立件制作,就地取材,簡單可靠.
本線路的J1雙排十針座,既可以做Jtag,又可以做ISP(通過跳針JP1控制)。JP1跳針短路時,J1用作ISP下載,方便更新本Jtag的ROM。J1 跳針開路時, 用作JTAG.
?
如果你有232芯片,可以按以下線路代替上面的分立件RS232部分:

?
燒錄文件:
按以上的硬件制作好PCB后,檢查焊接無誤,就可以進行燒錄了。
燒錄的方法有很多,我(armok)推薦的一個方法是:將M16芯片從JTAG板上拆下來,放到普通的帶ISP口的實驗板,使用SL-ISP1.32 軟件,將本文附錄所帶的將AVR Studio 4.10 Rom 燒錄文件中的flash.rom 及 epprom.rom 直接燒入到Jtag ATmega16 就可以了。

五、80C51的復位技術(shù)盤點
?
標準80C51片內(nèi)現(xiàn)有的復位邏輯比較簡單,只有通過一條復位引腳RST進行外部擴展。技術(shù)手冊中給出了上電復位(POR,power on reset)和人工復位(MRST,manual reset)電路的接線方法;借助于一只專用外圍芯片,如MAX813L或DS1323等,來擴充欠壓復位(LVR,low voltage reset)和看門狗復位(WDR,watch dog timer reset)也有文章介紹。
本文將介紹三種非常規(guī)擴展復位方式:軟件復位(SWR,software reset)、軟硬件復位(SHR,software and hardware reset)和非法地址復位(IAR,illegal address reset)。
軟件陷阱技術(shù)及其改良方法
軟件陷阱(software trap)是一種捕捉程序“跑飛”的編程方法。通??梢栽诔绦蛑性O置軟件陷阱,引導程序失控的單片機跳轉(zhuǎn)到一個指定的地址去執(zhí)行,最終回復到正常軌道上來。軟件陷阱可以設置在用戶程序的空隙處或者轉(zhuǎn)移指令之后,還可以利用一系列的陷阱指令來填充程序存儲器的空白區(qū)。實現(xiàn)軟件陷阱功能的指令是一個“5字節(jié)指令串”,通常包含2條單字節(jié)NOP指令和1條3字節(jié)跳轉(zhuǎn)指令。
NOP ;利用空操作指令
NOP ;來增加捕捉有效性
LJMP SWRST;無條件跳轉(zhuǎn)到指定地址去
其中“SWRST”可以是一段“軟件復位程序”的入口地址標號,也可以是復位矢量“0000H”,即主程序入口地址。
如果SWRST等于復位矢量0000H,則會把捕捉到的跑飛程序引導到初始化程序入口地址去執(zhí)行,從而達到回復到正常軌道的目的。這種處理方法只適合中斷功能沒有被啟用的場合。可以設想,假如是在(低級或高級)中斷服務程序中跑飛的,這時即使把程序拉回到起點,而中斷激活觸發(fā)器不能夠被清除,會影響以后的中斷請求無法被 CPU響應。
如果SWRST等于“軟件復位程序”的入口地址,則會引發(fā)一次“軟件復位”。關于軟件復位程序的設計方法,隨后介紹。
總之,這種方法的指導思想是指,把未使用的ROM空間用跳轉(zhuǎn)引導指令填滿,作為軟件“陷阱”,以捕獲“飛掉”的程序,并強行將捕獲到的跑飛程序引向一個特定的地址,在那里由一段專門處理錯誤的程序進行處理,以恢復系統(tǒng)的正常運行。為提高跑飛程序的捕獲率,通常還要在引導指令之前放置上幾條空操作指令 NOP。理由是,8051的指令編碼采用的是不等長方式,長度分別為1~3字節(jié),而程序跑飛又是通過非法隨機改變PC值形成的。假若跑飛后的PC值落到3 字節(jié)指令LJMP的中間,就會把操作數(shù)當作操作碼來執(zhí)行,將會產(chǎn)生不可預知的結(jié)果。為了提高捕捉的有效性,就在LJMP指令之前至少填充2條單字節(jié)的 NOP指令。
如果把“5字節(jié)指令串”改換成如下作者新設計的“4字節(jié)指令串”,陷阱指令將會更加有效。理由是,該指令對應的目標碼為“00 20 00 20H”,這段碼無論重復多少次都是等同的。另外,應該在程序存儲器0020H開始的3字節(jié)中再放置一條跳轉(zhuǎn)到“軟件復位程序”真正入口的中轉(zhuǎn)指令 LJMP SWRST。經(jīng)過核查,0020H~0022H字節(jié)恰好位于定時器T1中斷矢量區(qū)尾部和串口中斷矢量之前。
SWRST0 EQU 0020H;定義“軟件復位程序”的間接入口地址為“0020H”
NOP ;填充一條單字節(jié)的空操作指令,機器碼是“00H”
LJMP SWRST0 ;無條件跳轉(zhuǎn)到指定地址去。對應的機器碼是“20 00 20H”
軟件復位技術(shù)
軟件復位是一種新技術(shù),目前有越來越多的新型單片機配備了該功能。例如Philips公司的P87LPC700和P89LPC900系列、TI- BB公司的MSC1200系列和SunPlus公司的SPMC65系列等,內(nèi)部都設計了專門用于實現(xiàn)軟件復位的控制寄存器或者控制位。
軟件復位是在利用軟件陷阱技術(shù)或軟件看門狗技術(shù)時,必需配套實施的一項后續(xù)處理工作。所謂“軟件復位”是一種由用戶軟件控制的復位活動,就是利用一系列指令來模擬硬件復位所實現(xiàn)的各種操作內(nèi)容,并且重新從頭開始執(zhí)行用戶程序。
其中的操作內(nèi)容應該包含:(1)對于標準80C51的21個特殊功能寄存器SFR的復位操作,利用MOV指令很容易實現(xiàn)。全部復位可能不是必需的,只管那些在用戶程序中用到的SFR即可,可以由用戶自己定制。
2)對于無統(tǒng)一編址的程序計時器PC的復位,利用一條跳轉(zhuǎn)指令即可。(3)中斷激活觸發(fā)器的復位既容易被人們忽略,也不容易實現(xiàn)。理由是它們對于用戶程序是不可見的,無法直接讀寫其內(nèi)容。有的編程人員采用LJMP 0000H(機器碼為20 00 00H)作為軟件陷阱,認為直接跳轉(zhuǎn)到復位矢量就完成了軟件復位,就是這類失誤案例的典型代表。
清除中斷激活觸發(fā)器有何必要呢?程序的跑飛是隨機發(fā)生的,其起飛點完全可能發(fā)生在低級或高級中斷服務子程序中,這時的中斷激活觸發(fā)器已經(jīng)被置位。如果在程序回復之后沒有及時清除它們,將阻止以后出現(xiàn)的所有的同級或低級中斷請求。

?
圖1 中斷激活觸發(fā)器示意圖
中斷激活觸發(fā)器包含高權(quán)組和低權(quán)組兩個觸發(fā)器,電路組成如圖1所示,該圖是根據(jù)作者的理解和經(jīng)驗繪制的。電路中包括1個邏輯或門G1、兩個S-R觸發(fā)器FF1和FF2。當CPU響應低級中斷請求之后,F(xiàn)F1被置位,其Q = 0,封鎖“低權(quán)組”不再受理新的低級中斷請求;當CPU響應高級中斷請求之后,因為G1的作用而使FF1和FF2同時被置位,F(xiàn)F1的Q = 0封鎖“低權(quán)組”,F(xiàn)F2的Q = 0封鎖“高權(quán)組”,不再受理新的高級和低級中斷請求。
如何設計“軟件復位程序”呢?其編寫方法如下。
SWRST: ;定義軟件復位程序的實際入口地址
CLR EA ;首先關閉中斷源總使能位
SETB F0 ;設置一個軟件復位標志位
MOV P0,#0FFH ;設定通用端口P0為高阻輸入狀態(tài)
MOV P1,#0FFH ;設定通用端口P1為高阻輸入狀態(tài)
MOV P2,#0FFH ;設定通用端口P2為高阻輸入狀態(tài)
MOV P3,#0FFH ;設定通用端口P3為高阻輸入狀態(tài)
MOV PSW,#00H ;設定程序狀態(tài)字寄存器為原始值
…… ;(據(jù)實際需要還可初始化其他SFR)
MOV DPTR,#SWR0 ;為RETI準備彈出地址,而又不想改變執(zhí)行順序
PUSH DPL ;壓棧低字節(jié),在先
PUSH DPH ;壓棧高字節(jié),在后
RETI ;中斷返回指令,清除高級中斷激活觸發(fā)器
SWR0: CLR A ;準備復位地址
PUSH ACC ;壓棧低字節(jié)00H
PUSH ACC ;壓棧高字節(jié)00H
RETI ;清除低級中斷激活觸發(fā)器,并跳到0000H
以下幾點需要說明:(1)首先關閉總的中斷使能位,以確保軟件復位過程順利完成;(2)其中的核心指令是中斷返回指令RETI,因為在整個指令集中只有該指令能夠清除中斷激活觸發(fā)器;(3)末尾RETI指令的作用還代替了一條3字節(jié)的“LJMP 0000H”指令;(4)由軟件陷阱捕獲的跑飛程序并不一定同時置位了所有兩個中斷激活觸發(fā)器,但是該程序仍然適用,并且也沒有任何負面影響;(5)軟件復位標志這里利用了PSW中的一個通用位F0,也可以利用F1、GF0、GF1以及RAM字節(jié)單元或位單元等;(6)軟件復位是一種不外擴任何硬件電路、不導致單片機發(fā)生狀態(tài)遷移、純軟件的復位方法。
軟硬件復位技術(shù)
軟硬件復位是軟件復位功能的一種延伸,也是單片機的一種自主復位方式,既具有軟件復位的特點(可以由編程人員按需要來啟用),又具有硬件復位的特點(能夠?qū)崿F(xiàn)硬件復位的全部操作內(nèi)容)。這種復位方式是本文作者自行規(guī)劃、設計和命名的。

?
(a)分立件電路方式

?
(b)IC電路方式
在上述軟件復位的基礎上很容易實現(xiàn)這里所說的軟硬件復位方式,不過需要外擴一定的硬件電路的支持。圖2是兩種配合軟硬件復位的外擴電路。其中,圖2 (a)電路是在普通復位電路的基礎上,添加1只三極管Q1和3只阻容元件而成的,并且其導通與截止由一條并口引腳控制,如P1.0。平時P1.0維持高電平,Q1截止;當內(nèi)部軟件需要實施該復位時,從P1.0腳輸出低電平,Q1導通把RST腳拉高,強行復位單片機。這里R3、R4和C2起著延時和限流的雙重作用。圖2(b)電路是在MAX812M對接80C51電路基礎上添加一條連線而成的,其工作原理與上類似。該連線把MAX812M的人工復位輸入腳 MR和一條通用I/O腳(如P1.0)連接起來即可。
如何設計“軟硬件復位程序”呢?其編寫方法如下。
SHRST: ;定義軟硬件復位程序的入口地址
SET F1 ;設置一個軟件復位標志位
CLR P1.0 ;從P1.0輸出低電平,開始實施軟硬件復位
ORL PCON,#02H;置位PD,令單片機進入停機狀態(tài),即PD模式;經(jīng)過延時后RST被拉高,迫使單片機進入復位狀態(tài);在復位操作完成并且喚醒單片機之后,將重新從0000H開始執(zhí)行用戶程序
以下幾點需要說明:(1)如果利用這里的“軟硬件復位程序”代替前面的“軟件復位程序”,可以簡化用戶程序并且復位進行得徹底,但是需要增加一些硬件,并且也把可以定制的復位操作給轉(zhuǎn)化成了固定的復位操作。(2)在圖2所示的軟硬件復位的支撐電路,除了可以提供復位信號給單片機,還有一個很大的好處,就是可以為其他外圍電路提供復位信號,這彌補了傳統(tǒng)80C51的一個欠缺。
標準80C51的復位引腳RST是只能輸入的單向結(jié)構(gòu),不能由單片機主動地為外圍芯片提供同步的復位信號;而MC68HC05和MC68HC08系列、ST公司的ST7系列,以及許多新款51兼容單片機都把RST引腳設計為可輸入/輸出的雙向結(jié)構(gòu),在內(nèi)部看門狗溢出復位的同時,也從RST輸出一個高電平脈沖,控制其他外圍芯片與單片機進行同步復位操作。例如,ATMEL公司的AT89S51/52、T89C51RD2、AT89C51RC等型號和 Philips公司的P89C51RC、P89C51RA2/RB2/RD2等型號,它們都帶有內(nèi)部看門狗。
非法地址復位技術(shù)
一般來說,非法地址復位是指由于意外原因?qū)е鲁绦蛴嫊r器PC內(nèi)容被破壞,而迫使CPU試圖到一個非法地址去抓取指令代碼來執(zhí)行,就強迫單片機進行復位操作。
由于51系列單片機的硬件結(jié)構(gòu)采用的是“哈佛架構(gòu)”,其程序區(qū)和數(shù)據(jù)區(qū)截然分開、獨立編址,不存在CPU到RAM區(qū)抓取指令的可能性,因此這極大地降低了非法尋址的概率。但是這并不能徹底杜絕非法尋址的可能性,尤其是對于哪些實際配備ROM容量遠小于64Kb的情況。這時就可以狹義地定義非法地址是 PC值超出ROM實際容量的地址編碼。

?
(a)IC電路直接復位方式

?
(b)先中斷后復位方式
圖3是兩種實現(xiàn)非法地址復位的支撐電路。其中,圖3(a)電路是在圖2(b)的基礎上改變一條連線而成的。該連線一端連接PSEN信號引腳,該引腳專門用來提供選通外擴程序存儲器ROM的片選信號;另一端連接MAX812M的人工復位輸入腳MR。平時PSEN引腳一直維持在高電平上;只有當CPU試圖非法到外部ROM抓取指令時,PSEN引腳才會送出低電平脈沖,就是巧妙地利用該脈沖作為復位信號源,來強迫單片機進行復位操作。圖3(b)電路可以看作是在圖2(b)基礎上改變添加一條連線而成的。該連線把PSEN信號引腳和一條外部中斷源引腳INT0連接起來,并且設定INT0為下降沿觸發(fā)和高級中斷源。當出現(xiàn)非法地址時,PSEN引腳上的低電平脈沖經(jīng)過INT0向CPU請求中斷;在CPU響應該中斷之后可以設置標志,然后實施軟件復位或者軟硬件復位。

?

?
需要提示一點:非法地址復位方式的啟用是有前提條件的,它僅適用于那些純粹利用片上ROM(指程序存儲器),即無外擴ROM,并且片上ROM不足64Kb的情況。
復位方式小結(jié)
標準80C51只有一個外接復位源引腳RST,基本所有硬件中斷都是通過RST腳引入的,并且是根據(jù)實際需要逐個進行擴充的。其中只有上電復位POR是什么場合下都必不可少的。其擴充順序大致符合(不是絕對符合)表1中的規(guī)律。
在此對于可能用到的多種復位源和復位的方式,進行如下幾種不同的分類。
1 傳統(tǒng)復位方式和非傳統(tǒng)復位方式
傳統(tǒng)復位方式(包含上電復位和人工復位)是80C51技術(shù)手冊和所有教科書中幾乎都提及的;而非傳統(tǒng)復位方式(包含欠壓復位、看門狗復位、軟件復位、軟硬件復位和非法地址復位)是為了滿足技術(shù)發(fā)展的需要而擴充的,這也是一些新款單片機在片內(nèi)新增的幾種復位方式。
2 硬件復位、軟件復位和軟硬件復位
復位分類如表2所示,將除了軟件復位之外的所有復位方式外部都引入到RST復位引腳上。
3 電源電壓監(jiān)控復位和程序運行監(jiān)控復位
電源電壓監(jiān)控復位包含上電復位和欠壓復位,它們都是在電源電壓的非常時期實施的復位;程序運行監(jiān)控復位包含人工復位、看門狗復位、非法地址復位、軟件復位和軟硬件復位,它們都是在用戶程序失常的情況下實施的復位。
4 內(nèi)部復位和外部復位
內(nèi)部復位包含看門狗復位、軟件復位、軟硬件復位和非法地址復位,它們基本都由內(nèi)部原因?qū)е碌膹臀?外部復位包含上電復位、人工復位和欠壓復位,它們基本都由外部原因?qū)е碌膹臀弧?/p>
5 快速復位和延時復位
前者希望復位操作越快越好,例如人工復位、看門狗復位、非法地址復位等;而后者則希望復位操作有一個延遲時間,例如上電復位、欠壓復位等。
6 冷復位和熱復位
只有上電復位屬于冷復位,其余均屬于熱復位。在冷復位實施之前單片機處于無電狀態(tài)。
評論