第10章串行通信的工作原理與應(yīng)用_第1頁
第10章串行通信的工作原理與應(yīng)用_第2頁
第10章串行通信的工作原理與應(yīng)用_第3頁
第10章串行通信的工作原理與應(yīng)用_第4頁
第10章串行通信的工作原理與應(yīng)用_第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第10章串行口的工作原理及應(yīng)用單片機(jī)原理及接口技術(shù)(C51編程)(第2版)目錄CONTENTS10.1串行口工作原理10.2串行口的4種工作方式10.3波特率的制定方法10.4串行口應(yīng)用設(shè)計(jì)案例通信有并行通信和串行通信兩種方式。在多微機(jī)系統(tǒng)以及現(xiàn)代測(cè)控系統(tǒng)中信息的交換多采用串行通信方式。

并行通信:通常是將數(shù)據(jù)字節(jié)的各位用多條數(shù)據(jù)線同時(shí)進(jìn)行傳送。特點(diǎn):控制簡(jiǎn)單、傳輸速度快;由于傳輸線較多,長(zhǎng)距離傳送時(shí)成本高且接收方的各位同時(shí)接收存在困難。

10.1.1通信方式簡(jiǎn)介串行通信:是將數(shù)據(jù)字節(jié)分成一位一位的形式在一條傳輸線上逐個(gè)地傳送。特點(diǎn):傳輸線少,長(zhǎng)距離傳送時(shí)成本低,且可以利用電話網(wǎng)等現(xiàn)成的設(shè)備,但數(shù)據(jù)的傳送控制比并行通信復(fù)雜。

10.1.1通信方式簡(jiǎn)介串行與并行的比喻10.1.1通信方式簡(jiǎn)介1、異步通信

異步通信是指通信的發(fā)送與接收設(shè)備使用各自的時(shí)鐘控制數(shù)據(jù)的發(fā)送和接收過程。6

異步通信是以字符(構(gòu)成的幀)為單位進(jìn)行傳輸,字符與字符之間的間隙(時(shí)間間隔)是任意的,但每個(gè)字符中的各位是以固定的時(shí)間進(jìn)行傳送。10.1.2同步與異步7異步通信的數(shù)據(jù)格式:10.1.2同步與異步2、同步通信

同步通信時(shí)要建立發(fā)送方時(shí)鐘對(duì)接收方時(shí)鐘的直接控制,使雙方達(dá)到完全同步。同時(shí)傳送的字符間不留間隙,既保持位同步關(guān)系,也保持字符同步關(guān)系。810.1.2同步與異步1、單工單工是指數(shù)據(jù)傳輸僅能沿一個(gè)方向,不能實(shí)現(xiàn)反向傳輸。2、半雙工半雙工是指數(shù)據(jù)傳輸可以沿兩個(gè)方向,但需要分時(shí)進(jìn)行。3、全雙工全雙工是指數(shù)據(jù)可以同時(shí)進(jìn)行雙向傳輸。

單工半雙工全雙工10.1.3串行通信的傳輸方向10.1.4串行口結(jié)構(gòu)AT89S51串行口內(nèi)部結(jié)構(gòu)見圖10-1。有兩個(gè)物理上獨(dú)立的接收、發(fā)送緩沖器SBUF(特殊功能寄存器),可同時(shí)收發(fā)數(shù)據(jù)。發(fā)送緩沖器只寫不讀,接收緩沖器只讀不寫,兩個(gè)緩沖器共用一個(gè)特殊功能寄存器字節(jié)地址(99H)。控制寄存器共有2個(gè):特殊功能寄存器SCON和PCON。下面詳細(xì)介紹各位功能。

