第5章80C51基本功能_第1頁(yè)
第5章80C51基本功能_第2頁(yè)
第5章80C51基本功能_第3頁(yè)
第5章80C51基本功能_第4頁(yè)
第5章80C51基本功能_第5頁(yè)
已閱讀5頁(yè),還剩82頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第5章章 80C51基本功能單元結(jié)構(gòu)與操基本功能單元結(jié)構(gòu)與操作原理作原理v5.1 定時(shí)定時(shí)/計(jì)數(shù)器計(jì)數(shù)器v5.2 串行接口串行接口v5.3 中斷系統(tǒng)中斷系統(tǒng)5.2 串行接口串行接口 80C51單片機(jī)有一個(gè)可編程的全雙工串行通信接口。通過軟件編程它可以用作通用異步接收和發(fā)送器UART,同時(shí)接收和發(fā)送數(shù)據(jù)(時(shí)鐘同步,時(shí)鐘不同步);也可以用作同步移位寄存器。其幀格式可有8位、10位和11位,并能設(shè)置成多種波特率。5.2.1 串行口的結(jié)構(gòu)和工作原理串行口的結(jié)構(gòu)和工作原理5.2.1.1 串行口結(jié)構(gòu) 80C51串行口結(jié)構(gòu)如圖5-7所示。它主要由兩個(gè)數(shù)據(jù)緩沖寄存器和一個(gè)輸入移位寄存器組成。發(fā)送數(shù)據(jù)緩沖器只

2、能寫入,不能讀出;接收數(shù)據(jù)緩沖器只能讀出,不能寫入。故兩個(gè)緩沖器共用同一個(gè)符號(hào)(SBUF),占用同一個(gè)地址(99H)。CPU寫SBUF,一方面修改發(fā)送緩沖器,一方面啟動(dòng)串行發(fā)送;CPU讀SBUF,就是讀接收寄存器。此外串行口中還有兩個(gè)特殊功能寄存器SCON、PCON,分別用來控制串行口的工作方式和波特率。發(fā)送SBUF(99H)發(fā)送SBUF(99H)定時(shí)器T1門發(fā)送控制器接收控制器輸入移位寄存器+(98H)串行控制寄存器888串行口中斷TIRI內(nèi)部總線TXD(P3.1)RXD(P3.0) 80C51串行口通過編程可設(shè)置串行口通過編程可設(shè)置4種工作方式,三種幀格式。種工作方式,三種幀格式。方式方式

3、0以以8位數(shù)據(jù)為一幀,不設(shè)起始位和停止位,先發(fā)送或接位數(shù)據(jù)為一幀,不設(shè)起始位和停止位,先發(fā)送或接收最低位。其幀格式如下:收最低位。其幀格式如下:方式方式1以以10位數(shù)據(jù)為一幀傳輸,設(shè)有一個(gè)起始位位數(shù)據(jù)為一幀傳輸,設(shè)有一個(gè)起始位“0”,8 個(gè)數(shù)個(gè)數(shù)據(jù)位和一個(gè)停止位據(jù)位和一個(gè)停止位“1”。其幀格式為:。其幀格式為: 方式方式2和和3以以11位數(shù)據(jù)為一幀傳輸,設(shè)有一個(gè)起始位位數(shù)據(jù)為一幀傳輸,設(shè)有一個(gè)起始位“0”,8個(gè)數(shù)據(jù)位,個(gè)數(shù)據(jù)位,1個(gè)可編程位(第九位數(shù)據(jù))個(gè)可編程位(第九位數(shù)據(jù))D8和一個(gè)停止位和一個(gè)停止位“1”。其幀格式如下:其幀格式如下: 可編程位可編程位D8由軟件置由軟件置“1”或清或清“

4、0”,該位可作校驗(yàn)位,也可,該位可作校驗(yàn)位,也可作他用。作他用。5.2.1.2 串行口控制寄存器 SCON用于確定串行通道的工作方式選擇、接收和發(fā)送控制以及串行口的狀態(tài)標(biāo)志。其格式及功能如下: (1)SM0和SM1:工作方式控制位,可構(gòu)成以下4 種工作方式: (2)SM2:在方式2和方式3中用于多機(jī)通信控制。當(dāng)方式2或方式3處于接收時(shí),若SM2=1,且接收到第9位RB8為0時(shí),RI不置“1”,若SM2=1,且RB8為1時(shí),則RI置“1”。 在方式1中,當(dāng)處于接收時(shí),若SM2=1,則只有接收到有效的停止位時(shí),RI才置“1”。 在方式0中,SM2應(yīng)置0。 (3)REN:允許串行接收控制位。用軟件置

5、“1”或清“0”。REN=1時(shí),允許接收,REN=0時(shí),禁止接收。 (4)TB8:在方式2和方式3中,它是準(zhǔn)備發(fā)送的第9個(gè)數(shù)據(jù)位。根據(jù)需要可用軟件置“1”或清“0”。它可作為數(shù)據(jù)的奇偶校驗(yàn)位,或在多機(jī)通信中作為地址幀或數(shù)據(jù)幀的標(biāo)志。 (5)RB8:在方式2和方式3中,它是接收到的第9個(gè)數(shù)據(jù)位。既可以作為約定好的奇偶校驗(yàn)位,也可以作為多機(jī)通信時(shí)的地址幀或數(shù)據(jù)幀的標(biāo)志。 (6)TI:發(fā)送中斷標(biāo)志位。在工作方式0中,發(fā)送完8位數(shù)據(jù)后,由硬件置“1”,向CPU申請(qǐng)發(fā)送中斷。CPU響應(yīng)中斷后,必須用軟件清“0”,在其工作方式中,它在停止位開始發(fā)送時(shí)由硬件置“1”,同樣必須用軟件清“0”。 (7)RI:接

6、收中斷標(biāo)志位。在工作方式0中,接收完8位數(shù)據(jù)后,由硬件置“1”,向CPU申請(qǐng)接收中斷。CPU響應(yīng)中斷后,必須用軟件清“0”,在其他工作方式中,在接收到停止位的中間時(shí)刻由硬件置“1”,向CPU申請(qǐng)中斷,表示一幀數(shù)據(jù)接收結(jié)束,并已裝入緩沖器,要求CPU取走數(shù)據(jù)。CPU響應(yīng)中斷,取走數(shù)據(jù)后必須由軟件清“0”,解除中斷請(qǐng)求,準(zhǔn)備接收下一幀數(shù)據(jù)。 串行發(fā)送中斷標(biāo)志與接收中斷標(biāo)志是同一個(gè)中斷源,在全雙工通信時(shí),必須用軟件來判斷是發(fā)送中斷請(qǐng)求還是接收中斷請(qǐng)求。 SCON的地址是98H,可以位尋址。復(fù)位時(shí),SCON所有位均清“0”。5.2.1.3 電源控制寄存器 PCON是為了在CHMOS的80C51單片機(jī)上

7、實(shí)現(xiàn)電源控制而設(shè)置的,其中只有一位SMOD與串行口工作有關(guān)。它的格式與功能如下: SMOD稱為波特率選擇位。在工作方式1、工作方式2和工作方式3時(shí),若SMOD=1,則波特率提高一倍,若SMOD=0,則波特率不加倍。整機(jī)復(fù)位時(shí)SMOD=0(串行口每秒鐘發(fā)送/接收的位數(shù)稱為波特率)。 5.2.2 串行通信的工作方式 串行通信的工作方式包括: 5.2.2.1 工作方式0 在方式0下,串行口作同步移位寄存器使用,其波特率為fosc/12,即振蕩器頻率的1/12,固定不變。串行數(shù)據(jù)由RXD(P3.0)端輸入或輸出。同步移位脈沖由TXD(P3.1)端送出。這種方式常用于擴(kuò)展I/O口。 發(fā)送時(shí),當(dāng)一個(gè)數(shù)據(jù)寫

