《匯編語言程序設(shè)計(jì)(第2版)》第七章 輸入輸出程序設(shè)計(jì)_第1頁
《匯編語言程序設(shè)計(jì)(第2版)》第七章 輸入輸出程序設(shè)計(jì)_第2頁
《匯編語言程序設(shè)計(jì)(第2版)》第七章 輸入輸出程序設(shè)計(jì)_第3頁
《匯編語言程序設(shè)計(jì)(第2版)》第七章 輸入輸出程序設(shè)計(jì)_第4頁
《匯編語言程序設(shè)計(jì)(第2版)》第七章 輸入輸出程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

匯編語言程序設(shè)計(jì)(第2版)第7章輸入/輸出程序設(shè)計(jì)

在本章中講述輸入輸出的基本技術(shù)及相關(guān)概念,應(yīng)重點(diǎn)掌握數(shù)據(jù)信息、狀態(tài)信息、控制信息的含義;端口地址的概念與兩種編址方式;輸入/輸出的四種方式及其特點(diǎn);中斷的概念、中斷源及內(nèi)外部中斷的劃分、中斷矢量表結(jié)構(gòu)、中斷響應(yīng)條件、中斷響應(yīng)過程等內(nèi)容以及能編寫簡(jiǎn)單的中斷服務(wù)程序。7.1工作原理

7.2數(shù)據(jù)的輸入/輸出方式實(shí)訓(xùn)一數(shù)據(jù)采集:查詢方式實(shí)訓(xùn)二PC機(jī)間的相互通信:查詢方式

輸入就是CPU從外設(shè)中讀取信息,輸出就是CPU向外設(shè)寫入信息。程序和各種數(shù)據(jù)都要通過輸入操作才能進(jìn)入計(jì)算機(jī)內(nèi),而計(jì)算結(jié)果或控制指令則要通過輸出操作送給相關(guān)外設(shè)。因此,輸入/輸出操作是CPU訪問的外設(shè)關(guān)鍵環(huán)節(jié)。7.1工作原理7.1.1CPU與外設(shè)的信息交換7.1.2CPU尋址外設(shè)的方式7.1.3數(shù)據(jù)傳送方式第7章輸入/輸出程序設(shè)計(jì)7.1.1CPU與外設(shè)的信息交換CPU與外設(shè)之間要交換的信息,如圖7-1所示。一般情況下,外設(shè)并不直接與CPU相連,而是通過稱為I/O接口的電路與CPU連接。I/O接口一方面起信號(hào)轉(zhuǎn)換作用,使CPU和外設(shè)可以互相“理解”對(duì)方的信號(hào);另一方面匹配雙方的工作速度。

端口地址

數(shù)據(jù)

控制或狀態(tài)

數(shù)據(jù)

控制

狀態(tài)

I/O設(shè)備

I/O接口

CPU

第7章輸入/輸出程序設(shè)計(jì)CPU與I/O接口間通常需要下列接口信號(hào):1.數(shù)據(jù)信息:

數(shù)據(jù)通常為8位或16位,可分為三種基本形式:數(shù)字量、開關(guān)量和模擬量。

由鍵盤、光電輸入機(jī)等提供的二進(jìn)制形式的信息為數(shù)字量。

只有兩個(gè)狀態(tài)的量,如電機(jī)的啟停、開關(guān)的開合等,只須用一位二進(jìn)制數(shù)即可表示,稱為開關(guān)量。

由傳感器等提供的信號(hào)往往是模擬量(連續(xù)變化的信號(hào)),它需先經(jīng)過模數(shù)(A/D)轉(zhuǎn)換后,才能輸入到計(jì)算機(jī)中去。如溫度、電壓等。第7章輸入/輸出程序設(shè)計(jì)2.狀態(tài)信息:指I/O接口反映I/O設(shè)備工作狀態(tài)的信息。如表示輸入裝置是否已準(zhǔn)備好的信息(READY信號(hào)),表示輸出裝置是否忙的信息(BUSY信號(hào))等。3.控制信息:指CPU向I/O設(shè)備發(fā)送的控制其工作的信息。如選通信號(hào)、啟停信號(hào)等。第7章輸入/輸出程序設(shè)計(jì)

這三類信息的性質(zhì)是不同的,必須分別傳送。通常是分配不同的端口地址的方法加以區(qū)別,所以一個(gè)外設(shè)往往要占幾個(gè)端口地址。一般狀態(tài)信息和控制信息往往只有一位或二位,故也常常是狀態(tài)和控制信息共用一個(gè)端口地址。返回本節(jié)首頁返回本章首頁第7章輸入/輸出程序設(shè)計(jì)7.1.2CPU尋址外設(shè)的方式1.端口地址的概念

