單片機(jī)原理與應(yīng)用設(shè)計(jì)(C51編程+Proteus仿真)(第4版)課件 張毅剛 第8章 串行口;第9章 并行擴(kuò)展_第1頁(yè)
單片機(jī)原理與應(yīng)用設(shè)計(jì)(C51編程+Proteus仿真)(第4版)課件 張毅剛 第8章 串行口;第9章 并行擴(kuò)展_第2頁(yè)
單片機(jī)原理與應(yīng)用設(shè)計(jì)(C51編程+Proteus仿真)(第4版)課件 張毅剛 第8章 串行口;第9章 并行擴(kuò)展_第3頁(yè)
單片機(jī)原理與應(yīng)用設(shè)計(jì)(C51編程+Proteus仿真)(第4版)課件 張毅剛 第8章 串行口;第9章 并行擴(kuò)展_第4頁(yè)
單片機(jī)原理與應(yīng)用設(shè)計(jì)(C51編程+Proteus仿真)(第4版)課件 張毅剛 第8章 串行口;第9章 并行擴(kuò)展_第5頁(yè)
已閱讀5頁(yè),還剩249頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1

第8章

串行口的工作原理及應(yīng)用

12

導(dǎo)讀:

本章首先介紹有關(guān)串行通信的基礎(chǔ),然后對(duì)AT89S51單片機(jī)串行通信口(串行口)的基本結(jié)構(gòu)與工作原理、相關(guān)的特殊功能寄存器,以及串行口的4種工作方式進(jìn)行介紹。此外還介紹如何利用串行口實(shí)現(xiàn)多機(jī)串行通信,與PC機(jī)的串行通信,以及串行通信的各種應(yīng)用編程。最后,從實(shí)用角度對(duì)目前單片機(jī)串行通信廣泛應(yīng)用的各種常見(jiàn)的串行通信標(biāo)準(zhǔn)接口RS-232、RS-422及RS-485給予簡(jiǎn)要介紹。38.1串行通信基礎(chǔ)隨著單片機(jī)的廣泛應(yīng)用與計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的普及,單片機(jī)與個(gè)人計(jì)算機(jī)或單片機(jī)與單片機(jī)之間的通信使用較多。8.1.1并行通信與串行通信單片機(jī)的數(shù)據(jù)通信有并行通信與串行通信兩種方式。1.并行通信單片機(jī)的并行通信通常使用多條數(shù)據(jù)線(xiàn)將數(shù)據(jù)字節(jié)的各個(gè)位同時(shí)傳送,每一位數(shù)據(jù)都需要一條傳輸線(xiàn),此外還需要一條或幾條控制信號(hào)線(xiàn)。并行通信的示意圖見(jiàn)圖8-1。4圖8-1

并行通信示意圖5并行通信相對(duì)傳輸速度快。但由于傳輸線(xiàn)較多,長(zhǎng)距離傳送時(shí)成本高,因此這種方式適合于短距離的數(shù)據(jù)傳輸。2.串行通信單片機(jī)串行通信是將數(shù)據(jù)字節(jié)分成一位一位的形式在一條傳輸線(xiàn)上逐個(gè)傳送。一次只能傳送一位,對(duì)于一個(gè)字節(jié)的數(shù)據(jù),至少要分8位才能傳送完畢。如圖8-2所示。串行通信在發(fā)送時(shí),要把并行數(shù)據(jù)變成串行數(shù)據(jù)發(fā)送到線(xiàn)路上去,接收時(shí)要把串行數(shù)據(jù)再變成并行數(shù)據(jù)。

串行通信傳輸線(xiàn)少,長(zhǎng)距離傳送時(shí)成本低,且可以利用電話(huà)網(wǎng)等現(xiàn)成設(shè)備,因此在單片機(jī)應(yīng)用系統(tǒng)中,串行通信的使用非常普遍。6圖8-2

串行通信的示意圖78.1.2同步通信與異步通信串行通信又有兩種方式:異步通信與同步通信。同步串行通信是采用一個(gè)同步時(shí)鐘,通過(guò)一條同步時(shí)鐘線(xiàn),加到收發(fā)雙方,使收、發(fā)雙方達(dá)到完全同步,此時(shí),傳輸數(shù)據(jù)的位之間的距離均為“位間隔”的整數(shù)倍,同時(shí)傳送的字符間不留間隙,既保持位同步關(guān)系。同步通信及數(shù)據(jù)格式見(jiàn)圖8-3。異步串行通信是指收、發(fā)雙方使用各自的時(shí)鐘控制數(shù)據(jù)的發(fā)送和接收,這樣可省去連接收、發(fā)雙方的一條同步時(shí)鐘信號(hào)線(xiàn),使得異步串行通信連接更加簡(jiǎn)單且容易實(shí)現(xiàn)。為使收發(fā)雙方協(xié)調(diào),要求收、發(fā)雙方的時(shí)鐘盡可能一致。8圖8-3

同步通信及數(shù)據(jù)格式9

圖8-4給出了異步串行通信的示意圖以及數(shù)據(jù)幀格式。異步串行通信是以數(shù)據(jù)幀為單位進(jìn)行數(shù)據(jù)傳輸,各數(shù)據(jù)幀之間的間隔是任意的,但每個(gè)數(shù)據(jù)幀中的各位是以固定的時(shí)間傳送的。異步串行通信不要求收、發(fā)雙方時(shí)鐘嚴(yán)格一致,實(shí)現(xiàn)容易,成本低,但是每個(gè)數(shù)據(jù)幀要附加起始位、停止位有時(shí)還要再加上校驗(yàn)位。同步串行通信相比異步串行通信,同步串行通信數(shù)據(jù)傳輸?shù)男瘦^高,但是額外增加了一條同步時(shí)鐘線(xiàn)。10圖8-4

異步串行通信118.1.3串行通信的傳輸模式串行通信按照按照數(shù)據(jù)傳輸?shù)姆较蚣皶r(shí)間關(guān)系可分為單工、半雙工和全雙工。1.單工數(shù)據(jù)傳輸僅能按一個(gè)固定方向傳輸,不能反向傳輸,如圖8-5(a)所示。2.半雙工數(shù)據(jù)傳輸可以雙向傳輸,但不能同時(shí)進(jìn)行,不能同時(shí)傳輸,如圖8-5(b)所示。3.全雙工數(shù)據(jù)傳輸可同時(shí)進(jìn)行雙向傳輸,如圖8-5(c)所示。12圖8-5

