《單片機(jī)系統(tǒng)設(shè)計(jì)仿真與應(yīng)用》課件第5章_第1頁(yè)
《單片機(jī)系統(tǒng)設(shè)計(jì)仿真與應(yīng)用》課件第5章_第2頁(yè)
《單片機(jī)系統(tǒng)設(shè)計(jì)仿真與應(yīng)用》課件第5章_第3頁(yè)
《單片機(jī)系統(tǒng)設(shè)計(jì)仿真與應(yīng)用》課件第5章_第4頁(yè)
《單片機(jī)系統(tǒng)設(shè)計(jì)仿真與應(yīng)用》課件第5章_第5頁(yè)
已閱讀5頁(yè),還剩96頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

5.1串行口工作原理

5.2串行口協(xié)議設(shè)計(jì)

5.3串行口應(yīng)用設(shè)計(jì)

5.4小結(jié)

習(xí)題

5.1.1串行口的專用寄存器

1.串行口控制寄存器SCON

串行口控制寄存器是串行口控制和狀態(tài)寄存器。SCON包含:串行口工作方式選擇位、接收發(fā)送控制位以及串行口狀態(tài)標(biāo)志位,其位格式如下:5.1串行口工作原理

SM0、SM1(SCON.7、SCON.6):串行口的工作方式選擇位,其編碼見(jiàn)表5-1,其中fosc為振蕩頻率。

SM2(SCON.5):多機(jī)通信控制位,主要用于方式2和方式3。

REN(SCON.4):串行口接收允許位,由軟件置位以允許接收,由軟件清0來(lái)禁止接收。

TB8(SCON.3):在方式2和方式3中為發(fā)送的第9位數(shù)據(jù)。

RB8(SCON.2):在方式2和方式3中為接收到的第9位數(shù)據(jù)。

TI(SCON.1):發(fā)送中斷標(biāo)志。

RI(SCON.0):接收中斷標(biāo)志。表5-1串行口的工作方式

2.串行口數(shù)據(jù)緩沖器SBUF

MCS-51單片機(jī)內(nèi)的串行接口部分,具有兩個(gè)物理上獨(dú)立的緩沖器:發(fā)送緩沖器和接收緩沖器,以便能以全雙工的方式進(jìn)行通信。

3.電源控制寄存器PCON

電源控制寄存器PCON的第7位是與串行口的波特率設(shè)置有關(guān)的選擇位。其位格式如下:

?SMOD(PCON.7):串行口波特率倍增位。

GF1(PCON.3)、GF0(PCON.2):兩個(gè)通用標(biāo)志位,由程序使用。

PD(PCON.1)、IDL(PCON.0):CHMOS器件的低功耗控制位。5.1.2串行口的工作方式

1.方式0

方式0為同步移位寄存器輸入輸出方式。

圖5-1(a)為串行口外接一片串入并出移位寄存器74LS164的輸出接口電路,該電路用于擴(kuò)展并行輸出口;圖5-1(b)為串行口外接一片并入串出移位寄存器74LS165的輸入接口電路,該電路用于擴(kuò)展并行輸入口。圖5-1方式0發(fā)送、接收電路

2.方式1

串行接口工作于方式1時(shí),被定義為10位的異步通信接口,即傳送一幀信息需要10位。

串行接口以方式1發(fā)送時(shí),數(shù)據(jù)由TXD端輸出。

3.方式2和方式3

串行接口工作于方式2和方式3時(shí),被定義為11位的異步通信接口,即傳送一幀信息需要11位。5.1.3波特率的設(shè)置

MCS-51單片機(jī)串行口通信的波特率取決于串行口的工作方式。四種工作方式的波特率計(jì)算公式分別如下:

1.T/C1溢出率的計(jì)算

在串行通信方式1和方式3下,使用定時(shí)器T/C1作為波特率發(fā)生器。

前面我們介紹過(guò)定時(shí)器定時(shí)時(shí)間的計(jì)算方法,同樣,我們?cè)O(shè)X為時(shí)間常數(shù)即定時(shí)器的初值;fosc為晶振頻率,當(dāng)定時(shí)器T/C1工作于方式2時(shí),則有:

溢出周期?=T/C1溢出率

==

2.波特率的設(shè)置

