東北大學(xué)單片機(jī)課件第九章_第1頁(yè)
東北大學(xué)單片機(jī)課件第九章_第2頁(yè)
東北大學(xué)單片機(jī)課件第九章_第3頁(yè)
東北大學(xué)單片機(jī)課件第九章_第4頁(yè)
東北大學(xué)單片機(jī)課件第九章_第5頁(yè)
已閱讀5頁(yè),還剩95頁(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)介

9.1串行通訊基礎(chǔ)數(shù)據(jù)交換的方式總體上分為兩種:即并行數(shù)據(jù)通信和串行數(shù)據(jù)通信.如果距離小于30m,可采用并行數(shù)據(jù)通信方式;當(dāng)距離大于30m時(shí),則要采用串行數(shù)據(jù)通信方式。第九章串行通訊接口設(shè)計(jì)一

、串行通訊的分類(一)、異步通訊1.發(fā)送端和接收端要有互相獨(dú)立的時(shí)鐘源。2.在幀格式中,一個(gè)字符數(shù)據(jù)由四部分組成:起始位、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位。起始位:起始位“0”,在通訊線上不傳送數(shù)據(jù)時(shí)保持邏輯“1”。數(shù)據(jù)位:可以是5、6、7或8位,規(guī)定低位在前,高位在后。奇偶校驗(yàn)位:也可以用于確定一幀的字符所代表信息(地址/數(shù)據(jù)等)。停止位:(邏輯“1”)是一個(gè)字符數(shù)據(jù)的結(jié)束標(biāo)志。波特率:--所傳二進(jìn)制位數(shù)/秒字符傳輸速率:--所傳幀數(shù)/秒例:1200bps的字符幀(13位),

則:字符傳輸速率=1200/13幀/秒(二)、同步通訊僅在數(shù)據(jù)塊開始時(shí)用同步字符SYNC來(lái)指示,同步字符可以單同步字符,也可以使雙同步字符方式。國(guó)際標(biāo)準(zhǔn)為單字符16H,雙字符EBH,90H.二.串行通訊的制式

1.半雙工制式2.全雙工制式三.串行通訊中的調(diào)制解調(diào)器1.MODEM的作用和原理2.MODEM的分類3.MODEM的調(diào)制/解調(diào)三、串行通信中的調(diào)制解調(diào)器1、MODEM的作用和原理2、MODEM的分類3、MODEM的調(diào)制/解調(diào)1)應(yīng)答式MODEM的發(fā)送器2050HZ—發(fā)送空號(hào)(邏輯0),2225HZ--發(fā)送傳號(hào)(邏輯1)。2)應(yīng)答式MODEM的接收器RXD接收信號(hào):“1”(2225HZ)上通道

“0”(2025HZ)下通道四.串行I/O數(shù)據(jù)的實(shí)現(xiàn)串行數(shù)據(jù)----并行數(shù)據(jù)的實(shí)現(xiàn)(一)軟件實(shí)現(xiàn)(二)硬件實(shí)現(xiàn)ORG1000HSOUT:MOVR0,#20HNEXT:MOVR2,#0BHCLRCMOVA,@R0RLCAINCR0LOOP:MOVR1,AANLA,#01HORLP1,AMOVA,R1ACALLDELAYRRCASETBCDJNZR2,LOOPDJNZLEN,NEXT(一).軟件實(shí)現(xiàn)20HC7H21H..LNELP1.08031CYR1(二)硬件實(shí)現(xiàn)對(duì)RXD的采樣:(1)若連續(xù)采樣8個(gè)負(fù)脈沖RXD為低電平則為啟動(dòng)位.(2)每隔13個(gè)脈沖采樣2次RXD,按2/3原則確定數(shù)據(jù)值(3).錯(cuò)誤校驗(yàn)五.串行通訊的差錯(cuò)控制技術(shù)在信息碼元中增加一定數(shù)量的多余碼元(稱為監(jiān)督碼元),在傳輸過(guò)程中如果受到干擾,某位碼元發(fā)生了變化,相當(dāng)于破壞了他們之間的約束關(guān)系。1.奇偶校驗(yàn)在每個(gè)信息碼組之后附加一位監(jiān)督碼元,使整個(gè)碼組中“1”的個(gè)數(shù)成為奇數(shù)或偶數(shù),分別稱為奇校驗(yàn)或偶校驗(yàn)。2.校驗(yàn)和在數(shù)據(jù)發(fā)送時(shí),發(fā)送方對(duì)塊中數(shù)據(jù)簡(jiǎn)單求和,產(chǎn)生一單字節(jié)校驗(yàn)字符(校驗(yàn)和)附加到數(shù)據(jù)塊結(jié)尾,

3.循環(huán)冗余碼校驗(yàn)CRC

4.海明碼校驗(yàn)六.設(shè)備地址問題網(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)都有一個(gè)唯一的地址碼.產(chǎn)生方法:(1)軟件中直接寫定方法簡(jiǎn)單,無(wú)附加電路,修改不方便,設(shè)備不能互換;(2)通過(guò)外部開關(guān)進(jìn)行設(shè)置可以動(dòng)態(tài)改變,組織靈活,但占用資源,機(jī)械開關(guān)不可靠;