8、入發(fā)送緩沖寄存器SBUF(99H)時(shí),即啟動(dòng)發(fā)送。串行口把8位數(shù)據(jù)以fosc/12的波特率從RXD送出,低位在前,高位在后,發(fā)送完置中斷標(biāo)志TI為“1”。具體接線如圖5-8所示,其中74HC164是“串入并出”移位寄存器。圖5-8 方式0用于I/O擴(kuò)展輸出數(shù)據(jù)輸出74HC164D73D64D55D46D013D211D310D112128RXDTXD80C51移位脈沖 接收時(shí),REN是串行口允許接收控制位。REN=0,禁止接收,REN=1,允許接收。當(dāng)軟件置REN為“1”時(shí),即開始從RXD以fosc/12的波特率輸入數(shù)據(jù)(低位在前),當(dāng)接收到8位數(shù)據(jù)時(shí),置中斷標(biāo)志RI為“1”。具體接線如圖5-

9、9所示,其中74HC165是“并入串出”移位寄存器。 串行控制寄存器中TB8和RB8位在方式0中未用。每當(dāng)發(fā)送或接收完8位數(shù)據(jù)時(shí),由硬件將發(fā)送中斷TI或接收中斷RI標(biāo)志置位。CPU響應(yīng)TI或RI中斷請(qǐng)求后,不會(huì)清除TI或RI標(biāo)志,必須由用戶用軟件清“0”。方式0時(shí)SM2位必須為“0”。圖5-9 方式0接收接線圖數(shù)據(jù)輸出74HC165D06D15D24D33D711D513D414D61292RXDTXD80C51移位脈沖 5.2.2.2 方式1 在方式1下,串行口為10位通用異步接口。發(fā)送或接收一幀信息,包括1位起始位“0”,8位數(shù)據(jù)和1位停止位“1”。其傳送波特率可調(diào)。 發(fā)送時(shí),數(shù)據(jù)從引腳T

10、XD(P3.1)端出,當(dāng)數(shù)據(jù)寫入發(fā)送緩沖寄存器SBUF時(shí),即啟動(dòng)發(fā)送器發(fā)送。當(dāng)發(fā)送完一幀數(shù)據(jù)后,就把TI標(biāo)志置“1”,并申請(qǐng)中斷。 接收時(shí),由REN置“1”,允許接收。串行口采樣引腳RXD(P3.0),當(dāng)采樣“1”至“0” 的跳變后,確認(rèn)是起始位“0”,就開始接收一幀數(shù)據(jù),當(dāng)RI=0且停止位為“1”或者SM2=0時(shí),停止位進(jìn)入RB8位,同時(shí)置位中斷標(biāo)志RI;否則信息丟失。所以方式1接收時(shí),應(yīng)先用軟件清除RI或SM2標(biāo)志。 5.2.2.3 方式2 在方式2下,串行口為11位異步通信接口。發(fā)送或接收一幀信息,包括1位起始位“0”,8位數(shù)據(jù)位,1位可編程位和1位停止位“1”。其傳送波特率與SMOD有

11、關(guān)。 發(fā)送前,先根據(jù)通信協(xié)議由軟件設(shè)置TB8(如作奇偶校驗(yàn)位或地址/數(shù)據(jù)指針標(biāo)識(shí)位),然后將要發(fā)送的的數(shù)據(jù)寫入SBUF即啟動(dòng)發(fā)送器。 發(fā)送過程是由執(zhí)行任何一條以SBUF作為目的寄存器的指令而啟動(dòng)的。寫SBUF信號(hào),把8位數(shù)據(jù)裝入SBUF,同時(shí)還把TB8裝到發(fā)送移位寄存器的第9位位置上,并通知發(fā)送控制器:要求進(jìn)行一次發(fā)送。然后即從TXD(P3.1)端輸出一幀信息。 接收時(shí),由REN置“1”,允許接收,同時(shí)將RI清“0”。在滿足這個(gè)條件的前提下,再根據(jù)SM2的狀態(tài)和所接收到的RB8的狀態(tài)才能決定此串行口在信息到來后是否會(huì)使RI置“1”,并申請(qǐng)中斷,接收數(shù)據(jù)。 當(dāng) SM2=0時(shí),不管RB8為“0”,

12、還是為“1”,RI都置“1”,此串行口將接收發(fā)來的信息。 當(dāng)SM2=1,且RB8為“1”時(shí),表示在多機(jī)通信情況下,接收的信息為地址幀,此時(shí)RI置“1”。串行口將接收發(fā)來的信息。 當(dāng)SM2=1,且RB8為0時(shí),表示接收的信息為數(shù)據(jù)幀,但不是發(fā)給本從機(jī)的,此時(shí)RI不置“1”,因而所接收的數(shù)據(jù)幀將丟失。 5.2.2.4 方式3 方式3為波特率可變的11位異步通信方式。除波特率外,方式3和方式2完全相同。5.2.2.5 多機(jī)通信 80C51的方式2和方式3有一個(gè)專門的應(yīng)用領(lǐng)域,即多機(jī)通信。這一功能使它可以方便地應(yīng)用于集散式分布系統(tǒng)中。這種系統(tǒng)采用一臺(tái)主機(jī)和多臺(tái)從機(jī),它們的通信方式之一如圖 5-10所示

13、。圖5-10 多機(jī)通信連接圖80C51TXDRXD主機(jī)TXDRXD80C510#從機(jī)TXDRXD80C511#從機(jī)TXDRXD80C512#從機(jī) 多機(jī)通信的實(shí)現(xiàn),主要靠主、從機(jī)之間正確地設(shè)置與判斷多機(jī)通信控制位SM2和發(fā)送或接收的第9數(shù)據(jù)位(D8)。以下簡(jiǎn)述如何實(shí)現(xiàn)多機(jī)通信。 在編程前,首先要給各從機(jī)定義一個(gè)地址字節(jié),以辨認(rèn)從機(jī)。地址字節(jié)和數(shù)據(jù)字節(jié)可用第9數(shù)據(jù)位來區(qū)別,前者的第9位為1,而后者的第9位為0。所以,在主機(jī)發(fā)送地址幀時(shí),地址/數(shù)據(jù)標(biāo)識(shí)位TB8應(yīng)設(shè)置為“1”,以表示是地址幀。例如,可以這樣編寫指令:MOV SCON,0D8H ;設(shè)串行口為方式3,TB8置“1”,允許接收 此時(shí),所有的

14、從機(jī)初始化時(shí)均置SM2=1,使它們只處于接收地址幀的狀態(tài)。例如,從機(jī)中可以編寫這樣的指令:MOV SCON,0F0H ;置串行口為方式3,SM2=1,允許接收 當(dāng)從機(jī)接收到從主機(jī)發(fā)來的信號(hào)后,第9位RB8若為“1”,則置位中斷標(biāo)志RI,中斷后判斷主機(jī)送來的地址與本機(jī)地址是否相符。若相符,則被尋址的從機(jī)就清除其SM2標(biāo)志,即SM2=0,準(zhǔn)備接收即將從主機(jī)送來的數(shù)據(jù)幀,未被選中的從機(jī)仍保持SM2=1。 當(dāng)主機(jī)發(fā)送數(shù)據(jù)幀時(shí),由于TB8=0,雖然各從機(jī)都接收到,但只有SM2=0的那個(gè)被尋址的從機(jī)才能接收到數(shù)據(jù),那些未被選中的從機(jī)將不理睬進(jìn)入到串行口的數(shù)據(jù)字節(jié),繼續(xù)進(jìn)行它們自己的工作,直到一個(gè)新的地址字

15、節(jié)到來,這樣就實(shí)現(xiàn)了主機(jī)控制的主從機(jī)之間的通信。綜上所述,通信只能在主從機(jī)之間進(jìn)行,從機(jī)之間的通信只有經(jīng)主機(jī)才能實(shí)現(xiàn)。多機(jī)之間的通信過程可歸納如下:(1)主、從機(jī)均初始化為方式2或方式3,置SM2=1,允許中斷。(2)主機(jī)置TB8=1,發(fā)送要尋址的從機(jī)地址。(3)所有從機(jī)均接收主機(jī)發(fā)送的地址,并進(jìn)行地址比較。(4)被尋址的從機(jī)確認(rèn)地址后,置本機(jī)SM2=0,向主機(jī)返回地址,供主機(jī)核對(duì)。(5)核對(duì)無誤后,主機(jī)向被尋址的從機(jī)發(fā)送命令,通知從機(jī)接收或發(fā)送數(shù)據(jù)。(6)通信只能在主、從機(jī)之間進(jìn)行,兩從機(jī)之間通信要通過主機(jī)作中介。(7)本次通信結(jié)束后,主、從機(jī)重置SM2=1,主機(jī)可再對(duì)其他從機(jī)尋址。 在實(shí)際

