《單片機原理及應用》課件-第5章_第1頁
《單片機原理及應用》課件-第5章_第2頁
《單片機原理及應用》課件-第5章_第3頁
《單片機原理及應用》課件-第5章_第4頁
《單片機原理及應用》課件-第5章_第5頁
已閱讀5頁,還剩127頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5章單片機中斷和定時器/計數(shù)器5.1單片機的中斷系統(tǒng)5.2單片機的定時器/計數(shù)器思考與練習

5.1單片機的中斷系統(tǒng)

中斷系統(tǒng)在計算機系統(tǒng)中起著十分重要的作用,一個功能很強的中斷系統(tǒng),能大大提高計算機對外部事件的處理效率,增強實時性。MCS51單片機具備一套完善的中斷系統(tǒng),包括5個中斷源、2個中斷優(yōu)先級,可以實現(xiàn)兩級中斷嵌套,開發(fā)者通過軟件可實現(xiàn)對中斷的控制。

5.1.1中斷系統(tǒng)的基本概念和基本結構

1.中斷的基本概念

在日常生活中,有很多中斷的例子。例如一個人正在家中看書,突然門鈴或電話鈴響了(必須馬上處理),他必須暫時停止看書,做好記號,去開門或者接電話,待事情處理完畢后,按照標記的記號再繼續(xù)之前的閱讀工作。這種正常的工作過程被外部事件打斷的現(xiàn)象就是中斷。

在單片機中,當CPU正在處理某件事情的時候(如正在執(zhí)行主程序時),單片機外部或內部發(fā)生的某一事件(如某個引腳上電平的變化,一個脈沖沿的發(fā)生或計數(shù)器的計數(shù)溢出等)請求CPU迅速去處理,于是CPU暫時中止當前的工作,轉去處理所發(fā)生的事件,事件處理完畢后,CPU再回到剛剛被暫停的地方繼續(xù)原來的工作,這個過程稱為中斷,如圖5-1所示。

能引起CPU產生中斷的事件,稱為中斷源。中斷源向CPU提出的處理請求,稱為中斷請求。CPU接受中斷請求,暫時中止自身的事情轉去處理事件的過程,稱為中斷響應過

程。CPU對事件的整個處理過程,稱為中斷服務。為實現(xiàn)中斷而編寫的服務程序,稱為中斷服務程序。事件處理完畢,再回到原來被中斷的地方(即斷點),稱為中斷返回。單片機是通過相應的硬件電路和軟件程序來完成中斷功能的,所以將能完成中斷功能的硬件系統(tǒng)和軟件系統(tǒng)統(tǒng)稱為中斷系統(tǒng)。圖5-1中斷過程流程圖

中斷是MCS51單片機的一個重要功能。采用中斷技術可以使單片機實現(xiàn)以下功能:

(1)分時操作。單片機的中斷系統(tǒng)可以使CPU與外設同步工作。CPU在啟動外設后,可以繼續(xù)執(zhí)行主程序。而外設把數(shù)據(jù)準備好后,發(fā)出中斷請求,CPU響應該中斷請求并為其服務。中斷處理完成后,CPU恢復執(zhí)行主程序,外設也繼續(xù)工作。因此,CPU可以指揮多個外設同時工作,從而大大提高了CPU的利用率和輸入/輸出的速度。

(2)實時處理。當單片機用于實時控制時,現(xiàn)場采集到的各種參數(shù)、信息隨時可能發(fā)出中斷請求,若中斷是開放的,CPU就可以立即響應并加以處理。

(3)故障處理。如果單片機在運行過程中出現(xiàn)了事先預料不到的情況或故障(如掉電、存儲器奇偶校驗出錯、運算溢出等),可以利用中斷系統(tǒng)自行處理而不必停機。

2.中斷系統(tǒng)的基本結構

MCS-51單片機的中斷系統(tǒng)包括5個中斷源、2個中斷優(yōu)先級(可以實現(xiàn)兩級中斷嵌套)、4個用于中斷控制的寄存器(IE、IP、TCON和SCON),其中斷系統(tǒng)結構如圖5-2所示。

MCS-51單片機的5個中斷源分別為:

(1)INT0:外部中斷0請求,可由IT0選擇其有效方式。當CPU檢測到INT0(P3.2)引腳上出現(xiàn)有效的中斷信號時,置位IE0,向CPU申請中斷。

(2)INT1:外部中斷1請求,可由IT1選擇其有效方式。當CPU檢測到INT1(P3.3)引腳上出現(xiàn)有效的中斷信號時,置位IE1,向CPU申請中斷。

(3)T0:定時器/計數(shù)器T0溢出中斷請求。當定時器/計數(shù)器T0發(fā)生溢出時,置位TF0,向CPU申請中斷。

(4)T1:定時器/計數(shù)器T1溢出中斷請求。當定時器/計數(shù)器T1發(fā)生溢出時,置位TF1,向CPU申請中斷。

(5)TxD/RxD:串行口中斷請求。當串行口接收完一幀串行數(shù)據(jù)時置位RI,或當串行口發(fā)送完一幀串行數(shù)據(jù)時置位TI,向CPU申請中斷。圖5-2MCS-51單片機的中斷系統(tǒng)結構

通常,外部中斷源有以下幾種:

(1)I/O設備中斷源。鍵盤、打印機、A/D轉換器等I/O設備在完成自身的操作后,向單片機發(fā)出中斷請求,請求單片機對其進行處理。

(2)控制對象中斷源。當單片機用作實時控制時,被控對象常常被用作中斷源,用于產生中斷請求信號,要求單片機及時采集系統(tǒng)的控制參量、越限參數(shù)以及要求發(fā)送和接收

數(shù)據(jù)等。例如,電壓、電流、溫度、壓力、流量和流速等超越上限和下限以及開關和繼電器的閉合或斷開都可以作為中斷源來產生中斷請求信號,并要求單片機通過執(zhí)行中斷服務程序來加以處理。

(3)故障中斷源。單片機外部故障源引起外部中斷,如掉電中斷等。在掉電時,掉電檢測電路檢測到它時就自動產生一個掉電中斷請求,單片機檢測到后便可以在大濾波電容維持正常供電的幾秒內通過執(zhí)行掉電中斷服務程序來保護現(xiàn)場和啟用備用電池,以便電源恢復正常后繼續(xù)執(zhí)行掉電前的用戶程序。