(3)用非易失存儲(chǔ)器保存,可以在線修改,靈活,可靠,但需要增加硬件設(shè)備,軟件較復(fù)雜.七.傳輸介質(zhì)、總線電氣特性、負(fù)載量等問題

a.傳輸介質(zhì)普通雙絞線RVV2*1.0

建筑物內(nèi)部,短距離場(chǎng)合,干擾不嚴(yán)重情況

屏蔽雙絞線RVVP2*1.0

建筑物之間空曠地帶,距離遠(yuǎn),干擾大情況

同軸電纜SYV75-5

適合做干線

光導(dǎo)纖維(單膜和多膜)

高速網(wǎng)絡(luò),主干線,Internet接口,計(jì)算機(jī)之間局域網(wǎng)絡(luò)

b.總線電氣特性RS-485通訊信號(hào)的傳輸距離和波特率主要受總線分布電容的影響.

分布電容的實(shí)際測(cè)量值為:

網(wǎng)線(5類線),5000pf/100m=50pf/mRVV線,6200pf/100m=62pf/m

工程實(shí)踐證明:485總線負(fù)載電容上限為75000pf

所以,使用RVV線時(shí)距離為:L=75000/62=1209米使用5類線時(shí)L=75000/50=1500米C.負(fù)載量RS-485通訊發(fā)送驅(qū)動(dòng)芯片的輸出電流能力約為60mA,接收器吸收電流的情況有所不同,所以有32站、128站和256站的區(qū)別。對(duì)于MAC1387E驅(qū)動(dòng)器,等效負(fù)載約為并聯(lián)電阻37歐姆。第二節(jié)MCS-51的串行接口一、串行口的結(jié)構(gòu)RXD(P3.0)發(fā)送SBUF(99H)門88串行口結(jié)構(gòu)框圖

TXD(P3.1)中斷接收SBUF(99H)定時(shí)器T1fosc2分頻器發(fā)送控制器接收控制器串寄行存控器制

SCON(98H)輸入移位寄存器TIRI內(nèi)部總線發(fā)送過(guò)程:

MOVA,#7FHMOVSBUF,A串口自動(dòng)發(fā)送:起始位,7FH,TB8,停止位接收退出接收過(guò)程:MOVA,SBUFRXD檢測(cè)起始位。串口自動(dòng)接收:7FH,TB8,停止位二、串行口的工作方式1.方式0—同步移位寄存器2.方式1—10位異步收發(fā)3.方式2—11位異步收發(fā)4.方式3—11位異步收發(fā)要求:SCON,(SM2=0,RB8=0,TB8=0)

MOVSBUF,AMOVA,SBUF發(fā)送(TI=0)時(shí):

SBUF:TXD—發(fā)移位脈沖。

RXD—發(fā)送數(shù)據(jù)。發(fā)完一幀后,TI=1,中斷接收(RI=0,REN=1)時(shí):

SBUF:TXD—發(fā)移位脈沖。

RXD—接收數(shù)據(jù)。接收一幀后,RI=1,中斷1、方式0—同步移位寄存器移位數(shù)據(jù)以8位為一幀,不設(shè)起始位和停止位2.方式1(10位異步收發(fā))要求:SCON中(SM2=0,TB8=0)發(fā)送(TI=0)時(shí):發(fā)送開始:執(zhí)行MOVSBUF,ATXD—發(fā)送:(起始位:1位,數(shù)據(jù)位:8位,停止位:1位)發(fā)完一幀后:TI=1和TXD=高電平,并產(chǎn)生中斷接收(RI=0和REN=1)時(shí):RXD—接收字符幀若RI=0和SM2=0(或收到停止位),則接收字符送SBUF,停止位送RB8,RI=1,發(fā)中斷.否則,字符不送SBUFTXDRXD3.方式2(11位異步收發(fā))波特率固定(fosc/32,fosc/64)發(fā)送(TI=0)時(shí):發(fā)送開始:執(zhí)行MOVSBUF,ATXD—發(fā)送:(起始位,數(shù)據(jù)位,TB8,停止位)發(fā)完一幀后:TI=1和TXD=高電平,并產(chǎn)生中斷接收(RI=0和REN=1)時(shí):RXD—接收字符幀若RI=0和SM2=0(或收到停止位),則接收字符送SBUF,第9位送RB8,RI=1,發(fā)中斷.否則,字符不送SBUF.TXDRXD4.方式3(11位異步收發(fā))波特率可調(diào),可利用T1,T2分頻提供發(fā)送(TI=0)時(shí):發(fā)送開始:執(zhí)行MOVSBUF,ATXD—發(fā)送:(起始位,數(shù)據(jù)位,TB8,停止位)發(fā)完一幀后:TI=1和TXD=高電平,并產(chǎn)生中斷接收(RI=0和REN=1)時(shí):RXD—接收字符幀若RI=0和SM2=0(或收到停止位),則接收字符送SBUF,第9位送RB8,RI=1,發(fā)中斷.否則,字符不送SBUF.TXDRXD1.方式0波特率固定為fosc/12(fosc為單片機(jī)晶振頻率)三.串行口的通訊波特率3.方式1/3波特率=(2SMOD/32)×(T1的溢出率)=(2SMOD/32)×(fosc/12(2K-x))

式中,K:方式0,K=13

方式1,K=16