16、應(yīng)用中,因?yàn)閱纹瑱C(jī)功能有限,因而在較大的測(cè)控系統(tǒng)中,常常把單片機(jī)應(yīng)用系統(tǒng)作為前端機(jī)(也稱為下位機(jī)或從機(jī))直接用于控制對(duì)象的數(shù)據(jù)采集與控制,而把PC機(jī)作為中央處理機(jī)(也稱為上位機(jī)或主機(jī))用于數(shù)據(jù)處理和對(duì)下位機(jī)的監(jiān)控管理。它們之間的信息交換主要是采用串行通信,此時(shí)單片機(jī)可直接利用其串行接口,而PC機(jī)可利用其配置的8255或8251、16450等可編程串行接口芯片。實(shí)現(xiàn)單片機(jī)與PC機(jī)之間串行通信的關(guān)鍵是在通信協(xié)議的約定上要一致,例如,應(yīng)設(shè)定相同的波特率及幀格式等。在正式工作之前,雙方應(yīng)先互發(fā)聯(lián)絡(luò)信號(hào),以確保通信收發(fā)數(shù)據(jù)的準(zhǔn)確性。 此外,還有一點(diǎn)需注意的是,如果是多臺(tái)單片機(jī)與PC機(jī)通信,80C51機(jī)可

17、采用多機(jī)通信工作方式,而PC機(jī)的串行接口芯片不具備多機(jī)通信功能,其11位幀格式中的第9位是奇偶位。為能實(shí)現(xiàn)80C51機(jī)中TB8的功能,可以通過靈活運(yùn)用這些接口芯片,用軟件實(shí)現(xiàn)上述功能。具體方法是對(duì)8250等串行接口芯片進(jìn)行初始化時(shí),使其通信線路控制寄存器的D5=D3=1,在發(fā)送地址時(shí),置D4=0(則奇偶位為1);在發(fā)送數(shù)據(jù)時(shí),置D4=1(則奇偶位為0)。由此可實(shí)現(xiàn)PC機(jī)與80C51單片機(jī)的多機(jī)通信。5.2.3 串行口應(yīng)用舉例串行口應(yīng)用舉例5.2.3.1 用串行口擴(kuò)展I/O口 串行口的方式0主要用于擴(kuò)展并行I/O口。(1)用并行輸入8位移位寄存器74HC165作擴(kuò)展輸入口 例55 圖5-11是利

18、用80C51的3根口線擴(kuò)展為16根輸入口線的實(shí)用電路,由2塊74HC165串接而成(前級(jí)的數(shù)據(jù)輸出QH與后級(jí)的信號(hào)輸入端SIN相連)?,F(xiàn)編程從16位擴(kuò)展口讀入20個(gè)字節(jié)數(shù)據(jù),并把它們轉(zhuǎn)存到內(nèi)部RAM的50H63H單元中。v圖5-11 利用串行口擴(kuò)展輸入口74HC165D06D15D24D33D711D513D414D612QHP3.0P3.180C51圖5-10SIN12816+5V74HC165D06D15D24D33D711D513D414D612QH12816+5VP1.0S/LCKS/LCK99解 根據(jù)題意,編程如下: MOV R7,#20 ;設(shè)置讀入字節(jié)數(shù) MOV R0,#50 ;設(shè)

19、片內(nèi)RAM指針 SETB F0 ;設(shè)置讀入字節(jié)奇偶數(shù)標(biāo)志RCV0: CLR P1.0 ;并行輸入數(shù)據(jù) SETB P1.0 ;允許串行移位RCV0:MOV SCON,#10H ;設(shè)串行口方式0并啟動(dòng)接收 JNB RI,$ ;等待接收一幀數(shù)據(jù) CLR RI ;清接收中斷標(biāo)志 MOV A,SBUF ;取緩沖器數(shù)據(jù) MOV R0,A INC R0 CPL F0 JB F0,RCV2 ;判是否接收完偶數(shù)幀,接收完則重新并行置入 DEC R7 SJMP RCV1 ;否則再接收一幀數(shù)RCV2:DJNZ R7,RCV0 ;判是否已讀入預(yù)定的字節(jié)數(shù) ;對(duì)讀入數(shù)據(jù)進(jìn)行處理 程序中F0用來讀入字節(jié)數(shù)的奇偶性標(biāo)志。由

20、于每次由擴(kuò)展口并行置入到移位寄存器的是兩個(gè)字節(jié)數(shù)據(jù),置入一次,串行口應(yīng)接收兩幀數(shù)據(jù),故已接收的數(shù)據(jù)字節(jié)數(shù)為奇數(shù)時(shí)F0=0,不再并行置入數(shù)據(jù)就直接啟動(dòng)接收過程,否則F0=1,則調(diào)動(dòng)接收過程前,應(yīng)該先在外部移位寄存器中置入新的數(shù)據(jù)。 (2)用8位并行輸出串行移位寄存器74HC164作擴(kuò)展輸出口。 例5.6 圖5-12是利用74HC164擴(kuò)展為16根輸出口線的實(shí)用電路。由于74HC164無并行輸出控制端,在串行輸入過程中,其輸出端的狀態(tài)會(huì)不斷變化,故在某些使用場(chǎng)合,在74HC164與輸出裝置之間,還應(yīng)加上輸出可控的緩沖級(jí)(如74HC244),以便串行輸入過程結(jié)束后再輸出。 圖中的輸出裝置是2位共陽(yáng)極

21、七段顯示發(fā)光二極管,采用靜態(tài)顯示方式。由于74HC164在低電平輸出時(shí),允許通過的電流可達(dá)8mA,故不需再加驅(qū)動(dòng)電路。與動(dòng)態(tài)掃描顯示比較,靜態(tài)顯示方式的優(yōu)點(diǎn)是CPU不必頻繁地為顯示服務(wù),軟件設(shè)計(jì)比較簡(jiǎn)單,很容易做到顯示不閃爍。圖5-12 利用串行口擴(kuò)展輸出口74HC1643 4 5 613111012P3.0P3.180C51圖5-11899P1.0CLR1,2A,B共陽(yáng)極LED. g f e d c b a147VCC74HC1643 4 5 6131110128CLR1,2A,B共陽(yáng)極LED. g f e d c b a147VCC7CKCK7+5V 編程把片內(nèi)20H、21H中的數(shù)字取出,

22、由串行口送給顯示器,顯示相應(yīng)的數(shù)字。解 根據(jù)題意,編程如下: MOV R7,#2 ;設(shè)置顯示位數(shù) MOV R0,#50 ;設(shè)顯示數(shù)據(jù)區(qū)指針 MOV SCON,#00H ;設(shè)串行口方式0DISP1:MOV A,R0 ADD A,#0BH ;設(shè)置偏移值 MOVC A,A+PC ;取X段顯示碼 MOV SBUF,A ;調(diào)動(dòng)串行口發(fā)送過程 JNB TI,$ ;等待接收一幀數(shù)據(jù) CLR TI ;清串行口發(fā)送中斷標(biāo)志 INC R0 ;修改指針取下一個(gè)數(shù) DJNZ R7,DISP1 RETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H ;0,1,2,3,4的顯示代碼 DB 92H,82H,0

23、F8H,80H,98H ;5,6,7,8,9的顯示代碼5.2.3.2 用串行口進(jìn)行異步通信 例5.7 編程把片內(nèi)40H4FH單元中數(shù)據(jù)串行發(fā)送,定義為方式2,TB8作為奇偶校驗(yàn)位,在數(shù)據(jù)寫入發(fā)送器之前,先將數(shù)據(jù)的奇偶位寫入TB8,這時(shí)第9位數(shù)據(jù)作為奇偶校驗(yàn)用。解 :根據(jù)題意,編程如下: MOV SCON,#80H ;設(shè)串行口方式2 MOV PCON,#80H ;波特率為Fosc/32 MOV R0,40H ;設(shè)片內(nèi)指針 MOV R2,10H ;數(shù)據(jù)長(zhǎng)度送R2LOOP:MOV A,R0 ;取數(shù)據(jù)送A MOV C,P ;奇偶位送TB8 MOV TB8,C MOV SBUF,A ;啟動(dòng)發(fā)送WAIT:

