第8章 AT89S51單片機(jī)的串行口_第1頁
第8章 AT89S51單片機(jī)的串行口_第2頁
第8章 AT89S51單片機(jī)的串行口_第3頁
第8章 AT89S51單片機(jī)的串行口_第4頁
第8章 AT89S51單片機(jī)的串行口_第5頁
已閱讀5頁,還剩84頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第8章

AT89S51單片機(jī)的

串行口12全雙工異步串行口并行通信并行通信和串行通信串行通信數(shù)據(jù)的各位同時(shí)傳送(接收)數(shù)據(jù)的逐位分時(shí)傳送(接收)異步通信和同步通信異步通信(AsynchronousCommunication):同步通信(SynchronousCommunication):同步通信是指通信時(shí)要建立發(fā)送方時(shí)鐘對(duì)接收方時(shí)鐘的直接控制,使收發(fā)雙方達(dá)到完全同步的一種通信方式。異步通信是指發(fā)送端和接收端使用各自的時(shí)鐘來控制數(shù)據(jù)的發(fā)送和接收的一種通信方式。這兩個(gè)時(shí)鐘源彼此獨(dú)立,無需嚴(yán)格同步。4

串行通信的3種制式:單工(simplex)半雙工(halfduplex)

全雙工(duplex)概述:可編程的全雙工異步串行口

管腳:TXD(P3.1)、RXD(P3.0)可同時(shí)發(fā)送、接收數(shù)據(jù)

四種工作方式,幀格式有8位、10位、11位波特率(Baudrate)可設(shè)置

波特率(比特率):每秒鐘傳送二進(jìn)制數(shù)的位數(shù),單位b/s。8.1串行口的結(jié)構(gòu)6圖8-1內(nèi)部結(jié)構(gòu)PCONSCON7SBUF_串行口數(shù)據(jù)緩沖器兩個(gè)物理上獨(dú)立的接收、發(fā)送緩沖器發(fā)送緩沖器只寫不能讀。接收緩沖器只讀不能寫。兩個(gè)緩沖器共用一個(gè)字節(jié)地址(99H)。

SCON__串行口控制寄存器(98H),可位尋址

PCON__電源控制寄存器(87H),不可位尋址8.1.1串行口控制寄存器SCON接收中斷標(biāo)志發(fā)送中斷標(biāo)志發(fā)送中斷標(biāo)志接收的第9位數(shù)據(jù)發(fā)送的第9位數(shù)據(jù)允許串行接收位多機(jī)通信控制位允許串行接收位工作方式選擇位9SM0SM1工作方式功能波特率0008位同步移位寄存器(擴(kuò)展IO口)fosc/1201110位異步收發(fā)(8位數(shù)據(jù))可變,由定時(shí)器1溢出率控制10211位異步收發(fā)(9位數(shù)據(jù))fosc/64或fosc/3211311位異步收發(fā)(9位數(shù)據(jù))可變,由定時(shí)器1溢出率控制表8-1 串行口的工作方式8.1.2電源控制及波特率選擇寄存器PCON

10當(dāng)SMOD=1時(shí),要比SMOD=0時(shí)波特率加倍,所以也稱SMOD位為波特率倍增位。例如,方式1的波特率計(jì)算公式:方式1波特率

=

定時(shí)器T1的溢出率8.2串行口的4種工作方式8.2.1方式0同步移位寄存器輸入/輸出方式。該方式并不用于兩個(gè)AT89S51單片機(jī)之間的異步串行通信,而是用于串行口外接移位寄存器,擴(kuò)展并行I/O口。8位數(shù)據(jù)為一幀,無起始位和停止位,先發(fā)送或接收最低位。波特率為fosc/12。幀格式如圖8-4。

圖8-4方式0的幀格式111.方式0輸出(1)方式0輸出的工作原理當(dāng)執(zhí)行一條將數(shù)據(jù)寫入發(fā)送緩沖器SBUF指令時(shí),產(chǎn)生一個(gè)正脈沖,串行口開始把SBUF中的8位數(shù)據(jù)以fosc/12的固定波特率從RXD引腳串行輸出,低位在先,TXD引腳輸出同步移位脈沖,發(fā)送完8位數(shù)據(jù),中斷標(biāo)志位TI置“1”。發(fā)送時(shí)序如圖8-5。12圖7-5方式0發(fā)送時(shí)序13(2)方式0輸出的應(yīng)用典型應(yīng)用是外擴(kuò)串行輸入/并行輸出的同步移位寄存器74LS164,實(shí)現(xiàn)并行輸出端口的擴(kuò)展。

