版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第七單元 復(fù)位、中斷與程序控制本單元學(xué)習(xí)要點(diǎn)1. 單片機(jī)為什么要復(fù)位?如何能可靠地復(fù)位?復(fù)位對單片機(jī)片內(nèi)存儲(chǔ)器的影響如何?2. 為何要有程序流向控制?怎樣實(shí)現(xiàn)程序流向控制?有哪幾種方法? 3. 程序?yàn)楹我袛啵恐袛噙^程如何?如何開放和響應(yīng)中斷?4. 改變程序流向的指令及其應(yīng)用。5. 中斷服務(wù)子程序與一般的子程序的異同點(diǎn)。如何編寫中斷服務(wù)子程序?如何編寫一般的子程序?7.1 復(fù)位7.1.1 復(fù)位的意義單片機(jī)開始工作時(shí),必須處于一種確定的狀態(tài),否則,不知哪里是第一條程序,如何開始運(yùn)行程序?口線的電平和輸入/輸出狀態(tài)的不確定,可能使外圍設(shè)備的誤動(dòng)作,導(dǎo)致嚴(yán)重事故的發(fā)生;內(nèi)部一些控制寄存器(專用寄存器
2、)的內(nèi)容不確定,可能導(dǎo)致定時(shí)器溢出、程序尚未開始就要中斷,串口胡亂向外外設(shè)數(shù)據(jù)。因此,任何單片機(jī)在開始工作前,都必須進(jìn)行一次復(fù)位過程,使單片機(jī)處于一種確定的狀態(tài)。單片機(jī)進(jìn)入復(fù)位過程有三種途徑:上電(開機(jī))復(fù)位、手動(dòng)復(fù)位和監(jiān)控電路(看門狗或電源監(jiān)控等)復(fù)位。顧名思義,上電復(fù)位就是開機(jī)給單片機(jī)系統(tǒng)加電時(shí)單片機(jī)進(jìn)行復(fù)位操作。手動(dòng)復(fù)位是人為地強(qiáng)行使單片機(jī)進(jìn)行復(fù)位操作。而為了提高系統(tǒng)的可靠性,在單片機(jī)應(yīng)用系統(tǒng)中專門設(shè)計(jì)了一些電路用以監(jiān)控系統(tǒng)的電源(如電源電壓過低可能導(dǎo)致單片機(jī)執(zhí)行錯(cuò)誤的指令與程序)和單片機(jī)的狀態(tài),如果出現(xiàn)異常,這些電路將強(qiáng)制單片機(jī)復(fù)位。7.1.2 復(fù)位電路HMOS型8051的復(fù)位結(jié)構(gòu)見圖
3、1-44。復(fù)位引腳RST(它還是掉電方式下內(nèi)部RAM的供電端VPD)通過一個(gè)斯密特觸發(fā)器與復(fù)位電路相連斯密特觸發(fā)器用來抑制噪聲,它的輸出在每個(gè)機(jī)器周期的S5P2由復(fù)位電路采樣一次89C52的內(nèi)部復(fù)位結(jié)構(gòu)見圖7-1,此處復(fù)位引腳稱為RST。RST斯密特觸發(fā)器復(fù)位電路圖7-1 89C52的內(nèi)部復(fù)位結(jié)構(gòu)上電復(fù)位電路見圖7-2(a)。上電瞬間RST端的電位與VCC相同,隨著充電電流的減小,RST的電位逐漸下降。按圖中所示的電路參數(shù)(其中8.2k是斯密特觸發(fā)器輸入端的一個(gè)下拉電阻),時(shí)間常數(shù)為秒82毫秒,只要VCC的上升時(shí)間不超過1毫秒,振蕩器建立時(shí)間不超過10毫秒,這個(gè)時(shí)間常數(shù)足以保證完成復(fù)位操作。上
4、電復(fù)位所需的最短時(shí)間是振蕩器建立時(shí)間加上2個(gè)機(jī)器周期,在這段時(shí)間內(nèi)RST端的電平應(yīng)維持高于斯密特觸發(fā)器的下閾值。圖7-2(b)和(c)示出外部復(fù)位電路的可能方案。(a)圖中的第一方案由外部提供一個(gè)復(fù)位脈沖,此復(fù)位脈沖應(yīng)保持寬于個(gè)機(jī)器周期。復(fù)位脈沖過后,由內(nèi)部下拉電阻保證RST端為低電平。(b)圖中的第二方案是上電復(fù)位與手動(dòng)復(fù)位相結(jié)合的方案。上電復(fù)位的工作過程與圖7-2(a)的相似。手動(dòng)復(fù)位時(shí),按下復(fù)位按鈕,電容C通過電阻R!迅速放電,使RST迅速變?yōu)楦唠娖?,?fù)位按鈕松開后,電容通過R2和內(nèi)部下拉電阻充電,逐漸使RST端恢復(fù)低電平。圖7-2 外部復(fù)位電路7.1.3 單片機(jī)復(fù)位后的狀態(tài)在振蕩器正在
5、運(yùn)行的情況下,復(fù)位是靠在RST引腳處至少保持2個(gè)機(jī)器周期(24個(gè)振蕩器周期)的高電平而實(shí)現(xiàn)的。在RST端出現(xiàn)高電平后的第2個(gè)周期,執(zhí)行內(nèi)部復(fù)位,以后每個(gè)周期重復(fù)一次,直至RST端變低。復(fù)位后,各內(nèi)部寄存器的狀態(tài)如表7-1所列。表7-1 89C52復(fù)位后各內(nèi)部寄存器的狀態(tài)寄存器內(nèi)容PC0000HACC00HB00HPSW00HSP07HDPTR0000HP0P30FFHIP(XX000000)IE(0X000000)TMOD00HTCON00HT2CON00HTH000HTL000HTH100HTL100HTH200HTL200HRLDH00HRLDL00HSCON00HSBUF不定PCON(0
6、XXX0000)復(fù)位時(shí)還把ALE和(它們是準(zhǔn)雙向口結(jié)構(gòu)的)配置為輸入狀態(tài),即ALE和。內(nèi)部RAM不受復(fù)位的影響。VCC通電時(shí),RAM內(nèi)容是不定的,除非RAM是由低功耗操作方式下返回的。7.2 程序控制單片機(jī)的工作原則絕對地是“一心一意”,只能按照程序的流向一步步地執(zhí)行下去。為了使單片機(jī)具有“智能”,也就是使單片機(jī)根據(jù)所檢測到的外接狀況、或人們給它的命令,以及某種運(yùn)算、判斷的結(jié)果來改變程序的流向??梢哉f,單片機(jī)能處理上述情況的種類越多和作出的改變越復(fù)雜,說明單片機(jī)的“智能”越高??刂瞥绦蛄飨虻姆绞接袃纱箢悾河布蛙浖S布姆绞接袕?fù)位和中斷等,對于89C52來說,硬件使程序流向固定的入口地址。如
7、復(fù)位的入口地址是0000H,各個(gè)中斷都有各自固定的入口地址。軟件的方式是調(diào)用(CALL)指令、跳轉(zhuǎn)(JMP)指令、判斷跳轉(zhuǎn)(條件轉(zhuǎn)移,J、CJ和DJ)、布爾量判斷跳轉(zhuǎn)(條件轉(zhuǎn)移,J)和子程序返回(RET、RETI)指令。程序的流向不是固定的:子程序返回(RET、RETI)由堆棧中保存的返回地址來確定,而其它則由指令中的操作數(shù)來指定。 軟件的方式又可以分為兩類:轉(zhuǎn)移類和調(diào)用子程序類。轉(zhuǎn)移類又分為條件轉(zhuǎn)移和無條件轉(zhuǎn)移兩類。表7-2列出程序流向控制的分類。表7-2 程序流向控制的分類硬 件軟件(指令)調(diào)用子程序轉(zhuǎn) 移條 件無條件復(fù)位,中斷LCALL,ACALLRET,RETIJB,JNB,CJNE,
8、DJNZ,JZ,JNZ,JC,JNCLJMP,AJMP7.3 程序流向控制的指令控制程序轉(zhuǎn)移類指令共有17條,布爾變量控制程序轉(zhuǎn)移的指令有5條,總共22條。其中有全存貯空間的長調(diào)用、長轉(zhuǎn)移和按2KB分塊的程序空間內(nèi)的絕對調(diào)用和絕對轉(zhuǎn)移;全空間和長相對轉(zhuǎn)移及一頁范圍的短相對轉(zhuǎn)移;還有不少條件轉(zhuǎn)移指令。這類指令用到的助記符有ACALL、AJMP、LCALL、LJMP、SJMP、JMP、JZ、JNZ、CJNE、DJNZ、JC、JNC、JB、JNB和JBC。1. 絕對調(diào)用 a10a9a810001格式:ACALL addr 11代碼:a7a6a5a4a3a2a1a0操作:(PC)¬(PC)+
9、2(SP)¬(SP)+1(SP)¬(PC70)(SP)¬(SP)+1(SP)¬(PC158)(PC100)¬指令中的2KB區(qū)內(nèi)地址a100說明:指令的操作碼與被調(diào)用子程序的入口地址的頁號有關(guān)。每一種操作碼可分別對應(yīng)32個(gè)頁號。見表7-3。指令中指定的a100為區(qū)內(nèi)地址。表7-3 ACALL和AJMP指令操作碼與頁面的關(guān)系子程序入口轉(zhuǎn)移地址頁面號操作碼ACALL AJMP00 08 10 18 20 28 30 38 40 48 50 58 60 68 70 7880 88 90 98 A0 A8 B0 B8 C0 C8 D0 D8 E0 E8
10、F0 F8110101 09 11 19 21 29 31 39 41 49 51 59 61 69 71 7981 89 91 99 A1 A9 B1 B9 C1 C9 D1 D9 E1 E8 F1 F9312102 0A 12 1A 22 2A 32 3A 42 4A 52 5A 62 6A 72 7A82 8A 92 9A A2 AA B2 BA C2 CA D2 DA E2 EA F2 FA514103 0B 13 1B 23 2B 33 3B 43 4B 53 5B 63 6B 73 7B83 8B 93 9B A3 AB B3 BB C3 CB D3 DB E3 EB F3 FB7
11、16104 0C 14 1C 24 2C 34 3C 44 4C 54 5C 64 6C 74 7C84 8C 94 9C A4 AC B4 BC C4 CC D4 DC E4 EC F4 FC918105 0D 15 1D 25 2D 35 3D 45 4D 55 5D 65 6D 75 7D85 8D 95 9D A5 AD B5 BD C5 CD D5 DD E5 ED F5 FDB1A106 0E 16 1E 26 2E 36 3E 46 4E 66 6E 66 6E 76 7E86 8E 96 9E A6 AE B6 BE C6 CE E6 EE E6 EE F6 FED1C107
12、0F 17 1F 27 2F 37 3F 47 4F 77 7F 67 6F 77 7F87 8F 97 9F A7 AF B7 BF C7 CF F7 FF E7 EF F7 FFF1E1例如,當(dāng)調(diào)用入口地址為0475H或0AC75H的一個(gè)子程序時(shí),操作碼都為91H。被調(diào)用的子程序入口地址必須與廟用指令A(yù)CALL后一條指令的第一個(gè)字節(jié)在相同的KB存貯器區(qū)之內(nèi)。ACALL把MCS-51子程序存貯空間劃分為32個(gè)區(qū),每個(gè)區(qū)為2KB字節(jié),調(diào)用指令A(yù)CALL的下一條指令第一個(gè)字節(jié)與子程序的入口地址必須在同一區(qū)內(nèi),否則將引起程序轉(zhuǎn)移混亂。如果ACALL指令正好落在區(qū)底的兩個(gè)單元內(nèi),如07FEH和07F
13、FH單元或0AFFEH和0AFFFH單元,程序就轉(zhuǎn)移到下一個(gè)區(qū)中去了。因?yàn)樵趫?zhí)行調(diào)用操作之前PC先加了2。指令的執(zhí)行不影響標(biāo)志。2. 絕對轉(zhuǎn)移a10a9a810001格式:AJMP addr 11代碼:a7a6a5a4a3a2a1a0操作:(PC)¬(PC)+2 (PC)¬指令中的a100說明:指令的操作碼與轉(zhuǎn)移目標(biāo)地址所在頁號有關(guān),每一種操作碼可分別對應(yīng)32個(gè)頁號,見表2-5。指令中的a100為區(qū)內(nèi)地址。轉(zhuǎn)移目標(biāo)地址必須與AJMP下一休指令的第一個(gè)字節(jié)在同一個(gè)2KB存貯器區(qū)內(nèi)。很明顯這條指令與ACALL指令相類似,是為了與MCS-48中的JMP指令兼容而設(shè)計(jì)的,同樣,當(dāng)A
14、LMP指令正好放在區(qū)底時(shí),轉(zhuǎn)移目標(biāo)將移至下一區(qū)中。因?yàn)樵趫?zhí)行轉(zhuǎn)移操作之前PC先加了2。指令的執(zhí)行不影響標(biāo)志。3.長調(diào)用00010010格式:LCALL addr 16代碼: 12HAddr158Addr70操作:(PC)¬(PC)+3(SP)¬(SP)+1(SP)¬(PC70)(SP)¬(SP)+1(SP)¬(PC158)(PC)¬指令中的addr150說明:這條調(diào)用指令允許子程序放在64KB空間的任何地方。指令的執(zhí)行不影響標(biāo)志。4. 長轉(zhuǎn)移00000010格式:LJMP addr 16代碼: 02HAddr158Addr70操作:(
15、PC)¬指令中的addr150說明:這條指令允許轉(zhuǎn)移的目標(biāo)地址在64KB空間的任意單元。指令的執(zhí)行不影響標(biāo)志。5. 短轉(zhuǎn)移10000000格式:SJMP rel代碼: 80H相對地址操作:(PC)¬(PC)+2 (PC)¬(PC)+ 相對地址說明:指令中的相對 地址是一個(gè)帶符號(2的補(bǔ)碼)的偏移字節(jié)數(shù),其范圍為128+127。負(fù)數(shù)表示向后轉(zhuǎn)移,正數(shù)表示向前轉(zhuǎn)移。CPU根據(jù)偏移字節(jié)數(shù)計(jì)算出轉(zhuǎn)移的目的地址。例如,在0100H單元有一條SJMP指令,若其相對地址為21H(正數(shù))則將轉(zhuǎn)移到0102H+21H0123H地址上。若相對地址為F0H(負(fù)數(shù)),則將轉(zhuǎn)移到0102H
16、+FFF0H00F2H地址上。在用匯編語言編寫程序時(shí),rel往往是一個(gè)標(biāo)號,由匯編程序在匯編過程中自動(dòng)計(jì)算偏移字節(jié)數(shù),并填入指令代碼中。不手工匯編時(shí),則根據(jù)該標(biāo)號的地址按上述方法進(jìn)行計(jì)算。以后的指令中有關(guān)rdl不再重復(fù)說明。當(dāng)偏移字節(jié)數(shù)為FEH時(shí),SJMP指令將實(shí)現(xiàn)原地轉(zhuǎn)圈的運(yùn)行狀態(tài)。如例16所示在60H地址處有SJMP指令,標(biāo)號HERE相當(dāng)于60H。根據(jù)偏移字節(jié)數(shù)計(jì)算得轉(zhuǎn)移目的地址為0062H+FFFEH0060H。故代碼為80H、0FEH的短相對轉(zhuǎn)移指令執(zhí)行原地轉(zhuǎn)圈操作。6. 間接長轉(zhuǎn)移01110011格式:JMP A+DPTR代碼: 73H操作:(PC)¬(A)+(DPTR)說
17、明:轉(zhuǎn)移地址由數(shù)據(jù)指針DPTR和累加器A的內(nèi)容相加形成。16位的模216加法運(yùn)算既不修改A也不修改DPTR,而是把加的結(jié)果直接送PC寄存器。指令的執(zhí)行不影響標(biāo)志。實(shí)驗(yàn)7-1 根據(jù)累加器的數(shù)值設(shè)計(jì)散轉(zhuǎn)表程序程序清單如下: MOV DPTR, #TABLE; 散轉(zhuǎn)表入口地址送DPTR JMP A+DPTR; 散轉(zhuǎn)到A中數(shù)據(jù)所確定的程序TABLE: AJMP RORT0; 散轉(zhuǎn)到RORT0 AJMP RORT1; 散轉(zhuǎn)到RORT1 AJMP RORT2; 散轉(zhuǎn)到RORT2 當(dāng)A為0時(shí),散轉(zhuǎn)到ROUT0,A為2時(shí)散轉(zhuǎn)到ROUT1¼¼由于AJMP是雙字節(jié)指令,所以A中必須是偶數(shù)。7.
18、 子程序返回00100010格式:RET代碼: 22H操作:(PC158)¬(SP)(SP)¬(SP)1(PC70)¬(SP)(SP)¬(SP)1說明:子程序返回指令把棧頂?shù)膬?nèi)容送到PC寄存器中。不影響標(biāo)志。通常用在由ACALL或LCALL調(diào)用的子程序末尾。8. 中斷返回格式:RETI00110010代碼: 32H操作:(PC158)¬(SP)(SP)¬(SP)1(PC70)¬(SP)(SP)¬(SP)1說明:中斷返回指令把棧頂?shù)膬?nèi)容送到PC寄存器中,同時(shí)釋放中斷邏輯使之能接受同級的另一個(gè)中斷請求。PSW并不自動(dòng)地
19、恢復(fù)到中斷前的狀態(tài)。如果在執(zhí)行RETI指令的時(shí)候,有一個(gè)較低級的或同級的中斷已掛起,則CPU在至少執(zhí)行了中斷返回后的一條指令之后才去響應(yīng)被掛起的中斷。9. 累加器為零轉(zhuǎn)移01100000格式:JZ rel代碼: 60H相對地址說明:若(A)0,則(PC)¬(PC)+2; 若(A)0,則(PC)¬(PC)+2+相對地址。不影響標(biāo)志。10. 累加器為非零轉(zhuǎn)移01110000格式:JNZ rel代碼: 70H相對地址說明:若(A)0,則(PC)¬(PC)+2; 若(A)0,則(PC)¬(PC)+2+相對地址。11. 累加器內(nèi)容與立即數(shù)不等轉(zhuǎn)移10110100格
20、式:CJNE A,data,rel代碼: 12H立即數(shù)相對地址操作:若data(A),則(PC)¬(PC)+3,(C)¬0若data(A),則(PC)¬(PC)+3+相對地址,(C)¬0若data(A),則(PC)¬(PC)+3+相對地址,(C)¬1說明:這是3字節(jié)3操作數(shù)指令。指令首生對前2個(gè)無符號操作數(shù)進(jìn)行比較,根據(jù)比較的結(jié)果設(shè)置進(jìn)位標(biāo)志C,并確定是否按第3個(gè)操作數(shù)轉(zhuǎn)移。MCS-54雖沒有單獨(dú)的比較指令,但設(shè)計(jì)了多條比較轉(zhuǎn)移指令,既有比較功能,又能根據(jù)比較結(jié)果使程序轉(zhuǎn)移,是很有用的一類指令。12. 累加器內(nèi)容與內(nèi)部RAM或?qū)S眉拇?/p>
21、器內(nèi)容不等轉(zhuǎn)移10110101格式:CJNE A,direct,rel代碼: B5H直接地址相對地址操作:若(direct)(A),則(PC)¬(PC)+3,(C)¬0若(direct)(A),則(PC)¬(PC)+3+rel,(C)¬0若(direct)(A),則(PC)¬(PC)+3+ rel,(C)¬113. 寄存器內(nèi)容與立即數(shù)不等轉(zhuǎn)移1011011i格式:CJNE Ri,#rel代碼: B6HB7H立即數(shù)相對地址操作:若data(Ri),則(PC)¬(PC)+3,(C)¬0若data(Ri),則(PC)
22、172;(PC)+3+rel,(C)¬0若data(Ri),則(PC)¬(PC)+3+ rel,(C)¬115. 寄存器內(nèi)容減1不為零轉(zhuǎn)移10111rrr格式:DJNE Rn,rel代碼: D8HDFH相對地址操作:(Rn)¬(Rn)1若Rn0,則(PC)¬(PC)+2若Rn0,則(PC)¬(PC)+2+rel,16. 內(nèi)容RAM或?qū)S眉拇嫫鲀?nèi)容減1不為零轉(zhuǎn)移11010101格式:CJNZ direct,rel代碼: D5H直接地址相對地址操作:若(direct)¬(direct)1若(direct)0,則(PC)¬
23、;(PC)+2若(direct)0,則(PC)¬(PC)+2+ rel。說明:當(dāng)direct為端口地址P0P3時(shí),這是一條“讀修改寫”指令。17. 空操作00000000格式:NOP代碼: 00H操作:(PC)¬(PC)+1說明:空操作是對CPU的控制指令,并沒有使程序轉(zhuǎn)移的功能,但僅此一條指令,故不單分類,在此節(jié)中一并介紹。18. 進(jìn)位標(biāo)志值轉(zhuǎn)移01000000格式:JC rel代碼: 40H相對地址操作:若(C)1,則(PC)¬(PC)+2+rel 若(C)0,則(PC)¬(PC)+2實(shí)驗(yàn)7-2 內(nèi)部RAM單元中的兩個(gè)數(shù)據(jù)比較比較內(nèi)部RAM NUMB
24、-1,NUMB-2中的兩個(gè)無符號數(shù)的大小,大數(shù)存入單元M,小數(shù)存入單元N,若兩數(shù)相等使內(nèi)部RAM的位127置1。程序以子程序方式給出。COMP: MOV A, NUMB-1 CJNE A, NUMB-2, BIC SETB 127 ; 兩數(shù)相等 RETBIG: JC LESS ; 若C置位則NUMB-1小 MOV M, A MOV N, NUMB-2 RETLESS: MOV N, A MOV M, NUMB-2 RET19. 進(jìn)位標(biāo)志為零轉(zhuǎn)移01010000格式:JNC rel代碼: 50H相對地址操作:若(C)0,則(PC)¬(PC)+2+rel 若(C)1,則(PC)¬
25、;(PC)+220. 直接尋址位置位轉(zhuǎn)移00100000格式:JB bit,rel代碼: 20H位地址相對地址操作:若(bit)1,則(PC)¬(PC)+3+rel 若(bit)0,則(PC)¬(PC)+3說明:被測試的直接尋址位在執(zhí)行了該指令后,內(nèi)容不改變。21. 直接尋址位為零轉(zhuǎn)移00110000格式:JNB bit,rel代碼: 30H位地址相對地址操作:若(bit)0,則(PC)¬(PC)+3+rel 若(bit)1,則(PC)¬(PC)+322. 直接尋址位置位轉(zhuǎn)移并將該位復(fù)位00010000格式:JBC bit,rel代碼: 10H位地址相對
26、地址操作:若(bit)0,則(PC)¬(PC)+3 若(bit)1,則(PC)¬(PC)+3+rel,(bit)¬0說明:若直接尋址位為輸出端口對片內(nèi)定時(shí)器計(jì)數(shù)器的溢出標(biāo)志TF0TF2進(jìn)行檢測以控制程序流向時(shí),采用JBCTFX,rel比采用JBCTFX更為合適。因?yàn)镴BC指令不僅能完成對TF0TF2狀態(tài)的檢測,同時(shí)當(dāng)滿足轉(zhuǎn)移條件(即TFX1)時(shí),能自動(dòng)將其復(fù)位,而用JB指令,就要另用1條CLR TFX指令來復(fù)位,文中X02。7.4 中斷請?jiān)O(shè)想下面三個(gè)場景:場景之一:第二天凌晨要去趕火車,但你沒有鬧鐘,只有一個(gè)掛鐘,估摸到了半夜你已經(jīng)醒來,但你擔(dān)心誤車,只能不時(shí)地看
27、掛鐘,這一夜你肯定沒能睡好,到點(diǎn)后疲憊不堪地起床,背起行囊去趕火車。場景之二:第二天凌晨要去趕火車,你有精確、可靠的鬧鐘,你只需設(shè)定好鬧鐘,放心、安穩(wěn)地睡覺,第二天凌晨,溫柔的鐘聲喚醒了你,你精神飽滿地起床,背起行囊去趕火車。場景之三:當(dāng)你在讀書時(shí),可能電話鈴聲響了,你 “中斷”正在讀的書,將正在讀的這一頁書折一個(gè)角,拿起電話與你的親友通話,通完話后,又津津有味地從已折好角的那書接著讀下去。在場景之一,由于你只能“一心一意”、“一心一用”,結(jié)果,要看鐘就不能睡覺,要睡覺就不能看鐘,時(shí)間利用效果很差,你(作為CPU)只能不斷地去看(查詢)鐘,在場景之二,你也只能“一心一意”、“一心一用”,但有鬧
28、鐘幫助你“看”時(shí)間,到時(shí)候鬧鐘自動(dòng)地“中斷”你的正常工作睡覺,結(jié)果你休息好了,也不會(huì)誤車。在場景之三,你仍然是“一心一意”、“一心一用”,但電話鈴聲“中斷”你的正常工作(主程序)讀書,你折好這頁書角(保護(hù)現(xiàn)場),去接電話(響應(yīng)中斷,執(zhí)行中斷子程序),接完電話,“返回”正常工作讀書(主程序),接著“中斷”的地方繼續(xù)讀書。這三個(gè)場景與單片機(jī)的工作十分類似,第一個(gè)場景相當(dāng)于單片機(jī)采用查詢方式,第二個(gè)場景采用了中斷方式,第三個(gè)場景不僅采用了中斷,還有中斷現(xiàn)場保護(hù)。顯然,第二個(gè)場景效率比第一個(gè)高,而第三個(gè)場景效率最高,工作有條理。與上述舉例一樣,現(xiàn)在幾乎所有的單片機(jī)都具備中斷系統(tǒng)和功能,而且中斷功能的強(qiáng)
29、弱、中斷源的多少,也是單片機(jī)性能強(qiáng)弱的重要指標(biāo)。89C52有個(gè)中斷源,可分為2個(gè)優(yōu)先級,其中每一個(gè)中斷源的優(yōu)先級都可以由程序排定。7.4.1中斷源89C52提供6個(gè)中斷源如圖7-3所示。圖7-3 89C52的6個(gè)中斷源外部中斷INT0和INT1可根據(jù)寄存器TCON中的IT0和IT1位狀態(tài)分別設(shè)置為電平或者邊沿觸發(fā)。實(shí)際產(chǎn)生的中斷標(biāo)志是TCON中的位IE0和IE1,當(dāng)產(chǎn)生外部中斷時(shí),如果是邊沿觸發(fā),進(jìn)入中斷服務(wù)程序后由硬件清除中斷標(biāo)志位;如果中斷是電平觸發(fā),由外部請求源(而不是由片內(nèi)硬件)控制請求標(biāo)志。定時(shí)器0和定時(shí)器1中斷由TF0和TF1(分別由各自的定時(shí)/計(jì)數(shù)寄存器控制,定時(shí)器0工作在模式3
30、時(shí)除外)產(chǎn)生。當(dāng)產(chǎn)生定時(shí)器中斷進(jìn)入中斷服務(wù)程序后,由片內(nèi)硬件清除標(biāo)志位。串口中斷由RI和TI的邏輯或產(chǎn)生。進(jìn)入中斷服務(wù)程序后,這些標(biāo)志均不能被硬件清除。實(shí)際上,中斷服務(wù)程序通常需要確定是由RI還是TI產(chǎn)生的中斷,然后由軟件清除中斷標(biāo)志,所以這些產(chǎn)生中斷的位都可通過軟件置位或清零,與通過硬件置位或清零的效果相同,簡而言之中斷可由軟件產(chǎn)生推遲或取消。7.4.2 中斷控制寄存器1中斷使能寄存器IE每個(gè)中斷源可通過置位或清零中斷控制寄存器IE(圖7-4)中的相應(yīng)位分別使能或禁止IE中還包含一個(gè)全局禁止位EA可以立即禁止所有的中斷。EA(IE.7) 全局中斷禁止位。如果EA0,所有的中斷都被禁止;EA1
31、,所有的中斷都可通過設(shè)置/清零各自的使能位單獨(dú)使能或禁止。(IE.6) 無效位。保留將來之用。ET2(IE.5) 定時(shí)器2中斷使能位。如果ET20,禁止定時(shí)器2中斷;ET21,允許定時(shí)器2中斷。ES(IE.4) 串口中斷使能位。如果ES0,禁止串口中斷;ES1,允許串口中斷。ET1(IE.3) 定時(shí)器1中斷使能位。如果ET10,禁止定時(shí)器1中斷;ET11,允許定時(shí)器1中斷。EX1(IE.2) 外部中斷1使能位。如果EX10,禁止外部中斷1中斷;EX11,允許外部中斷1中斷。ET0(IE.1) 定時(shí)器0中斷使能位。如果ET00,禁止定時(shí)器0中斷;ET01,允許定時(shí)器0中斷。EX0(IE.0) 外
32、部中斷0使能位。如果EX00,禁止外部中斷0中斷;EX01,允許外部中斷0中斷。IE寄存器中包含了一個(gè)無效位,由于這位可能用于其它80C51系列產(chǎn)品中,用戶軟件不應(yīng)將這些位寫入1。(MSB) (LSB)EAET2ESET1EX1ET0EX0圖7-4 中斷控制寄存器IE2中斷優(yōu)先級寄存器IP每個(gè)中斷源可通過置位或清零中斷優(yōu)先級寄存器IP(圖7-5)中的相應(yīng)位設(shè)置中斷優(yōu)先級。(IP.7) 無效位。保留將來之用。(IP.6) 無效位。保留將來之用。PT2(IP.5) 定時(shí)器2中斷優(yōu)先級位。如果PT20,設(shè)置定時(shí)器2中斷為低優(yōu)先級;PT21,設(shè)置定時(shí)器2中斷為高優(yōu)先級。PS(IP.4) 串口中斷使能位
33、。如果PS0,設(shè)置串口中斷為低優(yōu)先級;ES1,設(shè)置串口中斷為高優(yōu)先級。PT1(IP.3) 定時(shí)器1中斷優(yōu)先級位。如果PT10,設(shè)置定時(shí)器1中斷為低優(yōu)先級;PT11,設(shè)置定時(shí)器1中斷為高優(yōu)先級。PX1(IP.2) 外部中斷1優(yōu)先級位。如果PX10,設(shè)置外部中斷1為低優(yōu)先級;PX11,設(shè)置外部中斷1為高優(yōu)先級。PT0(IP.1) 定時(shí)器0中斷優(yōu)先級位。如果PT00,設(shè)置定時(shí)器0中斷為低優(yōu)先級;PT01,設(shè)置定時(shí)器0中斷為高優(yōu)先級。PX0(IP.0) 外部中斷0優(yōu)先級位。如果PX00,設(shè)置外部中斷0為低優(yōu)先級;PX01,設(shè)置外部中斷0為高優(yōu)先級。IP寄存器中包含了一些無效位,由于這些位可能用于其它8
34、0C51系列產(chǎn)品中,用戶軟件不應(yīng)將這些位寫入1。(MSB) (LSB)PT2PSPT1PX1PT0PX0圖7-5 中斷優(yōu)先級寄存器IP3中斷優(yōu)先級寄存器IPH有的89C52品種的單片機(jī)具有4個(gè)優(yōu)先級,每個(gè)中斷源可通過置位或清零中斷優(yōu)先級寄存器IP和中斷優(yōu)先級高位寄存器IPH(圖7-6)中的相應(yīng)位設(shè)置4級中斷優(yōu)先級之一(見表7-3)。(IPH.7) 無效位。保留將來之用。(IPH.6) 無效位。保留將來之用。PT2H(IPH.5) 定時(shí)器2中斷優(yōu)先級位。如果PT2H0,設(shè)置定時(shí)器2中斷為低優(yōu)先級;PT2H1,設(shè)置定時(shí)器2中斷為高優(yōu)先級。PSH(IPH.4) 串口中斷使能位。如果PSH0,設(shè)置串口
35、中斷為低優(yōu)先級;ESH1,設(shè)置串口中斷為高優(yōu)先級。PT1H(IPH.3) 定時(shí)器1中斷優(yōu)先級位。如果PT1H0,設(shè)置定時(shí)器1中斷為低優(yōu)先級;PT1H1,設(shè)置定時(shí)器1中斷為高優(yōu)先級。PX1H(IPH.2) 外部中斷1優(yōu)先級位。如果PX1H0,設(shè)置外部中斷1為低優(yōu)先級;PX1H1,設(shè)置外部中斷1為高優(yōu)先級。PT0H(IPH.1) 定時(shí)器0中斷優(yōu)先級位。如果PT0H0,設(shè)置定時(shí)器0中斷為低優(yōu)先級;PT0H1,設(shè)置定時(shí)器0中斷為高優(yōu)先級。PX0H(IPH.0) 外部中斷0優(yōu)先級位。如果PX0H0,設(shè)置外部中斷0為低優(yōu)先級;PX0H1,設(shè)置外部中斷0為高優(yōu)先級。IPH寄存器中包含了一些無效位,由于這些位
36、可能用于其它80C51系列產(chǎn)品中,用戶軟件不應(yīng)將這些位寫入1。(MSB) (LSB)PT2HPSHPT1HPX1HPT0HPX0H圖7-6 中斷優(yōu)先級高位寄存器IPH表7-3 中斷的優(yōu)先級優(yōu)先級位中斷優(yōu)先級IPH.xIP.x000(最低優(yōu)先級)011102113(最高優(yōu)先級)7.4.3 中斷優(yōu)先級結(jié)構(gòu)每個(gè)中斷源都可通過編程中斷優(yōu)先級寄存器IP(圖7-5)單獨(dú)設(shè)置優(yōu)先級。一個(gè)中斷服務(wù)程序可響應(yīng)更高級的中斷,但不能響應(yīng)同優(yōu)先級或低級中斷。最高級中斷服務(wù)程序不響應(yīng)其它任何中斷。如果兩個(gè)不同中斷優(yōu)先級的中斷源同時(shí)申請中斷時(shí),響應(yīng)較高優(yōu)先級的中斷申請。如果2個(gè)同優(yōu)先級的中斷源同時(shí)申請中斷,內(nèi)部查詢順序?qū)?/p>
37、確定首先響應(yīng)哪一個(gè)中斷。請求查詢順序如表7-4所示。表7-4 中斷源同級優(yōu)先級序號中 斷 源同級優(yōu)先級1IE0(外部中斷0)最高2TF0(定時(shí)器0)3IE1(外部中斷1)4TF1(定時(shí)器1)5RI+TI(UART)6TF2,EXF2(定時(shí)器2 )最低注:同級優(yōu)先級只用來處理相同優(yōu)先級別中斷源同時(shí)申請中斷的情況。實(shí)驗(yàn)7-3:電子鐘下面是一個(gè)顯示時(shí)、分、秒的電子鐘程序。 ORG 8000H; 實(shí)驗(yàn)板開始執(zhí)行的第一條指令所處的地址LJMP MAIN; 跳轉(zhuǎn)到主程序ORG 800BH; 定時(shí)器0中斷入口地址LJMP TINT0; 跳轉(zhuǎn)到定時(shí)器0中斷服務(wù)子程序 ORG 8200H; 主程序開始的地址;避
38、開中斷入口地址MAIN:MOV SP, #0D0H ; 設(shè)置堆棧起始地址 LCALL INT8255; 初始化CPU,注意用不同的子程序完成一定的功能,這是模塊化 ; 編程技術(shù)之一,方便程序的開發(fā)、管理和維護(hù)MOV R3, #00H ; 時(shí)計(jì)數(shù)存儲(chǔ)單元MOV 3FH, #50; 裝入中斷次數(shù) MOV 40H, #00H ; 秒低位存儲(chǔ)單元 MOV 41H, #00H ; 秒高位存儲(chǔ)單元 MOV 42H, #0FFH ; 分、秒間顯示符號""MOV 43H, #00H ; 分低位 MOV 44H, #00H ; 分高低位 MOV 45H, #0FFH ; 時(shí)、分間顯示符號&q
39、uot;-"MOV 46H, #00H ; 時(shí)低位 MOV 47H, #00H ; 時(shí)高位 SETB ET0 ; T0開中斷SETB EA ; CPU開中斷 ORL TMOD, #01H; 設(shè)置定時(shí)器0工作在模式1 MOV TH0, #0B8H; 設(shè)定定時(shí)器初值,定時(shí)時(shí)間為20ms。賦TH0初值為0B8H MOV TL0, #00H; 賦TL0初值為00H SETB TR0 ; 啟動(dòng)T0L1: LCALL LED ; 調(diào)LED子程序LJMP L1 INT8255:MOV P2, #58H ; 使89C52P2指向8255PA的控制寄存器接口結(jié)構(gòu),89C52P0口地址應(yīng)與低8位無關(guān)MO
40、V A, #82H ; 8255A的控制字(82H),8255PC口輸出PB口輸入,PA口輸出 MOVX R0, A; 送8255A控制字 RET TINT0: MOV TH0, #0B8H; 重賦定時(shí)器初值 MOV TL0, #00H PUSH PSW ; 保護(hù)現(xiàn)場 PUSH ACC DJNZ 3FH, RETURN ; 1S未到返回MOV 3FH, #50 ; 重置中斷次數(shù)INC 40H ; 秒低位加1MOV A, 40H CJNE A, #0AH, RETURN; 未滿10S返回MOV 40H, #00H ; 計(jì)滿10S,秒低位清0INC 41H ; 秒高位加1MOV A, 41H CJ
41、NE A, #06H, RETURN ; 未滿60S返回 MOV 41H, #00H ; 計(jì)滿60S,秒高位清0 INC 43H ; 分低位加1 MOV A, 43H CJNE A, #0AH, RETURN; 未滿10分返回MOV 43H, #00H ; 計(jì)滿10分,分低位清0INC 44H ; 分高位加1MOV A, 44H CJNE A, #06H, RETURN; 未滿60分返回 MOV 44H, #00H ; 計(jì)滿60分,分高位清0INC 46HINC R3CJNE R3, #24, H1 ; 未滿24小時(shí)跳轉(zhuǎn)MOV 47H, #00H MOV 46H, #00H LJMP RETU
42、RN ; 滿24小時(shí),時(shí)高低位均清0H1:MOV A, 46H CJNE A, #0AH, RETURN ; 未滿10小時(shí)返回MOV 46H, #00H ; 計(jì)滿10小時(shí),時(shí)低位清0 INC 47H ; 時(shí)高位加1RETURN: POP ACC ; 恢復(fù)現(xiàn)場 POP PSW RETILED: MOV R2, #04H ; 從右到左LED的位碼依次為7F,BF,DF,EF,FE,FD,FB,F7 MOV R5, #07FH ; R5作為位選寄存器 MOV R1, #40HDISPLAY1:MOV 36H, R1 LCALL LED1 MOV A, R5 MOV P2, #50H MOVX R0,
43、 A ; 送位選碼入PC口 LCALL TMS ; 延時(shí)1.024ms INC R1 MOV A, R5 RR A MOV R5, A DJNZ R2, DISPLAY1 MOV R2, #04H MOV R5, #0FEH ; 使左四位LED亮 MOV R1, #44HDISPLAY2:MOV 36H, R1 LCALL LED1 MOV A, R5 MOV P2, #050H MOVX R0, A LCALL TMS MOV A, R5 RL A MOV R5, A INC R1 DJNZ R2, DISPLAY2 OU1: RET LED1: MOV P2, #040H; 送段碼子程序
44、MOV DPTR, #TAB MOV A, 36HAAA: CJNE A, #0FFH, BBBMOVX A, DPTRMOVX R0,ARETBBB: DEC AINC DPTRLJMP AAA TMS: MOV R6, #0FFH; 給R6和R6賦初值,在12Hz晶振時(shí)延時(shí)時(shí)間為2(R7循環(huán)次數(shù))MOV R7, #02H; 256(R6循環(huán)次數(shù))×2×10-6(DJNZ指令耗時(shí))1.024MSDELAY01: DJNZ R6, $; R6單元減1,非0繼續(xù)執(zhí)行當(dāng)前指令,"$"指當(dāng)前指令地址DJNZ R7, DELAY01; R7減1,非0跳轉(zhuǎn)到標(biāo)號D
45、ELAY01處執(zhí)行 RET TAB:DB 0BFH, 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H END該實(shí)驗(yàn)的目的是為了掌握中斷、定時(shí)器的編程和調(diào)試。7.4.4 中斷的處理中斷系統(tǒng)在每個(gè)機(jī)器周期的S5P2時(shí)采樣中斷標(biāo)志,在下一個(gè)機(jī)器周期查詢該采樣,如果在S5P2周期時(shí)有一個(gè)標(biāo)志置位,在查詢周期將發(fā)現(xiàn)它,然后中斷系統(tǒng)產(chǎn)生一個(gè)LCALL調(diào)用對應(yīng)的服務(wù)程序。在下面任意一種情況下都會(huì)推遲執(zhí)行由硬件產(chǎn)生的LCALL。1. 同級或更高級的中斷已在處理中。2. 當(dāng)前的周期不是正在執(zhí)行指令的最后一個(gè)周期。3. 正在處理的指令是RETI或任何寫I
46、E或IP寄存器的指令。情況2確保正在處理的指令在進(jìn)入任何中斷服務(wù)程序前可以執(zhí)行完畢。情況3確保了如果正在處理的指令是RETI,或任何訪問IE或IP寄存器的指令,那么在進(jìn)入任何中斷服務(wù)程序之前至少再執(zhí)行一條指令。查詢周期在每個(gè)機(jī)器周期都會(huì)重復(fù)所查詢的值是在前一個(gè)機(jī)器周期的S5P2出現(xiàn)的值。需要注意的是,如果一個(gè)中斷標(biāo)志位有效,但仍然沒有被響應(yīng)是因?yàn)槌霈F(xiàn)上面所述的情況。如果當(dāng)阻礙的條件撤除時(shí),中斷標(biāo)志不再有效,中斷將不再響應(yīng)。換句話說,如果中斷標(biāo)志有效時(shí)沒有響應(yīng),中斷之后將不再保持該標(biāo)志,每次查詢周期都會(huì)更新中斷標(biāo)志。中斷的查詢周期和LCALL時(shí)序如圖7-6所示。需要注意的是,如果一個(gè)更高優(yōu)先級的中斷在S5P2之前的C3有效,然后根據(jù)上面的規(guī)則,它會(huì)在C5、C6響應(yīng)中斷,不執(zhí)行任何低優(yōu)先級中斷的指令。單片機(jī)通過執(zhí)行硬件產(chǎn)生的LCALL調(diào)用相應(yīng)的服務(wù)程序來應(yīng)答中斷。在有些情況下它清零中斷標(biāo)志位,另一些情況不清零。它永遠(yuǎn)不會(huì)清零串口中斷標(biāo)志,這需要用戶軟件來完成。如果外部中斷是邊沿觸發(fā),中斷標(biāo)志(IE0或IE1)會(huì)被硬件清零,硬件產(chǎn)生的LCALL將程序指針的內(nèi)容壓入堆棧(但不會(huì)保護(hù)程序狀態(tài)字寄存器PSW),并根據(jù)響應(yīng)的中斷源重新將一個(gè)地址裝入PC(如表7-5所示)。當(dāng)中斷服務(wù)程序執(zhí)行到RETI指令時(shí)通
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026山東事業(yè)單位統(tǒng)考濱州市惠民縣招聘43人備考考試試題及答案解析
- 2026江蘇大學(xué)附屬醫(yī)院招聘編外人員56人(一)筆試模擬試題及答案解析
- 2026渭南合陽縣農(nóng)村合作經(jīng)濟(jì)工作站招聘(2人)備考考試試題及答案解析
- 月老牽線活動(dòng)策劃方案(3篇)
- 挖溝拆除施工方案(3篇)
- 親子義賣活動(dòng)方案策劃(3篇)
- 肯德基衛(wèi)生管理制度表模板(3篇)
- 2026匯才(福建泉州市)企業(yè)管理有限公司派駐晉江市永和鎮(zhèn)招聘5人備考考試試題及答案解析
- 2026山東事業(yè)單位統(tǒng)考威?;鹁娓呒夹g(shù)產(chǎn)業(yè)開發(fā)區(qū)鎮(zhèn)(街道)招聘初級綜合類崗位9人筆試模擬試題及答案解析
- 2026年河北張家口赤城縣農(nóng)業(yè)農(nóng)村局公開招聘特聘農(nóng)技員4名考試備考題庫及答案解析
- 單證專員述職報(bào)告
- 眼底病OCT解讀演示教學(xué)課件
- 民間個(gè)人借款擔(dān)保書
- 神經(jīng)病學(xué)教學(xué)課件:阿爾茨海默病
- LY/T 1598-2011石膏刨花板
- GB/T 31588.1-2015色漆和清漆耐循環(huán)腐蝕環(huán)境的測定第1部分:濕(鹽霧)/干燥/濕氣
- GB/T 21268-2014非公路用旅游觀光車通用技術(shù)條件
- GA/T 1495-2018道路交通安全設(shè)施基礎(chǔ)信息采集規(guī)范
- 夜間綜合施工專項(xiàng)專題方案公路
- ★神東煤炭集團(tuán)xx煤礦礦井災(zāi)害預(yù)防與處理計(jì)劃
- Q∕GDW 11421-2020 電能表外置斷路器技術(shù)規(guī)范
評論
0/150
提交評論