




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1
第8章
串行口的工作原理及應(yīng)用
12
導(dǎo)讀:
本章首先介紹有關(guān)串行通信的基礎(chǔ),然后對AT89S51單片機(jī)串行通信口(串行口)的基本結(jié)構(gòu)與工作原理、相關(guān)的特殊功能寄存器,以及串行口的4種工作方式進(jìn)行介紹。此外還介紹如何利用串行口實(shí)現(xiàn)多機(jī)串行通信,與PC機(jī)的串行通信,以及串行通信的各種應(yīng)用編程。最后,從實(shí)用角度對目前單片機(jī)串行通信廣泛應(yīng)用的各種常見的串行通信標(biāo)準(zhǔn)接口RS-232、RS-422及RS-485給予簡要介紹。38.1串行通信基礎(chǔ)隨著單片機(jī)的廣泛應(yīng)用與計算機(jī)網(wǎng)絡(luò)技術(shù)的普及,單片機(jī)與個人計算機(jī)或單片機(jī)與單片機(jī)之間的通信使用較多。8.1.1并行通信與串行通信單片機(jī)的數(shù)據(jù)通信有并行通信與串行通信兩種方式。1.并行通信單片機(jī)的并行通信通常使用多條數(shù)據(jù)線將數(shù)據(jù)字節(jié)的各個位同時傳送,每一位數(shù)據(jù)都需要一條傳輸線,此外還需要一條或幾條控制信號線。并行通信的示意圖見圖8-1。4圖8-1
并行通信示意圖5并行通信相對傳輸速度快。但由于傳輸線較多,長距離傳送時成本高,因此這種方式適合于短距離的數(shù)據(jù)傳輸。2.串行通信單片機(jī)串行通信是將數(shù)據(jù)字節(jié)分成一位一位的形式在一條傳輸線上逐個傳送。一次只能傳送一位,對于一個字節(jié)的數(shù)據(jù),至少要分8位才能傳送完畢。如圖8-2所示。串行通信在發(fā)送時,要把并行數(shù)據(jù)變成串行數(shù)據(jù)發(fā)送到線路上去,接收時要把串行數(shù)據(jù)再變成并行數(shù)據(jù)。
串行通信傳輸線少,長距離傳送時成本低,且可以利用電話網(wǎng)等現(xiàn)成設(shè)備,因此在單片機(jī)應(yīng)用系統(tǒng)中,串行通信的使用非常普遍。6圖8-2
串行通信的示意圖78.1.2同步通信與異步通信串行通信又有兩種方式:異步通信與同步通信。同步串行通信是采用一個同步時鐘,通過一條同步時鐘線,加到收發(fā)雙方,使收、發(fā)雙方達(dá)到完全同步,此時,傳輸數(shù)據(jù)的位之間的距離均為“位間隔”的整數(shù)倍,同時傳送的字符間不留間隙,既保持位同步關(guān)系。同步通信及數(shù)據(jù)格式見圖8-3。異步串行通信是指收、發(fā)雙方使用各自的時鐘控制數(shù)據(jù)的發(fā)送和接收,這樣可省去連接收、發(fā)雙方的一條同步時鐘信號線,使得異步串行通信連接更加簡單且容易實(shí)現(xiàn)。為使收發(fā)雙方協(xié)調(diào),要求收、發(fā)雙方的時鐘盡可能一致。8圖8-3
同步通信及數(shù)據(jù)格式9
圖8-4給出了異步串行通信的示意圖以及數(shù)據(jù)幀格式。異步串行通信是以數(shù)據(jù)幀為單位進(jìn)行數(shù)據(jù)傳輸,各數(shù)據(jù)幀之間的間隔是任意的,但每個數(shù)據(jù)幀中的各位是以固定的時間傳送的。異步串行通信不要求收、發(fā)雙方時鐘嚴(yán)格一致,實(shí)現(xiàn)容易,成本低,但是每個數(shù)據(jù)幀要附加起始位、停止位有時還要再加上校驗(yàn)位。同步串行通信相比異步串行通信,同步串行通信數(shù)據(jù)傳輸?shù)男瘦^高,但是額外增加了一條同步時鐘線。10圖8-4
異步串行通信118.1.3串行通信的傳輸模式串行通信按照按照數(shù)據(jù)傳輸?shù)姆较蚣皶r間關(guān)系可分為單工、半雙工和全雙工。1.單工數(shù)據(jù)傳輸僅能按一個固定方向傳輸,不能反向傳輸,如圖8-5(a)所示。2.半雙工數(shù)據(jù)傳輸可以雙向傳輸,但不能同時進(jìn)行,不能同時傳輸,如圖8-5(b)所示。3.全雙工數(shù)據(jù)傳輸可同時進(jìn)行雙向傳輸,如圖8-5(c)所示。12圖8-5
單工、半雙工和全雙工的數(shù)據(jù)傳輸模式138.1.4串行通信的錯誤校驗(yàn)在串行通信中,往往要對數(shù)據(jù)傳送的正確與否進(jìn)行校驗(yàn)。校驗(yàn)時保證傳輸數(shù)據(jù)準(zhǔn)確無誤的關(guān)鍵。常用的有奇偶校驗(yàn)與循環(huán)冗余碼校驗(yàn)等方法。1.奇偶校驗(yàn)串行發(fā)送數(shù)據(jù)時,數(shù)據(jù)位尾隨1位奇偶校驗(yàn)位(1或0)。當(dāng)約定為奇校驗(yàn)時,數(shù)據(jù)中“1”的個數(shù)與校驗(yàn)位“1”的個數(shù)之和應(yīng)為奇數(shù);當(dāng)約定為偶校驗(yàn)時,數(shù)據(jù)中“1”的個數(shù)與校驗(yàn)位“1”的個數(shù)之和應(yīng)為偶數(shù)。數(shù)據(jù)發(fā)送方與接收方應(yīng)一致。在接收數(shù)據(jù)幀時,對“1”的個數(shù)進(jìn)行校驗(yàn),若發(fā)現(xiàn)不一致,則說明數(shù)據(jù)傳輸過程中出現(xiàn)了差錯,則通知發(fā)送端重發(fā)。142.代碼和校驗(yàn)代碼和校驗(yàn)是發(fā)送方將所發(fā)數(shù)據(jù)塊求和或各字節(jié)異或,產(chǎn)生一個字節(jié)的校驗(yàn)字符(校驗(yàn)和)附加到數(shù)據(jù)塊末尾。接收方接收數(shù)據(jù)時同時對數(shù)據(jù)塊(除校驗(yàn)字節(jié))求和或各字節(jié)異或,將所得結(jié)果與發(fā)送方的“校驗(yàn)和”進(jìn)行比較,如果相符,則無差錯,否則即認(rèn)為在傳輸過程中出現(xiàn)了差錯。3.循環(huán)冗余碼校驗(yàn)循環(huán)冗余碼校驗(yàn)糾錯能力強(qiáng),容易實(shí)現(xiàn)。該校驗(yàn)是通過某種數(shù)學(xué)運(yùn)算實(shí)現(xiàn)有效信息與校驗(yàn)位之間的循環(huán)校驗(yàn),常用于對磁盤信息的傳輸、存儲區(qū)的完整性校驗(yàn)等。是目前應(yīng)用最廣的檢錯碼編碼方式之一,廣泛用于同步通信中。158.2串行口的結(jié)構(gòu)結(jié)構(gòu)見圖8-6。有兩個物理上獨(dú)立的接收、發(fā)送緩沖器SBUF(屬于特殊功能寄存器),可同時發(fā)送、接收數(shù)據(jù)。發(fā)送緩沖器只能寫入不能讀出接收緩沖器只能讀出不能寫入
兩個緩沖器共用一個特殊功能寄存器字節(jié)地址(99H)。控制寄存器共有兩個:特殊功能寄存器SCON和PCON。16
16
圖8-6
串行口的內(nèi)部結(jié)構(gòu)178.2.1串行口控制寄存器SCON串行口控制寄存器SCON,字節(jié)地址98H,可位尋址,位地址為98H~9FH,即SCON的所有位都可用軟件來進(jìn)行位操作清“0”或置“1”。SCON格式見圖8-7。17圖8-7
串口控制寄存器SCON格式18
寄存器SCON各位功能:(1)SM0、SM1—串口4種工作方式選擇SM0、SM12位編碼對應(yīng)4種工作方式見表8-1。
18
表8-1串口4種工作方式表8-119(2)SM2—多機(jī)通信控制位
多機(jī)通信是在方式2和方式3下進(jìn)行,因此SM2位主要用于方式2或方式3。
當(dāng)串口以方式2或方式3接收時,如SM2=1,則只有當(dāng)接收到的第9位數(shù)據(jù)(RB8)為“1”時,才使RI置“1”,產(chǎn)生中斷請求,并將收到的前8位數(shù)據(jù)送入SBUF;當(dāng)收到的第9位數(shù)據(jù)(RB8)為“0”時,則將收到的前8位數(shù)據(jù)丟棄。
當(dāng)SM2=0時,則不論第9位數(shù)據(jù)是“1”還是“0”,都將接收的前8位數(shù)據(jù)送入SBUF中,并使RI置“1”,產(chǎn)生中斷請求。
方式1時,如果SM2=1,則只有收到有效的停止位時才會激活RI。
方式0時,SM2必須為0。1920(3)REN—允許串行接收位,由軟件置“1”或清“0”。
REN=1,允許串行口接收數(shù)據(jù)。
REN=0,禁止串行口接收數(shù)據(jù)。
(4)TB8—發(fā)送的第9位數(shù)據(jù)在方式2和方式3時,TB8是要發(fā)送的第9位數(shù)據(jù),其值由軟件置“1”或清“0”。
在雙機(jī)串行通信時,TB8一般作為奇偶校驗(yàn)位使用;也可在多機(jī)串行通信中表示主機(jī)發(fā)送的是地址幀還是數(shù)據(jù)幀,TB8=1為地址幀,TB8=0為數(shù)據(jù)幀。2021(5)RB8—接收的第9位數(shù)據(jù)在方式2和方式3時,RB8存放接收到的第9位數(shù)據(jù)。在方式1,如果SM2=0,RB8是接收到的停止位。在方式0,不使用RB8。(6)TI—發(fā)送中斷標(biāo)志位方式0時,串行發(fā)送的第8位數(shù)據(jù)結(jié)束時,TI由硬件置“1”,在其他工作方式中,串行口發(fā)送停止位的開始時,置TI為“1”。TI=1,表示1幀數(shù)據(jù)發(fā)送結(jié)束。TI位狀態(tài)可供軟件查詢,也可申請中斷。CPU響應(yīng)中斷后,在中斷服務(wù)程序向SBUF寫入要發(fā)送的下一幀數(shù)據(jù)。注意:TI必須由軟件清“0”。(7)RI—接收中斷標(biāo)志位
2122串口在方式0時,接收完第8位數(shù)據(jù)時,RI由硬件置“1”。在其他工作方式中,串行接收到停止位時,該位置“1”。RI=1,表示一幀數(shù)據(jù)接收完畢,并申請中斷,要求CPU從接收SBUF取走數(shù)據(jù)。該位狀態(tài)也可供軟件查詢。
注意:RI必須由軟件清“0”。
8.2.2電源控制寄存器PCON
字節(jié)地址為87H,不能位尋址。格式見圖8-8。僅最高位SMOD與串口有關(guān),低4位功能在第2章中已介紹。SMOD位:波特率選擇位。
2223
圖8-8
特殊功能寄存器PCON的格式24例如,方式1的波特率計算公式為
當(dāng)SMOD=1時,比SMOD=0時波特率加倍,所以也稱SMOD位為波特率倍增位。24258.3串行口的4種工作方式
4種工作方式由特殊功能寄存器SCON中SM0、SM1位定義,編碼見表8-1。8.3.1方式0方式0為同步移位寄存器輸入/輸出方式。該方式并不用于兩個AT89S51單片機(jī)間的異步串行通信,而是用于外接移位寄存器,用來擴(kuò)展并行I/O口。方式0以8位數(shù)據(jù)為1幀,沒有起始位和停止位,先發(fā)送或接收最低位。波特率是固定的,為fosc/12。幀格式見圖8-9。25圖8-9
方式0幀格式261.方式0輸出(1)方式0輸出的工作原理當(dāng)單片機(jī)執(zhí)行將數(shù)據(jù)寫入發(fā)送緩沖器SBUF指令時,產(chǎn)生一個正脈沖,串口把8位數(shù)據(jù)以fosc/12固定波特率從RXD腳串行輸出,低位在先,TXD腳輸出同步移位脈沖,當(dāng)8位數(shù)據(jù)發(fā)送完,中斷標(biāo)志位TI置“1”。
方式0的發(fā)送時序見圖8-10。2627圖8-10
方式0發(fā)送時序28(2)方式0輸出的應(yīng)用案例
典型應(yīng)用是串口外接串行輸入/并行輸出的同步移位寄存器74LS164,實(shí)現(xiàn)并行端口的擴(kuò)展。
圖8-11為串口方式0,通過74LS164輸出控制8個外接LED發(fā)光二極管亮滅的接口電路。當(dāng)串口設(shè)置在方式0輸出時,串行數(shù)據(jù)由RXD端(P3.0)送出,移位脈沖由TXD端(P3.1)送出。在移位脈沖的作用下,串行口發(fā)送緩沖器的數(shù)據(jù)逐位地從RXD端串行地移入74LS164中。
2829
29圖8-11
方式0輸出外接8個LED發(fā)光二極管接口電路30
【例8-1】如圖8-11,控制8個發(fā)光二極管流水點(diǎn)亮。圖中74LS164的8腳(CLK端)為同步脈沖輸入端,9腳為控制端,9腳電平由單片機(jī)的P1.0控制,當(dāng)9腳為0時,允許串行數(shù)據(jù)由RXD端(P3.0)向74LS164的串行數(shù)據(jù)輸入端A和B(1腳和2腳)輸入,但是74LS164的8位并行輸出端關(guān)閉;當(dāng)9腳為1時,A和B輸入端關(guān)閉,但是允許74LS164中的8位數(shù)據(jù)并行輸出。當(dāng)串行口將8位串行數(shù)據(jù)發(fā)送完畢后,申請中斷,在中斷服務(wù)程序中,單片機(jī)向通過串行口輸出下一個8位數(shù)據(jù)。
采用中斷方式的參考程序:
#include<reg51.h>
#include<stdio.h>
sbitP1_0=0x90;
unsignedcharnSendByte;3031
voiddelay(unsignedinti)
//延時子程序{
unsignedcharj;
for(;i>0;i--)
//變量i由實(shí)際參數(shù)傳入一個值,因此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寫入點(diǎn)亮數(shù)據(jù),啟動串行發(fā)送
P1_0=0; //允許串口向74LS164串行發(fā)送數(shù)據(jù)
while(1){;}}3132
voidSerial_Port()interrupt4using0//串行口中斷服務(wù)程序{
if(TI)
//如果TI=1,1個字節(jié)串行發(fā)送完畢{ P1_0=1;
//P1_0=1,允許74LS164并行輸出,流水點(diǎn)亮二極管
SBUF=nSendByte;//向SBUF寫入數(shù)據(jù),啟動串行發(fā)送 delay(500);
//延時,點(diǎn)亮二極管持續(xù)一段時間 P1_0=0;
//P1_0=0,允許向74LS164串行寫入
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程序說明:(1)程序中定義了全局變量nSendByte,以便在中斷服務(wù)程序中能訪問該變量。nSendByte用于存放從串行口發(fā)出的點(diǎn)亮數(shù)據(jù),在程序中使用左移1位操作符“<<”對nSendByte變量進(jìn)行移位,使得從串口發(fā)出的數(shù)據(jù)為0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80,從而流水點(diǎn)亮各個發(fā)光二極管。(2)程序中if語句的作用是當(dāng)nSendByte左移1位由0x80變?yōu)?x00后,需對變量nSendByte重新賦值為1。(3)主程序中SBUF=nSendByte語句必不可少,如果沒有該語句,主程序并不從串行口發(fā)送數(shù)據(jù),也就不會產(chǎn)生隨后的發(fā)送完成中斷。(4)兩條語句“while(1){;}”實(shí)現(xiàn)反復(fù)循環(huán)的功能。33342.方式0輸入
(1)工作原理:方式0輸入時,REN為串行口允許接收控制位,REN=0,禁止接收;REN=1,允許接收。
當(dāng)CPU向串行口SCON寄存器寫入控制字(設(shè)置為方式0,并使REN位置“1”,同時RI=0)時,產(chǎn)生一正脈沖,串口開始接收數(shù)據(jù)。引腳RXD為數(shù)據(jù)輸入端,TXD為移位脈沖信號輸出端,接收器以fosc/12固定波特率
采樣RXD引腳
數(shù)據(jù)信息,當(dāng)接收器接收完8位數(shù)據(jù)時,中斷標(biāo)志RI置“1”,表示一幀接收完畢,可進(jìn)行下一幀接收,時序見圖8-12。3435圖8-12
方式0接收時序36(2)方式0輸入應(yīng)用舉例【例8-2】圖8-13為串口外接一片8位并行輸入、串行輸出同步移位寄存器74LS165,擴(kuò)展一個8位并行輸入口的電路,可將接在74LS165的8個開關(guān)S0~S7的狀態(tài)通過串行口的方式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連接的開關(guān)K合上時,可進(jìn)行開關(guān)S0~S7狀態(tài)數(shù)字量的并行讀入。由圖8-13,采用中斷方式來對S0~S7狀態(tài)讀取,并由單片機(jī)P2口驅(qū)動二極管點(diǎn)亮(開關(guān)S0~S7中的任何一個按下,則對應(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) //延時子程序{ unsignedcharj; for(;i>0;i--) //變量i由實(shí)際參數(shù)傳入一個值,因此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表示開關(guān)K按下,可以讀開關(guān)S0~S7的狀態(tài) {
P1_1=0; //P1_1=0并行讀入開關(guān)的狀態(tài)
delay(1);
P1_1=1; //P1_1=1將開關(guān)的狀態(tài)串行讀入到串口中
RI=0; //接收中斷標(biāo)志RI清0
nRxByte=SBUF;//接收的開關(guān)狀態(tài)數(shù)據(jù)從SBUF讀入到nRxByte單元中
P2=nRxByte;/開關(guān)狀態(tài)數(shù)據(jù)送到P2口,驅(qū)動發(fā)光二極管發(fā)光 }} 程序說明:當(dāng)P1.0為0,即開關(guān)K按下,表示允許并行讀入開關(guān)S0~S7的狀態(tài)數(shù)字量,通過P1.1把SH/LD*置0,則并行讀入開關(guān)S0~S7的狀態(tài)。再讓P1.1=1,即SH/LD*置1,74LS165將剛才讀入的S0~S7狀態(tài)通過QH端(RXD腳)串行發(fā)送到單片機(jī)的SBUF中,在中斷服務(wù)程序中把SBUF中的數(shù)據(jù)讀到nRxByte單元,并送到P2口驅(qū)動8個發(fā)光二極管。39408.3.2方式1
方式1為雙機(jī)串行通信方式,如圖8-14。
當(dāng)SM0、SM1=01時,串行口設(shè)為方式1雙機(jī)串行通信。TXD腳和RXD腳分別用于發(fā)送和接收數(shù)據(jù)。方式1收發(fā)一幀數(shù)據(jù)為10位,1個起始位(0),8個數(shù)據(jù)位,1個停止位(1),先發(fā)送或接收最低位。方式1幀格式見圖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í)行寫數(shù)據(jù)到發(fā)送緩沖器SBUF的命令后,就啟動發(fā)送。方式1發(fā)送時序如圖8-16。
圖8-16發(fā)送時鐘TX時鐘頻率就是發(fā)送波特率。發(fā)送開始時,內(nèi)部邏輯將起始位向TXD腳(P3.1)輸出,此后每經(jīng)1個TX時鐘周期,便產(chǎn)生1個移位脈沖,并由TXD腳輸出1個數(shù)據(jù)位。8位全發(fā)送完后,中斷標(biāo)志位TI置“1”。4243圖8-16方式1發(fā)送時序442.方式1接收串行口以方式1(SM0、SM1=01)接收時(REN=1),數(shù)據(jù)從RXD(P3.0)腳輸入。當(dāng)檢測到起始位負(fù)跳變時,則開始接收。方式1接收時序如圖8-17。
44圖8-17
方式1接收時序45
接收時,定時控制信號有兩種:
(1)接收移位時鐘(RX時鐘),頻率和傳送的波特率相同,
(2)位檢測器采樣脈沖,它的頻率是RX時鐘的16倍。也就是在1位數(shù)據(jù)期間,有16個采樣脈沖,以波特率的16倍速率采樣RXD引腳狀態(tài)。
當(dāng)采樣到RXD端從1到0的負(fù)跳變(有可能是起始位)時,就啟動接收檢測器。接收的值是3次連續(xù)采樣(第7、8、9個脈沖時采樣),取其中兩次相同的值,以確認(rèn)是否是真正起始位(負(fù)跳變)開始,這樣能較好消除干擾引起的影響,以保證可靠無誤地開始接收數(shù)據(jù)。46當(dāng)確認(rèn)起始位有效時,開始接收一幀信息。接收每一位數(shù)據(jù)時,也都進(jìn)行3次連續(xù)采樣(第7、8、9個脈沖時采樣),接收的值是3次采樣中至少兩次相同的值,以保證接收到的數(shù)據(jù)位的準(zhǔn)確性。當(dāng)一幀數(shù)據(jù)接收完畢后,必須同時滿足以下兩個條件,這次接收才真正有效。(1)RI=0,即上一幀數(shù)據(jù)接收完成時,RI=1發(fā)出的中斷請求已被響應(yīng),SBUF中的數(shù)據(jù)已被取走,說明“接收SBUF”已空。(2)SM2=0或收到的停止位=1(方式1時,停止位已進(jìn)入RB8),則將接收到的數(shù)據(jù)裝入SBUF和RB8(裝入的是停止位),且中斷標(biāo)志RI置“1”。
若不能同時滿足這兩個條件,收到的數(shù)據(jù)不能裝入SBUF,這意味著該幀數(shù)據(jù)將丟失。4647
8.3.3方式2串口工作于方式2和方式3時,為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ù)寫入SBUF,即可啟動發(fā)送過程。串行口能自動把TB8取出,并裝入到第9位數(shù)據(jù)位的位置,再逐一發(fā)送出去。發(fā)送完畢,則使TI位置“1”。方式2和方式3發(fā)送時序如圖8-19。48圖8-19
方式2和方式3發(fā)送時序492.方式2接收當(dāng)SCON寄存器SM0、SM1=10,且REN=1時,允許串行口以方式2接收數(shù)據(jù)。接收時,數(shù)據(jù)由RXD端輸入,接收11位信息。當(dāng)位檢測邏輯采樣到RXD引腳從1到0的負(fù)跳變,并判斷起始位有效后,便開始接收一幀信息。在接收完第9位數(shù)據(jù)后,需滿足以下兩個條件,才將接收到的數(shù)據(jù)送入接收緩沖器SBUF。(1)RI=0,意味著接收緩沖器為空。(2)SM2=0或接收到的第9位數(shù)據(jù)位RB8=1。
當(dāng)滿足上述兩個條件時,接收到的數(shù)據(jù)送入SBUF(接收緩沖器),第9位數(shù)據(jù)送入RB8,且RI置“1”。若不滿足這兩個條件,接收的信息將被丟棄。
4950串行口方式2和方式3接收時序如圖8-20。圖8-20
方式2和方式3接收時序518.3.4方式3當(dāng)SM0、SM1兩位為11時,串行口被定義工作在方式3。方式3為波特率可變的9位異步通信方式,除了波特率外,方式3和方式2相同。方式3發(fā)送和接收時序見圖8-16和圖8-17。方式3波特率見下式:
51528.4多機(jī)通信多個AT89S51單片機(jī)可利用串行口進(jìn)行多機(jī)通信,經(jīng)常采用圖8-21主從式結(jié)構(gòu)。
1個主機(jī)(AT89S51單片機(jī)或其他具有串口的微機(jī))和3個(也可為多個)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)中,只有一個主機(jī),其余的全是從機(jī)。主機(jī)發(fā)送的信息可以被所有從機(jī)接收,任何一個從機(jī)發(fā)送的信息,只能由主機(jī)接收。從機(jī)和從機(jī)之間不能相互直接通信,它們的通信只能經(jīng)主機(jī)才能實(shí)現(xiàn)。
1.多機(jī)通信工作原理要保證主機(jī)與所選擇的從機(jī)實(shí)現(xiàn)可靠通信,必須保證串行口具有識別功能。串行口控制寄存器SCON中的SM2位就是為滿足這一條件而設(shè)置的多機(jī)通信控制位。其工作原理是在串行口以方式2(或方式3)接收時,若SM2=1,則表示進(jìn)行多機(jī)通信,可能出現(xiàn)兩種情況。5354
(1)從機(jī)收到主機(jī)發(fā)來的第9位數(shù)據(jù)RB8=1時,前8位數(shù)據(jù)才裝入SBUF,并置中斷標(biāo)志RI=1,向CPU發(fā)出中斷請求。在中斷服務(wù)程序中,從機(jī)把接收到的SBUF中數(shù)據(jù)存入數(shù)據(jù)緩沖區(qū)中。
(2)如從機(jī)接收到的第9位數(shù)據(jù)RB8=0時,則不產(chǎn)生中斷標(biāo)志RI=1,不引起中斷,從機(jī)不接收主機(jī)發(fā)來的數(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ī)通信的工作過程如下。
5455
2.多機(jī)通信的工作過程
(1)各從機(jī)初始化程序允許從機(jī)的串行口中斷,將串行口編程為方式2或方式3接收,即9位異步通信方式,且SM2和REN位置“1”,使從機(jī)只處于多機(jī)通信且接收地址幀的狀態(tài)。(2)主機(jī)和某個從機(jī)通信前,先將準(zhǔn)備接收數(shù)據(jù)的從機(jī)地址發(fā)給各從機(jī),接著才傳送數(shù)據(jù)(或命令),主機(jī)發(fā)出的地址幀信息的第9位為1,數(shù)據(jù)(或命令)幀的第9位為0。當(dāng)主機(jī)向各從機(jī)發(fā)送地址幀時,各從機(jī)串口接收到的第9位信息RB8為1,且由于各從機(jī)SM2=1,則中斷標(biāo)志位RI置“1”,各從機(jī)響應(yīng)中斷,在中斷服務(wù)程序中,判斷主機(jī)送來的地址是否和本機(jī)地址相符,若為本機(jī)地址,則該從機(jī)SM2位清“0”,準(zhǔn)備接收主機(jī)的數(shù)據(jù)或命令;若地址不相符,則保持SM2=1狀態(tài)。5556(3)接著主機(jī)發(fā)送數(shù)據(jù)(或命令)幀,數(shù)據(jù)幀的第9位為0。此時各從機(jī)接收到的RB8=0,只有與前面地址相符的從機(jī)(即SM2位已清“0”的從機(jī))才能激活中斷標(biāo)志位RI,從而進(jìn)入中斷服務(wù)程序,在中斷服務(wù)程序中接收主機(jī)發(fā)來的數(shù)據(jù)(或命令);
與主機(jī)發(fā)來地址不符的從機(jī),由于SM2保持為1,又RB8=0,因此不能激活中斷標(biāo)志RI,也就不能接收主機(jī)發(fā)來的數(shù)據(jù)幀。從而保證主機(jī)與從機(jī)間通信的正確性。此時主機(jī)與建立聯(lián)系的從機(jī)已設(shè)置為單機(jī)通信模式,即在整個通信中,通信的雙方都要保持發(fā)送數(shù)據(jù)的第9位(即TB8位)為0,防止其他的從機(jī)誤接收數(shù)據(jù)。
5657(4)結(jié)束數(shù)據(jù)通信并為下一次多機(jī)通信做準(zhǔn)備。在多機(jī)通信系統(tǒng)中每個從機(jī)都被賦予唯一一個地址。
例如,圖8-21中3個從機(jī)的地址可設(shè)為:01H、02H、03H。還要預(yù)留1~2個“廣播地址”,它是所有從機(jī)共有的地址,例如將“廣播地址”設(shè)為00H。當(dāng)主機(jī)與從機(jī)的數(shù)據(jù)通信結(jié)束后,一定要將從機(jī)再設(shè)置為多機(jī)通信模式,以便進(jìn)行下一次的多機(jī)通信。這時要求與主機(jī)正在進(jìn)行數(shù)據(jù)傳輸?shù)膹臋C(jī)必須隨時注意,一旦接收數(shù)據(jù)第9位(RB8)為“1”,說明主機(jī)傳送的不再是數(shù)據(jù),而是地址,這個地址就有可能是“廣播地址”,當(dāng)收到“廣播地址”后,便將從機(jī)的通信模式再設(shè)置成多機(jī)模式,為下一次多機(jī)通信做好準(zhǔn)備。57588.5波特率的制定方法在串行通信中,收、發(fā)雙方發(fā)送或接收的波特率必須一致。通過軟件對串口可設(shè)定4種工作方式。其中方式0和方式2的波特率是固定的;方式1和方式3的波特率是可變的,由定時器T1的溢出率(T1每秒溢出的次數(shù))來確定。8.5.1波特率的定義
定義:串行口每秒鐘發(fā)送(或接收)的位數(shù)稱為波特率。設(shè)發(fā)送一位所需要的時間為T,則波特率為1/T。對于定時器的不同工作方式,得到的波特率的范圍是不一樣的,這是由于定時器/計數(shù)器T1在不同工作方式下計數(shù)位數(shù)不同所決定。58598.5.2定時器T1產(chǎn)生波特率的計算波特率和串口工作方式有關(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è)定波特率時,用
定時器方式2(自動裝初值)確定波特率較理想,它不需用軟件重裝初值,可避免因軟件重裝初值帶來的定時誤差,且算出的波特率比較準(zhǔn)確。即TL1作為8位計數(shù)器,TH1存放備用初值。60(8-1)61設(shè)定時器T1方式2的初值為X,則有
將式(8-2)代入式(8-1),則有
由式(8-3),這種方式波特率隨fosc、SMOD和初值X而變化。在實(shí)際使用時,常根據(jù)已知波特率和時鐘頻率fosc來計算T1的初值X。為避免繁雜初值計算,常用波特率和初值X間關(guān)系常列成表8-2形式,供查用。61(8-2)(8-3)6263表8-2有兩點(diǎn)需要注意:(1)在時鐘振蕩頻率fosc為12MHz或6MHz時,將初值X和fosc帶入式(8-3),不能整除,因此算出的波特率有一定誤差。要消除誤差可通過調(diào)整fosc實(shí)現(xiàn),例如采用的時鐘頻率為11.0592MHz。因此,為減小波特率誤差,應(yīng)該使用的時鐘頻率必須為11.0592MHz。(2)如果串行通信選用很低波特率(如波特率選為55),可將定時器T1設(shè)置為方式1定時。但在這種情況下,T1溢出時,需在中斷服務(wù)程序中重新裝入初值。中斷響應(yīng)時間和執(zhí)行指令時間會使波特率產(chǎn)生一定的誤差,可用改變初值的方法加以調(diào)整。6364
【例8-3】若AT89S51的時鐘為11.0592MHz,選用T1的方式2定時作為波特率發(fā)生器,波特率為2
400bit/s,求初值。設(shè)T1為方式2定時,選SMOD=0。將已知條件帶入式(8-3)
從中解
X=244=F4H。只要把F4H裝入TH1和TL1,則T1發(fā)出的波特率為2400bit/s。在實(shí)際編程中,該結(jié)果也可直接從表8-2中查到。這里時鐘振蕩頻率選為11.0592MHz,就可使初值為整數(shù),從而產(chǎn)生精確的波特率。64658.6串行口應(yīng)用設(shè)計案例單片機(jī)串行通信接口設(shè)計時,需考慮如下問題。(1)確定串行通信雙方的數(shù)傳速率和通信距離。(2)由串行通信的數(shù)傳速率和通信距離確定采用的串行通信接口標(biāo)準(zhǔn)。(3)注意串行通信的通信線選擇,一般選用雙絞線較好,并根據(jù)傳輸?shù)木嚯x選擇纖芯的直徑。如空間干擾較多,還要選擇帶有屏蔽層的雙絞線。下面首先介紹有關(guān)串行通信各種接口標(biāo)準(zhǔn)。65668.6.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡介
AT89S51串口輸入、輸出均為TTL電平。這種以TTL電平來串行傳輸數(shù)據(jù),抗干擾性差,傳輸距離短,傳輸速率低。為提高串行通信可靠性,增大串行通信距離和提高傳輸速率,在實(shí)際設(shè)計中都采用標(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電平通信接口如兩個AT89S51相距在1.5m之內(nèi),串行口可直接相連,接口電路如圖8-9。甲機(jī)RXD與乙機(jī)TXD端相連,乙機(jī)RXD與甲機(jī)TXD端相連,從而直接用TTL電平傳輸方法來實(shí)現(xiàn)雙機(jī)通信。66672.RS-232C雙機(jī)通信接口如雙機(jī)通信距離在1.5~15m時,可用RS-232C標(biāo)準(zhǔn)接口實(shí)現(xiàn)點(diǎn)對點(diǎn)的雙機(jī)通信,接口電路見圖8-22。
圖8-22芯片MAX232A是美國MAXIM公司生產(chǎn)的RS-232C全雙工發(fā)送器/接收器電路芯片。67圖8-22RS-232C雙機(jī)通信接口電路68RS-232C標(biāo)準(zhǔn)規(guī)定電纜長度限定在≤15米,最高數(shù)傳速率為20kbit/s。足以覆蓋個人計算機(jī)使用的50~9600bit/s范圍。傳送的數(shù)字量采用負(fù)邏輯,且與地對稱。其中:邏輯“1”
:-3~-15V;邏輯“0”
:+3~+15V。由于單片機(jī)的引腳為TTL電平,與RS-232C標(biāo)準(zhǔn)的電平互不兼容,所以單片機(jī)使用RS-232C標(biāo)準(zhǔn)串行通信時,必須進(jìn)行TTL電平與RS-232C標(biāo)準(zhǔn)電平之間的轉(zhuǎn)換。RS-232C電平與TTL電平的之間轉(zhuǎn)換,常采用美國MAXIM公司的MAX232A,它是全雙工發(fā)送器/接收器接口電路芯片,可實(shí)現(xiàn)TTL電平到RS-232C電平、RS-232C電平到TTL電平的轉(zhuǎn)換。MAX232A的引腳見圖8-23,內(nèi)部結(jié)構(gòu)及外部元件如圖8-24所示。由于芯片內(nèi)部有自升壓69圖8-23MAX232A的引腳
的電平倍增電路,將+5V轉(zhuǎn)換成-
10V~+10V,滿足RS-232C標(biāo)準(zhǔn)對邏輯“1”和邏輯“0”的電平要求。工作時僅需單一的+5V電源。其片內(nèi)有2個發(fā)送器,2個接收器,有TTL信號輸入/RS-232C輸出的功能,也有RS-232C輸入/TTL輸出的功能。70圖8-24MAX232的內(nèi)部結(jié)構(gòu)及外部元件713.RS-422A雙機(jī)通信接口
RS-232C雖應(yīng)用廣泛,但推出較早,有明顯缺點(diǎn):傳輸速率低、通信距離短、接口處信號易產(chǎn)生串?dāng)_等。于是國際上又推出了RS-422A標(biāo)準(zhǔn)。
RS-422A與RS-232C主要區(qū)別是,收發(fā)雙方信號地不再共地,RS-422A采用了平衡驅(qū)動和差分接收的方法。每個方向用于數(shù)據(jù)傳輸?shù)氖莾蓷l平衡導(dǎo)線,這相當(dāng)于兩個單端驅(qū)動器。輸入同一個信號時,其中一個驅(qū)動器輸出永遠(yuǎn)是另一個驅(qū)動器反相信號。于是兩條線上傳輸?shù)男盘栯娖剑?dāng)一個表示邏輯“1”時,另一條一定為邏輯“0”。
7172若傳輸過程中,信號中混入了干擾和噪聲(以共模形式出現(xiàn)),由于差分接收器的作用,就能識別有用信號并正確接收傳輸信息,使干擾和噪聲相互抵消。因此,RS-422A能在長距離、高速率下傳輸數(shù)據(jù)。最大傳輸率為10Mbit/s,此速率下,電纜允許長度為12m,如采用較低速率,最大傳輸距離可達(dá)1219m。為增加通信距離,可在通信線路上采用光電隔離,利用RS-422A標(biāo)準(zhǔn)進(jìn)行雙機(jī)通信的接口電路見圖8-25。7273圖8-25RS-422A雙機(jī)通信接口電路74
圖8-25中,每通道接收端都接有3個電阻R1、R2和R3,其中R1為傳輸線的匹配電阻,取值范圍在50~1k,其他兩個電阻是為了解決第1個數(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ī)通信需四芯傳輸線,長距離通信不經(jīng)濟(jì)。在工業(yè)現(xiàn)場,常采用雙絞線傳輸?shù)腞S-485串行通信接口,很易實(shí)現(xiàn)多機(jī)通信。RS-485是RS-422A變型,與RS-422A區(qū)別是:RS-422A為全雙工,采用兩對平衡差分信號線;7475而RS-485為半雙工,采用一對平衡差分信號線。RS-485與多站互連是十分方便的,很易實(shí)現(xiàn)1對N的多機(jī)通信。
RS-485標(biāo)準(zhǔn)允許最多并聯(lián)32臺驅(qū)動器和32臺接收器。圖8-21為RS-485雙機(jī)通信接口。RS-485與RS-422A一樣,最大傳輸距離約1219m,最大傳輸速率為10Mbit/s。通信線路要采用平衡雙絞線。平衡雙絞線長度與傳輸速率成反比,在100kbit/s速率以下,才可能使用規(guī)定的最長電纜。只有在很短距離下才能獲得最大傳輸速率。一般100m長雙絞線最大傳輸速率僅為1Mbit/s。圖8-26中,RS-485以雙向、半雙工方式實(shí)現(xiàn)雙機(jī)通信。在AT89S51系統(tǒng)發(fā)送或接收數(shù)據(jù)前,應(yīng)先將SN75176的發(fā)送門或接收門打開,當(dāng)P1.0=1時,7576發(fā)送門打開,接收門關(guān)閉;當(dāng)P1.0=0時,接收門打開,發(fā)送門關(guān)閉。
圖8-26的SN75176片內(nèi)集成一個差分驅(qū)動器和一個差分接收器,且兼有TTL電平到RS-485電平、RS-485電平到TTL電平的轉(zhuǎn)換功能。此外常用的RS-485接口芯片還有MAX485。76圖8-26RS-485雙機(jī)通信接口電路77
8.6.2方式1的應(yīng)用設(shè)計
【例8-4】圖8-27為單片機(jī)甲、乙雙機(jī)串行通信,雙機(jī)RXD和TXD相互交叉相連,甲機(jī)P1口接8個開關(guān),乙機(jī)P1口接8個發(fā)光二極管。
甲機(jī)設(shè)置為只能發(fā)送不能接收的單工方式。要求甲機(jī)讀入P1口的8個開關(guān)的狀態(tài)后,通過串行口發(fā)送到乙機(jī),乙機(jī)將接收到的甲機(jī)的8個開關(guān)的狀態(tài)數(shù)據(jù)送入P1口,由P1口的8個發(fā)光二極管來顯示8個開關(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è)置定時器T1為方式2
TH1=0xfd; //波特率9600
TL1=0xfd;
SCON=0x40; //串口初始化方式1發(fā)送,不接收
PCON=0x00; //SMOD=0TR1=1; //啟動T1P1=0xff; //設(shè)置P1口為輸入
while(1){ while(TI==0); //如果TI=0,未發(fā)送完,循環(huán)等待 TI=0; //已發(fā)送完,把TI清0 temp=P1; //讀入P1口開關(guān)的狀態(tài)
SBUF=temp;} //數(shù)據(jù)送串行口發(fā)送 } 7980//乙機(jī)串行接收#include<reg51.h>#defineucharunsignedchar #defineuintunsignedint
voidmain(){
uchartemp=0;
TMOD=0x20; //設(shè)置定時器T1為方式2TH1=0xfd; //波特率9600TL1=0xfd;
SCON=0x50; //設(shè)置串口為方式1接收,REN=1PCON=0x00; //SMOD=0
TR1=1; //啟動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個LED的亮滅 }}
8081【例8-5】如圖8-28,甲乙兩機(jī)以方式1進(jìn)行串行通信,雙方晶振頻率均為11.059
2MHz,波特率為2400bit/s。甲機(jī)TXD腳、RXD腳分別與乙機(jī)RXD、TXD腳相連。
為觀察串行口傳輸?shù)臄?shù)據(jù),電路中添加了兩個虛擬終端來分別顯示串口發(fā)出的數(shù)據(jù)。添加虛擬終端,只需單擊圖4-2左側(cè)工具箱中的虛擬儀器圖標(biāo),在預(yù)覽窗口中顯示的各種虛擬儀器選項(xiàng),點(diǎn)擊“VIRTUALTERMINAL”項(xiàng),并放置在原理圖編輯窗口,然后把虛擬終端的“RXD”端與單片機(jī)的“TXD”端相連即可。當(dāng)串行通信開始時,甲機(jī)首先發(fā)送數(shù)據(jù)AAH,乙機(jī)收到后應(yīng)答B(yǎng)BH,表示同意接收。甲機(jī)收到BBH后,即可發(fā)送數(shù)據(jù)。如果乙機(jī)發(fā)現(xiàn)數(shù)據(jù)出錯,就向甲機(jī)發(fā)送FFH,甲機(jī)收到FFH后,重新發(fā)送數(shù)據(jù)給乙機(jī)。8182
82圖8-28
方式1雙機(jī)通信的連接83串行通信時,如觀察單片機(jī)仿真運(yùn)行時串行口發(fā)送出的數(shù)據(jù),只需用鼠標(biāo)右鍵點(diǎn)擊虛擬終端,會出現(xiàn)選擇菜單,點(diǎn)擊最下方“VirtualTerminal”項(xiàng),會彈出窗口,窗口顯示了單片機(jī)串口“TXD”端發(fā)出的一個個數(shù)據(jù)字節(jié),如圖8-29所示。設(shè)發(fā)送字節(jié)塊長度為10字節(jié),數(shù)據(jù)緩沖區(qū)為buf,數(shù)據(jù)發(fā)送完畢要立即發(fā)送校驗(yàn)和,進(jìn)行數(shù)據(jù)發(fā)送準(zhǔn)確性驗(yàn)證。乙機(jī)接收到的數(shù)據(jù)存儲到數(shù)據(jù)緩沖區(qū)buf,收到一個數(shù)據(jù)塊后,再接收甲機(jī)發(fā)來的校驗(yàn)和,并將其與乙機(jī)求得的校驗(yàn)和比較:若相等,說明接收正確,乙機(jī)回答00H;若不等,說明接收不正確,乙機(jī)回答FFH;請求甲機(jī)重新發(fā)送。8384選擇定時器T1為方式2定時,波特率不倍增,即SMOD=0。查表8-2,可得寫入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
通過串口觀察兩個單片機(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個數(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ù)
{
unsignedcharj;
for(;i>0;i--)
for(j=0;j<125;j++)
;
}
voidinit(void)
//甲機(jī)串口初始化函數(shù)
{
TMOD=0x20; //T1方式2定時
TH1=0xf4; //波特率2400
TL1=0xf4;
PCON=0x00; //SMOD=0
SCON=0x50; //串行口方式1,REN=1允許接收
TR1=1; //啟動T1
}8788voidsend(void) //甲機(jī)發(fā)送函數(shù){
uchari
do{
delay(1000);
SBUF=0xaa; //發(fā)送聯(lián)絡(luò)信號
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); //出錯,重新發(fā)送while(1);}8990
voidreceive(void)
//甲機(jī)接收函數(shù)
{
uchari;
RI=0;
while(RI==0);RI=0;
while(SBUF!=0xaa); //判乙機(jī)是否發(fā)出請求
SBUF=0xBB; //發(fā)送應(yīng)答信號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; //接收一個數(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; //出錯發(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定時 TH1=0xf4; //波特率2400 TL1=0xf4; PCON=0x00; //SMOD=0 SCON=0x50; //串行口方式1,REN=1允許接收 TR1=1; //啟動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ò)信號 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); //出錯,重新發(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ā)出請求SBUF=0xBB; //發(fā)送應(yīng)答信號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; //接收一個數(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; //出錯發(fā)FFH,重新接收
while(TI==0); TI=0;
}
}
9798
8.6.3方式2和方式3的應(yīng)用設(shè)計舉例方式2與方式1相比兩點(diǎn)不同之處:(1)方式2接收/發(fā)送11位信息,第0位為起始位,第1~8位為數(shù)據(jù)位,第9位是程控位,由用戶設(shè)置的TB8位決定,第10位是停止位1,這是方式2與方式1的一個不同點(diǎn)。(2)方式2的波特率變化范圍比方式1小,方式2的波特率=振蕩器頻率/n。當(dāng)SMOD=0時,n=64。當(dāng)SMOD=1時,n=32。而方式2和方式3相比,除了波特率的差別外,其它都相同,所以下面介紹的方式3應(yīng)用編程,也適用于方式2。9899
【例8-6】如圖8-30,甲、乙兩單片機(jī)進(jìn)行
方式3(或方式2)串行通信。甲機(jī)把控制8個流水燈點(diǎn)亮的數(shù)據(jù)發(fā)送給乙機(jī)并點(diǎn)亮其P1口的8個LED。方式3比方式1多了1個可編程位TB8,該位一般作奇偶校驗(yàn)位。乙機(jī)接收到的8位二進(jìn)制數(shù)據(jù)有可能出錯,需進(jìn)行奇偶校驗(yàn),其方法是將乙機(jī)的RB8和PSW的奇偶校驗(yàn)位P進(jìn)行比較,如果相同,接收數(shù)據(jù);否則拒絕接收。本例使用了一個虛擬終端來觀察甲機(jī)串口發(fā)出的數(shù)據(jù)。99100
100圖8-30
甲乙兩個單片機(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è)置定時器T1為方式2
SCON=0xc0; //設(shè)置串口為方式3
PCON=0x00; //SMOD=0
101102
TH1=0xfd; //給T1賦初值,波特率設(shè)置為9600
TL1=0xfd;
TR1=1; //啟動定時器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); //檢測TI,TI=0,未發(fā)送完
; //空操作
TI=0; //1字節(jié)發(fā)送完,TI清0
}
102103
voiddelay(void)
//延時約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è)置定時器T1為方式2
SCON=0xd0; //設(shè)置串口為方式3,允許接收REN=1
PCON=0x00; //SMOD=0
TH1=0xfd; //給定時器T1賦初值,波特率為9600
TL1=0xfd;
TR1=1; //接通定時器T1
REN=1; //允許接收
103104
while(1)
{
P1=Receive(); //將接收到的數(shù)據(jù)送P1口顯示
}
}
unsignedcharReceive(void) //接收1字節(jié)數(shù)據(jù)的函數(shù)
{
unsignedchardat;
while(RI==0); //檢測RI,RI=0,未接收完,則循環(huán)等待
;
RI=0; //已接收一幀數(shù)據(jù),將RI清0
ACC=SBUF; //將接收緩沖器的數(shù)據(jù)存于ACC
if(RB8==P) //只有偶校驗(yàn)成功才能往下執(zhí)行,接收數(shù)據(jù)
{
dat=ACC; //將接收緩沖器的數(shù)據(jù)存于dat
returndat; //將接收的數(shù)據(jù)返回
}
}
104105
8.6.4多機(jī)通信的應(yīng)用設(shè)計下面通過一個具體案例,介紹如何來實(shí)現(xiàn)單片機(jī)的多機(jī)通信。
【例8-7】實(shí)現(xiàn)主單片機(jī)分別與3個從單片機(jī)串行通信,原理電路見圖8-31。用戶通過分別按下開關(guān)k1、k2或k3來選擇主機(jī)與對應(yīng)1#、2#或3#從機(jī)串行通信,當(dāng)黃色LED點(diǎn)亮,表示主機(jī)與相應(yīng)的從機(jī)連接成功;該從機(jī)的8個綠色LED閃亮,表示主機(jī)與從機(jī)在進(jìn)行串行數(shù)據(jù)通信。如果斷開k1、k2或k3,則主機(jī)與相應(yīng)從機(jī)的串行通信中斷。105106
106圖8-31
主機(jī)與3從機(jī)的多機(jī)通信的原理電路與仿真107本例實(shí)現(xiàn)主、從機(jī)串行通信,各從機(jī)程序都相同,只是地址不同。串行通信約定如下。(1)3臺從機(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)備完畢。串行通信時,主機(jī)采用查詢方式,從機(jī)采用中斷方式。主機(jī)串口設(shè)為方式3,允許接收,并置TB8為1。因只有1個主機(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定時方式2自動裝載初值 TL1=0xfd; //波特率設(shè)為9600 TH1=0xfd; PCON=0x00;
//SMOD=0,不倍增 SCON=0xd0;
//SM2設(shè)為0,TB8設(shè)為0 TR1=1;
//啟動定時器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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年啶蟲咪項(xiàng)目建議書
- 《時間表》(教學(xué)設(shè)計)-2024-2025學(xué)年三年級上冊數(shù)學(xué)北師大版
- Unit 5 TV Shows Lesson 4 let's spell (教學(xué)設(shè)計)-2024-2025學(xué)年人教新起點(diǎn)版英語五年級上冊
- 高中歷史 第二單元 凡爾賽-華盛頓體系下的短暫和平 第8課 非戰(zhàn)公約教學(xué)實(shí)錄 岳麓版選修3
- 8《課余生活真豐富》第2課時 教學(xué)設(shè)計-2024-2025學(xué)年道德與法治一年級上冊統(tǒng)編版
- 交流平臺與初試身手教學(xué)設(shè)計-2024-2025學(xué)年五年級上冊語文統(tǒng)編版
- Module 4 The Natural World(教學(xué)設(shè)計)-2024-2025牛津上海版(試用本)英語一年級上冊
- 《Unit 2 Numbers》(教學(xué)設(shè)計)-2024-2025學(xué)年新交際英語(2024)英語一年級上冊
- T-CIESC 78-2024 工業(yè)用亞磷酸二氫鉀
- T-CCPMA 008-2024 T-CSTM 01620-2024 高溫合金注射成形件
- GB/T 37356-2019色漆和清漆涂層目視評定的光照條件和方法
- 第十章:茅盾30年代小說(三)課件
- GB 15763.2-2005建筑用安全玻璃第2部分:鋼化玻璃
- 四年級美術(shù)藝術(shù)測評學(xué)業(yè)指標(biāo)試題及答案
- 浙江省門診病歷檢查評分標(biāo)準(zhǔn)
- 晏殊浣溪沙(賞析)課件
- 2022年江蘇財會職業(yè)學(xué)院單招職業(yè)技能考試筆試試題及答案解析
- 植物生理教案
- 《前廳服務(wù)與管理》課程標(biāo)準(zhǔn)(中職)
- 異常停機(jī)記錄分析表
- 遙感原理與應(yīng)用:第三章 平臺及傳感器
評論
0/150
提交評論