CPU能夠與內(nèi)存交換數(shù)據(jù),也能與外設(shè)交換數(shù)據(jù),其工作原理是相似的。內(nèi)存單元都進(jìn)行了編址,每一個(gè)字節(jié)的存儲(chǔ)單元占一個(gè)地址,CPU通過在其地址線上發(fā)地址信號(hào)來通知存儲(chǔ)器要與哪一個(gè)存儲(chǔ)單元交換數(shù)據(jù);同樣,計(jì)算機(jī)對(duì)外設(shè)的接口也進(jìn)行了編址,這叫做端口地址。在與I/O接口(有時(shí)也簡(jiǎn)稱為外設(shè),但實(shí)際指的是I/O接口)交換數(shù)據(jù)時(shí),CPU通過在地址線上發(fā)出要訪問外設(shè)的端口地址來指出要與哪個(gè)外設(shè)交換數(shù)據(jù)。第7章輸入/輸出程序設(shè)計(jì)2.兩種編址方式

存儲(chǔ)器有地址,I/O接口也有地址,那么CPU在地址線上發(fā)出的地址是存儲(chǔ)器地址呢?還是I/O接口地址?這就涉及到了I/O接口的編址方式,有兩種方式,如下:第7章輸入/輸出程序設(shè)計(jì)①I/O設(shè)備與存儲(chǔ)器統(tǒng)一編址

這種方式對(duì)二者統(tǒng)一編址,在整個(gè)CPU地址空間中,劃出一部分地址為存儲(chǔ)器地址,另一部分地址為I/O設(shè)備地址。在此編址方式下,CPU將I/O設(shè)備與存儲(chǔ)器同樣看待,因此不需要專門的I/O指令,CPU對(duì)存儲(chǔ)器的全部操作指令均可用于I/O操作,故尋址方式和訪問指令多,而且方便。統(tǒng)一編址的缺點(diǎn)是I/O設(shè)備占用了部分存儲(chǔ)器地址空間,從而減少了存儲(chǔ)器可用地址空間的大小,同時(shí)在程序中不好區(qū)分是訪問存儲(chǔ)器還是訪問I/O設(shè)備。第7章輸入/輸出程序設(shè)計(jì)②I/O設(shè)備獨(dú)立編址

這種方式中存儲(chǔ)器與I/O設(shè)備各有自己獨(dú)立的地址空間,各自單獨(dú)編址,互不相關(guān)。這種方式下硬件上CPU需要一根專門的引腳來指明地址線上的地址是存儲(chǔ)器地址還是I/O設(shè)備地址;軟件上需要專門的輸入輸出指令來訪問I/O設(shè)備。此方式的優(yōu)點(diǎn)是I/O設(shè)備不占存儲(chǔ)器地址空間;缺點(diǎn)是需要專門的I/O指令。返回上一節(jié)返回本章首頁返回本節(jié)首頁第7章輸入/輸出程序設(shè)計(jì)7.1.3數(shù)據(jù)傳送方式

外部設(shè)備多種多樣,不同的設(shè)備需要不同的控制方法。例如:外設(shè)的工作速度高于CPU,則CPU可直接向其發(fā)送或讀取數(shù)據(jù)而不用考慮數(shù)據(jù)丟失問題,而對(duì)慢速外設(shè)則不能這樣。CPU與外設(shè)間交換數(shù)據(jù)的方法,共有四種可供選擇。不同的方法其效率、安全性、復(fù)雜性、成本各不相同,不同的外設(shè)需要不同的數(shù)據(jù)交換方式。下面對(duì)這些方式作簡(jiǎn)要介紹,下節(jié)中進(jìn)行詳述。第7章輸入/輸出程序設(shè)計(jì)1.無條件傳送方式

又稱直接I/O方式,這種方式下,CPU不管外設(shè)的狀態(tài)如何,直接對(duì)其執(zhí)行輸入或輸出操作。

2.查詢方式

采用這種方式,CPU在進(jìn)行輸入輸出前,先檢查外設(shè)提供的READY(準(zhǔn)備好)號(hào)是否有效,若有效,表示外設(shè)可以接受操作,CPU即進(jìn)行操作;若無效,表示外設(shè)暫不能接受操作,CPU則等待。在等待期間,CPU所做的只是循環(huán)檢測(cè)READY信號(hào),一旦發(fā)現(xiàn)其變?yōu)橛行В瑒t立即進(jìn)行操作。第7章輸入/輸出程序設(shè)計(jì)3.中斷方式

這種方式下,CPU執(zhí)行主程序,當(dāng)外設(shè)有數(shù)據(jù)要和CPU交換時(shí),外設(shè)向CPU發(fā)送一中斷請(qǐng)求信號(hào),CPU收到這一信號(hào)后中止當(dāng)前正在運(yùn)行的程序,轉(zhuǎn)而執(zhí)行一段特定的程序(中斷服務(wù)程序)來為外設(shè)服務(wù)。服務(wù)完后,CPU再恢復(fù)執(zhí)行原先被中止的程序。第7章輸入/輸出程序設(shè)計(jì)4.DMA方式

