第4章 中斷、定時(shí)計(jì)數(shù)器與串行口_第1頁
第4章 中斷、定時(shí)計(jì)數(shù)器與串行口_第2頁
第4章 中斷、定時(shí)計(jì)數(shù)器與串行口_第3頁
第4章 中斷、定時(shí)計(jì)數(shù)器與串行口_第4頁
第4章 中斷、定時(shí)計(jì)數(shù)器與串行口_第5頁
已閱讀5頁,還剩141頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第4章中斷、定時(shí)/計(jì)數(shù)器與串行口教學(xué)提示:51子系列單片機(jī)應(yīng)用廣泛的一個(gè)重要原因是它在一個(gè)芯片里集成了應(yīng)用系統(tǒng)所需的大部分(或所有)硬件功能,本章敘述的是完成這些硬件功能的內(nèi)部標(biāo)準(zhǔn)功能單元,構(gòu)成了51子系列單片機(jī)的核心體系結(jié)構(gòu)。教學(xué)要求:本章讓學(xué)生掌握內(nèi)部標(biāo)準(zhǔn)功能單元中斷系統(tǒng)、定時(shí)/計(jì)數(shù)器和串行通信接口的邏輯結(jié)構(gòu)、功能和應(yīng)用設(shè)計(jì)方法。4.1MCS-51的中斷系統(tǒng)

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

4.3MCS-51的串行接口

4.5

本章小結(jié)內(nèi)容提要4.1.1中斷系統(tǒng)的概念中斷系統(tǒng)的概念和基本結(jié)構(gòu)

中斷發(fā)生:CPU正在處理某一程序時(shí),發(fā)生了另一突發(fā)事件請(qǐng)求CPU迅速去處理;

中斷響應(yīng):

CPU暫時(shí)停止當(dāng)前的工作,轉(zhuǎn)到需要處理的中斷源的服務(wù)程序的入口,一般在入口處執(zhí)行一跳轉(zhuǎn)指令轉(zhuǎn)去處理中斷事件(中斷服務(wù));

中斷返回:待CPU將中斷事件處理完畢后,再回到原來程序被中斷的地方繼續(xù)處理執(zhí)行程序,這一處理過程稱為中斷返回。

4.1中斷中斷系統(tǒng)的概念和基本結(jié)構(gòu)

中斷過程示意圖為什么要用中斷?

當(dāng)CPU與外設(shè)交換信息時(shí),由于外設(shè)的速度比較慢,若用查詢的方式,則CPU就要浪費(fèi)很多時(shí)間去等待外設(shè)。這樣就存在一個(gè)快速的CPU與慢速的外設(shè)之間的矛盾。為了解決這個(gè)問題,就發(fā)展了中斷的概念。

中斷的優(yōu)點(diǎn)

分時(shí)操作

有了中斷功能,就可以使CPU和外設(shè)同時(shí)工作。提高了CPU的利用率。

實(shí)時(shí)處理

實(shí)時(shí)控制時(shí),需要現(xiàn)場(chǎng)的各種參數(shù)、信息,可在任何時(shí)間發(fā)出中斷申請(qǐng),CPU就可以馬上響應(yīng)加以處理。

故障處理

計(jì)算機(jī)在運(yùn)行過程中,往往會(huì)出現(xiàn)事先預(yù)料不到的情況,或出現(xiàn)一些故障。中斷源

引起中斷的原因,或能發(fā)出中斷申請(qǐng)的來源,稱為中斷源。通常中斷源有以下幾種:

外部輸入、輸出設(shè)備

故障源

控制對(duì)象定時(shí)/計(jì)數(shù)脈沖,當(dāng)定時(shí)/計(jì)數(shù)器溢出時(shí)產(chǎn)生中斷請(qǐng)求。

對(duì)于每種中斷事件,要求其能夠發(fā)出中斷請(qǐng)求信號(hào),而且要符合CPU響應(yīng)中斷的條件,即要明確屬于哪種中斷源。中斷源是系統(tǒng)規(guī)定的可引起中斷的部件或來源。中斷系統(tǒng)的功能實(shí)現(xiàn)中斷及返回能實(shí)現(xiàn)優(yōu)先權(quán)排隊(duì)高級(jí)中斷源能中斷低級(jí)的中斷處理

MCS-51單片機(jī)的中斷系統(tǒng)提供5個(gè)中斷申請(qǐng)?jiān)赐獠恐袛?和外部中斷1;定時(shí)/計(jì)數(shù)器(T0)和(T1)的溢出中斷;串行接口的接收和發(fā)送中斷。

這5個(gè)中斷源可分為兩個(gè)優(yōu)先級(jí),可實(shí)現(xiàn)兩級(jí)中斷服務(wù)程序嵌套。4.1.2MCS-51單片機(jī)的中斷系統(tǒng)MCS-51單片機(jī)的中斷系統(tǒng)結(jié)構(gòu)示意圖4.1.3中斷系統(tǒng)的控制與實(shí)現(xiàn)MCS-51單片機(jī)的中斷系統(tǒng)可以提供5個(gè)中斷申請(qǐng)?jiān)?,它們的控制與實(shí)現(xiàn)由片內(nèi)4個(gè)SFR來完成。定時(shí)/計(jì)數(shù)器的控制寄存器(TCON)和串行接口控制寄存器(SCON)的相應(yīng)位規(guī)定中斷類型和觸發(fā)方式;中斷允許寄存器(IE)控制CPU是否響應(yīng)中斷請(qǐng)求;中斷優(yōu)先級(jí)寄存器(IP)安排各中斷源的優(yōu)先級(jí),同一優(yōu)先級(jí)內(nèi)各中斷同時(shí)提出中斷請(qǐng)求時(shí),由內(nèi)部的查詢邏輯按規(guī)定的自然優(yōu)先級(jí)確定其響應(yīng)次序。MCS-51的中斷源外部中斷0:來自P3.2引腳上的外部中斷請(qǐng)求;外部中斷1:來自P3.3引腳上的外部中斷請(qǐng)求;T0:片內(nèi)定時(shí)/計(jì)數(shù)器0溢出(TF0)中斷請(qǐng)求;T1:片內(nèi)定時(shí)/計(jì)數(shù)器1溢出(TF1)中斷請(qǐng)求;串行接口:片內(nèi)串行接口完成一幀數(shù)據(jù)的發(fā)送或接收后,產(chǎn)生中斷請(qǐng)求TI或RI。和中斷有關(guān)的特殊功能寄存器

定時(shí)/計(jì)數(shù)器控制寄存器TCON(88H)

TCON:它鎖存2個(gè)定時(shí)/計(jì)數(shù)器的溢出中斷標(biāo)志及外部中斷(

)和(

)的中斷標(biāo)志,與中斷有關(guān)的各位定義如下:位D7D6D5D4D3D2D1D0字節(jié)地址TCONTF1TR1TF0TR0IE1IT1IE0IT088H位地址8FH8EH8DH8CH8BH8AH89H88HIT0:外部中斷0觸發(fā)方式控制位。

當(dāng)IT0=0,外部中斷0選擇為電平觸發(fā)方式(低電平有效)當(dāng)IT0=1外部中斷0選擇為邊沿觸發(fā)方式(下降沿有效)。

IE0:外部中斷0中斷請(qǐng)求標(biāo)志位。

IE0=1時(shí),表示向CPU請(qǐng)求中斷。IT1:外部中斷1觸發(fā)方式控制位。IE1:外部中斷1中斷請(qǐng)求標(biāo)志位。TF0:定時(shí)/計(jì)數(shù)器T0溢出中斷請(qǐng)求標(biāo)志位。

在T0啟動(dòng)后就開始由初值加“1”計(jì)數(shù),直至最高位產(chǎn)生溢出由硬件置位(TF0),向CPU請(qǐng)求中斷。CPU響應(yīng)中斷時(shí),TF0由硬件自動(dòng)清“0”。TF1:定時(shí)/計(jì)數(shù)器T1溢出中斷請(qǐng)求標(biāo)志位。串行接口控制寄存器(98H)

SCON是串行接口控制寄存器,與中斷有關(guān)的是它的低位TI和RI。位D7D6D5D4D3D2D1D0字節(jié)地址SCONTIRI98H位地址9FH9EH9DH9CH9BH9AH99H98HRI:串行接口接收中斷標(biāo)志位。

當(dāng)允許串行接口接收數(shù)據(jù)時(shí),每接收完一個(gè)串行幀,由硬件置位RI,向CPU請(qǐng)求中斷。CPU響應(yīng)中斷時(shí),不能自動(dòng)清除RI,RI必須由軟件清除。TI:串行接口發(fā)送中斷標(biāo)志位。

當(dāng)CPU將一個(gè)發(fā)送數(shù)據(jù)寫入串行接口發(fā)送緩沖器時(shí),就啟動(dòng)了發(fā)送過程。每發(fā)送完一個(gè)串行幀,由硬件置位(TI),向CPU請(qǐng)求中斷。同樣,TI必須由軟件清除。