方式2/3,K=8根據(jù)給定的波特率,可以計(jì)算T1的計(jì)數(shù)初值X。2.方式2波特率固定為(2SMOD/64)×fosc.注意:1)T1初值和對(duì)應(yīng)波特率間若有誤差可通過(guò)fosc調(diào)整.2)T1在方式1下的TC初值應(yīng)考慮到重裝時(shí)間.第三節(jié)MCS-51串行口的應(yīng)用串行口在方式0下的應(yīng)用串行移位輸出例:串行通信方式0,擴(kuò)展I/O接口,接八個(gè)數(shù)碼管,使內(nèi)部數(shù)據(jù)存儲(chǔ)器58H~-5FH單元的內(nèi)容為0XH。ΩΩ

××

ORG0050H SETBP3.3;允許移位寄存器工作

MOVSCON,#0;選串行通信方式0 MOVR7,#08H;顯示八個(gè)字符

MOVR0,#5FH;先送最后一個(gè)顯示字符

MOVDPTR,#TBA;DPTR指向字形表首址

DLO:MOVA,@R0;取待顯示數(shù)碼

MOVCA,@A+DPTR;查字形表

MOVSBUF,A;送出顯示

JNBTI,$;一幀輸出完?

CLRTI ;已完,清中斷標(biāo)志

DECR0;修改顯示數(shù)據(jù)地址

DJNZR7,DLOCLRP3.3;8位送完,關(guān)發(fā)送脈沖

SJMP$TBA:DB0C0H,0F9H,0A4H,B0H,99H,92H DB82H,0F8H,80H,90H,83H,83H,0C6HDB0A1H,86H,84H,0FFH,0BFH

(一)串行口方式1下的應(yīng)用(查詢方式)例:甲機(jī)只有收到乙機(jī)答應(yīng)信號(hào)“00”后才可把存放在片外RAM中的內(nèi)容發(fā)送給乙機(jī),其發(fā)送數(shù)據(jù)格式為:字節(jié)數(shù)n數(shù)據(jù)1數(shù)據(jù)2……數(shù)據(jù)n累加校驗(yàn)和字節(jié)數(shù)n:甲機(jī)將向乙機(jī)發(fā)送的數(shù)據(jù)字節(jié)數(shù);數(shù)據(jù)1~數(shù)據(jù)n:甲機(jī)將向乙機(jī)發(fā)送的n個(gè)字節(jié)數(shù)據(jù);累加校驗(yàn)和:字節(jié)數(shù)n,數(shù)據(jù)1,…,數(shù)據(jù)n,這(n+1)的算術(shù)累加和(向高位進(jìn)位丟失)。乙機(jī)根據(jù)接收到的“校驗(yàn)和”判斷收到的數(shù)據(jù)是否正確。若接收正確,向甲機(jī)發(fā)“0F”信號(hào),否則回發(fā)“F0”信號(hào)。二、串行口在其它方式下的應(yīng)用(1)甲機(jī)查詢方式發(fā)送子程序發(fā)送程序約定:波特率設(shè)置初始化:定時(shí)器T1模式2工作,計(jì)數(shù)初值F3H,SMOD=1;串行口初始化:方式1工作,啟動(dòng)發(fā)送;片內(nèi)RAM和工作寄存器設(shè)置:

31H和30H存放發(fā)送的數(shù)據(jù)塊首地址;

2FH存放發(fā)送的數(shù)據(jù)塊長(zhǎng)度;

R6為累加和寄存器。甲機(jī)發(fā)送子程序框圖如下:甲機(jī)發(fā)送子程序清單:FMT_T_S: MOV TMOD,#20H ;波特率設(shè)置

MOV TH1,#0F3H MOV TL1,#0F3H SETB TR1 MOV SCON,#50H ;串行口初始化,方式1并啟動(dòng)接收

MOV PCON,#80H ;置SMOD=1FMT_RAM: MOV DPH,31H ;設(shè)置DPTR指針

MOV DPL,30H MOV R7,2FH ;送字節(jié)數(shù)至R7 MOV R6,#00H ;清累加和寄存器TX_ACK: MOV A,#06H ;發(fā)呼叫信號(hào)“06” MOV SBUF,AWAIT1: JBC T1,RX_YES ;等待發(fā)送完一個(gè)字節(jié)

SJMP WAIT1RX_YES: JBC RI,NEXT1 SJMP RX_YESNEXT1:MOV A,SBUF;判斷乙機(jī)是否同意接收,

CJNE A,#00H,TX_ACK不同意就繼續(xù)呼叫TX_BYTES: MOV A,R7 MOV SBUF,A ADD A,R6 ;求累加和

MOV R6,AWAIT2: JBC T1,TX_NEWS SJMP WAIT2TX_NEWS: MOVXA,@DPTR ;發(fā)送數(shù)據(jù)

MOV SBUF,A ADD A,R6 ;形成累加和送R6 MOV R6,A INC DPTR ;指針加1WAIT3: JBC TI,NEXT2 SJMP WAIT3NEXT2: DJNZ R7,TX_NEWS;判發(fā)送結(jié)束TX_SUM: MOV A,R6 ;數(shù)據(jù)已發(fā)送完,發(fā)累加和給乙機(jī)