由上述可得,當(dāng)串行口工作于方式1或方式3、定時(shí)器T/C1工作于方式2時(shí)有波特率?==由上式可以看出,當(dāng)X=255時(shí),波特率為最高。如fosc=12?MHz、SMOD=0,則波特率為31.25?kb/s;若SMOD=1,則波特率為62.5?kb/s,這是fosc=12?MHz時(shí)波特率的上限。若要求更高的波特率,則需要提高主振頻率fosc。在實(shí)際應(yīng)用中,一般是先按照所要求的通信波特率設(shè)定SMOD,然后再算出T/C1的時(shí)間常數(shù)。即X?=

我們?cè)O(shè)SMOD=1,則T/C1的時(shí)間常數(shù)X的值為X?==

256-=

208=D0H表5-2列出了常用波特率與其他參數(shù)的關(guān)系。系統(tǒng)振蕩頻率fosc選為11.0592?MHz是為了使定時(shí)器初值為整數(shù),從而產(chǎn)生精確的波特率。表5-2常用波特率與其他參數(shù)的關(guān)系注:方式0時(shí),BAUD=fosc/12;方式2時(shí),BAUD=2SMOD×fosc/64。5.2.1串行通信接口的基本任務(wù)

串行通信接口的基本任務(wù)包括:

(1)實(shí)現(xiàn)數(shù)據(jù)格式化。

(2)進(jìn)行串并轉(zhuǎn)換。

(3)控制數(shù)據(jù)傳輸速率。

(4)進(jìn)行錯(cuò)誤檢測(cè)。

(5)進(jìn)行TTL與EIA電平轉(zhuǎn)換。

5.2串行口協(xié)議設(shè)計(jì)5.2.2串行通信協(xié)議

單片機(jī)串口稱為“通用異步收發(fā)器”(UART,UniversalAsynchronousReceiverandTransmitter)。

1.特點(diǎn)與格式

串行通信異步協(xié)議的特點(diǎn)是一個(gè)字符一個(gè)字符地傳輸,并且傳送一個(gè)字符總是以起始位開(kāi)始,以停止位結(jié)束的,字符之間沒(méi)有固定的時(shí)間間隔要求。其格式如圖5-2所示。

圖5-3表示了傳送一個(gè)字符E的ASCAII碼的波形,當(dāng)把它的最低有效位寫(xiě)到右邊時(shí),就是E的ASCII碼1000101=45H。圖5-2傳送的字符格式圖5-3傳送字符E的ASCII碼的波形

2.起始/停止位的作用

起始位實(shí)際上是作為聯(lián)絡(luò)信號(hào)附加進(jìn)來(lái)的,當(dāng)它變?yōu)榈碗娖綍r(shí),則告訴收方傳送開(kāi)始。它的到來(lái),表示數(shù)據(jù)位將接著出現(xiàn),要準(zhǔn)備接收。5.2.3協(xié)議的設(shè)計(jì)

使用串口進(jìn)行通信,通常包括單片機(jī)與主機(jī)間的通信、單片機(jī)間的通信以及多單片機(jī)間的通信三種。5.3.1原理圖設(shè)計(jì)與說(shuō)明

本章使用的電路原理圖如圖5-4~圖5-7所示。5.3串行口應(yīng)用設(shè)計(jì)圖5-4單片機(jī)與微機(jī)通信原理圖圖5-5多單片機(jī)間通信頂層電路圖圖5-6圖5-5中的SUB2子電路原理圖圖5-7圖5-5中的SUB3子電路原理圖關(guān)于圖5-4~圖5-7原理圖的說(shuō)明如下:

(1)圖5-4是單片機(jī)與微機(jī)通信原理圖;圖5-5和圖5-6組合在一起是雙機(jī)通信原理圖;圖5-5、圖5-6和圖5-7組合在一起是多機(jī)通信原理圖。

(2)圖5-4中使用了四臺(tái)虛擬終端。

(3)串口模型器件應(yīng)選用COMPIM。在ProteusISIS元件庫(kù)的“Connectors”類的“D-Type”子類中,也有一個(gè)串口模型器件CONN-D9F,因該器件在使用時(shí)沒(méi)有仿真模型,將會(huì)導(dǎo)致仿真失敗,所以要避免選用。

(4)?COMPIM器件使用前要進(jìn)行設(shè)置,本章使用的設(shè)置結(jié)果如圖5-8所示。圖5-8COMPIM器件使用前的設(shè)置