中斷允許寄存器IE(A8H)CPU對(duì)中斷系統(tǒng)所有中斷以及某個(gè)中斷源的開放和屏蔽是由中斷允許寄存器(IE)控制的。IE的狀態(tài)可通過程序由軟件設(shè)定;某位設(shè)定為“1”,相應(yīng)的中斷源中斷允許;某位設(shè)定為“0”,相應(yīng)的中斷源中斷屏蔽;CPU復(fù)位時(shí),IE各位清“0”,禁止所有中斷。IE各位的定義如下:

EX0:外部中斷(0)中斷允許位;

ET0:定時(shí)/計(jì)數(shù)器T0中斷允許位;

EX1:外部中斷(1)中斷允許位;

ET1:定時(shí)/計(jì)數(shù)器(T1)中斷允許位;

ES:串行接口中斷允許位;

EA:CPU中斷總允許位。位D7D6D5D4D3D2D1D0字節(jié)地址IEEAESET1EX1ET0EX0A8H位地址AFHAEHADHACHABHAAHA9HA8H中斷優(yōu)先級(jí)寄存器IP(B8H)MCS-51單片機(jī)有兩個(gè)中斷優(yōu)先級(jí),即可實(shí)現(xiàn)二級(jí)中斷服務(wù)嵌套。每個(gè)中斷源的中斷優(yōu)先級(jí)都是由中斷優(yōu)先級(jí)寄存器(IP)中的相應(yīng)位的狀態(tài)來規(guī)定的。某位設(shè)定為“1”,則相應(yīng)的中斷源為高優(yōu)先級(jí)中斷;某位設(shè)定為“0”,則相應(yīng)的中斷源為低優(yōu)先級(jí)中斷。單片機(jī)復(fù)位時(shí),IP各位清“0”,各中斷源同為低優(yōu)先級(jí)中斷。

PX0:外部中斷0中斷優(yōu)先級(jí)設(shè)定位;

PT0:定時(shí)/計(jì)數(shù)器T0中斷優(yōu)先級(jí)設(shè)定位;

PX1:外部中斷1中斷優(yōu)先級(jí)設(shè)定位;

PT1:定時(shí)/計(jì)數(shù)器T1中斷優(yōu)先級(jí)設(shè)定位;

PS:串行接口中斷優(yōu)先級(jí)設(shè)定位。位D7D6D5D4D3D2D1D0字節(jié)地址IPPSPT1PX1PT0PX0B8H位地址BFHBEHBDHBCHBBHBAHB9HB8H

IP寄存器各位的定義如下

同一優(yōu)先級(jí)的中斷優(yōu)先權(quán)排隊(duì),由中斷系統(tǒng)硬件確定的自然優(yōu)先級(jí)形成,其排列如下表所示。中斷源中斷標(biāo)志中斷服務(wù)程序入口優(yōu)先級(jí)順序外部中斷0IE00003H高定時(shí)/計(jì)數(shù)器0(T0)TF0000BH↓外部中斷1IE10013H↓定時(shí)/計(jì)數(shù)器1(T1)TF1001BH↓串行口RI或TI0023H低MCS-51單片機(jī)的中斷優(yōu)先級(jí)控制原則不同級(jí)的中斷源同時(shí)申請(qǐng)中斷時(shí),先響應(yīng)高級(jí)后響應(yīng)低級(jí)。同級(jí)的中斷源同時(shí)申請(qǐng)中斷時(shí),按事先規(guī)定執(zhí)行。即MCS-51單片機(jī)中規(guī)定的同級(jí)中斷優(yōu)先順序。處理低級(jí)中斷又收到高級(jí)中斷請(qǐng)求時(shí),停止低級(jí)轉(zhuǎn)去先執(zhí)行高級(jí)。處理高級(jí)中斷又收到低級(jí)中斷請(qǐng)求時(shí),不響應(yīng)它,等待做完高級(jí)處理后再處理低級(jí)中斷。4.1.4中斷響應(yīng)的條件、過程和時(shí)間

中斷處理過程分為4個(gè)階段:中斷請(qǐng)求→中斷響應(yīng)→中斷服務(wù)→中斷返回。中斷響應(yīng)條件CPU在每個(gè)機(jī)器周期的S5P2時(shí)刻對(duì)各個(gè)中斷源的中斷標(biāo)志進(jìn)行采樣。這些采樣值在下一個(gè)機(jī)器周期內(nèi)按優(yōu)先級(jí)和內(nèi)部順序被依次查詢。如果某個(gè)中斷標(biāo)志在上一個(gè)機(jī)器周期的S5P2被置成了“1”,那么它將于現(xiàn)在的查詢周期中及時(shí)被發(fā)現(xiàn)。接著CPU便執(zhí)行一條由中斷系統(tǒng)提供的硬件LCALL指令,轉(zhuǎn)向被稱作中斷向量的特定入口地址,進(jìn)入相應(yīng)的中斷服務(wù)程序。中斷響應(yīng)必須滿足下列條件:無同級(jí)或高級(jí)中斷正在服務(wù);現(xiàn)行指令執(zhí)行到最后1個(gè)機(jī)器周期且已結(jié)束;若現(xiàn)行指令為RETI或需訪問特殊功能寄存器IE或IP的指令時(shí),執(zhí)行完該指令且緊隨其后的另1條指令也已執(zhí)行完。

單片機(jī)便在緊接的下一個(gè)機(jī)器周期的S1期間響應(yīng)中斷,否則,將丟棄中斷查詢的結(jié)果!中斷響應(yīng)過程將相應(yīng)的優(yōu)先級(jí)狀態(tài)觸發(fā)器置“1”(以阻斷后來的同級(jí)或低級(jí)的中斷請(qǐng)求);執(zhí)行一條硬件LCALL指令,把程序計(jì)數(shù)器(PC)的內(nèi)容壓入堆棧保存,再將相應(yīng)的中斷服務(wù)程序的入口地址送入PC;進(jìn)入中斷服務(wù)程序后,CPU自動(dòng)清除中斷請(qǐng)求標(biāo)志TF0、TF1、IE0、IE1,但不能清除TI和RI。中斷響應(yīng)過程執(zhí)行中斷服務(wù)程序在主程序中事先進(jìn)行中斷初始化;

在中斷服務(wù)程序入口地址單元放一條長(zhǎng)轉(zhuǎn)移指令LJMP,這樣中斷服務(wù)程序能靈活地安排64KB程序存儲(chǔ)器的任何地方;

在中斷服務(wù)程序中,首先用軟件保護(hù)現(xiàn)場(chǎng),在中斷服務(wù)之后、中斷返回前恢復(fù)現(xiàn)場(chǎng),以防止中斷返回后,丟失原寄存器的內(nèi)容。中斷返回

中斷服務(wù)程序的最后一條指令必須是中斷返回指令RETI。RETI指令能使CPU結(jié)束中斷服務(wù)程序的執(zhí)行,返回到曾經(jīng)被中斷過的程序處,繼續(xù)執(zhí)行主程序。RETI指令的具體功能是:將中斷響應(yīng)時(shí)壓入堆棧保存的斷點(diǎn)地址從棧頂彈出送回PC,CPU從原來中斷的地方繼續(xù)執(zhí)行程序;將相應(yīng)中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器清“0”,通知中斷系統(tǒng),中斷服務(wù)程序已執(zhí)行完畢。中斷處理過程(匯總中斷響應(yīng)→中斷服務(wù)→中斷返回)(1)CPU在每個(gè)機(jī)器周期的S5P2時(shí)刻對(duì)各個(gè)中斷源的中斷標(biāo)志進(jìn)行采樣。(2)這些采樣值在下一個(gè)機(jī)器周期內(nèi)按優(yōu)先級(jí)和內(nèi)部順序被依次查詢。如果某個(gè)中斷標(biāo)志在上一個(gè)機(jī)器周期的S5P2被置成了1,那么它將于現(xiàn)在的查詢周期中及時(shí)被發(fā)現(xiàn)。(3)將相應(yīng)的優(yōu)先級(jí)狀態(tài)觸發(fā)器置“1”(以阻斷后來的同級(jí)或低級(jí)的中斷請(qǐng)求);(4)執(zhí)行一條硬件LCALL指令,把程序計(jì)數(shù)器(PC)的內(nèi)容壓入堆棧保存,再將相應(yīng)中斷服務(wù)程序的入口地址送入PC;

(5)進(jìn)入中斷服務(wù)程序后,CPU自動(dòng)清除中斷請(qǐng)求標(biāo)志TF0、

TF1、IE0、IE1,但不能清除TI和RI。中斷響應(yīng)過程(6)在主程序中事先進(jìn)行中斷初始化,在中斷服務(wù)程序入口地址單元放一條長(zhǎng)轉(zhuǎn)移指令LJMP,這樣中斷服務(wù)程序能靈活地安排64KB程序存儲(chǔ)器的任何地方。(7)在中斷服務(wù)程序中,首先用軟件保護(hù)現(xiàn)場(chǎng),在中斷服務(wù)之后、中斷返回前恢復(fù)現(xiàn)場(chǎng),以防止中斷返回后,丟失原寄存器的內(nèi)容。(8)當(dāng)執(zhí)行到RET1時(shí),中斷服務(wù)程序結(jié)束。(9)將中斷響應(yīng)時(shí)壓入堆棧保存的斷點(diǎn)地址從棧頂彈出送回PC,CPU從原來中斷的地方繼續(xù)執(zhí)行程序;(10)將相應(yīng)中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器清“0”,通知中斷系統(tǒng),中斷服務(wù)程序已執(zhí)行完畢。中斷服務(wù)過程中斷返回中斷響應(yīng)時(shí)間

