<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MCS-51定時(shí)/計(jì)數(shù)器

          MCS-51定時(shí)/計(jì)數(shù)器

          作者: 時(shí)間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
          定時(shí)/計(jì)數(shù)器的工作方式

          本文引用地址:http://www.ex-cimer.com/article/201611/316522.htm

          MCS-51單片機(jī)內(nèi)部的定時(shí)/計(jì)數(shù)器的結(jié)構(gòu)如圖1所示,定時(shí)器T0特性功能寄存器TL0(低8位)和TH0(高8位)構(gòu)成,定時(shí)器T1由特性功能寄存器TL1(低8位)和TH1(高8位)構(gòu)成。特殊功能寄存器TMOD控制定時(shí)寄存器的工作方式,TCON則用于控制定時(shí)器T0和T1的啟動(dòng)和停止計(jì)數(shù),同時(shí)管理定時(shí)器T0和T1的溢出標(biāo)志等。程序開始時(shí)需對(duì)TL0、TH0、TL1和TH1進(jìn)行初始化編程,以定義它們的工作方式和控制T0和T1的計(jì)數(shù)。

          TMOD和TCON這兩個(gè)特殊功能寄存器的格式參見下表:

          [1].定時(shí)/計(jì)數(shù)器的方式控制字TMOD,字節(jié)地址為89H,其格式如表1:

          表1TMOD寄存器結(jié)構(gòu)
          D7D6D5D4D3D2D1D0
          GATAM1M0GATAM1M0
          ←T1方式字段→←T0方式字段→

          [2].定時(shí)器控制積存器TCON,字節(jié)地址為88H,位地址為88H—8FH,其格式如表2:

          表2TCON結(jié)構(gòu)
          D7D6D5D4D3D2D1D0
          TF1TR1TF0TR0IE1IT1IE0IT0

          TMOD和TCON各位的意義和用途我們將在下面的章節(jié)中予以介紹,需要注意的是,TCON的D0—D3位與中斷有關(guān),我們會(huì)在中斷的內(nèi)容中加以說明,MCS-51的定時(shí)/計(jì)數(shù)器共有四種工作方式,我們逐個(gè)進(jìn)行討論。

          工作方式0

          定時(shí)/計(jì)數(shù)器0的工作方式0電路邏輯結(jié)構(gòu)見圖2(定時(shí)/計(jì)數(shù)器1與其完全一致),工作方式0是13位計(jì)數(shù)結(jié)構(gòu)的工作方式,其計(jì)數(shù)器由TH的全部8位和TL的低5位構(gòu)成,TL的高3位沒有使用。當(dāng)=0時(shí),多路開關(guān)接通振蕩脈沖的12分頻輸出,13位計(jì)數(shù)器以次進(jìn)行計(jì)數(shù)。這就是定時(shí)工作方式。當(dāng)=1時(shí),多路開關(guān)接通計(jì)數(shù)引腳(To),外部計(jì)數(shù)脈沖由銀南腳To輸入。當(dāng)計(jì)數(shù)脈沖發(fā)生負(fù)跳變時(shí),計(jì)數(shù)器加1,這就是我們常稱的計(jì)數(shù)工作方式。

          不管是哪種工作方式,當(dāng)TL的低5位溢出時(shí),都會(huì)向TH進(jìn)位,而全部13位計(jì)數(shù)器溢出時(shí),則會(huì)向計(jì)數(shù)器溢出標(biāo)志位TF0進(jìn)位。

          我們討論門控位GATA的功能,GATA位的狀態(tài)決定定時(shí)器運(yùn)行控制取決于TR0的一個(gè)條件還是TR0和INT0引腳這兩個(gè)條件。當(dāng)GATA=1時(shí),由于GATA信號(hào)封鎖了與門,使引腳INT0信號(hào)無效。而這時(shí)候如果TR0=1,則接通模擬開關(guān),使計(jì)數(shù)器進(jìn)行加法計(jì)數(shù),即定時(shí)/計(jì)數(shù)工作。而TR0=0,則斷開模擬開關(guān),停止計(jì)數(shù),定時(shí)/計(jì)數(shù)不能工作。

          當(dāng)GATA=0時(shí),與門的輸出端由TR0和INT0電平的狀態(tài)確定,此時(shí)如果TR0=1,INT0=1與門輸出為1,允許定時(shí)/計(jì)數(shù)器計(jì)數(shù),在這種情況下,運(yùn)行控制由TR0和INT0兩個(gè)條件共同控制,TR0是確定定時(shí)/計(jì)數(shù)器的運(yùn)行控制位,由軟件置位或清“0”。

          如上所述,TF0是定時(shí)/計(jì)數(shù)器的溢出狀態(tài)標(biāo)志,溢出時(shí)由硬件置位,TF0溢出中斷被CPU響應(yīng)時(shí),轉(zhuǎn)入中斷時(shí)硬件清“0”,TF0也可由程序查詢和清“0”。

          在工作方式下,計(jì)數(shù)器的計(jì)數(shù)值范圍是:

          1—8192(213)

          當(dāng)為定時(shí)工作方式時(shí),定時(shí)時(shí)間的計(jì)算公式為:

          (213—計(jì)數(shù)初值)╳晶振周期╳12

          或(213—計(jì)數(shù)初值)╳機(jī)器周期

          其時(shí)間單位與晶振周期或機(jī)器周期相同。

          如果單片機(jī)的晶振選為6.000MHz,則最小定時(shí)時(shí)間為:

          [213—(213—1)]╳1/6╳10-6╳12=2╳10-6(s)=2(us)

          (213—0)╳1/6╳10-6╳12=16384╳10-6(s)=16384(us)。

          工作方式1

          當(dāng)M1,M0=01時(shí),定時(shí)/計(jì)數(shù)器處于工作方式1,此時(shí),定時(shí)/及數(shù)器的等效電路如圖3所示,仍以定時(shí)器0為例,定時(shí)器1與之完全相同。

          可以看出,方式0和方式1的區(qū)別僅在于計(jì)數(shù)器的位數(shù)不同,方式0為13位,而方式1則為16位,由TH0作為高8位,TL0為低8位,有關(guān)控制狀態(tài)字(GATA、、TF0、TR0)和方式0相同。

          在工作方式1下,計(jì)數(shù)器的計(jì)數(shù)值范圍是:

          1—65536(216)

          當(dāng)為定時(shí)工作方式1時(shí),定時(shí)時(shí)間的計(jì)算公式為:

          (216—計(jì)數(shù)初值)╳晶振周期╳12

          或(216—計(jì)數(shù)初值)╳機(jī)器周期

          其時(shí)間單位與晶振周期或機(jī)器周期相同。

          如果單片機(jī)的晶振選為6.000MHz,則最小定時(shí)時(shí)間為:

          [213—(216—1)]╳1/6╳10-6╳12=2╳10-6(s)=2(us)

          (216—0)╳1/6╳10-6╳12=131072╳10-6(s)=131072(us)。

          工作方式2

          當(dāng)M1M0=10時(shí),定時(shí)/計(jì)數(shù)器處于工作方式2.此時(shí)定時(shí)器的等效電阻如圖4所示.我們還是以定時(shí)/計(jì)數(shù)器0為例,定時(shí)/計(jì)數(shù)器1與之完全一致。

          工作方式0和工作方式1的最大特點(diǎn)就是計(jì)數(shù)溢出后,計(jì)數(shù)器為全0,因而循環(huán)定時(shí)或循環(huán)計(jì)數(shù)應(yīng)用時(shí)就存在反復(fù)設(shè)置初值的問題,這給程序設(shè)計(jì)帶來許多不便,同時(shí)也會(huì)影響計(jì)時(shí)精度,工作方式2就針對(duì)這個(gè)問題而設(shè)置,它具有自動(dòng)重裝載功能,即自動(dòng)加載計(jì)數(shù)初值,所以也有的文獻(xiàn)稱之為自動(dòng)重加載工作方式。在這種工作方式中,16位計(jì)數(shù)器分為兩部分,即以TL0為計(jì)數(shù)器,以TH0作為預(yù)置寄存器,初始化時(shí)把計(jì)數(shù)初值分別加載至TL0和TH0中,當(dāng)計(jì)數(shù)溢出時(shí),不再象方式0和方式1那樣需要“人工干預(yù)”,由軟件重新賦值,而是由預(yù)置寄存器TH以硬件方法自動(dòng)給計(jì)數(shù)器TL0重新加載。

          程序初始化時(shí),給TL0和TH0同時(shí)賦以初值,當(dāng)TL0計(jì)數(shù)溢出時(shí),置位TF0的同時(shí)把預(yù)置寄存器TH0中的初值加載給TL0,TL0重新計(jì)數(shù)。如此反復(fù),這樣省去了程序不斷需給計(jì)數(shù)器賦值的麻煩,而且計(jì)數(shù)準(zhǔn)確度也提高了。但這種方式也有其不利的一面,就是這樣一來的計(jì)數(shù)結(jié)構(gòu)只有8位,計(jì)數(shù)值有限,最大只能到255。所以這種工作方式很適合于那些重復(fù)計(jì)數(shù)的應(yīng)用場(chǎng)合。例如我們可以通過這樣的計(jì)數(shù)方式產(chǎn)生中斷,從而產(chǎn)生一個(gè)固定頻率的脈沖。也可以當(dāng)作串行數(shù)據(jù)通信的波特率發(fā)送器使用。

          工作方式3

          當(dāng)M1M0=11時(shí),定時(shí)/計(jì)數(shù)器處于工作方式3,此時(shí),定時(shí)/及數(shù)器的等效電路如圖3所示,仍以定時(shí)器0為例,值得注意的是,在工作方式3模式下,定時(shí)/計(jì)數(shù)器1的工作方式與之不同,下面我們分別討論。

          在工作方式3模式下,定時(shí)/計(jì)數(shù)器0被拆成兩個(gè)獨(dú)立的8位計(jì)數(shù)器TL0和TH0。其中TL0既可以作計(jì)數(shù)器使用,也可以作為定時(shí)器使用,定時(shí)/計(jì)數(shù)器0的各控制位和引腳信號(hào)全歸它使用。其功能和操作與方式0或方式1完全相同。TH0就沒有那么多“資源”可利用了,只能作為簡(jiǎn)單的定時(shí)器使用,而且由于定時(shí)/計(jì)數(shù)器0的控制位已被TL0占用,因此只能借用定時(shí)/計(jì)數(shù)器1的控制位TR1和TF1,也就是以計(jì)數(shù)溢出去置位TF1,TR1則負(fù)責(zé)控制TH0定時(shí)的啟動(dòng)和停止。等效電路參見圖6。 由于TL0既能作定時(shí)器也能作計(jì)數(shù)器使用,而TH0只能作定時(shí)器使用而不能作計(jì)數(shù)器使用,因此在方式3模式下,定時(shí)/計(jì)數(shù)器0可以構(gòu)成二個(gè)定時(shí)器或者一個(gè)定時(shí)器和一個(gè)計(jì)數(shù)器。

          如果定時(shí)/計(jì)數(shù)器0工作于工作方式3,那么定時(shí)/計(jì)數(shù)器1的工作方式就不可避免受到一定的限制,因?yàn)樽约旱囊恍┛刂莆灰驯欢〞r(shí)/計(jì)數(shù)器借用,只能工作在方式0、方式1或方式2下,等效電路參見圖6

          在這種情況下,定時(shí)/計(jì)數(shù)器1通常作為串行口的波特率發(fā)生器使用,以確定串行通信的速率,因?yàn)橐褯]有TF1被定時(shí)/計(jì)數(shù)器0借用了,只能把計(jì)數(shù)溢出直接送給串行口。當(dāng)作波特率發(fā)生器使用時(shí),只需設(shè)置好工作方式,即可自動(dòng)運(yùn)行。如要停止它的工作,需送入一個(gè)把它設(shè)置為方式3的方式控制字即可,這是因?yàn)槎〞r(shí)/計(jì)數(shù)器本身就不能工作在方式3,如硬把它設(shè)置為方式3,自然會(huì)停止工作。

           

          MCS-51的中斷系統(tǒng)

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

          這就是日常生活和工作中的中斷現(xiàn)象,類似的情況還有很多,從編譯資料到接電話是第一次中斷,通電話的過程中引有客人到訪,這是第二次中斷,即在中斷的過程中又出現(xiàn)第二次中斷,這就是我們常說的中斷嵌套。處理完第二個(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)
          計(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)斷,只有打開相應(yīng)的中斷控制位后,方可接收相應(yīng)的中斷請(qǐng)求。程序設(shè)置中斷的允許或屏蔽,也可設(shè)置中斷的優(yōu)先級(jí)。

          [2].中斷處理流程

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

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

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

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

          在中斷處理進(jìn)行過程中,可能又有新的中斷請(qǐng)求到來,這里規(guī)定,現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)的操作是不允許打擾的,否則保護(hù)和恢復(fù)的過程就可能使數(shù)據(jù)出錯(cuò),為此在進(jìn)行現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù)的過程中,必須關(guān)閉總中斷,屏蔽其它所有的中斷,待這個(gè)操作完成后再打開總中斷,以便實(shí)現(xiàn)中斷嵌套。

          中斷服務(wù)程序

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

          中斷返回

          執(zhí)行完中斷服務(wù)程序后,必然要返回,中斷返回就是被程序運(yùn)行從中斷服務(wù)程序轉(zhuǎn)回到原工作程序上來。在MCS-51單片機(jī)中,中斷返回是通過一條專門的指令實(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)行了說明,現(xiàn)在繼續(xù)對(duì)它的中斷控制有關(guān)的位進(jìn)行談?wù)?。TCON寄存器的結(jié)構(gòu)如下:

          表1TCON寄存器結(jié)構(gòu)
          TCOND7D6D5D4D3D2D1D0
          TF1TR1TF0TR0IE1IT1IE0IT0
          位地址8FH8EH8DH8CH8BH8AH89H88H

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

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

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

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

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

          表2SCON寄存器結(jié)構(gòu)
          SCOND7D6D5D4D3D2D1D0
          ------TIRI
          位地址     99H98H

          ·TI:MCS-51串行口的發(fā)送中斷標(biāo)志,在串行口以方式0發(fā)送時(shí),每當(dāng)發(fā)送完8位數(shù)據(jù),由硬件置位。如果以方式1、方式2或方式3發(fā)送時(shí),在發(fā)送停止位的開始時(shí)TI被置1,TI=1表示串行發(fā)送器正向CPU發(fā)出中斷請(qǐng)求,向串行口的數(shù)據(jù)緩沖器SBUF寫入一個(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”等指令來清零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ì)中斷的開放和屏蔽是由中斷允許寄存器IE控制來實(shí)現(xiàn)的,IE的結(jié)構(gòu)格式如下。

          表3IE寄存器結(jié)構(gòu)
          IED7D6D5D4D3D2D1D0
          EA--ESET1EX1ET0EX0
          位地址AFH ACHABHAAHA9HA8H

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

          ·EA:中斷總控制位,EA=1,CPU開放中斷。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。

          表4IP中斷控制寄存器結(jié)構(gòu)
          IPD7D6D5D4D3D2D1D0
          ---PSPT1Px1PT0PX0
          位地址  BCHBBHBAHB9HB8H

          ·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沒有正在處理更高或相同優(yōu)先級(jí)的中斷,或者現(xiàn)在的機(jī)器周期不是所執(zhí)行指令的最后一個(gè)機(jī)器周期,或者CPU不是正在執(zhí)行RETI指令或訪問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個(gè)中斷源的服務(wù)程序入口地址
          中斷源入口地址
          外中斷00003H
          定時(shí)/計(jì)數(shù)器0000BH
          外中斷10013H
          定時(shí)/計(jì)數(shù)器0001BH
          串行口中斷0023H

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

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




          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();