前三種方式中,數(shù)據(jù)的傳輸都要經(jīng)過CPU,而有時(shí)外設(shè)有大量數(shù)據(jù)需要放入內(nèi)存(或從內(nèi)存讀出),如果每個(gè)字節(jié)都先由CPU從外設(shè)中讀入,然后再寫入內(nèi)存,這樣的方式效率太低(尤其當(dāng)外設(shè)是高速外設(shè)時(shí)),這時(shí)可采用DMA方式。這種方式下,DMA控制器先請(qǐng)求CPU讓出總線控制權(quán),CPU同意后,將自己掛起,總線由DMA控制器控制,它引導(dǎo)外設(shè)直接將數(shù)據(jù)送入內(nèi)存(或反之)。在傳送結(jié)束后,DMA控制器通知CPU重新接管總線控制權(quán),隨后自己放棄總線控制。返回本章首頁返回上一節(jié)返回本節(jié)首頁第7章輸入/輸出程序設(shè)計(jì)7.2數(shù)據(jù)的輸入/輸出方式7.2.1直接I/O方式7.2.2查詢方式第7章輸入/輸出程序設(shè)計(jì)7.2.1直接I/O方式

這種方式下,CPU不查詢外設(shè)狀態(tài),在其需要時(shí)直接對(duì)外設(shè)執(zhí)行I/O操作。此方式優(yōu)點(diǎn)是硬件和軟件都達(dá)到最簡(jiǎn)單;缺點(diǎn)是外設(shè)必須隨時(shí)處于待命狀態(tài),并且外設(shè)的處理速度能跟上CPU的速度,否則就會(huì)出錯(cuò)。第7章輸入/輸出程序設(shè)計(jì)【例7.1】發(fā)聲程序

PC機(jī)的揚(yáng)聲驅(qū)動(dòng)系統(tǒng)如圖7-2所示。8253定時(shí)器

與門驅(qū)動(dòng)器8255APB口D0D1D2D3D4D5D6D7圖7-2PC機(jī)的揚(yáng)聲驅(qū)動(dòng)系統(tǒng)第7章輸入/輸出程序設(shè)計(jì)

揚(yáng)聲器的發(fā)聲是由輸出寄存器的二位進(jìn)行控制的。輸出寄存器的端口地址為61H。

揚(yáng)聲器發(fā)聲有兩種方式:直接對(duì)端口61H的D1位交替輸出0或1,使揚(yáng)聲器交替地通與斷,推動(dòng)揚(yáng)聲器發(fā)聲;定時(shí)器控制輸出方式是控制端口61H的D0位驅(qū)動(dòng)揚(yáng)聲器發(fā)出聲音。若發(fā)聲程序不使用定時(shí)器,端口61H的D0位清0。

由于揚(yáng)聲器總是隨時(shí)可用的,故CPU可用直接I/O方式對(duì)其操作。

程序如下:第7章輸入/輸出程序設(shè)計(jì)CODE SEGMENT

ASSUMECS:CODE

START: MOV DX,1000H ;開關(guān)次數(shù)

IN AL,61H ;取端口61H的內(nèi)容

PUSH AX ;入棧保存,以便退出時(shí)恢復(fù)

AND AL,11111100B ;將第0、1位置0

SOUND: XOR AL,2 ;D1位取反

OUT 61H,AL ;輸出到端口61H

MOV CX,2000H ;設(shè)置延時(shí)空循環(huán)的次數(shù)

DELAY: LOOP DELAY ;空循環(huán),延時(shí)一小會(huì)兒

DEC DX ;共1000H次

JNZ SOUND

POP AX ;從堆棧中彈出原AX內(nèi)容

OUT 61H,AL ;恢復(fù)原61H端口內(nèi)容

MOV AH,4CH

INT 21H ;返回DOS

CODE ENDS

END START返回本章首頁返回本節(jié)首頁第7章輸入/輸出程序設(shè)計(jì)

采用這種方式時(shí),CPU在進(jìn)行一次I/O操作之前,必須先對(duì)外設(shè)的狀態(tài)進(jìn)行查詢,流程如右圖所示。7.2.2查詢I/O方式

查詢傳送方式的優(yōu)點(diǎn):①安全可靠;②用于接口的硬件較省。缺點(diǎn):CPU必須循環(huán)等待外設(shè)準(zhǔn)備就序,導(dǎo)致效率不高。

啟動(dòng)

測(cè)試I/O設(shè)備狀態(tài)

準(zhǔn)備就緒?

執(zhí)行數(shù)據(jù)傳送

結(jié)束

第7章輸入/輸出程序設(shè)計(jì)有關(guān)打印機(jī)的控制方法說明如下:

1.打印機(jī)與CPU要交換的信息

①數(shù)據(jù):CPU要打印機(jī)打印的字符。

②狀態(tài)信息:表明打印機(jī)運(yùn)行情況的信息。

③控制信息:CPU用以控制打印機(jī)動(dòng)作的信息。

這三種信息分別用打印機(jī)的數(shù)據(jù)寄存器、狀態(tài)寄存器、控制寄存器存放,這三個(gè)寄存器均為8位,其端口地址分別為378H、379H、37AH(在BIOS數(shù)據(jù)區(qū)0040:0008H存放著這三個(gè)寄存器的首地址)。

【例7.2】用查詢輸出方式使打印機(jī)打印AL內(nèi)的一個(gè)字符。第7章輸入/輸出程序設(shè)計(jì)2.控制寄存器各位含義