圖8-6為串行口工作在方式0,通過74LS164的輸出來控制8個(gè)外接LED發(fā)光二極管亮滅的接口電路。當(dāng)串行口被設(shè)置在方式0輸出時(shí),串行數(shù)據(jù)由RXD端(P3.0)送出,移位脈沖由TXD端(P3.1)送出。在移位脈沖的作用下,串行口發(fā)送緩沖器的數(shù)據(jù)逐位地從RXD端串行地移入74LS164中。1415圖8-6串行口的方式0外接8個(gè)LED發(fā)光二極管的接口電路【例8-1】如圖8-6所示,編寫程序控制8個(gè)發(fā)光二極管輪流點(diǎn)亮。圖中74LS164的CLK端為同步脈沖輸入端,CLR為控制端,當(dāng)CLR=0時(shí),允許串行數(shù)據(jù)從A和B端輸入但是8位并行輸出端關(guān)閉;當(dāng)CLR=1時(shí),A和B輸入端關(guān)閉,但是允許74LS164中的8位數(shù)據(jù)并行輸出。當(dāng)8位串行數(shù)據(jù)發(fā)送完畢后,引起中斷,在中斷服務(wù)程序中,單片機(jī)通過串行口輸出下一個(gè)8位數(shù)據(jù)。采用中斷方式的參考程序如下。16#include<reg51.h>#include<stdio.h>sbitP1_0=0x90;unsignedcharnSendByte;voiddelay(unsignedinti){ intj; for(;i>0;i--) for(j=0;j<125;j++);} main(){ SCON=0x00; /*設(shè)置串行口為方式0*/ EA=1; /*全局中斷允許*/ ES=1; /*允許串行口中斷*/ nSendByte=1; SBUF=nSendByte; //啟動(dòng)串口發(fā)送

P1_0=0; //允許串口向164串行發(fā)送數(shù)據(jù)

while(1);}17voidSerial_Port()interrupt4using0{ TI=0;P1_0=1; nSendByte<<=1; if(nSendByte==0)nSendByte=1; SBUF=nSendByte; delay(500); P1_0=0;}182.方式0輸入(1)方式0輸入工作原理方式0接收,REN為允許接收控制位,REN=0,禁止接收;REN

=

1,允許接收。當(dāng)向SCON寄存器寫入控制字(設(shè)置為方式0,并使REN位置“1”,同時(shí)RI

=

0)時(shí),產(chǎn)生一個(gè)正脈沖,串行口開始接收數(shù)據(jù)。引腳RXD為數(shù)據(jù)輸入端,TXD為移位脈沖信號(hào)輸出端,接收器以fosc/12的固定波特率采樣RXD引腳的數(shù)據(jù)信息,當(dāng)接收完8位數(shù)據(jù)時(shí),中斷標(biāo)志RI置“1”,表示一幀數(shù)據(jù)接收完畢,通知CPU讀取該數(shù)據(jù),并執(zhí)行RI=0指令,準(zhǔn)備接收下一幀數(shù)據(jù),時(shí)序如圖8-7。19圖7-7方式0接收時(shí)序2021(2)方式0輸入應(yīng)用舉例