MOV SBUF,AWAIT4: JBC TI,RX_0FH SJMP WAIT4RX_0FH: JBC RI,IF_0FH ;等待乙機(jī)回答

SJMP RX_0FHIF_0FH:MOVA,SBUF ;讀入

CJNEA,#OFH,FMT_RAM ;判斷傳送則正確否

RET(2)乙機(jī)查詢方式接收子程序接收程序約定:波特率設(shè)置初始化:同甲機(jī)發(fā)送子程序。串行口初始化:同發(fā)送程序寄存器設(shè)置:31H,30H——存放接收數(shù)據(jù)緩沖區(qū)首地址。

R7——數(shù)據(jù)塊長(zhǎng)度寄存器。

R6——累加和寄存器。向甲機(jī)回答的狀態(tài)信息:0FH為接收正常,F(xiàn)OH為傳送出錯(cuò),00H為同意接收數(shù)據(jù)。乙機(jī)接收子程序框圖見下圖乙機(jī)接收子程序清單:FMT_T_S: MOV TMOD,#20H ;T1初始化

MOV TH1,#0F3HMOV TL1,#0F3HSETB TR1 MOVSCON,#50H ;串行口初始化方式1,并允許接收

MOVPCON,#80H ;SMOD=1FMT_RAM: MOV DPH,31H ;設(shè)置DPTR地址指針

MOV DPL,30H MOV R6,#00H ;校驗(yàn)和寄存器清0RX_ACK: JBC RI,IF_06H ;接收呼叫信號(hào)

SJMP RX_ACKIF_06H: MOV A,SBUF;判斷呼叫信號(hào)是否有誤

CJNE A,#06H,TX_15HTX_00H: MOV A,#00H;向甲機(jī)回送同意接收信號(hào)

MOV SBUF,AWAIT1: JBC TI,RX_BYTES;等待應(yīng)答信號(hào)發(fā)送完

SJMP WAIT1TX_15H: MOV A,#15H;向甲機(jī)報(bào)告接收的

MOV SBUF,A呼叫信號(hào)不正確WAIT2: JBC TI,HAVE1 SJMP WAIT2

HAVE1:LJMP RX_ACK ;返回到開始接收呼叫信號(hào)狀態(tài)RX_BYTES: JBC RI,HAVE2 ;接收數(shù)據(jù)塊長(zhǎng)度

SJMP RX_BYTESHAVE2:MOVA,SBUF ;給長(zhǎng)度寄存器賦值

MOVR7,A MOVR6,A ;形成累加和RX_NEWS: JBC RI,HAVE3 ;接收數(shù)據(jù)

SJMP RX_NEWSHAVE3: MOV A,SBUF ;將接收到的數(shù)據(jù)存放入

MOVX@DPTR,A外部RAM INC DPTR ADD A,R6 ;形成累加和

MOV R6,A DJNZ R7,RX_NEWS;判斷是否接收完畢RX_SUM: JBC RI,HAVE4 ;接收校驗(yàn)和

SJMP RX_SUMHAVE4: MOV A,SBUF CJNE A,R6,TX_ERRTX_RIGHT: MOV A,#0FH;向甲機(jī)報(bào)告?zhèn)鬏斦_

MOV SBUF,AWAIT3: JBC TI,GOOD SJMP WAIT3TX_ERR: MOV A,#0F0H;向甲機(jī)報(bào)告?zhèn)魉陀姓`

MOV SBUF,AWAIT4: JBC TI,AGAIN SJMP WAIT4AGAIN: LJMP FMT_RAM ;返回重新接收數(shù)據(jù)GOOD: RET ;返回被調(diào)用的主程序(二).串行口方式1下的應(yīng)用(中斷方式)(1)主程序框圖

ORG2100HTBLOCKDATA20HLENDATA14HSTART:MOVTMOD,#20H;T1方式2MOVTL1,#0F4H;2400pbsMOVTH1,#0F4HMOVPCON,#80H;SMOD=1SETBTR1MOVSCON,#40H;串口方式1MOVR0,#TBLOCKMOVA,LENMOVR2,AMOVSBUF,ASETBEAWAIT:SETBESSJMPWAIT

中斷服務(wù)程序

ORG0023HLJMPTXSVEORG2150HTXSVE:CLRRS;串口關(guān)中斷

CLRTIMOVA,@R0;發(fā)送字符AMOVC,PSW.0;形成奇校位

CPLCMOVACC.7,CMOVSBUF,ADJNZR2,NEXTSJMP$NEXT:INCR0NN:RETIEND(2)乙機(jī)中斷接收子程序設(shè)置三個(gè)標(biāo)志位來(lái)判斷所接收的信息,是數(shù)據(jù)塊長(zhǎng)度,是數(shù)據(jù)還是校驗(yàn)和。本例約定:波特率:T1方式2工作,計(jì)數(shù)初值F4H,

SMOD=1。串行口初始化:方式1,啟動(dòng)接收。31H,30H—存放在以

31H、30H