兩個(gè)物理上獨(dú)立的接收、發(fā)送緩沖器SBUF,可同時(shí)發(fā)送、接收數(shù)據(jù)。兩個(gè)緩沖器共用一個(gè)特殊功能寄存器字節(jié)地址(99H)。控制寄存器兩個(gè):特殊功能寄存器SCON和PCON。11圖10-1串行口的內(nèi)部結(jié)構(gòu)10.1.4串行口結(jié)構(gòu)10.1.4串行口控制寄存器SCON串行口控制寄存器SCON,字節(jié)地址98H,可位尋址,位地址為98H~9FH,即SCON的所有位都可用軟件來進(jìn)行位操作清“0”或置“1”。SCON格式見圖10-2。圖10-2串口控制寄存器SCON格式10.1.4串行口控制寄存器SCON

寄存器SCON各位功能:(1)SM0、SM1—串口4種工作方式選擇SM0、SM12位編碼對(duì)應(yīng)4種工作方式見表10-1。10.1.4串行口控制寄存器SCON(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ù)丟棄。10.1.4串行口控制寄存器SCON當(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。10.1.4串行口控制寄存器SCON(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ù)幀。10.1.4串行口控制寄存器SCON(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ā)送停止位的開始時(shí),置TI為“1”。TI=1,表示1幀數(shù)據(jù)發(fā)送結(jié)束。TI位狀態(tài)可供軟件查詢,也可申請(qǐng)中斷。CPU響應(yīng)中斷后,在中斷服務(wù)程序向SBUF寫入要發(fā)送的下一幀數(shù)據(jù)。注意:TI必須由軟件清“0”。(7)RI—接收中斷標(biāo)志位10.1.4串行口控制寄存器SCON串口在方式0時(shí),接收完第8位數(shù)據(jù)時(shí),RI由硬件置“1”。在其他工作方式中,串行接收到停止位時(shí),該位置“1”。RI=1,表示一幀數(shù)據(jù)接收完畢,并申請(qǐng)中斷,要求CPU從接收SBUF取走數(shù)據(jù)。該位狀態(tài)也可供軟件查詢。注意:RI必須由軟件清“0”。10.1.5特殊功能寄存器PCON字節(jié)地址為87H,不能位尋址。格式見圖10-3。僅最高位SMOD與串口有關(guān)SMOD位:波特率選擇位。圖10-3特殊功能寄存器PCON的格式GF1,GF0:兩個(gè)通用工作標(biāo)志位,用戶可以自由使用。

PD:掉電模式設(shè)定位。

PD=0單片機(jī)處于正常工作狀態(tài)。

PD=1單片機(jī)進(jìn)入掉電(PowerDown)模式,可由外部中斷或硬件復(fù)位模式喚醒,進(jìn)入掉電模式后,外部晶振停振,CPU、定時(shí)器、串行口全部停止工作,只有外部中斷工作。

IDL:空閑模式設(shè)定位。

IDL=0單片機(jī)處于正常工作狀態(tài)。

IDL=1單片機(jī)進(jìn)入空閑(Idle)模式,除CPU不工作外,其余仍繼續(xù)工作,在空閑模式下可由任一個(gè)中斷或硬件復(fù)位喚醒。10.1.5特殊功能寄存器PCON10.1.5特殊功能寄存器PCON例如,方式1的波特率計(jì)算公式為當(dāng)SMOD=1時(shí),比SMOD=0時(shí)波特率加倍,所以也稱SMOD位為波特率倍增位。目錄CONTENTS10.1串行口結(jié)構(gòu)10.2串行口的4種工作方式10.3波特率的制定方法10.4串行口應(yīng)用設(shè)計(jì)案例10.2.1方式0方式0為同步移位寄存器輸入/輸出方式。該方式并不用于兩個(gè)AT89S51單片機(jī)間的異步串行通信,而是用于外接移位寄存器,用來擴(kuò)展并行I/O口。方式0以8位數(shù)據(jù)為1幀,沒有起始位和停止位,先發(fā)送或接收最低位。波特率是固定的,為fosc/12。幀格式見圖10-4。圖10-4方式0幀格式10.2.1方式01.方式0輸出(1)方式0輸出的工作原理當(dāng)單片機(jī)執(zhí)行將數(shù)據(jù)寫入發(fā)送緩沖器SBUF指令時(shí),產(chǎn)生一個(gè)正脈沖,串口把8位數(shù)據(jù)以fosc/12固定波特率從RXD腳串行輸出,低位在先,TXD腳輸出同步移位脈沖,當(dāng)8位數(shù)據(jù)發(fā)送完,中斷標(biāo)志位TI置“1”。

10.2.1方式01.方式0輸出方式0的發(fā)送時(shí)序見圖10-5。圖10-5方式0發(fā)送時(shí)序10.2.1方式01.方式0輸出(2)方式0輸出的應(yīng)用案例典型應(yīng)用是串口外接串行輸入/并行輸出的同步移位寄存器74LS164,實(shí)現(xiàn)并行端口的擴(kuò)展。圖10-6為串口方式0,通過74LS164輸出控制8個(gè)外接LED發(fā)光二極管亮滅的接口電路。當(dāng)串口設(shè)置在方式0輸出時(shí),串行數(shù)據(jù)由RXD端(P3.0)送出,移位脈沖由TXD端(P3.1)送出。在移位脈沖的作用下,串行口發(fā)送緩沖器的數(shù)據(jù)逐位地從RXD端串行地移入74LS164中。10.2.1方式01.方式0輸出圖10-6方式0輸出外接8個(gè)LED發(fā)光二極管接口電路10.2.1方式01.方式0輸出

【例10-1】如圖10-6,控制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ī)向通過串行口輸出下一個(gè)8位數(shù)據(jù)。10.2.1方式074LS164