(5)四個(gè)虛擬終端也要進(jìn)行相應(yīng)的設(shè)置。PC_TX代表計(jì)算機(jī)發(fā)送數(shù)據(jù),PC_RX用來(lái)監(jiān)視PC接收到的數(shù)據(jù),它們的屬性設(shè)置完全一樣,如圖5-9所示。MCS_TX和MCS_RX分別是單片機(jī)的數(shù)據(jù)發(fā)送和接收終端,用來(lái)監(jiān)視單片機(jī)發(fā)送和接收的數(shù)據(jù),它們的屬性設(shè)置完全一樣,如圖5-10所示。圖5-9MCS_TX和MCS_RX的設(shè)置結(jié)果圖圖5-10PC_TX和PC_RX的設(shè)置結(jié)果

(6)使用時(shí),原理圖中的電阻R1不能少,否則虛擬終端PC_RX將收不到信息。

(7)圖5-5、圖5-6和圖5-7是單片機(jī)間通信原理圖。

(8)圖5-6和圖5-7中均有一個(gè)按鍵和一個(gè)LED燈,可用于機(jī)間通信控制,例如,用SUB2中的按鍵控制SUB3中的LED燈的亮滅等。

(9)使用器件列表如圖5-11所示,在Proteus中輸入器件名稱即可找到該器件。圖5-11元器件列表清單

2.設(shè)計(jì)說(shuō)明

根據(jù)單片機(jī)與微機(jī)通信的設(shè)計(jì)要求。可以看出,單片機(jī)與微機(jī)采用了以下握手協(xié)議:

(1)單片機(jī)向微機(jī)發(fā)送信息,以“-”作為結(jié)束符;

(2)當(dāng)微機(jī)接收到結(jié)束符“-”后,即向單片機(jī)回送信息,并以“-”作為結(jié)束符;

(3)當(dāng)單片機(jī)接收到結(jié)束符“-”后,將信息顯示于液晶屏上。

程序設(shè)計(jì)流程圖如圖5-12所示。圖5-12單片機(jī)與微機(jī)通信時(shí)的單片機(jī)程序流程圖

3.設(shè)計(jì)源碼

單片機(jī)與微機(jī)通信的源程序見(jiàn)例5-1。

【例5-1】

單片機(jī)與微機(jī)通信的源程序。

#include<reg51.h>

#defineucharunsignedchar

//定義一個(gè)長(zhǎng)度為16的空串,用于存放接收字符顯示

ucharrecdata[16]="";

uchartrdata[16]="FromA:master!";

voidLcd_initialize(void);

voidLcd_display(ucharaddr,uchar*str);

voiddelay(ucharx);//*************串口通信函數(shù)——單機(jī)通信*****************//

//本單片機(jī)(機(jī)A)發(fā)送一字符串:"FromA:master!";

//微機(jī)(用虛擬終端模擬)接收并顯示"FromA:master!",然后回送"abc-"

//當(dāng)接收到微機(jī)傳送過(guò)來(lái)的"abc"后在液晶屏中顯示出來(lái)。

//然后,間隔200?ms后再循環(huán)以上過(guò)程

voidmain(void)

{ uchari;

Lcd_initialize();

Lcd_display(0x00,“MCS51<---->PC:”);

//第1行顯示值

TMOD=TMOD|0x20;

//設(shè)置波特率為9600的定時(shí)器1方式和初值

TL1=0xfd;TH1=0xfd; //此值對(duì)應(yīng)單片機(jī)晶振頻率為11.0592?MHz

SCON=0x50;PCON=0x00;

//設(shè)置串行口方式

TR1=1;

while(1)

{ i=0;

while(trdata[i]!='\0') //發(fā)送字符串

{

SBUF=trdata[i];

while(TI==0);

TI=0;

i++;

}

SBUF='-';//發(fā)送結(jié)束字符

while(TI==0);

TI=0; i=0;

//i清0,為接收作準(zhǔn)備

while(RI==0); //接收應(yīng)答

RI=0;

recdata[i]=SBUF;

while(recdata[i]!=‘-’)

//傳完后,應(yīng)答A機(jī)并顯示收到的字符串

{

i++;

while(RI==0);//接收應(yīng)答

RI=0;

recdata[i]=SBUF;

} recdata[i]=‘\0’;

Lcd_display(0x40,recdata);

//第2行顯示

delay(200);delay(200);

//延時(shí)200?ms后,繼續(xù)以上A機(jī)和B機(jī)的握手過(guò)程

}

}