24、 JBC TI,CONT ;判斷發(fā)送中斷標(biāo)志 SJMP WQITCONT:INC R0 DJNZ R2,LOOP例5.8 :用工作方式2編制一個(gè)串行口接收程 序,校對(duì)奇偶 校驗(yàn)位,并進(jìn)行接收正確和接收錯(cuò) 誤的判斷和處理。解 :根據(jù)題意,程序如下: MOV SCON,#90H ;設(shè)置工作方式2,并允許接收LOOP:JBC RI,READ ;等待接收數(shù)據(jù)并清RI SJMP LOOPREAD:MOV A,SBUF ;讀入一幀數(shù)據(jù) JB PSW.0 ONE ;判斷接收端奇偶 JB RB8,ERR ;判斷發(fā)送端奇偶 SJMP RIGHTONE: JNB RB8,ERR ;數(shù)據(jù)長(zhǎng)度送R2RIGHT: ;接

25、收正確ERR: ;接收錯(cuò)誤 當(dāng)接收到一個(gè)字符時(shí),從SBUF送到累加器A中會(huì)產(chǎn)生接收端的奇偶值,而保存在RB8中的值為發(fā)送端的奇偶值,若接收正確,兩個(gè)奇偶值應(yīng)相等,否則接收字符有錯(cuò),需通知對(duì)方重發(fā)。 例5.9 雙機(jī)異步通信的連接線路如圖5-13所示。設(shè)甲機(jī)發(fā)送乙機(jī)接收,波特率為2400波特,兩機(jī)晶振均為6MHz。要求甲機(jī)將外部數(shù)據(jù)存儲(chǔ)器4000H40FFH單元的內(nèi)容向乙機(jī)發(fā)送,在發(fā)送數(shù)據(jù)之前將數(shù)據(jù)塊長(zhǎng)度發(fā)送給乙機(jī),發(fā)送完256B后,向乙機(jī)發(fā)送一個(gè)累加和校驗(yàn)。數(shù)據(jù)傳送結(jié)束時(shí),向甲機(jī)發(fā)送一個(gè)狀態(tài)字節(jié),表示傳送是正確還是錯(cuò)誤。圖5-13 雙機(jī)異步通信的連接線路解 因波特率已指定為2400波特,首先需要

26、確定定時(shí)初值和SMOD的值。初值按下式計(jì)算: 此時(shí)若取SMOD=0,則X=249.49249,誤差較大;取SMOD=1,則X=242.98243=F3H,誤差較小。 發(fā)送程序作如下約定:(1)定時(shí)器T1按方式2工作,計(jì)數(shù)初值為F3H,SMOD=1。(2)串行口按方式1工作,允許接收。(3)R6設(shè)為數(shù)據(jù)塊長(zhǎng)度寄存器,R5設(shè)為累加和寄存器。 甲機(jī)發(fā)送程序清單TRT:MOV TMOD,20H ;設(shè)定時(shí)器1工作在方式2 MOV TH1,0F3H ;設(shè)定時(shí)器1的初值 MOV TL1,0F3H SETB TR1 ;啟動(dòng)定時(shí)器1 MOV SCON,50H ;串行口初始化為方式1,允許接收 MOV PCON,

27、80H ;SMOD=1RPT: MOV DPTR,4000H MOV R6,00H ;長(zhǎng)度寄存器初始化 MOV R5,00H ;校驗(yàn)和寄存器初始化 MOV SBUF,R6 ;發(fā)送長(zhǎng)度 JNB TI, ;等待發(fā)送 CLR TIL1: MOVX A,DPTR ;讀取數(shù)據(jù) MOV SBUF,A ;發(fā)送數(shù)據(jù) ADD A,R5 ;形成累加和送至R5 MOV R5,A INC DPTR ;修改地址指針 JNB TI, ;等待發(fā)送 CLR TI DJNZ R6,L1 ;判斷是否發(fā)送完256個(gè)數(shù)據(jù) MOV SBUF,R5 ;發(fā)校驗(yàn)碼 MOV R5,00H JNB TI, CLR TI JNB RI, ;等乙機(jī)

28、回答 CLR RI MOV A,SBUF JZ L8 ;發(fā)送正確則返回 AJMP RPT ;發(fā)送有錯(cuò)則重發(fā)L8:RET乙機(jī)接收程序清單:接收程序的通信約定同發(fā)送程序。RSU:MOV TMOD,20H ;T1初始化 MOV TH1,0F3H MOV TL1,0F3H SETB TR1 MOV SCON,50H MOV PCON,80HRPT:MOV DPTR,4000H JNB RI, CLR RI MOV A,SBUF ;接收發(fā)送長(zhǎng)度 MOV R6,A MOV R5,00H ;累加和寄存器清“0”WTD:JNB RI, CLR RI MOV A,SBUF ;接收數(shù)據(jù) MOVX DPTR,A ;

29、存儲(chǔ)數(shù)據(jù) INC DPTR ;修改地址指針 ADD A,R5 MOV R5,A DJNZ R6,WTD ;未接收完繼續(xù) JNB RI, ;接收校驗(yàn)碼 CLR RI MOV A,SBUF XRL A,R5 ;比較校驗(yàn)碼 MOV R5,00H JZ L6 ;正確則轉(zhuǎn)至R6 MOV SBUF,0FFH ;出錯(cuò)送0FFH JNB TI, CLR TI ALMP RPT ;重新接收 L6: MOV SBUF,00H ;正確回送00H JNB TI, ;發(fā)送完返回 CLR TI RET5.3 中斷系統(tǒng) 在計(jì)算機(jī)與外部設(shè)備交換信息時(shí),存在一個(gè)快速的CPU與慢速的外設(shè)之間的矛盾。若采用查詢方式,則不但占用了C

30、PU的操作時(shí)間,并且響應(yīng)速度慢。此外對(duì)CPU外部隨機(jī)出現(xiàn)的緊急事件,也常常需要CPU馬上響應(yīng)。為解決這個(gè)問題,在計(jì)算機(jī)中引入了中斷技術(shù)。5.3.1 中斷的概念 中斷是通過硬件來改變CPU程序運(yùn)行方向的。計(jì)算機(jī)在執(zhí)行程序的過程中,由于CPU以外的某種原因,需中止當(dāng)前程序的執(zhí)行,而去執(zhí)行相應(yīng)的處理程序,待處理結(jié)束后,再回來繼續(xù)執(zhí)行被中止了的原程序,這種情況稱為中斷。中斷之后所執(zhí)行的程序稱為中斷服務(wù)或中斷處理程序,原來運(yùn)行的程序稱為主程序。主程序被斷開的位置稱為斷點(diǎn)。引起中斷的原因,或發(fā)出中斷申請(qǐng)的來源稱為中斷源。 引入中斷技術(shù)可以實(shí)現(xiàn): (1)使CPU與外設(shè)同步工作。CPU啟動(dòng)外設(shè)工作后,就繼續(xù)執(zhí)

31、行主程序,而外設(shè)把數(shù)據(jù)準(zhǔn)備好后,發(fā)出中斷請(qǐng)求,請(qǐng)求CPU中斷原程序的執(zhí)行,轉(zhuǎn)去執(zhí)行中斷服務(wù)程序,中斷處理完后,CPU恢復(fù)執(zhí)行主程序,外設(shè)也繼續(xù)工作。這樣CPU可指揮多個(gè)外設(shè)同時(shí)工作,大大提高了CPU的利用率; (2)實(shí)時(shí)處理。在實(shí)時(shí)控制中,現(xiàn)場(chǎng)采集到的各種數(shù)據(jù)可在任一時(shí)刻發(fā)出中斷請(qǐng)求。要求CPU及時(shí)處理,若CPU是開放的,則CPU就可馬上對(duì)數(shù)據(jù)進(jìn)行處理; (3)故障處理。若計(jì)算機(jī)在運(yùn)行過程中出現(xiàn)了事先預(yù)料不到的情況或故障時(shí)(如掉電、存儲(chǔ)出錯(cuò)、溢出等),可以利用中斷系統(tǒng)自動(dòng)處理,而不必停機(jī)。5.3.2 80C51單片機(jī)中斷系統(tǒng)單片機(jī)中斷系統(tǒng) 80C51單片機(jī)的中斷系統(tǒng)由與中斷有關(guān)的特殊功能寄存器

