李槐生
摘??要:用匯編語言編寫了一個(gè)雙機(jī)通訊程序,即用中斷的方式實(shí)現(xiàn)從發(fā)送方鍵盤上輸入一個(gè)字符,接收方收到該字符后,將其顯示在微機(jī)屏幕上的過程。
關(guān)鍵詞:雙機(jī)通訊程序;雙機(jī)串行通訊;8250芯片;Modem
中圖分類號(hào):TP273+.5????????????文獻(xiàn)標(biāo)識(shí)碼:A???????????????DOI:10.15913/j.cnki.kjycx.2015.01.013
1??雙機(jī)通訊
雙機(jī)串行通訊如圖1所示。
圖1??雙機(jī)串行通訊
雙機(jī)通信時(shí),通常采用串行方式。串行通訊是指只需要1條數(shù)據(jù)線就可以傳送數(shù)據(jù),且數(shù)據(jù)各數(shù)位按照規(guī)定順序傳送的通訊方式。從圖1中看以看出,用串行通信線將2臺(tái)計(jì)算機(jī)連接起來,再調(diào)用BIOS中斷指令,可利用中斷方式實(shí)現(xiàn)串行通信。在串行方式中,通信接口每次由CPU中獲得8位數(shù)據(jù),并串行通過1條線路,每次發(fā)送1位數(shù)據(jù)。
2??8250芯片和接口電纜
2.1??可編程串行通訊接口8250
8250芯片是各種微機(jī)系統(tǒng)和計(jì)算機(jī)網(wǎng)絡(luò)中被使用最多的一種異步通信接口芯片,是異步通信卡的核心部件。該芯片主要包括總線緩沖器、芯片內(nèi)部選擇控制邏輯、接收控制電路、發(fā)送控制電路、傳輸速度控制電路、調(diào)制解調(diào)控制電路和中斷控制電路。該芯片具有以下6種性能:①僅適用于異步串行通信方式,可選擇每字符的數(shù)據(jù)位數(shù)為5~8位;②內(nèi)裝可編程波特率發(fā)生器,允許數(shù)據(jù)傳輸?shù)牟ㄌ芈蕿?0~9?600?bps,且具有獨(dú)立的接收器時(shí)鐘信號(hào)輸入;③接收和發(fā)送均具有雙重緩沖;④具有優(yōu)先權(quán)中斷管理系統(tǒng),可對(duì)發(fā)送、接收、錯(cuò)誤和通信線路狀態(tài)進(jìn)行中斷檢測(cè);⑤可提供通信線路和Modem的全部運(yùn)行狀態(tài);⑥能檢測(cè)假起始位,產(chǎn)生和檢測(cè)終止符,且具有自診斷測(cè)試功能。
2.2??8250引腳
2.2.1??數(shù)據(jù)總線D0~D7
CPU與8250之間的信息通過數(shù)據(jù)總線D0~D7交換。
2.2.2??地址和地址控制線
地址線A0~A2尋址8250內(nèi)部寄存器。3個(gè)片選線為CS0、CS1和CS2都有效時(shí),才可選中8250芯片。地址選通信號(hào)ADS(非)低電平有效時(shí),鎖存上述地址線和片選線的輸入狀態(tài),并保證讀寫期間的地址穩(wěn)定。另外,當(dāng)3個(gè)片選線都有效,且片選輸出引腳CSOUT輸出高電平時(shí),證明8250已被選中。具體如圖2所示。
2.2.3??讀寫控制線
8250讀寫控制信號(hào)有2對(duì),每對(duì)信號(hào)的作用完全相同,只有有效點(diǎn)不同。當(dāng)8250被選中時(shí),當(dāng)數(shù)據(jù)輸入選通信號(hào)DISTR和DISTR(非)中只有一個(gè)信號(hào)有效時(shí),CPU從被選擇的內(nèi)部寄存器中讀出數(shù)據(jù);當(dāng)數(shù)據(jù)輸出選通信號(hào)DOSTR和DOSTR(非)中只有一個(gè)信號(hào)有效時(shí),CPU會(huì)將數(shù)據(jù)寫入8250被選擇的內(nèi)部寄存器。另外,CPU從8250讀取數(shù)據(jù)時(shí),8250輸出驅(qū)動(dòng)器禁止信號(hào)DDIS為低電平,議禁止外部收發(fā)器對(duì)系統(tǒng)總線的驅(qū)動(dòng),且DDIS為高電平信號(hào)。
圖2??8250引腳圖
其中,輸入信號(hào)的引腳如下:①CS0、CS1、CS2為片選信號(hào)。當(dāng)這3個(gè)片選信號(hào)同時(shí)有效時(shí),芯片被選中,經(jīng)地址選通信號(hào)ADS鎖存后,8250才可以與CPU通信。②ADS為地址選通。當(dāng)該信號(hào)有效時(shí),鎖存片選信號(hào)(CS0、CS1、CS2)和寄存器選擇信號(hào)(A0、A1、A2)。只有當(dāng)寄存器選擇信號(hào)在讀操作或?qū)懖僮髌陂g不穩(wěn)定時(shí),才需要有效的?ADS輸入;不需要此信號(hào)時(shí),需要將其接入低電平。③DISTR、DISTR為數(shù)據(jù)輸入選通。當(dāng)該芯片被選中,且DISTR為高電平或DISTR為低電平時(shí),允許CPU從8250中某一被選中的寄存器讀取狀態(tài)信息或數(shù)據(jù)。④DOSTR、DOSTR為數(shù)據(jù)輸出選通。當(dāng)該芯片被選中,且DOSTR為高電平或DOSTR為低電平時(shí),允許CPU從8250中某一被選中的寄存器寫入數(shù)據(jù)或控制字符。⑤A0、A1、A2為寄存器選擇。這3個(gè)信號(hào)用于在讀操作或?qū)懖僮髌陂g,選擇8250中的一個(gè)讀寄存器或?qū)懠拇嫫鳌"轒R為主復(fù)位。當(dāng)MR為高電平時(shí),除接收數(shù)據(jù)寄存器、發(fā)送保持寄存器和數(shù)鎖存寄存器外,其余寄存器和控制邏輯均被復(fù)位,SOUT、INTRPT、OUT1、OUT2、RTS和DTR輸出信號(hào)也會(huì)受到影響,MR一般接入系統(tǒng)的復(fù)位信號(hào)線。⑦RCLK為接收時(shí)鐘。接16倍接收波特率的時(shí)鐘信號(hào)。⑧SIN為串行輸入。由外設(shè)或數(shù)據(jù)設(shè)備發(fā)送的串行數(shù)據(jù)接收端。
輸出信號(hào)引腳如下:①DTR為數(shù)據(jù)終端是否準(zhǔn)備好。當(dāng)DTR為低時(shí),則通知Modem8250可開始通信。將Modem控制寄存器的第0位(DTR)設(shè)置成1,DTR引腳就會(huì)變?yōu)榈碗娖?。②RTS為請(qǐng)求發(fā)送。當(dāng)RTS為低時(shí),則通知Modem8250可發(fā)送數(shù)據(jù)。將Modem控制寄存器的第1位(RTS)設(shè)置成1,RTS引腳就會(huì)變?yōu)榈碗娖?。③CSOUT為片選輸出。當(dāng)該信號(hào)為高電平時(shí),表示8250已被CS0、CS1和CS2信號(hào)選中。只有該信號(hào)為高電平時(shí),才能開始傳送數(shù)據(jù)。④BAUDOUT為波特率輸出。該信號(hào)是8250發(fā)送器所使用的傳輸速率16倍頻的時(shí)鐘信號(hào)。如果將該信號(hào)與RCLK相連,則此信號(hào)也可作為8250接收器的時(shí)鐘信號(hào)。⑤INTRPT為當(dāng)下列任意一種中斷類型出現(xiàn)有效狀態(tài),并通過中斷允許存器允許中斷時(shí),此信號(hào)為高電平。中斷類型包括接收器錯(cuò)誤標(biāo)志、接收數(shù)據(jù)就緒、發(fā)送保持寄存器空和Modem改變狀態(tài)。⑥SOUT為串行輸出。它是串行數(shù)據(jù)的輸出端。
2.2.4??復(fù)位線MR
該引腳接至系統(tǒng)的復(fù)位信號(hào)Reset.當(dāng)其有效時(shí),8250復(fù)位,控制部分寄存器和輸出信號(hào)的狀態(tài)如圖3所示。
圖3??8250的復(fù)位狀態(tài)
2.2.5??中斷請(qǐng)求線INTRPT
8250內(nèi)部有4種類型的中斷源,當(dāng)任意一個(gè)未被屏蔽的中斷源有請(qǐng)求時(shí),INTRPT輸出高電平會(huì)向CPU
請(qǐng)求中斷。適當(dāng)?shù)闹袛喾?wù)或復(fù)位MR有效都可使INTRPT變?yōu)榈碗娖健?/p>
2.2.6??時(shí)鐘信號(hào)
外部晶體振蕩器電路產(chǎn)生的時(shí)鐘信號(hào)送至?xí)r鐘輸入引腳XTAL1,并作為8250的基準(zhǔn)工作時(shí)鐘。
2.2.7??串行數(shù)據(jù)輸入線SIN
由串行數(shù)據(jù)輸入線SIN接收設(shè)備送來的串行數(shù)據(jù)。
2.2.8??串行數(shù)據(jù)輸出線SOUT
8250由串行數(shù)據(jù)輸出線SOUT發(fā)送串行數(shù)據(jù)給通信設(shè)備。
2.2.9??調(diào)制解調(diào)器控制線
調(diào)制解調(diào)器控制線包括數(shù)據(jù)終端DTR(非)、數(shù)據(jù)設(shè)備DSR(非)、發(fā)送請(qǐng)求RTS(非)、允許請(qǐng)求CTS(非)、接收線路檢測(cè)RSLD(非)和振鈴指示RI(非),均為低電平時(shí)有效。
2.2.10??輸出線
OUT1(非)和OUT2(非)是2個(gè)一般用途的輸出信號(hào),調(diào)制解調(diào)器控制寄存器中的D2和D3可使其輸出低電平的有效信號(hào),并能使其復(fù)位恢復(fù)為高電平。
2.3??RS-232-C串行接口標(biāo)準(zhǔn)
RS-232-C接口既可用于同步通信,又可用于異步通信,它是一種在數(shù)據(jù)終端設(shè)備DTE與數(shù)據(jù)通信設(shè)備DCE之間的聯(lián)接標(biāo)準(zhǔn)。在短距離通信時(shí),可直接通過RS-232-C接口在計(jì)算機(jī)與計(jì)算機(jī)之間實(shí)現(xiàn)相連,具體如圖4所示.
圖4??通過RS-232-C接口連接計(jì)算機(jī)
3??編程思路
第一步,設(shè)傳輸波特率——寫入除數(shù)寄存器。應(yīng)確定傳輸速率、接收時(shí)鐘和發(fā)送時(shí)鐘,由此計(jì)算出分頻系數(shù),并將其寫入除數(shù)寄存器。下面是第一個(gè)通信接口COM1工作在1?200波特率的設(shè)置程序段:
MOV????????AL,80H
MOV????????DX,3FBH
OUT?????????DX,AL?????????;寫入通信線路控制寄存器,使DLAB=1
MOV????????AL,60H?????????;分頻系數(shù):1.834?2?MHz/(1?200×16)=96=60H
MOV????????DX,3F8H
OUT?????????DX,AL?????????;寫入寄存器低8位
MOV????????AL,0
INC?????????DX
OUT????????DX,AL??????????;寫入寄存器高8位
第二步,設(shè)置字符格式——寫入線路寄存器。根據(jù)起止式協(xié)議,假使我們用7個(gè)數(shù)據(jù)位、2個(gè)停止位,采用奇校驗(yàn)的方式,則程序段如下:
MOV????????AL,00001110?B
MOV????????DX,3FBH
OUT?????????DX,AL??????;寫入通信線路控制寄存器
這段程序同時(shí)使DLAB=0,以方便下述初始化過程。
第三步,設(shè)置中斷工作方式的程序段。調(diào)制解調(diào)器控制寄存器的最低位兩位通常為1,即使系統(tǒng)中沒有使用調(diào)制解調(diào)器,也可建立數(shù)據(jù)終端準(zhǔn)備好DTR(非)和請(qǐng)求發(fā)送RTS(非)的有效信號(hào)。設(shè)置中斷工作方式的程序段為:
MOV????????AL,0BH?????????????;控制OUT2為低,允許INTRPT產(chǎn)生請(qǐng)求
MOV????????DX,3FCH
OUT?????????DX,AL
第四步,設(shè)置中斷允許或屏蔽位——寫入中斷允許寄存器。其程序段為:
MOV???????AL,0??????????;禁止所有中斷
MOV???????DX,3F9H
OUT????????DX,AL????????;寫入中斷允許寄存器(應(yīng)保證此時(shí)DLAB=0)
第五步,讀取通信線路的狀態(tài),判斷是否可通信。
第六步,送出或讀入一個(gè)字符。
第七步,重復(fù)第二步和第三部,直至通信結(jié)束。
當(dāng)允許中斷時(shí),CPU送出(或讀入)一個(gè)字符。在8250收到一個(gè)字符或?qū)⒁粋€(gè)字符送出后,會(huì)通過IRQ4(或IRQ3)向CPU申請(qǐng)中斷,識(shí)別8250的中斷類型,并作出相應(yīng)的處理(送出或讀入一個(gè)字符等)。
4??程序設(shè)計(jì)
具體的程序設(shè)計(jì)如下:
DATA?SEGMENT
SHOWMESS?DB?100?DUP(?)
DATA?ENDS
CODE?SEGMENT
ASSUME?CS:CODE,DS:DATA
START:MOV?AX,DATA
MOV?DS,AX??????????;數(shù)據(jù)段基值裝入(通過AX)
LEA?DX,SHOWMESS????????;字符串有效地址裝入DX寄存器
MOV?AH,09H
INT?21H????????????;?DOS顯示字符串功能調(diào)用
MOV?DX,1
MOV?AL,8EH
INT?14H??????????????;初始化串口COM2
FORE:MOV?AH,03H
MOV?DX,1
INT?14H???????????????;讀串口2狀態(tài)字
TEST?AH,01H?????????;數(shù)據(jù)準(zhǔn)備好?
JNZ?RECE?????????????;準(zhǔn)備好轉(zhuǎn)接收程序
TEST?AH,20H?????????;發(fā)送移位寄存器空
JZ?FORE???????????????;不空轉(zhuǎn)FORE,繼續(xù)檢測(cè)
MOV?AH,1
INT?16H????;否則利用BIOS鍵盤中斷調(diào)用,輸入字符
JZ?FORE???????????????;沒有按鍵,繼續(xù)
MOV?AH,0
INT?16H???????????????;?BIOS鍵盤輸入
CMP?AL,1BH
JZ?QUIT???????????????;是否是ESC鍵,是否退出
MOV?AH,1
MOV?DX,1
INT?14H???????????????;是否則發(fā)送字符
CMP?AL,0DH
JNZ?RECE
MOV?AH,02H
MOV?DL,0AH
INT?21H?????????;如果發(fā)送的為回車符,則顯示換行
MOV?DL,0DH
INT?21H
RECE:MOV?AH,3
MOV?DX,1
INT?14H???????????????;讀串口2狀態(tài)字
TEST?AH,01H?????????;數(shù)據(jù)準(zhǔn)備好?
JZ?FORE???????????;數(shù)據(jù)位準(zhǔn)備好轉(zhuǎn)FORE繼續(xù)檢測(cè)
MOV?AH,01H
MOV?DX,1
INT?14H????????????????;否則讀入字符
MOV?DL,AL
AND?DL,7FH??????????;屏蔽校驗(yàn)位
MOV?AH,02H
INT?21H????????????????;DOS中斷顯示字符
JMP?FORE??????????????;接受方發(fā)送字符
QUIT:MOV?AH,4CH??????????;退出程序,返回DOS
INT?21H
CODE?ENDS??????????????????;代碼段結(jié)束
END?START??????????????;程序結(jié)束
〔編輯:張思楠〕
Dual-machine?Communication?Design
Li?Huaisheng
Abstract:?Written?in?assembly?language?a?two-machine?communication?program,?which?uses?interrupts?a?way?that?a?character?input?from?the?keyboard?on?the?sender,?the?recipient?received?after?the?character,?which?is?displayed?on?a?computer?screen?process.
Key?words:?two-machine?communication?program;?dual?serial?communication;?8250?chip;?modem