4.仿真結(jié)果

運(yùn)行仿真,結(jié)果如圖5-13所示。圖5-13單片機(jī)與主機(jī)的發(fā)送/接收監(jiān)視情況

從圖5-13中可看出,默認(rèn)情況下,在PC_T中輸入字符后并不會(huì)顯示出來(lái),為了讓輸入的字符顯示出來(lái),則需要在PC_T界面中單擊鼠標(biāo)右鍵選中“EchoTypedCharacters”,如圖5-14所示。圖5-14虛擬終端回顯字符的設(shè)置5.3.3雙機(jī)通信設(shè)計(jì)

1.設(shè)計(jì)要求

用兩個(gè)MCS-51單片機(jī)進(jìn)行雙機(jī)通信設(shè)計(jì)。具體要求如下:

(1)?A機(jī)向B機(jī)發(fā)送字符串。

(2)?B機(jī)接收到字符串后,向A機(jī)發(fā)送另一個(gè)字符串,循環(huán)進(jìn)行。

(3)?B機(jī)接收完成點(diǎn)亮LED燈,B機(jī)發(fā)送完成熄滅LED燈。

2.設(shè)計(jì)說(shuō)明

雙機(jī)通信類似于單片機(jī)與主機(jī)間的通信。根據(jù)設(shè)計(jì)要求,可得出如圖5-15所示的雙機(jī)程序流程圖。圖5-15雙機(jī)通信程序流程圖

3.設(shè)計(jì)源碼

雙機(jī)通信源程序包括主機(jī)A的源程序和從機(jī)B的源程序,分別如例5-2和例5-3所示。

【例5-2】

主機(jī)A的源程序。

#include<reg51.h>

#defineucharunsignedchar

//定義一個(gè)長(zhǎng)度為16的空串,用于存放接收字符顯示

ucharrecdata[16]="";

uchartrdata[16]="FromA:master!";

voidLcd_display(ucharaddr,uchar*str);//LCD顯示函數(shù),該LCD與單片機(jī)在同一圖中voidLcd_initialize(void);

voiddelay(ucharx);

//*************串口通信函數(shù)——雙機(jī)通信*****************//

//本單片機(jī)(A機(jī))發(fā)送一字符串:"FromA:hjk!";

//另一單片機(jī)(B機(jī))接收,接收完成后回送"FromB:slave_1",并在液晶屏中顯示"FromA:hjk!"

//當(dāng)接收到B機(jī)傳送過(guò)來(lái)的"FromB:slave_1"后在液晶屏中顯示出來(lái)。

//然后,間隔200?ms后再循環(huán)以上過(guò)程

voidserial(void)

{ uchari;

TMOD=0x20;

TL1=0xfd;TH1=0xfd;

SCON=0xd8;PCON=0x00; //設(shè)置串行口方式

TR1=1;

while(1)

{

i=0;

while(trdata[i]!='\0') //發(fā)送字符串

{ SBUF=trdata[i];

while(TI==0);

TI=0;

i++;

}

SBUF='-'; //發(fā)送結(jié)束字符

while(TI==0);

TI=0; i=0; //i清0,為接收作準(zhǔn)備

while(RI==0);//接收應(yīng)答

RI=0;

recdata[i]=SBUF;

while(recdata[i]!=‘-’)

//傳完后,應(yīng)答A機(jī)并顯示收到的字符串

{

i++;

while(RI==0);//接收應(yīng)答

RI=0;

recdata[i]=SBUF;

} recdata[i]=‘\0’;

Lcd_display(0x40,recdata); //第2行顯示

delay(200);

//延時(shí)200?ms后,繼續(xù)以上A機(jī)和B機(jī)的握手過(guò)程

}

}

//*************主函數(shù)*****************//voidmain(void)

{

Lcd_initialize();

Lcd_display(0x00,“Awelcomeyou!”);

//第1行顯示歡迎字符

serial();

}【例5-3】從機(jī)B的源程序。

#include<reg51.h>

#defineucharunsignedchar

sbitled=P2^3; //定義LED引腳,用于串口通訊指示