5.1.2中斷系統(tǒng)的控制與實現(xiàn)

MCS-51單片機對中斷的控制是通過4個特殊功能寄存器實現(xiàn)的,它們分別是中斷請求標志寄存器TCON、串行口控制寄存器SCON、中斷允許控制寄存器IE和中斷優(yōu)先級控制寄存器IP。

1.中斷請求控制

1)TCON中的中斷標志位

TCON是定時器/計數(shù)器T0和T1的控制寄存器,同時也鎖存T0和T1的溢出中斷請求標志及外部中斷0和外部中斷1的中斷請求標志等。TCON是可位尋址的特殊功能寄存器,寄存器字節(jié)地址為88H,位地址為88H~8FH。TCON的格式如下:

與中斷有關的標志位有6個,具體含義如下:

①IT0:外部中斷0觸發(fā)方式控制位。該位由軟件置1或清0。

當IT0=0時,外部中斷0為電平觸發(fā)方式。CPU在每個機器周期的S5P2時刻對INT0(P3.2)引腳的電平進行采樣,若采樣到低電平,則表示中斷信號有效。

電平觸發(fā)方式時,外部中斷源的有效低電平必須保持到請求獲得響應時為止,否則就會漏掉;在中斷服務結束之前,中斷源的有效低電平必須撤除,否則中斷返回之后將再次產生中斷。該方式適合于外部中斷輸入為低電平,且在中斷服務程序中能清除外部中斷請求源的情況。如并行接口芯片8255的中斷請求線在接受讀或寫操作后即被復位,因此以其去請求電平觸發(fā)方式的中斷比較方便。

當IT0=1時,外部中斷0為邊沿觸發(fā)方式,CPU在每個機器周期的S5P2時刻對INT0(P3.2)引腳的電平進行采樣,如果在連續(xù)的兩個機器周期檢測到INT0引腳由高電平變?yōu)榈碗娖?則表示中斷信號有效。

邊沿觸發(fā)方式時,在相繼兩次采樣中,先采樣到外部中斷輸入為高電平,下一個周期采樣到外部中斷輸入為低電平,則置位中斷申請標志IE0。若CPU暫時不能響應,中斷申請標志也不會丟失,直到CPU響應此中斷時才清0。另外,為了保證下降沿能夠被可靠地采樣到,INT0引腳上的負脈沖寬度至少要保持一個機器周期。邊沿觸發(fā)方式適合于以負脈沖形式輸入的外部中斷請求,如ADC0809的轉換結束信號EOC為正脈沖,經(jīng)反相后就可以作為MCS51的外部中斷請求信號。

②IE0:外部中斷0的中斷請求標志位。當CPU檢測到INT0引腳上出現(xiàn)有效的中斷信號時(若IT0=0,且檢測到INT0引腳為低電平時;若IT0=1,且檢測到INT0引腳出現(xiàn)

負跳變時),IE0由硬件置1,向CPU申請中斷。

③IT1:外部中斷1觸發(fā)方式控制位。其功能與IT0類似。

④IE1:外部中斷1的中斷請求標志位。其功能與IE0類似。

⑤TF0:T0溢出中斷請求標志位。當啟動定時器/計數(shù)器T0計數(shù)后,T0從初值開始加1計數(shù),當最高位產生溢出時,TF0由硬件置1,向CPU申請中斷。

CPU響應TF0中斷時,由硬件清0TF0。

⑥TF1:T1溢出中斷請求標志位。其功能與TF0類似。

2)SCON中的中斷標志位

SCON是串行口控制寄存器,也是可位尋址的特殊功能寄存器,寄存器字節(jié)地址為98H,位地址為98H~9FH。SCON的格式如下:

與中斷有關的標志位有兩個,具體含義如下:

①TI:串行口發(fā)送中斷請求標志位。每當串行口發(fā)送完一幀串行數(shù)據(jù)后,TI由硬件自動置1。CPU響應該中斷時,不能自動清除TI,必須在中斷服務程序中用軟件對TI標志位清0。

②RI:串行口接收中斷請求標志位。每當串行口接收完一幀串行數(shù)據(jù)后,RI由硬件自動置1。CPU響應該中斷時,不能自動清除RI,必須在中斷服務程序中用軟件對RI標志位清0。

2.中斷允許控制

MCS51單片機對中斷源的開放或屏蔽,是由中斷允許寄存器IE控制的。IE是可位尋址的特殊功能寄存器,寄存器字節(jié)地址為A8H,位地址為A8H~AFH。IE格式如下:

IE中各位的含義如下:

①EA:中斷允許總控制位。若EA=0,則所有中斷請求被屏蔽(CPU關中斷);若EA=1,則CPU開放所有中斷(CPU開中斷),但5個中斷源的中斷請求是否被允許,還要由IE中的低5位所對應的5個中斷請求允許控制位的狀態(tài)來決定,即IE對中斷的開放和關閉為兩級控制。

②ES:串行中斷允許位。若ES=0,則禁止串行口中斷;若ES=1,則允許串行口中斷。

③ET1:定時器/計數(shù)器T1的溢出中斷允許位。若ET1=0,則禁止T1溢出中斷;若ET1=1,則允許T1溢出中斷。

④EX1:外部中斷1中斷允許位。若EX1=0,則禁止外部中斷1中斷;若EX1=1,則允許外部中斷1中斷。

⑤ET0:定時器/計數(shù)器T0的溢出中斷允許位。若ET0=0,則禁止T0溢出中斷;若ET0=1,則允許T0溢出中斷。

⑥EX0:外部中斷0中斷允許位。若EX0=0,則禁止外部中斷0中斷;若EX0=1,則允許外部中斷0中斷。

【例5-1】假設允許外部中斷0和定時器/計數(shù)器0中斷,禁止其他中斷源的中斷請求,試根據(jù)假設設置IE的相應值。

分析:本例的功能可以分別利用位操作指令和字節(jié)操作指令來實現(xiàn)。

3.中斷優(yōu)先級控制

