首页 8051中断使用

8051中断使用

举报
开通vip

8051中断使用 ̚ᕝ̝ᑕϡ 本章內容豐富,主要包括三部分: 硬體部分: 認識 8051 的中斷功能。 指令部分: 詳細說明邏輯運算指令。 程式與實作部分: 單一中斷的應用程式、兩個中斷的應用程式、鍵盤中斷程式等。 ּᄲ 8051 5-2 5-1 9162 ̝̚ᕝ ̚ᕝ (interrupt)是暫時放下目前所執行的程式,先去執行特定的程 式,待完成特定的程式後,再返回剛才放下的程式。譬如說,...

8051中断使用
̚ᕝ̝ᑕϡ 本章內容豐富,主要包括三部分: 硬體部分: 認識 8051 的中斷功能。 指令部分: 詳細說明邏輯運算指令。 程式與實作部分: 單一中斷的應用程式、兩個中斷的應用程式、鍵盤中斷程式等。 ּᄲ 8051 5-2 5-1 9162 ̝̚ᕝ ̚ᕝ (interrupt)是暫時放下目前所執行的程式,先去執行特定的程 式,待完成特定的程式後,再返回剛才放下的程式。譬如說,老師正在 講課,而同學有疑問,隨時都可舉手發問,老師將立即暫停課程進度, 先為同學解惑,再繼續剛才暫停的課程。這樣的動作就是「中斷」。 好端端的幹嘛中斷?就是為了提升效率!中斷能提升效率?試想若 不立即提出問題、立即得到適切答覆,待老師授課完畢,這位同學早就 忘光光了,同時也失去興趣了!當然,老師也不能整天待在教室,課也 不上,大家大眼瞪小眼,等待同學提問題!所以,以「中斷」的方式, 既能保持進度,又兼顧與滿足同學的需求,當然是比較有效率! 5-1-1 NDT.62 ̝̚ᕝ 8051 提供五個中斷服務,即外部中斷 INT0、外部中斷 INT1、計時 計數器中斷 T0、計時計數器中斷 T1 與串列埠 RI/TI,如下圖所示: )ဦ2* NDT.62 ̚ᕝଠטր௚! ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-3 8052 提供六個中斷服務,除了 8051 的五個中斷外,還包括第三個 計時計數器 (Timer 2)的中斷。不過怎樣,其中可概分為三類,如下說明: γొ̚ᕝ 外部中斷有 INT0 與 INT1 兩個,CPU 透過 INT0 接腳(即 12 腳,也就 是 P3.2 共用接腳)及 INT1 接腳(即 13 腳,也就是 P3.3 共用接腳),即 可接受外部中斷的請求。 外部中斷信號的採樣方式,可為準位觸發 (低準位觸發 )及邊緣觸發 (負緣觸發 )兩種。若要採用準位觸發,須將 TCON 暫存器中的 IT0(或 IT1)設定為 0,則只要 INT0 接腳 (INT1 接腳 )為低態,即視為外部中 斷需求。若要採用邊緣觸發,須將 TCON 暫存器中的 IT0(或 IT1)設 定為 1,則只要 INT0 接腳 (INT1 接腳 )的信號由高態轉為低態瞬間, 將視為外部中斷需求。這些中斷需求將反應在 IE0(或 IE1)裡,若 IE 暫存器的 EX0(或 EX1)=1、且 EA=1,CPU 將進入該中斷的服務。至 於,中斷優先等級暫存器 (IP 暫存器 )只是安排多個中斷發生時,中 斷服務執行的順序而已,若只有一個中斷,將不會有所影響。 ࢍॡࢍᇴጡ̚ᕝ 計時計數器中斷有 TF0 與 TF1 兩個 (8052 則還有 TF2),若是計時器, CPU 將計數內部的時鐘脈波,而提出內部中斷;若是計數器,CPU 將計數外部的脈波,而提出內部中斷。至於外部脈波的輸入,則是 透過 T0 接腳 (即 14 腳,也就是 P3.4 共用接腳 )及 T1 接腳 (即 15 腳, 也就是 P3.5 共用接腳 )。關於計時計數器,待第六章再詳細說明。 ҚЕૂ̚ᕝ 串列埠中斷則為 RI 或 TI 兩個,CPU 透過 RXD 接腳 (即 10 腳,也就 是 P3.0 共用接腳 )及 TXD 接腳 (即 11 腳,也就是 P3.1 共用接腳 ),要 求接收 (RI)中斷需求或傳送 (TI)中斷需求。關於計時計數器,待第七 章再詳細說明。 當中斷發生時,CPU 將暫停當時所執行的程式,立即按中斷的種類, 執行其中斷向量,例如 INT0 中斷時,程式將跳到 03H 位址 (INT0 的中 斷向量 ),而 03H 位址可能只有一個命令,即「JMP XXX」,其中的 ּᄲ 8051 5-4 XXX 就是該中斷的服務程式的位址。所以,CPU 將執行 XXX 中斷服務 程式,在中斷服務程式的最後一道指令為「RETI」,執行這道指令,即 可返回主程式,繼續執行剛才中斷時的下一個指令,如下圖所示: )ဦ3* ̚ᕝ߹඀! 5-1-2 ̚ᕝ࡭ਕᇶхጡ )ဦ4* JF ᇶхጡ! 如圖 (1)所示,我們可將中斷致能暫存器(即 IE 暫存器 )視為啟閉中斷 ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-5 功能的開關,實際上,IE 暫存器是一個 8 位元的可位元定址暫存器,其 中各位元如圖 (3)所示。 5-1-3 ̚ᕝᐹАඈ৺ᇶхጡ 如圖 (1)所示,中斷優先等級暫存器(IP 暫存器 )判斷各中斷優先等級 的開關,實際上,IP 暫存器是一個 8 位元的可位元定址暫存器,其中各 位元如下圖所示: )ဦ5* JQ ᇶхጡ! 在此特將 IE 暫存器也放在上面,直接與 IP 暫存器比對,我們將可 發現其中各位元幾乎是相對應的!所以,記住 IE 暫存器,也就記住 IP 暫存器了! 在圖 (1)之中,很明顯地, IP 暫存器只是決定中斷屬「高優先等級」 族群,還是「低優先等級」族群而已。原本各個中斷已有先後之分,其 順序為: ּᄲ 8051 5-6 )ဦ6* ࿰ཉᐹАඈ৺! 如上圖所示,若都沒有在 IP 暫存器裡設定優先等級,則中斷的優先 等級為「 INT0>TF0>INT1>TF1>RI/TI>TF2/EXF2」;若將其中任一個中 斷 設 為 高 優 先 等 級 , 例 如 讓 TF=1, 則 中 斷 的 優 先 等 級 變 為 「TF1>INT0>TF0 >INT1>RI/TI>TF2/EXF2」;若讓 TF=1、 IE1=1,則 中斷的優先等級變為「 INT1>TF1>IE0>TF0>RI/TI>TF2/EXF2」,以此 類推。如下圖所示,分別是不同優先等級下,程式執行的流程: )ဦ7* ̙ТᐹАඈ৺˭Ă඀ёેҖ۞߹඀! ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-7 如上圖所示,簡單講,就是「優先等級較低者站一邊等」。如下兩 個例子,正好說明「優先等級」這回事。 老師上課中,教務主任要求ૺ൑ԟ同學到教務處說明科展的進度,於 是ૺ൑ԟ就到教務處向教務主任報告科展的進度;不一會兒,校長又 來要求ૺ൑ԟ同學到校長室說明技能競賽的事。於是,狗腿的值日生 一健步,飛奔至教務處,通知ૺ൑ԟ立即到校長室。這時候,ૺ൑ԟ 只好暫停向教務主任報告,而先去跟校長報告,報告完畢後,再回教 務處繼續向教務主任報告。全部都報告完畢後,才回教室。 同樣的場景,老師上課中,校長要求ૺ൑ԟ同學到校長室說明技能 競賽的事,於是ૺ൑ԟ就到校長室向校長報告技能競賽的事;不一 會兒,教務主任又來要求ૺ൑ԟ同學到教務處說明科展的進度,只 見老師冷冷地說「ૺ൑ԟ在校長室」,教務主任只好摸摸鼻子,回 教務處等候。待ૺ൑ԟ結束校長室的報告後,再到教務處向教務主 任報告。全部都報告完畢後,才回教室。 5-1-4 ࢍॡࢍᇴጡଠטᇶхጡ )ဦ8* UDPO ᇶхጡ! 在計時計數器控制暫存器 TCON 裡,有部分設定與外部中斷信號的 ּᄲ 8051 5-8 取樣方式有關,如圖 (7)所示,TCON 暫存器是一個 8 位元的可位元定址 暫存器。其中 IT0 與 IT1 分別為 INT0 與 INT1 的取樣信號設定位元,若 要採用負緣觸發信號,則可將它設定為 1;若要採用低態動作信號,則 可將它設定為 0。至於 IE0 與 IE1 兩個位元,則是由 CPU 所操作的中斷 旗標,當中斷發生時,將被設定為 1;結束中斷時,將恢復為 0。 5-1-5 ̚ᕝШณ 8051 的中斷向量,如下表所示: ̚ ᕝ ໚ ̚ ᕝ Ш ณ INT0 03H TF0 0BH INT1 13H TF1 1BH RI/TI 23H TF2/EXF2 2BH 上述中斷向量就是程式記憶體的位址,而 CPU 是從 00H 開始執行, 是不是一開始就執行這些位址的指令呢?實際上,我們會在「ORG 0」 之後,即執行「JMP START」指令,而 START 標記是在所有中斷向 量之後,即可避開這些中斷向量,如下所示: ! ! PSH! 1! <඀ёଂ 1 ҜӬฟؕ! ! ! KNQ! TUBSU! <ྯҌ TUBSU! ! ! PSH! 14I! 措施 《全国民用建筑工程设计技术措施》规划•建筑•景观全国民用建筑工程设计技术措施》规划•建筑•景观软件质量保证措施下载工地伤害及预防措施下载关于贯彻落实的具体措施 ,即中斷向量的設置、中斷的設定,以及 中斷副程式的撰寫,如下說明: నཉ̚ᕝШณ MCS-51 的中斷向量分別是 03H、0BH、13H、1BH、23H 及 2BH, 由於各中斷向量之間只有 8 個位址的記憶體空間,除非是中斷時, 只是要提供簡單的服務,否則不會在這短短的 8 個記憶體位置之中, 撰寫相關的服務程式,大都以「JMP XXX1」指令,跳至特定的中 斷副程式,然後在該中斷副程式之中,才提供真正的服務。中斷向 量的設置是應需要而設,有使用到的中斷,才在其中斷向量設置所 要中斷時操作的指令,而中斷向量設置需利用「ORG」虛擬指令來 定位,例如「ORG 03H」指令代表其下一列指令將存放於程式記 憶體的 03H 位置。 ̚ᕝనؠ 中斷的設定包括開啟中斷開關(即 IE 暫存器的設定 )、中斷優先等級 的設定 (即 IE 暫存器的設定 )、中斷信號的設定 (即 TCON 暫存器的設 定 )、設定新的堆疊位置等。基本上,IE 暫存器、IP 暫存器及 TCON 暫存器的設定,可以利用 MOV 指令、SETB 指令或 CLR 指令,例如 要開啟「總開關」、「 INT0 開關」,則可以下列命令: MOV IE, #10000001B 也可以使用下列命令: SETB IE.7 SETB IE.0 若位置不清楚,則可直接指定「開關」的名稱,即: SETB EA SETB EX0 同理, IP 暫存器、TCON 暫存器的設定,也可以使用 MOV 指令或 SETB 指令,不過,使用 SETB 指令比較簡單,且具可讀性,例如要 把 INT1 中斷的優先等級提高,則: ּᄲ 8051 5-10 SETB PX1 若要 INT1 中斷採負緣觸發的中斷信號,則: SETB IT1 至於堆疊的位置問題,程式預置堆疊指標指向 07H 位置,也就是從 08H 開始存放堆疊資料,而 08H 正是暫存器庫 1(即 RB1)的位置,為 避免衝突而破壞資料,因此,將堆疊指標改到其它地方,例如要把 堆疊移到 30H,則: MOV SP, #30H ̚ᕝઘ඀ё 「中斷副程式」就是一種副程式,而這種副程式與一般副程式之最 大差異是中斷副程式的最後一道指令是「RETI」,一般副程式的最 後一道指令是「RET」。 5-2 ទᏭྻზ޽΄ 邏輯運算指令的功能是將來源運算元的資料與目的運算元的資料,進 行 AND、OR、NOT等邏輯運算。邏輯運算指令包括 25個指令,在此將它 們分為 7大類來介紹: ANDྻზ޽΄ AND 運算指令的功能是將來源運算元的資料與目的運算元的資料 進行 AND 運算,而其結果存回目的運算元,如下圖所示: 其中的來源運算元可為記憶體 (RAM)位址 direct 的資料、暫存器 Rn 的內容、以索引暫存器 Ri 內容為地址 (@Ri)的資料、立即值# data 或 ACC 等;目的運算元可為 ACC 或記憶體 (RAM)位址 direct。而 AND 運 算的基本法則就是「Бొࠎ 2ĂᏮ΍ࠎ 2」。「•」為 AND 運算符號, 若 A、B 為輸入,Y 為輸出,則 A 與 B 的 AND 運算可標記為「Y=A•B」, ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-11 其真值表為: A B Y 0 0 0 0 1 0 1 0 0 1 1 1 ANL A, direct ᄲځ:將 ACC 的內容與記憶體 (RAM)位址 (direct)的內容進行 AND 運算,而其結果存回 ACC,即 ACC • (direct)ÆACC。 ௡ᛌޢ̂̈:2 bytes ેҖॡม:12 個時鐘脈波 ቑּ: 指令:ANL A, 20H 若執行前:ACC=ABH、記憶體 (20H)位址的內容為 F0H 執行後:ACC=A0H、記憶體 (20H)位址的內容為 F0H ANL A, Rn ᄲځ:將 ACC 的內容與暫存器 Rn 的內容進行 AND 運算,而其 結果存回 ACC,即 ACC • Rn ÆACC。 ௡ᛌޢ̂̈:1 byte ેҖॡม:12 個時鐘脈波 ቑּ: 指令:ANL A, R7 若執行前:ACC=12H、R1=10101010B 執行後:ACC=02H、R1=10101010B ANL A, @Ri ᄲځ:將 ACC 的內容與 (Ri)位址的內容進行 AND 運算,而其結 果存回 ACC,即 ACC • (Ri)ÆACC。 ௡ᛌޢ̂̈:1 byte ેҖॡม:12 個時鐘脈波 ቑּ: 指令:ANL A, @R0 若執行前:ACC=35H、R0=21H、記憶體 (21H)位址的內容為 A3H ּᄲ 8051 5-12 執行後:ACC=21H、R0=21H、記憶體 (21H)位址的內容為 A3H ANL A, #data ᄲځ:將 ACC 的內容與立即值 data 進行 AND 運算,而其結果 存回 ACC,即 ACC • dataÆACC。 ௡ᛌޢ̂̈:2 bytes ેҖॡม:12 個時鐘脈波 ቑּ: 指令:ANL A, #62H 若執行前:ACC=35H 執行後:ACC=20H ANL direct, A ᄲځ:將 ACC 的內容與記憶體 (RAM)位址 (direct)的內容進行 AND 運算,而其結果存回 (direct)記憶體位址,即 ACC • (direct)Æ (direct) ௡ᛌޢ̂̈:2 bytes ેҖॡม:12 個時鐘脈波 ቑּ: 指令:ANL 20H, A 若執行前:ACC=35H、記憶體 (20H)位址的內容為 22H 執行後:ACC=35H、記憶體 (20H)位址的內容為 20H ANL direct, #data ᄲځ:將記憶體 (RAM)位址 (direct)的內容與立即值 data 進行 AND 運算,而其結果存回 (direct)記憶體位址,即 (direct) • data Æ (direct) ௡ᛌޢ̂̈:3 bytes ેҖॡม:24 個時鐘脈波 ቑּ: 指令:ANL 30H, #3EH 若執行前:記憶體 (30H)位址的內容為 27H 執行後:記憶體 (30H)位址的內容為 26H ORྻზ޽΄ OR 運算指令的功能是將來源運算元的資料與目的運算元的資料進 ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-13 行 OR 運算,而其結果存回目的運算元,如下圖所示: 其中的來源運算元可為記憶體 (RAM)位址 direct 的資料、暫存器 Rn 的內容、以索引暫存器 Ri 內容為地址 (@Ri)的資料、立即值# data 或 ACC 等;目的運算元可為 ACC 或記憶體 (RAM)位址 direct。而 OR 運算 的基本法則就是「Бొࠎ 1ĂᏮ΍ࠎ 1」。「+」為 OR 運算符號,若 A、 B 為輸入,Y 為輸出,則 A 與 B 的 OR 運算可標記為「Y=A+B」,其真 值表為: A B Y 0 0 0 0 1 1 1 0 1 1 1 1 ORL A, direct ᄲځ:將 ACC 的內容與記憶體 (RAM)位址 (direct)的內容進行 OR 運算,而其結果存回 ACC,即 ACC + (direct)ÆACC。 ௡ᛌޢ̂̈:2 bytes ેҖॡม:12 個時鐘脈波 ቑּ: 指令:ORL A, 20H 若執行前:ACC=ABH、記憶體 (20H)位址的內容為 F0H 執行後:ACC=FBH、記憶體 (20H)位址的內容為 F0H ORL A, Rn ᄲځ:將 ACC 的內容與暫存器 Rn 的內容進行 OR 運算,而其結 果存回 ACC,即 ACC + Rn ÆACC。 ௡ᛌޢ̂̈:1 byte ેҖॡม:12 個時鐘脈波 ቑּ: 指令:ORL A, R7 ּᄲ 8051 5-14 若執行前:ACC=12H、R1=10101010B 執行後:ACC=BAH、R1=10101010B ORL A, @Ri ᄲځ:將 ACC 的內容與 (Ri)位址的內容進行 OR 運算,而其結果 存回 ACC,即 ACC + (Ri)ÆACC。 ௡ᛌޢ̂̈:1 byte ેҖॡม:12 個時鐘脈波 ቑּ: 指令:ORL A, @R0 若執行前:ACC=35H、R0=21H、記憶體 (21H)位址的內容為 A3H 執行後:ACC=B7H、R0=21H、記憶體 (21H)位址的內容為 A3H ORL A, #data ᄲځ:將 ACC 的內容與立即值 data 進行 OR 運算,而其結果存 回 ACC,即 ACC + dataÆACC。 ௡ᛌޢ̂̈:2 bytes ેҖॡม:12 個時鐘脈波 ቑּ: 指令:ORL A, #62H 若執行前:ACC=35H 執行後:ACC=77H ORL direct, A ᄲځ:將 ACC 的內容與記憶體 (RAM)位址 (direct)的內容進行 OR 運算,而其結果存回 (direct)記憶體位址,即 ACC + (direct)Æ (direct) ௡ᛌޢ̂̈:2 bytes ેҖॡม:12 個時鐘脈波 ቑּ: 指令:ORL 20H, A 若執行前:ACC=35H、記憶體 (20H)位址的內容為 22H 執行後:ACC=35H、記憶體 (20H)位址的內容為 37H ORL direct, #data ᄲځ:將記憶體 (RAM)位址 (direct)的內容與立即值 data 進行 OR ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-15 運算,而其結果存回 (direct)記憶體位址,即 (direct) + data Æ (direct) ௡ᛌޢ̂̈:3 bytes ેҖॡม:24 個時鐘脈波 ቑּ: 指令:ORL 30H, #3EH 若執行前:記憶體 (30H)位址的內容為 27H 執行後:記憶體 (30H)位址的內容為 3FH XORྻზ޽΄ XOR 運算指令的功能是將來源運算元的資料與目的運算元的資料 進行 XOR(互斥或 )運算,而其結果存回目的運算元,如下圖所示: 其中的來源運算元可為記憶體 (RAM)位址 direct 的資料、暫存器 Rn 的內容、以索引暫存器 Ri 內容為地址 (@Ri)的資料、立即值# data 或 ACC 等;目的運算元可為 ACC或記憶體 (RAM)位址 direct。而 XOR 運算 的基本法則就是「Ꮾˢ࠹ТăᏮ΍ࠎ 1ĂᏮˢ̙࠹ТăᏮ΍ࠎ 2」。「⊕」 為 OR 運算符號,若 A、B 為輸入,Y 為輸出,則 A 與 B 的 XOR 運算 可標記為「Y=A⊕B」,其真值表為: A B Y 0 0 0 0 1 1 1 0 1 1 1 0 XRL A, direct ᄲځ:將 ACC 的內容與記憶體 (RAM)位址 (direct)的內容進行 XOR(互斥或 )運算,而其結果存回 ACC,即 ACC ⊕ (direct)ÆACC ௡ᛌޢ̂̈:2 bytes ેҖॡม:12 個時鐘脈波 ቑּ: 指令:XRL A, 20H ּᄲ 8051 5-16 若執行前:ACC=ABH、記憶體 (20H)位址的內容為 F0H 執行後:ACC=5BH、記憶體 (20H)位址的內容為 F0H XRL A, Rn ᄲځ:將 ACC 的內容與暫存器 Rn 的內容進行 XOR(互斥或 )運 算,而其結果存回 ACC,即 ACC ⊕ Rn ÆACC。 ௡ᛌޢ̂̈:1 byte ેҖॡม:12 個時鐘脈波 ቑּ: 指令:XRL A, R7 若執行前:ACC=12H、R1=10101010B 執行後:ACC=B8H、R1=10101010B XRL A, @Ri ᄲځ:將 ACC 的內容與 (Ri)位址的內容進行 XOR(互斥或 )運算, 而其結果存回 ACC,即 ACC ⊕ (Ri)ÆACC。 ௡ᛌޢ̂̈:1 byte ેҖॡม:12 個時鐘脈波 ቑּ: 指令:XRL A, @R0 若執行前:ACC=35H、R0=21H、記憶體 (21H)位址的內容為 A3H 執行後:ACC=96H、R0=21H、記憶體 (21H)位址的內容為 A3H XRL A, #data ᄲځ:將 ACC 的內容與立即值 data 進行 XOR(互斥或 )運算,而 其結果存回 ACC,即 ACC ⊕ dataÆACC。 ௡ᛌޢ̂̈:2 bytes ેҖॡม:12 個時鐘脈波 ቑּ: 指令:XRL A, #62H 若執行前:ACC=35H 執行後:ACC=57H XRL direct, A ᄲځ:將 ACC 的內容與記憶體 (RAM)位址 (direct)的內容進行 ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-17 XOR(互斥或 )運算,而其結果存回 (direct)記憶體位址,即 ACC ⊕ (direct)Æ (direct) ௡ᛌޢ̂̈:2 bytes ેҖॡม:12 個時鐘脈波 ቑּ: 指令:XRL 20H, A 若執行前:ACC=35H、記憶體 (20H)位址的內容為 22H 執行後:ACC=35H、記憶體 (20H)位址的內容為 17H XRL direct, #data ᄲځ:將記憶體 (RAM)位址 (direct)的內容與立即值 data 進行 XOR(互斥或 )運算,而其結果存回 (direct)記憶體位址,即 (direct) ⊕ data Æ (direct) ௡ᛌޢ̂̈:3 bytes ેҖॡม:24 個時鐘脈波 ቑּ: 指令:XRL 30H, #3EH 若執行前:記憶體 (30H)位址的內容為 27H 執行後:記憶體 (30H)位址的內容為 19H NOTྻზ޽΄ NOT 運算指令的功能是將運算元反相,也就是取補數的意思。 CPL A ᄲځ:將 ACC 的內容反相,也就是取補數,即 ACC Æ ACC = ACC ௡ᛌޢ̂̈:1 byte ેҖॡม:12 個時鐘脈波 ቑּ: 指令:CPL A 若執行前:ACC=10110100B 執行後:ACC=01001011B ୻ੵ޽΄ 8051 只提供對 ACC 的清除指令,也就是讓 ACC 的內容變為 0。 ּᄲ 8051 5-18 CLR A ᄲځ:將 ACC 的內容變成 00H,即 00H Æ ACC。 ௡ᛌޢ̂̈:2 bytes ેҖॡม:12 個時鐘脈波 ቑּ: 指令:CLR A 若執行前:ACC=35H 執行後:ACC=00H ୊ᖼ޽΄ 旋轉指令的功能是將 ACC 內的每個位元左移或右移一個位元,此 外,參與移位的也可以包含進位位元 CY。 RL A ᄲځ:將 ACC 裡的每一位元左移一個位元,即 ௡ᛌޢ̂̈:1 byte ેҖॡม:12 個時鐘脈波 ቑּ: 指令:RL A 若執行前:ACC=10110100B 執行後:ACC=01101001B RR A ᄲځ:將 ACC 裡的每一位元右移一個位元,即 ௡ᛌޢ̂̈:1 byte ેҖॡม:12 個時鐘脈波 ቑּ: ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-19 指令:RR A 若執行前:ACC=10110100B 執行後:ACC=01011010B RLC A ᄲځ:將 ACC 裡的每一位元左移一個位元,最左邊位元移入 CY,CY 移入最右邊位元,即 ௡ᛌޢ̂̈:1 byte ેҖॡม:12 個時鐘脈波 ቑּ: 指令:RLC A 若執行前:ACC=10110100B、CY=0 執行後:ACC=01101000B、CY=1 RRC A ᄲځ:將 ACC 裡的每一位元右移一個位元,最右邊位元移入 CY,CY 移入最左邊位元,即 ௡ᛌޢ̂̈:1 byte ેҖॡม:12 個時鐘脈波 ቑּ: 指令:RRC A 若執行前:ACC=10110100B、CY=1 執行後:ACC=11011010B、CY=0 ̢ೱ޽΄ 互換指令的功能是將 ACC 的內容分為低四位元與高四位元,而將這 ּᄲ 8051 5-20 兩部分的內容互換位置。 SWAP A ᄲځ:,即 ௡ᛌޢ̂̈:1 byte ેҖॡม:12 個時鐘脈波 ቑּ: 指令:SWAP A 若執行前:ACC=CDH 執行後:ACC=DCH 5-3 ၁ּႊቚ 在本單元裡提供四個範例,以展示 8051 的外部中斷功能。 5-3-1 γొ̚ᕝ JOU1 ၁ּႊቚ Αਕᄲځ 如圖 8 所示,P2 連接 8 個 LED、第 12 腳 (即 INT0 接腳 )連接一個 10K 歐姆的提升電阻,讓該接腳保持為 High,另外再連接一個按鈕開關 (INT0)。當主程式正常執行時,P2 所連接的八個 LED 將閃爍。若按 INT0 按鈕開關,則進入中斷狀態,P2 所連接的八個 LED 將變成單 燈左移,而左移 3 圈 (從最左邊到最右邊為 1 圈 )後,恢復中斷前的 狀態,程式將繼續執行八燈閃爍的功能。 ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-21 )ဦ9* ࿪ྮဦ! ણ҂඀ё 依功能需求與電路結構得知,首先必須設定中斷向量,而 INT0 的 中斷向量為 03H,在此希望中斷後,即執行單燈左移的中斷副程式 (在此定名為 INT0 中斷副程式 )。在宣告中斷向量之後,立即設定中 斷,包括打開中斷的總開關(EA)及 INT0 開關 (EX0),另外也把堆疊 指標移至安全的位置 (30H)。主程式的為簡單的八燈閃爍功能,中斷 副程式裡,一開始先把主程式的資料存入堆疊,包括程式狀態字組 暫存器 (PSW)及 ACC,然後將暫存器庫切換到 RB1,以避免影響到 返回主程式後的結果。至於三圈單燈左移的功能,則由兩個暫存器 (R0、R1)充當計次迴圈的計數器,最左邊移到最右邊須移動 7 次, 在此以 R1 做為其計數器,而這樣的動作總共要做 3 次,所以利用 R0 來計次,以構成巢狀迴圈。 ּᄲ 8051 5-22 ! ! PSH! 1! <඀ёଂ 1 ҜӬฟؕ! ! ! KNQ! TUBSU! <ྯ࿅̚ᕝШณ! ! ! PSH! 14I! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>! ! TUBSU;! NPW! JF-!$21111112C!<χฟᓁฟᙯᄃ FY1 ̶ྮฟᙯ! ! ! NPW! TQ-!$41I! <నؠુᝑҜཉ! ! ! TFUC! JU1! <ଳϡ࢑ቡᛈ൴ܫཱི! ! ! NPW! B-!$1! <૟ BDD నؠࠎ 11111111C! ! MPPQ;! NPW! Q3-!B! <Ꮾ΍ז MFE! ! ! DBMM! EFMBZ! <ײΨؼᏵઘ඀ё! ! ! DQM! B! <૟ B ۞̰टͅ࠹! ! ! KNQ! MPPQ! <ྯҌ MPPQ ԛј˘࣎ਫ਼઻! ! >>>>>>>>>>>>JOU!1 ̚ᕝઘ඀ё>>>ฟؕ>>>>>>>>>>>>>>>>>>>>>>>! ! JOU1;! QVTI! QTX! <૟ QTX хˢુᝑ! ! ! QVTI! B! <૟ BDD хˢુᝑ! ! ! TFUC! ST1! <̷ೱז SC2! ! <>>>ௐ˘ᆸਫ਼઻ฟؕ! ! ! NPW! S1-!$4! <నؠˬѨਫ਼઻! ! JOU`MPPQ1;! NPW! B-!$GFI! <ಏ፶νொܐؕࣃ! ! ! NPW! S2-!$8! <నؠ˛Ѩνொ! ! <>>>>>>>>ௐ˟ᆸਫ਼઻ฟؕ! ! JOU`MPPQ2;! NPW! Q3-!B! <Ꮾ΍ז MFE! ! ! DBMM! EFMBZ! <ײΨؼᏵઘ඀ё! ! ! SM! B! <૟ B ۞̰टνொ! ! ! EKO[! S2-!JOU`MPPQ2! <ྯҌ JOU`MPPQ1 ԛј˘࣎ਫ਼઻! ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-23 ! <>>>>>>>>ௐ˟ᆸਫ਼઻ඕՁ! ! ! EKO[! S1-!JOU`MPPQ1! <ྯҌ JOU`MPPQ2 ԛј˘࣎ਫ਼઻! ! <>>>ௐ˘ᆸਫ਼઻ඕՁ! ! ! QPQ! B! <פа BDD ̰ट! ! ! QPQ! QTX! <פа QTX ̰ट! ! ! SFUJ! ! <ܔа͹඀ё! ! <>>>>>>>>>>>>>JOU!1 ̚ᕝઘ඀ё>>>>ඕՁ>>>>>>>>>>>>>>>>>>>>>>! ! >>>>>>>>>>>>1/2 ࡋ EFMBZ ઘ඀ё>>>ฟؕ>>>>>>>>>>>>>>>>>>>>>! ! EFMBZ;! NPW! S8-!$311! ! E2;! NPW! S7-!$361! ! ! EKO[! S7-!%! ! ! EKO[! S8-!E2! ! ! SFU! ! <>>>>>>>>>>>>>!1/2 ࡋ EFMBZ ઘ඀ё>>>>ඕՁ>>>>>>>>>>>>>>>>>>>! ! ! FOE! INT0 中斷實驗(ch5-1.asm) ፆү 1. 依功能需求與電路結構撰寫程式,然後將該程式組譯與連結,以 產生*.HEX 檔。 2. 請利用 AVSIM51 之類的模擬軟體,模擬其功能 (先將延遲時間縮 短,大概是 R7=10、R6=10)。若有非預期的狀況,則檢視原始程 式,看看哪裡出問題?並將它記錄在實驗報告裡。 3. 將延遲時間恢復正常,重新組譯連結,再按圖 8 連接線路,使用 實體模擬器,載入新的程式 (*.HEX),以模擬該電路的動作。若 有非預期的狀況,則檢視線路的連接狀況,看看哪裡出問題?並 將它記錄在實驗報告裡。 4. 若實體模擬功能正常,請將程式燒錄到 89C51,再把該 89C51 放 入實體電路,以取代剛才的實體模擬器,然後直接送電,看看是 否正常? 5. 撰寫實驗報告。 ޥ҂˘˭ 1. 在本實驗裡,中斷副程式是以巢狀迴圈方式,達到巢狀單燈左移 三圈的目的;若不要以巢狀迴圈方式,請試著以別種方式,達到 同樣的效果? ּᄲ 8051 5-24 2. 在本實驗裡,若希望中斷時,這八個 LED 變成是霹靂燈,來回 各三圈,才返回主程式,程式應如何更改? 5-3-2 γొ̚ᕝ JOU2 ၁ּႊቚ Αਕᄲځ 如圖 9 所示,P0 之低四位元連接 7447,再驅動共陽極七節顯示器, 所以只要在 P0.0 到 P0.3 輸出 BCD 碼,即可在七節顯示器上顯示該 數字,而第 13 腳 (即 INT1 接腳 )連接一個 10K 歐姆的提升電阻,讓 該接腳保持為 High,另外再連接一個按鈕開關 (INT1)。當主程式正 常執行時,七節顯示器將從 0 開始正數到 9(循環 ),每 0.5 秒增加 1。 若按 INT1 按鈕開關,則進入中斷狀態,則七節顯示器將從 9 開始 倒數到 0(一圈後結束中斷 ),每 0.5 秒減少 1。 )ဦ:* ࿪ྮဦ! ણ҂඀ё 依功能需求與電路結構得知,首先設定中斷向量,而 INT1 的中斷 向量為 13H,在此希望中斷後,即執行倒數的中斷副程式 (在此定名 ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-25 為 INT1 中斷副程式 )。在宣告中斷向量之後,立即設定中斷,包括 打開中斷的總開關 (EA)及 INT1 開關 (EX1),另外也把堆疊指標移至 安全的位置 (30H)。主程式的為簡單的正數功能,而在中斷副程式 裡,一開始先把主程式的資料存入堆疊,包括程式狀態字組暫存器 (PSW)及 ACC,然後將暫存器庫切換到 RB1,以避免影響到返回主 程式後的結果。至於倒數部分的功能,則可複製主程式的正數部分 程式,再將其初始值改為 9, INC 指令改為 DEC 指令即可。 ! ! PSH! 1! <඀ёଂ 1 ҜӬฟؕ! ! ! KNQ! TUBSU! <ྯ࿅̚ᕝШณ! ! ! PSH! 24I! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>! ! TUBSU;! NPW! JF-!$21111211C!<χฟᓁฟᙯᄃ FY2 ̶ྮฟᙯ! ! ! NPW! TQ-!$41I! <నؠુᝑҜཉ! ! ! TFUC! JU2! <ଳϡ࢑ቡᛈ൴ܫཱི! ! SFOFX;! NPW! S1-!$21! >>>>>>>>>>>>JOU!2 ̚ᕝઘ඀ё>>>ฟؕ>>>>>>>>>>>>>>>>>>>>>>>! ! JOU2;! QVTI! QTX! <૟ QTX хˢુᝑ! ּᄲ 8051 5-26 ! ! QVTI! B! <૟ BDD хˢુᝑ! ! ! TFUC! ST1! <̷ೱז SC2! ! SFOFX;! NPW! S1-!$21! >>>>>>>>>>>>JOU!1 ̚ᕝઘ඀ё>>>>ඕՁ>>>>>>>>>>>>>>>>>>>>>>! ! <>>>>>>>>>>>>>1/6 ࡋ EFMBZ ઘ඀ё>>>ฟؕ>>>>>>>>>>>>>>>>>>>>>! ! EFMBZ;! NPW! S8-!$6! ! E2;! NPW! S7-!$311! ! E3;! NPW! S6-!$361! ! ! EKO[! S6-!%! !!! EKO[!!!!S7-!E3! ! ! EKO[! S8-!E2! ! ! SFU! ! <>>>>>>>>>>>>>!1/6 ࡋ EFMBZ ઘ඀ё>>>>ඕՁ>>>>>>>>>>>>>>>>>>>! ! ! FOE! INT1 中斷實驗(ch5-2.asm) ፆү 1. 依功能需求與電路結構撰寫程式,然後將該程式組譯與連結,以 產生*.HEX 檔。 2. 請利用 AVSIM51 之類的模擬軟體,模擬其功能 (先將延遲時間縮 短,大概是 R7=10、R6=10)。若有非預期的狀況,則檢視原始程 式,看看哪裡出問題?並將它記錄在實驗報告裡。 3. 將延遲時間恢復正常,重新組譯連結,再按圖 9 連接線路,使用 實體模擬器,載入新的程式 (*.HEX),以模擬該電路的動作。若 有非預期的狀況,則檢視線路的連接狀況,看看哪裡出問題?並 將它記錄在實驗報告裡。 4. 若實體模擬功能正常,請將程式燒錄到 89C51,再把該 89C51 放 入實體電路,以取代剛才的實體模擬器,然後直接送電,看看是 否正常? 5. 撰寫實驗報告。 ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-27 ޥ҂˘˭ 1. 在本實驗裡,使用 7447 做為 BCD 對七節顯器碼的解碼器,若不 使用 7447,程式與電路應如何更改? 2. 若 INT1採用低態動作信號(即將「SETB IT1」改為「CLR IT1」), 軟體模擬時,有何影響?硬體模擬時,有何影響? 5-3-3 ׌࣎γొ̚ᕝ၁ּႊቚ )ဦ21* ࿪ྮဦ! Αਕᄲځ 如圖 10 所示,P2 連接 8 個 LED、第 12 腳 (即 INT0 接腳 )連接一個 10K 歐姆的提升電阻,讓該接腳保持為 High,另外再連接一個按鈕 開關 (INT0)、第 13 腳 (即 INT1 接腳 )連接一個 10K 歐姆的提升電阻, 讓該接腳保持為 High,另外再連接一個按鈕開關 (INT1)。當主程式 正常執行時,P2 所連接的八個 LED 將閃爍。若按 INT0 按鈕開關, 則進入 INT0 中斷狀態,P2 所連接的八個 LED 將變成單燈左移,而 左移 3 圈 (從最左邊到最右邊為 1 圈 )後,恢復中斷前的狀態,程式 將繼續執行八燈閃爍的功能。若按 INT1 按鈕開關,則進入 INT1 中 斷狀態,P2 所連接的八個 LED 將變成單燈右移,而左移 3 圈 (從最 ּᄲ 8051 5-28 左邊到最右邊為 1 圈 )後,恢復中斷前的狀態,程式將繼續執行八燈 閃爍的功能。另外,在此要求單燈左移 (INT0)中斷的優先等級較單 燈右移 (INT1)中斷的優先等級高。 ણ҂඀ё 依功能需求與電路結構得知,首先必須設定中斷向量,而 INT0 的 中斷向量為 03H,在此希望中斷後,即執行單燈左移的中斷副程式 (在此定名為 INT0 中斷副程式 ); INT1 的中斷向量為 13H,在此希 望中斷後,即執行單燈右移的中斷副程式 (在此定名為 INT1 中斷副 程式 )。在宣告中斷向量之後,立即設定中斷,包括打開中斷的總開 關 (EA)、 INT0 開關 (EX0)及 INT1 開關 (EX1),另外也把堆疊指標移 至安全的位置 (30H)。而由於本實驗要求 INT0 中斷的優先等級高於 INT1 中斷的優先等級,與 8051 的預置狀態相同,所以不要額外的 設定。基本上,主程式及單燈左移中斷副程式,與 5-3-1 節相同, 在此只要增加單燈右移中斷副程式即可。 ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-29 ! ! PSH! 1! <඀ёଂ 1 ҜӬฟؕ! ! ! KNQ! TUBSU! <ྯ࿅̚ᕝШณ! ! ! PSH! 14I! >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>! ! TUBSU;! NPW! JF-!$21111212C!<χฟᓁฟᙯăFY1 ᄃ FY2 ฟᙯ! ! ! NPW! TQ-!$41I! <నؠુᝑҜཉ! ! ! TFUC! JU1! <ଳϡ࢑ቡᛈ൴ܫཱི! ! ! TFUC! JU2! <ଳϡ࢑ቡᛈ൴ܫཱི! ! ! NPW! B-!$1! <૟ BDD నؠࠎ 11111111C! ! MPPQ;! NPW! Q3-!B! <Ꮾ΍ז MFE! ! ! DBMM! EFMBZ! <ײΨؼᏵઘ඀ё! ! ! DQM! B! <૟ B ۞̰टͅ࠹! ! ! KNQ! MPPQ! <ྯҌ MPPQ ԛј˘࣎ਫ਼઻! ! >>>>>>>>>>>>JOU!1 ̚ᕝઘ඀ё>>>ฟؕ>>>>>>>>>>>>>>>>>>>>>>>! ! JOU1;! QVTI! QTX! <૟ QTX хˢુᝑ! ! ! QVTI! B! <૟ BDD хˢુᝑ! ! ! TFUC! ST1! <̷ೱז SC2! ! <>>>ௐ˘ᆸਫ਼઻ฟؕ! ! ! NPW! S1-!$4! <నؠˬѨਫ਼઻! ! JOU1`MPPQ1;! NPW! B-!$GFI! <ಏ፶νொܐؕࣃ! ! ! NPW! S2-!$9! <నؠˣѨνொ! ! <>>>>>>>>ௐ˟ᆸਫ਼઻ฟؕ! ! JOU1`MPPQ2;! NPW! Q3-!B! <Ꮾ΍ז MFE! ! ! DBMM! EFMBZ! <ײΨؼᏵઘ඀ё! ! ! SM! B! <૟ B ۞̰टνொ! ! ! EKO[! S2-!JOU1`MPPQ2!<ྯҌ JOU1`MPPQ1 ԛј˘࣎ਫ਼઻! ! <>>>>>>>>ௐ˟ᆸਫ਼઻ඕՁ! ! ! EKO[! S1-!JOU1`MPPQ1!<ྯҌ JOU1`MPPQ2 ԛј˘࣎ਫ਼઻! ! <>>>ௐ˘ᆸਫ਼઻ඕՁ! ! ! QPQ! B! <פа BDD ̰ट! ! ! QPQ! QTX! <פа QTX ̰ट! ! ! SFUJ! ! <ܔа͹඀ё! ! <>>>>>>>>>>>>>JOU!1 ̚ᕝઘ඀ё>>>>ඕՁ>>>>>>>>>>>>>>>>>>>>>>! ! >>>>>>>>>>>>JOU!2 ̚ᕝઘ඀ё>>>ฟؕ>>>>>>>>>>>>>>>>>>>>>>>! ! JOU2;! QVTI! QTX! <૟ QTX хˢુᝑ! ! ! QVTI! B! <૟ BDD хˢુᝑ! ! ! DMS! ST1! >>ௐ˘ᆸਫ਼઻ฟؕ! ! ! NPW! S1-!$4! <నؠˬѨਫ਼઻! ! JOU2`MPPQ1;! NPW! B-!$8GI! <ಏ፶Πொܐؕࣃ! ! ! NPW! S2-!$9! <నؠˣѨνொ! ! <>>>>>>>>ௐ˟ᆸਫ਼઻ฟؕ! ּᄲ 8051 5-30 ! JOU2`MPPQ2;! NPW! Q3-!B! <Ꮾ΍ז MFE! ! ! DBMM! EFMBZ! <ײΨؼᏵઘ඀ё! ! ! SS! B! <૟ B ۞̰टΠொ! ! ! EKO[! S2-!JOU2`MPPQ2!<ྯҌ JOU2`MPPQ1 ԛј˘࣎ਫ਼઻! ! <>>>>>>>>ௐ˟ᆸਫ਼઻ඕՁ! ! ! EKO[! S1-!JOU2`MPPQ1!<ྯҌ JOU2`MPPQ2 ԛј˘࣎ਫ਼઻! ! <>>>ௐ˘ᆸਫ਼઻ඕՁ! ! ! QPQ! B! <פа BDD ̰ट! ! ! QPQ! QTX! <פа QTX ̰ट! ! ! SFUJ! ! <ܔа͹඀ё! ! <>>>>>>>>>>>>>JOU!1 ̚ᕝઘ඀ё>>>>ඕՁ>>>>>>>>>>>>>>>>>>>>>>! ! >>>>>>>>>>>>1/2 ࡋ EFMBZ ઘ඀ё>>>ฟؕ>>>>>>>>>>>>>>>>>>>>>! ! EFMBZ;! NPW! S8-!$311! ! E2;! NPW! S7-!$361! ! ! EKO[! S7-!%! ! ! EKO[! S8-!E2! ! ! SFU! ! <>>>>>>>>>>>>>!1/2 ࡋ EFMBZ ઘ඀ё>>>>ඕՁ>>>>>>>>>>>>>>>>>>>! ! ! FOE! 兩個外部中斷實驗(ch5-3.asm) ፆү 1. 依功能需求與電路結構撰寫程式,然後將該程式組譯與連結,以 產生*.HEX 檔。 2. 請利用 AVSIM51 之類的模擬軟體,模擬其功能 (先將延遲時間縮 短,大概是 R7=10、R6=10)。若有非預期的狀況,則檢視原始程 式,看看哪裡出問題?並將它記錄在實驗報告裡。 3. 將延遲時間恢復正常,重新組譯連結,再按圖 10 連接線路,使 用實體模擬器,載入新的程式 (*.HEX),以模擬該電路的動作。 若有非預期的狀況,則檢視線路的連接狀況,看看哪裡出問題? 並將它記錄在實驗報告裡。 4. 若實體模擬功能正常,請將程式燒錄到 89C51,再把該 89C51 放 入實體電路,以取代剛才的實體模擬器,然後直接送電,看看是 否正常? 5. 撰寫實驗報告。 ௐ̣ౢ ̚ᕝ̝ᑕϡ 5-31 ޥ҂˘˭ 1. 利用 AVSIM51 進行模擬時,當 INT1 中斷中,再按 INT0 按鈕時, 是否能正確模擬出 INT0 中斷具有較高優先等級? 2. 在本實驗裡,若希望 INT1 中斷的優先等級高於程式 INT0 中斷 的優先等級,應如何修改? 5-3-4 ᔣሹ̚ᕝ၁ּႊቚ )ဦ22* ࿪ྮဦ! Αਕᄲځ 如圖 11所示,MM74C922的資料 ABCD連接到 8051的 P2.4到 P2.7, 而 P2.0 到 P2.3 連接 7447,以輸出數字資料。MM74C922 的 DA 接 腳經過反閘 (MM74C04)連接到 8051 的 P3.2,也就是 INT0 接腳。另 外,8051 的 PORT 0 連接 8 個 LED。當主程式正常執行時,8 個 LED 閃爍 (每 0.1 秒切換一次 ),若按下 4Y4 鍵盤上的任一個鍵,則該鍵的 數字將顯示在七節顯示器上,而 PORT 0 所連接的 LED,仍保持正 常的閃爍。 ּᄲ 8051 5-32 ણ҂඀ё 依功能需求與電路結構得知,首先必須設定中斷向量,而 INT0的中斷向 量為 03H,在此希望中斷後,即執行讀取鍵盤資料,並將讀取到的資料, 送到七
本文档为【8051中断使用】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_180704
暂无简介~
格式:pdf
大小:989KB
软件:PDF阅读器
页数:34
分类:互联网
上传时间:2013-03-14
浏览量:11