ucharrecdata[16]=“”;

//定義一個(gè)長(zhǎng)度為16的空串,用于存放接收字符顯示

uchartrdata[16]="FromB:slave_1!";

voidLcd_initialize(void);

voidLcd_display(ucharaddr,uchar*str); //LCD顯示函數(shù)//*************串口通信函數(shù)*****************//

//單片機(jī)(A機(jī))發(fā)送一字符串:"FromA:hjk!";

//本單片機(jī)(B機(jī))接收,接收完成后在液晶屏中顯示"FromA:hjk!",并回送"FromB:slave_1!",

//同時(shí)用LED燈來(lái)?yè)ナ緜魉蜁r(shí)間(滅燈時(shí)間即回送時(shí)間)

//當(dāng)接收到B機(jī)傳送過(guò)來(lái)的"slave_1!"后在液晶屏中顯示出來(lái)。

//然后,間隔200?ms后再循環(huán)以上過(guò)程

voidserial(void)

{ uchari=0;

TMOD=0x20;

//設(shè)置波特率為9600的定時(shí)器1方式和初值

TL1=0xfd;TH1=0xfd;

SCON=0xd8;PCON=0x00;

//設(shè)置串行口方式3,允許接收,TB8置1

TR1=1;

while(1)

{

while(RI==0);

RI=0;

recdata[i]=SBUF;

if(recdata[i]=='-') //傳完后,應(yīng)答A機(jī)并顯示收到的字符串

{ led=0;//以LED指示A機(jī)傳送完畢

recdata[i]=‘\0’;

Lcd_display(0x40,recdata); //第2行顯示

i=0;

//此處i清0,為應(yīng)答作準(zhǔn)備

while(trdata[i]!='\0')

{

SBUF=trdata[i];

while(TI==0);

TI=0;

i++;

} SBUF=‘-’; //發(fā)送結(jié)束字符

while(TI==0);

TI=0;

led=1; //以LED指示B機(jī)應(yīng)答完畢

i=0;

//此處i清0,為下一次接收作準(zhǔn)備

}

else i++; }

}

voidmain()

{

Lcd_initialize();

Lcd_display(0x00,"Bwelcomeyou!"); //第1行顯示歡迎字符

serial(); //串口接收并顯示函數(shù)

}4.仿真結(jié)果

啟動(dòng)仿真,仿真結(jié)果如圖5-16和圖5-17所示。圖5-16A機(jī)仿真結(jié)果圖5-17B機(jī)仿真結(jié)果5.3.4多機(jī)通信設(shè)計(jì)

1.設(shè)計(jì)要求

用三個(gè)MCS-51單片機(jī)進(jìn)行多機(jī)通信設(shè)計(jì)。具體要求如下:

(1)一個(gè)主機(jī)MasterA,兩個(gè)從機(jī):Slave_1B和Slave_2C。

(2)主機(jī)與從機(jī)的通信過(guò)程按以下四個(gè)步驟進(jìn)行。這四個(gè)步驟間的延時(shí)設(shè)定為0.5?s。

(3)在多機(jī)通信前,主機(jī)和從機(jī)均顯示歡迎信息。

2.設(shè)計(jì)說(shuō)明

由主機(jī)控制的多機(jī)通信可按照以下協(xié)議進(jìn)行:

(1)首先使所有從機(jī)的SM2位置1,即使所有從機(jī)處于只接收地址幀的狀態(tài)。

(2)主機(jī)先發(fā)送一個(gè)地址幀,其中8位為地址,第9位為地址/數(shù)據(jù)幀的標(biāo)志位,該位置為1表示該幀為地址幀。

(3)從機(jī)接收到地址幀后,各自將其接收到的地址與本從機(jī)的地址比較。

(4)主機(jī)發(fā)送完地址幀后,就可以發(fā)送數(shù)據(jù)幀,即將發(fā)送幀的第9位置為0。

(5)在第(3)步中與地址幀有相同地址的從機(jī),由于其SM2=0,所以可以接收主機(jī)發(fā)送的數(shù)據(jù)幀,并根據(jù)數(shù)據(jù)幀的指示完成相應(yīng)的操作。

(6)從機(jī)按照主機(jī)的指示,完成相應(yīng)的操作后,則重新回到監(jiān)聽(tīng)地址狀態(tài)。