單工、半雙工和全雙工的數(shù)據(jù)傳輸模式138.1.4串行通信的錯(cuò)誤校驗(yàn)在串行通信中,往往要對(duì)數(shù)據(jù)傳送的正確與否進(jìn)行校驗(yàn)。校驗(yàn)時(shí)保證傳輸數(shù)據(jù)準(zhǔn)確無(wú)誤的關(guān)鍵。常用的有奇偶校驗(yàn)與循環(huán)冗余碼校驗(yàn)等方法。1.奇偶校驗(yàn)串行發(fā)送數(shù)據(jù)時(shí),數(shù)據(jù)位尾隨1位奇偶校驗(yàn)位(1或0)。當(dāng)約定為奇校驗(yàn)時(shí),數(shù)據(jù)中“1”的個(gè)數(shù)與校驗(yàn)位“1”的個(gè)數(shù)之和應(yīng)為奇數(shù);當(dāng)約定為偶校驗(yàn)時(shí),數(shù)據(jù)中“1”的個(gè)數(shù)與校驗(yàn)位“1”的個(gè)數(shù)之和應(yīng)為偶數(shù)。數(shù)據(jù)發(fā)送方與接收方應(yīng)一致。在接收數(shù)據(jù)幀時(shí),對(duì)“1”的個(gè)數(shù)進(jìn)行校驗(yàn),若發(fā)現(xiàn)不一致,則說(shuō)明數(shù)據(jù)傳輸過(guò)程中出現(xiàn)了差錯(cuò),則通知發(fā)送端重發(fā)。142.代碼和校驗(yàn)代碼和校驗(yàn)是發(fā)送方將所發(fā)數(shù)據(jù)塊求和或各字節(jié)異或,產(chǎn)生一個(gè)字節(jié)的校驗(yàn)字符(校驗(yàn)和)附加到數(shù)據(jù)塊末尾。接收方接收數(shù)據(jù)時(shí)同時(shí)對(duì)數(shù)據(jù)塊(除校驗(yàn)字節(jié))求和或各字節(jié)異或,將所得結(jié)果與發(fā)送方的“校驗(yàn)和”進(jìn)行比較,如果相符,則無(wú)差錯(cuò),否則即認(rèn)為在傳輸過(guò)程中出現(xiàn)了差錯(cuò)。3.循環(huán)冗余碼校驗(yàn)循環(huán)冗余碼校驗(yàn)糾錯(cuò)能力強(qiáng),容易實(shí)現(xiàn)。該校驗(yàn)是通過(guò)某種數(shù)學(xué)運(yùn)算實(shí)現(xiàn)有效信息與校驗(yàn)位之間的循環(huán)校驗(yàn),常用于對(duì)磁盤(pán)信息的傳輸、存儲(chǔ)區(qū)的完整性校驗(yàn)等。是目前應(yīng)用最廣的檢錯(cuò)碼編碼方式之一,廣泛用于同步通信中。158.2串行口的結(jié)構(gòu)結(jié)構(gòu)見(jiàn)圖8-6。有兩個(gè)物理上獨(dú)立的接收、發(fā)送緩沖器SBUF(屬于特殊功能寄存器),可同時(shí)發(fā)送、接收數(shù)據(jù)。發(fā)送緩沖器只能寫(xiě)入不能讀出接收緩沖器只能讀出不能寫(xiě)入

兩個(gè)緩沖器共用一個(gè)特殊功能寄存器字節(jié)地址(99H)。控制寄存器共有兩個(gè):特殊功能寄存器SCON和PCON。16

16

圖8-6

串行口的內(nèi)部結(jié)構(gòu)178.2.1串行口控制寄存器SCON串行口控制寄存器SCON,字節(jié)地址98H,可位尋址,位地址為98H~9FH,即SCON的所有位都可用軟件來(lái)進(jìn)行位操作清“0”或置“1”。SCON格式見(jiàn)圖8-7。17圖8-7

串口控制寄存器SCON格式18

寄存器SCON各位功能:(1)SM0、SM1—串口4種工作方式選擇SM0、SM12位編碼對(duì)應(yīng)4種工作方式見(jiàn)表8-1。

18

表8-1串口4種工作方式表8-119(2)SM2—多機(jī)通信控制位

多機(jī)通信是在方式2和方式3下進(jìn)行,因此SM2位主要用于方式2或方式3。

當(dāng)串口以方式2或方式3接收時(shí),如SM2=1,則只有當(dāng)接收到的第9位數(shù)據(jù)(RB8)為“1”時(shí),才使RI置“1”,產(chǎn)生中斷請(qǐng)求,并將收到的前8位數(shù)據(jù)送入SBUF;當(dāng)收到的第9位數(shù)據(jù)(RB8)為“0”時(shí),則將收到的前8位數(shù)據(jù)丟棄。

當(dāng)SM2=0時(shí),則不論第9位數(shù)據(jù)是“1”還是“0”,都將接收的前8位數(shù)據(jù)送入SBUF中,并使RI置“1”,產(chǎn)生中斷請(qǐng)求。

方式1時(shí),如果SM2=1,則只有收到有效的停止位時(shí)才會(huì)激活RI。

方式0時(shí),SM2必須為0。1920(3)REN—允許串行接收位,由軟件置“1”或清“0”。

REN=1,允許串行口接收數(shù)據(jù)。

REN=0,禁止串行口接收數(shù)據(jù)。

(4)TB8—發(fā)送的第9位數(shù)據(jù)在方式2和方式3時(shí),TB8是要發(fā)送的第9位數(shù)據(jù),其值由軟件置“1”或清“0”。

在雙機(jī)串行通信時(shí),TB8一般作為奇偶校驗(yàn)位使用;也可在多機(jī)串行通信中表示主機(jī)發(fā)送的是地址幀還是數(shù)據(jù)幀,TB8=1為地址幀,TB8=0為數(shù)據(jù)幀。2021(5)RB8—接收的第9位數(shù)據(jù)在方式2和方式3時(shí),RB8存放接收到的第9位數(shù)據(jù)。在方式1,如果SM2=0,RB8是接收到的停止位。在方式0,不使用RB8。(6)TI—發(fā)送中斷標(biāo)志位方式0時(shí),串行發(fā)送的第8位數(shù)據(jù)結(jié)束時(shí),TI由硬件置“1”,在其他工作方式中,串行口發(fā)送停止位的開(kāi)始時(shí),置TI為“1”。TI=1,表示1幀數(shù)據(jù)發(fā)送結(jié)束。TI位狀態(tài)可供軟件查詢(xún),也可申請(qǐng)中斷。CPU響應(yīng)中斷后,在中斷服務(wù)程序向SBUF寫(xiě)入要發(fā)送的下一幀數(shù)據(jù)。注意:TI必須由軟件清“0”。(7)RI—接收中斷標(biāo)志位

2122串口在方式0時(shí),接收完第8位數(shù)據(jù)時(shí),RI由硬件置“1”。在其他工作方式中,串行接收到停止位時(shí),該位置“1”。RI=1,表示一幀數(shù)據(jù)接收完畢,并申請(qǐng)中斷,要求CPU從接收SBUF取走數(shù)據(jù)。該位狀態(tài)也可供軟件查詢(xún)。

注意:RI必須由軟件清“0”。

8.2.2電源控制寄存器PCON

字節(jié)地址為87H,不能位尋址。格式見(jiàn)圖8-8。僅最高位SMOD與串口有關(guān),低4位功能在第2章中已介紹。SMOD位:波特率選擇位。

2223

圖8-8

特殊功能寄存器PCON的格式24例如,方式1的波特率計(jì)算公式為

當(dāng)SMOD=1時(shí),比SMOD=0時(shí)波特率加倍,所以也稱(chēng)SMOD位為波特率倍增位。24258.3串行口的4種工作方式

4種工作方式由特殊功能寄存器SCON中SM0、SM1位定義,編碼見(jiàn)表8-1。8.3.1方式0方式0為同步移位寄存器輸入/輸出方式。該方式并不用于兩個(gè)AT89S51單片機(jī)間的異步串行通信,而是用于外接移位寄存器,用來(lái)擴(kuò)展并行I/O口。方式0以8位數(shù)據(jù)為1幀,沒(méi)有起始位和停止位,先發(fā)送或接收最低位。波特率是固定的,為fosc/12。幀格式見(jiàn)圖8-9。25圖8-9

方式0幀格式261.方式0輸出(1)方式0輸出的工作原理當(dāng)單片機(jī)執(zhí)行將數(shù)據(jù)寫(xiě)入發(fā)送緩沖器SBUF指令時(shí),產(chǎn)生一個(gè)正脈沖,串口把8位數(shù)據(jù)以fosc/12固定波特率從RXD腳串行輸出,低位在先,TXD腳輸出同步移位脈沖,當(dāng)8位數(shù)據(jù)發(fā)送完,中斷標(biāo)志位TI置“1”。

方式0的發(fā)送時(shí)序見(jiàn)圖8-10。2627圖8-10

方式0發(fā)送時(shí)序28(2)方式0輸出的應(yīng)用案例

典型應(yīng)用是串口外接串行輸入/并行輸出的同步移位寄存器74LS164,實(shí)現(xiàn)并行端口的擴(kuò)展。

圖8-11為串口方式0,通過(guò)74LS164輸出控制8個(gè)外接LED發(fā)光二極管亮滅的接口電路。當(dāng)串口設(shè)置在方式0輸出時(shí),串行數(shù)據(jù)由RXD端(P3.0)送出,移位脈沖由TXD端(P3.1)送出。在移位脈沖的作用下,串行口發(fā)送緩沖器的數(shù)據(jù)逐位地從RXD端串行地移入74LS164中。