(送DPTR)為地址指針的片外RAM中。32H——數(shù)據(jù)塊長(zhǎng)度寄存單元。33H——累加校驗(yàn)和寄存單元。(三).串行口方式3下的應(yīng)用(中斷方式)設(shè)甲機(jī)發(fā)送,乙機(jī)接收,串行接口工作方式3(每幀數(shù)據(jù)為11位,第9位用于奇偶校驗(yàn)),兩機(jī)均選用6MHz的振蕩頻率,波特率為2400b/s,通信的功能為:甲機(jī):將片外RAM4000H~407FH單元的內(nèi)容向乙機(jī)發(fā)送,乙機(jī):對(duì)接收的信息進(jìn)行奇偶校驗(yàn)(偶校驗(yàn)),P位值放TB8中。若校驗(yàn)正確,則乙機(jī)向甲機(jī)回發(fā)(00H)。若奇偶校驗(yàn)有錯(cuò),則乙機(jī)發(fā)出信號(hào)(FFH)。接收甲機(jī)發(fā)送的數(shù)據(jù),并寫入以4000H為首地址的片外RAM中。(四)8051C語(yǔ)言通訊程序?qū)嵗?、通信協(xié)議的約定假定A機(jī)是發(fā)送者,B機(jī)是接收者。當(dāng)A機(jī)開始發(fā)送時(shí),先送一個(gè)“AA”信號(hào),

B機(jī)接收到后回答一個(gè)“BB”,表示同意接收。當(dāng)A機(jī)收到“BB”后,開始發(fā)送數(shù)據(jù),每發(fā)送一次求“校驗(yàn)和”,數(shù)據(jù)塊發(fā)送完后發(fā)送“校驗(yàn)和”。B機(jī)每接收到一個(gè)數(shù)據(jù)便計(jì)算一次“校驗(yàn)和”,當(dāng)收齊一個(gè)數(shù)據(jù)塊后,再接收A機(jī)發(fā)來(lái)的校驗(yàn)和,并將它與B機(jī)求出的校驗(yàn)和進(jìn)行比較。若兩者相等,說(shuō)明接收正確,B機(jī)回答00H;若兩者不等,說(shuō)明接收不正確,B機(jī)回答0FFH,請(qǐng)求重發(fā)。A機(jī)收到00H回答結(jié)束發(fā)送;若收到的非零,則將數(shù)據(jù)再重發(fā)一次。雙方約定的傳輸速率若為1200b/s,查表可知,在雙方的fosc=11.0592MHz下,T1工作在定時(shí)器模式2,TH1=TL1=0E8H,PCON寄存器的SMOD位為0。2、點(diǎn)對(duì)點(diǎn)通信程序人為規(guī)定一個(gè)為發(fā)送,一個(gè)為接收。要求兩機(jī)串行口的波特率相同。A機(jī)發(fā)送程序#include<reg51.h>#define uchar unsignedchar#define TR1 //發(fā)送接收差別值TR=0發(fā)送uchar

idatabuf[10];ucharpf;voidinit(void) //串行口初始化{TMOD=0x20; //設(shè)T1為定時(shí)器模式2 TH1=0xe8; //設(shè)定波特率

TL1=0xe8; PCON=0x00; TR1=1; //啟動(dòng)T1 SCON=0x50; //串行口工作在方式1并允許接收}voidsend(uchar

idata*d){uchari; do{SBUF=0xaa; //發(fā)送聯(lián)絡(luò)信號(hào)“AA” while(TI==0); //等待發(fā)送出去

TI=0; while(RI==0); //等待B機(jī)回答

RI=0;}while((SBUF^0xbb)!=0);//B機(jī)未準(zhǔn)備好,繼續(xù)聯(lián)絡(luò)(收到“BB”嗎)

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

for(i=0;i<16;i++) {SBUF=d[i]; //發(fā)送一個(gè)數(shù)據(jù)

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

while(TI==0);TI=0;}SBUF=pf; //發(fā)送校驗(yàn)和

while(TI==0);TI=0;while(RI==0);RI=0; //發(fā)送校驗(yàn)和

}while(SBUF!=0); //回答出錯(cuò),則重發(fā)}voidreceive(uchar

idata*d){uchari;do{while(RI==0);RI=0;}while((SBUF^0xaa)!=0);//判A機(jī)請(qǐng)求否

SBUF=0xbb;while(TI==0);TI=0;while(1){pf=0; //清校驗(yàn)和

for(i=0;i<16;i++) {while(RI==0);RI=0; d[i]=SBUF; //接收數(shù)據(jù)

pf+=d[i];} //求校驗(yàn)和

while(RI==0);RI=0;//接收A機(jī)校驗(yàn)和

if((SBUF^pf)==0)//比較校驗(yàn)和

{SBUF=0x00;//檢驗(yàn)和相同發(fā)“00” break;}

else{SBUF=0xff;//出錯(cuò)發(fā)“FF”,重新接收

while(TI==0);TI=0;}}}B機(jī)接收程序voidmain(void){ init(); if(TR==0) {

send(buf);}else{

receive(buf);}}第四節(jié)8051多機(jī)通訊技術(shù)在許多場(chǎng)合,需要多臺(tái)單片機(jī)互相配合才能完成某個(gè)過(guò)程或任務(wù)。以完成各種功能。網(wǎng)絡(luò)形式有4種:星形網(wǎng)絡(luò)、串行總線形網(wǎng)絡(luò)、環(huán)形網(wǎng)絡(luò)、樹形網(wǎng)絡(luò)結(jié)構(gòu).串行總線形主從式多機(jī)通信全雙工串行總線形主從式多機(jī)通信半雙工結(jié)構(gòu)(一)主從式多機(jī)通信

1.特點(diǎn):1)一臺(tái)是主機(jī),其余的為從機(jī),2)主機(jī)、從機(jī)均工作于方式2或方式3。2.原理1)主機(jī)(SM2=0),