所謂中斷響應(yīng)時(shí)間,是指從查詢中斷請(qǐng)求標(biāo)志位到轉(zhuǎn)入中斷服務(wù)程序入口地址所需的機(jī)器周期數(shù)(對(duì)單一中斷源而言)。

響應(yīng)中斷最短需要3個(gè)機(jī)器周期。若CPU查詢中斷請(qǐng)求標(biāo)志的周期正好是執(zhí)行1條指令的最后1個(gè)機(jī)器周期,則不需等待就可響應(yīng)。響應(yīng)中斷執(zhí)行1條長(zhǎng)調(diào)用指令需要2個(gè)機(jī)器周期,加上查詢的1個(gè)機(jī)器周期,共需要3個(gè)機(jī)器周期才開始執(zhí)行中斷服務(wù)程序。

中斷響應(yīng)的最長(zhǎng)時(shí)間由下列情況所決定:若中斷查詢時(shí)正在執(zhí)行RETI或者訪問IE(或IP)指令的第1個(gè)機(jī)器周期,則連查詢?cè)趦?nèi)需要2個(gè)機(jī)器周期(以上3條指令均需2個(gè)機(jī)器周期);若緊接著要執(zhí)行的指令正好是MUL或DIV指令(兩者均為4周期指令),則需等該指令執(zhí)行完后才能進(jìn)入中斷響應(yīng)周期,再用2個(gè)機(jī)器周期執(zhí)行1條長(zhǎng)調(diào)用指令轉(zhuǎn)入中斷服務(wù)程序,這樣一來總共需要8個(gè)機(jī)器周期。其他情況下的中斷響應(yīng)時(shí)間一般在3~8個(gè)機(jī)器周期之間。4.1.5外部中斷的請(qǐng)求與撤除

1.外部中斷

4.1.4節(jié)已經(jīng)介紹了MCS-51單片機(jī)的中斷系統(tǒng)的2個(gè)外部中斷源的工作過程,它有兩種觸發(fā)方式,即電平觸發(fā)和邊沿觸發(fā)。可通過將TCON寄存器中的IT0位和IT1位清0使其工作在電平觸發(fā)方式,或置為1使其工作在邊沿觸發(fā)方式。

在電平觸發(fā)方式下,單片機(jī)在每個(gè)機(jī)器周期的S5P2期間采樣中斷輸入信號(hào),若為低電平,則可直接觸發(fā)外部中斷。在這種觸發(fā)方式中,中斷源必須持續(xù)請(qǐng)求,直至中斷產(chǎn)生為止,且要求在中斷服務(wù)程序返回之前,必須撤除中斷請(qǐng)求信號(hào),否則機(jī)器將認(rèn)為又發(fā)生了另一次中斷請(qǐng)求。因此,電平觸發(fā)方式適合于外部中斷輸入為低電平,且在中斷服務(wù)程序中能清除該中斷源的申請(qǐng)信號(hào)的情況。

在邊沿觸發(fā)方式中,單片機(jī)在采樣中斷輸入信號(hào)時(shí),如果連續(xù)采樣到1個(gè)周期的高電平和緊接著1個(gè)周期的低電平,則中斷請(qǐng)求標(biāo)志位就被置位,并請(qǐng)求中斷。這種方式下,CPU響應(yīng)中斷進(jìn)入中斷服務(wù)程序時(shí),請(qǐng)求標(biāo)志位會(huì)被CPU自動(dòng)清除。所以該方式適合于以負(fù)脈沖形式輸入的外部中斷請(qǐng)求。

由于外部中斷源在每個(gè)機(jī)器周期被采樣1次,所以輸入的高電平或低電平必須至少保持12個(gè)振蕩周期,以保證能被采樣到。2.中斷請(qǐng)求的撤除

CPU響應(yīng)中斷請(qǐng)求后,在中斷返回前,必須撤除請(qǐng)求,否則會(huì)錯(cuò)誤地再一次引起中斷過程。如前所述,對(duì)于定時(shí)器T0與T1的中斷請(qǐng)求及邊沿觸發(fā)方式的外部中斷0和1來說,CPU在響應(yīng)中斷后用硬件清除了相應(yīng)的中斷請(qǐng)求標(biāo)志TF0、TF1、IE0與IE1,即自動(dòng)撤除了中斷請(qǐng)求。

對(duì)于串行口中斷,CPU響應(yīng)中斷后沒有用硬件清除中斷標(biāo)志位,必須由用戶編制的中斷外部服務(wù)程序來清除相應(yīng)的中斷標(biāo)志,如用指令CLRTI或CLRRI來清除串行發(fā)送或串行接收中斷標(biāo)志。對(duì)于電平觸發(fā)的外部中斷,由于CPU對(duì)外部中斷0和1引腳沒有控制作用,因此需要外接電路來撤除中斷請(qǐng)求信號(hào)。

下圖描述了一種外部中斷撤出的可行性方案。該外部中斷請(qǐng)求信號(hào)通過D觸發(fā)器加到單片機(jī)外部中斷0或1引腳上。當(dāng)外部中斷信號(hào)使D觸發(fā)器的CLK端發(fā)生正跳變時(shí),由于D端接地,Q端輸出為0,因此向單片機(jī)發(fā)出中斷請(qǐng)求。CPU響應(yīng)中斷后,利用1根口線(如P1.0)作應(yīng)答線。圖4.3外部中斷請(qǐng)求(電平觸發(fā)方式)的撤除圖

在中斷服務(wù)程序中用以下兩條指令來撤除中斷請(qǐng)求:

ANLP1,#0FEH ;P1.0=0,則S=1,D觸發(fā)器置位,Q=1ORLP1,#01H ;P1.0=1,則S=0,D觸發(fā)器接收信號(hào)

第1條指令使P1.0為0,而P1口其他各位的狀態(tài)不變。由于P1.0接至D觸發(fā)器的置“1”端(S),所以D觸發(fā)器的Q=1,從而撤除了中斷請(qǐng)求信號(hào)。第2條指令又使P1.0為1,即S=0,以便能繼續(xù)接收新的外部中斷請(qǐng)求信號(hào)。4.1.6中斷系統(tǒng)設(shè)計(jì)舉例中斷系統(tǒng)的設(shè)計(jì)過程通常由以下幾個(gè)部分構(gòu)成(1)中斷初始化,在主程序中完成;(2)在中斷入口地址處安排一跳轉(zhuǎn)指令,跳轉(zhuǎn)至中斷服務(wù)子程序入口;(3)中斷服務(wù)子程序開始保護(hù)現(xiàn)場(chǎng),保護(hù)與主程序或其他中斷系統(tǒng)共享的資源,如A,PSW,DPTR,

Rn等,如果沒有共享資源,可以不必保護(hù);(4)編制中斷服務(wù)子程序功能主體;(5)恢復(fù)現(xiàn)場(chǎng);【例4.1】試編寫設(shè)置外部中斷0和串行接口中斷為高優(yōu)先級(jí),外部中斷1為低優(yōu)先級(jí),并屏蔽T0和T1中斷請(qǐng)求的初始化程序段。解:根據(jù)題目要求,只要能將中斷請(qǐng)求優(yōu)先級(jí)寄存器IP的第0、4位置“l(fā)”。其余位置“0”,將中斷請(qǐng)求允許寄存器的第0、2、4、7位置“l(fā)”,其余位置“0”就可以了。

ORG 0000H SJMPMAIN ORG 0003H;外部中斷0的入口地址

LJMP INT0INT

;跳轉(zhuǎn)到外部中斷0的中斷服務(wù)程序

ORG 0013H;外部中斷1的入口地址

LJMPINT1INT

;跳轉(zhuǎn)到外部中斷1的中斷服務(wù)程序

ORG 0023;串口中斷的入口地址

LJMP SIOINT

;跳轉(zhuǎn)到串口中斷的中斷服務(wù)程序

ORG 0030HMAIN:…;編寫主程序

MOVIP,#00010001B;設(shè)外部中斷和;串行口中斷;為高優(yōu)先級(jí)

MOVIE,#10010101B;允許INT0、串行口中斷,開CPU中斷

思考:試寫一段中斷初始化程序,使其允許T0、T1和串口中斷,且INT0為邊沿觸發(fā)方式,串口為高優(yōu)先級(jí)中斷。【例4.2】利用單片機(jī)的定時(shí)器計(jì)數(shù)來產(chǎn)生中斷,假定單片機(jī)晶振選擇12MHZ,選擇使用T0每1mS產(chǎn)生一次中斷請(qǐng)求,用于調(diào)用動(dòng)態(tài)顯示程序DISP,即顯示程序在此屬于中斷服務(wù)程序。