【例8-2】圖8-8為串口外接一片8位并行輸入、串行輸出的同步移位寄存器74LS165,擴(kuò)展一個(gè)8位并行輸入口的電路,可將接在74LS165的8個(gè)開關(guān)的狀態(tài)通過串口方式0讀入到單片機(jī)內(nèi)。74LS165的SH/LD端為控制端。若SH/LD=0,則74LS165可并行輸入數(shù)據(jù),且串行輸出端關(guān)閉;SH/LD=1,則并行輸入關(guān)斷,可以串行輸出。22圖8-8外接并行輸入串行輸出的同步移位寄存器#include<reg51.h>sbitP1_1=0x91;voiddelay(unsignedinti){ intj; for(;i>0;i--)for(j=0;j<125;j++);}voidmain(){SCON=0x10; /*串行口初始化為方式0*/while(1){P1_1=0;P1_1=1;while(RI==0);RI=0;P2=SBUF;/*讀入SBUF中的數(shù)據(jù)*/delay(10);}}23參考程序如下:查詢方式讀入開關(guān)狀態(tài)作業(yè):中斷方式讀入開關(guān)狀態(tài)8.2.2方式1方式1為雙機(jī)串行通信方式,如圖8-9所示。當(dāng)SM0、SM1=01時(shí),串行口設(shè)為方式1的雙機(jī)串行通信。TXD腳和RXD腳分別用于發(fā)送和接收數(shù)據(jù)。

圖8-9

方式1雙機(jī)串行通信的連接電路24方式1一幀數(shù)據(jù)為10位,1個(gè)起始位(0),8個(gè)數(shù)據(jù)位,1個(gè)停止位(1),先發(fā)送或接收最低位。幀格式如圖8-10。

圖8-10

方式1的幀格式方式1為波特率可變的8位異步通信接口。波特率由下式確定:

方式1波特率

=

定時(shí)器T1的溢出率SMOD為PCON寄存器的最高位的值(0或1)。251.方式1發(fā)送方式1輸出時(shí),數(shù)據(jù)位由TXD端輸出,當(dāng)CPU執(zhí)行一條數(shù)據(jù)寫SBUF的指令,就啟動(dòng)發(fā)送。發(fā)送時(shí)序見圖8-11。圖8-11中TX時(shí)鐘的頻率就是發(fā)送的波特率。26內(nèi)部發(fā)送控制信號(hào)圖8-11方式1發(fā)送時(shí)序中斷標(biāo)志位TI置“1發(fā)送移位時(shí)鐘信號(hào)空閑為12.方式1接收方式1接收時(shí)(REN

=

1),數(shù)據(jù)從RXD(P3.1)引腳輸入。當(dāng)檢測到起始位的負(fù)跳變,則開始接收。接收時(shí)序見圖8-12。27

圖8-12

方式1接收時(shí)序接收移位時(shí)鐘信號(hào)空閑為1D7接收數(shù)據(jù)有效(能裝入SBUF且能被CPU讀出的)的條件:(1)RI=0;SM2=0(方式1時(shí),SM2設(shè)為0)。(2)RI=0;

RB8

=

1(控制激活RI的功能),