TB8=1---發(fā)送地址標(biāo)志

TB8=0---命令、數(shù)據(jù)標(biāo)志從機(jī)(SM2=1)

若RB8=1則接收主機(jī)地址進(jìn)入中斷

RI=02)從機(jī)在中服完成本機(jī)/從機(jī)地址比較若本機(jī)<>接收地址,則本機(jī)未被選中,令SM2=1,退中斷3)若本機(jī)地址=接收地址,則本機(jī)被選中令SM2=0,回送所接收地址,完成主機(jī)---從機(jī)通信。4)從機(jī)完成主機(jī)----從機(jī)間通訊后,令SM2=1,退出中服3。主機(jī)給從機(jī)1發(fā)地址地址符合(二)主從式多機(jī)通訊實(shí)例主機(jī)通訊(1200bps)1)所用命令/狀態(tài)字(1)各從機(jī)均有自己的本機(jī)地址(2)控制字

00H---主機(jī)發(fā)和從機(jī)收命令

01H---從機(jī)發(fā)和主機(jī)收命令(3}從機(jī)狀態(tài)字ERR00000TRDYRRDY0—合法1—非法0—從機(jī)未準(zhǔn)備好接收1—從機(jī)準(zhǔn)備好接收0—從機(jī)未準(zhǔn)備好發(fā)送1—從機(jī)準(zhǔn)備好發(fā)送2)主機(jī)通訊程序(裝入主機(jī))R0—主機(jī)發(fā)送數(shù)塊始址R1—主機(jī)接收數(shù)塊始址R2—被尋址從機(jī)地址R3—主機(jī)發(fā)出的命令R4—發(fā)送數(shù)塊長(zhǎng)度R5—接收數(shù)塊長(zhǎng)度(1)主機(jī)主程序

ORG2000HSTART:MOVTMOD,#20H;T1方式2MOVTH1,#0F4H;1200bpsMOVTL1,#0F4HSETBTR1;啟動(dòng)T1MOVSCON,#0D8H;方式3,

MOVPCON,#00H;接收TB8=1MOVR0,#40H;發(fā)送數(shù)塊始址

MOVR1,#20H;接收數(shù)塊始址

MOVR2,#SLAVE;被尋址從機(jī)地址

MOVR3,#00H/01H;主機(jī)發(fā)出的命令

MOVR4,#20;發(fā)送數(shù)塊長(zhǎng)度

MOVR5,#20;接收數(shù)塊長(zhǎng)度

ACALLMCOMMU;調(diào)主機(jī)通訊程序

SJMP$(2)主機(jī)通訊程序框圖(3)主機(jī)通訊程序

ORG2100HMCOM:MOVA,R2;從機(jī)地址送AMOVSBUF,A;發(fā)送從機(jī)地址

JNBRI,$;等待接收從機(jī)

CLRRI;應(yīng)答地址

MOVA,SBUF;從機(jī)應(yīng)答地址送AXRLA,R2;核對(duì)兩個(gè)地址

JZMTXD2;相符,轉(zhuǎn)MTXD2MTXD1:MOVSBUF,#0FFH;從機(jī)復(fù)位命令

SETBTB8;地址楨標(biāo)志送TB8SJMPMCOMMTXD2:CLRTB8;準(zhǔn)備發(fā)送命令

MOVSBUF,R3;發(fā)送命令字

JNBRI,$;(00/01)等待從機(jī)應(yīng)答

CLRRIMOVA,SBUF;等待從機(jī)應(yīng)答狀態(tài)字

JNBACC.7,MTXD3;正確,MTXD3SJMPMTXD1;錯(cuò)誤,重新聯(lián)絡(luò)MTXD3:CJNZR3,#00H,MRXD;若從機(jī)發(fā)

;主機(jī)收,MRXDJNBACC.0,MTXD1;若從機(jī)接收

;未就緒,MTXD1MTXD4:MOVSBUF,@R0;若從機(jī)接收就

JNBTI,$;緒,則開始發(fā)送

CLRTIINCR0DJNZR4,MTXD4;若數(shù)塊未發(fā)

RET完,則繼續(xù)

MRXD:JNBACC.1,MTXD1;從機(jī)發(fā)送未

;就緒,重新聯(lián)絡(luò)MRXD1:JNBRI,$;等待接收完畢

CLRRIMOVA,SBUF;接收數(shù)據(jù)送AMOV@R1,AINCR1DJNZR5,MRXD1若未接完,繼續(xù)

RET3)從機(jī)通訊程序(裝入從機(jī))R0—從機(jī)發(fā)送數(shù)塊始址R1—從機(jī)接收數(shù)塊始址R2—發(fā)送數(shù)塊長(zhǎng)度R3—接收數(shù)塊長(zhǎng)度

ORG1000HSTART:MOVTMOD,#20H;T1方式2MOVTH1,#0F4H;1200bpsMOVTL1,#0F4H;SETBTR1MOVSCON,#0F8H;方式3,允許