MCS-51單片機的中斷源有兩個中斷優(yōu)先級,每一個中斷源均可由軟件設定為高優(yōu)先級中斷或低優(yōu)先級中斷,可實現(xiàn)兩級中斷嵌套,即當CPU正在處理一個中斷請求時,又出現(xiàn)了另一個優(yōu)先級比它高的中斷請求,這時,CPU就暫時中止原中斷服務程序的執(zhí)行,保護當前斷點,轉去響應優(yōu)先級更高的中斷請求。等到處理完更高級別的中斷服務程序后,再繼續(xù)執(zhí)行原來較低級的中斷服務程序。兩級中斷嵌套的過程如圖-3所示。圖5-3兩級中斷嵌套

由圖5-3可見,一個正在執(zhí)行的低優(yōu)先級中斷程序能被高優(yōu)先級的中斷源所中斷,但不能被另一個低優(yōu)先級的中斷源所中斷。若CPU正在執(zhí)行高優(yōu)先級的中斷,則不能被任

何中斷源所中斷。

MCS-51單片機各中斷源的優(yōu)先級都是由中斷優(yōu)先級控制寄存器IP中的相應位來規(guī)定的。IP是可位尋址的特殊功能寄存器,寄存器字節(jié)地址為B8H,位地址為B8H~BFH。

IP的格式如下:

IP中各位的含義如下:

①PX0:外部中斷0中斷優(yōu)先級設定控制位。若PX0=1,則外部中斷0被設定為高優(yōu)先級中斷;若PX0=0,則外部中斷0被設定為低優(yōu)先級中斷。

②PT0:定時器/計數(shù)器0中斷優(yōu)先級設定控制位。若PT0=1,則T0被設定為高優(yōu)先級中斷;若PT0=0,則T0被設定為低優(yōu)先級中斷。

③PX1:外部中斷1中斷優(yōu)先級設定控制位。若PX1=1,則外部中斷1被設定為高優(yōu)先級中斷;若PX1=0,則外部中斷1被設定為低優(yōu)先級中斷。

④PT1:定時器/計數(shù)器1中斷優(yōu)先級設定控制位。若PT1=1,則T1被設定為高優(yōu)先級中斷;若PT1=0,則T1被設定為低優(yōu)先級中斷。

⑤PS:串行口中斷優(yōu)先級設定控制位。若PS=1,則串行口被設定為高優(yōu)先級中斷;若PS=0,則串行口被設定為低優(yōu)先級中斷。

MCS-51單片機復位后,IP被全部清0,即全部設置為低優(yōu)先級中斷。當同時接收到多個同優(yōu)先級的中斷請求時,響應哪個中斷源取決于內部硬件的查詢順序。同級中斷源的優(yōu)先級順序如表5-1所示。

由此可知,各中斷源在同一個優(yōu)先級的條件下,外部中斷0的優(yōu)先權最高,串行口的優(yōu)先權最低。

MCS-51的中斷系統(tǒng)有兩個不可尋址的“優(yōu)先級激活觸發(fā)器”:一個用來指示某高優(yōu)先級的中斷正在執(zhí)行,所有后來的中斷均被阻止;另一個用來指示某低優(yōu)先級的中斷正在

執(zhí)行,所有同級中斷都被阻止,但不阻斷高優(yōu)先級的中斷請求。

【例5-2】設MCS-51的外部中斷0和定時器/計數(shù)器0中斷為高優(yōu)先級,其他中斷請求為低優(yōu)先級,試設置IP寄存器的相應值。

5.1.3中斷系統(tǒng)的處理過程

中斷處理過程可分為三個階段,即中斷響應、中斷處理和中斷返回。

1.中斷響應

1)中斷響應條件

CPU響應中斷的條件如下:

(1)有中斷源發(fā)出中斷請求。

(2)中斷總允許位EA=1,即CPU開中斷。

(3)申請中斷的中斷源的中斷允許位為1,即該中斷沒有被屏蔽。

(4)無同級或更高級中斷正在被服務。

(5)當前指令已執(zhí)行到最后一個機器周期,即在完成正在執(zhí)行的指令前,不會響應中斷,從而保證每條指令在執(zhí)行過程中不被打斷。

(6)若當前正在執(zhí)行的指令是RETI或是訪問IE、IP的指令,則在執(zhí)行RETI或寫入IE、IP指令之后,不能馬上響應中斷請求,至少再執(zhí)行一條其他指令之后才會響應。

2)中斷響應過程

MCS-51單片機的CPU在每個機器周期的S5P2時刻順序采樣每個中斷源的中斷標志位,然后在下一個機器周期查詢該采樣。如果查詢到某個中斷標志為1,則表明該中斷源有中斷請求。如果滿足中斷響應的條件,則在下一個機器周期開始時按優(yōu)先級進行中斷處理,并響應該中斷。

MCS-51單片機一旦響應中斷,首先置位相應的中斷“優(yōu)先級激活觸發(fā)器”,以阻止同級和低級中斷,然后由硬件自動生成一條長調用指令“LCALLaddr16”,把PC(程序計數(shù)器)當前值壓入堆棧,以保護斷點,再將相應的中斷入口地址送入PC,使程序轉向該中斷入口地址單元中,以執(zhí)行中斷服務程序。各中斷源的入口地址如表5-2所示。

由表5-2可知,MCS-51單片機的兩個相鄰中斷源的入口地址只相差8個字節(jié),一般的中斷服務程序都超過8個字節(jié),所以通常是在中斷入口地址單元放一條長轉移指令LJMP,這樣可以使中斷服務程序靈活地安排在64KBROM中的任何地方,如圖5-1所示。

中斷服務程序從中斷入口地址開始執(zhí)行,一直到返回指令RETI為止,CPU執(zhí)行完這條指令后,把響應中斷時所置位的優(yōu)先級激活觸發(fā)器清0,然后從堆棧中彈出斷點地址放入PC,使CPU返回主程序。

3)中斷響應時間

從查詢中斷請求標志位到轉向中斷服務入口地址所需的機器周期數(shù)稱為中斷響應時間。

根據(jù)中斷響應條件,如果查詢到中斷請求信號的這個機器周期恰好處于正在執(zhí)行指令的最后一個機器周期,那么在這個機器周期結束后,將由CPU自動執(zhí)行一條硬件子程序