SM2=1(只有接收到有效的停止位,RI才被置“1”。若不滿足任何一個(gè)條件,收的數(shù)據(jù)不能被CPU讀,該幀數(shù)據(jù)將丟棄。288.2.3方式2方式2和方式3,9位異步通信接口。每幀數(shù)據(jù)為11位,1位起始位0,8位數(shù)據(jù)位(先低位),1位可程控為1或0的第9位數(shù)據(jù)和1位停止位。方式2、方式3幀格式如圖8-13。

圖8-13

方式2、方式3的幀格式

方式2波特率

=

fosc291.方式2發(fā)送發(fā)送前,先根據(jù)協(xié)議由軟件設(shè)置TB8(如奇偶校驗(yàn)位或多機(jī)通信的地址/數(shù)據(jù)標(biāo)志位),然后將要發(fā)送的數(shù)據(jù)寫入SBUF,即啟動(dòng)發(fā)送。TB8自動(dòng)裝入第9位數(shù)據(jù)位,逐一發(fā)送。發(fā)送完畢,使TI位置“1”。

圖8-14

方式2和方式3發(fā)送時(shí)序302.方式2接收SM0、SM1=10,且REN=1時(shí)。數(shù)據(jù)由RXD端輸入,當(dāng)位檢測邏輯采樣到RXD的負(fù)跳變,判斷起始位有效,便開始接收一幀信息。在接收完第9位數(shù)據(jù)后,需滿足以下兩個(gè)條件,才能將接收到的數(shù)據(jù)送入接收緩沖器SBUF。

(1)RI=0,意味著接收緩沖器為空。(2)SM2=0或接收到的第9位數(shù)據(jù)位RB8=1。當(dāng)滿足上述兩個(gè)條件時(shí),收到的數(shù)據(jù)送SBUF(接收緩沖器),第9位數(shù)據(jù)送入RB8,且RI置“1”。若不滿足這兩個(gè)條件,接收的信息將被丟棄。31串行口方式2和方式3接收時(shí)序如圖8-15。

圖8-15

方式2和方式3接收時(shí)序328.2.4方式3SM0、SM1=11時(shí),方式3。為波特率可變的9位異步通信方式,除了波特率外,方式3和方式2相同。方式3發(fā)送和接收時(shí)序如圖8-14和圖8-15所示。方式3波特率

=

定時(shí)器T1的溢出率338.4波特率的制定串行通信,收、發(fā)雙方發(fā)送或接收的波特率必須一致。8.4.1波特率的定義波特率的定義:串行口每秒鐘發(fā)送(或接收)的位數(shù)。348.4.2定時(shí)器T1產(chǎn)生波特率的計(jì)算(1)方式0時(shí),波特率固定為時(shí)鐘頻率fosc的1/12,不受SMOD位值的影響。若fosc

=

12MHz,波特率1Mbit/s。(2)方式2時(shí),波特率僅與SMOD位的值有關(guān)。 方式2波特率

=

fosc

若fosc

=

12MHz:

SMOD

=

0,波特率

=

187.5kbit/s;SMOD

=

1,波特率

=

375kbit/s。波特率

=

定時(shí)器T1的溢出率 (8-1)波特率由T1溢出率和SMOD的值共同決定。實(shí)際設(shè)定波特率時(shí),T1常設(shè)置為方式2定時(shí)(自動(dòng)裝初值),即TL1作為8位計(jì)數(shù)器,TH1存放備用初值。定時(shí)器T1的溢出率

=

(8-2)35(3)方式1或方式3時(shí),用T1作為波特率發(fā)生器波特率

= (8-3)結(jié)論:波特率隨fosc、SMOD和定時(shí)器TL0初值X而變化。定時(shí)器TL1在方式2的初值為X

實(shí)際使用時(shí),經(jīng)常根據(jù)已知波特率和時(shí)鐘頻率fosc來計(jì)算TL1的初值X。為避免繁雜的初值計(jì)算,常用的波特率和初值X間的關(guān)系常列成表8-2形式,供查用。36

表8-2 用定時(shí)器T1產(chǎn)生的常用波特率37波特率foscSMOD位方式初值X62.5kbit/s12MHz11、3FFH19.2kbit/s11.0592MHz11、3FDH9.6kbit/s11.0592MHz01、3FDH4.8kbit/s11.0592MHz01、3FAH2.4kbit/s11.0592MHz01、3F4H1.2kbit/s11.0592MHz01、3E8H表8-2有兩點(diǎn)需要注意:(1)在使用的時(shí)鐘振蕩頻率fosc為12MHz或6MHz時(shí),將初值X和fosc帶入式(8-3)中計(jì)算出的波特率有一定誤差。消除誤差可采用時(shí)鐘頻率11.0592MHz。(2)如果選用很低的波特率,如選為55,可將定時(shí)器T1設(shè)為方式1定時(shí)。但這種情況,T1溢出時(shí),需在中斷服務(wù)程序中重新裝入初值。中斷響應(yīng)時(shí)間和執(zhí)行指令時(shí)間會(huì)使波特率產(chǎn)生一定的誤差,可用改變初值的方法加以調(diào)整。38【例8-3】

若時(shí)鐘頻率為11.0592MHz,選用T1的方式2定時(shí)作為波特率發(fā)生器,波特率為2

.4kbit/s,求初值。設(shè)T1為方式2定時(shí),選SMOD

=

0。將已知條件帶入式(7-3)中

波特率

=

=

2400b/s從中解得:X

=

244

=

F4H。只要把F4H裝入TH1和TL1,即得波特率2400bit/s。也可直接從表7-2中查到。這里時(shí)鐘振蕩頻率選為11.0592MHz,就可使初值為整數(shù),從而產(chǎn)生精確的波特率。398.5串行通信的應(yīng)用設(shè)計(jì)串行通信接口設(shè)計(jì)時(shí),需考慮如下問題。(1)首先確定串行通信雙方的數(shù)傳速率和通信距離;(2)由串行通信的數(shù)傳速率和通信距離確定采用的串行通信接口標(biāo)準(zhǔn);(3)注意串行通信的通信線選擇,一般選用雙絞線較好,并根據(jù)傳輸?shù)木嚯x選擇纖芯的直徑。如空間干擾較多,還要選擇帶有屏蔽層的雙絞線。8.5.1各種串行通信接口標(biāo)準(zhǔn)AT89S51單串口的輸入、輸出均為TTL電平。以TTL電平串行傳輸數(shù)據(jù)的方式,抗干擾性差,傳輸距離短,速率低。為了提高串行通信可靠性,增大串行通信的距離和提高傳輸速率,一般都采用標(biāo)準(zhǔn)串行接口,如RS-232、RS-422A、RS-485等。418.5.2方式1的應(yīng)用設(shè)計(jì)