(7)主機(jī)在第(4)步發(fā)送完數(shù)據(jù)后,在從機(jī)的配合下,主機(jī)完成相應(yīng)的功能操作。圖5-18中僅列出了從機(jī)B的程序流程圖,事實(shí)上,其他從機(jī)的程序流程圖可與從機(jī)B的完全一致,各從機(jī)之間的區(qū)別是每個(gè)從機(jī)向主機(jī)發(fā)送的信息可能不同,接收到主機(jī)的信息后對(duì)數(shù)據(jù)的處理過(guò)程也可能不同。圖5-18多機(jī)通信程序流程圖

3.設(shè)計(jì)源碼

主機(jī)A、兩個(gè)從機(jī)B和C均單獨(dú)編寫(xiě)程序文件,源程序分別見(jiàn)例5-4、例5-5和例5-6。

【例5-4】

主機(jī)A的源程序。

#include<reg51.h>

#defineucharunsignedchar

#defineuintunsignedint

#defineslave2

//定義一個(gè)長(zhǎng)度為16的空串,用于存放接收字符顯示

ucharrecdata[16]="";

uchartrdata[16]="FromA:master!";voidLcd_initialize(void);

voidLcd_display(ucharaddr,uchar*str);

voidmaster(ucharslave_addr,ucharcom);

voiddelay(ucharx);

//*************串口初始化函數(shù)*****************//

voidserial_init(void)

{ TMOD=0x20;

//T/C1定義為方式2

TL1=0xfd;TH1=0xfd;

//設(shè)置波特率為9600的定時(shí)器1方式和初值

PCON=0x00;

TR1=1;//T/C1運(yùn)行,產(chǎn)生串口波特率

SCON=0xf8;

//設(shè)置串行口方式3,多機(jī)通訊方式,允許接收,TB8=1

}

//*************串口通信函數(shù)——多機(jī)通信*****************//

voidmaster(ucharslave_addr,ucharcom)

{ #defineBN16

uchari=0,p=0;

TB8=1;

SBUF=slave_addr;//發(fā)送從機(jī)地址

while(TI==0);TI=0;

TB8=0; //地址標(biāo)志清0

SBUF=com;//發(fā)送命令:1為發(fā)送,2為接收

while(TI==0);TI=0;

if(com==0x01) //主機(jī)發(fā)送

{ p=0; //清校驗(yàn)和

for(i=0;i<BN;i++)

{

SBUF=trdata[i];//發(fā)送一數(shù)據(jù)

p+=trdata[i]; //求校驗(yàn)和

while(TI==0);TI=0;

}

SBUF=p; //發(fā)送校驗(yàn)和

while(TI==0);TI=0;

} else //主機(jī)接收

{

p=0;

for(i=0;i<BN;i++)

//接收數(shù)據(jù)并求校驗(yàn)和

{

while(RI==0);RI=0;

recdata[i]=SBUF;

p+=recdata[i];

} while(RI==0);RI=0; //接收校驗(yàn)字

if(p==SBUF)

//校驗(yàn)和正確時(shí)顯示數(shù)據(jù),否則顯示接收錯(cuò)誤

{

Lcd_display(0x40,recdata);

//顯示接收到的數(shù)據(jù)

}

elseLcd_display(0x40,"Error!");

}

}//**************調(diào)用函數(shù),實(shí)現(xiàn)多機(jī)通信******************//

voidserial_M(void)

{

//下面幾行可證明多機(jī)通信功能正常

master(1,0x01); delay(250);

master(2,0x01); delay(250);

master(1,0x02);

delay(250); delay(250);

master(2,0x02);

delay(250); delay(250);

}//**************主函數(shù)******************//

voidmain(void)

{

Lcd_initialize();

Lcd_display(0x00,"Awelcomeyou!"); //第1行顯示歡迎信息

serial_init();

serial_M();

}【例5-5】

從機(jī)B實(shí)現(xiàn)多機(jī)通信的源程序。

#include<reg51.h>

#defineucharunsignedchar

#defineslave_addr1

#defineBN16

sbitled=P2^3;

//定義LED引腳,用于串口通信指示ucharrecdata[16]=""; //定義一個(gè)長(zhǎng)度為16的空串,用于存放接收字符顯示

uchartrdata[16]="FromB:slave_1!";

voidLcd_initialize(void);