時(shí)鐘(CP)每次由低變高時(shí),數(shù)據(jù)右移一位,輸入到Q0,Q0是兩個(gè)數(shù)據(jù)輸入端(DSA和DSB)的邏輯與,它將上升時(shí)鐘沿之前保持一個(gè)建立時(shí)間的長(zhǎng)度。10.2.1方式010.2.1方式01.方式0輸出參考程序:#include<reg51.h>#include<stdio.h>sbitP1_0=0x90;unsignedcharnSendByte;voiddelay(unsignedinti){ //延時(shí)子程序unsignedcharj;for(;i>0;i--) //變量i由實(shí)際參數(shù)傳入一個(gè)值, //因此i不能賦初值for(j=0;j<125;j++);}10.2.1方式01.方式0輸出main(){ //主程序

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

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

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

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

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

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

while(1){;}}10.2.1方式01.方式0輸出//串行口中斷服務(wù)程序voidSerial_Port()interrupt4using0{

if(TI){

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

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

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

//延時(shí),點(diǎn)亮二極管持續(xù)一段時(shí)間 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;} 10.2.1方式01.方式0輸出程序說明:程序中定義了全局變量nSendByte,以便在中斷服務(wù)程序中能訪問該變量。nSendByte用于存放從串行口發(fā)出的點(diǎn)亮數(shù)據(jù),在程序中使用左移1位操作符“<<”對(duì)nSendByte變量進(jìn)行移位,使得從串口發(fā)出的數(shù)據(jù)為0x01、0x02、0x04、0x010、0x10、0x20、0x40、0x100,從而流水點(diǎn)亮各個(gè)發(fā)光二極管。01OPTION02OPTION程序中if語句的作用是當(dāng)nSendByte左移1位由0x100變?yōu)?x00后,需對(duì)變量nSendByte重新賦值為1。10.2.1方式01.方式0輸出程序說明:03OPTION04OPTION主程序中SBUF=nSendByte語句必不可少,如果沒有該語句,主程序并不從串行口發(fā)送數(shù)據(jù),也就不會(huì)產(chǎn)生隨后的發(fā)送完成中斷。兩條語句“while(1){;}”實(shí)現(xiàn)反復(fù)循環(huán)的功能。10.2.1方式02.方式0輸入(1)方式0輸入的工作原理:方式0輸入時(shí),REN為串行口允許接收控制位,REN=0,禁止接收;REN=1,允許接收。當(dāng)CPU向串行口SCON寄存器寫入控制字(設(shè)置為方式0,并使REN位置“1”,同時(shí)RI=0)時(shí),產(chǎn)生一正脈沖,串口開始接收數(shù)據(jù)。引腳RXD為數(shù)據(jù)輸入端,TXD為移位脈沖信號(hào)輸出端,接收器以fosc/12固定波特率

采樣RXD引腳

數(shù)據(jù)信息,當(dāng)接收器接收完10位數(shù)據(jù)時(shí),中斷標(biāo)志RI置“1”,表示一幀接收完畢,可進(jìn)行下一幀接收,時(shí)序見圖10-7。10.2.1方式02.方式0輸入圖10-7方式0接收時(shí)序10.2.1方式02.方式0輸入【例10-2】圖10-8為串口外接一片8位并行輸入、串行輸出同步移位寄存器74LS165,擴(kuò)展一個(gè)8位并行輸入口的電路,可將接在74LS165的8個(gè)開關(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合上時(shí),可進(jìn)行開關(guān)S0~S7狀態(tài)數(shù)字量的并行讀入。由圖10-8,采用中斷方式來對(duì)S0~S7狀態(tài)讀取,并由單片機(jī)P2口驅(qū)動(dòng)二極管點(diǎn)亮(開關(guān)S0~S7中的任何一個(gè)按下,則對(duì)應(yīng)的二極管點(diǎn)亮)。10.2.1方式02.方式0輸入圖10-8串口方式0外接并行輸入、串行輸出的同步移位寄存器10.2.1方式02.方式0輸入?yún)⒖汲绦蛉缦拢?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++); }10.2.1方式02.方式0輸入