2829

29圖8-11

方式0輸出外接8個(gè)LED發(fā)光二極管接口電路30

【例8-1】如圖8-11,控制8個(gè)發(fā)光二極管流水點(diǎn)亮。圖中74LS164的8腳(CLK端)為同步脈沖輸入端,9腳為控制端,9腳電平由單片機(jī)的P1.0控制,當(dāng)9腳為0時(shí),允許串行數(shù)據(jù)由RXD端(P3.0)向74LS164的串行數(shù)據(jù)輸入端A和B(1腳和2腳)輸入,但是74LS164的8位并行輸出端關(guān)閉;當(dāng)9腳為1時(shí),A和B輸入端關(guān)閉,但是允許74LS164中的8位數(shù)據(jù)并行輸出。當(dāng)串行口將8位串行數(shù)據(jù)發(fā)送完畢后,申請(qǐng)中斷,在中斷服務(wù)程序中,單片機(jī)向通過(guò)串行口輸出下一個(gè)8位數(shù)據(jù)。

采用中斷方式的參考程序:

#include<reg51.h>

#include<stdio.h>

sbitP1_0=0x90;

unsignedcharnSendByte;3031

voiddelay(unsignedinti)

//延時(shí)子程序{

unsignedcharj;

for(;i>0;i--)

//變量i由實(shí)際參數(shù)傳入一個(gè)值,因此i不能賦初值 for(j=0;j<125;j++);}

main()

//主程序{

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

EA=1; //全局中斷允許

ES=1; //允許串行口中斷

nSendByte=1; //點(diǎn)亮數(shù)據(jù)初始為00000001送入nSendByte

SBUF=nSendByte; //向SBUF寫(xiě)入點(diǎn)亮數(shù)據(jù),啟動(dòng)串行發(fā)送

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

while(1){;}}3132

voidSerial_Port()interrupt4using0//串行口中斷服務(wù)程序{

if(TI)

//如果TI=1,1個(gè)字節(jié)串行發(fā)送完畢{ P1_0=1;

//P1_0=1,允許74LS164并行輸出,流水點(diǎn)亮二極管

SBUF=nSendByte;//向SBUF寫(xiě)入數(shù)據(jù),啟動(dòng)串行發(fā)送 delay(500);

//延時(shí),點(diǎn)亮二極管持續(xù)一段時(shí)間 P1_0=0;

//P1_0=0,允許向74LS164串行寫(xiě)入

nSendByte=nSendByte<<1;//點(diǎn)亮數(shù)據(jù)左移1位

if(nSendByte==0)

nSendByte=1; //點(diǎn)亮數(shù)據(jù)是否左移8次?是,重新送點(diǎn)亮數(shù)據(jù)

SBUF=nSendByte; //向74LS164串行發(fā)送點(diǎn)亮數(shù)據(jù)} TI=0;RI=0;} 3233程序說(shuō)明:(1)程序中定義了全局變量nSendByte,以便在中斷服務(wù)程序中能訪(fǎng)問(wèn)該變量。nSendByte用于存放從串行口發(fā)出的點(diǎn)亮數(shù)據(jù),在程序中使用左移1位操作符“<<”對(duì)nSendByte變量進(jìn)行移位,使得從串口發(fā)出的數(shù)據(jù)為0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80,從而流水點(diǎn)亮各個(gè)發(fā)光二極管。(2)程序中if語(yǔ)句的作用是當(dāng)nSendByte左移1位由0x80變?yōu)?x00后,需對(duì)變量nSendByte重新賦值為1。(3)主程序中SBUF=nSendByte語(yǔ)句必不可少,如果沒(méi)有該語(yǔ)句,主程序并不從串行口發(fā)送數(shù)據(jù),也就不會(huì)產(chǎn)生隨后的發(fā)送完成中斷。(4)兩條語(yǔ)句“while(1){;}”實(shí)現(xiàn)反復(fù)循環(huán)的功能。33342.方式0輸入

(1)工作原理:方式0輸入時(shí),REN為串行口允許接收控制位,REN=0,禁止接收;REN=1,允許接收。

當(dāng)CPU向串行口SCON寄存器寫(xiě)入控制字(設(shè)置為方式0,并使REN位置“1”,同時(shí)RI=0)時(shí),產(chǎn)生一正脈沖,串口開(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”,表示一幀接收完畢,可進(jìn)行下一幀接收,時(shí)序見(jiàn)圖8-12。3435圖8-12

方式0接收時(shí)序36(2)方式0輸入應(yīng)用舉例【例8-2】圖8-13為串口外接一片8位并行輸入、串行輸出同步移位寄存器74LS165,擴(kuò)展一個(gè)8位并行輸入口的電路,可將接在74LS165的8個(gè)開(kāi)關(guān)S0~S7的狀態(tài)通過(guò)串行口的方式0讀入到單片機(jī)內(nèi)。74LS165的SH/LD*端(1腳)為控制端,由單片機(jī)的P1.1腳控制。若SH/LD*=0,則74LS165可以并行輸入數(shù)據(jù),且串行輸出端關(guān)閉;當(dāng)SH/LD*=1,則并行輸入關(guān)斷,可以向單片機(jī)串行傳送。當(dāng)P1.0連接的開(kāi)關(guān)K合上時(shí),可進(jìn)行開(kāi)關(guān)S0~S7狀態(tài)數(shù)字量的并行讀入。由圖8-13,采用中斷方式來(lái)對(duì)S0~S7狀態(tài)讀取,并由單片機(jī)P2口驅(qū)動(dòng)二極管點(diǎn)亮(開(kāi)關(guān)S0~S7中的任何一個(gè)按下,則對(duì)應(yīng)的二極管點(diǎn)亮)。37

37圖8-13

串口方式0外接并行輸入、串行輸出的同步移位寄存器38

參考程序如下:#include<reg51.h>#include"intrins.h"#include<stdio.h>sbitP1_0=0x90;sbitP1_1=0x91;unsignedcharnRxByte;

voiddelay(unsignedinti) //延時(shí)子程序{ unsignedcharj; for(;i>0;i--) //變量i由實(shí)際參數(shù)傳入一個(gè)值,因此i不能賦初值 for(j=0;j<125;j++); }

main(){

SCON=0x10; //串行口初始化為方式0 ES=1;

//允許串行口中斷EA=1; //允許全局中斷 for(;;);}

3839

voidSerial_Port()interrupt4using0//串行口中斷服務(wù)子程序{

if(P1_0==0)

//如果P1_0=0表示開(kāi)關(guān)K按下,可以讀開(kāi)關(guān)S0~S7的狀態(tài) {

P1_1=0; //P1_1=0并行讀入開(kāi)關(guān)的狀態(tài)

delay(1);

P1_1=1; //P1_1=1將開(kāi)關(guān)的狀態(tài)串行讀入到串口中

RI=0; //接收中斷標(biāo)志RI清0

nRxByte=SBUF;//接收的開(kāi)關(guān)狀態(tài)數(shù)據(jù)從SBUF讀入到nRxByte單元中

P2=nRxByte;/開(kāi)關(guān)狀態(tài)數(shù)據(jù)送到P2口,驅(qū)動(dòng)發(fā)光二極管發(fā)光 }} 程序說(shuō)明:當(dāng)P1.0為0,即開(kāi)關(guān)K按下,表示允許并行讀入開(kāi)關(guān)S0~S7的狀態(tài)數(shù)字量,通過(guò)P1.1把SH/LD*置0,則并行讀入開(kāi)關(guān)S0~S7的狀態(tài)。再讓P1.1=1,即SH/LD*置1,74LS165將剛才讀入的S0~S7狀態(tài)通過(guò)QH端(RXD腳)串行發(fā)送到單片機(jī)的SBUF中,在中斷服務(wù)程序中把SBUF中的數(shù)據(jù)讀到nRxByte單元,并送到P2口驅(qū)動(dòng)8個(gè)發(fā)光二極管。39408.3.2方式1