32、、中斷入口、順序查詢邏輯電路等組成,其結(jié)構(gòu)框圖如圖5-14所示。 由圖可見,80C51單片機(jī)有5 個(gè)中斷請(qǐng)求源,4個(gè)用于中斷控制的特殊功能寄存器IE、IP、TCON(用6位)和SCON(用2位),可提供兩個(gè)中斷優(yōu)先級(jí),實(shí)現(xiàn)兩級(jí)中斷嵌套。5個(gè)中斷源對(duì)應(yīng)5個(gè)固定的中斷入口地址(矢量地址)。5.3.2.1 中斷請(qǐng)求源 80C51單片機(jī)提供了5 個(gè)中斷請(qǐng)求源,其中2個(gè)為外部中斷請(qǐng)求和,分別由P3.2和P3.3腳輸入 ,兩個(gè)為片內(nèi)定時(shí)/計(jì)數(shù)器T0和T1的溢出中斷請(qǐng)求TF0(TCON.5)和TF1(TCON.7),1個(gè)片內(nèi)串行口發(fā)送或接收中斷請(qǐng)求TI(SCON.1)或RI(SCON.0),這些中斷請(qǐng)求源分

33、別由特殊功能寄存器TCON和SCON的相應(yīng)位鎖存。圖5-14 中斷系統(tǒng)結(jié)構(gòu)框圖中斷轉(zhuǎn)移入口IE0EX0PX0ET0PT0IT0INT001TF0IE1EX1PX1ET1PT1IT1INT101TF1ESPS+TIRI高優(yōu)先級(jí)中斷轉(zhuǎn)移入口低優(yōu)先級(jí)EA圖5-12(TCON)(IE)(IP) (1)定時(shí)/計(jì)數(shù)器控制寄存器TCON。TCON為定時(shí)計(jì)數(shù)器T0、T1的控制寄存器,同時(shí)也鎖存了T0、T1的溢出中斷源和外部中斷請(qǐng)求源等,與中斷有關(guān)的位如下: IT0:外部中斷0觸發(fā)方式控制位。當(dāng)IT0=0時(shí),外部中斷0控制為電平觸發(fā)方式。在此方式下,CPU在每個(gè)機(jī)器周期的S5P2期間采樣(P3.2)的輸入電平,

34、若采到低電平,則認(rèn)為有中斷請(qǐng)求,隨即置位IE0。若采到高電平,則認(rèn)為無中斷請(qǐng)求或中斷請(qǐng)求已清除,隨即對(duì)IE0清“0”。在電平觸發(fā)方式中,CPU響應(yīng)中斷后不能自動(dòng)使IE0清“0”,也不能由軟件使IE0清“0”,故在中斷返回前必須清除引腳上的低電平,否則會(huì)再次響應(yīng)中斷造成出錯(cuò)。 若IT0=1,外部中斷0控制為邊沿觸發(fā)方式。在此方式下,CPU在每個(gè)機(jī)器周期的S5P2期間采樣(P3.2)的輸入電平,若相繼兩次采樣,一個(gè)周期采樣為高電平,接下來的下一個(gè)周期采樣為低電平,則置位IE0,表示外部中斷0正在向CPU請(qǐng)求中斷,直到該中斷被CPU響應(yīng)時(shí),IE0由硬件自動(dòng)清“0”。在邊沿觸發(fā)方式中,為保證CPU在兩

35、個(gè)機(jī)器周期內(nèi)檢測(cè)到先高后低的負(fù)跳變,輸入高低電平的持續(xù)時(shí)間起碼要保持1個(gè)機(jī)器周期。 IE0:外部中斷0標(biāo)志,若IE0=1,則外部中斷0向CPU請(qǐng)求中斷。 IT1:外部中斷1觸發(fā)方式控制位,功能與IT0類似。 IE1:外部中斷1標(biāo)志,功能與IE0類似。 TF0:T0溢出中斷標(biāo)志,在啟動(dòng)T0計(jì)數(shù)后,T0從初值開始加1計(jì)數(shù),當(dāng)計(jì)滿溢出時(shí),由硬件使TF0置1,向CPU申請(qǐng)中斷,CPU響應(yīng)TF0中斷后,由硬件對(duì)TF0清“0”, TF0也可由軟件清“0”(查詢方式)。 TF1:T1溢出中斷標(biāo)志,功能與TF0類似。系統(tǒng)復(fù)位后,TCON各位均清“0”。 (2)串行口控制寄存器SCON。SCON為串行口控制寄存

36、器,字節(jié)地址為98H,SCON的低2位TI和RI鎖存串行口的接收中斷標(biāo)志和發(fā)送中斷標(biāo)志。其格式如下: TI:串行口的發(fā)送中斷標(biāo)志。在串行口以方式0發(fā)送時(shí),每當(dāng)發(fā)送完8位數(shù),由硬件使TI置“1”;若以方式1、方式2或方式3發(fā)送時(shí),在發(fā)送停止位的開始時(shí)使TI置“1”,TI=1表示串行口發(fā)送正在向CPU請(qǐng)求中斷。但CPU響應(yīng)中斷時(shí),不會(huì)對(duì)TI清“0”,必須由軟件清“0”。 RI:串行口的接收中斷標(biāo)志。若串行口接收器允許接收,并以方式0工作,每當(dāng)接到第9位時(shí),使RI置“1”,若以方式1、2、3工作,且SM2=0時(shí),每當(dāng)接到停止位的中間時(shí)使RI置“1”,當(dāng)串行口以方式2或方式3工作,且SM2=1時(shí),僅當(dāng)

37、接收到的第9位數(shù)據(jù)RB8為“1”,且同時(shí)還要在接收到停止位中間時(shí)才使RI置“1”。RI=1表示接收器正在向CPU請(qǐng)求中斷。同樣CPU響應(yīng)中斷時(shí),不會(huì)對(duì)RI清“0”,必須由軟件清“0”。 系統(tǒng)復(fù)位后,SCON各位均清“0”。5.3.2.2 中斷控制 (1)中斷禁止與開放。特殊功能寄存器IE為中斷允許寄存器,通過向IE寫入中斷控制字,控制CPU對(duì)中斷源的開放與屏蔽,以及每個(gè)中斷源是否允許中斷。其格式為: EA:CPU中斷總允許位。當(dāng)EA=1時(shí),CPU允許中斷,每個(gè)中斷源是允許還是禁止,分別由各自的允許位確定,當(dāng)EA=0時(shí),CPU屏蔽所有的中斷要求。 ES:串行口中斷允許位。ES=1,允許串行口中斷

38、,ES=0,禁止串行口中斷。 ET1:T1中斷允許位。ET1=1,允許T1中斷,ET1=0,禁止T1中斷。 EX1:外部中斷1允許位。EX1=1,允許外部中斷1中斷,EX1=0,禁止外部中斷1中斷。 ET0:T0中斷允許位。ET0=1,允許T0中斷,ET0=0,禁止T0中斷。 EX0:外部中斷0允許位。EX0=1,允許外部中斷0中斷,EX0=0,禁止外部中斷0中斷。 系統(tǒng)復(fù)位后,IE中各位均清“0”,禁止所有中斷。 ( 2)中斷優(yōu)先級(jí)設(shè)定。80C51單片機(jī)有兩個(gè)中斷優(yōu)先級(jí),對(duì)于每一個(gè)中斷請(qǐng)求源,可編程為高優(yōu)先級(jí)中斷或低優(yōu)先級(jí)中斷,可實(shí)現(xiàn)二級(jí)中斷嵌套。一個(gè)正在執(zhí)行的低優(yōu)先級(jí)中斷能被高優(yōu)先級(jí)中斷所