解:先安排好不同程序的入口地址,在主程序中完成定時(shí)器和中斷的初始化,然后打開對(duì)應(yīng)中斷允許位和總中斷允許位,在中斷服務(wù)程序中要注意保護(hù)和恢復(fù)現(xiàn)場(chǎng)。;主程序如下ORG0000HLJMPMAIN ;跳轉(zhuǎn)到主程序入口ORG000BHLJMPDISP ;跳轉(zhuǎn)到定時(shí)器T0中斷入口地址

ORG0030HMAIN:……… ;===進(jìn)行定時(shí)器初始化===MOVTMOD,#00000001B;設(shè)置T0工作在模式1MOVTH0,#0FCH;MOVTL0,#18H;設(shè)置計(jì)數(shù)初值FC18H=64536=65536-1000SETBTR0;TR0=1,啟動(dòng)定時(shí)器T0開始計(jì)數(shù)SETBET0;開放定時(shí)器T0中斷允許位SETBEA;開放總中斷允許位,等待T0計(jì)數(shù)滿溢出;…略……;中斷服務(wù)程序代碼:DISP:

PUSHACCPUSHPSW

;保護(hù)現(xiàn)場(chǎng);CLRTR0;因?yàn)橐呀?jīng)響應(yīng)中斷請(qǐng)求,故停止定時(shí)器T0MOVTH0,#0FCHMOVTL0,#18H;重新賦計(jì)數(shù)初值SETBTR0;重新啟動(dòng)定時(shí)器T0…….;顯示程序代碼(略)…..POPPSWPOPACC;按先入后出次序恢復(fù)現(xiàn)場(chǎng);RETI;中斷服務(wù)程序結(jié)束,返回?cái)帱c(diǎn),必須用RETI指令;【例4.3】如下圖所示,按S接至外部中斷,按一次鍵LED點(diǎn)亮,蜂鳴器發(fā)聲,再按一次鍵LED滅,蜂鳴器關(guān)閉,循環(huán)往復(fù)。圖按鍵控制聲光電路——實(shí)現(xiàn)程序——

ORG 0000H LED BIT P0.0 BUZZERBIT P2.7 LJMP MAIN ;跳轉(zhuǎn)至主程序

ORG 0003H LJMP INT1_INT ;跳轉(zhuǎn)至中斷服務(wù)程序

…… ORG 0100H

MAIN:SETB IT1 ;外中斷采用下降沿觸發(fā)

SETB EX1 ;允許中斷

SETB EA ;開總中斷

SETB F0 ;按鍵切換標(biāo)志,F(xiàn)0=1,LED滅; ;F0=0,LED亮

……INT1_INT:CPLF0 ;不需保護(hù)現(xiàn)

MOV C,F(xiàn)0 MOV LED,C ;控制LED輸出

MOV BUZZER,C ;控制蜂鳴器輸出

RETI ;中斷返回

另:請(qǐng)考慮用查詢方式實(shí)現(xiàn)該功能,如何編程?二者有何差異?中斷總結(jié)

51單片機(jī)共有5個(gè)中斷源,由4個(gè)SFR(TCON、SCON、IE和IP)進(jìn)行管理和控制。初始化時(shí),需要對(duì)5個(gè)內(nèi)容進(jìn)行設(shè)置:

1)中斷服務(wù)程序入口地址的設(shè)定;2)某一中斷源中斷請(qǐng)求的允許和禁止;3)對(duì)于外部中斷請(qǐng)求,還需進(jìn)行觸發(fā)方式的設(shè)定;4)各中斷優(yōu)先級(jí)別的設(shè)定;5)CPU開中斷與關(guān)中斷。4.2MCS-51的定時(shí)/計(jì)數(shù)器

在工業(yè)檢測(cè)、控制中,許多場(chǎng)合都要用到計(jì)數(shù)或定時(shí)功能。例如,對(duì)某個(gè)外部事件進(jìn)行計(jì)數(shù)、定時(shí)巡回檢測(cè)物理參數(shù)、按一定的時(shí)間間隔進(jìn)行現(xiàn)場(chǎng)控制等。單片機(jī)片內(nèi)集成有兩個(gè)16位可編程的定時(shí)/計(jì)數(shù)器:T0和T1,通過對(duì)它們的特殊功能寄存器(SFR)的編程,可以用作定時(shí)或計(jì)數(shù)器,此外,T1還可以用作為串行口的波特率發(fā)生器。

4.2.1定時(shí)/計(jì)數(shù)器的基本結(jié)構(gòu)1.定時(shí)/計(jì)數(shù)器的結(jié)構(gòu)基本部件是兩個(gè)16位寄存器T0和T1,每個(gè)分成兩個(gè)8位寄存器(例:T0由高8位TH0和低8位TL0組成)TMOD:定時(shí)/計(jì)數(shù)器的工作方式寄存器,由它確定定時(shí)/計(jì)數(shù)器的工作方式和功能;TCON:定時(shí)/計(jì)數(shù)器的控制寄存器,用于控制T0、T1的啟動(dòng)和停止以及設(shè)置溢出標(biāo)志。

定時(shí)/計(jì)數(shù)器的結(jié)構(gòu)框圖2.定時(shí)/計(jì)數(shù)器的工作原理定時(shí)/計(jì)數(shù)器T0和T1的實(shí)質(zhì)是加“1”計(jì)數(shù)器,即每輸入一個(gè)脈沖,計(jì)數(shù)器加“1”,當(dāng)加到計(jì)數(shù)器全為“1”時(shí),再輸入一個(gè)脈沖,就使計(jì)數(shù)器回零,且計(jì)數(shù)器的溢出使TCON中的標(biāo)志位TF0或TF1置“1”,向CPU發(fā)出中斷請(qǐng)求(定時(shí)/計(jì)數(shù)器中斷允許時(shí))。區(qū)別:作定時(shí)器時(shí)脈沖來自于內(nèi)部時(shí)鐘振蕩器,作計(jì)數(shù)器時(shí)脈沖來自于外部引腳。1)定時(shí)器模式此時(shí)輸入脈沖是由內(nèi)部時(shí)鐘振蕩器的輸出經(jīng)12分頻后送來的。如果晶振頻率為12MHz,則一個(gè)機(jī)器周期是1us,定時(shí)器每接收一個(gè)輸入脈沖的時(shí)間為1us。要定一段時(shí)間,只需計(jì)算一下脈沖個(gè)數(shù)即可。2)計(jì)數(shù)器模式此時(shí)輸入脈沖是由外部引腳P3.4(T0)或P3.5(T1)輸入到計(jì)數(shù)器的。在每個(gè)機(jī)器周期的S5P2期間采樣T0、T1引腳電平。當(dāng)某周期采樣到一高電平輸入,而下一周期又采樣到一低電平時(shí),則計(jì)數(shù)器加“1”。由于檢測(cè)一個(gè)從“1”到“0”的下降沿需要2個(gè)機(jī)器周期,因此要求被采樣的電平至少要維持一個(gè)機(jī)器周期,否則會(huì)出現(xiàn)漏計(jì)數(shù)現(xiàn)象,所以最高計(jì)數(shù)頻率為晶振頻率的1/24。當(dāng)晶振頻率為12MHz時(shí),最高計(jì)數(shù)頻率不超500kHz,即計(jì)數(shù)脈沖的周期要大于2us。4.2.2定時(shí)/計(jì)數(shù)器的控制與實(shí)現(xiàn)

MCS-51單片機(jī)定時(shí)/計(jì)數(shù)器的控制與實(shí)現(xiàn)由兩個(gè)特殊功能寄存器TMOD、TCON完成。1.工作方式寄存器TMOD(89H)用于設(shè)置定時(shí)/計(jì)數(shù)器的工作方式,低4位用于T0,高4位用于T1。其格式如下

位D7D6D5D4D3D2D1D0字節(jié)地址TMODGATEC/M1M0GATE

C/M1M089H(1)GATE:門控位。GATE=0時(shí),當(dāng)軟件使TCON中的TR0或TR1設(shè)置為“1”,則啟動(dòng)定時(shí)/計(jì)數(shù)器工作;GATA=1時(shí),軟件使TR0或TR1設(shè)置為“1”,同時(shí)外部中斷引腳或也為高電平時(shí),才能啟動(dòng)定時(shí)/計(jì)數(shù)器工作。(2)C/T:定時(shí)/計(jì)數(shù)模式選擇位。C/T=0為定時(shí)模式;C/T=1為計(jì)數(shù)模式。(3)M1M0:工作方式設(shè)置位。定時(shí)/計(jì)數(shù)器有4種工作方式,由M1M0進(jìn)行設(shè)置,如表下表所示。