方式1為雙機(jī)串行通信方式,如圖8-14。

當(dāng)SM0、SM1=01時(shí),串行口設(shè)為方式1雙機(jī)串行通信。TXD腳和RXD腳分別用于發(fā)送和接收數(shù)據(jù)。方式1收發(fā)一幀數(shù)據(jù)為10位,1個(gè)起始位(0),8個(gè)數(shù)據(jù)位,1個(gè)停止位(1),先發(fā)送或接收最低位。方式1幀格式見(jiàn)圖8-15。

40圖8-14

方式1雙機(jī)串行通信的連接電路41

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

式中,SMOD為PCON寄存器的最高位的值(0或1)。41圖8-15

方式1的幀格式421.方式1發(fā)送

串口以方式1輸出,數(shù)據(jù)位由TXD端輸出,發(fā)送一幀信息為10位,1位起始位0,8位數(shù)據(jù)位(先低位)和1位停止位1,當(dāng)CPU執(zhí)行寫(xiě)數(shù)據(jù)到發(fā)送緩沖器SBUF的命令后,就啟動(dòng)發(fā)送。方式1發(fā)送時(shí)序如圖8-16。

圖8-16發(fā)送時(shí)鐘TX時(shí)鐘頻率就是發(fā)送波特率。發(fā)送開(kāi)始時(shí),內(nèi)部邏輯將起始位向TXD腳(P3.1)輸出,此后每經(jīng)1個(gè)TX時(shí)鐘周期,便產(chǎn)生1個(gè)移位脈沖,并由TXD腳輸出1個(gè)數(shù)據(jù)位。8位全發(fā)送完后,中斷標(biāo)志位TI置“1”。4243圖8-16方式1發(fā)送時(shí)序442.方式1接收串行口以方式1(SM0、SM1=01)接收時(shí)(REN=1),數(shù)據(jù)從RXD(P3.0)腳輸入。當(dāng)檢測(cè)到起始位負(fù)跳變時(shí),則開(kāi)始接收。方式1接收時(shí)序如圖8-17。

44圖8-17

方式1接收時(shí)序45

接收時(shí),定時(shí)控制信號(hào)有兩種:

(1)接收移位時(shí)鐘(RX時(shí)鐘),頻率和傳送的波特率相同,

(2)位檢測(cè)器采樣脈沖,它的頻率是RX時(shí)鐘的16倍。也就是在1位數(shù)據(jù)期間,有16個(gè)采樣脈沖,以波特率的16倍速率采樣RXD引腳狀態(tài)。

當(dāng)采樣到RXD端從1到0的負(fù)跳變(有可能是起始位)時(shí),就啟動(dòng)接收檢測(cè)器。接收的值是3次連續(xù)采樣(第7、8、9個(gè)脈沖時(shí)采樣),取其中兩次相同的值,以確認(rèn)是否是真正起始位(負(fù)跳變)開(kāi)始,這樣能較好消除干擾引起的影響,以保證可靠無(wú)誤地開(kāi)始接收數(shù)據(jù)。46當(dāng)確認(rèn)起始位有效時(shí),開(kāi)始接收一幀信息。接收每一位數(shù)據(jù)時(shí),也都進(jìn)行3次連續(xù)采樣(第7、8、9個(gè)脈沖時(shí)采樣),接收的值是3次采樣中至少兩次相同的值,以保證接收到的數(shù)據(jù)位的準(zhǔn)確性。當(dāng)一幀數(shù)據(jù)接收完畢后,必須同時(shí)滿(mǎn)足以下兩個(gè)條件,這次接收才真正有效。(1)RI=0,即上一幀數(shù)據(jù)接收完成時(shí),RI=1發(fā)出的中斷請(qǐng)求已被響應(yīng),SBUF中的數(shù)據(jù)已被取走,說(shuō)明“接收SBUF”已空。(2)SM2=0或收到的停止位=1(方式1時(shí),停止位已進(jìn)入RB8),則將接收到的數(shù)據(jù)裝入SBUF和RB8(裝入的是停止位),且中斷標(biāo)志RI置“1”。

若不能同時(shí)滿(mǎn)足這兩個(gè)條件,收到的數(shù)據(jù)不能裝入SBUF,這意味著該幀數(shù)據(jù)將丟失。4647

8.3.3方式2串口工作于方式2和方式3時(shí),為9位異步通信接口。每幀數(shù)據(jù)均為11位,1位起始位0,8位數(shù)據(jù)位(先低位),1位可程控為1或0的第9位數(shù)據(jù)及1位停止位。方式2、方式3幀格式如圖8-18。方式2的波特率由下式確定:

圖8-18

方式2、方式3的幀格式481.方式2發(fā)送發(fā)送前,先由通信協(xié)議由軟件設(shè)置TB8(如奇偶校驗(yàn)位或多機(jī)通信的地址/數(shù)據(jù)的標(biāo)志位),然后將要發(fā)送的數(shù)據(jù)寫(xiě)入SBUF,即可啟動(dòng)發(fā)送過(guò)程。串行口能自動(dòng)把TB8取出,并裝入到第9位數(shù)據(jù)位的位置,再逐一發(fā)送出去。發(fā)送完畢,則使TI位置“1”。方式2和方式3發(fā)送時(shí)序如圖8-19。48圖8-19

方式2和方式3發(fā)送時(shí)序492.方式2接收當(dāng)SCON寄存器SM0、SM1=10,且REN=1時(shí),允許串行口以方式2接收數(shù)據(jù)。接收時(shí),數(shù)據(jù)由RXD端輸入,接收11位信息。當(dāng)位檢測(cè)邏輯采樣到RXD引腳從1到0的負(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è)條件,接收的信息將被丟棄。

4950串行口方式2和方式3接收時(shí)序如圖8-20。圖8-20

方式2和方式3接收時(shí)序518.3.4方式3當(dāng)SM0、SM1兩位為11時(shí),串行口被定義工作在方式3。方式3為波特率可變的9位異步通信方式,除了波特率外,方式3和方式2相同。方式3發(fā)送和接收時(shí)序見(jiàn)圖8-16和圖8-17。方式3波特率見(jiàn)下式:

51528.4多機(jī)通信多個(gè)AT89S51單片機(jī)可利用串行口進(jìn)行多機(jī)通信,經(jīng)常采用圖8-21主從式結(jié)構(gòu)。

1個(gè)主機(jī)(AT89S51單片機(jī)或其他具有串口的微機(jī))和3個(gè)(也可為多個(gè))AT89S51單片機(jī)組成的從機(jī)系統(tǒng),如圖8-21。主機(jī)RXD與所有從機(jī)TXD端相連,TXD與所有從機(jī)RXD端相連。從機(jī)地址分別為01H、02H和03H。52圖8-21

多機(jī)通信的主從式結(jié)構(gòu)53

主從式是指多機(jī)系統(tǒng)中,只有一個(gè)主機(jī),其余的全是從機(jī)。主機(jī)發(fā)送的信息可以被所有從機(jī)接收,任何一個(gè)從機(jī)發(fā)送的信息,只能由主機(jī)接收。從機(jī)和從機(jī)之間不能相互直接通信,它們的通信只能經(jīng)主機(jī)才能實(shí)現(xiàn)。

1.多機(jī)通信工作原理要保證主機(jī)與所選擇的從機(jī)實(shí)現(xiàn)可靠通信,必須保證串行口具有識(shí)別功能。串行口控制寄存器SCON中的SM2位就是為滿(mǎn)足這一條件而設(shè)置的多機(jī)通信控制位。其工作原理是在串行口以方式2(或方式3)接收時(shí),若SM2=1,則表示進(jìn)行多機(jī)通信,可能出現(xiàn)兩種情況。5354