main(){

SCON=0x10; //串行口初始化為方式0 ES=1; //允許串行口中斷EA=1; //允許全局中斷

for(;;);}10.2.1方式02.方式0輸入//串行口中斷服務(wù)子程序voidSerial_Port()interrupt4using0{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ū)動(dòng)發(fā)光二極管發(fā)光 }} 10.2.1方式02.方式0輸入程序說明:當(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ū)動(dòng)8個(gè)發(fā)光二極管。10.2.2方式1方式1為雙機(jī)串行通信方式,如圖10-9。圖10-9方式1雙機(jī)串行通信的連接電路當(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幀格式見圖10-10。10.2.2方式1圖10-10方式1的幀格式方式1為波特率可變的10位異步通信接口。波特率由下式確定:式中,SMOD為PCON寄存器的最高位的值(0或1)。10.2.2方式11.方式1發(fā)送串口以方式1輸出,數(shù)據(jù)位由TXD端輸出,發(fā)送一幀信息為10位,1位起始位0,8位數(shù)據(jù)位(先低位)和1位停止位1,當(dāng)CPU執(zhí)行寫數(shù)據(jù)到發(fā)送緩沖器SBUF的命令后,就啟動(dòng)發(fā)送。方式1發(fā)送時(shí)序如圖10-11。圖10-11發(fā)送時(shí)鐘TX時(shí)鐘頻率就是發(fā)送波特率。發(fā)送開始時(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”。10.2.2方式11.方式1發(fā)送圖10-11方式1發(fā)送時(shí)序10.2.2方式12.方式1接收?qǐng)D10-12方式1接收時(shí)序串行口以方式1(SM0、SM1=01)接收時(shí)(REN=1),數(shù)據(jù)從RXD(P3.0)腳輸入。當(dāng)檢測(cè)到起始位負(fù)跳變時(shí),則開始接收。方式1接收時(shí)序如圖10-12。10.2.2方式12.方式1接收(1)RI=0,即上一幀數(shù)據(jù)接收完成時(shí),RI=1發(fā)出的中斷請(qǐng)求已被響應(yīng),SBUF中的數(shù)據(jù)已被取走,說明“接收SBUF”已空。(2)SM2=0或收到的停止位=1(方式1時(shí),停止位已進(jìn)入RB10),則將接收到的數(shù)據(jù)裝入SBUF和RB10(裝入的是停止位),且中斷標(biāo)志RI置“1”。若不同時(shí)滿足這兩個(gè)條件,收到的數(shù)據(jù)不能裝入SBUF,這意味著該幀數(shù)據(jù)將丟失。10.2.3方式2串口工作于方式2和方式3時(shí),為9位異步通信接口。每幀數(shù)據(jù)均為11位,1位起始位0,8位數(shù)據(jù)位(先低位),1位可程控為1或0的第9位數(shù)據(jù)及1位停止位。方式2、方式3幀格式如圖10-13。圖10-13方式2、方式3的幀格式方式2的波特率由下式確定:10.2.3方式2發(fā)送前,先由通信協(xié)議由軟件設(shè)置TB8(如奇偶校驗(yàn)位或多機(jī)通信的地址/數(shù)據(jù)的標(biāo)志位),然后將要發(fā)送的數(shù)據(jù)寫入SBUF,即可啟動(dòng)發(fā)送過程。串行口能自動(dòng)把TB8取出,并裝入到第9位數(shù)據(jù)位的位置,再逐一發(fā)送出去。發(fā)送完畢,則使TI位置“1”。方式2和方式3發(fā)送時(shí)序如圖10-14。1.方式2發(fā)送10.2.3方式21.方式2發(fā)送圖10-14方式2和方式3發(fā)送時(shí)序10.2.3方式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ù)跳變,并判斷起始位有效后,便開始接收一幀信息。在接收完第9位數(shù)據(jù)后,需滿足以下兩個(gè)條件,才將接收到的數(shù)據(jù)送入接收緩沖器SBUF。2.方式2接收10.2.3方式2(1)RI=0,意味著接收緩沖器為空。(2)SM2=0或接收到的第9位數(shù)據(jù)位RB81。2.方式2接收當(dāng)滿足上述兩個(gè)條件時(shí),接收到的數(shù)據(jù)送入SBUF(接收緩沖器),第9位數(shù)據(jù)送入RB8,且RI置“1”。若不滿足這兩個(gè)條件,接收的信息將被丟棄。10.2.3方式2串行口方式2和方式3接收時(shí)序如圖10-15。2.方式2接收?qǐng)D10-15方式2和方式3接收時(shí)序10.2.4方式3當(dāng)SM0、SM1兩位為11時(shí),串行口被定義工作在方式3。方式3為波特率可變的9位異步通信方式,除了波特率外,方式3和方式2相同。方式3發(fā)送和接收時(shí)序見圖10-11和圖10-12。方式3波特率由下式確定:

目錄CONTENTS10.1串行口結(jié)構(gòu)10.2串行口的4種工作方式10.3多機(jī)通信10.3波特率的制定方法10.4串行口應(yīng)用設(shè)計(jì)案例10.3.1波特率的定義在串行通信中,收、發(fā)雙方發(fā)送或接收的波特率必須一致。通過軟件對(duì)串口可設(shè)定4種工作方式。其中方式0和方式2的波特率是固定的;方式1和方式3的波特率是可變的,由定時(shí)器T1的溢出率(T1每秒溢出的次數(shù))來確定。波特率的定義:串行口每秒鐘發(fā)送(或接收)的位數(shù)稱為波特率。設(shè)發(fā)送一位所需要的時(shí)間為T,則波特率為1/T。10.3.2定時(shí)器T1產(chǎn)生波特率的計(jì)算波特率固定為fosc的1/12,且不受SMOD位的影響。若fosc=12MHz,波特率為fosc/12,即1Mbit/s。(1)方式010.3.2定時(shí)器T1產(chǎn)生波特率的計(jì)算波特率僅與SMOD位的值有關(guān)。(2)方式2若fosc=12MHz:SMOD=0,波特率=1107.5kbit/s;SMOD=1,波特率=375kbit/s。10.3.2定時(shí)器T1產(chǎn)生波特率的計(jì)算(3)方式1或方式3常用T1作為波特率發(fā)生器,其關(guān)系式為由式(10-1),T1的溢出率和SMOD的值共同決定波特率。(10-1)在實(shí)際設(shè)定波特率時(shí),用

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

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

