中斷系統(tǒng)
中斷介紹
? 中斷是為使單片機(jī)具有對(duì)外部或內(nèi)部隨機(jī)發(fā)生的事件實(shí)時(shí)處理而設(shè)置的,中斷功能的存在,很大程度上提高了單片機(jī)處理外部或內(nèi)部事件的能力。它也是單片機(jī)最重要的功能之一,是我們學(xué)習(xí)單片機(jī)必須要掌握的。很多初學(xué)者被困在中斷中,學(xué)了很久仍然不知道中斷究竟是如何運(yùn)作的。千萬(wàn)不要認(rèn)為它有多難,其實(shí)只要掌握正確的學(xué)習(xí)方法,沒有哪個(gè)知識(shí)點(diǎn)是學(xué)不會(huì)的。
? 為了能讓大家更容易理解中斷概念, 我們先來(lái)舉一個(gè)生活事例: 你打開火,燒上一壺水。然后去洗衣服,在洗衣服的過程中,突然聽到水壺發(fā)出水開的報(bào)警聲,這時(shí),你停止洗衣服動(dòng)作,立即去關(guān)掉火,然后將開水灌入暖水瓶中,灌完開水后,你又回去繼續(xù)洗衣服。這個(gè)過程中實(shí)際上就發(fā)生了一次中斷。對(duì)于單片機(jī)來(lái)講,中斷是指 CPU 在處理某一事件 A 時(shí),發(fā)生了另一事件 B,請(qǐng)求 CPU 迅速去處理(中斷發(fā)生);CPU 暫時(shí)停止當(dāng)前的工作(中斷響應(yīng)), 轉(zhuǎn)去處理事件 B(中斷服務(wù));待 CPU 將事件 B 處理完畢后,再回到原來(lái)事件 A 被中斷的地方繼續(xù)處理事件 A(中斷返回),這一過程稱為中斷。
? 再回來(lái)看前面講的生活事例,與單片機(jī)中斷結(jié)合分析,你的主任務(wù)是洗衣服,水開報(bào)警這是一個(gè)中斷請(qǐng)求,這一時(shí)刻相當(dāng)于斷點(diǎn)處,你響應(yīng)中斷去關(guān)火,然后將開水灌入暖水瓶中,這一動(dòng)作實(shí)際上就是處理中斷程序,灌完開水后再回去繼續(xù)洗衣服,相當(dāng)于處理完中斷程序后再返回主程序繼續(xù)執(zhí)行主程序。這里需要注意的是,水開是隨時(shí)都有可能的,但是無(wú)論什么時(shí)候開,只要一開你將立即去處理它,處理完后再回來(lái)繼續(xù)接著洗剛才那件衣服。單片機(jī)在執(zhí)行程序時(shí),中斷也隨時(shí)有可能發(fā)生,但無(wú)論何時(shí)發(fā)生,只要一旦發(fā)生,單片機(jī)將立即暫停當(dāng)前程序,趕去處理中斷程序,處理完中斷程序后再返回剛才暫停處接著執(zhí)行原來(lái)的程序。
? 單片機(jī)在執(zhí)行程序時(shí)其程序流程圖如下:
? 引起 CPU 中斷的根源稱為中斷源。中斷源向 CPU 提出中斷請(qǐng)求,CPU 暫時(shí)中斷原來(lái)的事務(wù) A,轉(zhuǎn)去處理事件 B,對(duì)事件 B 處理完畢后,再回到原來(lái)被中斷的地方(即斷點(diǎn)),稱為中斷返回。實(shí)現(xiàn)上述中斷功能的部件稱為中斷系統(tǒng)(中斷機(jī)構(gòu))。
? 當(dāng)中央處理機(jī) CPU 正在處理某件事的時(shí)候外界發(fā)生了緊急事件請(qǐng)求,要求CPU 暫停當(dāng)前的工作,轉(zhuǎn)而去處理這個(gè)緊急事件,處理完以后,再回到原來(lái)被中斷的地方,繼續(xù)原來(lái)的工作,這樣的過程稱為中斷。實(shí)現(xiàn)這種功能的部件稱為中斷系統(tǒng),請(qǐng)示 CPU 中斷的請(qǐng)求源稱為中斷源。微型機(jī)的中斷系統(tǒng)一般允許多個(gè)中斷源,當(dāng)幾個(gè)中斷源同時(shí)向 CPU 請(qǐng)求中斷,要求為它服務(wù)的時(shí)候,這就存在CPU 優(yōu)先響應(yīng)哪一個(gè)中斷源請(qǐng)求的問題。通常根據(jù)中斷源的輕重緩急排隊(duì),優(yōu)先處理最緊急事件的中斷請(qǐng)求源,即規(guī)定每一個(gè)中斷源有一個(gè)優(yōu)先級(jí)別。CPU 總是先響應(yīng)優(yōu)先級(jí)別最高的中斷請(qǐng)求。
? 當(dāng) CPU 正在處理一個(gè)中斷源請(qǐng)求的時(shí)候(執(zhí)行相應(yīng)的中斷服務(wù)程序),發(fā)生了另外一個(gè)優(yōu)先級(jí)比它還高的中斷源請(qǐng)求。如果 CPU 能夠暫停對(duì)原來(lái)中斷源的服務(wù)程序,轉(zhuǎn)而去處理優(yōu)先級(jí)更高的中斷請(qǐng)求源,處理完以后,再回到原低級(jí)中斷服務(wù)程序,這樣的過程稱為中斷嵌套。這樣的中斷系統(tǒng)稱為多級(jí)中斷系統(tǒng),沒有中斷嵌套功能的中斷系統(tǒng)稱為單級(jí)中斷系統(tǒng)。
? 中斷的開啟與關(guān)閉、設(shè)置啟用哪一個(gè)中斷等都是由單片機(jī)內(nèi)部的一些特殊功能寄存器來(lái)決定的,在前面章節(jié)的學(xué)習(xí)中我們僅對(duì)單片機(jī) IO 口操作過(實(shí)際上操作 IO 口即操作 IO 口寄存器,只不過編譯器已經(jīng)幫我們把 IO 口寄存器封裝好直接操作 IO 即可,這些可在 51 單片機(jī)頭文件內(nèi)查看),從本章開始就會(huì)介紹單片機(jī)內(nèi)部更多的特殊功能寄存器以及如何配置它實(shí)現(xiàn)相應(yīng)的功能。
? 隨著計(jì)算機(jī)技術(shù)的應(yīng)用,人們發(fā)現(xiàn)中斷技術(shù)不僅解決了快速主機(jī)與慢速 I/O設(shè)備的數(shù)據(jù)傳送問題,而且還具有如下優(yōu)點(diǎn):
①分時(shí)操作。CPU 可以分時(shí)為多個(gè) I/O 設(shè)備服務(wù),提高了計(jì)算機(jī)的利用率;
②實(shí)時(shí)響應(yīng)。CPU 能夠及時(shí)處理應(yīng)用系統(tǒng)的隨機(jī)事件,系統(tǒng)的實(shí)時(shí)性大大增強(qiáng);
③可靠性高。CPU 具有處理設(shè)備故障及掉電等突發(fā)性事件能力,從而使系統(tǒng)可靠性提高。
中斷結(jié)構(gòu)及相關(guān)寄存器
中斷結(jié)構(gòu)
? STC89C5X 系列單片機(jī)提供了 8 個(gè)中斷請(qǐng)求源,它們分別是:外部中斷O(INTO)、外部中斷 1(INT1)、外部中斷 2(INT2)、外部中斷 3(INT3)、定時(shí)器 0中斷、定時(shí)器 1 中斷、定時(shí)器 2 中斷、串口(UART)中斷。(注意:51 系列單片機(jī)一定有基本的 5 個(gè)中斷,但不全有 8 個(gè)中斷,需要查看芯片手冊(cè),通常我們使用的都是基本的 5 個(gè)中斷:INT0、INT1、定時(shí)器 0/1,串口中斷)。所有的中斷都具有四個(gè)中斷優(yōu)先級(jí)(基本型只有兩個(gè))。用戶可以用關(guān)總中斷允許位(EA/IE.7)或相應(yīng)中斷的允許位來(lái)屏蔽所有的中斷請(qǐng)求,也可以用打開相應(yīng)的中斷允許位來(lái)使 CPU 響應(yīng)相應(yīng)的中斷申請(qǐng)。其中有些中斷源可以用軟件獨(dú)立地控制為開中斷或關(guān)中斷狀態(tài)。每一個(gè)中斷的優(yōu)先級(jí)別均可用軟件設(shè)置。高優(yōu)先級(jí)的中斷請(qǐng)求可以打斷低優(yōu)先級(jí)的中斷,反之,低優(yōu)先級(jí)的中斷請(qǐng)求不可以打斷高優(yōu)先級(jí)及同優(yōu)先級(jí)的中斷。當(dāng)兩個(gè)相同優(yōu)先級(jí)的中斷同時(shí)產(chǎn)生時(shí),將由查詢次序來(lái)決定系統(tǒng)先響應(yīng)哪個(gè)中斷。 STC89C5X 系列單片機(jī)的各個(gè)中斷查詢次序表如下圖所示:
? 通過設(shè)置新增加的特殊功能寄存器 IPH 中的相應(yīng)位,可將中斷優(yōu)先級(jí)設(shè)為四級(jí),如果只設(shè)置 IP 或 XICON,那么中斷優(yōu)先級(jí)就只有兩級(jí),與傳統(tǒng) 8051 單片機(jī)兩級(jí)中斷優(yōu)先級(jí)完全兼容。上圖中的中斷查詢次序即為中斷號(hào),這個(gè)中斷號(hào)在編程時(shí)非常重要,當(dāng)中斷來(lái)臨時(shí),只有中斷號(hào)正確才能進(jìn)入中斷。
? 下面我們以 51 單片機(jī)均有的 5 個(gè)中斷來(lái)介紹,其內(nèi)部結(jié)構(gòu)框圖如下所示:
? ①INT0 對(duì)應(yīng)的是 P3.2 口的附加功能,可由 IT0(TCON.0)選擇其為低電平有效還是下降沿有效。當(dāng) CPU 檢測(cè)到 P3.2 引腳上出現(xiàn)有效的中斷信號(hào)時(shí),中斷標(biāo)志 IE0(TCON.1)置 1,向 CPU 申請(qǐng)中斷。
? ②INT1 對(duì)應(yīng)的是 P3.3 口的附加功能,可由 IT1(TCON.2)選擇其為低電平有效還是下降沿有效。當(dāng) CPU 檢測(cè)到 P3.3 引腳上出現(xiàn)有效的中斷信號(hào)時(shí),中斷標(biāo)志 IE1(TCON.3)置 1,向 CPU 申請(qǐng)中斷。
? ③T0 對(duì)應(yīng)的是 P3.4 口的附加功能,TF0(TCON.5),片內(nèi)定時(shí)/計(jì)數(shù)器 T0 溢出中斷請(qǐng)求標(biāo)志。當(dāng)定時(shí)/計(jì)數(shù)器 T0 發(fā)生溢出時(shí),置位 TF0,并向 CPU 申請(qǐng)中斷。
? ④T1 對(duì)應(yīng)的是 P3.5 口的附加功能,TF1(TCON.7),片內(nèi)定時(shí)/計(jì)數(shù)器 T1溢出中斷請(qǐng)求標(biāo)志。當(dāng)定時(shí)/計(jì)數(shù)器 T1 發(fā)生溢出時(shí),置位 TF1,并向 CPU 申請(qǐng)中斷。
? ⑤RXD 和 TXD 對(duì)應(yīng)的是 P3.0 和 P3.1 口的附加功能,RI(SCON.0)或 TI(SCON.1),串行口中斷請(qǐng)求標(biāo)志。當(dāng)串行口接收完一幀串行數(shù)據(jù)時(shí)置位 RI 或當(dāng)串行口發(fā)送完一幀串行數(shù)據(jù)時(shí)置位 TI,向 CPU 申請(qǐng)中斷。
中斷相關(guān)寄存器
(1)中斷允許控制
CPU 對(duì)中斷系統(tǒng)所有中斷以及某個(gè)中斷源的開放和屏蔽是由中斷允許寄存器IE 控制的。
EX0(IE.0),外部中斷 0 允許位;
ET0(IE.1),定時(shí)/計(jì)數(shù)器 T0 中斷允許位;
EX1(IE.2),外部中斷 0 允許位;
ET1(IE.3),定時(shí)/計(jì)數(shù)器 T1 中斷允許位;
ES(IE.4),串行口中斷允許位;
EA (IE.7), CPU 中斷允許(總允許)位。
(2)中斷請(qǐng)求標(biāo)志 TCON
IT0(TCON.0),外部中斷 0 觸發(fā)方式控制位。
當(dāng) IT0=0 時(shí),為電平觸發(fā)方式。
當(dāng) IT0=1 時(shí),為邊沿觸發(fā)方式(下降沿有效)。
IE0(TCON.1),外部中斷 0 中斷請(qǐng)求標(biāo)志位。
IT1(TCON.2),外部中斷 1 觸發(fā)方式控制位。
IE1(TCON.3),外部中斷 1 中斷請(qǐng)求標(biāo)志位。
TF0(TCON.5),定時(shí)/計(jì)數(shù)器 T0 溢出中斷請(qǐng)求標(biāo)志位。
TF1(TCON.7),定時(shí)/計(jì)數(shù)器 T1 溢出中斷請(qǐng)求標(biāo)志位。
(3)中斷優(yōu)先級(jí)
同一優(yōu)先級(jí)中的中斷申請(qǐng)不止一個(gè)時(shí),則有中斷優(yōu)先權(quán)排隊(duì)問題。同一優(yōu)先級(jí)的中斷優(yōu)先權(quán)排隊(duì),由中斷系統(tǒng)硬件確定的自然優(yōu)先級(jí)形成,其排列如所示:
(4)中斷號(hào)(單片機(jī)內(nèi)部中斷優(yōu)先級(jí)由上到下,即由外部中斷0到串行口中斷,由高到低)
(5)中斷響應(yīng)條件
①中斷源有中斷請(qǐng)求;
②此中斷源的中斷允許位為 1;
③CPU 開中斷(即 EA=1)。
以上三條同時(shí)滿足時(shí),CPU 才有可能響應(yīng)中斷。在使用中斷時(shí)我們需要做什么呢?
①你想使用的中斷是哪個(gè)?選擇相應(yīng)的中斷號(hào);
②你所希望的觸發(fā)條件是什么?
③你希望在中斷之后干什么?
我們以外部中斷 0 為例,如下:
主程序中需要有以下代碼:
EA=1;//打開總中斷開關(guān)
EX0=1;//開外部中斷 0
IT0=0/1;//設(shè)置外部中斷的觸發(fā)方式
中斷服務(wù)函數(shù)
void int0() interrupt 0 using 1
{
//編寫用戶所需的功能代碼
}
? 在中斷函數(shù)中 int0 是函數(shù)名,可自定義,但必須符合 C 語(yǔ)言標(biāo)識(shí)符定義規(guī)則,interrupt 是一個(gè)關(guān)鍵字,表示 51 單片機(jī)中斷。后面的“0”是中斷號(hào),外部中斷 0 中斷號(hào)為 0,這個(gè)可參考前面的內(nèi)容。后面的 using 1 可省略不寫。
外部中斷
外部中斷介紹
? 先回顧一下 51 單片機(jī)的中斷。當(dāng)中央處理機(jī) CPU 正在處理某件事的時(shí)候外界發(fā)生了緊急事件請(qǐng)求,要求CPU 暫停當(dāng)前的工作,轉(zhuǎn)而去處理這個(gè)緊急事件,處理完以后,再回到原來(lái)被中斷的地方,繼續(xù)原來(lái)的工作,這樣的過程稱為中斷。實(shí)現(xiàn)這種功能的部件稱為中斷系統(tǒng),請(qǐng)示 CPU 中斷的請(qǐng)求源稱為中斷源。微型機(jī)的中斷系統(tǒng)一般允許多個(gè)中斷源,當(dāng)幾個(gè)中斷源同時(shí)向 CPU 請(qǐng)求中斷,要求為它服務(wù)的時(shí)候,這就存在CPU 優(yōu)先響應(yīng)哪一個(gè)中斷源請(qǐng)求的問題。通常根據(jù)中斷源的輕重緩急排隊(duì),優(yōu)先處理最緊急事件的中斷請(qǐng)求源,即規(guī)定每一個(gè)中斷源有一個(gè)優(yōu)先級(jí)別。CPU 總是先響應(yīng)優(yōu)先級(jí)別最高的中斷請(qǐng)求。中斷示意圖如下所示:
? STC89C5X 系列單片機(jī)提供了 4 個(gè)外部中斷:外部中斷 O(INTO)、外部中斷1(INT1)、外部中斷 2(INT2)、外部中斷 3(INT3)。(注意:51 系列單片機(jī)一定有基本的 2 個(gè)外部中斷,但不全有 4 個(gè)中斷,需要查看芯片手冊(cè),通常我們都是使用基本的 2 個(gè)外部中斷:INT0 和 INT1)。
? 下面我們來(lái)看下外部中斷結(jié)構(gòu)圖,如下所示:
? 圖中 INT0 和 INT1 即為外部中斷 0 和外部中斷 1 輸入口。
? ①INT0 對(duì)應(yīng)的是 P3.2 口的附加功能,可由 IT0(TCON.0)選擇其為低電平有效還是下降沿有效。當(dāng) CPU 檢測(cè)到 P3.2 引腳上出現(xiàn)有效的中斷信號(hào)時(shí),中斷標(biāo)志 IE0(TCON.1)置 1,向 CPU 申請(qǐng)中斷。
? ②INT1 對(duì)應(yīng)的是 P3.3 口的附加功能,可由 IT1(TCON.2)選擇其為低電平有效還是下降沿有效。當(dāng) CPU 檢測(cè)到 P3.3 引腳上出現(xiàn)有效的中斷信號(hào)時(shí),中斷標(biāo)志 IE1(TCON.3)置 1,向 CPU 申請(qǐng)中斷。
(1)中斷允許控制
CPU 對(duì)中斷系統(tǒng)所有中斷以及某個(gè)中斷源的開放和屏蔽是由中斷允許寄存器IE 控制的。
? EX0(IE.0),外部中斷 0 允許位;
? ET0(IE.1),定時(shí)/計(jì)數(shù)器 T0 中斷允許位;
? EX1(IE.2),外部中斷 1 允許位;
? ET1(IE.3),定時(shí)/計(jì)數(shù)器 T1 中斷允許位;
? ES(IE.4),串行口中斷允許位;
? EA (IE.7), CPU 中斷允許(總允許)位。
(2)中斷請(qǐng)求標(biāo)志 TCON
? IT0(TCON.0),外部中斷 0 觸發(fā)方式控制位。
? 當(dāng) IT0=0 時(shí),為電平觸發(fā)方式。
? 當(dāng) IT0=1 時(shí),為邊沿觸發(fā)方式(下降沿有效)。
? IE0(TCON.1),外部中斷 0 中斷請(qǐng)求標(biāo)志位。
? IT1(TCON.2),外部中斷 1 觸發(fā)方式控制位。
? IE1(TCON.3),外部中斷 1 中斷請(qǐng)求標(biāo)志位。
? TF0(TCON.5),定時(shí)/計(jì)數(shù)器 T0 溢出中斷請(qǐng)求標(biāo)志位。
? TF1(TCON.7),定時(shí)/計(jì)數(shù)器 T1 溢出中斷請(qǐng)求標(biāo)志位。
外部中斷配置
? 我們知道要讓 51 單片機(jī)發(fā)生中斷必須要滿足以下 3 個(gè)條件,這 3 個(gè)條件的順序可以任意:
? ①中斷源有中斷請(qǐng)求;
? ②此中斷源的中斷允許位為 1;
? ③CPU 開中斷(即 EA=1)。
? 比如我們配置外部中斷 0,對(duì)應(yīng)的配置程序如下:
? EA=1;//打開總中斷開關(guān)
? EX0=1;//開外部中斷 0
? IT0=0/1;//設(shè)置外部中斷的觸發(fā)方式
? 如果要配置的是外部中斷 1,只需將 EX0 改為 EX1,IT0 改為 IT1。
? 因?yàn)楠?dú)立按鍵一端是共地的,當(dāng)按下后對(duì)應(yīng)單片機(jī) IO 口被拉低,而默認(rèn)單片機(jī) IO 口是高電平,這樣就有一個(gè)下降沿過程,所以通常使用外部中斷都是配置為下降沿觸發(fā),即 IT0=1;
? 在編寫程序時(shí)通常我們會(huì)將外部中斷的配置放到一個(gè)自定義函數(shù)內(nèi)便于管理維護(hù)。如下所示:
void exti0_init(void)
{
IT0=1;//跳變沿觸發(fā)方式(下降沿)
EX0=1;//打開 INT0 的中斷允許
EA=1;//打開總中斷
}
當(dāng)觸發(fā)中斷后即會(huì)進(jìn)入中斷服務(wù)函數(shù),外部中斷 0 中斷服務(wù)函數(shù)如下:
void exti0() interrupt 0 //外部中斷 0 中斷函數(shù)
{
//執(zhí)行所需的功能
}
? 在中斷函數(shù)中 exti0 是函數(shù)名,可自定義,但必須符合 C 語(yǔ)言標(biāo)識(shí)符定義規(guī)則,interrupt 是一個(gè)關(guān)鍵字,表示 51 單片機(jī)中斷。后面的“0”是中斷號(hào),外部中斷 0 中斷號(hào)為 0,如果是外部中斷 1,則中斷號(hào)為 2,這個(gè)可參考中斷章節(jié)的內(nèi)容。
硬件設(shè)計(jì)
? 本實(shí)驗(yàn)使用到硬件資源如下:
? (1)獨(dú)立按鍵模塊(K3)
? (2)LED 模塊(D1)
? A5-A7可按照A2-A4開發(fā)板的電路將 K3鍵連接在單片機(jī) P3.2 口(外部中斷 0),K4 按鍵連接在 P3.3 口(外部中斷 1)。D1 指示燈連接在單片機(jī) P2.0 口。D2 指示燈連接在單片機(jī) P2.1口。通過按鍵按下,LED燈的點(diǎn)亮來(lái)實(shí)現(xiàn)外部中斷。
軟件編程
以外部中斷0和1為例介紹外部中斷的使用。使用獨(dú)立按鍵 K3 控制 LED 1亮滅;使用獨(dú)立按鍵K4控制LED2亮滅。
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit LED1=P2^0;
sbit LED2=P2^1;
void delay_1ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);//注意分號(hào)
}
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void exti0_init(void)
{
IT0=1;//跳變沿觸發(fā)方式(下降沿)
EX0=1;//打開 INT0 的中斷允許
EA=1;//打開總中斷
}
void exti2_init(void)
{
IT1=1;
EX1=1;
EA=1;
}
void main()
{
exti0_init();//外部中斷 0 配置
exti2_init();//外部中斷 1 配置
while(1)
{
}
}
void exti0() interrupt 0 //外部中斷 0 中斷函數(shù)
{
delay_10us(1000);//消抖
if(KEY3==0)//再次判斷 K3 鍵是否按下
LED1=!LED1;//LED1 狀態(tài)翻轉(zhuǎn)
}
void exti2() interrupt 2 //外部中斷 1 中斷函數(shù)
{
delay_1ms(10);//消抖
if(KEY4==0)//再次判斷 K4 鍵是否按下
LED2=!LED2;//LED2 狀態(tài)翻轉(zhuǎn)
}
? 首先定義 K3 鍵與 LED1 的控制管腳,然后定義了外部中斷 0 配置函數(shù) exti0_init,該函數(shù)內(nèi)容是按照前面介紹的配置方法實(shí)現(xiàn),即開啟總中斷、外部中斷 0 功能,設(shè)置外部中斷 0 為下降沿觸發(fā)。然后進(jìn)入 while循環(huán),在循環(huán)體內(nèi)沒有執(zhí)行任何功能程序。
? 而為什么在主函數(shù)中怎么沒有看到按鍵對(duì) LED 的控制呢?因?yàn)槲覀冊(cè)趀xti0_init()函數(shù)內(nèi)就已經(jīng)把按鍵管腳配置為外部中斷 0 下降沿觸發(fā),當(dāng)有按鍵按下(因?yàn)楣苣_默認(rèn)為高電平,而按鍵按下為低電平 GND),即會(huì)進(jìn)入對(duì)應(yīng)中斷服務(wù)函數(shù)執(zhí)行相應(yīng)的功能程序,LED 的控制就在中斷函數(shù)內(nèi)完成的。外部中斷 1 的使用與外部中斷 0 是一樣的。
實(shí)驗(yàn)現(xiàn)象
定時(shí)器中斷
定時(shí)器介紹
-
CPU 時(shí)序的有關(guān)知識(shí)
①振蕩周期:為單片機(jī)提供定時(shí)信號(hào)的振蕩源的周期(晶振周期或外加振蕩
周期)。
②狀態(tài)周期:2 個(gè)振蕩周期為 1 個(gè)狀態(tài)周期,用 S 表示。振蕩周期又稱 S 周
期或時(shí)鐘周期。
③機(jī)器周期:1 個(gè)機(jī)器周期含 6 個(gè)狀態(tài)周期,12 個(gè)振蕩周期。
④指令周期:完成 1 條指令所占用的全部時(shí)間,它以機(jī)器周期為單位。
例如:外接晶振為 12MHz 時(shí),51 單片機(jī)相關(guān)周期的具體值為:
振蕩周期=1/12us;
狀態(tài)周期=1/6us;
機(jī)器周期=1us;
指令周期=1~4us; -
學(xué)習(xí)定時(shí)器前需要明白的幾點(diǎn)
①51 單片機(jī)有兩組定時(shí)器/計(jì)數(shù)器,因?yàn)榧瓤梢远〞r(shí),又可以計(jì)數(shù),故稱之為定時(shí)器/計(jì)數(shù)器。
②定時(shí)器/計(jì)數(shù)器和單片機(jī)的 CPU 是相互獨(dú)立的。定時(shí)器/計(jì)數(shù)器工作的過程是自動(dòng)完成的,不需要 CPU 的參與。
③51 單片機(jī)中的定時(shí)器/計(jì)數(shù)器是根據(jù)機(jī)器內(nèi)部的時(shí)鐘或者是外部的脈沖信號(hào)對(duì)寄存器中的數(shù)據(jù)加 1。
? 有了定時(shí)器/計(jì)數(shù)器之后,可以增加單片機(jī)的效率,一些簡(jiǎn)單的重復(fù)加 1 的工作可以交給定時(shí)器/計(jì)數(shù)器處理。CPU 轉(zhuǎn)而處理一些復(fù)雜的事情。同時(shí)可以實(shí)現(xiàn)精確定時(shí)作用。
51 單片機(jī)定時(shí)器原理
? STC89C5X 單片機(jī)內(nèi)有兩個(gè)可編程的定時(shí)/計(jì)數(shù)器 T0、T1 和一個(gè)特殊功能定時(shí)器 T2。定時(shí)/計(jì)數(shù)器的實(shí)質(zhì)是加 1 計(jì)數(shù)器(16 位),由高 8 位和低 8 位兩個(gè)寄存器 THx 和 TLx 組成。它隨著計(jì)數(shù)器的輸入脈沖進(jìn)行自加 1,也就是每來(lái)一個(gè)脈沖,計(jì)數(shù)器就自動(dòng)加 1,當(dāng)加到計(jì)數(shù)器為全 1 時(shí),再輸入一個(gè)脈沖就使計(jì)數(shù)器回零,且計(jì)數(shù)器的溢出使相應(yīng)的中斷標(biāo)志位置 1,向 CPU 發(fā)出中斷請(qǐng)求(定時(shí)/計(jì)數(shù)器中斷允許時(shí))。如果定時(shí)/計(jì)數(shù)器工作于定時(shí)模式,則表示定時(shí)時(shí)間已到;如果工作于計(jì)數(shù)模式,則表示計(jì)數(shù)值已滿??梢?,由溢出時(shí)計(jì)數(shù)器的值減去計(jì)數(shù)初值才是加 1 計(jì)數(shù)器的計(jì)數(shù)值。
51 單片機(jī)定時(shí)/計(jì)數(shù)器結(jié)構(gòu)
51 單片機(jī)定時(shí)器/計(jì)數(shù)器內(nèi)部結(jié)構(gòu)如下所示:
? 上圖中的 T0 和 T1 引腳對(duì)應(yīng)的是單片機(jī) P3.4 和 P3.5 管腳。51 單片機(jī)定時(shí)/計(jì)數(shù)器的工作由兩個(gè)特殊功能寄存器控制。TMOD 是定時(shí)/計(jì)數(shù)器的工作方式寄存器,確定工作方式和功能;TCON 是控制寄存器,控制 T0、T1 的啟動(dòng)和停止及設(shè)置溢出標(biāo)志。
- 工作方式寄存器 TMOD
? 工作方式寄存器 TMOD 用于設(shè)置定時(shí)/計(jì)數(shù)器的工作方式,低四位用于 T0,高四位用于 T1。其格式如下:
? GATE 是門控位, GATE=0 時(shí),用于控制定時(shí)器的啟動(dòng)是否受外部中斷源信號(hào)的影響。只要用軟件使 TCON 中的 TR0 或 TR1 為 1,就可以啟動(dòng)定時(shí)/計(jì)數(shù)器工作;GATA=1 時(shí),要用軟件使 TR0 或 TR1 為 1,同時(shí)外部中斷引腳 INT0/1 也為高電平時(shí),才能啟動(dòng)定時(shí)/計(jì)數(shù)器工作。即此時(shí)定時(shí)器的啟動(dòng)條件,加上了 INT0/1 引腳為高電平這一條件。
? C/T :定時(shí)/計(jì)數(shù)模式選擇位。C/T =0 為定時(shí)模式;C/T =1 為計(jì)數(shù)模式。
? M1M0:工作方式設(shè)置位。定時(shí)/計(jì)數(shù)器有四種工作方式。
- 控制寄存器 TCON
TCON 的低 4 位用于控制外部中斷,已在前面介紹。TCON 的高 4 位用于控制定時(shí)/計(jì)數(shù)器的啟動(dòng)和中斷申請(qǐng)。其格式如下:
? TF1(TCON.7):T1 溢出中斷請(qǐng)求標(biāo)志位。T1 計(jì)數(shù)溢出時(shí)由硬件自動(dòng)置 TF1為 1。CPU 響應(yīng)中斷后 TF1 由硬件自動(dòng)清 0。T1 工作時(shí),CPU 可隨時(shí)查詢 TF1 的狀態(tài)。所以,TF1 可用作查詢測(cè)試的標(biāo)志。TF1 也可以用軟件置 1 或清 0,同硬件置 1 或清 0 的效果一樣。
? TR1(TCON.6):T1 運(yùn)行控制位。TR1 置 1 時(shí),T1 開始工作;TR1 置 0 時(shí),T1 停止工作。TR1 由軟件置 1 或清 0。所以,用軟件可控制定時(shí)/計(jì)數(shù)器的啟動(dòng)與停止。
? TF0(TCON.5):T0 溢出中斷請(qǐng)求標(biāo)志位,其功能與 TF1 類同。
? TR0(TCON.4):T0 運(yùn)行控制位,其功能與 TR1 類同。
51 單片機(jī)定時(shí)/計(jì)數(shù)器的工作方式
- 方式 0
? 方式 0 為 13 位計(jì)數(shù),由 TL0 的低 5 位(高 3 位未用)和 TH0 的 8 位組成。TL0 的低 5 位溢出時(shí)向 TH0 進(jìn)位,TH0 溢出時(shí),置位 TCON 中的 TF0 標(biāo)志,向 CPU發(fā)出中斷請(qǐng)求。其結(jié)構(gòu)圖如下所示:
? 門控位 GATE 具有特殊的作用。當(dāng) GATE=0 時(shí),經(jīng)反相后使或門輸出為 1,此時(shí)僅由 TR0 控制與門的開啟,與門輸出 1 時(shí),控制開關(guān)接通,計(jì)數(shù)開始;當(dāng) GATE=1時(shí),由外中斷引腳信號(hào)控制或門的輸出,此時(shí)控制與門的開啟由外中斷引腳信號(hào)和 TR0 共同控制。當(dāng) TR0=1 時(shí),外中斷引腳信號(hào)引腳的高電平啟動(dòng)計(jì)數(shù),外中斷引腳信號(hào)引腳的低電平停止計(jì)數(shù)。這種方式常用來(lái)測(cè)量外中斷引腳上正脈沖的寬度。計(jì)數(shù)模式時(shí),計(jì)數(shù)脈沖是 T0 引腳上的外部脈沖。計(jì)數(shù)初值與計(jì)數(shù)個(gè)數(shù)的關(guān)系為:X=2^
13-N。
- 方式 1
? 方式 1 的計(jì)數(shù)位數(shù)是 16 位,由 TL0 作為低 8 位,TH0 作為高 8 位,組成了16 位加 1 計(jì)數(shù)器。其結(jié)構(gòu)圖如下所示:
計(jì)數(shù)初值與計(jì)數(shù)個(gè)數(shù)的關(guān)系為:X=2^ 16-N
3.方式 2
方式 2 為自動(dòng)重裝初值的 8 位計(jì)數(shù)方式。工作方式 2 特別適合于用作較精確的脈沖信號(hào)發(fā)生器。其結(jié)構(gòu)圖如下所示:
計(jì)數(shù)初值與計(jì)數(shù)個(gè)數(shù)的關(guān)系為:X=2^ 8-N
- 方式 3
? 方式 3 只適用于定時(shí)/計(jì)數(shù)器 T0,定時(shí)器 T1 處于方式 3 時(shí)相當(dāng)于 TR1=0,停止計(jì)數(shù)。工作方式 3 將 T0 分成為兩個(gè)獨(dú)立的 8 位計(jì)數(shù)器 TL0 和 TH0。其結(jié)構(gòu)如下所示:
? 這幾種工作方式中應(yīng)用較多的是方式 1 和方式 2。定時(shí)器中通常使用定時(shí)器方式 1,串口通信中通常使用方式 2。
定時(shí)器配置
? 在使用定時(shí)器時(shí),應(yīng)該如何配置使其工作?其步驟如下(各步驟順序可任意):
? ①對(duì) TMOD 賦值,以確定 T0 和 T1 的工作方式,如果使用定時(shí)器 0 即對(duì) T0 配置,如果使用定時(shí)器 1 即對(duì) T1 配置。
? ②根據(jù)所要定時(shí)的時(shí)間計(jì)算初值,并將其寫入 TH0、TL0 或 TH1、TL1。
? ③如果使用中斷,則對(duì) EA 賦值,開放定時(shí)器中斷。
? ④使 TR0 或 TR1 置位,啟動(dòng)定時(shí)/計(jì)數(shù)器定時(shí)或計(jì)數(shù)。
? 上述中有一個(gè)定時(shí)/計(jì)數(shù)器初值的計(jì)算,下面我們來(lái)看下如何計(jì)算定時(shí)/計(jì)數(shù)器初值。
? 前面我們介紹過機(jī)器周期的概念,它是 CPU 完成一個(gè)基本操作所需要的時(shí)間。其計(jì)算公式是:機(jī)器周期=1/單片機(jī)的時(shí)鐘頻率。51 單片機(jī)內(nèi)部時(shí)鐘頻率是外部時(shí)鐘的 12 分頻,也就是說當(dāng)外部晶振的頻率輸入到單片機(jī)里面的時(shí)候要進(jìn)行 12分頻。比如說你用的是 12MHZ 晶振,那么單片機(jī)內(nèi)部的時(shí)鐘頻率就是 12/12MHZ,當(dāng)你使用 12MHZ 的外部晶振的時(shí)候,機(jī)器周期=1/1M=1us。如果我們想定時(shí) 1ms的初值是多少呢?
1ms/1us=1000。也就是要計(jì)數(shù) 1000 個(gè),初值=65535-1000+1(因?yàn)閷?shí)際上計(jì)數(shù)器計(jì)數(shù)到 65536(2 的 16 次方)才溢出,所以后面要加 1)=64536=FC18H,所以初值即為 THx=0XFC,TLx=0X18。
? 也可以使用計(jì)時(shí)小程序算時(shí)間。
? 知道了如何計(jì)算定時(shí)/計(jì)數(shù)器初值,那么想定時(shí)多長(zhǎng)時(shí)間都可以計(jì)算出,當(dāng)然由于定時(shí)計(jì)數(shù)器位數(shù)有限,我們不可能直接通過初值定時(shí)很長(zhǎng)時(shí)間,如果要實(shí)現(xiàn)很長(zhǎng)時(shí)間的定時(shí),比如定時(shí) 1 秒鐘??梢酝ㄟ^初值設(shè)置定時(shí) 1ms,每當(dāng)定時(shí) 1ms結(jié)束后又重新賦初值,并且設(shè)定一個(gè)全局變量累計(jì)定時(shí) 1ms 的次數(shù),當(dāng)累計(jì)到1000 次,表示已經(jīng)定時(shí) 1 秒了。需要其他定時(shí)時(shí)間類似操作,這樣我們就可以使用定時(shí)器來(lái)實(shí)現(xiàn)精確延時(shí)來(lái)替代之前的 delay 函數(shù)。
? 這里以定時(shí)器 0 為例介紹配置定時(shí)器工作方式 1、設(shè)定 1ms 初值,開啟定時(shí)器計(jì)數(shù)功能以及總中斷,如下:
void time0_init(void)
{
TMOD=0X01;//選擇為定時(shí)器 0 模式,工作方式 1
TH0=0XFC;(65536-1000)/256 //給定時(shí)器賦初值,定時(shí) 1ms
TL0=0X18;(65536-1000)%256
ET0=1;//打開定時(shí)器 0 中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時(shí)器
}
? 對(duì)于定時(shí)器 1 的使用方法是一樣的,只是將上述的 0 變?yōu)?1 即可,具體可參考我們定時(shí)器 1 實(shí)驗(yàn)例程。
硬件設(shè)計(jì)
? 本實(shí)驗(yàn)使用到硬件資源如下:
? (1)LED 模塊(D1)
? (2)定時(shí)器 0
? 本章硬件電路非常簡(jiǎn)單,只使用到開發(fā)板上 LED 模塊的 D1,至于定時(shí)器 0它屬于 51 單片機(jī)內(nèi)部資源,只需通過軟件配置即可使用。
軟件設(shè)計(jì)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-754442.html
程序附加定時(shí)器0的使用文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-754442.html
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED1=P2^0;
sbit LED2=P2^1;
void delay_1ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);//注意分號(hào)
}
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void time0_init(void)
{
TMOD|=0X01;//選擇為定時(shí)器 0 模式,工作方式 1
TH0=0XFC; //給定時(shí)器賦初值,定時(shí) 1ms,12HZ晶振
TL0=0X18;
ET0=1;//打開定時(shí)器 0 中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時(shí)器
}
void time1_init(void)
{
TMOD|=0X10;//選擇為定時(shí)器 1 模式,工作方式 1
TH0=0XFC; //給定時(shí)器賦初值,定時(shí) 1ms,12HZ晶振
TL1=0X18;
ET1=1;//打開定時(shí)器 1 中斷允許
EA=1;//打開總中斷
TR1=1;//打開定時(shí)器
}
void main()
{
time1_init();
time0_init();//定時(shí)器 0 中斷配置
while(1)
{
}
}
void time1()interrupt 1 //定時(shí)器 1 中斷函數(shù)
{
static u16 i;//定義靜態(tài)變量 i
TH0=0XFC; //給定時(shí)器重新賦初值,定時(shí) 1ms
TL0=0X18;
i++;
if(i==1000)//1s
{
i=0;
LED1=!LED1;
}
}
void time0()interrupt 3 //定時(shí)器 1 中斷函數(shù)
{
static u16 i;//定義靜態(tài)變量 i
TH1=0XFC; //給定時(shí)器重新賦初值,定時(shí) 1ms
TL1=0X18;
i++;
if(i==1000)//1s
{
i=0;
LED2=!LED2;
}
}
到了這里,關(guān)于單片機(jī)學(xué)習(xí) 11-中斷系統(tǒng)(定時(shí)器中斷+外部中斷)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!