39、中斷,但不能被另一個(gè)低優(yōu)先級(jí)中斷所中斷,一直執(zhí)行到結(jié)束,遇到中斷返回指令RETI,返回主程序后再執(zhí)行一條指令才能響應(yīng)新的中斷請(qǐng)求。 特殊功能寄存器IP為中斷優(yōu)先級(jí)寄存器,鎖存各中斷源優(yōu)先級(jí)的控制位,用戶可由軟件設(shè)定。其格式如下: PS:串行口中斷優(yōu)先級(jí)控制位。PS=1,設(shè)定串行口為高優(yōu)先級(jí)中斷,PS=0,串行口為低優(yōu)先級(jí)中斷。 PT1:T1中斷優(yōu)先級(jí)控制位。PT1=1,設(shè)定定時(shí)器T1為高優(yōu)先級(jí)中斷,PT1=0,T1為低優(yōu)先級(jí)中斷。 PX1:外部中斷1中斷優(yōu)先級(jí)控制位。PX1=1,設(shè)定外部中斷1為高優(yōu)先級(jí)中斷,PX1=0,為低優(yōu)先級(jí)中斷。 PT0:T0中斷優(yōu)先級(jí)控制位。PT0=1,設(shè)定定時(shí)器T0

40、為高優(yōu)先級(jí)中斷,PT0=0,T0為低優(yōu)先級(jí)中斷。 PX0:外部中斷0中斷優(yōu)先級(jí)控制位。PX0=1,設(shè)定外部中斷0為高優(yōu)先級(jí)中斷,PX0=0,為低優(yōu)先級(jí)中斷。 系統(tǒng)復(fù)位后,IE中各位均清“0”。各中斷源均為低優(yōu)先級(jí)中斷。 80C51單片機(jī)的中斷系統(tǒng)有兩個(gè)不可尋址的優(yōu)先級(jí)有效觸發(fā)器。其中一個(gè)指示某高優(yōu)先級(jí)的中斷正在執(zhí)行,所有后來申請(qǐng)的中斷都被阻止。另外一個(gè)觸發(fā)器指示某低優(yōu)先級(jí)的中斷正在執(zhí)行,所有的同級(jí)中斷都被阻止,但不阻止高優(yōu)先級(jí)的中斷。 若同時(shí)收到幾個(gè)同一優(yōu)先級(jí)的中斷請(qǐng)求時(shí),CPU通過內(nèi)部硬件查詢邏輯按自然優(yōu)先級(jí)順序確定響應(yīng)哪一個(gè)中斷請(qǐng)求。其自然優(yōu)先級(jí)由硬件形成,排列如下: 中斷源 同級(jí)自然中斷

41、優(yōu)先級(jí) 外部中斷0 最高級(jí) 定時(shí)器T0中斷 外部中斷1 定時(shí)器T1中斷 串行口中斷 最低級(jí) 5.3.2.3 中斷的響應(yīng)條件與響應(yīng)過程 (1)響應(yīng)條件。單片機(jī)響應(yīng)中斷的條件是:中斷源有請(qǐng)求,CPU允許所有中斷源請(qǐng)求中斷(EA=1),中斷允許寄存器IE相應(yīng)位置“1”。這樣,在每個(gè)機(jī)器周期內(nèi),單片機(jī)對(duì)所有中斷源都進(jìn)行順序檢測(cè),并可在任一周期的S6期間,找到所有有效的中斷請(qǐng)求,并對(duì)其優(yōu)先級(jí)排隊(duì),只要滿足下列條件: 1)無同級(jí)或高級(jí)中斷正在服務(wù); 2)現(xiàn)行指令執(zhí)行到最后一個(gè)機(jī)器周期且已結(jié)束; 3)若現(xiàn)行指令為RETI或訪問特殊功能寄存器IE或IP的指令時(shí),執(zhí)行完該指令且緊隨其后的另一條指令也已執(zhí)行完。

42、單片機(jī)便在緊接著的下一個(gè)機(jī)器周期S1期間響應(yīng)中斷,否則將丟棄中斷查詢的結(jié)果。 (2)中斷響應(yīng)過程。單片機(jī)一旦響應(yīng)中斷,首先置位響應(yīng)的優(yōu)先級(jí)有效觸發(fā)器,然后執(zhí)行一個(gè)硬件子程序調(diào)用,把斷點(diǎn)壓入堆棧保護(hù),然后將對(duì)應(yīng)的中斷入口地址值裝入程序計(jì)數(shù)器PC,使程序轉(zhuǎn)向該中斷入口地址,以執(zhí)行中斷服務(wù)程序。 由上可知,單片機(jī)響應(yīng)中斷后,只保護(hù)斷點(diǎn)而不保護(hù)現(xiàn)場(chǎng)(如累加器A、程序狀態(tài)字寄存器PSW的內(nèi)容),且不清除串行口中斷標(biāo)志TI和RI,也無法清除外部中斷請(qǐng)求信號(hào)和,故用戶在編程時(shí)應(yīng)予考慮。80C51單片機(jī)中各中斷源與對(duì)應(yīng)的入口地址如下: 中斷源 入口地址 外部中斷0 0003H 定時(shí)器T0中斷 000BH 外部

43、中斷1 0013H 定時(shí)器T1 中斷 001BH 串行口中斷 0023H 各入口地址之間只相隔8個(gè)字節(jié),一般的中斷服務(wù)程序是容納不下的。通常在中斷服務(wù)程序入口地址處放一條無條件轉(zhuǎn)移指令,這樣可使中斷服務(wù)程序安排在64K空間的任意處。 CPU從以上相應(yīng)的地址開始執(zhí)行中斷服務(wù)程序,直到遇到一條RETI指令為止,若用戶在中斷服務(wù)程序中開始安排了保護(hù)現(xiàn)場(chǎng)指令(相應(yīng)寄存器內(nèi)容壓入堆棧),則在RETI指令前應(yīng)有恢復(fù)現(xiàn)場(chǎng)(相應(yīng)寄存器內(nèi)容彈出堆棧)指令 。5.3.2.4 中斷響應(yīng)時(shí)間 由上述可知,CPU不是在任何情況下都對(duì)中斷請(qǐng)求立即響應(yīng),而且不同的情況對(duì)中斷響應(yīng)的時(shí)間也不同,下面以外部中斷為例,說明中斷響應(yīng)

44、時(shí)間。 外部中斷請(qǐng)求信號(hào)的電平在每個(gè)機(jī)器周期的S5P2期間,經(jīng)反相后鎖存到IE0或IE1標(biāo)志位,CPU在下一個(gè)機(jī)器周期才會(huì)查詢到這些值,這時(shí)如果滿足響應(yīng)條件,CPU響應(yīng)中斷時(shí),需執(zhí)行一條兩個(gè)機(jī)器周期的調(diào)用指令,以轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序入口。這樣從外部中斷請(qǐng)求有效到開始執(zhí)行中斷服務(wù)程序的第一條指令至少需要3個(gè)機(jī)器周期。 如果在申請(qǐng)中斷時(shí),CPU正在處理最長(zhǎng)指令(如乘、除法指令),則額外等待時(shí)間增加3個(gè)機(jī)器周期,若正在執(zhí)行RETI或訪問IE、IP指令,則額外等待時(shí)間又增加2個(gè)機(jī)器周期。 綜合估算,若系統(tǒng)中只有一個(gè)中斷源,則響應(yīng)時(shí)間為38個(gè)機(jī)器周期。5.3.3 5.3.3 中斷系統(tǒng)應(yīng)用舉例中斷系統(tǒng)應(yīng)