(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中。應(yīng)用AT89S51單片機(jī)串口這一特性,可實(shí)現(xiàn)AT89S51的多機(jī)通信。多機(jī)通信的工作過(guò)程如下。

5455

2.多機(jī)通信的工作過(guò)程

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

與主機(jī)發(fā)來(lái)地址不符的從機(jī),由于SM2保持為1,又RB8=0,因此不能激活中斷標(biāo)志RI,也就不能接收主機(jī)發(fā)來(lái)的數(shù)據(jù)幀。從而保證主機(jī)與從機(jī)間通信的正確性。此時(shí)主機(jī)與建立聯(lián)系的從機(jī)已設(shè)置為單機(jī)通信模式,即在整個(gè)通信中,通信的雙方都要保持發(fā)送數(shù)據(jù)的第9位(即TB8位)為0,防止其他的從機(jī)誤接收數(shù)據(jù)。

5657(4)結(jié)束數(shù)據(jù)通信并為下一次多機(jī)通信做準(zhǔn)備。在多機(jī)通信系統(tǒng)中每個(gè)從機(jī)都被賦予唯一一個(gè)地址。

例如,圖8-21中3個(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ī)通信。這時(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)備。57588.5波特率的制定方法在串行通信中,收、發(fā)雙方發(fā)送或接收的波特率必須一致。通過(guò)軟件對(duì)串口可設(shè)定4種工作方式。其中方式0和方式2的波特率是固定的;方式1和方式3的波特率是可變的,由定時(shí)器T1的溢出率(T1每秒溢出的次數(shù))來(lái)確定。8.5.1波特率的定義

定義:串行口每秒鐘發(fā)送(或接收)的位數(shù)稱(chēng)為波特率。設(shè)發(fā)送一位所需要的時(shí)間為T(mén),則波特率為1/T。對(duì)于定時(shí)器的不同工作方式,得到的波特率的范圍是不一樣的,這是由于定時(shí)器/計(jì)數(shù)器T1在不同工作方式下計(jì)數(shù)位數(shù)不同所決定。58598.5.2定時(shí)器T1產(chǎn)生波特率的計(jì)算波特率和串口工作方式有關(guān)。

(1)方式0

波特率固定為fosc的1/12,且不受SMOD位的影響。若fosc=12MHz,波特率為fosc/12,即1Mbit/s。

(2)方式2

波特率僅與SMOD位的值有關(guān)。

若fosc=12MHz:SMOD=0,波特率=187.5kbit/s;SMOD=1,波特率=375kbit/s。5960(3)方式1或方式3常用T1作為波特率發(fā)生器,其關(guān)系式為

由式(8-1),T1的溢出率和SMOD的值共同決定波特率。

在實(shí)際設(shè)定波特率時(shí),用

定時(shí)器方式2(自動(dòng)裝初值)確定波特率較理想,它不需用軟件重裝初值,可避免因軟件重裝初值帶來(lái)的定時(shí)誤差,且算出的波特率比較準(zhǔn)確。即TL1作為8位計(jì)數(shù)器,TH1存放備用初值。60(8-1)61設(shè)定時(shí)器T1方式2的初值為X,則有

將式(8-2)代入式(8-1),則有

由式(8-3),這種方式波特率隨fosc、SMOD和初值X而變化。在實(shí)際使用時(shí),常根據(jù)已知波特率和時(shí)鐘頻率fosc來(lái)計(jì)算T1的初值X。為避免繁雜初值計(jì)算,常用波特率和初值X間關(guān)系常列成表8-2形式,供查用。61(8-2)(8-3)6263表8-2有兩點(diǎn)需要注意:(1)在時(shí)鐘振蕩頻率fosc為12MHz或6MHz時(shí),將初值X和fosc帶入式(8-3),不能整除,因此算出的波特率有一定誤差。要消除誤差可通過(guò)調(diào)整fosc實(shí)現(xiàn),例如采用的時(shí)鐘頻率為11.0592MHz。因此,為減小波特率誤差,應(yīng)該使用的時(shí)鐘頻率必須為11.0592MHz。(2)如果串行通信選用很低波特率(如波特率選為55),可將定時(shí)器T1設(shè)置為方式1定時(shí)。但在這種情況下,T1溢出時(shí),需在中斷服務(wù)程序中重新裝入初值。中斷響應(yīng)時(shí)間和執(zhí)行指令時(shí)間會(huì)使波特率產(chǎn)生一定的誤差,可用改變初值的方法加以調(diào)整。6364

【例8-3】若AT89S51的時(shí)鐘為11.0592MHz,選用T1的方式2定時(shí)作為波特率發(fā)生器,波特率為2

400bit/s,求初值。設(shè)T1為方式2定時(shí),選SMOD=0。將已知條件帶入式(8-3)

從中解

X=244=F4H。只要把F4H裝入TH1和TL1,則T1發(fā)出的波特率為2400bit/s。在實(shí)際編程中,該結(jié)果也可直接從表8-2中查到。這里時(shí)鐘振蕩頻率選為11.0592MHz,就可使初值為整數(shù),從而產(chǎn)生精確的波特率。64658.6串行口應(yīng)用設(shè)計(jì)案例單片機(jī)串行通信接口設(shè)計(jì)時(shí),需考慮如下問(wèn)題。(1)確定串行通信雙方的數(shù)傳速率和通信距離。(2)由串行通信的數(shù)傳速率和通信距離確定采用的串行通信接口標(biāo)準(zhǔn)。(3)注意串行通信的通信線(xiàn)選擇,一般選用雙絞線(xiàn)較好,并根據(jù)傳輸?shù)木嚯x選擇纖芯的直徑。如空間干擾較多,還要選擇帶有屏蔽層的雙絞線(xiàn)。下面首先介紹有關(guān)串行通信各種接口標(biāo)準(zhǔn)。65668.6.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介

AT89S51串口輸入、輸出均為T(mén)TL電平。這種以TTL電平來(lái)串行傳輸數(shù)據(jù),抗干擾性差,傳輸距離短,傳輸速率低。為提高串行通信可靠性,增大串行通信距離和提高傳輸速率,在實(shí)際設(shè)計(jì)中都采用標(biāo)準(zhǔn)串行接口,如RS-232、RS-422A、RS-485等。根據(jù)雙機(jī)通信距離和抗干擾性要求,可選擇TTL電平傳輸,或選擇RS-232C、RS-422A、RS-485串行接口進(jìn)行串行數(shù)據(jù)傳輸。

1.TTL電平通信接口如兩個(gè)AT89S51相距在1.5m之內(nèi),串行口可直接相連,接口電路如圖8-9。甲機(jī)RXD與乙機(jī)TXD端相連,乙機(jī)RXD與甲機(jī)TXD端相連,從而直接用TTL電平傳輸方法來(lái)實(shí)現(xiàn)雙機(jī)通信。66672.RS-232C雙機(jī)通信接口如雙機(jī)通信距離在1.5~15m時(shí),可用RS-232C標(biāo)準(zhǔn)接口實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的雙機(jī)通信,接口電路見(jiàn)圖8-22。

圖8-22芯片MAX232A是美國(guó)MAXIM公司生產(chǎn)的RS-232C全雙工發(fā)送器/接收器電路芯片。67圖8-22RS-232C雙機(jī)通信接口電路68RS-232C標(biāo)準(zhǔn)規(guī)定電纜長(zhǎng)度限定在≤15米,最高數(shù)傳速率為20kbit/s。足以覆蓋個(gè)人計(jì)算機(jī)使用的50~9600bit/s范圍。傳送的數(shù)字量采用負(fù)邏輯,且與地對(duì)稱(chēng)。其中:邏輯“1”

:-3~-15V;邏輯“0”

:+3~+15V。由于單片機(jī)的引腳為T(mén)TL電平,與RS-232C標(biāo)準(zhǔn)的電平互不兼容,所以單片機(jī)使用RS-232C標(biāo)準(zhǔn)串行通信時(shí),必須進(jìn)行TTL電平與RS-232C標(biāo)準(zhǔn)電平之間的轉(zhuǎn)換。RS-232C電平與TTL電平的之間轉(zhuǎn)換,常采用美國(guó)MAXIM公司的MAX232A,它是全雙工發(fā)送器/接收器接口電路芯片,可實(shí)現(xiàn)TTL電平到RS-232C電平、RS-232C電平到TTL電平的轉(zhuǎn)換。MAX232A的引腳見(jiàn)圖8-23,內(nèi)部結(jié)構(gòu)及外部元件如圖8-24所示。由于芯片內(nèi)部有自升壓69圖8-23MAX232A的引腳