【例8-4】如圖甲、乙雙機(jī)串行通信,雙機(jī)的RXD和TXD相互交叉相連,甲機(jī)的P1口接8個(gè)開關(guān),乙機(jī)的P1口接8個(gè)發(fā)光二極管。甲機(jī)設(shè)置為只發(fā)不收的單工方式。要求甲機(jī)讀入P1口的8個(gè)開關(guān)的狀態(tài)后,通過串行口發(fā)送到乙機(jī),乙機(jī)將接收到的甲機(jī)的8個(gè)開關(guān)的狀態(tài)數(shù)據(jù)送入P1口,由P1口的8個(gè)發(fā)光二極管來顯示8個(gè)開關(guān)的狀態(tài)。雙方晶振均采用11.0592MHz。

參考程序如下。#include<reg51.h>voiddelay(unsignedinti){intj;for(;i>0;i--)for(j=0;j<125;j++);}voidmain(){TMOD=0x20; /*設(shè)置定時(shí)器T1為方式2*/TH1=0xfd; /*波特率9600*/TL1=0xfd;SCON=0x40; /*方式1只發(fā)送,不接收*/PCON=0x00; /*串行口初始化為方式0*/TR1=1; /*啟動(dòng)T1*/P1=0xff; /*P1口為輸入*/SBUF=P1;while(1){ if(TI==1); /*如果TI=1,發(fā)送完數(shù)據(jù)*/{ SBUF=P1; /*讀入P1口開關(guān)的狀態(tài)數(shù)據(jù)并送串行口發(fā)送*/ delay(100); TI=0; /*已發(fā)送完,再把TI清0*/ }}}44P218頁書中的程序是否工作正常,如不能找出原因/*甲機(jī)串行發(fā)送*/#include<reg51.h>voiddelay(unsignedinti){intj;for(;i>0;i--)for(j=0;j<125;j++);}voidmain(){ TMOD=0x20; /*設(shè)置定時(shí)器T1為方式2*/ TH1=0xfd; /*波特率9600*/ TL1=0xfd; SCON=0x50; /*設(shè)置串口為方式1接收,REN=1*/ PCON=0x00; /*SMOD=0*/ TR1=1; /*啟動(dòng)T1*/ while(1) { if(RI==1); /*若RI為1,接收到數(shù)據(jù)*/ { P1=SBUF; /*接收的數(shù)據(jù)送P1口控制8個(gè)LED的亮與滅*/ delay(100); RI=0; /*接收到數(shù)據(jù),則把RI清0*/ } }}45 /*乙機(jī)串行接收*/8.5.3方式2和方式3的應(yīng)用

方式2和方式1兩點(diǎn)不同:方式2收/發(fā)11位信息,第0位為起始位,第1~8位為數(shù)據(jù)位,第9位是程控位,可由用戶置TB8決定,第10位是停止位1。方式2波特率=振蕩器頻率/n。

當(dāng)SMOD

=

0時(shí),n

=

64。當(dāng)SMOD

=

1時(shí),n

=