位0:選通信號(hào)。正常工作時(shí)該位為0,當(dāng)已將數(shù)據(jù)發(fā)送到打印機(jī)的數(shù)據(jù)寄存器后,應(yīng)將該位置1,以通知打印機(jī)從數(shù)據(jù)寄存器取出數(shù)據(jù)。置1后,須馬上再置回0。

位1:自動(dòng)換行。置1要求打印機(jī)在打印完一行后(回車時(shí))自動(dòng)走紙。置0則需要先向打印機(jī)輸出換行符(0AH)控制走紙。通常設(shè)為0。

位2:初始化信號(hào)。正常工作時(shí)這一位為1,需要重新初始化打印機(jī)時(shí),將這一位 先清0再置1,并且清0時(shí)間要維持0.05秒以上。初始化又稱打印機(jī)復(fù)位,打印頭回到最左邊。

位3:聯(lián)機(jī)命令。置1將設(shè)置打印機(jī)在聯(lián)機(jī)工作方式,控制打印機(jī)時(shí)總是把這一位置1,否則打印機(jī)不能正常工作。正常打印時(shí)這一位需保持1。

位4:中斷允許。置0為不允許打印機(jī)產(chǎn)生中斷。置1允許打印機(jī)中斷,這時(shí)采用中斷方式傳送數(shù)據(jù),當(dāng)打印機(jī)可以接收新數(shù)據(jù)時(shí),產(chǎn)生IRQ7中斷。

位5~位7:未用。第7章輸入/輸出程序設(shè)計(jì)3.狀態(tài)寄存器各位含義

位0~2:未用。

位3:0=打印機(jī)出錯(cuò)。1=沒有錯(cuò)誤。

位4:0=打印機(jī)脫機(jī),這時(shí)不能正常工作。1=打印機(jī)聯(lián)機(jī)。

位5:0=打印機(jī)有紙,1=無紙。

位6:0=打印機(jī)確認(rèn)接收到字符。1=正常。當(dāng)打印機(jī)正確接收1字節(jié)的數(shù)據(jù)后,就送回一個(gè)低電位的認(rèn)可信號(hào),這個(gè)信號(hào)只維持很短的時(shí)間,然后又恢復(fù)高電位。

位7:0=打印機(jī)忙,1=打印機(jī)不忙。第7章輸入/輸出程序設(shè)計(jì)4.打印過程說明

要打印一個(gè)字符,須先將字符寫入打印機(jī)的數(shù)據(jù)寄存器,然后置控制寄存器的選通位為1,即將控制碼0DH(即位0、位2、位3為1,其余為0)送給打印機(jī),選通打印機(jī)后,再改送控制碼0CH(即置選通位為0),使打印機(jī)恢復(fù)正常。這樣才能使打印機(jī)從數(shù)據(jù)寄存器中取出字符打印。并且,只有在打印機(jī)不忙時(shí),才可向它發(fā)送選通信號(hào)。

程序如下:第7章輸入/輸出程序設(shè)計(jì)CODE SEGMENT

ASSUMECS:CODE

START: MOV DX,37AH

MOV AL,08H

OUT DX,AL ;初始化打印機(jī)

MOV CX,1000

INIT1: LOOP INIT1 ;延遲,維持初始化信號(hào)一段時(shí)間

MOV AL,0CH

OUT DX,AL ;結(jié)束初始化,保持聯(lián)機(jī)

MOV DX,379H第7章輸入/輸出程序設(shè)計(jì)WAIT1: IN AL,DX ;讀取打印機(jī)狀態(tài)寄存器

TEST AL,80H

JZ WAIT1 ;若打印機(jī)忙,循環(huán)等待

MOV AL,‘A’ ;設(shè)置待打印字符

MOV DX,378H

OUT DX,AL ;AL中數(shù)據(jù)→打印機(jī)數(shù)據(jù)寄存器

MOV DX,37AH

MOV AL,0DH ;選通打印機(jī)

OUT DX,AL

DEC AL

OUT DX,AL ;恢復(fù)正常

MOV AH,4CH

INT 21H

CODE ENDS

END START返回本章首頁返回本節(jié)首頁返回上一節(jié)第7章輸入/輸出程序設(shè)計(jì)實(shí)訓(xùn)一數(shù)據(jù)采集:查詢方式

實(shí)訓(xùn)內(nèi)容:一個(gè)有8個(gè)模擬量的數(shù)據(jù)采集系統(tǒng),CPU用查詢方式與其交換數(shù)據(jù),電路如圖7-5所示。8個(gè)輸入模擬量,經(jīng)過多路開關(guān)選通后送入A/D轉(zhuǎn)換器,多路開關(guān)由端口2的D0、D1、D2位控制。000相應(yīng)于選通A0輸入,…,111選通A7輸入。每次只有一個(gè)模擬量送入A/D轉(zhuǎn)換器。端口2的D3位控制A/D轉(zhuǎn)換器的啟停。A/D轉(zhuǎn)換器的READY信號(hào)由端口1的D0輸出到CPU的數(shù)據(jù)總線,經(jīng)A/D轉(zhuǎn)換后的數(shù)據(jù)由端口0輸出至數(shù)據(jù)總線。對(duì)這樣一個(gè)數(shù)據(jù)采集系統(tǒng),編寫數(shù)據(jù)采集程序。第7章輸入/輸出程序設(shè)計(jì)圖7-4數(shù)據(jù)采集系統(tǒng)8個(gè)模擬量…A0A7