的電平倍增電路,將+5V轉(zhuǎn)換成-

10V~+10V,滿(mǎn)足RS-232C標(biāo)準(zhǔn)對(duì)邏輯“1”和邏輯“0”的電平要求。工作時(shí)僅需單一的+5V電源。其片內(nèi)有2個(gè)發(fā)送器,2個(gè)接收器,有TTL信號(hào)輸入/RS-232C輸出的功能,也有RS-232C輸入/TTL輸出的功能。70圖8-24MAX232的內(nèi)部結(jié)構(gòu)及外部元件713.RS-422A雙機(jī)通信接口

RS-232C雖應(yīng)用廣泛,但推出較早,有明顯缺點(diǎn):傳輸速率低、通信距離短、接口處信號(hào)易產(chǎn)生串?dāng)_等。于是國(guó)際上又推出了RS-422A標(biāo)準(zhǔn)。

RS-422A與RS-232C主要區(qū)別是,收發(fā)雙方信號(hào)地不再共地,RS-422A采用了平衡驅(qū)動(dòng)和差分接收的方法。每個(gè)方向用于數(shù)據(jù)傳輸?shù)氖莾蓷l平衡導(dǎo)線(xiàn),這相當(dāng)于兩個(gè)單端驅(qū)動(dòng)器。輸入同一個(gè)信號(hào)時(shí),其中一個(gè)驅(qū)動(dòng)器輸出永遠(yuǎn)是另一個(gè)驅(qū)動(dòng)器反相信號(hào)。于是兩條線(xiàn)上傳輸?shù)男盘?hào)電平,當(dāng)一個(gè)表示邏輯“1”時(shí),另一條一定為邏輯“0”。

7172若傳輸過(guò)程中,信號(hào)中混入了干擾和噪聲(以共模形式出現(xiàn)),由于差分接收器的作用,就能識(shí)別有用信號(hào)并正確接收傳輸信息,使干擾和噪聲相互抵消。因此,RS-422A能在長(zhǎng)距離、高速率下傳輸數(shù)據(jù)。最大傳輸率為10Mbit/s,此速率下,電纜允許長(zhǎng)度為12m,如采用較低速率,最大傳輸距離可達(dá)1219m。為增加通信距離,可在通信線(xiàn)路上采用光電隔離,利用RS-422A標(biāo)準(zhǔn)進(jìn)行雙機(jī)通信的接口電路見(jiàn)圖8-25。7273圖8-25RS-422A雙機(jī)通信接口電路74

圖8-25中,每通道接收端都接有3個(gè)電阻R1、R2和R3,其中R1為傳輸線(xiàn)的匹配電阻,取值范圍在50~1k,其他兩個(gè)電阻是為了解決第1個(gè)數(shù)據(jù)誤碼而設(shè)置的匹配電阻。為起到隔離、抗干擾作用,圖8-20中必須使用兩組獨(dú)立的電源。

圖8-25所示的SN75174、SN75175是TTL電平到RS-422A電平與RS-422A電平到TTL電平的電平轉(zhuǎn)換芯片。4.RS-485雙機(jī)通信接口RS-422A雙機(jī)通信需四芯傳輸線(xiàn),長(zhǎng)距離通信不經(jīng)濟(jì)。在工業(yè)現(xiàn)場(chǎng),常采用雙絞線(xiàn)傳輸?shù)腞S-485串行通信接口,很易實(shí)現(xiàn)多機(jī)通信。RS-485是RS-422A變型,與RS-422A區(qū)別是:RS-422A為全雙工,采用兩對(duì)平衡差分信號(hào)線(xiàn);7475而RS-485為半雙工,采用一對(duì)平衡差分信號(hào)線(xiàn)。RS-485與多站互連是十分方便的,很易實(shí)現(xiàn)1對(duì)N的多機(jī)通信。

RS-485標(biāo)準(zhǔn)允許最多并聯(lián)32臺(tái)驅(qū)動(dòng)器和32臺(tái)接收器。圖8-21為RS-485雙機(jī)通信接口。RS-485與RS-422A一樣,最大傳輸距離約1219m,最大傳輸速率為10Mbit/s。通信線(xiàn)路要采用平衡雙絞線(xiàn)。平衡雙絞線(xiàn)長(zhǎng)度與傳輸速率成反比,在100kbit/s速率以下,才可能使用規(guī)定的最長(zhǎng)電纜。只有在很短距離下才能獲得最大傳輸速率。一般100m長(zhǎng)雙絞線(xiàn)最大傳輸速率僅為1Mbit/s。圖8-26中,RS-485以雙向、半雙工方式實(shí)現(xiàn)雙機(jī)通信。在A(yíng)T89S51系統(tǒng)發(fā)送或接收數(shù)據(jù)前,應(yīng)先將SN75176的發(fā)送門(mén)或接收門(mén)打開(kāi),當(dāng)P1.0=1時(shí),7576發(fā)送門(mén)打開(kāi),接收門(mén)關(guān)閉;當(dāng)P1.0=0時(shí),接收門(mén)打開(kāi),發(fā)送門(mén)關(guān)閉。

圖8-26的SN75176片內(nèi)集成一個(gè)差分驅(qū)動(dòng)器和一個(gè)差分接收器,且兼有TTL電平到RS-485電平、RS-485電平到TTL電平的轉(zhuǎn)換功能。此外常用的RS-485接口芯片還有MAX485。76圖8-26RS-485雙機(jī)通信接口電路77

8.6.2方式1的應(yīng)用設(shè)計(jì)