voidLcd_display(ucharaddr,uchar*str); //LCD顯示函數(shù)

voidserial_M(void);

//*************串口通信函數(shù)——多機(jī)通信*****************//

voidserial_M(void)

{ TMOD=0x20;//T/C1定義為方式2

TL1=0xfd;TH1=0xfd;

//設(shè)置波特率為9600的定時(shí)器1方式和初值

SCON=0xf8;PCON=0x00;

//設(shè)置串行口方式3,多機(jī)通信方式,允許接收,

//TB8置1(為發(fā)送作準(zhǔn)備)

TR1=1; //T/C1運(yùn)行,產(chǎn)生串口波特率

EA=1;ES=1;//開(kāi)串口中斷

while(1){}

}//**********中斷處理函數(shù)*****************//

//僅用一次串口中斷,然后使用查詢方式完成串口通信

voidSerial_Int(void)interrupt4using1

{

staticucharp=0,i=0;

RI=0;ES=0; //關(guān)中斷

if(RB8==1)

{ if(SBUF==slave_addr)

{

SM2=0;

}

Else

{ES=1;return;} //非本機(jī)地址繼續(xù)監(jiān)聽(tīng)

}

while(RI==0);RI=0; if(SBUF==0x01) //主機(jī)發(fā)送,從機(jī)接收

{

p=0;

for(i=0;i<BN;i++) //接收數(shù)據(jù)并求校驗(yàn)和

{

while(RI==0);RI=0;

recdata[i]=SBUF;

p+=recdata[i];

} while(RI==0);RI=0; //接收校驗(yàn)字

if(p==SBUF) //校驗(yàn)和正確時(shí)顯示數(shù)據(jù),否則顯示接收錯(cuò)誤

{

Lcd_display(0x40,recdata); //顯示接收到的數(shù)據(jù)

}

elseLcd_display(0x40,"Error!");

}

else

{ p=0; //清校驗(yàn)和

for(i=0;i<BN;i++)

{

SBUF=trdata[i];//發(fā)送一個(gè)數(shù)據(jù)

p+=trdata[i];//求校驗(yàn)和

while(TI==0);TI=0;

}

SBUF=p; //發(fā)送校驗(yàn)和

while(TI==0);TI=0;

} SM2=1;ES=1; //開(kāi)中斷

}

voidmain(void)

{

Lcd_initialize();

Lcd_display(0x00,“Bwelcomeyou!”);

//第1行顯示歡迎字符

serial_M(); //多機(jī)通信

}【例5-6】

從機(jī)C實(shí)現(xiàn)多機(jī)通信的源程序。

#include<reg51.h>

#defineucharunsignedchar

#defineslave_addr2

#defineBN16 sbitled=P2^3; //定義LED引腳,用于串口通信指示

ucharrecdata[16]=“

”;

//定義一個(gè)長(zhǎng)度為16的空串,用于存放接收字符顯示

uchartrdata[16]="FromC:slave_2!";

voidLcd_initialize(void);

voidLcd_display(ucharaddr,uchar*str); //LCD顯示函數(shù)

voidserial_M(void);//*************串口通信函數(shù)——多機(jī)通信*****************//

voidserial_M(void)

{

TMOD=0x20; //T/C1定義為方式2

TL1=0xfd;TH1=0xfd;

//設(shè)置波特率為9600的定時(shí)器1方式和初值

// SCON=0xf0; PCON=0x00;

//設(shè)置串行口方式3,多機(jī)通信方式,允許接收

SCON=0xf8;PCON=0x00;

//設(shè)置串行口方式3,多機(jī)通信方式,允許接收, TR1=1; //T/C1運(yùn)行,產(chǎn)生串口波特率

EA=1;ES=1;//開(kāi)串口中斷

while(1){}

}

//**********中斷處理函數(shù)*****************//

//僅用一次串口中斷,然后使用查詢方式完成串口通信

voidSerial_Int(void)interrupt4using1

{ staticucharp=0,i=0;

RI=0;ES=0; //關(guān)中斷

if(RB8==1)

{

if(SBUF==slave_addr)

{

SM2=0;

}

else

{ES=1;return;}

//非本機(jī)地址繼續(xù)監(jiān)聽(tīng)

} while(RI==0);RI=0;

if(SBUF==0x01) //主機(jī)發(fā)送,從機(jī)接收

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論