45、用舉例 例5.10 晶振Fosc=6MHz利用T0產(chǎn)生周期為2ms方波,由P1.0輸出。要求采用中斷方式處理。解 : 根據(jù)題意,定時(shí)/計(jì)數(shù)器T0采用方式1,定時(shí)值為1ms,其初值計(jì)算如下:機(jī)器周期T=12/Fosc=12/6106s=2s則T0的初值為:X=216-1000/2=65036即:X=65036D=0FE0CH=1111111000001100B則:(TH0)=0FEH,(TL0)=0CH程序編寫如下: ORG 0000H AJMP MAIN ;轉(zhuǎn)主程序 ORG 000BH ;中斷入口地址 MOV TL0,#0CH ;重賦初值 MOV TH1,#0FEH CPL P1.0 ;輸出取

46、反 RETI ;中斷返回MAIN: TMOD,#01 ;T0初始化 MOV TL0,#0CH ;賦初值 MOV TH0,#0FEH MOV IE,#82H ;CPU開中斷,T0開中斷HERE: SJMP HERE 例5.11 利用定時(shí)器作外部中斷源。 80C51內(nèi)部有兩個(gè)定時(shí)/計(jì)數(shù)器,它們可以改用外部中斷源。當(dāng)它們選擇計(jì)數(shù)方式時(shí),T0或T1引腳上的負(fù)跳變將使T0或T1計(jì)數(shù)器加1計(jì)數(shù),若計(jì)數(shù)初值設(shè)定為滿量程,即全1狀態(tài),則T0或T1引腳上的一個(gè)負(fù)跳變即可觸發(fā)溢出中斷。此時(shí)的TF0或TF1作為外部中斷標(biāo)志。 以T1為例,將其作為外部中斷源的程序如下: MOV TMOD,60H ;置T1為計(jì)數(shù)方式2

47、 MOV TH1,F(xiàn)FH ;置計(jì)數(shù)初值 MOV TL1,F(xiàn)FH SETB EA ;開CPU中斷 SETB ET1 ;允許T1中斷 SETB TR1 ;啟動(dòng)T1計(jì)數(shù) 此例T1端作外部中斷請(qǐng)求輸入端,中斷的同時(shí),0FFH可以自動(dòng)加載到TL0上 例5.12 利用中斷和查詢相結(jié)合擴(kuò)展中斷源。 當(dāng)外部中斷源比較多時(shí),可以在80C51的一個(gè)外部中斷請(qǐng)求輸入端“線或”多個(gè)中斷源,這些中斷源同時(shí)分別接到輸入端口的各位,其電路如圖5-15所示。 圖5-15中IE1IE4為中斷源,它們同時(shí)分別接到P1.0P1.3,平時(shí)IE1IE4都為低電平端為無效高電平。當(dāng)IE1IE4信號(hào)中有一個(gè)以上變?yōu)楦唠娖胶?,端變?yōu)榈碗娖剑?/p>

48、產(chǎn)生中斷請(qǐng)求。在中斷服務(wù)程序中CPU對(duì)P1.0P1.3腳進(jìn)行查詢,確定其中哪一個(gè)中斷源產(chǎn)生了請(qǐng)求以轉(zhuǎn)到相應(yīng)的服務(wù)程序中去。在這樣方式中查詢的順序決定了中斷優(yōu)先級(jí)的順序。設(shè)IE1IE4的中斷服務(wù)程序的入口地址分別為INT1INT4,中斷服務(wù)程序和查詢程序如下: ORG 000BH AJMP IT IT: PUSH ACC ;保護(hù)現(xiàn)場(chǎng)信息 PUSH PSW JNB P1.0,T2 ;順序查詢中斷源 ACALL INT1T2: JNB P1.1,T3 ACALL INT2T3: JNB P1.2,T4 ACALL INT3T4: JNB P1.3,T5 ACALL INT4T5: POP PSW P

49、OP ACC RETIINT1: ;EI1中斷服務(wù)子程序 RET INT2: ;EI2中斷服務(wù)子程序 RET INT3: ;EI3中斷服務(wù)子程序 RET INT4: ;EI4中斷服務(wù)子程序 RET 例5.13 利用定時(shí)中斷抗干擾。 單片機(jī)應(yīng)用系統(tǒng)開發(fā)完成后,在工作現(xiàn)場(chǎng)由于系統(tǒng)本身的噪聲干擾、電磁干擾、過壓干擾以及環(huán)境干擾等原因,往往會(huì)出現(xiàn)“死機(jī)”現(xiàn)象。解決的辦法有多種,這里介紹利用定時(shí)中斷防止“死機(jī)”的方法。 設(shè)計(jì)思想是先估算系統(tǒng)主程序執(zhí)行一次循環(huán)所需時(shí)間t,然后把定時(shí)器T0或T1的定時(shí)時(shí)間取得比t稍大,并在主程序中包含對(duì)定時(shí)器的初始化程序,這樣,如果系統(tǒng)主程序運(yùn)行正常,因定時(shí)時(shí)間比t大,故在

50、定時(shí)時(shí)間還未到時(shí),主程序已完成一次循環(huán),T0或T1被重新初始化,使定時(shí)時(shí)間常數(shù)重新置入其中,故不會(huì)產(chǎn)生溢出中斷。若應(yīng)用系統(tǒng)由于干擾失控,主程序不能正常循環(huán)運(yùn)行,T0或T1不能及時(shí)初始化,則經(jīng)過時(shí)間t后,T0或T1必將產(chǎn)生溢出中斷,轉(zhuǎn)入中斷服務(wù)程序,這表明程序運(yùn)行出現(xiàn)故障,用戶可安排中斷服務(wù)程序跳轉(zhuǎn)回主程序需要的地址,以便重新使主程序運(yùn)行。圖5-15 擴(kuò)展多中斷源接口電路EI0EI1EI2EI3EI4+5V1NT01NT1P1.0P1.1P1.2P1.380C51圖5-13 將T1設(shè)置為工作方式2,晶振頻率為6MHz,防止“死機(jī)”的程序如下: SETB ET1 ;T1開中斷 SETB PT1 ;

51、T1中斷設(shè)置為高優(yōu)先 SETB EA ;CPU 開中斷 MOV TL1,#data ;T1賦初值(根據(jù)t) MOV TH1,#data MOV TMOD #20H ;T1工作方式2,定時(shí) SETB TR1 ;啟動(dòng)T1計(jì)數(shù) ORG 001BH ;T1溢出中斷入口地址 POP A ;丟棄PC壓入堆棧的錯(cuò)誤地址 POP A MOV A,#data ;將需轉(zhuǎn)去的主程序地址(2個(gè)字節(jié))送入棧頂 PUSH A MOV A,#data PUSH A RETI ;中斷返回 例5.14 編程實(shí)現(xiàn)一臺(tái)主機(jī)和多臺(tái)(255臺(tái))從機(jī)之間進(jìn)行通信。 解 多機(jī)通信需要符合一定的通信協(xié)議。為敘述方便,在此定如下幾條協(xié)議: (

52、1)系統(tǒng)中255臺(tái)從機(jī)地址分別為0FFH。 (2)地址FFH是對(duì)所有從機(jī)都起作用的一條控制命令:命令各從機(jī)恢復(fù)SM2=1的狀態(tài)。 (3)主機(jī)發(fā)送的控制命令代碼為: 00 要求從機(jī)接收數(shù)據(jù)塊; 01 要求從機(jī)發(fā)送數(shù)據(jù)塊; 其他 非法命令。 (4)數(shù)據(jù)塊長(zhǎng)度:16個(gè)字節(jié)。 (5)從機(jī)狀態(tài)字格式為: 其中,若ERR=1,從機(jī)接受到非法命令; 若TRDY=1,從機(jī)發(fā)送準(zhǔn)備就緒; 若RRDY=1,從機(jī)接收準(zhǔn)備就緒; 下面給出的串行口通信程序是按如下思路編制的。主機(jī)程序部分以子程序的方式給出,要進(jìn)行串行通信時(shí),可以直接調(diào)用這個(gè)子程序。主機(jī)在接受或發(fā)送完一個(gè)數(shù)據(jù)塊后可返回主程序,完成其他任務(wù)。從機(jī)部分以串行