調用指令LCALL,以轉到相應的中斷入口地址單元,從而對中斷進行處理。因為查詢中斷標志需要1個機器周期,長調用指令需要2個機器周期,所以中斷響應時間最短為3個機器周期。

如果查詢到中斷請求信號時剛好是剛開始執(zhí)行RETI或是訪問IE、IP的指令,則需要把當前指令執(zhí)行完再繼續(xù)執(zhí)行一條指令后,才能響應中斷。執(zhí)行上述的RETI或是訪問

IE、IP的指令最長需要2個機器周期,而接著再執(zhí)行的一條指令,最長需要4個機器周期(乘法指令MUL或除法指令DIV),再加上硬件子程序調用指令LCALL需要2個機器周

期,所以中斷響應時間最長為8個機器周期。

對于一個單中斷系統(tǒng),中斷響應時間總是在3~8個機器周期之間。

4)中斷請求的撤銷

中斷請求被響應后,要及時撤銷中斷請求,否則會引起重復響應。

(1)定時器/計數(shù)器中斷請求的撤銷。

中斷請求被響應后,硬件自動將中斷請求標志位TF0或TF1清0,因此定時器/計數(shù)器中斷請求是自動撤銷的。

(2)外部中斷請求的撤銷。

外部中斷請求的撤銷包括中斷標志位的清0和外部中斷信號的撤銷。

邊沿觸發(fā)方式:中斷被響應后,IE0或IE1由硬件自動清0,由于負脈沖信號過后就消失了,所以外部中斷請求也是自動撤銷的。

電平觸發(fā)方式:中斷被響應后,IE0或IE1由硬件自動清0,但中斷請求信號的低電平可能繼續(xù)存在,在以后的機器采樣中,又會把已清0的IE0或IE1重新置1,造成重復中斷。為了避免這種情況出現(xiàn),應盡量采用邊沿觸發(fā)方式。

如果采用電平觸發(fā)方式,要徹底撤銷外部中斷請求,需在中斷響應后把中斷請求信號引腳從低電平強制改變?yōu)楦唠娖?。因為CPU無法直接干預外電路,所以在引腳處用硬件電路(再配合相應的軟件)來撤銷外電路過期的中斷請求。圖5-4給出了一種低電平觸發(fā)后的中斷標志位撤銷電路。

為實現(xiàn)圖5-4所示電路的撤銷中斷請求功能,需要在中斷服務程序中加如下兩條指令:圖5-4電平方式外部中斷請求的撤銷電路

(3)串行口中斷請求的撤銷。

串行口中斷被響應后,CPU無法知道是接收中斷還是發(fā)送中斷,還需測試這兩個中斷標志位的狀態(tài),以判定是接收操作還是發(fā)送操作。所以串行口中斷請求的撤銷只能使用軟件方法,即在中斷服務程序中用如下指令清除標志位:

2.中斷處理

CPU響應中斷后即轉至中斷服務程序的入口,執(zhí)行中斷服務程序。從中斷服務程序的第一條指令開始到返回指令為止,這個過程稱為中斷處理或中斷服務。不同的中斷源服務的內容及要求各不相同,其處理過程也就有所區(qū)別。一般情況下,中斷處理包括兩部分內容:一是保護現(xiàn)場,二是為中斷源服務。

所謂現(xiàn)場,是指中斷時刻單片機中某些寄存器(狀態(tài)寄存器PSW、累加器A、工作寄存器等)和存儲器單元中的數(shù)據(jù)或狀態(tài)。為了使中斷服務程序的執(zhí)行不破壞這些數(shù)據(jù)或狀

態(tài),以免在中斷返回后影響主程序的運行,要求把它們送入堆棧中保存起來,這就是現(xiàn)場保護。中斷處理結束后,在返回主程序前,需要把保存的現(xiàn)場內容從堆棧中彈出,以恢復那些寄存器和存儲器單元中的原有內容,這就是現(xiàn)場恢復?,F(xiàn)場保護一定要位于中斷處理程序的前面,而現(xiàn)場恢復一定要位于中斷處理程序的后面。至于要保護哪些內容,應該由用戶根據(jù)中斷處理程序的具體情況來決定。

所謂中斷源服務,是指根據(jù)中斷源的具體要求進行相應的處理。

編寫中斷處理程序時應注意以下幾點:

(1)如果中斷服務程序的長度超過8字節(jié)(即兩個相鄰中斷源入口地址單元之間的距離),則需在中斷入口地址單元處放一條無條件轉移指令LJMP,使中斷服務程序可靈活地安排在64KBROM中的任何空間。

(2)若在執(zhí)行當前中斷程序時禁止更高優(yōu)先級中斷,則應用軟件關閉CPU中斷或屏蔽更高級中斷源的中斷,在中斷返回前再開放中斷。

(3)在現(xiàn)場保護和現(xiàn)場恢復時,為了不使現(xiàn)場信息受到破壞或造成混亂,一般應關閉CPU中斷,使CPU暫不響應新的中斷請求。這樣,在編寫中斷服務程序時,應注意在現(xiàn)場保護之前要關閉中斷,在現(xiàn)場保護之后若允許高優(yōu)先級中斷嵌套,則應開中斷。同樣,在現(xiàn)場恢復之前應關閉中斷,在現(xiàn)場恢復之后再開中斷。在確定沒有高級中斷時,上述過程也可以簡化。

中斷處理流程圖如圖5-5所示。圖5-5中斷處理流程圖

【例5-3】假設需要將PSW、A和工作寄存器R0~R7(00H~07H)的內容進行現(xiàn)場保護,請根據(jù)中斷處理流程圖編寫中斷處理程序。

說明:

①因為Rn(n=0~7)的物理地址是由PSW中RS1和RS0的狀態(tài)決定的,所以在對PSW進行保護之后,可以通過修改RS1或RS0的值實現(xiàn)對Rn的現(xiàn)場保護。

本例中的R0~R7屬于第0組工作寄存器,對應地址為00H~07H,若要采用壓入堆棧的方式進行保護,則執(zhí)行中斷處理程序前需要執(zhí)行8條PUSH指令,執(zhí)行中斷處理程序后還需要8條POP指令與之對應,程序將會變得很繁瑣。