【例8-4】圖8-27為單片機(jī)甲、乙雙機(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。7778

78圖8-27

單片機(jī)方式1雙機(jī)通信的連接79參考程序如下://甲機(jī)串行發(fā)送#include<reg51.h>#defineucharunsignedchar #defineuintunsignedint

voidmain(){ uchartemp=0;

TMOD=0x20; //設(shè)置定時(shí)器T1為方式2

TH1=0xfd; //波特率9600

TL1=0xfd;

SCON=0x40; //串口初始化方式1發(fā)送,不接收

PCON=0x00; //SMOD=0TR1=1; //啟動(dòng)T1P1=0xff; //設(shè)置P1口為輸入

while(1){ while(TI==0); //如果TI=0,未發(fā)送完,循環(huán)等待 TI=0; //已發(fā)送完,把TI清0 temp=P1; //讀入P1口開(kāi)關(guān)的狀態(tài)

SBUF=temp;} //數(shù)據(jù)送串行口發(fā)送 } 7980//乙機(jī)串行接收#include<reg51.h>#defineucharunsignedchar #defineuintunsignedint

voidmain(){

uchartemp=0;

TMOD=0x20; //設(shè)置定時(shí)器T1為方式2TH1=0xfd; //波特率9600TL1=0xfd;

SCON=0x50; //設(shè)置串口為方式1接收,REN=1PCON=0x00; //SMOD=0

TR1=1; //啟動(dòng)T1

while(1)

{

while(RI==0); //若RI為0,未接收到數(shù)據(jù)

RI=0;

//接收到數(shù)據(jù),則把RI清0

temp=SBUF;

//讀取數(shù)據(jù)存入temp中

P1=temp;

//接收的數(shù)據(jù)送P1口控制8個(gè)LED的亮滅 }}

8081【例8-5】如圖8-28,甲乙兩機(jī)以方式1進(jìn)行串行通信,雙方晶振頻率均為11.059

2MHz,波特率為2400bit/s。甲機(jī)TXD腳、RXD腳分別與乙機(jī)RXD、TXD腳相連。

為觀(guān)察串行口傳輸?shù)臄?shù)據(jù),電路中添加了兩個(gè)虛擬終端來(lái)分別顯示串口發(fā)出的數(shù)據(jù)。添加虛擬終端,只需單擊圖4-2左側(cè)工具箱中的虛擬儀器圖標(biāo),在預(yù)覽窗口中顯示的各種虛擬儀器選項(xiàng),點(diǎn)擊“VIRTUALTERMINAL”項(xiàng),并放置在原理圖編輯窗口,然后把虛擬終端的“RXD”端與單片機(jī)的“TXD”端相連即可。當(dāng)串行通信開(kāi)始時(shí),甲機(jī)首先發(fā)送數(shù)據(jù)AAH,乙機(jī)收到后應(yīng)答B(yǎng)BH,表示同意接收。甲機(jī)收到BBH后,即可發(fā)送數(shù)據(jù)。如果乙機(jī)發(fā)現(xiàn)數(shù)據(jù)出錯(cuò),就向甲機(jī)發(fā)送FFH,甲機(jī)收到FFH后,重新發(fā)送數(shù)據(jù)給乙機(jī)。8182

82圖8-28

方式1雙機(jī)通信的連接83串行通信時(shí),如觀(guān)察單片機(jī)仿真運(yùn)行時(shí)串行口發(fā)送出的數(shù)據(jù),只需用鼠標(biāo)右鍵點(diǎn)擊虛擬終端,會(huì)出現(xiàn)選擇菜單,點(diǎn)擊最下方“VirtualTerminal”項(xiàng),會(huì)彈出窗口,窗口顯示了單片機(jī)串口“TXD”端發(fā)出的一個(gè)個(gè)數(shù)據(jù)字節(jié),如圖8-29所示。設(shè)發(fā)送字節(jié)塊長(zhǎng)度為10字節(jié),數(shù)據(jù)緩沖區(qū)為buf,數(shù)據(jù)發(fā)送完畢要立即發(fā)送校驗(yàn)和,進(jìn)行數(shù)據(jù)發(fā)送準(zhǔn)確性驗(yàn)證。乙機(jī)接收到的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)緩沖區(qū)buf,收到一個(gè)數(shù)據(jù)塊后,再接收甲機(jī)發(fā)來(lái)的校驗(yàn)和,并將其與乙機(jī)求得的校驗(yàn)和比較:若相等,說(shuō)明接收正確,乙機(jī)回答00H;若不等,說(shuō)明接收不正確,乙機(jī)回答FFH;請(qǐng)求甲機(jī)重新發(fā)送。8384選擇定時(shí)器T1為方式2定時(shí),波特率不倍增,即SMOD=0。查表8-2,可得寫(xiě)入T1的初值應(yīng)為F4H。以下為雙機(jī)通信程序,該程序可在甲乙兩機(jī)中運(yùn)行,不同的是在程序運(yùn)行之前,要人為設(shè)置TR。若選擇TR=0,表示該機(jī)為發(fā)送方;若TR=1,表示該機(jī)是接收方。程序根據(jù)TR設(shè)置,利用發(fā)送函數(shù)send()和接收函數(shù)receive()分別實(shí)現(xiàn)發(fā)送和接收功能。8485圖8-29

通過(guò)串口觀(guān)察兩個(gè)單片機(jī)串行口發(fā)出的數(shù)據(jù)86參考程序如下://甲機(jī)串口通信程序#include<reg51.h>#defineucharunsignedchar #defineTR //接收、發(fā)送的區(qū)別值,TR=0,為發(fā)送

ucharbuf[10]

={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a};//發(fā)送的10個(gè)數(shù)據(jù)ucharsum;

voidmain(void)

//甲機(jī)主程序{

init();

//調(diào)用甲機(jī)串口初始化

if(TR==0) //TR=0,為發(fā)送

{send();} //調(diào)用發(fā)送函數(shù)

if(TR==1) //TR=1,為接收

{receive();} //調(diào)用接收函數(shù)}8687voiddelay(unsignedinti) //延時(shí)函數(shù)

{

unsignedcharj;

for(;i>0;i--)

for(j=0;j<125;j++)

;

}

voidinit(void)

//甲機(jī)串口初始化函數(shù)

{

TMOD=0x20; //T1方式2定時(shí)

TH1=0xf4; //波特率2400

TL1=0xf4;

PCON=0x00; //SMOD=0

SCON=0x50; //串行口方式1,REN=1允許接收

TR1=1; //啟動(dòng)T1

}8788voidsend(void) //甲機(jī)發(fā)送函數(shù){

uchari

do{

delay(1000);

SBUF=0xaa; //發(fā)送聯(lián)絡(luò)信號(hào)

while(TI==0); //等待數(shù)據(jù)發(fā)送完畢

TI=0; //發(fā)送完畢,清TI

while(RI==0); //等待乙機(jī)應(yīng)答

RI=0; //乙機(jī)應(yīng)答完畢,甲機(jī)RI清0}while(SBUF!=0xbb); //乙機(jī)未準(zhǔn)備好,繼續(xù)聯(lián)絡(luò)

8889do{

sum=0;

//校驗(yàn)和變量清0for(i=0;i<10;i++){

delay(1000);

SBUF=buf[i];

//向乙機(jī)發(fā)數(shù)據(jù)

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

while(TI==0);

TI=0;

//甲機(jī)發(fā)送數(shù)據(jù)完畢,清TI}delay(1000);

SBUF=sum; //發(fā)送校驗(yàn)和while(TI==0);TI=0;while(RI==0);RI=0;}while(SBUF!=0x00); //出錯(cuò),重新發(fā)送while(1);}8990

voidreceive(void)

//甲機(jī)接收函數(shù)

{

uchari;

RI=0;

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

while(SBUF!=0xaa); //判乙機(jī)是否發(fā)出請(qǐng)求

SBUF=0xBB; //發(fā)送應(yīng)答信號(hào)BBH

while(TI==0); //等待發(fā)送結(jié)束

TI=0;

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

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

{

while(RI==0); RI=0; //接收數(shù)據(jù)

buf[i]=SBUF; //接收一個(gè)數(shù)據(jù)

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

}

9091

while(RI==0);

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

if(SBUF==sum) //比較校驗(yàn)和

{

SBUF=0x00; //校驗(yàn)和相等,則發(fā)00H

}

else

{

SBUF=0xFF; //出錯(cuò)發(fā)FFH,重新接收

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

}

}

9192#include<reg51.h>

//乙機(jī)串行通信程序#defineucharunsignedchar #defineTR1 //接收、發(fā)送的區(qū)別值,TR=1,為接收ucharidatabuf[10]={0x01,0x02,0x03,0x04,0x05, 0x06,0x07,0x08,0x09,0x0a}; ucharsum;

//校驗(yàn)和

voiddelay(unsignedinti){

unsignedcharj;

for(;i>0;i--) for(j=0;j<125;j++) ;}9293

voidinit(void)//乙機(jī)串口初始化函數(shù){ TMOD=0x20; //T1方式2定時(shí) TH1=0xf4; //波特率2400 TL1=0xf4; PCON=0x00; //SMOD=0 SCON=0x50; //串行口方式1,REN=1允許接收 TR1=1; //啟動(dòng)T1}

voidmain(void)

//乙機(jī)主程序{

init();

if(TR==0) //TR=0,為發(fā)送

{send();} //調(diào)用發(fā)送函數(shù)else

{receive();} //調(diào)用接收函數(shù)}9394

voidsend(void)

//乙機(jī)發(fā)送函數(shù){ uchari;

do{

SBUF=0xAA; //發(fā)送聯(lián)絡(luò)信號(hào) while(TI==0); //等待數(shù)據(jù)發(fā)送完畢 TI=0; while(RI==0);

//等待乙機(jī)應(yīng)答 RI=0; }while(SBUF!=0xbb); //乙機(jī)未準(zhǔn)備好,繼續(xù)聯(lián)絡(luò)(按位取異或)9495do{ sum=0;

//校驗(yàn)和變量清0

for(i=0;i<10;i++) { SBUF=buf[i];

sum+=buf[i]; //求校驗(yàn)和 while(TI==0); TI=0; } SBUF=sum; while(TI==0);TI=0; while(RI==0);RI=0;}while(SBUF!=0); //出錯(cuò),重新發(fā)送}9596voidreceive(void)

//乙機(jī)接收函數(shù){

uchari;

RI=0;while(RI==0);RI=0;while(SBUF!=0xaa) { SBUF=0xff; while(TI!=1); TI=0; delay(1000); } //判甲機(jī)是否發(fā)出請(qǐng)求SBUF=0xBB; //發(fā)送應(yīng)答信號(hào)0xBBwhile(TI==0);

//等待發(fā)送結(jié)束TI=0; sum=0;9697

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

{

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

buf[i]=SBUF; //接收一個(gè)數(shù)據(jù)

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

}

while(RI==0);

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

if(SBUF==sum) //比較校驗(yàn)和

{

SBUF=0x00; //校驗(yàn)和相等,則發(fā)00H

}

else

{

SBUF=0xFF; //出錯(cuò)發(fā)FFH,重新接收

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

}

}

9798

8.6.3方式2和方式3的應(yīng)用設(shè)計(jì)舉例方式2與方式1相比兩點(diǎn)不同之處:(1)方式2接收/發(fā)送11位信息,第0位為起始位,第1~8位為數(shù)據(jù)位,第9位是程控位,由用戶(hù)設(shè)置的TB8位決定,第10位是停止位1,這是方式2與方式1的一個(gè)不同點(diǎn)。(2)方式2的波特率變化范圍比方式1小,方式2的波特率=振蕩器頻率/n。當(dāng)SMOD=0時(shí),n=64。當(dāng)SMOD=1時(shí),n=32。而方式2和方式3相比,除了波特率的差別外,其它都相同,所以下面介紹的方式3應(yīng)用編程,也適用于方式2。9899

【例8-6】如圖8-30,甲、乙兩單片機(jī)進(jìn)行

方式3(或方式2)串行通信。甲機(jī)把控制8個(gè)流水燈點(diǎn)亮的數(shù)據(jù)發(fā)送給乙機(jī)并點(diǎn)亮其P1口的8個(gè)LED。方式3比方式1多了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ù);否則拒絕接收。本例使用了一個(gè)虛擬終端來(lái)觀(guān)察甲機(jī)串口發(fā)出的數(shù)據(jù)。99100

100圖8-30

甲乙兩個(gè)單片機(jī)進(jìn)行方式3(或方式2)串行通信101參考程序如下。//甲機(jī)發(fā)送程序#include<reg51.h>sbitP=PSW^0;

//P位為PSW寄存器的第0位,即奇偶校驗(yàn)位unsignedcharTab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,

0xbf,0x7f};

//控制流水燈顯示數(shù)據(jù)數(shù)組,為全局變量voidmain(void) //主函數(shù){

unsignedchari;

TMOD=0x20; //設(shè)置定時(shí)器T1為方式2

SCON=0xc0; //設(shè)置串口為方式3

PCON=0x00; //SMOD=0

101102

TH1=0xfd; //給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ù)

}

}

}