定時(shí)/計(jì)數(shù)器工作方式設(shè)置表M1M0工作方式功能說明00方式013位定時(shí)/計(jì)數(shù)器01方式116位定時(shí)/計(jì)數(shù)器10方式28位自動(dòng)重裝初值定時(shí)/計(jì)數(shù)器11方式3T0分成兩個(gè)獨(dú)立的8位定時(shí)/計(jì)數(shù)器;T1此方式停止計(jì)數(shù)2.控制寄存器TCON(88H)

TCON的低4位用于控制外部中斷,TCON的高4位用于控制定時(shí)/計(jì)數(shù)器的啟動(dòng)和中斷申請(qǐng)。位D7D6D5D4D3D2D1D0字節(jié)地址TCONTF1TR1TF0TR088H位地址8FH8EH8DH8CH8BH8AH89H88HTF1:定時(shí)/計(jì)數(shù)器T1溢出中斷請(qǐng)求標(biāo)志位。T1計(jì)數(shù)溢出時(shí)由硬件自動(dòng)置TF1為“1”。在進(jìn)入中斷服務(wù)程序后TF1由硬件自動(dòng)清“0”;若用于查詢方式,此位可作為狀態(tài)位供查詢,但應(yīng)注意查詢后由軟件清“0”。(2)TR1:定時(shí)/計(jì)數(shù)器T1運(yùn)行控制位。TR1置“1”時(shí),定時(shí)/

計(jì)數(shù)器T1開始工作;TR1置“0”時(shí),定時(shí)/計(jì)數(shù)器T1停止工作。TR1由軟件置“1”或清“0”。(3)TF0

:定時(shí)/計(jì)數(shù)器T0溢出中斷請(qǐng)求標(biāo)志位,其功能與TF1類同。(4)TR0

:定時(shí)/計(jì)數(shù)器T0運(yùn)行控制位,其功能與TR1類同。4.2.3定時(shí)/計(jì)數(shù)器的工作方式

MCS-51單片機(jī)定時(shí)/計(jì)數(shù)器T0有4種工作方式(方式0、1、2、3);T1有3種工作方式(方式0、1、2);T1還可作為串行通信接口的波特率發(fā)生器;若錯(cuò)將T1設(shè)置為方式3,則T1將停止工作;下面以定時(shí)/計(jì)數(shù)器T0為例進(jìn)行介紹。1.方式0

當(dāng)TMOD的M1M0為00時(shí),定時(shí)/計(jì)數(shù)器工作于方式0,如圖所示。方式0的邏輯結(jié)構(gòu)方式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)求。13位定時(shí)/計(jì)數(shù)器是為了與Intel公司早期的產(chǎn)品MCS-48系列兼容,該系列已過時(shí),且計(jì)數(shù)初值裝入易出錯(cuò),所以在實(shí)際應(yīng)用中常由16位的方式1取代。2.方式1

當(dāng)M1M0為01時(shí),定時(shí)/計(jì)數(shù)器工作于方式1,如圖所示。

方式1的邏輯結(jié)構(gòu)方式1的計(jì)數(shù)位數(shù)是16位,由TL0作為低8位、TH0

作為高8位,組成了16位加“1”計(jì)數(shù)器。計(jì)數(shù)個(gè)數(shù)M與計(jì)數(shù)初值N的關(guān)系為M=216-N。用于定時(shí)功能時(shí),定時(shí)時(shí)間t的計(jì)算公式為:

t=M×機(jī)器周期=(216-N)×機(jī)器周期若晶振頻率為12MHz,機(jī)器周期=1us,初值N=0~

65535范圍時(shí),則可定時(shí)范圍為1~65.536ms。用于計(jì)數(shù)功能時(shí),初值N=0~65535范圍時(shí),計(jì)數(shù)范圍為1~65536。3.方式2當(dāng)M1M0為10時(shí),定時(shí)/計(jì)數(shù)器工作在方式2,其邏輯結(jié)構(gòu)如圖所示。方式2的邏輯結(jié)構(gòu)方式2為自動(dòng)重裝初值的8位計(jì)數(shù)方式。TL0作為8位定時(shí)/計(jì)數(shù)器使用,TH0為8位初值寄存器,保持不變。當(dāng)TL0計(jì)滿溢出時(shí),由硬件使TF0置“1”,向CPU發(fā)出中斷請(qǐng)求,而溢出脈沖打開TL0與TH0之間的三態(tài)門,將TH0中的計(jì)數(shù)初值自動(dòng)送入TL0。TL0從初值重新進(jìn)行加“1”計(jì)數(shù)。周而復(fù)始,直至TR0=0才會(huì)停止。

計(jì)數(shù)個(gè)數(shù)M與計(jì)數(shù)初值N的關(guān)系為M=28-N。用于定時(shí)功能時(shí),定時(shí)時(shí)間t的計(jì)算公式為

t=M×機(jī)器周期=(28-N)×機(jī)器周期若晶振頻率為12MHz,機(jī)器周期=1,初值N=0~255范圍時(shí),則可定時(shí)范圍為1~256。用于計(jì)數(shù)功能時(shí),初值N=0~255范圍時(shí),計(jì)數(shù)范圍為1~256。由于工作方式2省去了重裝常數(shù)的程序,特別適合于用作波特率發(fā)生器。4.方式3當(dāng)M1M0為11時(shí),T0被設(shè)置為方式3,其邏輯結(jié)構(gòu)如圖所示。

T0方式3的邏輯結(jié)構(gòu)

方式3時(shí),只適用于定時(shí)/計(jì)數(shù)器T0,T0分成為兩個(gè)獨(dú)立的8位計(jì)數(shù)器TL0和TH0,在使用上注意以下特點(diǎn):

(1)TL0:可作為定時(shí)和計(jì)數(shù)器使用,占用了T0的控制位:C/T、GATE、TR0、TF0和。

(2)TH0:只能作為定時(shí)器使用,僅借用了T1的控制位TR1、TF1。

(3)T1:只能作為定時(shí)器運(yùn)行,在T0方式3時(shí),原則上T1仍可按方式0、1、2工作,只是不能使用運(yùn)行控制位TR1和溢出標(biāo)志位TF1,也不能發(fā)出中斷請(qǐng)求信號(hào)。方式設(shè)定后,T1將自動(dòng)運(yùn)行,如果要停止工作,只需將其設(shè)定為方式3即可。

4.2.4定時(shí)/計(jì)數(shù)器程序設(shè)計(jì)舉例51單片機(jī)的定時(shí)/計(jì)數(shù)器通常工作于中斷場(chǎng)合,可遵循以下幾個(gè)方面進(jìn)行應(yīng)用設(shè)計(jì):

(1)計(jì)算定時(shí)/計(jì)數(shù)器的初值;

(2)在主程序中進(jìn)行初始化設(shè)計(jì):包括定時(shí)/計(jì)數(shù)器的初始化和中斷初始化,即對(duì)TH0、TL0或TH1、TL1,

TMOD、TCON、IP、IE賦值;

(3)中斷服務(wù)程序設(shè)計(jì)?!纠?.4】利用定時(shí)/計(jì)數(shù)器(T0)的方式1,產(chǎn)生一個(gè)50Hz的方波,此方波由P1.0引腳輸出,晶振頻率為12MHz?!窘忸}思路】方波頻率f=50Hz周期T=1/50=0.02s,如果讓定時(shí)器計(jì)滿0.01s,P1.0輸出“0”,再計(jì)滿0.01s,P1.0輸出“1”,就能滿足要求如圖4.9所示。所以此題轉(zhuǎn)化為由T0產(chǎn)生0.01s定時(shí)的問題?!緦?shí)現(xiàn)方法】(1)查詢方式:通過查詢T0的溢出標(biāo)志TF0是否為“1”。當(dāng)TF=1時(shí),定時(shí)時(shí)間已到,對(duì)P1.0取反操作。(2)中斷方式:CPU正常執(zhí)行主程序,一旦定時(shí)時(shí)間到,TF0=1向CPU申請(qǐng)中斷,CPU響應(yīng)了T0的中斷,就執(zhí)行中斷程序,在中斷程序里對(duì)P1.0取反操作。圖4.950Hz方波示意圖【解題步驟】(1)確定定時(shí)器初值N:由于晶振為12MHz,所以1個(gè)機(jī)器周期為1us。計(jì)數(shù)值

即應(yīng)將D8H送入TH0中,F(xiàn)0H送入TL0中(2)求T0的方式控制字TMOD:

GATE=0,C/T=0,M1M0=01可取方式控制字為

TMOD=01H,即T0的方式1;

【查詢方式】 ORG0000H LJMPMAIN ;跳轉(zhuǎn)到主程序

ORG0100H ;主程序

MAIN:MOVTMOD,#01H ;置T0工作于方式1LOOP:MOVTH0,#0D8H ;裝入計(jì)數(shù)初值

MOVTL0,#0F0H SETBTR0 ;啟動(dòng)定時(shí)器T0 JNBTF0,$;TF0=0,定時(shí)時(shí)間未到,等待

CLRTF0;TF0=1,定時(shí)時(shí)間到,清TF0 CPLP1.0;P1.0取反輸出

SJMPLOOP

END【中斷方式】

ORG0000H LJMPMAIN ;跳轉(zhuǎn)到主程序