而本例只是執(zhí)行一條“SETBRS0”指令,便將工作寄存器組由第0組變?yōu)榈?組,R0~R7的對應地址變?yōu)?8H~0FH,原來R0~R7對應的00H~07H的內容便被保護起來。

當執(zhí)行完中斷處理程序后,在恢復PSW值的同時,工作寄存器組又恢復為第0組,R0~R7繼續(xù)對應00H~07H。

②“中斷處理程序段”應根據(jù)中斷任務的具體要求來編寫。

③如果本中斷服務程序不允許被其他的中斷所中斷,則將“中斷處理程序段”前后的“SETBEA”和“CLREA”兩條指令去掉。

④若改變Rn的物理地址(修改RS1或RS0),則必須考慮堆棧區(qū)設置的問題。因為默認堆棧區(qū)和第1組工作寄存器組的物理地址(08H~0FH)重疊。

3.中斷返回

中斷處理程序的最后一條執(zhí)行指令必須是RETI。CPU執(zhí)行完這條指令時,一方面要清除中斷響應時所置位的優(yōu)先級激活觸發(fā)器,另一方面要從堆棧中彈出斷點地址放入PC,

使程序回到原斷點處,繼續(xù)執(zhí)行原來的程序。

RET指令雖然也能控制PC返回到原來中斷的地方,但RET指令沒有清0中斷優(yōu)先級激活觸發(fā)器的功能。若采用RET指令作中斷處理程序的最后一條執(zhí)行指令,返回到主程序后中斷控制系統(tǒng)會認為中斷仍在進行,其后果是與此同級或低級的中斷請求將不被響應。所以,不能用RET指令代替RETI指令。

另外,如果用戶在中斷服務程序中進行了入棧操作,則在RETI指令執(zhí)行前應進行相應的出棧操作,即在中斷服務程序中PUSH指令與POP指令必須成對使用,否則不能正確返回斷點。

4.中斷請求的深入理解

MCS-51單片機有6個中斷請求標志位,即IE0、IE1、TF0、TF1、RI、TI,對應著5個中斷。當滿足中斷請求的條件時,由硬件置位(=1),如:外中斷引腳輸入信號產生下降

沿、計數(shù)器產生計數(shù)滿額溢出等。如果這時滿足中斷響應條件,則會產生中斷,我們可以編寫中斷服務程序完成相應的工作。

假設沒有開放中斷,在滿足條件的情況下,中斷請求標志位也會由單片機硬件置位。這樣,我們就可以通過對中斷請求標志位的查詢,完成同樣的任務,即編寫查詢程序來替

代中斷服務程序。只是在查詢時需要注意對中斷請求標志位的清0。

表5-3給出了中斷請求標志位的變化情況。

5.1.4中斷系統(tǒng)的應用

1.中斷程序的結構

MCS-51單片機復位后,(PC)=0000H,即程序要從起始地址0000H開始執(zhí)行,而0003H、000BH、0013H、001BH、0023H分別為各中斷源的入口地址。為了跳過各中斷源的入口地址,編程時應在0000H處使用一條無條件轉移指令,跳轉到主程序,主程序一般從地址0030H開始,參見圖4-1。也可以不設定主程序的開始地址,只設定標號,地址自

然順延,如下面的程序。

另外,各中斷入口地址之間只差8個字節(jié),如果中斷服務程序的指令代碼少于8個字節(jié),則可以從規(guī)定的中斷入口地址處直接編寫中斷服務程序。若中斷服務程序的指令代碼

超過8個字節(jié),則需要在中斷入口地址處放置一條無條件轉移指令,把中斷服務程序跳轉到合適的位置。

2.中斷程序的內容

中斷程序一般包含中斷初始化程序和中斷服務程序兩部分。

對中斷實現(xiàn)控制實質上就是對與中斷有關的特殊功能寄存器進行管理和控制。單片機復位后,這些寄存器的內容都被清0,所有中斷源都被屏蔽,要想開放CPU中斷,允許某些中斷源中斷,必須對相關寄存器進行狀態(tài)預置。中斷初始化程序是指用戶對相關寄存器中的各控制位進行賦值,即對如下內容進行初始化:

①設置中斷允許控制寄存器IE,允許相應中斷源中斷。

②設置中斷優(yōu)先級寄存器IP,選擇并分配所使用中斷源的優(yōu)先級。

③若是外部中斷源,還要設置中斷請求的觸發(fā)方式IT0或IT1,以決定采用電平觸發(fā)方式還是邊沿觸發(fā)方式。

中斷服務程序要根據(jù)中斷任務的具體要求進行編寫。在編寫中斷服務程序時,要根據(jù)需要對一些重要寄存器或存儲器的內容進行現(xiàn)場保護,在中斷返回前還要進行現(xiàn)場恢復,

并且中斷服務程序的最后一條指令必須是RETI。

【例5-4】試編寫設置外部中斷0為邊沿觸發(fā)的高優(yōu)先級中斷源的初始化程序。

3.外部中斷源的應用程序

【例5-5】如圖5-6所示,89C51的P1口接有8個發(fā)光二極管,在外部中斷1上接有一個按鍵,試編程實現(xiàn)如下功能:通過外部中斷1,依次點亮8個發(fā)光二極管中的一個。

分析:因為8個發(fā)光二極管采用共陽極連接,所以若想通過外部中斷1依次點亮8個發(fā)光二極管中的一個,首先要保證從P1口輸出的數(shù)據(jù)中只有1位為“0”,其余7位為“1”,然后在中斷服務程序中,將該數(shù)據(jù)循環(huán)左移或循環(huán)右移,即可實現(xiàn)依次點亮8個發(fā)光二極管中的一個。因為指令RL或RR的操作數(shù)必須是A,所以需要先將數(shù)據(jù)送給累加器A,然后通過A輸出到P1口。

假設外部中斷1采用邊沿觸發(fā),高優(yōu)先級。圖5-6例5-5電路圖

【例5-6】對于圖5-6所示的電路,試編程實現(xiàn)如下功能:當無外部中斷請求時,每隔1s,依次點亮8個發(fā)光二極管中的1個;當有外部中斷請求時,8個發(fā)光二極管的顯示

