版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章
AT89S51單片機(jī)的
串行口12全雙工異步串行口并行通信并行通信和串行通信串行通信數(shù)據(jù)的各位同時(shí)傳送(接收)數(shù)據(jù)的逐位分時(shí)傳送(接收)異步通信和同步通信異步通信(AsynchronousCommunication):同步通信(SynchronousCommunication):同步通信是指通信時(shí)要建立發(fā)送方時(shí)鐘對(duì)接收方時(shí)鐘的直接控制,使收發(fā)雙方達(dá)到完全同步的一種通信方式。異步通信是指發(fā)送端和接收端使用各自的時(shí)鐘來(lái)控制數(shù)據(jù)的發(fā)送和接收的一種通信方式。這兩個(gè)時(shí)鐘源彼此獨(dú)立,無(wú)需嚴(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ā)送緩沖器只寫(xiě)不能讀。接收緩沖器只讀不能寫(xiě)。兩個(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í)波特率加倍,所以也稱(chēng)SMOD位為波特率倍增位。例如,方式1的波特率計(jì)算公式:方式1波特率
=
定時(shí)器T1的溢出率8.2串行口的4種工作方式8.2.1方式0同步移位寄存器輸入/輸出方式。該方式并不用于兩個(gè)AT89S51單片機(jī)之間的異步串行通信,而是用于串行口外接移位寄存器,擴(kuò)展并行I/O口。8位數(shù)據(jù)為一幀,無(wú)起始位和停止位,先發(fā)送或接收最低位。波特率為fosc/12。幀格式如圖8-4。
圖8-4方式0的幀格式111.方式0輸出(1)方式0輸出的工作原理當(dāng)執(zhí)行一條將數(shù)據(jù)寫(xiě)入發(fā)送緩沖器SBUF指令時(shí),產(chǎn)生一個(gè)正脈沖,串行口開(kāi)始把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,通過(guò)74LS164的輸出來(lái)控制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所示,編寫(xiě)程序控制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ī)通過(guò)串行口輸出下一個(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寄存器寫(xiě)入控制字(設(shè)置為方式0,并使REN位置“1”,同時(shí)RI
=
0)時(shí),產(chǎn)生一個(gè)正脈沖,串行口開(kāi)始接收數(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è)開(kāi)關(guān)的狀態(tài)通過(guò)串口方式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參考程序如下:查詢(xún)方式讀入開(kāi)關(guān)狀態(tài)作業(yè):中斷方式讀入開(kāi)關(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ù)寫(xiě)SBUF的指令,就啟動(dòng)發(fā)送。發(fā)送時(shí)序見(jiàn)圖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)檢測(cè)到起始位的負(fù)跳變,則開(kāi)始接收。接收時(shí)序見(jiàn)圖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”。若不滿(mǎn)足任何一個(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ù)寫(xiě)入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)位檢測(cè)邏輯采樣到RXD的負(fù)跳變,判斷起始位有效,便開(kāi)始接收一幀信息。在接收完第9位數(shù)據(jù)后,需滿(mǎn)足以下兩個(gè)條件,才能將接收到的數(shù)據(jù)送入接收緩沖器SBUF。
(1)RI=0,意味著接收緩沖器為空。(2)SM2=0或接收到的第9位數(shù)據(jù)位RB8=1。當(dāng)滿(mǎn)足上述兩個(gè)條件時(shí),收到的數(shù)據(jù)送SBUF(接收緩沖器),第9位數(shù)據(jù)送入RB8,且RI置“1”。若不滿(mǎn)足這兩個(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來(lái)計(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í),需考慮如下問(wèn)題。(1)首先確定串行通信雙方的數(shù)傳速率和通信距離;(2)由串行通信的數(shù)傳速率和通信距離確定采用的串行通信接口標(biāo)準(zhǔn);(3)注意串行通信的通信線(xiàn)選擇,一般選用雙絞線(xiàn)較好,并根據(jù)傳輸?shù)木嚯x選擇纖芯的直徑。如空間干擾較多,還要選擇帶有屏蔽層的雙絞線(xiàn)。8.5.1各種串行通信接口標(biāo)準(zhǔn)AT89S51單串口的輸入、輸出均為T(mén)TL電平。以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è)開(kāi)關(guān),乙機(jī)的P1口接8個(gè)發(fā)光二極管。甲機(jī)設(shè)置為只發(fā)不收的單工方式。要求甲機(jī)讀入P1口的8個(gè)開(kāi)關(guān)的狀態(tài)后,通過(guò)串行口發(fā)送到乙機(jī),乙機(jī)將接收到的甲機(jī)的8個(gè)開(kāi)關(guān)的狀態(tài)數(shù)據(jù)送入P1口,由P1口的8個(gè)發(fā)光二極管來(lái)顯示8個(gè)開(kāi)關(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口開(kāi)關(guān)的狀態(tài)數(shù)據(jù)并送串行口發(fā)送*/ delay(100); TI=0; /*已發(fā)送完,再把TI清0*/ }}}44P218頁(yè)書(shū)中的程序是否工作正常,如不能找出原因/*甲機(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位是程控位,可由用戶(hù)置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ù)寫(xiě)入發(fā)送緩沖器*/TB8=P;/*將奇偶校驗(yàn)位寫(xiě)入TB8*/ while(TI==0);/*檢測(cè)發(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);/*檢測(cè)接收中斷標(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)地址后,開(kāi)始發(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位就是為滿(mǎn)足這一條件設(shè)置的多機(jī)通信控制位。其工作原理是在串行口以方式2(或方式3)接收時(shí),若SM2=1,則表示進(jìn)行多機(jī)通信,有以下兩種情況:(1)從機(jī)接收到主機(jī)發(fā)來(lái)的第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ā)來(lái)的數(shù)據(jù)。若SM2
=
0,則接收的第9位數(shù)據(jù)不論是0還是1,從機(jī)都將產(chǎn)生RI
=
1中斷標(biāo)志,接收到的數(shù)據(jù)裝入SBUF中。56多機(jī)通信的工作過(guò)程:(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ī)送來(lái)的地址是否和本機(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ā)來(lái)的數(shù)據(jù)(或命令);與主機(jī)發(fā)來(lái)的地址不相符的從機(jī),由于SM2保持為1,又RB8
=
0,因此不能激活中斷標(biāo)志RI,就不能接受主機(jī)58發(fā)來(lái)的數(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”,說(shuō)明主機(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ī)采用查詢(xún)方式,從機(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){ SBUF=0xff; /*發(fā)給從機(jī)數(shù)據(jù)出錯(cuò)標(biāo)志*/while(TI!=1); /*等待發(fā)送完*/TI=0;}64ucharmaster(ucharaddrs,ucharcomnd){ uchara,i,p; while(1){ SBUF=slave /*發(fā)呼叫地址*/while(TI!=1); /*等待發(fā)送完*/TI=0;while(RI!=1); /*等待從機(jī)應(yīng)答*/RI=0;if(SBUF!=addrs)error() /*若地址出錯(cuò),發(fā)出錯(cuò)標(biāo)志,從機(jī)復(fù)位*/ else{TB8=0; /*清地址標(biāo)志位,準(zhǔn)備接收數(shù)據(jù)*/SBUF=comnd; /*發(fā)命令幀*/65while(TI!=1);TI=0; while(RI!=1);RI=0; a=SBUF; /*接收從機(jī)返回的地址幀*/if(a&0x80)==80){TB8=1;error();} /*若主機(jī)命令非法,發(fā)復(fù)位信號(hào)給從機(jī)*/else{if(comnd==0x01); /*主機(jī)發(fā)送的命令是請(qǐng)求從機(jī)接收數(shù)據(jù)*/if(a&0x01)==0x01); /*從機(jī)準(zhǔn)備接收就緒*/{ do{ p=0; /*清校驗(yàn)和*/ for(i=0;i<Bytenum;i++); { SBUF=tdata[i]; /*發(fā)送數(shù)據(jù)*/p=p+tdata; /*計(jì)算校驗(yàn)和*/while(TI!=1);TI=0;}SBUF=p; /*發(fā)送校驗(yàn)和給從機(jī)*/66while(TI!=1);TI=0;while(RI!=1);RI=0; } while(SBUF!=0);/*從機(jī)接收不正確,主機(jī)重新發(fā)送*/TB8=1;return(0);}}else{if(comnd==0x02); /*主機(jī)發(fā)送的是接收命令,從機(jī)發(fā)送數(shù)據(jù)*/{ if(a&0x02)==0x02); /*從機(jī)準(zhǔn)備接收就緒*/{ while(1);p=0; /*清校驗(yàn)和*/for(i=0;i<Bytenum;i++); while(RI!=1);RI=0;rdata[i]=SBUF; /*主機(jī)接收數(shù)據(jù)*/p+=rdata[i];}67while(RI!=0);RI=0; if(SBUF==p);{ SBUF=0x00; /*校驗(yàn)和相同,發(fā)送0x00給從機(jī)*/while(TI!=1);TI=0;}else{ SBUF=0x0f;/*校驗(yàn)和不同,發(fā)送0x0f給從機(jī)*/while(TI!=1);TI=0;}}TB8=1; /*重置地址標(biāo)志位*/return(0);}68}}}}}}/*從機(jī)程序*/#include<reg51.h>#defineucharunsignedchar /*傳送一次的字節(jié)數(shù)*/#defineslave0x00#defineBytenum16 ucharidatatdata[16];ucharidatardata[16];bittrdy;bitrrdy;69voidmain(void){ TMOD=0x20; /*設(shè)置T1為定時(shí)器方式2*/ TL1=0xfa; /*波特率4800*/TH1=0xfa; PCON=0x00;TR1=1;SCON=0xf0; /*方式3,允許接收,SM2=1*/ES=1;EA=1; /*允許串口中斷*/while(1){trdy=1;rrdy=1;}; /*準(zhǔn)備好發(fā)送和接收*/}voidslave(void)interrupt4using1{ voidstr(void); voidsre(void); uchara; RI=0; ES=0; /*關(guān)串口中斷*/70if(SBUF!=slave){ES=1;gotoreti;} /*非本機(jī)地址,繼續(xù)監(jiān)聽(tīng)*/SM2=0; /*取消監(jiān)聽(tīng)狀態(tài)*/ SBUF=slave; /*發(fā)回從機(jī)地址*/while(TI!=1);TI=0;while(RI!=1);RI=0;if(RB8==1){SM2=1;ES=1;gotoreti;}/*確認(rèn)地址不符,從機(jī)復(fù)位*/a=SBUF;if(a==0x01){ /*從機(jī)接收主機(jī)的數(shù)據(jù)*/if(rrdy==1)SBUF=0x01; /*接收準(zhǔn)備好,發(fā)回0x01*/ elseSBUF=0x00;while(TI!=1);TI=0;while(RI!=1);RI=0;if(RB8==1){SM2=1;ES=1;gotoreti;}/*確認(rèn)地址不符,從機(jī)復(fù)位*/sre(); /*接收數(shù)據(jù)*/71} else{ if(a==0x02) /*從機(jī)向主機(jī)發(fā)送數(shù)據(jù)*/ {{ if(trdy==1)SBUF=0x02; /*發(fā)送準(zhǔn)備好*/elseSBUF=0x00;while(TI!=1);TI=0;while(RI!=1);RI=0;if(RB8==1){SM2=1;ES=1;gotoreti;} str(); /*發(fā)送數(shù)據(jù)*/} else{ SBUF=0x80; /*命令非法*/while(TI!=1);TI=0;SM2=1;ES=1; /*恢復(fù)監(jiān)聽(tīng)*/72}}reti:;}voidstr(void) /*發(fā)送數(shù)據(jù)函數(shù)*/{ ucharp,i; trdy=0;do{ p=0; for(i=0;i<Bytenum;i++); { SBUF=tdata[i]; /*發(fā)送數(shù)據(jù)*/ p+=tdata[i]; while(TI!=1);TI=0;
}SBUF=p; /*發(fā)送校驗(yàn)和*/while(TI!=1);TI=0;while(RI!=1);RI=0;}while(SBUF!=0); /*主機(jī)接收不正確,重新發(fā)送*/SM2=1;ES=1;73}voidsre(void) /*接收數(shù)據(jù)函數(shù)*/{ ucharp,i;rrdy=0; while(1);{ p=0; /*初始化校驗(yàn)和為0*/ for(i=0;i<Bytenum;i++); { while(RI!=1);RI=0;tdata[i]=SBUF;p+=rdata[i];}while(RI!=1);RI=0;if(SBUF!==p){SBUF=0x00;break;} /*校驗(yàn)和相同,發(fā)00H*/ else{ SBUF=0xff;while(TI!=1);TI=0;/*校驗(yàn)不同,發(fā)FFH,重新接收*/}74}SM2=1;ES=1; } 8.5.5單片機(jī)與PC機(jī)的串行通信測(cè)控系統(tǒng)中,常使用單片機(jī)進(jìn)行數(shù)據(jù)采集,但由于單片機(jī)的數(shù)據(jù)存儲(chǔ)容量和數(shù)據(jù)處理能力都較低,所以一般情況下單片機(jī)通過(guò)串口與PC機(jī)串口相連,把采集到的數(shù)據(jù)傳送到PC機(jī)上,再在PC機(jī)上進(jìn)行數(shù)據(jù)處理。由于單片機(jī)的輸入輸出是TTL電平,而PC機(jī)配置的都是RS-232標(biāo)準(zhǔn)串行接口,為9針“D”型連接器(插座),如圖8-26所示。表8-3為RS-232C的“D”型9針插頭的引腳定義。75圖8-26“D”型9針插頭引腳定義圖8-27單片機(jī)與PC機(jī)的串行通信接口7677由于兩者的電平不匹配,因此必須把單片機(jī)輸出的TTL電平轉(zhuǎn)換為RS-232電平。單片機(jī)與PC機(jī)的接口方案如圖8-27。圖中所用的電平轉(zhuǎn)換芯片為MAX232,接口連接只用3條線(xiàn),即RS-232插座中的2腳、3腳與5腳。一、單片機(jī)向計(jì)算機(jī)發(fā)送數(shù)據(jù)【例8-8】單片機(jī)向計(jì)算機(jī)發(fā)送數(shù)據(jù)的接口電路如圖8-27。要求單片機(jī)通過(guò)串行口的TXD腳向計(jì)算機(jī)串行發(fā)送8個(gè)數(shù)據(jù)字節(jié)。實(shí)際上單片機(jī)向計(jì)算機(jī)與單片機(jī)向單片機(jī)發(fā)送數(shù)據(jù)的方法是完全一樣的。單片機(jī)向計(jì)算機(jī)發(fā)送數(shù)據(jù)的參考程序如下。
78#include<reg51.h>codeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} /*欲發(fā)送的流水燈控制碼數(shù)組,定義為全局變量*/ voidsend(unsignedchardat){ SBUF=dat; /*待發(fā)送數(shù)據(jù)寫(xiě)入發(fā)送緩沖寄存器*/ while(TI==0); /*串口未發(fā)送完,等待*/ ; /*空操作*/ TI=0; /*一個(gè)字節(jié)發(fā)送完畢,軟件將TI標(biāo)志清0*/}/*主函數(shù)*/ voidmain(void) { unsignedchari; TMOD=0x20; /*設(shè)置T1為定時(shí)器方式2*/ SCON=0x40; /*串行口方式1,TB8=1*/79#include<reg51.h>codeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} /*欲發(fā)送的流水燈控制碼數(shù)組,定義為全局變量*/ voidsend(unsignedchardat){ SBUF=dat; /*待發(fā)送數(shù)據(jù)寫(xiě)入發(fā)送緩沖寄存器*/ while(TI==0); /*串口未發(fā)送完,等待*/ ; /*空操作*/ TI=0; /*一個(gè)字節(jié)發(fā)送完畢,軟件將TI
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版?zhèn)€人住宅小區(qū)地下車(chē)位產(chǎn)權(quán)分割轉(zhuǎn)讓合同3篇
- 2024年度三人合作開(kāi)展旅游業(yè)務(wù)合同3篇
- 2024年度航空零部件表面處理承包合同172篇
- 2024版商鋪?zhàn)赓U合同(含市場(chǎng)營(yíng)銷(xiāo)條款):營(yíng)銷(xiāo)活動(dòng)合作細(xì)節(jié)3篇
- 2024年度自然人之間生物技術(shù)研發(fā)與應(yīng)用合同2篇
- 2024年度印尼動(dòng)力煤買(mǎi)賣(mài)合同的附加條款3篇
- 2024年度個(gè)人手挖掘機(jī)二手交易合同3篇
- 2024版云計(jì)算解決方案包年服務(wù)合同范例2篇
- 2024版房地產(chǎn)項(xiàng)目擔(dān)保合同登記與終止操作細(xì)則2篇
- 2024年度健身中心會(huì)員服務(wù)與管理合同
- 大學(xué)生心理健康教育(中南大學(xué)版)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 塔吊試題(有答案)201506
- 人教版(2024新版)七年級(jí)上冊(cè)英語(yǔ)Unit 5單元測(cè)試卷(含答案)
- 第16講含參單調(diào)性討論、極值和最值(原卷版+解析)
- (完整版)新概念英語(yǔ)第一冊(cè)單詞表(打印版)
- 浙教版(2023)五下信息科技第14課《循環(huán)結(jié)構(gòu)(二)》教學(xué)設(shè)計(jì)
- 外研版(2019)必修第一冊(cè) Unit 6 At One with Nature Developing ideas 教學(xué)設(shè)計(jì)
- 第21課《小圣施威降大圣》同步課件 2024-2025學(xué)年七年級(jí)語(yǔ)文上冊(cè)(統(tǒng)編版2024)
- 4.1常見(jiàn)地貌類(lèi)型(含答案)-高一地理人教版(2019)必修第一冊(cè)
- 智能算力快速發(fā)展對(duì)電力供需的影響分析報(bào)告:儲(chǔ)能
- 2024-2030年中國(guó)巖土工程行業(yè)發(fā)展模式與投資戰(zhàn)略規(guī)劃分析報(bào)告
評(píng)論
0/150
提交評(píng)論