voidSend(unsignedchardat) //發(fā)送1字節(jié)數(shù)據(jù)的函數(shù)

{

TB8=P; //將偶校驗(yàn)位作為第9位數(shù)據(jù)發(fā)送

SBUF=dat;

while(TI==0); //檢測(cè)TI,TI=0,未發(fā)送完

; //空操作

TI=0; //1字節(jié)發(fā)送完,TI清0

}

102103

voiddelay(void)

//延時(shí)約200ms的函數(shù){

unsignedcharm,n;

for(m=0;m<250;m++)

for(n=0;n<250;n++);}

//乙機(jī)接收程序

#include<reg51.h>sbitP=PSW^0; //P位為PSW寄存器的第0位,即奇偶校驗(yàn)位

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; //接通定時(shí)器T1

REN=1; //允許接收

103104

while(1)

{

P1=Receive(); //將接收到的數(shù)據(jù)送P1口顯示

}

}

unsignedcharReceive(void) //接收1字節(jié)數(shù)據(jù)的函數(shù)

{

unsignedchardat;

while(RI==0); //檢測(cè)RI,RI=0,未接收完,則循環(huán)等待

;

RI=0; //已接收一幀數(shù)據(jù),將RI清0

ACC=SBUF; //將接收緩沖器的數(shù)據(jù)存于A(yíng)CC

if(RB8==P) //只有偶校驗(yàn)成功才能往下執(zhí)行,接收數(shù)據(jù)

{

dat=ACC; //將接收緩沖器的數(shù)據(jù)存于dat

returndat; //將接收的數(shù)據(jù)返回

}

}

104105

8.6.4多機(jī)通信的應(yīng)用設(shè)計(jì)下面通過(guò)一個(gè)具體案例,介紹如何來(lái)實(shí)現(xiàn)單片機(jī)的多機(jī)通信。

【例8-7】實(shí)現(xiàn)主單片機(jī)分別與3個(gè)從單片機(jī)串行通信,原理電路見(jiàn)圖8-31。用戶(hù)通過(guò)分別按下開(kāi)關(guān)k1、k2或k3來(lái)選擇主機(jī)與對(duì)應(yīng)1#、2#或3#從機(jī)串行通信,當(dāng)黃色LED點(diǎn)亮,表示主機(jī)與相應(yīng)的從機(jī)連接成功;該從機(jī)的8個(gè)綠色LED閃亮,表示主機(jī)與從機(jī)在進(jìn)行串行數(shù)據(jù)通信。如果斷開(kāi)k1、k2或k3,則主機(jī)與相應(yīng)從機(jī)的串行通信中斷。105106

106圖8-31

主機(jī)與3從機(jī)的多機(jī)通信的原理電路與仿真107本例實(shí)現(xiàn)主、從機(jī)串行通信,各從機(jī)程序都相同,只是地址不同。串行通信約定如下。(1)3臺(tái)從機(jī)的地址為01H~03H。(2)主機(jī)發(fā)出的0xff為控制命令,使所有從機(jī)都處于SM2=1的狀態(tài)。(3)其余的控制命令:00H—接收命令,01H—發(fā)送命令。這兩條命令是以數(shù)據(jù)幀形式發(fā)送的。(4)從機(jī)的狀態(tài)字如圖8-32所示。107圖8-32

從機(jī)狀態(tài)字格式約定108其中:

ERR(D7位)=1,表示收到非法命令。

TRDY(D1位)=1,表示發(fā)送準(zhǔn)備完畢。

RRDY(D0位)=1,表示接收準(zhǔn)備完畢。串行通信時(shí),主機(jī)采用查詢(xún)方式,從機(jī)采用中斷方式。主機(jī)串口設(shè)為方式3,允許接收,并置TB8為1。因只有1個(gè)主機(jī),所以主機(jī)SCON控制寄存器中的SM2不要置1,故控制字為11011000,即0xd8。108109參考程序如下:

//主機(jī)程序

#include<reg51.h>

#include<math.h>

sbitswitch1=P0^0; //定義k1與P0.0連接

sbitswitch2=P0^1; //定義k2與P0.1連接

sbitswitch3=P0^2;

//定義k3與P0.2連接

voidmain()

//主函數(shù){ EA=1; //總中斷允許 TMOD=0x20;

//設(shè)置T1定時(shí)方式2自動(dòng)裝載初值 TL1=0xfd; //波特率設(shè)為9600 TH1=0xfd; PCON=0x00;

//SMOD=0,不倍增 SCON=0xd0;

//SM2設(shè)為0,TB8設(shè)為0 TR1=1;

//啟動(dòng)定時(shí)器T1 ES=1; //允許串口中斷

SBUF=0xff;

//串口發(fā)送0xff

109110

while(TI==0); //判是否發(fā)送完畢

TI=0; //發(fā)送完畢,TI清0

while(1)

{

delay_ms(100);

if(switch1==0) //判是否k1按下,k1按下往下執(zhí)行

{

TB8=1; //第9位數(shù)據(jù)為1,送TB8,準(zhǔn)備發(fā)地址幀

SBUF=0x01; //串口發(fā)1#從機(jī)的地址0x01以及TB8=1

while(TI==0);

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論