狀態(tài)改為閃爍顯示(假設二極管點亮及熄滅的時間都是1s),閃爍5次后,繼續(xù)依次點亮。假設系統(tǒng)時鐘頻率為12MHz。

分析:根據(jù)題意,在無外部中斷請求時,依次點亮8個發(fā)光二極管中的1個,所以數(shù)據(jù)循環(huán)左移或循環(huán)右移的程序段要放在主程序中。當有外部中斷請求時,再根據(jù)要求修改P1口的狀態(tài)。圖5-7例5-7電路圖

4.外部中斷源的擴展及應用

MCS-51單片機只有兩個外部中斷源的輸入端,但實際應用中可能需要兩個以上的外部中斷源,這時就要對外部中斷源的輸入端進行擴展。擴展外部中斷源的方法有定時

器/計數(shù)器擴展法、中斷和查詢相結合的擴展法、硬件電路擴展法。這里僅介紹中斷和查詢相結合的擴展法。

利用MCS-51單片機的兩個外部中斷線,每個中斷線可以通過“與”的關系連接多個外部中斷源,同時利用MCS51的I/O端口作為各中斷源的識別標志,其原理如圖5-8

所示。

圖5-8中的三個外部中斷源在沒有中斷事件時輸出高電平,通過與門輸入到INT0端的電平為高電平,表示沒有中斷事件發(fā)生。當任意一個外部中斷源有中斷請求并送出一個

低電平時,CPU能立即響應該中斷請求。在中斷服務程序中,查詢P1.0、P1.1、P1.2引腳上哪一個有低電平,判斷是哪一個外部中斷源發(fā)出的中斷請求,并執(zhí)行相應的中斷處理程

序(如查詢到P1.0引腳上有低電平,則表明是外部中斷源X1發(fā)出的中斷請求,執(zhí)行完X1的處理程序后返回主程序)。圖5-8中斷和查詢相結合的外部中斷源擴展電路

【例5-8】用單片機監(jiān)測X1、X2、X3三個外部設備在運行過程中是否有故障。無論哪個設備出現(xiàn)故障,都必須立刻處理,所以采用中斷系統(tǒng)來檢測這三個外部設備。當系統(tǒng)無故障時,3個故障源輸入端X1~X3全為低電平,對應的3個顯示燈全滅;當某個設備出現(xiàn)故障時,其對應的輸入端由低電平轉為高電平,從而引起MCS51單片機中斷,中斷服務程序的任務是判定故障,并點亮對應的發(fā)光二極管。實現(xiàn)上述功能的電路如圖5-9所示。其中,發(fā)光二極管ED1~LED3對應3個輸入端X1~X3。3個故障源通過或非門與89C51的外部中斷0的輸入端相連,同時,X1~X3與P1口的P1.0~P1.2引腳相連,3個發(fā)光二極管LED1~LED3分別與P1口的P1.3~P1.5相連。圖5-9多故障檢測電路

分析:根據(jù)題意,在進行故障檢測之前,要先對P1口進行處理,不僅要使二極管不發(fā)光,還要保證外部中斷0通道暢通,能夠隨時接收中斷,為實現(xiàn)該功能可以將P1口與11111000B相或。進入中斷后,要利用查詢方式對中斷源進行判斷,處理方法為:若P1.0為高電平,說明X1有故障,則將P1.3位清0,使二極管LED1導通發(fā)光,若P1.0為低電平,說明X1無故障(P1.0=0),繼續(xù)判斷P1.1;若X2有故障(P1.1=1),則將P1.4位清0,使二極管LED2導通發(fā)光,否則繼續(xù)判斷P1.2;若X3有故障(P1.2=1),則將P1.5位清0,使二極管LED3導通發(fā)光,否則,程序繼續(xù)返回到主程序。

5.2.1定時器/計數(shù)器的基本結構和工作原理

1.定時器/計數(shù)器的基本結構

定時器/計數(shù)器的基本結構如圖5-10所示。

由圖5-10可知,T0由2個8位特殊功能寄存器TH0和TL0組成,T1由TH1和TL1組成。T0和T1的工作方式通過特殊功能寄存器TMOD來設定,T0和T1的啟動及停止由特殊功能寄存器TCON來控制。

5.2單片機的定時器/計數(shù)器圖5-10定時器/計數(shù)器的基本結構

2.定時器/計數(shù)器的工作原理

圖5-11所示是定時器/計數(shù)器的工作原理圖。

由圖5-11可知,定時器/計數(shù)器的核心部件是加1計數(shù)器。根據(jù)輸入脈沖的來源不同,定時器/計數(shù)器分為兩種工作模式:定時模式和計數(shù)模式。

當T0或T1設置為定時模式時,定時器對單片機內部的機器周期(系統(tǒng)內部振蕩器輸出脈沖的12分頻)進行自動加1計數(shù),將計數(shù)值乘以機器周期就得到了定時時間。圖5-11定時器/計數(shù)器的工作原理圖

當T0或T1設置為計數(shù)模式時,計數(shù)器對來自輸入引腳T0(P3.4)或T1(P3.5)的負脈沖信號進行計數(shù)。為確保電平信號在變化之前至少被采樣一次,要求輸入的高電平和低電平信號至少應維持一個完整的機器周期,即它至少需要兩個機器周期來識別一個高電平到低電平的跳變,所以計數(shù)模式時的計數(shù)頻率最高為f

osc(晶振))的1/24。

定時器/計數(shù)器無論工作在定時模式還是計數(shù)模式,對輸入脈沖的計數(shù)都不占用CPU的時間,除非定時器或計數(shù)器溢出,才能中斷CPU的當前操作。定時器/計數(shù)器計滿溢出時硬件令TCON中的TF0或TF1置1,可以采用中斷方式加以響應,也可以采用查詢方式來處理。由此可見,定時器/計數(shù)器是單片機中效率高而且工作靈活的部件。

定時器本質上是一個計數(shù)器,由于初值可以根據(jù)需要設定,實際計數(shù)值就可控,則定時時間也是可控的。

5.2.2定時器/計數(shù)器的控制與狀態(tài)

MCS-51單片機中有兩個特殊功能寄存器與定時器/計數(shù)器有關,其中TMOD用于設置定時器/計數(shù)器的工作模式和工作方式,TCON用于控制定時器/計數(shù)器的啟動、停止和中斷請求。