53、口中斷服務(wù)程序的方式給出。若從機(jī)未做好接受或發(fā)送數(shù)據(jù)的準(zhǔn)備,就從中斷程序中返回,在主程序中做好準(zhǔn)備。故主機(jī)在這種情況下不能簡(jiǎn)單地等待從機(jī)準(zhǔn)備就緒,而要重新與從機(jī)聯(lián)絡(luò),使從機(jī)再次進(jìn)入串行口中斷。系統(tǒng)可采用定時(shí)器1作為波特率發(fā)生器,也可采用固定的波特率。主機(jī)和從機(jī)中對(duì)定時(shí)器初始化的程序及定時(shí)器中斷程序從略。圖5-16為多機(jī)通信主機(jī)子程序框圖,圖5-17為多機(jī)通信從機(jī)中斷服務(wù)程序框圖。保護(hù)現(xiàn)場(chǎng)YN地址符合否?命令分類YN是命令幀嗎?YN從機(jī)發(fā)送準(zhǔn)備就緒否?接收數(shù)據(jù)幀從機(jī)接收準(zhǔn)備就緒否?0001NY返回中斷發(fā)回地址接收下一幀RRDY=0送主機(jī)非法命令RRDY=1送主機(jī)TRDY=0送主機(jī)接收完否?NYS

54、M2=1恢復(fù)現(xiàn)場(chǎng)發(fā)送數(shù)據(jù)幀TRDY=1送主機(jī)發(fā)送完否?YN子程序入口串行口初始化發(fā)送地址幀YN從機(jī)應(yīng)答否?YN應(yīng)答地址相符否?發(fā)送命令幀YN從機(jī)應(yīng)答否?YN命令正確否?命令分類YN從機(jī)接收準(zhǔn)備就緒否?接收數(shù)據(jù)塊從機(jī)發(fā)送準(zhǔn)備就緒否?發(fā)送數(shù)據(jù)塊命令從機(jī)復(fù)位0001NY返回圖5-17 多機(jī)通信從機(jī)中斷服務(wù)程序框圖圖5-16 多機(jī)通信主機(jī)子程序框圖(1)主機(jī)串行通信子程序 入口參數(shù):R0 主機(jī)發(fā)送的數(shù)據(jù)塊首址;R1 主機(jī)接受的數(shù)據(jù)塊首址;R2 被尋址從機(jī)地址;R3 主機(jī)命令;R4 數(shù)據(jù)塊長(zhǎng)度 子程序清單如下: MS10: MOVSCON,#0D8H ;設(shè)串行口方式3,允許接受,TB8置“1”MS101

55、:MOVA,F(xiàn)2 ;發(fā)送地址幀 MOVSBUF,A JNBTI,$ CLRTI JNBRI,$ ;等待從機(jī)應(yīng)答 CLRRI MOVA,SBUF XRLA,R2 JZMS103 ;判應(yīng)答地址是否相符MS102:SETB TB8 MOVSBUF,#0FFH ;不相符重新聯(lián)絡(luò) JNBTI,$ CLRTI SJMP MS101 ;轉(zhuǎn)重發(fā)地址 MS103:CLRTB8 ;地址符合,準(zhǔn)備發(fā)送命令 MOVSBUF,R3;發(fā)送命令 JNBTI,$ CLRTI JNBRI,$ ;等待從機(jī)應(yīng)答 CLRRI MOVA,SBUF ;取應(yīng)答信息 JNBACC.7,MS104 ;判斷命令是否出錯(cuò) SJMP MS102 ;

56、若從機(jī)接受命令出錯(cuò),重新聯(lián)絡(luò)MS104:CJNE R3,#00,MS105 ;判斷是否要求從機(jī)接收數(shù)據(jù) JNBACC.0,MS102 ;從機(jī)接收數(shù)據(jù)準(zhǔn)備就緒否LPTX:MOVSBUF,R0 ;主機(jī)發(fā)送數(shù)據(jù)塊 JNBTI,$ ;等待發(fā)送完1幀 CLRTI INCR0 ;修改地址指針 DJNZ R4,LPTX ;判斷數(shù)據(jù)塊是否傳完 RET ;返回主程序MS105: JNBACC.1,MS102 ;從機(jī)發(fā)送數(shù)據(jù)準(zhǔn)備就緒否LPRX: JNBRI,LPRX ;等待接受完1幀 CLRRI MOVA,SBUF ;取出接受到的字符 MOVR1,A INCR1 DJNZ R4,LPRX ;未接受完則繼續(xù) RET

57、 若主機(jī)向10號(hào)從機(jī)發(fā)送數(shù)據(jù)塊,數(shù)據(jù)塊放置在內(nèi)部RAM區(qū)的4041單元中,則主程序調(diào)用子程序的入口條件如下: MOVR2,#0AH MOVR3,#00H MOVR4,#10H MOVR0,#40H LACLL MS10 (2)從機(jī)串行通信程序。 從機(jī)的串行通信采用中斷控制啟動(dòng)方式,串行口中斷服務(wù)程序利用1區(qū)工作寄存器。在串行口通信啟動(dòng)后,仍采用查詢方式來接受或發(fā)送數(shù)據(jù)塊。從機(jī)的初始化程序中應(yīng)包括定時(shí)器1和串行口初始化以及開中斷程序,定時(shí)器1的初始化和開中斷從略。程序中用F0(PSW.5)作發(fā)送準(zhǔn)備就緒標(biāo)志,F(xiàn)1(PSW.1)作接受準(zhǔn)備就緒標(biāo)志。初始化程序的其他有關(guān)部分如下: MOVSP,#1F

58、H ;設(shè)置堆棧指針 MOVSCON,#0F0H;置串行口模式3,SM=1,允許接受 MOV08H,#40H;接受緩沖區(qū)首址送1區(qū)工作寄存器R0 MOV09H,#50H;接受緩沖區(qū)首址送1區(qū)工作寄存器R1 MOV0AH,#10H;接受或接受字節(jié)數(shù)送1區(qū)工作寄存器R2 (3)串行口中斷服務(wù)程序(由0023H轉(zhuǎn)來)SS10:CLRRI PUSH A ;保護(hù)現(xiàn)場(chǎng) PUSH PSW SETB RS0 ;選1區(qū)工作寄存器 CLR RS1 MOVA,SBUF XRLA,#SLAVE ;SLAVE為本地從機(jī)地址 JZ SSI01 ;判斷地址是否符合RETU:POPPSW ;恢復(fù)現(xiàn)場(chǎng) POPA RETISSI0

59、1:CLRSM2 ;地址符合,準(zhǔn)備接受數(shù)據(jù) MOVSBUF,#SLAVE ;從機(jī)地址送主機(jī),準(zhǔn)備核對(duì) JNB TI,$ ;等待發(fā)送完1幀 CLR TI JNB RI,$ ;等待接受完1幀 CLR RI JNB RB8,SSI02 ;是數(shù)據(jù)幀跳轉(zhuǎn) SETB SM2 ;復(fù)位信號(hào),把SM2置“1” SJMP RETUSSI02:MOV A,SBUF ;取命令 CJNE A,#02H,SS1 ;檢查命令是否合法SS1: JC SSI03 ;A02H則繼續(xù) MOV SBUF,#80H;非法命令,置ERR=1 JNB TI,$ ;等待發(fā)送完1幀 CLR TI SJMP RETU ;返回SSI03:JZ C

60、MD0 ;A00H,準(zhǔn)備接受數(shù)據(jù)塊 JB F0,SSI04;發(fā)送準(zhǔn)備就緒否 MOV SBUF,#00H;回答未準(zhǔn)備就緒 JNB TI,$ ;等待發(fā)送完1幀 CLR TI SJMPRETUSSI04:MOVSBUF,#02H;發(fā)送準(zhǔn)備就緒,置TRDY=1 JNBTI,$ CLRTI CLRF0 ;清發(fā)送準(zhǔn)備標(biāo)志LP1: MOVSBUF,R0;發(fā)送數(shù)據(jù)塊 JNBTI,$ CLRTI INCR0 ;修改數(shù)據(jù)指針 DJNZR2,LP1 SETBSM2 ;發(fā)送完,置SM2=1 SJMPRETUCMD0:JBF1,SSI05;判斷接受準(zhǔn)備就緒否 MOVSBUF,#00H;回答未準(zhǔn)備就緒 JNBTI,$ C

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論