400bit/s,求初值。設(shè)T1為方式2定時(shí),選SMOD=0。將已知條件帶入式(10-3)(3)方式1或方式310.3.2定時(shí)器T1產(chǎn)生波特率的計(jì)算(3)方式1或方式3從中解

X=244=F4H。只要把F4H裝入TH1和TL1,則T1發(fā)出的波特率為2400bit/s。在實(shí)際編程中,該結(jié)果也可直接從表10-2中查到。這里時(shí)鐘振蕩頻率選為11.0592MHz,就可使初值為整數(shù),從而產(chǎn)生精確的波特率。(1)設(shè)置T1工作方式;(2)計(jì)算T1初值;(3)啟動(dòng)T1;(4)設(shè)置串行口工作方式;(5)設(shè)置串行口中斷。6910.3.3串口初始化目錄CONTENTS10.1串行口結(jié)構(gòu)10.2串行口的4種工作方式10.3波特率的制定方法10.4串行口應(yīng)用設(shè)計(jì)案例10.4串行口應(yīng)用設(shè)計(jì)案例單片機(jī)串行通信接口程序設(shè)計(jì)時(shí),需考慮如下問題。確定串行通信雙方的數(shù)傳速率和通信距離。01OPTION02OPTION由串行通信的數(shù)傳速率和通信距離確定采用的串行通信接口標(biāo)準(zhǔn)。03OPTION注意串行通信的通信線選擇,一般選用雙絞線較好,并根據(jù)傳輸?shù)木嚯x選擇纖芯的直徑。如空間干擾較多,還要選擇帶有屏蔽層的雙絞線。10.4.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介AT89S51串口輸入、輸出均為TTL電平。這種以TTL電平來串行傳輸數(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ù)傳輸。10.4.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介