1.工作方式寄存器TMOD

工作方式寄存器TMOD用于選擇定時器/計數(shù)器的工作模式和工作方式,是不可位尋址的特殊功能寄存器,其字節(jié)地址為89H。TMOD的格式如下:

由此格式看出,TMOD的8位分為兩組,其中高4位用于控制T1,低4位用于控制T0。TMOD中各位的含義如下:

①M1、M0:工作方式選擇位。定時器/計數(shù)器有4種工作方式,由M1、M0進行設置,如表5-4所示。

2.中斷請求標志寄存器TCON

設定好TMOD后,定時器/計數(shù)器還不能進入工作狀態(tài),還必須通過設置TCON中的某些位來啟動它。TCON的低4位與外部中斷設置有關,TCON的高4位用于控制定時

器/計數(shù)器的啟動、停止和中斷申請。TCON格式如下:

5.2.3定時器/計數(shù)器的工作方式

MCS-51單片機的定時器/計數(shù)器共有4種工作方式(方式0、1、2、3),T0和T1均可以設置在前3種工作方式(方式0、1、2),且T0和T1的工作原理相同,方式0、1、2對T0和T1均有效,只有T0才可以設置為工作方式3。下面以T0為例介紹定時器/計數(shù)器的4種工作方式。

1.方式0

當TMOD的M1M0為00時,定時器/計數(shù)器工作于方式0,如圖5-12所示。

方式0為13位計數(shù)器,由TL0的低5位和TH0的高8位組成。當TL0的低5位計滿溢出時向TH0進位,當TH0計滿溢出時,將中斷標志位TF0置位,并向CPU申請中

斷。該方式是為兼容MCS48而設的,在實際應用中幾乎不再使用。

方式0和方式1的結構與操作基本相同,其差別僅僅在于計數(shù)的位數(shù)不同。方式0為13位計數(shù)器,而方式1為16位計數(shù)器,詳細內容參考方式1。圖5-12方式0的邏輯結構框圖

2.方式1

當TMOD的M1M0為01時,定時器/計數(shù)器工作于方式1,如圖5-3所示。

方式1為16位計數(shù)器。T0工作在方式1時,由TL0的低8位和TH0的高8位組成。

當TL0的低8位計滿溢出時向TH0進位,當TH0計滿溢出時,將中斷標志位TF0置位,并向CPU申請中斷。

當C/T=0時,多路轉換開關MUX接振蕩器12分頻的輸出端,即T0工作于定時模式,對機器周期進行計數(shù)。計數(shù)值乘以機器周期等于定時時間。圖5-13方式1的邏輯結構框圖

3.方式2

當TMOD的M1M0為10時,定時器/計數(shù)器工作于方式2,如圖5-14所示。

方式2是具有自動重裝初值功能的8位計數(shù)器。

方式0和方式1計數(shù)溢出后,TH0和TL0的初值均變?yōu)?,所以在編制循環(huán)程序時需要反復設定初值,既不方便又影響定時精度。方式2將TL0作為8位計數(shù)器,TH0僅保

存計數(shù)初值而不參與計數(shù)。初始化時TL0和TH0的值均是初值,且相等。當TL0計滿溢出時,CPU在將溢出中斷請求標志位TF0置“1”的同時自動將TH0中的初值重新裝入

TL0中,使TL0從初值重新開始計數(shù)。

方式2省去了重裝初值的時間,可以實現(xiàn)精確的定時。其中T1采用方式2,常用于產生單片機串行通信中的波特率,并且只有T1才能產生波特率信號。圖5-14方式2的邏輯結構框圖

4.方式3

當TMOD的M1M0為11時,定時器/計數(shù)器工作于方式3,如圖5-15所示。圖5-15方式3的邏輯結構框圖

方式3只適用于T0,當T0工作在方式3時,TL0和TH0成為兩個獨立的8位計數(shù)器。TL0使用T0的所有控制位:C/T、GATE、TR0、TF0和INT0,它的操作與方式0和方式1類似。TH0要借用T1的運行控制位TR1和溢出標志位TF1,且只能作8位定時器,即只能對機器周期進行計數(shù),而不能對外部脈沖進行計數(shù)。

當T0工作在方式3時,T1可以工作在方式0、1、2。因為它不能置位TF1,所以只能用于不需要中斷控制的場合,或用作串行口的波特率發(fā)生器。通常,當T1用作串行口波特率發(fā)生器時,T0才定義為方式3,以增加一個8位計數(shù)器。

方式1和方式2是實際應用中最常用的兩種方式,應重點掌握。

5.2.4定時器/計數(shù)器的初值計算和初始化

1.計數(shù)初值的計算

MCS-51單片機的定時器/計數(shù)器具有4種工作方式,因為不同工作方式下計數(shù)器的位數(shù)不同,所以計數(shù)的最大值也不同。假設當前工作方式下的最大計數(shù)值用M表示,則各

種工作方式的最大計數(shù)值如下:

MCS-51單片機采用特殊功能寄存器TH0和TL0來存放定時器T0的計數(shù)初值,TH1和TL1來存放定時器T1的計數(shù)初值。T0和T1從初值開始以“加1”方式進行計數(shù),

當計數(shù)值達到最大值時會產生溢出,并產生中斷申請。由于計數(shù)初值可以由軟件設定,所以定時時間是可控的。假設用X表示計數(shù)初值,N表示能產生溢出的計數(shù)值,可得計數(shù)模

式下,計數(shù)值N與計數(shù)初值X之間的關系式:

2.定時器/計數(shù)器的初始化

由于定時器/計數(shù)器是可編程的,因此在利用定時器/計數(shù)器進行定時或計數(shù)之前,要先通過軟件對其進行初始化。初始化的步驟如下:

(1)根據(jù)要求為工作方式寄存器TMOD賦值,以設定T0和T1的工作模式和工作方式。

(2)根據(jù)需要計算計數(shù)初值,并將初值送入TH0、TL0、TH1、TL1。

(3)根據(jù)需要給IE和IP賦值,以開放相應中斷和設置中斷優(yōu)先級。

(4)設置TCON中的TR0、TR1,以啟動或禁止T0、T1的運行。