ORG000BH ;T0的中斷入口地址

LJMPT0_INT ;轉(zhuǎn)向中斷服務(wù)程序

ORG0100HMAIN: MOVTMOD,#01H;置T0工作于方式1 MOVTH0,#0D8H;裝入計(jì)數(shù)初值

MOVTL0,#0F0H SETBET0 ;T0開中斷

SETBEA ;CPU開中斷

SETBTR0 ;啟動(dòng)T0 … … ;繼續(xù)執(zhí)行主程序其他部分

SJMP$ ;等待中斷

T0_INT:CPLP1.0 ;P1.0取反輸出

MOVTH0,#0D8H;重新裝入計(jì)數(shù)初值

MOVTL0,#0F0H RETI ;中斷返回

END【例4.5】如下圖所示,按鍵S接至外部中斷INT1,按一次鍵LED閃爍點(diǎn)亮,閃爍頻率為1Hz,蜂鳴器發(fā)聲,發(fā)聲頻率為1kHz,再按一次鍵LED滅,蜂鳴器關(guān)閉,循環(huán)往復(fù)。晶振頻率為6MHz。

【解題思路】

同上一題類似,本題需要產(chǎn)生兩個(gè)方波,一個(gè)頻率為f

=1Hz周期T=1s,另一個(gè)頻率為f=1kHz周期T=1ms。所以此題轉(zhuǎn)化為由定時(shí)器產(chǎn)生0.5s和500定時(shí)的問題?!緦?shí)現(xiàn)方法】(1)500定時(shí):將T0設(shè)置為方式2,即自動(dòng)重裝初值的8位計(jì)數(shù)方式,并開放T0中斷,在中斷程序里對(duì)P2.7取反操作。(2)0.5s定時(shí):將T1設(shè)置為方式1,完成100ms定時(shí),并開放T1中斷,在中斷程序里設(shè)置一個(gè)“軟時(shí)鐘”,即一個(gè)CLOCK=30H內(nèi)存單元,每中斷一次,CLOCK加“1”,CLOCK累計(jì)5次(即0.5s),對(duì)P0.0取反操作。【解題步驟】(1)確定定時(shí)器T0、T1的初值N0、N1:由于晶振為6MHz,所以1個(gè)機(jī)器周期為2us。所以計(jì)數(shù)值

即應(yīng)將06H送入TH0和TL0中。計(jì)數(shù)值

即應(yīng)將3CH送入TH0、0B0送入TL0中。

(2)求T0的方式控制字

GATE=0,C/T=0,M1M0=10;求T1的方式控制字

GATE=0,C/T=0,M1M0=01;合并方式控制字為TMOD=00010010B=12H,即T0的方式2和T1的方式1;(3)本例設(shè)有3個(gè)中斷,為了提高按鍵響應(yīng)實(shí)時(shí)性,可將外部中斷INT1為高優(yōu)先級(jí),并在INT1中斷服務(wù)程序中設(shè)置T0、T1相關(guān)特殊功能寄存器。【實(shí)現(xiàn)程序】

ORG 0000H ;**************偽指令*************************

LED BIT P0.0 BUZZERBIT P2.7 CLOCKDATA 30H LJMP MAIN ;跳轉(zhuǎn)至主程序;**************中斷入口地址*************************

ORG0013H LJMPINT1_INT ;跳轉(zhuǎn)至中斷服務(wù)程序

ORG000BH LJMPT0_INT ;跳轉(zhuǎn)至T0中斷服務(wù)程序

ORG001BH LJMPT1_INT ;跳轉(zhuǎn)至T1中斷服務(wù)程序

… … ORG0100H

;**************中斷初始化*************************

MAIN: SETB IT1 ;外中斷采用下降沿觸發(fā)

SETB EX1 ;允許中斷

SETB PX1 ;為高優(yōu)先級(jí)

SETB EA ;開總中斷

SETB F0 ;按鍵切換標(biāo)志,F(xiàn)0=1,;LED滅;F0=0,LED亮

… … ;繼續(xù)執(zhí)行主程序其他部分

SJMP$ ;等待中斷;**************中斷服務(wù)程序*************************

INT1_INT: CPL F0 ;不需保護(hù)現(xiàn)場(chǎng)

JNB F0,OPEN_T;F0=0,開放T0、T1中斷

CLR TR0 ;關(guān)閉T0時(shí)鐘

CLR ET0 ;關(guān)閉T0中斷

CLR TR1 ;關(guān)閉T1時(shí)鐘

CLR ET1 ;關(guān)閉T1中斷

RETI ;中斷返回

OPEN_T:MOV TH0,#06H;裝入計(jì)數(shù)初值

MOV TL0,#06H MOV TH1,#3CH MOV TL1,#0B0H SETB TR0 ;啟動(dòng)T0時(shí)鐘

SETB ET0 ;開放T0中斷

SETB TR1 ;啟動(dòng)T1時(shí)鐘

SETB ET1 ;開放T1中斷

RETI;**************T0中斷服務(wù)程序*************************

T0_INT: CPL BUZZER ;不需重新裝入計(jì)數(shù)初值

RETI;**************T1中斷服務(wù)程序*************************

T1_INT: PUSH ACC ;保護(hù)現(xiàn)場(chǎng)

PUSH PSW CLR TR1

MOVTH1,#3CH;重新裝入計(jì)數(shù)初值

MOVTL1,#0B0H SETB TR1 INC CLOCK ;軟時(shí)鐘加1 MOV A,CLOCK CJNE A,#5,TMPLTMPL:JC RETURN ;不到0.5s返回

CPL LED ;到0.5s閃爍變換

MOV CLOCK,#0 ;軟時(shí)鐘清零

RETURN:POP PSW POP ACC RETI END【例4.6】用T1方式2計(jì)數(shù),要求每計(jì)滿100次,將P1.0端取反。【解題思路】:外部計(jì)數(shù)信號(hào)由T1(P3.5)引入,每跳變一次計(jì)數(shù)器加1,由程序查詢TF1?!窘忸}步驟】(1)確定定時(shí)器初值N:

N=256-100=156=9CH(2)確定T1方式控制字:

TMOD=60H源程序如下:

MOVTMOD,#60H;設(shè)置T1為方式2計(jì)數(shù)器

MOVTH1,#9CH;賦初值

MOVTL1,#9CH;

SETBTR1;啟動(dòng)計(jì)數(shù)器工作

DEL:JBCTF1,REP;查詢是否計(jì)數(shù)溢出

AJMPDEL;

REP:CPLP1.0;若計(jì)數(shù)溢出,則輸出取反

AJMPDEL4.3串行接口

4.3.1串行通信基本知識(shí)計(jì)算機(jī)與外部設(shè)備或計(jì)算機(jī)與計(jì)算機(jī)之間的數(shù)據(jù)交換稱為通信。通信分為并行通信與串行通信兩種基本方式。并行通信:將數(shù)據(jù)的各位用多條數(shù)據(jù)線同時(shí)進(jìn)行傳送,外加地址線和通信控制線。優(yōu)點(diǎn)是傳輸速率高,缺點(diǎn)是長(zhǎng)距離傳輸成本高,可靠性差,只適用于近距離傳輸。串行通信:將數(shù)據(jù)分成1位1位的形式在一條傳輸線上逐個(gè)地傳送。優(yōu)點(diǎn)是傳輸線少,長(zhǎng)距離傳送時(shí)成本低,缺點(diǎn)是傳輸速率低。

(a)并行通信方式(b)串行通信方式

圖并行和串行通信方式1.串行通信的種類

根據(jù)數(shù)據(jù)傳輸方式的不同,可將串行通信分為同步通信和異步通信。

1)同步通信同步通信是一種數(shù)據(jù)連續(xù)傳輸?shù)拇型ㄐ欧绞?,通信時(shí)發(fā)送方把需要發(fā)送的多個(gè)字節(jié)數(shù)據(jù)和校驗(yàn)信息連接起來,組成數(shù)據(jù)塊。發(fā)送時(shí),發(fā)送方只需在數(shù)據(jù)塊前插入1~2個(gè)特殊的同步字符,然后按特定速率逐位輸出(發(fā)送)數(shù)據(jù)塊內(nèi)的各位數(shù)據(jù)。接收方在接收到特定的同步字符后,也按相同速率接收數(shù)據(jù)塊內(nèi)的各位數(shù)據(jù)。

典型的同步通信格式如下:

在這種通信方式中,數(shù)據(jù)塊內(nèi)的各位數(shù)據(jù)之間沒有間隔,傳輸效率高;發(fā)送、接收雙方必須保持同步(使用同一時(shí)鐘信號(hào)),且數(shù)據(jù)塊長(zhǎng)度越大,對(duì)同步要求就越高。同步通信設(shè)備復(fù)雜,成本高,一般只用在高速數(shù)字通信系統(tǒng)中。同步字符1同步字符2N個(gè)字節(jié)的連續(xù)數(shù)據(jù)校驗(yàn)信息1校驗(yàn)信息22)異步通信異步通信是以字符幀為單位進(jìn)行傳輸。每幀數(shù)據(jù)由4部分組成:起始位(占1位)、數(shù)據(jù)位(占5~8位)、奇偶校驗(yàn)位(占1位,也可以沒有校驗(yàn)位)、停止位(占1或2位)。下圖中給出的是8位數(shù)據(jù)位、1位奇偶校驗(yàn)位和1位停止位,加上1位起始位,共11位組成一個(gè)傳輸幀。