1.TTL電平通信接口如兩個(gè)AT89S51相距在1.5m之內(nèi),串行口可直接相連,接口電路如圖10-9。甲機(jī)RXD與乙機(jī)TXD端相連,乙機(jī)RXD與甲機(jī)TXD端相連,從而直接用TTL電平傳輸方法來實(shí)現(xiàn)雙機(jī)通信。10.4.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介10.4.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介2.RS-232C雙機(jī)通信接口如雙機(jī)通信距離在1.5~15m時(shí),可用RS-232C標(biāo)準(zhǔn)接口實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的雙機(jī)通信,接口電路見圖10-16。圖10-16RS-232C雙機(jī)通信接口電路10.4.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介2.RS-232C雙機(jī)通信接口由于單片機(jī)的引腳為TTL電平,與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)換,常采用美國MAXIM公司的MAX232A,它是全雙工發(fā)送器/接收器接口電路芯片,可實(shí)現(xiàn)TTL電平到RS-232C電平、RS-232C電平到TTL電平的轉(zhuǎn)換。10.4.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介2.RS-232C雙機(jī)通信接口RS-232C標(biāo)準(zhǔn)規(guī)定電纜長(zhǎng)度限定在≤15米,最高數(shù)傳速率為20kbit/s。足以覆蓋個(gè)人計(jì)算機(jī)使用的50~9600bit/s范圍。傳送的數(shù)字量采用負(fù)邏輯,且與地對(duì)稱。其中:邏輯“1”:-3~-15V;邏輯“0”:+3~+15V。10.4.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介3.RS-422A雙機(jī)通信接口RS-232C雖應(yīng)用廣泛,但推出較早,有明顯缺點(diǎn):傳輸速率低、通信距離短、接口處信號(hào)易產(chǎn)生串?dāng)_等。于是國際上又推出了RS-422A標(biāo)準(zhǔn)。RS-422A與RS-232C主要區(qū)別是,收發(fā)雙方信號(hào)地不再共地,RS-422A采用了平衡驅(qū)動(dòng)和差分接收的方法。10.4.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介3.RS-422A雙機(jī)通信接口若傳輸過程中,信號(hào)中混入了干擾和噪聲(以共模形式出現(xiàn)),由于差分接收器的作用,就能識(shí)別有用信號(hào)并正確接收傳輸信息,使干擾和噪聲相互抵消。圖10-17RS-422A數(shù)據(jù)傳送10.4.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介2.RS-422A雙機(jī)通信接口圖10-18RS-422A雙機(jī)通信接口電路10.4.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介4.RS-485雙機(jī)通信接口RS-422A雙機(jī)通信需四芯傳輸線,長(zhǎng)距離通信不經(jīng)濟(jì)。在工業(yè)現(xiàn)場(chǎng),常采用雙絞線傳輸?shù)腞S-485串行通信接口,很易實(shí)現(xiàn)多機(jī)通信。RS-485是RS-422A變型,與RS-422A區(qū)別是:RS-422A為全雙工,采用兩對(duì)平衡差分信號(hào)線;而RS-485為半雙工,采用一對(duì)平衡差分信號(hào)線。RS-485與多站互連是十分方便的,很易實(shí)現(xiàn)1對(duì)N的多機(jī)通信。10.4.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介4.RS-485雙機(jī)通信接口圖10-19RS-485雙機(jī)通信接口電路10.4.1串行通信標(biāo)準(zhǔn)接口RS232、RS422與RS485簡(jiǎn)介4.RS-485雙機(jī)通信接口圖10-19中,RS-485以雙向、半雙工方式實(shí)現(xiàn)雙機(jī)通信。在AT89S51系統(tǒng)發(fā)送或接收數(shù)據(jù)前,應(yīng)先將SN75176的發(fā)送門或接收門打開,當(dāng)P1.0=1時(shí),發(fā)送門打開,接收門關(guān)閉;當(dāng)P1.0=0時(shí),接收門打開,發(fā)送門關(guān)閉。圖10-19的SN75176片內(nèi)集成一個(gè)差分驅(qū)動(dòng)器和一個(gè)差分接收器,且兼有TTL電平到RS-485電平、RS-485電平到TTL電平的轉(zhuǎn)換功能。此外常用的RS-485接口芯片還有MAX485。10.4.2方式1的應(yīng)用設(shè)計(jì)【例10-4】圖10-20為單片機(jī)甲、乙雙機(jī)串行通信,雙機(jī)RXD和TXD相互交叉相連,甲機(jī)P1口接8個(gè)開關(guān),乙機(jī)P1口接8個(gè)發(fā)光二極管。甲機(jī)設(shè)置為只能發(fā)送不能接收的單工方式。要求甲機(jī)讀入P1口的8個(gè)開關(guān)的狀態(tài)后,通過串行口發(fā)送到乙機(jī),乙機(jī)將接收到的甲機(jī)的8個(gè)開關(guān)的狀態(tài)數(shù)據(jù)送入P1口,由P1口的8個(gè)發(fā)光二極管來顯示8個(gè)開關(guān)的狀態(tài)。雙方晶振均采用11.0592MHz。10.4.2方式1的應(yīng)用設(shè)計(jì)圖10-20單片機(jī)方式1雙機(jī)通信的連接10.4.2方式1的應(yīng)用設(shè)計(jì)參考程序如下://甲機(jī)串行發(fā)送#include<reg51.h>#defineucharunsignedchar #defineuintunsignedintvoidmain(){

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口為輸入10.4.2方式1的應(yīng)用設(shè)計(jì)

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ā)送 } 10.4.2方式1的應(yīng)用設(shè)計(jì)//乙機(jī)串行接收#include<reg51.h>#defineucharunsignedchar #defineuintunsignedintvoidmain(){

uchartemp=0;

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

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