32。除波特率的差別外,方式2的使用和方式3是一樣的,所以下面介紹的方式3應(yīng)用編程,也適用于方式2?!纠?-6】甲乙兩個(gè)單片機(jī)進(jìn)行方式3(或方式2)串行通訊。甲機(jī)將8個(gè)流水燈控制數(shù)據(jù)發(fā)送給乙機(jī),乙機(jī)再利用該數(shù)據(jù)點(diǎn)亮其P1口的8個(gè)LED。方式3比方式1多了一個(gè)可編程位TB8,該位一般作奇偶校驗(yàn)位。乙機(jī)接收到的8位二進(jìn)制數(shù)據(jù)有可能出錯(cuò),需進(jìn)行奇偶校驗(yàn),其方法是將乙機(jī)的RB8和PSW的奇偶校驗(yàn)位P進(jìn)行比較,如相同,接收數(shù)據(jù);否則拒絕接收。參考程序如下。

4749甲機(jī)發(fā)送程序如下:#include<reg51.h>unsignedcharcodeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};voidSend(unsignedchardat) /*發(fā)送一個(gè)字節(jié)數(shù)據(jù)的函數(shù)*/{ SBUF=dat;/*將待發(fā)送的數(shù)據(jù)寫入發(fā)送緩沖器*/TB8=P;/*將奇偶校驗(yàn)位寫入TB8*/ while(TI==0);/*檢測發(fā)送標(biāo)志位TI,TI=0,未發(fā)送完*/ ; /*空操作*/ TI=0; /*一個(gè)字節(jié)發(fā)送完,TI清0*/}voidDelay(void) /*延時(shí)大約200ms函數(shù)*/{ unsignedcharm,n; for(m=0;m<250;m++); for(n=0;n<250;n++);}voidmain(void) /*主函數(shù)*/{ unsignedchari; TMOD=0x20; /*設(shè)置定時(shí)器T1為方式2*/ SCON=0xc0; /*設(shè)置串口為方式3*/ PCON=0x00; /*SMOD=0*/ TH1=0xfd;/*給定時(shí)器T1賦初值,波特率設(shè)置為9600*/ TL1=0xfd; TR1=1; /*啟動(dòng)定時(shí)器T1*/ while(1) { for(i=0;i<8;i++) { Send(Tab[i]); Delay();/*大約200ms發(fā)送一次數(shù)據(jù)*/ }}}51乙機(jī)接收程序如下:#include<reg51.h>unsignedcharReceive(void) /*接收一個(gè)字節(jié)數(shù)據(jù)的函數(shù)*/{ unsignedchardat; while(RI==0);/*檢測接收中斷標(biāo)志RI,RI=0,未接收完,則循環(huán)等待*/ ; RI=0; /*已接收一幀數(shù)據(jù),將RI清0*/ ACC=SBUF; /*將接收緩沖器的數(shù)據(jù)存于ACC*/ if(RB8==P) /*只有奇偶校驗(yàn)成功才接收數(shù)據(jù)*/ { dat=ACC; /*將接收緩沖器的數(shù)據(jù),存于dat*/ returndat; /*將接收的數(shù)據(jù)返回*/ }}voidmain(void) /*主函數(shù)*/{TMOD=0x20; /*設(shè)置定時(shí)器T1為方式2*/ SCON=0xd0; /*設(shè)置串口為方式3,允許接收REN=1*/ PCON=0x00; /*SMOD=0*/ TH1=0xfd; /*給定時(shí)器T1賦初值,波特率為9600*/ TL1=0xfd; TR1=1; /*啟動(dòng)定時(shí)器T1*/while(1) P1=Receive();/*將接收到的數(shù)據(jù)送P1口顯示*/}多個(gè)單片機(jī)利用串口進(jìn)行多機(jī)通信,常采用圖8-16的主從式結(jié)構(gòu)。系統(tǒng)中1個(gè)主機(jī)(單片機(jī)或其他有串行接口的微機(jī))和多個(gè)單片機(jī)組成的從機(jī)系統(tǒng)。主機(jī)的RXD與所有從機(jī)的TXD端相連,TXD與所有從機(jī)的RXD端相連。從機(jī)地址分別為01H、02H和03H。

圖8-16

多機(jī)通信系統(tǒng)示意圖538.3多機(jī)通信主從式只有一個(gè)主機(jī),其余全是從機(jī)。