數(shù)據(jù)線DB

8088

CPU

端口0端口1端口2A/D轉(zhuǎn)換

多路

開關(guān)

8位數(shù)據(jù)

1位狀態(tài)

READY

數(shù)據(jù)

1個(gè)模擬量D3D2D1D0

啟動(dòng)第7章輸入/輸出程序設(shè)計(jì)

分析:CPU可以依次向端口2的D2-D0位寫入0~7之間的一個(gè)數(shù),以便控制多路開關(guān)選通一個(gè)模擬量輸出;同時(shí)CPU要使端口2的D3位為1,以啟動(dòng)A/D轉(zhuǎn)換器。然后,CPU循環(huán)查詢A/D轉(zhuǎn)換器的READY信號(hào),一旦發(fā)現(xiàn)該信號(hào)為1,表示A/D轉(zhuǎn)換器已將數(shù)據(jù)準(zhǔn)備好,CPU即可讀取。

采集程序如下:第7章輸入/輸出程序設(shè)計(jì) MOV SI,100H ;設(shè)置輸入數(shù)據(jù)緩沖區(qū)首址

MOV BL,08H ;使D3位為1,同時(shí)選擇第1個(gè)模擬量通過多路開關(guān)

MOV CX,8 ;設(shè)置循環(huán)次數(shù)

AGAIN: MOV AL,0 ;使D3位為0

OUT 2,AL ;停止A/D轉(zhuǎn)換

CALL DELAY ;調(diào)用延時(shí)子程序,等待A/D停止操作完成

MOV AL,BL

OUT 2,AL ;啟動(dòng)A/D轉(zhuǎn)換,且選擇一個(gè)模擬量

WAIT1: IN AL,1 ;輸入A/D狀態(tài)信息

TEST AL,1

JZ WAIT1 ;若未準(zhǔn)備好,則循環(huán)等待

IN AL,0 ;輸入數(shù)據(jù)

MOV [SI],AL ;保存數(shù)據(jù)

INC SI

INC BL ;使多路開關(guān)選通下一個(gè)模擬量

LOOP AGAIN ;循環(huán)輸入8個(gè)模擬量

HLT返回本章首頁第7章輸入/輸出程序設(shè)計(jì)實(shí)訓(xùn)二PC機(jī)間的相互通信:查詢方式

實(shí)訓(xùn)內(nèi)容:設(shè)計(jì)一套系統(tǒng),能在二臺(tái)PC機(jī)之間以查詢方式實(shí)現(xiàn)串行通信。

分析:這套系統(tǒng)應(yīng)包含硬件連接圖及軟件二部分。由于串行通信的知識(shí)前面沒講,所以下面先對(duì)相關(guān)知識(shí)作一下簡(jiǎn)介,最后再給出參考硬件連接圖及程序。第7章輸入/輸出程序設(shè)計(jì)1.串行通信基本概念

微機(jī)間的通信有并行通信和串行通信兩種方式。并行通信中一次可以傳輸一個(gè)字節(jié)或更多的位數(shù)。串行通信是在一根傳輸線上一位一位地傳送信息。與并行通信相比,串行通信所用傳輸線少,成本低,因而應(yīng)用廣泛。

在通信中,通信雙方要想相互理解對(duì)方所發(fā)信號(hào)的含義,就必須先就信號(hào)發(fā)送速度、信息格式等諸多問題作統(tǒng)一的約定,這就涉及到了通信協(xié)議。第7章輸入/輸出程序設(shè)計(jì)(l)異步通信的信息格式

串行通信的通信方式又分異步通信和同步通信兩種。本處只介紹異步通信。

異步通信的信息格式是,一個(gè)傳輸線上的字符由四個(gè)部分組成:起始位(占1位),數(shù)據(jù)位(占5~8位),奇偶校驗(yàn)位(占1位,也可以沒有校驗(yàn)位),停止位(占1位或1位半或2位)。如圖7-6所示。(2)傳輸速率

串行通信中,傳輸速率是用每秒傳送的位數(shù)(位/p)即波特率來表示的。最常用的標(biāo)準(zhǔn)波特率是110,300,1000,1200,2400,4800,9600和19200位/S。第7章輸入/輸出程序設(shè)計(jì)圖7-5異步通信信息格式

傳送開始之前,發(fā)收雙方要把所采用的信息格式(包括字符的數(shù)據(jù)位長(zhǎng)度,停止位長(zhǎng)度,有無奇仍校驗(yàn)位以及采用奇校還是偶校等)和數(shù)據(jù)傳輸速率即波特率作統(tǒng)一的約定,即規(guī)定傳輸協(xié)議。如果要改變格式和傳輸速率,則只能雙方同時(shí)修改,否則會(huì)出錯(cuò)。1(Mark)起始位校驗(yàn)位停止位0(Space)數(shù)據(jù)位第7章輸入/輸出程序設(shè)計(jì)(3)連接方式