異步通信字符幀格式

發(fā)送方:傳送時(shí)先輸出起始位“0”作為聯(lián)絡(luò)信號(hào),接下來的是數(shù)據(jù)位和奇偶校驗(yàn)位,停止位“1”表示一個(gè)字符的結(jié)束。其中,數(shù)據(jù)的低位在前,高位在后。字符之間允許有不定長(zhǎng)度的空閑位。接收方:傳送開始后,接收設(shè)備不斷檢測(cè)傳輸線的電平狀態(tài),當(dāng)收到一系列的“1”(空閑位或停止位)之后,檢測(cè)到一個(gè)“0”,說明起始位出現(xiàn),就開始接收所規(guī)定的數(shù)據(jù)位和奇偶校驗(yàn)位以及停止位。異步通信的特點(diǎn):所需傳輸線少;設(shè)備開銷較小;在單片機(jī)控制系統(tǒng)中得到廣泛的應(yīng)用。但每個(gè)字符要附加2~3位用于起止位,各幀之間還有間隔,因此傳輸效率不高。2.串行通信數(shù)據(jù)傳輸方向

根據(jù)串行通信數(shù)據(jù)傳輸?shù)姆较?,可將串行通信系統(tǒng)傳輸方式分為:?jiǎn)喂し绞?、半雙工方式和全雙工方式,如圖所示。數(shù)據(jù)傳輸方式1)單工:數(shù)據(jù)傳輸僅能從發(fā)送設(shè)備傳輸?shù)浇邮赵O(shè)備。2)半雙工:兩個(gè)串行通信設(shè)備之間只有一條數(shù)據(jù)線,數(shù)據(jù)傳輸可以沿兩個(gè)方向,但需要分時(shí)進(jìn)行。3)全雙工:是指兩個(gè)串行通信設(shè)備之間可以同時(shí)進(jìn)行接收和發(fā)送。

3種方式中,全雙工方式的效率最高;半雙工方式配置和編程相對(duì)靈活,傳輸成本較低;串行通信設(shè)備常選用半雙工方式。3.波特率數(shù)據(jù)的傳輸速率可以用波特率表示。波特率是信號(hào)每秒變化的次數(shù),單位是:符號(hào)/s比特率是每秒傳送二進(jìn)制數(shù)的位數(shù)單位是:(bit/s或kbit/s)。如每秒傳送240個(gè)字符,而每個(gè)字符格式包含10位這時(shí)的波特率為10位(bit)×240個(gè)/s=2400bit/s。在異步串行通信中,接收方和發(fā)送方應(yīng)使用相同的波特率,才能成功傳送數(shù)據(jù)。4.3.2MCS-51單片機(jī)串行接口及其控制MCS-51單片機(jī)內(nèi)部有一個(gè)全雙工異步串行I/O接口。MCS-51串行接口的內(nèi)部簡(jiǎn)化結(jié)構(gòu)如下圖所示。

MCS-51串行接口結(jié)構(gòu)圖P3.0是串行數(shù)據(jù)接收RXD,P3.1是串行數(shù)據(jù)發(fā)送端TXD。串行接口的結(jié)構(gòu)由串行接口控制電路、發(fā)送電路和接收電路3部分組成。發(fā)送電路由發(fā)送緩沖器(SBUF)、發(fā)送控制電路組成,用于串行接口的發(fā)送。接收電路由接收緩沖器(SBUF)、接收控制電路組成,用于串行接口的接收。緩沖寄存器SBUF分為:接收緩沖器SBUF和發(fā)送緩沖器SBUF,以便CPU能以全雙工的方式進(jìn)行通信。它們?cè)谖锢砩鲜歉綦x的,但是占用同一地址(99H)。接收方式下,串行數(shù)據(jù)從RXD引腳輸入,串行口內(nèi)部在接收緩沖器之前接有移位寄存器,它們共同構(gòu)成了串行接收的雙緩沖結(jié)構(gòu),可以避免在數(shù)據(jù)接收過程中出現(xiàn)幀重疊錯(cuò)誤,所謂幀重疊是在下一幀數(shù)據(jù)來時(shí),前一幀數(shù)據(jù)還沒有被讀走。在發(fā)送方式,串行數(shù)據(jù)通過TXD引腳輸出。

波特率發(fā)生器:主要由T1、T2及內(nèi)部的一些控制開關(guān)和分頻器所組成。它為串行口提供時(shí)鐘信號(hào),即TXCLK(發(fā)送時(shí)鐘)和RXCLK(接收時(shí)鐘),相應(yīng)的控制波特率發(fā)生器的特殊功能寄存器有TMOD、TCON、T2CON、PCON、TL1、TH1、TL2、TH2等。串行口進(jìn)行數(shù)據(jù)接收和發(fā)送的控制流程如圖所示。2.串行口控制與實(shí)現(xiàn)相關(guān)功能的寄存器1)串行數(shù)據(jù)緩沖器(99H)發(fā)送緩沖器:只管發(fā)送數(shù)據(jù),CPU寫入SBUF的時(shí)候

(MOVSUBF,A)即為發(fā)送;接收緩沖器:只管接收數(shù)據(jù),CPU讀取SBUF的過程

(MOVA,SUBF)即為接收。發(fā)送緩沖器只能寫入,不能讀出;接收緩沖器只能讀出,不能寫入。所以可同時(shí)發(fā)送數(shù)據(jù)、接收數(shù)據(jù)。對(duì)于發(fā)送緩沖器,因?yàn)榘l(fā)送時(shí)CPU是主動(dòng)的,不會(huì)產(chǎn)生重疊錯(cuò)誤。接收緩沖器是雙緩沖結(jié)構(gòu),以避免在接收下一幀數(shù)據(jù)之前,CPU未能及時(shí)響應(yīng)接收器的中斷,沒有把上一幀數(shù)據(jù)讀走,就會(huì)丟失前一個(gè)字節(jié)的內(nèi)容。2)串行接口控制寄存器SCON(98H)

用于控制串行接口的工作狀態(tài),其格式如下:位D7D6D5D4D3D2D1D0字節(jié)地址SCONSM0SM1SM2RENTB8RB8TIRI98H位地址9FH9EH9DH9CH9BH9AH99H98H(1)SM0和SM1:用于設(shè)置串行接口的工作方式,2位可選擇4種工作方式,如所示。其中,UART是通用異步接收和發(fā)送器的英文縮寫,是晶振頻率。串行接口的工作方式設(shè)置

SM0SM1方

式功能說明波特率000移位寄存器

/120118位UART可變1029位UART

1139位UART可變(2)REN:允許串行接收位。由軟件置位或清零。REN=1時(shí),串行接口允許接收數(shù)據(jù);REN=0時(shí),則禁止接收。(3)TB8:在方式2或方式3中,是發(fā)送數(shù)據(jù)的第9位。可以用作數(shù)據(jù)的奇偶校驗(yàn)位,或在多機(jī)通信中,作為地址幀/數(shù)據(jù)幀的標(biāo)志位。(4)RB8:在方式2或方式3中,是接收到數(shù)據(jù)的第9位,作為奇偶校驗(yàn)位或地址幀/數(shù)據(jù)幀的標(biāo)志位。在方式1時(shí),若SM2=0,則RB8是接收到的停止位。(5)TI:發(fā)送中斷標(biāo)志位。由內(nèi)部硬件使TI置“1”,向CPU發(fā)中斷申請(qǐng)。必須用軟件將其清“0”,取消此中斷申請(qǐng)。(6)RI:接收中斷標(biāo)志位。由內(nèi)部硬件使RI置“1”,向CPU發(fā)中斷申請(qǐng)。必須用軟件將其清“0”,取消此中斷申請(qǐng)。(7)SM2:為多機(jī)通信控制位,主要用于方式2和方式3。通過控制SM2,可以實(shí)現(xiàn)多機(jī)通信。3)電源控制寄存器PCON(97H)

其中只有1位SMOD與串行接口工作有關(guān),格式如下:(1)SMOD:波特率系數(shù)控制位。在串行接口方式1、方式2、方式3時(shí),波特率與SMOD有關(guān),當(dāng)SMOD=1時(shí),波特率加倍,否則不加倍。復(fù)位時(shí),SMOD=0。

PCON的地址為97H,不能位尋址,需要字節(jié)傳送。