MOVPCON,#00H;接收,TB8=1MOVR0,#20H;MOVR1,#40H;MOVR2,#20MOVR3,#20SETBEASETBESCLRRI…SJMP$

ORG0023HSJMPSINTORG0100HSINT:CLRRIPUSHACCPUSHPSWMOVA,SBUF;接收從機(jī)地

XRLA,#SLAVE;址送AJZRXD1;若呼叫本機(jī),繼續(xù)RETN:POPPSWPOPACCRETIRXD1:CLRSM2;接收數(shù)據(jù)/命令

MOVSBUF,#SLAVE;發(fā)回

JNBRI,$;本機(jī)地址,核對(duì)

CLRRIJNBRB8,RED2;若命令

(TB8=0),則RXD2

SETBSM2;若復(fù)位命令,則SM2=1SJMPRETN;返回主程序RXD2:MOVA,SBUF;收到命令送ACJNEA,#02H,NEXT;命令合法?NEXT:JCRXD3;若命令合法,則RXD3CLRTI;命令非法,則清TIMOVSBUF,#80H;發(fā)ERR=1的狀態(tài)字

SETBSM2SJMPRETN;返回主程序RXD3:JZSCRX;若00H(接收)命令,則SCHRXJBF0H,STXD;若本機(jī)發(fā)送就緒,則STXDMOVSBUF,#00H;本機(jī)發(fā)未就緒,SETBSM2;則TRDY=0SJMPRETN;返回主程序STXD:MOVSBUF,#02H;發(fā)TRDY=1狀態(tài)字

JNBTI,$;等待發(fā)完

CLRTI;發(fā)完清TI

INCR0;發(fā)送塊指針加1DJNZR2,LOOP1SETBSM2;發(fā)完令SM2=1SJMPRETN;返回SCRX:JBPSW.1,SRXD;接收就緒,則SRXDMOVSBUF,#00H;未就緒,SETBSM2;發(fā)RRDY=0SJMPRETNSRXD:MOVSBUF,#01H;發(fā)RRDY=1狀態(tài)字LOOP2:JNBRI,$;接收一個(gè)字符

CLRRIMOV@R1,SBUF;存入內(nèi)存

INCR1;數(shù)塊指針加1DJNZR3,LOOP2SETBSM2SJMPRETNEND(三)C語(yǔ)言多機(jī)通訊程序設(shè)計(jì)實(shí)例主機(jī)采用查詢方式,從機(jī)采用中斷方式通信。1.通信協(xié)議(1)主機(jī)先發(fā)送一幀地址信息,其中前8位為地址,第9位為地址/數(shù)據(jù)信息的標(biāo)志位,1表示該幀為地址信息。(2)所有從機(jī)接收到地址幀后,各自將接收的地址與本機(jī)的地址比較地址相符的從機(jī),使SM2=0,以接收隨后發(fā)來(lái)的所有信息;地址不符的從機(jī),仍SM2=1,對(duì)發(fā)來(lái)的數(shù)據(jù)不予理睬。(3)從機(jī)發(fā)送結(jié)束后,發(fā)送一幀校驗(yàn)和,并置第9位(TB8)為1,作為從機(jī)數(shù)據(jù)傳送結(jié)束標(biāo)志。(4)主機(jī)接收數(shù)據(jù)時(shí),●若RB8=1,表示數(shù)據(jù)傳送結(jié)束,比較此幀校驗(yàn)和,若正確,則回送正確信號(hào)00H,此信號(hào)令該機(jī)復(fù)位(即重新等待地址幀)若出錯(cuò),則發(fā)送0FFH,令該從機(jī)重發(fā)數(shù)據(jù)?!袢鬜B8=0,則原數(shù)據(jù)到緩沖區(qū),并準(zhǔn)備接收下幀信息。跨過(guò)(5)主機(jī)向從機(jī)發(fā)送數(shù)據(jù)時(shí),從機(jī)比較地址相符后,從機(jī)令SM2=0,同時(shí)把本站地址發(fā)回主機(jī)。作為應(yīng)答之后才能收到主機(jī)發(fā)送來(lái)的數(shù)據(jù)。其他從機(jī)繼續(xù)監(jiān)聽地址(SM2=1),無(wú)法收到數(shù)據(jù)。(6)主機(jī)收到從機(jī)的應(yīng)答地址后,確認(rèn)地址是否相符。如果地址不符,發(fā)復(fù)位信號(hào)(數(shù)據(jù)幀中TB8=1);如果地址相符,則清

TB8,開始發(fā)送數(shù)據(jù)。(7)從機(jī)收到復(fù)位命令后回到監(jiān)聽地址狀態(tài)(SM2=1),否則開始接收數(shù)據(jù)和命令。2.通信程序