近距離的二臺(tái)計(jì)算機(jī)可以直接通過機(jī)箱后面的RS-232C串行接口連接起來,從而實(shí)現(xiàn)串行通信。所謂的RS-232C,實(shí)際上是一種接口標(biāo)準(zhǔn),即對(duì)接口的機(jī)械特性、電氣特性、信號(hào)功能等信息所做的一種規(guī)定。由于每臺(tái)PC機(jī)后的串行接口均符合此標(biāo)準(zhǔn),所以可以相互連接起來。RS-232C接口有25根信號(hào)線,但常用的只有9根。如果進(jìn)行近距離通信(不需要控制調(diào)制解調(diào)器),最簡(jiǎn)單的情況只需使用3根線(發(fā)送線、接收線、信號(hào)地線)便可實(shí)現(xiàn)全雙工異步串行通信,如圖7-7所示。第7章輸入/輸出程序設(shè)計(jì)圖7-6近距離通信的連接方式

2

5

3

6

4

7

202

5

3

6

4

7

20

計(jì)算機(jī)計(jì)

機(jī)

第7章輸入/輸出程序設(shè)計(jì)

下面簡(jiǎn)單介紹一下這幾個(gè)引腳的含義。

2腳:發(fā)送數(shù)據(jù)(TXD)—通過TXD終端將數(shù)據(jù)發(fā)送到MODEM。

3腳:接收數(shù)據(jù)(RXD)—通過RXD終端接收從MODEM發(fā)來的串行數(shù)據(jù)。

4腳:請(qǐng)求發(fā)送(RTS)—當(dāng)終端要發(fā)送數(shù)據(jù)時(shí),使該信號(hào)有效(高電平),向MODEM請(qǐng)求發(fā)送。它用來控制MODEM是否要進(jìn)入發(fā)送狀態(tài)。

5腳:允許發(fā)送(CTS)—是對(duì)請(qǐng)求發(fā)送信號(hào)RTS的響應(yīng)信號(hào)。當(dāng)MODEM已準(zhǔn)備好接收終端傳來的數(shù)據(jù),并向前發(fā)送時(shí),使該信號(hào)有效,通知終端開始沿發(fā)送數(shù)據(jù)線TXD發(fā)送數(shù)據(jù)。

6腳:數(shù)據(jù)裝置準(zhǔn)備好(DSR)—高電平有效。有效時(shí),表明MODEM處于可以使用的狀態(tài)。

7腳:信號(hào)地線。

20腳:數(shù)據(jù)終端準(zhǔn)備好(DTR)—高電平有效。有效時(shí),通知MODEM計(jì)算機(jī)已可用。

注:數(shù)據(jù)終端設(shè)備(DTE)指計(jì)算機(jī)和各種終端。第7章輸入/輸出程序設(shè)計(jì)2.通用異步接收發(fā)送器UART

把字符的并行代碼轉(zhuǎn)換成串行通信所需格式并發(fā)送出去,同時(shí)能把收到的串行數(shù)據(jù)接收下來,并轉(zhuǎn)換成并行格式,這樣的部件稱為異步接收發(fā)送器,簡(jiǎn)稱UART。PC系列機(jī)中的UART為8250及其各種變型。

從程序員的觀點(diǎn)來看,通信芯片由一系列寄存器所組成,它們對(duì)應(yīng)著一個(gè)端口地址序列。8250UART具有十個(gè)可編程的單字節(jié)寄存器,用于控制并監(jiān)視串行口。這十個(gè)寄存器通過七個(gè)端口地址訪問,情況如下:(1)8250的寄存器第7章輸入/輸出程序設(shè)計(jì)3F8h(OUT,3FBh處位7=0)發(fā)送保持寄存器

3F8h(IN,3FBh處位7=0)接收數(shù)據(jù)寄存器

3F8h(OUT,3FBh處位7=1)波特率除數(shù)(低字節(jié))

3F9h(OUT,3FBh處位7=l)波特率除數(shù)(高字節(jié))

3F9h(OUT,3FBh處位7=0)中斷允許寄存器

3FAh(IN)中斷標(biāo)識(shí)寄存器

3FBh(OUT)線路控制寄件器

3FCh(OUT)調(diào)制解調(diào)器控制寄存器

3FDh(IN)線路狀態(tài)寄存器

3FEh(IN)調(diào)制解調(diào)器狀態(tài)寄存器第7章輸入/輸出程序設(shè)計(jì)

由于3F8H與3F9H是共用端口地址,為了區(qū)分被訪問的寄存器,在訪問兩個(gè)波特率除數(shù)寄存器時(shí),必須首先設(shè)置3FBh處的線路控制寄存器的D7位為1,而訪問其它寄存器時(shí)則需將這一位置0。

這十個(gè)寄存器的大致作用如下:①發(fā)送保持寄存器:

保存將要傳送的數(shù)據(jù)字節(jié)。在發(fā)送方CPU將需要發(fā)送的數(shù)據(jù)寫入這一寄存器。②接收數(shù)據(jù)寄存器:

保存最近接收到的數(shù)據(jù)字節(jié)。在接收方,CPU需要從這一寄存器中取走收到的數(shù)據(jù)。③線路控制寄存器:

主要用于設(shè)置通訊中數(shù)據(jù)格式,在初始化時(shí)也用其D7位區(qū)分復(fù)用地址的端口。④線路狀態(tài)寄存器:

反映通信線路狀態(tài),供CPU讀出查詢。⑤兩個(gè)波特率除數(shù)寄存器:

存放波特率除數(shù)。⑥中斷允許寄存器:

控制8250是否以中斷方式工作,以及設(shè)置引發(fā)中斷的條件。⑦中斷標(biāo)識(shí)寄存器:標(biāo)記發(fā)生中斷的原因,供CPU查詢。第7章輸入/輸出程序設(shè)計(jì)⑧調(diào)制解調(diào)器控制寄存器:

這個(gè)寄存器用來設(shè)置對(duì)MODEM的聯(lián)絡(luò)控制信號(hào)和芯片自檢,但即使不用MODEM,這個(gè)寄存器的其中二個(gè)位也常用。它們是:

D3位:用于中斷控制,為使8250能發(fā)出中斷請(qǐng)求信號(hào),此位必須置1。

D4位:是供8250本身自檢診斷而設(shè)置的。當(dāng)這位置1時(shí),8250處于診斷方式,在這種方式下,8250芯片將收、發(fā)端在內(nèi)部連接起來,形成自發(fā)自收的“環(huán)路”。在正常通信時(shí),此位置0。⑨調(diào)制解調(diào)器狀態(tài)寄存器:

用來檢測(cè)和記錄來自MODEM的聯(lián)絡(luò)控制信號(hào)及其狀態(tài)的變化第7章輸入/輸出程序設(shè)計(jì)(2)初始化串行口

串行口在使用前必須初始化,包括設(shè)置波特率除數(shù)寄存器,設(shè)置線路控制寄存器和設(shè)置中斷允許寄存器。如使用MODEM進(jìn)行通信,還要設(shè)置調(diào)制解調(diào)器控制寄存器。

①波特率除數(shù):

波特率除數(shù)是一個(gè)數(shù)字,系統(tǒng)時(shí)鐘除以波特率除數(shù)以得到所需的波特率。設(shè)外部時(shí)鐘頻率為f,而8250所要求的波特率為F,則波特率除數(shù)可由以下公式求出:

波特率除數(shù)=f/(F×16)

例如,當(dāng)輸入的時(shí)鐘頻率為1.8432MHZ時(shí),若要求的波特率為1200,則波特率除為應(yīng)為96。除數(shù)越大,波特率越低。300及以下的波特率所需除數(shù)為雙字節(jié)數(shù),為此8250芯片需要兩個(gè)存放除數(shù)的寄存器。一些常用波特率所對(duì)應(yīng)的數(shù)值如表7-2所示。第7章輸入/輸出程序設(shè)計(jì)波特率波特率除數(shù)(高字節(jié))波特率除數(shù)(低字節(jié))11004h17h30001h80h60000hC0h120000h60h180000h40h240000h30h360000h20h480000h18h960000h0Ch表7-1常用的波特率除數(shù)值

波特率除數(shù)寄存器總是要首先設(shè)置,因?yàn)橹挥羞@兩個(gè)寄存器要求線路控制寄存器的位7置1。第7章輸入/輸出程序設(shè)計(jì)②線路控制寄存器各位含義:

位l-0字符長(zhǎng)度:00=5位,01=6位,10=7位,11=8位。

2停止位數(shù):0=l位,1=1.5位,l=2位。

3奇偶校驗(yàn):1=1位奇偶校驗(yàn)位,0=無奇偶校驗(yàn)位。

4奇偶校驗(yàn)類型:0=奇校驗(yàn),1=偶校驗(yàn)。

5保持奇偶校驗(yàn):使得奇偶校驗(yàn)恒為1或0。

0=禁止

1=恒為1(若位3=1且位4=0)

l=恒為0(若位3=l且位4=1)

l=無奇偶校驗(yàn)(若位3=0)

6設(shè)置暫停:輸出空字符串作為發(fā)往遠(yuǎn)程站的信號(hào)。0=禁止,1=暫停。

7轉(zhuǎn)向芯片的其它寄存器端口。

通常位5-7置0,其它位按所要求的通信協(xié)議設(shè)置。第7章輸入/輸出程序設(shè)計(jì)③中斷允許寄存器各位含義:

位01=當(dāng)接收到數(shù)據(jù)時(shí)發(fā)中斷。

11=當(dāng)發(fā)送保持寄存器為空時(shí)發(fā)中斷。

21=當(dāng)接收數(shù)據(jù)出錯(cuò)時(shí)發(fā)中斷。

31=當(dāng)調(diào)制解調(diào)器狀態(tài)寄存器狀態(tài)改變時(shí)發(fā)中斷。

4-7未用,恒為0。

