版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 櫥柜認(rèn)購(gòu)合同范本
- 水的購(gòu)銷合同范本
- 村集體分錢協(xié)議書(shū)
- 賣建屋合同范本
- 正規(guī)出兌合同范本
- 基地實(shí)訓(xùn)協(xié)議書(shū)
- 室外廣告合同協(xié)議
- 水穩(wěn)供貨合同范本
- 模具保養(yǎng)合同范本
- 板材訂金合同范本
- 切爾諾貝利核電站事故工程倫理分析
- 初中地理七年級(jí)上冊(cè)第七章第四節(jié)俄羅斯
- 法院起訴收款賬戶確認(rèn)書(shū)范本
- 課堂觀察與評(píng)價(jià)的基本方法課件
- 私募基金內(nèi)部人員交易管理制度模版
- 針對(duì)低層次學(xué)生的高考英語(yǔ)復(fù)習(xí)提分有效策略 高三英語(yǔ)復(fù)習(xí)備考講座
- (完整)《走遍德國(guó)》配套練習(xí)答案
- 考研準(zhǔn)考證模板word
- 周練習(xí)15- 牛津譯林版八年級(jí)英語(yǔ)上冊(cè)
- 電力電纜基礎(chǔ)知識(shí)課件
- 代理記賬申請(qǐng)表
評(píng)論
0/150
提交評(píng)論