5.2.5定時器/計數(shù)器的應用

1.初值計算和初始化

【例5-9】假設定時時間為5ms,單片機的主頻(晶振頻率)為6MHz,使用T0,求方式1的計數(shù)初值。

其中低8位3CH送入TL0,高8位F6H送入TH0。

【例5-10】假設T0為定時模式,按方式2工作,TH0

、TL0的初值均為0FH,且允許T0中斷,試對該定時器進行初始化。

2.計數(shù)應用

【例5-11】在某工廠的一條自動飲料生產線上,每生產12瓶飲料,就需要發(fā)出一個包裝控制信號自動執(zhí)行裝箱操作,試編寫程序完成這一計數(shù)任務。假設用T0完成計數(shù),

用P1.0發(fā)出控制信號,包裝流水線示意圖如圖5-16所示。

分析:(1)選擇工作方式:因為計數(shù)值為12,所以選用T0的工作方式2來完成此任務。假設此時T1不工作,則方式控制字為TMOD=06H。圖5-16包裝流水線示意圖

(2)求計數(shù)初值X:

因此,TL0和TH0的初值都為F4H。

本題可以采用查詢和中斷兩種方式進行編程,如圖5-17所示。無論采用哪種方式,都要先按照定時器/計數(shù)器的初始化步驟對相關特殊功能寄存器進行設置,并且當計數(shù)值達到要求后,對P1.0進行設置。本例假設P1.0為高電平時發(fā)出控制信號,且該控制信號只要持續(xù)2個機器周期以上即可。

需要注意的是:

①若采用中斷方式進行控制,一旦計數(shù)值達到要求,計數(shù)器便產生溢出,從而進入中斷服務程序,同時硬件自動將中斷標志位TF0清0。

②若采用查詢方式進行控制,程序需要不斷對中斷標志位TF0進行查詢:若TF0為0,計數(shù)器未溢出,則程序在當前指令循環(huán);若TF0為1,計數(shù)器溢出,則執(zhí)行下面的程序,此時T0雖然發(fā)出中斷請求,但因為IE中的相應開關斷開,所以該中斷請求不會得到響應,為此需要利用軟件將TF0清0。圖5-17例5-11的流程圖

【例5-12】利用定時器T1的方式2對外部信號計數(shù),要求每計滿100個數(shù)將P1.7取反。

分析:(1)確定方式字:假設此時T0不工作,則T1工作在方式2的控制字為TMOD=60H。

(2)計算初值:

因此,TL1和TH1的初值都為9CH。

本例與例5-11類似,都是實現(xiàn)計數(shù)功能,所以實現(xiàn)方法類似,既可以采用中斷方式又可以采用查詢方式,這里只介紹中斷方式,查詢方式的編程方法可以參考例5-11。

3.定時應用

【例5-13】假設系統(tǒng)時鐘頻率為6MHz,現(xiàn)欲利用定時器T0每隔1ms產生寬度為1個機器周期的正脈沖,并由P1.0送出,如圖5-18所示,請編程實現(xiàn)該功能。圖5-18例5-12輸出波形圖

分析:(1)選擇工作方式:因為Tcy=12/fosc=2ms,由定時器各種工作方式的特性,可計算出方式0最長可定時16.

384ms,方式1最長可定時131.072ms,方式2、3最長可定

時512ms。

本例中定時時間t=1ms,故選擇T0的工作方式1來完成此任務。假設此時T1不工作,則方式控制字為TMOD=01H。

(2)計算初值X:

因此T0的初值為TH0=0FEH,TL0=0CH。

本例與例5-11類似,也可以采用查詢和中斷兩種方式進行編程,處理過程也大致相同,與例5-11最大的不同之處在于本例的定時器/計數(shù)器將工作于定時模式。

【例5-14】設時鐘頻率為12MHz,編程實現(xiàn)用定時器T0產生50Hz的方波,并由P1.0輸出此方波。

分析:(1)選擇工作方式:因為Tcy=12/fosc=1ms,由定時器各種工作方式的特性,可計算出方式0最長可定時8.912ms,方式1最長可定時65.536ms,方式2、3最長可定時256ms。

因為50Hz方波的周期為20ms,所以只要每隔10ms變化一次P1.0的電平,就可獲得50Hz的方波,即本例的定時時間為10ms,所以選擇T0的工作方式1來完成此任務。假設此時T1不工作,則方式控制字為TMOD=01H。

(2)計算初值X:

因此T0的初值為TH0=0D8H,TL0=0F0H。

【例5-15】假設系統(tǒng)時鐘頻率為fosc=3MHz,利用定時器編程實現(xiàn)如下功能:從P1.7引腳輸出一個脈沖波形,高電平持續(xù)50ms,低電平持續(xù)150ms,如圖5-19所示。圖5-19例5-15的波形圖

分析1:因為高電平和低電平持續(xù)時間不同,考慮用兩個定時器/計數(shù)器T0和T1。因為Tcy=12/fosc=4ms,考慮到定時時間較長,只能選擇方式1,最大計數(shù)值是65536,最大

定時時間是65536×4ms=262ms。兩個時間均可以用一次中斷來定時。計數(shù)初值分別是

T0定時50ms,則TH0=CFH,TL0=2CH;T1定時150ms,則TH1=6DH,TL1=84H。

①在初始化程序中,對T0賦初值,啟動T0,關閉T1,P1.7置“1”,T0開始第一個50ms定時。

②當定時50ms到時,進入中斷T0INT,對T1賦初值,啟動T1,關閉T0,P1.7置“0”,T1開始第一個150ms定時。

③當定時150ms到時,進入中斷T1INT,對T0賦初值,啟動T0,關閉T1,P1.7置“1”,T0開始第二個50ms定時。

分析2:因為150ms是50ms的3倍,可以用一個定時器/計數(shù)器T0。選擇方式1,最大計數(shù)值是65536,最大定時時間是65536×4ms=262ms。定時時間50ms。計數(shù)初值是

X=216-50ms/4ms=65536-12500=53036=CF2CH

則TH0=CFH,TL0=2CH。

設定一個程序計數(shù)器R7,每次中斷到來時+1,然后判斷是否“=1”或“=4”,分別對應50ms和150m

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論