8250既可以以查詢方式工作,也可以以中斷方式工作。即使在查詢方式下工作,也應(yīng)設(shè)置中斷允許寄存器(置0),以確保中斷禁止。第7章輸入/輸出程序設(shè)計(jì)(3)監(jiān)視串行口狀態(tài)

CPU通過查詢8250的線路狀態(tài)寄存器,可以獲取串行口狀態(tài)信息。線路狀態(tài)寄存器各位含義如下:

位01=接收到一個(gè)數(shù)據(jù)字節(jié)。

11=所接收的數(shù)據(jù)已溢出(以前的字符未及時(shí)取走)。

21=奇偶校驗(yàn)錯(cuò)誤。

31=幀錯(cuò)誤(傳輸未能同步)。

41=暫停檢測(cè)(收到很長(zhǎng)的全“1”字符串,表明其它站請(qǐng)求傳送結(jié)束)。

51=發(fā)送保持寄存器為空。

61=發(fā)送轉(zhuǎn)移寄存器為空。

71=超時(shí)(脫機(jī))。

在查詢方式通信中,CPU不斷讀取線路狀態(tài)寄存器,以判斷是否可以發(fā)送數(shù)據(jù)或是否收已到數(shù)據(jù)需要取走。第7章輸入/輸出程序設(shè)計(jì)

3.參考硬件連接圖及程序

硬件連接圖采用圖7-7即可。

參考程序:

在本例中,將通信協(xié)議設(shè)置為:傳輸率1200波特,8位數(shù)據(jù)位,偶校驗(yàn)和1個(gè)停止位。CPU以查詢方式進(jìn)行通訊。在參加通信的雙方均運(yùn)行此程序后,雙方即以全雙工方式工作,每方均可以隨時(shí)向?qū)Ψ桨l(fā)送數(shù)據(jù),也可以隨時(shí)接收對(duì)方發(fā)來的數(shù)據(jù)。運(yùn)行時(shí),在一臺(tái)機(jī)器上鍵入的字符將通過線路發(fā)送給對(duì)方,對(duì)方收下后顯示自己的屏幕上。任一方只要鍵入Ctrl+C鍵即可結(jié)束己方程序的運(yùn)行。程序流程見圖7-8所示。第7章輸入/輸出程序設(shè)計(jì)

初始化8250

有錯(cuò)?

讀線路狀態(tài)寄存器

開始已收到數(shù)據(jù)?可以發(fā)送數(shù)據(jù)?顯示出錯(cuò)提示

退出

①②

YYNYN

N圖7-7a

主流程圖

第7章輸入/輸出程序設(shè)計(jì)退出

接收字符→ALAL內(nèi)為Ctrl-C?顯示該字符AL內(nèi)為回車?

加顯示一個(gè)換行

Y

YNN

圖7-7b接收模塊流程圖

第7章輸入/輸出程序設(shè)計(jì)

退出

發(fā)送此字符

有鍵入字符?

是Ctrl-C鍵?①

YNYN

圖7-7

c發(fā)送模塊流程圖

第7章輸入/輸出程序設(shè)計(jì)CODE SEGMENT

ASSUMECS:CODE

START:

;以下初始化波特率除數(shù)寄存器

MOV DX,3FBH ;指向線路控制寄存器

MOV AL,80H ;位7置1

OUT DX,AL ;發(fā)送此字節(jié)

MOV DX,3F9H ;指向波特率除數(shù)的最高有效位

MOV AL,0 ;

1200BPS對(duì)應(yīng)的最高有效位

OUT DX,AL ;發(fā)送此字節(jié)

DEC DX ;指向波特率除數(shù)的最低有效位

MOV AL,60H ;1200BPS對(duì)應(yīng)的最低有效位

OUT DX,AL ;發(fā)送此字節(jié) 第7章輸入/輸出程序設(shè)計(jì);以下初始化線路控制寄存器:

MOV AL,1BH ;數(shù)據(jù)長(zhǎng)度為8位,1個(gè)奇偶校驗(yàn)位,偶校驗(yàn),1個(gè)停止位

MOV DX,3FBH ;指向線路控制寄存器

OUT DX,AL ;發(fā)送此字節(jié)

;以下初始化中斷允許寄存器

MOV DX,3F9H ;指向中斷允許寄存器

MOV AL,0 ;禁止所有中斷

OUT DX,AL ;發(fā)送字節(jié)第7章輸入/輸出程序設(shè)計(jì)READ:

;線路狀態(tài)檢測(cè)循環(huán)

MOV DX,3FDH ;指向線路狀態(tài)寄存器

IN AL,DX ;取狀態(tài)字節(jié)

TEST AL,1EH ;檢查錯(cuò)誤

JNZ ERROR ;若出錯(cuò)則轉(zhuǎn)錯(cuò)誤處理例程

TEST AL,01H ;測(cè)試是否已收到數(shù)據(jù)

JNZ RECEIVE ;轉(zhuǎn)接收例程

TEST AL,20H ;測(cè)試是否可以發(fā)送字符

JNZ SEND ;若是轉(zhuǎn)發(fā)送例程

JMP R

溫馨提示

  • 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)論