00H為主機(jī)地址,01H,02H為從機(jī)設(shè)備地址.FFH是命令各從機(jī)恢復(fù)SM2=1的狀態(tài)及復(fù)位。主機(jī)的命令編碼為:01H 請(qǐng)求從機(jī)接收主機(jī)的數(shù)據(jù)命令02H 請(qǐng)求從機(jī)向主機(jī)發(fā)送數(shù)據(jù)命令從機(jī)的狀態(tài)字節(jié)格式為:ERR00000TRDYRRDYRRDY=1,從機(jī)準(zhǔn)備好接收主機(jī)的數(shù)據(jù)。TRDY=1,從機(jī)準(zhǔn)備好向主機(jī)發(fā)送數(shù)據(jù)。ERR=1,從機(jī)接收到的命令是非法的。程序可分成主機(jī)程序和從機(jī)程序,約定一次傳送的數(shù)據(jù)為16個(gè)字節(jié),以02H地址的從機(jī)為例。(1)主機(jī)程序(查詢方式)主機(jī)程序流程圖:主機(jī)程序master.c如下:#include<reg51.h>#defineucharunsignedchar#defineSLAVE0x02 //從機(jī)地址#defineBN16uchar

idatarbuf[16];uchar

idatatbuf[16]={“mastertransmit”};voiderr(void){SBUF=0xff;

while(TI!=1);TI=0;}ucharmaster(uchar

addr,ucharcommand){uchar

aa,i,p;while(1){SBUF=SLAVE; //發(fā)呼叫地址

while(TI!=1);TI=0;while(RI!=1);RI=0; //等待從機(jī)回答

if(SBUF!=addr)err(); //若地址錯(cuò),發(fā)復(fù)位信號(hào)

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

SBUF=command; //發(fā)命令

while(TI!=1);TI=0;

while(RI!=1);RI=0;

aa=SBUF;if((aa&0x80)==0x80){TB8=1;//若命令未接收,發(fā)復(fù)位信號(hào)

err();}

else{if(command==0x01) //是發(fā)送命令

{if((aa&0x01)==0x01)//從機(jī)準(zhǔn)備好接收

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

for(i=0;i<BN;i++){SBUF=tbuf[i];//發(fā)送一個(gè)數(shù)據(jù)

p+=tbuf[i];while(TI!=0);TI=0;}SBUF=p; //發(fā)送校驗(yàn)和

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

while(RI==0);RI=0;}while(SBUF!=0); //接收不正確,重新發(fā)送

TB8=1;return(0);}

}

else{if((aa&0x02)==0x02) //是接收命令,從機(jī)準(zhǔn)備好發(fā)送

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

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

while(RI!=1);RI=0;

rbuf[i]=SBUF; //接收一數(shù)據(jù)

p+=rubf[i];}while(RI==0);RI=0;If(SBUF==p){SBUF=0x00; //校驗(yàn)和相同發(fā)00while(TI==0);TI=0;break;}else{SBUF=0xff; //校驗(yàn)和不同0FF,重新接收

while(TI==0);TI=0;}}TB8=1; //置地址標(biāo)志

return(0);

}}}

}}}voidmain(void){TMOD=0x20;//T1定義為模式2TL1=0xfd; //置初值

TH1=0xfd;PCON=0x00;TR1=1;SCON=0xf0; //串行口為方式3master(SLAVE,0x01);master(SLAVE,0x02);}(2)從機(jī)程序(中斷方式)從機(jī)中斷程序的流程從機(jī)程序slave.c如下:#include<reg51.h>#defineucharunsignedchar#defineSLAVE0x02#defineBN16uchar

idatatrbuf[16];uchar

idatarebuf[16];bittready;bitrready;voidmain(void){TMOD=0x20; //T1定義為模式2TL1=0xfd; //置初值

TH1=0xfd;PCON=0x00;TR=1;SCON=0xf0; //串行口為方式3EA=1;EA=1; //開串行口中斷

while(1){

tready=1;

rready=1; //假定準(zhǔn)備好發(fā)送和接收

}}voidssio(void)interrupt4using1{voidstr(void);voidsre(void);

uchara,i;RI=0;ES=0; //關(guān)串口中斷

if(SBUF!=SLAVE){ES=1;

goto

reti; //非本機(jī)地址,繼續(xù)監(jiān)聽

}SM2=0; //取消監(jiān)聽狀態(tài)

SBUF=SLAVE; //從機(jī)地址發(fā)回

while(TI!=1);TI=0;while(RI!=1);RI=0;

if(RB8==1){SM2=1;ES=1;

goto

reti; //是復(fù)位信號(hào)恢復(fù)監(jiān)聽

}

a=SBUF; //接收命令

if(a=0x01) //從機(jī)接收主機(jī)的數(shù)據(jù)

{

if(rready==1)SBUF=0x01; //接收準(zhǔn)備好發(fā)狀態(tài)

elseSBUF=0x00;while(TI!=1);TI=0;while(RI=1);RI=0;

if(RB8==1){SM2=1;ES=1;

goto

reti;}sre(); //接收數(shù)據(jù)塊}else{if(a=0x02) //從機(jī)向主機(jī)發(fā)數(shù)據(jù)

{

if(tready==1)SBUF=0x02; //發(fā)送準(zhǔn)備好發(fā)狀態(tài)

elseSBUF=0x00;while(TI!=1);TI=0;while(RI!=1);RI=0;

if(RB==1){SM2=1;ES=1;

Goto

reti;}

str(); //發(fā)送數(shù)據(jù)塊

}else{SBUF=0x80; //命令非法,發(fā)狀態(tài)

while(TI!=1);TI=0;SM2=1;ES=1; //恢復(fù)監(jiān)聽

}}reti:;}voidstr(void) //發(fā)送數(shù)據(jù)塊{

ucharp,i;

tready=0;do

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論