日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

當(dāng)前位置:電子發(fā)燒友網(wǎng) > 圖書(shū)頻道 > 電子 > 《單片機(jī)原理與應(yīng)用》 > 第5章 MCS-51單片機(jī)內(nèi)部資源

第2節(jié) 單片機(jī)流水燈控制

  5.2.1 硬件電路與工作原理

  1. 硬件電路同模塊二中圖2.1。

  2. 工作原理

  一旦按下P3.2所接按鍵后,P3.2口線上會(huì)出現(xiàn)這樣兩個(gè)變化,第一,口線上出現(xiàn)由高到低的變化,即出現(xiàn)下降沿。第二,P3.2按住后口線保持低電平直到松鍵為止。單片機(jī)就是利用口線上的這種變化,實(shí)現(xiàn)上述各種狀態(tài)的切換。

  5.2.2 控制程序

  1. 程序流程圖

                                                                                                 圖 5.8 主程序流程                                                                                    圖 5.9 外部中斷程序流程

  

圖 5.10 定時(shí)中斷程序流程

  2. 控制程序

  ORG 0000H

  LJMP MAIN

  ORG 0003H

  LJMP INT_0

  ORG 001BH

  LJMP DELAY

  MAIN: SETB IT0

  MOV TMOD,#01H

  MOV TL0,#00H

  MOV TH0,#4CH

  SETB PT0

  SETB EA

  SETB EX0

  SETB ET0

  MOV B,#20

  SETB TR0

  MOV A,#0FEH

  BEGIN: MOV P1,A

  CJNE B,#00,$

  MOV B,#20

  RL A

  SJMP BEGIN

  INT_0: PUSH ACC

  MOV A,#0FBH

  LOOP: MOV P1,A

  CJNE B,#00,$

  MOV B,#20

  RL A

  JNB P3.2,LOOP

  POP ACC

  RETI

  DELAY: MOV TL0,#00H

  MOV TH0,#4CH

  DJNZ B,LOOP1

  LOOP1: RETI

  END

  5.2.3 源程序的編輯、編譯、下載

  打開(kāi)“偉福”模擬仿真軟件進(jìn)行程序的編輯、編譯。

  打開(kāi)“ISP下載軟件”將目標(biāo)文件下載到ISP-4實(shí)驗(yàn)開(kāi)發(fā)板上的AT89S51單片機(jī)芯片,觀察程序運(yùn)行結(jié)果。

  5.2.4 相關(guān)知識(shí)

  1. 單片機(jī)如何中斷原來(lái)的工作?

  在本任務(wù)中當(dāng)按鍵S1按下后,原來(lái)單片機(jī)正在進(jìn)行的工作被打斷,按鍵松開(kāi)后單片機(jī)又恢復(fù)了原來(lái)的工作,這就是我們?cè)谇懊嫠f(shuō)的中斷。

  對(duì)初學(xué)者來(lái)說(shuō),中斷這個(gè)概念比較抽象,其實(shí)單片機(jī)的處理系統(tǒng)與人的一般思維有著許多異曲同工之妙,我們舉個(gè)很貼切的比方,在日常生活和工作中有很多類似的情況。假如你正在上班,例如是編譯資料,這時(shí)侯電話鈴響了,你在書(shū)本上做個(gè)記號(hào)(以記下你現(xiàn)在正編譯到某某頁(yè)),然后與對(duì)方通電話,而此時(shí)恰好有客人到訪,你先停下通電話,與客人說(shuō)幾句話,叫客人稍侯,然后回頭繼續(xù)通完電話,再與客人談話。談話完畢,送走客人,繼續(xù)你的資料編譯工作。

  這就是日常生活和工作中的中斷現(xiàn)象,類似的情況還有很多,從編譯資料到接電話是第一次中斷,通電話的過(guò)程中引有客人到訪,這是第二次中斷,即在中斷的過(guò)程中又出現(xiàn)第二次中斷,這就是我們常說(shuō)的中斷嵌套。處理完第二個(gè)中斷任務(wù)后,回頭處理第一個(gè)中斷,第一個(gè)中斷完成后,再繼續(xù)你原先的主要工作。

  為什么會(huì)出現(xiàn)這樣的中斷呢?道理很簡(jiǎn)單,人非三頭六臂,人只有一個(gè)腦袋,在一種特定的時(shí)間內(nèi),可能會(huì)面對(duì)著兩、三甚至更多的任務(wù)。但一個(gè)人又不可能在同一時(shí)間去完成多樣任務(wù),因此你只能采分析任務(wù)的輕重緩急,采用中斷的方法穿插去完成它們。那么這種情況對(duì)于單片機(jī)中的中央處理器也是如此,單片機(jī)中CPU只有一個(gè),但在同一時(shí)間內(nèi)可能會(huì)面臨著處理很多任務(wù)的情況,如運(yùn)行主程序、數(shù)據(jù)的輸入和輸出,定時(shí)/和計(jì)數(shù)時(shí)間已到要處理、可能還有一些外部的更重要的中斷請(qǐng)求(如超溫超壓)要先處理。此時(shí)也得象人的思維一樣停下某一樣(或幾樣)工作先去完成一些緊急任務(wù)的中斷方法。

  這樣的一樣處理方法上升到計(jì)算機(jī)理論,就是一個(gè)資源面對(duì)多項(xiàng)任務(wù)的處理方式,由于資源有限,面對(duì)多項(xiàng)任務(wù)同時(shí)要處理時(shí),就會(huì)出現(xiàn)資源競(jìng)爭(zhēng)的現(xiàn)象。中斷技術(shù)就是為了解決資源競(jìng)爭(zhēng)的一個(gè)可行的方法,采用中斷技術(shù)可使多項(xiàng)任務(wù)共享一個(gè)資源,所以有些文獻(xiàn)也稱中斷技術(shù)是一種資源共享技術(shù)。

  (1) MCS-51的中斷結(jié)構(gòu)

  圖 5.11 中斷系統(tǒng)的結(jié)構(gòu)

  計(jì)算機(jī)的中斷系統(tǒng)能夠加強(qiáng)CPU對(duì)多任務(wù)事件的處理能力。從而使它的應(yīng)用范圍進(jìn)一步擴(kuò)大。在MCS-48結(jié)構(gòu)的基礎(chǔ)上,MCS-51在增強(qiáng)了I/O的種類、功能和數(shù)量的同時(shí),也增強(qiáng)了中斷能力。MCS-51提供了5個(gè)中斷源,兩個(gè)中斷優(yōu)先級(jí)控制,可實(shí)現(xiàn)兩個(gè)中斷服務(wù)嵌套。當(dāng)CPU支持中斷屏蔽指令后,可將一部分或所有的中斷關(guān)斷,只有打開(kāi)相應(yīng)的中斷控制位后,方可接收相應(yīng)的中斷請(qǐng)求。程序設(shè)置中斷的允許或屏蔽,也可設(shè)置中斷的優(yōu)先級(jí)。

  (2) 中斷處理流程

  CPU響應(yīng)中斷請(qǐng)求后,就立即轉(zhuǎn)入執(zhí)行中斷服務(wù)程序。不同的中斷源、不同的中斷要求可能有不同的中斷處理方法,但它們的處理流程一般都如下所述。

  1) 現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)

  中斷是在執(zhí)行其它任務(wù)的過(guò)程中轉(zhuǎn)去執(zhí)行臨時(shí)的任務(wù),為了在執(zhí)行完中斷服務(wù)程序后,回頭執(zhí)行原先的程序時(shí),知道程序原來(lái)在何處打斷的,各有關(guān)寄存器的內(nèi)容如何,就必須在轉(zhuǎn)入執(zhí)行中斷服務(wù)程序前,將這些內(nèi)容和狀態(tài)進(jìn)行備份——即保護(hù)現(xiàn)場(chǎng)。就象文章開(kāi)頭舉的例子,在看書(shū)時(shí),電話玲響需傳去接電話時(shí),必須在書(shū)本上做個(gè)記號(hào),以便在接完電話后回來(lái)看書(shū)時(shí),知道從哪些內(nèi)容繼續(xù)往下看。計(jì)算機(jī)的中斷處理方法也如此,中斷開(kāi)始前需將個(gè)有關(guān)寄存器的內(nèi)容壓入堆棧進(jìn)行保存,以便在恢復(fù)原來(lái)程序時(shí)使用。

  中斷服務(wù)程序完成后,繼續(xù)執(zhí)行原先的程序,就需把保存的現(xiàn)場(chǎng)內(nèi)容從堆棧中彈出,恢復(fù)積存器和存儲(chǔ)單元的原有內(nèi)容,這就是現(xiàn)場(chǎng)恢復(fù)。

  如果在執(zhí)行中斷服務(wù)時(shí)不是按上述方法進(jìn)行現(xiàn)場(chǎng)保護(hù)和恢復(fù)現(xiàn)場(chǎng),就會(huì)是程序運(yùn)行紊亂,程序跑飛,自然使單片機(jī)不能正常工作。

  2) 中斷打開(kāi)和中斷關(guān)閉

  在中斷處理進(jìn)行過(guò)程中,可能又有新的中斷請(qǐng)求到來(lái),這里規(guī)定,現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)的操作是不允許打擾的,否則保護(hù)和恢復(fù)的過(guò)程就可能使數(shù)據(jù)出錯(cuò),為此在進(jìn)行現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)的過(guò)程中,

  必須關(guān)閉總中斷,屏蔽其它所有的中斷,待這個(gè)操作完成后再打開(kāi)總中斷,以便實(shí)現(xiàn)中斷嵌套。

  3) 中斷服務(wù)程序

  既然有中斷產(chǎn)生,就必然有其具體的需執(zhí)行的任務(wù),中斷服務(wù)程序就是執(zhí)行中斷處理的具體內(nèi)容,一般以子程序的形式出現(xiàn),所有的中斷都要轉(zhuǎn)去執(zhí)行中斷服務(wù)程序,進(jìn)行中斷服務(wù)。

  4) 中斷返回

  執(zhí)行完中斷服務(wù)程序后,必然要返回,中斷返回就是被程序運(yùn)行從中斷服務(wù)程序轉(zhuǎn)回到原工作程序上來(lái)。在MCS-51單片機(jī)中,中斷返回是通過(guò)一條專門(mén)的指令實(shí)現(xiàn)的,自然這條指令是中斷服務(wù)程序的最后一條指令。

  (3) MCS-51的中斷源

  8051有5個(gè)中斷源,它們是兩個(gè)外中斷INT0(P3.2)和INT1(P3.3)、兩個(gè)片內(nèi)定時(shí)/計(jì)數(shù)器溢出中斷TF0和TF1,一個(gè)是片內(nèi)串行口中斷TI或RI,這幾個(gè)中斷源由TCON和SCON兩個(gè)特殊功能寄存器進(jìn)行控制。

  在前一節(jié),我們已對(duì)TCON的控制位進(jìn)行了說(shuō)明,現(xiàn)在繼續(xù)對(duì)它的中斷控制有關(guān)的位進(jìn)行談?wù)?。TCON寄存器的結(jié)構(gòu)如下:

  表5.1 TCON寄存器結(jié)構(gòu)

  IE1: 外部邊沿觸發(fā)中斷1請(qǐng)求標(biāo)志,其功能和操作類似于TF0。

  IT1: 外部中斷1類型控制位,通過(guò)軟件設(shè)置或清楚,用于控制外中斷的觸發(fā)信號(hào)類型。IT1=1,邊沿觸發(fā)。IT=0是電平觸發(fā)。

  IE0: 外部邊沿觸發(fā)中斷0請(qǐng)求標(biāo)志,其功能和操作類似于IE1。

  IT0: 外部中斷0類型控制位,通過(guò)軟件設(shè)置或清楚,用于控制外中斷的觸發(fā)信號(hào)類型。其功能和操作類似于IE1。

  SCON是串行口控制寄存器,字節(jié)地址為98H,SCON的低二位是串行口的發(fā)送和接收中斷標(biāo)志,其格式如下:

  

  表5.2 SCON寄存器結(jié)構(gòu)

  TI: MCS-51串行口的發(fā)送中斷標(biāo)志,在串行口以方式0發(fā)送時(shí),每當(dāng)發(fā)送完8位數(shù)據(jù),由硬件置位。如果以方式1、方式2或方式3發(fā)送時(shí),在發(fā)送停止位的開(kāi)始時(shí)TI被置1,TI=1表示串行發(fā)送器正向CPU發(fā)出中斷請(qǐng)求,向串行口的數(shù)據(jù)緩沖器SBUF寫(xiě)入一個(gè)數(shù)據(jù)后就立即啟動(dòng)發(fā)送器繼續(xù)發(fā)送。但是CPU響應(yīng)中斷請(qǐng)求后,轉(zhuǎn)向執(zhí)行中斷服務(wù)程序時(shí),并不清零TI,TI必須由用戶的中斷服務(wù)程序清“0”,即中斷服務(wù)程序必須有“CLR TI”或“ANL SCON, #0FDH”等指令來(lái)清零TI。

  RI: 串行口接收中斷標(biāo)志.若串行口接收器允許接收,并以方式0工作,每當(dāng)接收到8位數(shù)據(jù)時(shí),RI被置1,若以方式1、2、3方式工作,當(dāng)接收到半個(gè)停止位時(shí),TI被置1,當(dāng)串行口以方式2或3方式工作,且當(dāng)SM2=1時(shí),僅當(dāng)接收到第9位數(shù)據(jù)RB8為1后,同時(shí)還要在接收到半個(gè)停止位時(shí),RI被置1。RI為1表示串行口接收器正向CPU申請(qǐng)中斷。同樣RI標(biāo)志栩栩如生由用戶的軟件清“0”。

  (4) 中斷的控制

  對(duì)于中斷控制,在上一節(jié)中我們已經(jīng)對(duì)TCON和SCON進(jìn)行了分析,其實(shí)它們兩個(gè)寄存器也是中斷的控制寄存器,負(fù)責(zé)對(duì)中斷的部分功能進(jìn)行控制。我們這里談?wù)摰氖橇硗鈨蓚€(gè)控制寄存器IE和IP。

  MCS-51的對(duì)中斷的開(kāi)放和屏蔽是由中斷允許寄存器IE控制來(lái)實(shí)現(xiàn)的,IE的結(jié)構(gòu)格式如下。

  

  表5.3 IE寄存器結(jié)構(gòu)

  下面我們對(duì)IE寄存器的各控制位進(jìn)行介紹:

  EA: 中斷總控制位,EA=1,CPU開(kāi)放中斷。EA=0,CPU禁止所有中斷。

  ES: 串行口中斷控制位,ES=1允許串行口中斷,ES=0,屏蔽串行口中斷。

  ET1: 定時(shí)/計(jì)數(shù)器T1中斷控制位。ET1=1,允許T1中斷,ET1=0,禁止T1中斷。

  EX1: 外中斷1中斷控制位,EX1=1,允許外中斷1中斷,EX1=0,禁止外中斷1中斷。

  ET0: 定時(shí)/計(jì)數(shù)器T0中斷控制位。ET1=1,允許T0中斷,ET1=0,禁止T0中斷。

  EX0: 外中斷0中斷控制位,EX1=1,允許外中斷0中斷,EX1=0,禁止外中斷0中斷。

  MCS-51有兩個(gè)中斷優(yōu)先級(jí),即高優(yōu)先級(jí)和低優(yōu)先級(jí),每個(gè)中斷源都可設(shè)置為高或低中斷優(yōu)先級(jí)。如果有一低優(yōu)先級(jí)的中斷正在執(zhí)行,那么高優(yōu)先級(jí)的中斷出現(xiàn)中斷請(qǐng)求時(shí),CPU則會(huì)響應(yīng)這個(gè)高有限級(jí)的中斷,也即高優(yōu)先級(jí)的中斷可以打斷低優(yōu)先級(jí)的中斷。而若CPU正在處理一個(gè)高優(yōu)先級(jí)的中斷,此時(shí),就算是有低優(yōu)先級(jí)的中斷發(fā)出中斷請(qǐng)求,CPU也不會(huì)理會(huì)這個(gè)中斷,而是繼續(xù)執(zhí)行正在執(zhí)行的中斷服務(wù)程序,一直到程序結(jié)束,執(zhí)行最后一條返回指令,返回主程序然后再執(zhí)行一條指令后才會(huì)響應(yīng)新的中斷請(qǐng)求。

  為了實(shí)現(xiàn)上述功能,MCS-51的中斷系統(tǒng)有兩個(gè)不可尋址的優(yōu)先級(jí)狀態(tài)觸發(fā)器,一個(gè)指出CPU是否在執(zhí)行高優(yōu)先級(jí)中斷服務(wù)程序,另一個(gè)指出CPU是否正在執(zhí)行低優(yōu)先級(jí)的中斷服務(wù)程序,這兩個(gè)中斷觸發(fā)器的1狀態(tài)分別屏蔽所有中斷申請(qǐng)和同一級(jí)別的其他中斷申請(qǐng),此外,MCS-51還有一個(gè)申請(qǐng)優(yōu)先級(jí)寄存IP,IP的格式如下,字節(jié)地址是B8H。

  

  表5.4 IP中斷控制寄存器結(jié)構(gòu)

  PS: 串行口中斷口優(yōu)先級(jí)控制位,PS=1,串行口中斷聲明為高優(yōu)先級(jí)中斷,PS=0,串行口定義為低優(yōu)先級(jí)中斷。

  PT1: 定時(shí)器1優(yōu)先級(jí)控制位。PT1=1,聲明定時(shí)器1為高優(yōu)先級(jí)中斷,PT1=0定義定時(shí)器1為低優(yōu)先級(jí)中斷。

  PX1: 外中斷1優(yōu)先級(jí)控制位。PT1=1,聲明外中斷1為高優(yōu)先級(jí)中斷,PX1=0定義外中斷1為低優(yōu)先級(jí)中斷。

  PT0: 定時(shí)器0優(yōu)先級(jí)控制位。PT1=1,聲明定時(shí)器0為高優(yōu)先級(jí)中斷,PT1=0定義定時(shí)器0為低優(yōu)先級(jí)中斷。

  PX0: 外中斷0優(yōu)先級(jí)控制位。PT1=1,聲明外中斷0為高優(yōu)先級(jí)中斷,PX1=0定義外中斷0為低優(yōu)先級(jí)中斷。

  (5) 中斷的響應(yīng)

  MCS-51CPU在每一個(gè)機(jī)器周期順序檢查每一個(gè)中斷源,在機(jī)器周期的S6按優(yōu)先級(jí)處理所有被激活的中斷請(qǐng)求,此時(shí),如果CPU沒(méi)有正在處理更高或相同優(yōu)先級(jí)的中斷,或者現(xiàn)在的機(jī)器周期不是所執(zhí)行指令的最后一個(gè)機(jī)器周期,或者CPU不是正在執(zhí)行RETI指令或訪問(wèn)IE和IP的指令(因?yàn)榘碝CS-51中斷系統(tǒng)的特性規(guī)定,在執(zhí)行完這些指令之后,還要在繼續(xù)執(zhí)行一條指令,才會(huì)響應(yīng)中斷),CPU在下一個(gè)機(jī)器周期響應(yīng)激活了的最高級(jí)中斷請(qǐng)求。

  中斷響應(yīng)的主要內(nèi)容就是由硬件自動(dòng)生成一條長(zhǎng)調(diào)用LCALL addr16指令,這里的addr16就是程序存儲(chǔ)器中相應(yīng)的中斷區(qū)入口地址,這些中斷源的服務(wù)程序入口地址如下:

  表 5.5

  生成LCALL指令后,CPU緊跟著便執(zhí)行之.首先將PC(程序計(jì)數(shù)器)的內(nèi)容壓入堆棧保護(hù)斷點(diǎn),然后把中斷入口地址賦予PC,CPU便按新的PC地址(即中斷服務(wù)程序入口地址)執(zhí)行程序。

  值得一提的是,各中斷區(qū)只有8個(gè)單元,一般情況下(除非中斷程序非常簡(jiǎn)單),都不可能安裝下一個(gè)完整的中斷服務(wù)程序。因此,通常是在這些入口地址區(qū)放置一條無(wú)條件轉(zhuǎn)移指令,使程序按轉(zhuǎn)移的實(shí)際地址去執(zhí)行真正的中斷服務(wù)程序。

  2. 單片機(jī)中斷程序怎樣編制?

  從上面的任務(wù)程序中,我們來(lái)體會(huì)以下中斷服務(wù)程序的編制方法。

  (1) 首先必須對(duì)中斷系統(tǒng)進(jìn)行初始化,包括:

  1) 開(kāi)中斷,即設(shè)定IE寄存器。

  如上面程序中的 SETB EA ;開(kāi)總中斷控制位

  SETB EX0 ;開(kāi)外部中斷0

  SETB ET0 ;開(kāi)定時(shí)器中斷0

  2) 設(shè)定中斷優(yōu)先級(jí),即設(shè)置IP寄存器。

  如上面程序中的 SETB PT0 ;設(shè)定時(shí)器0中斷為高優(yōu)先級(jí)

  3) 如果是外部中斷,還必須設(shè)定中斷響應(yīng)方式,即設(shè)定IT0、IT1位。

  如上面程序中的 SETB IT0 ;設(shè)外部中斷0為邊沿觸發(fā)方式

  4) 如果是計(jì)數(shù)、定時(shí)中斷必須先設(shè)定定時(shí)、計(jì)數(shù)的初始值。

  如上面程序中的 MOV TL0,#00H

  MOV TH0,#4CH

  5) 初始化結(jié)束后,對(duì)于定時(shí)、計(jì)數(shù)器而言,還應(yīng)該記得啟動(dòng)定時(shí)或計(jì)數(shù),即設(shè)定TR0、TR1位。串口接收中斷,要記得允許接收位REN應(yīng)該設(shè)置。

  如上面程序中的 SETB TR0

  (2) 中斷初始化結(jié)束后,就可以編制中斷服務(wù)程序,編制中斷服務(wù)程序時(shí)注意:

  1) 中斷服務(wù)程序,第一條指令必須安排在相應(yīng)的中斷入口地址,并且應(yīng)該是轉(zhuǎn)移指令,由于中斷響應(yīng)時(shí),已經(jīng)由硬件執(zhí)行了LCALL指令,中斷程序斷點(diǎn)地址已經(jīng)入棧,所以不能再用子程序調(diào)用指令。

  如任務(wù)程序中的 ORG 0003H ;外部中斷0入口地址

  LJMP INT_0

  ORG 001BH ;定時(shí)器T0中斷入口地址

  LJMP DELAY

  2) 由于中斷的產(chǎn)生是隨機(jī)的,所以對(duì)程序中的公共單元(其他程序中已經(jīng)使用,中斷程序中也使用了的單元),必須在中斷服務(wù)程序開(kāi)始處,采用堆棧進(jìn)行保護(hù),即入棧。子程序返回前再出棧。

  如任務(wù)程序中的 PUSH ACC

  ……

  POP ACC

  3) 中斷服務(wù)程序必須以RETI結(jié)束,因?yàn)镽ETI指令具有兩個(gè)功能:第一,將斷點(diǎn)地址彈回PC指針,以保證能繼續(xù)原來(lái)的程序,第二,能將中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器清零,以保證新的中斷請(qǐng)求能夠被相應(yīng)。

?
通化县| 库车县| 洪泽县| 嘉祥县| 黄浦区| 自治县| 安丘市| 洮南市| 上犹县| 海伦市| 深水埗区| 沈阳市| 新余市| 乌苏市| 涿鹿县| 边坝县| 满洲里市| 桂东县| 樟树市| 隆安县| 青田县| 崇礼县| 监利县| 望城县| 马尔康县| 行唐县| 浦县| 萨嘎县| 太保市| 芮城县| 汾西县| 张家界市| 金门县| 大城县| 昌乐县| 浪卡子县| 宜宾市| 沾益县| 汝南县| 安达市| 仁布县|