TR1=1; //啟動(dòng)T110.4.2方式1的應(yīng)用設(shè)計(jì)

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的亮滅 }} 10.4.3單片機(jī)與PC機(jī)串行通信的設(shè)計(jì)工業(yè)現(xiàn)場(chǎng)測(cè)控系統(tǒng)中,常用單片機(jī)進(jìn)行監(jiān)測(cè)點(diǎn)的數(shù)據(jù)采集,然后單片機(jī)通過串口與PC通信,把采集的數(shù)據(jù)串行傳送到PC機(jī)上,再在PC機(jī)上進(jìn)行數(shù)據(jù)處理。PC機(jī)配置都是RS-232標(biāo)準(zhǔn)串口,為9針“D”型插座,輸入/輸出為RS-232電平?!癉”型9針插頭引腳定義見圖10-21。圖10-21“D”型9針插頭引腳定義10.4.3單片機(jī)與PC機(jī)串行通信的設(shè)計(jì)圖10-22單片機(jī)與PC機(jī)的RS-232串行通信接口10.4.3單片機(jī)與PC機(jī)串行通信的設(shè)計(jì)【例10-5】單片機(jī)向計(jì)算機(jī)發(fā)送數(shù)據(jù)的Proteus仿真電路如圖10-23。要求單片機(jī)通過串行口的TXD腳向計(jì)算機(jī)串行發(fā)送8個(gè)字節(jié)數(shù)據(jù)。本例使用兩個(gè)串口虛擬終端,觀察串行口線上出現(xiàn)的串行傳輸數(shù)據(jù)。1.單片機(jī)向PC機(jī)發(fā)送數(shù)據(jù)10.4.3單片機(jī)與PC機(jī)串行通信的設(shè)計(jì)允許彈出兩個(gè)虛擬終端窗口,見圖10-23。VT1窗口顯示的數(shù)據(jù)表示單片機(jī)串口發(fā)給PC機(jī)數(shù)據(jù),VT2顯示的數(shù)據(jù)表示由PC機(jī)經(jīng)RS232串口模型COMPIM接收到的數(shù)據(jù),由于使用了串口模型COMPIM,從而省去PC機(jī)模型,解決了單片機(jī)與PC機(jī)串行通信的虛擬仿真問題。實(shí)際上單片機(jī)向計(jì)算機(jī)和單片機(jī)向單片機(jī)發(fā)送數(shù)據(jù)的方法是完全一樣。1.單片機(jī)向PC機(jī)發(fā)送數(shù)據(jù)10.4.3單片機(jī)與PC機(jī)串行通信的設(shè)計(jì)1.單片機(jī)向PC機(jī)發(fā)送數(shù)據(jù)圖10-23單片機(jī)向計(jì)算機(jī)發(fā)送數(shù)據(jù)的proteus仿真電路10.4.3單片機(jī)與PC機(jī)串行通信的設(shè)計(jì)1.單片機(jī)向PC機(jī)發(fā)送數(shù)據(jù)圖10-23從兩個(gè)虛擬終端窗口觀察到的串行通信數(shù)據(jù)10.4.3單片機(jī)與PC機(jī)串行通信的設(shè)計(jì)參考程序:#include<reg51.h>codeTab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};voidsend(unsignedchardat){ SBUF=dat;

//待發(fā)送數(shù)據(jù)寫入發(fā)送緩沖寄存器while(TI==0);

//串口未發(fā)完,等待

;

//空操作

TI=0;

//1字節(jié)發(fā)送完,軟件將TI標(biāo)志清0}voiddelay(void){

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

unsignedcharm,n;

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

for(n=0;n<250;n++);}1.單片機(jī)向PC機(jī)發(fā)送數(shù)據(jù)10.4.3單片機(jī)與PC機(jī)串行通信的設(shè)計(jì)voidmain(void){ //主函數(shù)

unsignedchari;

TMOD=0x20;

//設(shè)置T1為定時(shí)器方式2SCON=0x40;PCON=0x00; //串行口方式1, TH1=0xfd;TL1=0xfd; //波特率9600 TR1=1; //啟動(dòng)T1while(1){ //循環(huán) for(i=0;i<8;i++){ //發(fā)送8次流水燈控制碼

send(Tab[i]); //發(fā)送數(shù)據(jù)

delay

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。