主機(jī)SM2=0;從機(jī)SM2=1,從機(jī)只能接收地址。主機(jī)發(fā)送帶TB8=1的地址幀,以選擇要通信的從機(jī)。各從機(jī)接收到主機(jī)發(fā)送的地址,與本機(jī)地址比較。相同時(shí)向主機(jī)發(fā)回本機(jī)地址,并置SM2=0,準(zhǔn)備接收主機(jī)發(fā)送給本機(jī)的數(shù)據(jù),其他從機(jī)SM2=1;

主機(jī)收到從機(jī)回應(yīng)地址后,開始發(fā)送帶TB8=0的命令或數(shù)據(jù),按照約定進(jìn)行通信。通信結(jié)束后,從機(jī)SM2=1;主從式只有一個(gè)主機(jī),其余全是從機(jī)。主機(jī)發(fā)送的信息可以被所有從機(jī)接收,任何一個(gè)從機(jī)發(fā)送的信息,只能由主機(jī)接收。從機(jī)和從機(jī)之間不能進(jìn)行直接通信,只能經(jīng)主機(jī)才能實(shí)現(xiàn)。多機(jī)通信的工作原理:

55要保證主機(jī)與所選擇的從機(jī)通信,須保證串口有識(shí)別功能。SCON中的SM2位就是為滿足這一條件設(shè)置的多機(jī)通信控制位。其工作原理是在串行口以方式2(或方式3)接收時(shí),若SM2=1,則表示進(jìn)行多機(jī)通信,有以下兩種情況:(1)從機(jī)接收到主機(jī)發(fā)來的第9位數(shù)據(jù)RB8=1時(shí),前8位數(shù)據(jù)才裝入SBUF,并置中斷標(biāo)志RI

=

1,向CPU發(fā)出中斷請(qǐng)求。在中斷服務(wù)程序中,從機(jī)把接收到的SBUF中的數(shù)據(jù)存入數(shù)據(jù)緩沖區(qū)中。(2)如果從機(jī)接收到的第9位數(shù)據(jù)RB8=0時(shí),則不產(chǎn)生中斷標(biāo)志RI=1,不引起中斷,從機(jī)不接收主機(jī)發(fā)來的數(shù)據(jù)。若SM2

=

0,則接收的第9位數(shù)據(jù)不論是0還是1,從機(jī)都將產(chǎn)生RI

=

1中斷標(biāo)志,接收到的數(shù)據(jù)裝入SBUF中。56多機(jī)通信的工作過程:(1)各從機(jī)初始化程序允許從機(jī)串口中斷,將串口編程為方式2或方式3接收,即9位異步通信方式,且SM2和REN位置“1”,使從機(jī)處于多機(jī)通信且只接收地址幀的狀態(tài)。(2)在主機(jī)和某從機(jī)通信之前,先將從機(jī)地址(即準(zhǔn)備接收數(shù)據(jù)的從機(jī))發(fā)送給各個(gè)從機(jī),接著才傳送數(shù)據(jù)(或命令),主機(jī)發(fā)出的地址幀信息的第9位為1,數(shù)據(jù)(或命令)幀的第9位為0。當(dāng)主機(jī)向各從機(jī)發(fā)送地址幀時(shí),各從機(jī)的串行口接收到的第9位信息RB8為1,且由于各從機(jī)的SM2=1,57則RI置“1”,各從機(jī)響應(yīng)中斷,在中斷服務(wù)子程序中,判斷主機(jī)送來的地址是否和本機(jī)地址相符合,若為本機(jī)地址,則該從機(jī)SM2位清“0”,準(zhǔn)備接收主機(jī)的數(shù)據(jù)或命令;若地址不相符,則保持SM2

=

1。(3)接著主機(jī)發(fā)送數(shù)據(jù)(或命令)幀,數(shù)據(jù)幀的第9位為0。此時(shí)各從機(jī)接收到的RB8=0。只有與前面地址相符合的從機(jī)(即SM2位已清“0”的從機(jī))才能激活中斷標(biāo)志位RI,從而進(jìn)入中斷服務(wù)程序,接收主機(jī)發(fā)來的數(shù)據(jù)(或命令);與主機(jī)發(fā)來的地址不相符的從機(jī),由于SM2保持為1,又RB8

=