位D7D6D5D4D3D2D1D0字節(jié)地址PCONSMOD97H串行接口可由SCON中的SM0、SM1設(shè)置4種工作方式。1方式0:同步移位寄存器的輸入/輸出方式串行接口為同步移位寄存器的輸入/輸出方式,而不是通信方式,可外接移位寄存器,用于擴(kuò)展并行I/O接口。注意:數(shù)據(jù)都由RXD(P3.0)引腳輸入或輸出,TXD引腳總是用于輸出同步移位脈沖。發(fā)送和接收均為8位數(shù)據(jù),低位在先,高位在后。波特率固定為/12。4.3.3串行口的工作方式2)方式0輸出方式0時(shí)輸出時(shí)序如下圖所示。

圖方式0輸出時(shí)序當(dāng)執(zhí)行任何一條寫SBUF的指令時(shí),就啟動(dòng)了串行接口的發(fā)送過程(如MOVSBUF,A)。內(nèi)部的定時(shí)邏輯在SBUF寫入數(shù)據(jù)之后,經(jīng)過一個(gè)完整的機(jī)器周期,輸出移位寄存器中輸出位的內(nèi)容送RXD引腳輸出;移位脈沖由TXD引腳輸出,它使RXD引腳輸出的數(shù)據(jù)移入外部移位寄存器。當(dāng)數(shù)據(jù)的最高位D7位移出后,停止發(fā)送數(shù)據(jù)和移位脈沖,就完成了1B的輸出,并把中斷標(biāo)志(TI)置“1”。如要再發(fā)送下一字節(jié)數(shù)據(jù),必須用軟件先將TI清“0”。3)方式0輸入方式0時(shí)輸入時(shí)序如下圖所示。當(dāng)SCON中的接收允許位REN=1和RI=0時(shí),就會(huì)啟動(dòng)一次串行接口接收過程。串行數(shù)據(jù)從RXD引腳輸入,移位脈沖由TXD引腳輸出。當(dāng)接收完一幀數(shù)據(jù)后,由硬件將輸入移位寄存器中的內(nèi)容寫入SBUF,并把中斷標(biāo)志(RI)置“1”。如要再接收數(shù)據(jù),就再用軟件將RI清“0”。方式0時(shí)輸入時(shí)序如下圖所示。

圖方式0輸入時(shí)序2.方式1:波特率可變的8位數(shù)據(jù)的異步通信接口。幀結(jié)構(gòu):10位UARTTXD為數(shù)據(jù)發(fā)送引腳,RXD為數(shù)據(jù)接收引腳。傳送1幀數(shù)據(jù)為10位,其中,1位起始位(0),8位數(shù)據(jù)位(低位在先),1位停止位(1)。方式1的波特率由定時(shí)器(T1)的溢出率和SMOD的狀態(tài)決定。…起始D0D1D2D3D4D5D6D7停止1)方式1輸出:方式1的發(fā)送時(shí)序如下圖所示。

方式1的發(fā)送時(shí)序執(zhí)行一條寫SBUF的指令就啟動(dòng)了發(fā)送過程。在發(fā)送移位時(shí)鐘的作用下,從TXD引腳先送出起始位(0),然后是8位數(shù)據(jù)位,最后是停止位(1)。1幀10位數(shù)據(jù)發(fā)送完后,將中斷標(biāo)志(TI)置“1”,向CPU申請(qǐng)中斷。如要再發(fā)送下一字節(jié)數(shù)據(jù),必須用軟件先將TI清“0”。2)方式1輸入軟件使REN=1和RI=0時(shí),就啟動(dòng)了接收過程。接收器以所選擇波特率的16倍速率采樣RXD引腳電平,檢測(cè)到RXD引腳輸入電平發(fā)生負(fù)跳變時(shí),說明起始位有效,將其移入輸入移位寄存器,并開始接收這1幀信息的其余位。接收過程中,將每個(gè)數(shù)據(jù)位寬度分成16個(gè)狀態(tài),并在中間的第7、8、9狀態(tài)時(shí)對(duì)RXD采樣,采樣數(shù)據(jù)從輸入移位寄存器右邊移入,起始位移至輸入移位寄存器最左邊時(shí),控制電路進(jìn)行最后一次移位。當(dāng)RI=0,且SM2=0(或接收到的停止位為“1”)時(shí),將接收到的9位數(shù)據(jù)的前8位數(shù)據(jù)裝入接收SBUF,第9位(停止位)進(jìn)入RB8,并置RI=1,向CPU請(qǐng)求中斷。如要再接收數(shù)據(jù),就再用軟件將RI清“0”。圖

方式1的接收時(shí)序3方式2和方式3:9位數(shù)據(jù)的異步通信接口。幀結(jié)構(gòu):11位UARTTXD為數(shù)據(jù)發(fā)送引腳,RXD為數(shù)據(jù)接收引腳。傳送1幀數(shù)據(jù)為11位。其中1位起始位(0),然后是8位數(shù)據(jù)位(低位在先),第10位是SCON中的TB8或RB8,最后1位是停止位(1)。方式2的波特率固定為晶振頻率的1/64或1/32,方式3波特率由定時(shí)器(T1)的溢出率和SMOD的狀態(tài)決定。…起始D0D1D2D3D4D5D6D7D8停止1)方式2和方式3輸出

CPU向SBUF寫入數(shù)據(jù)時(shí),就啟動(dòng)了發(fā)送過程。SCON中的TB8寫入輸出移位寄存器的第9位,8位數(shù)據(jù)裝入SBUF。發(fā)送開始時(shí),先把起始位0輸出到TXD引腳,然后是9位數(shù)據(jù)位,最后是停止位(1)。1幀11位數(shù)據(jù)發(fā)送完后,將中斷標(biāo)志(TI)置“1”,向CPU申請(qǐng)中斷。如要再發(fā)送下一字節(jié)數(shù)據(jù),必須用軟件先將TI清0。2)方式2和方式3輸入軟件使REN=1和RI=0時(shí),就啟動(dòng)了接收過程。接收器就以所選頻率的16倍速率開始采樣RXD引腳的電平狀態(tài),當(dāng)檢測(cè)到RXD引腳發(fā)生負(fù)跳變時(shí),說明起始位有效,將其移入輸入移位寄存器,開始接收這1幀數(shù)據(jù)。接收時(shí),將每個(gè)數(shù)據(jù)位寬度分成16個(gè)狀態(tài),并在中間的第7、8、9狀態(tài)時(shí)對(duì)RXD采樣,采樣數(shù)據(jù)從右邊移入輸入移位寄存器,在起始位0移到最左邊時(shí),控制電路進(jìn)行最后一次移位。當(dāng)RI=0,且SM2=0(或接收到的第9位數(shù)據(jù)為“1”)時(shí),接收到的數(shù)據(jù)裝入接收緩沖器和RB8(接收數(shù)據(jù)的第9位),置RI=1,向CPU請(qǐng)求中斷。如要再接收數(shù)據(jù),就再用軟件將RI清“0”。如果條件不滿足,則數(shù)據(jù)丟失,且不置位RI,繼續(xù)搜索RXD引腳的負(fù)跳變。4.波特率的計(jì)算串行通信雙方對(duì)發(fā)送或接收數(shù)據(jù)的波特率事先要約定好保持一致。MCS-51單片機(jī)的波特率設(shè)置與工作方式有關(guān),其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可變的,由定時(shí)器T1的溢出率和SMOD的狀態(tài)決定。各種方式的波特率計(jì)算由以下公式確定:方式0的波特率=/12

方式2的波特率=(2SMOD/64)·

方式1的波特率=(2SMOD/32)·(T1溢出率)

方式3的波特率=(2SMOD/32)·(T1溢出率)當(dāng)T1作為波特率發(fā)生器時(shí),常使T1工作在自動(dòng)重裝初值的8位定時(shí)器方式,并禁止T1中斷。這種方式可避免重新設(shè)定定時(shí)初值而產(chǎn)生波特率誤差。TH1從初值計(jì)數(shù)到產(chǎn)生溢出,它每秒溢出的次數(shù)稱為溢出率。

T1溢出率=1/{12×[256-(TH1)]}在單片機(jī)的應(yīng)用中,相同機(jī)種單片機(jī)的波特率很容易達(dá)到一致,只要晶振頻率相同,可以采用完全一致的設(shè)置參數(shù)。異機(jī)種單片機(jī)的波特率設(shè)置較難達(dá)到一致,這時(shí)的設(shè)計(jì)原則應(yīng)使兩個(gè)通信設(shè)備之間的波特率誤差小于2.5%。常用的串行接口波特率、晶振頻率以及各參數(shù)的關(guān)系如下表所示。表常用波特率、晶振頻率與定時(shí)器(T1)的參數(shù)關(guān)系串口工作方式及波特率/(bit/s)fosc/MHzSMOD定時(shí)器(T1)

C/T工作方式初值方式01MHz12無關(guān)方式2375kHz121無關(guān)方式1方式362.5kHz12102FFH19.2kHz11.0592102FDH9600Hz11.0592002FDH4800Hz11.0592002FAH2400Hz11.0592002F4H1200Hz11.0592002E8H1.多機(jī)通信原理

串行口控制寄存器SCON中的SM2為多機(jī)通信接口控制位。串行口以方式2或3接收時(shí),若SM2為1,則僅當(dāng)接收到的第9位數(shù)據(jù)RB8為

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論