0,因此不能激活中斷標(biāo)志RI,就不能接受主機(jī)58發(fā)來的數(shù)據(jù)幀。從而保證主機(jī)與從機(jī)間通信的正確性。此時(shí)主機(jī)與建立聯(lián)系的從機(jī)已經(jīng)設(shè)置為單機(jī)通信模式,即在整個(gè)通信中,通信的雙方都要保持發(fā)送數(shù)據(jù)的第9位(即TB8位)為0,防止其他從機(jī)誤接收數(shù)據(jù)。(4)結(jié)束數(shù)據(jù)通信并為下一次的多機(jī)通信做好準(zhǔn)備。在多機(jī)系統(tǒng),每個(gè)從機(jī)都被賦予唯一的地址。例如,圖8-16三個(gè)從機(jī)的地址可設(shè)為:01H、02H、03H。還要預(yù)留1~2個(gè)“廣播地址”,它是所有從機(jī)共有的地址,例如將“廣播地址”設(shè)為00H。當(dāng)主機(jī)與從機(jī)的數(shù)據(jù)通信結(jié)束后,一定要將從機(jī)再設(shè)置為多機(jī)通信模式,以便進(jìn)行下一次的多機(jī)通信。59這時(shí)要求與主機(jī)正在進(jìn)行數(shù)據(jù)傳輸?shù)膹臋C(jī)須隨時(shí)注意,一旦接收的數(shù)據(jù)第9位(RB8)為“1”,說明主機(jī)傳送的不再是數(shù)據(jù),而是地址,這個(gè)地址就有可能是“廣播地址”。當(dāng)收到“廣播地址”后,便將從機(jī)的通信模式再設(shè)置成多機(jī)模式,為下一次多機(jī)通信做好準(zhǔn)備。608.5.4主從式多機(jī)通信的應(yīng)用介紹主從式多機(jī)通信的應(yīng)用編程?!纠?-7】如圖所示,主機(jī)分別與三個(gè)從機(jī)進(jìn)行通信,這里僅以地址為01H的1#從機(jī)為例,實(shí)現(xiàn)主從機(jī)的通信,其他從機(jī)的程序與1#從機(jī)相同,只是定義的地址不同。約定如下。(1)3臺(tái)從機(jī)的地址為00H~02H。(2)主機(jī)發(fā)出的地址FFH為一條控制指令,使所有從機(jī)都處于SM2=1的狀態(tài)。(3)其余的控制指令:00H—接收指令,01H—發(fā)送指令。這兩條指令是作為數(shù)據(jù)發(fā)送的。(4)從機(jī)的狀態(tài)字如圖8-21所示。6162圖8-21從機(jī)狀態(tài)字的格式約定其中:ERR(位D7)=1,表示收到非法命令。TRDY(位D1)=1,表示發(fā)送準(zhǔn)備完畢。RRDY(位D0)=1,表示接收準(zhǔn)備完畢。通信時(shí),主機(jī)采用查詢方式,從機(jī)采用中斷方式。主機(jī)串行口設(shè)為方式3,允許接收,并置TB8為1,因?yàn)橹挥幸粋€(gè)主機(jī),所以主機(jī)的SCON控制寄存器中的SM2不要置1,故控制字為11011000,即D8H。/*主機(jī)程序*/#include<reg51.h> #defineucharunsignedchar #defineBytenum16 /*傳送一次的字節(jié)數(shù)*/

ucharmaster(ucharaddrs,ucharcomnd)ucharslave=0x00; /*從機(jī)地址*/ucharidatardata[16];ucharidatatdata[16]={“abcdefghijklmnop”}; voidmain(void){ uchari;for(i=0;i<10;i++); /*延時(shí)參數(shù)可根據(jù)需要調(diào)整*/ TMOD=0x20; /*設(shè)置T1為定時(shí)器方式2*/ TH1=0xfa; /*波特率4800*/ TL1=0xfa; 63PCON=0x00; SCON=0xd0; /*方式3,允許接收,SM2=1*/ TR1=1; /*啟動(dòng)T1*/ SCON=0xd0; /*方式3允許接收*/master(slave,0x01);master(slave,0x02);slave++}voiderror(void){ SBU

溫馨提示

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