單片機STC89C52學(xué)習(xí)——19 串口通信
匯總:00 單片機STC89C52學(xué)習(xí)
參考教程:普中科技
1 原理
1.1 并行通信與串行通信
| 并行通信 | 串行通信 |
|---|---|
| 將數(shù)據(jù)字節(jié)的各位用多條數(shù)據(jù)線同時進行傳送 | 將數(shù)據(jù)字節(jié)分成一位一位的形式在一條傳輸線上逐個地傳送(先低后高) |
![]() |
![]() |
| 控制簡單、傳輸速度快;但由于傳輸線較多,長距離傳送時成本高且接收方的各位同時接收存在困難(相互干擾等) | 傳輸線少,長距離傳送時成本低,且可以利用電話網(wǎng)(電話線)等現(xiàn)成的設(shè)備;但數(shù)據(jù)的傳送控制比并行通信復(fù)雜 |
1.2 串行通信:異步通信與同步通信
-
異步通信
? ? ? ?異步通信是指通信的發(fā)送與接收設(shè)備使用各自的時鐘控制數(shù)據(jù)的發(fā)送和接收過程。為使雙方的收發(fā)協(xié)調(diào),要求發(fā)送和接收設(shè)備的時鐘盡可能一致。
? ? ? ?異步通信是以字符(構(gòu)成的幀)為單位進行傳輸,字符與字符之間的間隙(時間間隔)是任意的,但每個字符中的各位是以固定的時間傳送的。即字符之間不一定有“位間隔”的整數(shù)倍的關(guān)系,但同一字符內(nèi)的各位之間的距離均為“位間隔”的整數(shù)倍。? ? ? ?特點:不要求收發(fā)雙方時鐘的嚴格一致,實現(xiàn)容易,設(shè)備開銷較小,但每個字符要附加2~3位用于起止位,各幀之間還有間隔,因此傳輸效率不高。
數(shù)據(jù)格式: - 同步通信
? ? ? ?同步通信時要建立發(fā)送方時鐘對接收方時鐘的直接控制,使雙方達到完全同步。此時,傳輸數(shù)據(jù)的位之間的距離均為“位間隔”的整數(shù)倍,同時傳送的字符間不留間隙,即既保持位同步關(guān)系,也保持字符同步關(guān)系。發(fā)送方對接收方的同步可以通過兩種方法實現(xiàn)——外同步和自同步:
1.3 串行通信的傳輸方向

-
單工
數(shù)據(jù)傳輸僅能沿一個方向,不能實現(xiàn)反向傳輸 -
半雙工
數(shù)據(jù)傳輸可以沿兩個方向,但需要分時進行 -
全雙工
數(shù)據(jù)可以同時進行雙向傳輸
1.4 串行通信中常見的錯誤校驗
-
奇偶校驗(通常使用)
? ? ? ?在發(fā)送數(shù)據(jù)時,數(shù)據(jù)位尾隨的1位為奇偶校驗位(1或0)。奇校驗時,數(shù)據(jù)中“1”的個數(shù)與校驗位“1”的個數(shù)之和應(yīng)為奇數(shù);偶校驗時,數(shù)據(jù)中“1”的個數(shù)與校驗位“1”的個數(shù)之和應(yīng)為偶數(shù)。接收字符時,對“1”的個數(shù)進行校驗,若發(fā)現(xiàn)不一致,則說明傳輸數(shù)據(jù)過程中出現(xiàn)了差錯。 -
代碼和校驗
? ? ? ?代碼和校驗是發(fā)送方將所發(fā)數(shù)據(jù)塊求和(或各字節(jié)異或),產(chǎn)生一個字節(jié)的校驗字符(校驗和)附加到數(shù)據(jù)塊末尾。接收方接收數(shù)據(jù)同時對數(shù)據(jù)塊(除校驗字節(jié)外)求和(或各字節(jié)異或),將所得的結(jié)果與發(fā)送方的“校驗和”進行比較,相符則無差錯,否則即認為傳送過程中出現(xiàn)了差錯。 -
循環(huán)冗余校驗
? ? ? ?這種校驗是通過某種數(shù)學(xué)運算實現(xiàn)有效信息與校驗位之間的循環(huán)校驗,常用于對磁盤信息的傳輸、存儲區(qū)的完整性校驗等。這種校驗方法糾錯能力強,廣泛應(yīng)用于同步通信中。
1.5 傳輸速率
-
比特率
? ? ? ?比特率(波特率)是每秒鐘傳輸二進制代碼的位數(shù),單位是:位/秒(bps)。如每秒鐘傳送240個字符,而每個字符格式包含10位(1個起始位、1個停止位、8個數(shù)據(jù)位),這時的比特率為:10位×240個/秒 = 2400 bps -
傳輸距離與傳輸速率的關(guān)系
? ? ? ?串行接口或終端直接傳送串行信息位流的最大距離與傳輸速率及傳輸線的電氣特性有關(guān)。當傳輸線使用每0.3m(約1英尺)有50PF電容的非平衡屏蔽雙絞線時,傳輸距離隨傳輸速率的增加而減小。當比特率超過1000 bps 時,最大傳輸距離迅速下降,如9600 bps 時最大距離下降到只有76m(約250英尺)。
? ? ? ?反比:若要傳得遠,波特率必須?。恢恍枰獋骱芙?,波特率可以大。
1.6 串行通信接口標準
- RS-232C接口
- RS-422A接口
- RS-485接口
1.7 80C51的串行口的控制

有兩個物理上獨立的接收、發(fā)送緩沖器SBUF,它們占用同一地址99H ;接收器是雙緩沖結(jié)構(gòu) ,避免數(shù)據(jù)接收過程中出現(xiàn)重疊錯誤;發(fā)送緩沖器,因為發(fā)送時CPU是主動的,不會產(chǎn)生重疊錯誤。
-
控制寄存器SCON(通常0101 0000 = 0x50)
設(shè)定串行口的工作方式、接收/發(fā)送控制以及設(shè)置狀態(tài)標志
-
SM0和SM1:工作方式選擇位,可選擇四種工作方式(通常選擇方式1)
- SM2:多機通信控制位,主要用于方式2和方式3。當接收機的SM2=1時可以利用收到的RB8來控制是否激活RI(RB8=0時不激活RI,收到的信息丟棄;RB8=1時收到的數(shù)據(jù)進入SBUF,并激活RI,進而在中斷服務(wù)中將數(shù)據(jù)從SBUF讀走)。當SM2=0時,不論收到的RB8為0和1,均可以使收到的數(shù)據(jù)進入SBUF,并激活RI(即此時RB8不具有控制RI激活的功能)。通過控制SM2,可以實現(xiàn)多機通信。在方式0時,SM2必須是0。在方式1時,如果SM2=1,則只有接收到有效停止位時,RI才置1。
- REN:允許串行接收位。由軟件置REN=1,則啟動串行口接收數(shù)據(jù);若軟件置REN=0,則禁止接收
- TB8,在方式2或方式3中,是發(fā)送數(shù)據(jù)的第九位,可以用軟件規(guī)定其作用??梢杂米鲾?shù)據(jù)的奇偶校驗位,或在多機通信中,作為地址幀/數(shù)據(jù)幀的標志位。在方式0和方式1中,該位未用。
- RB8,在方式2或方式3中,是接收到數(shù)據(jù)的第九位,作為奇偶校驗位或地址幀/數(shù)據(jù)幀的標志位。在方式1時,若SM2=0,則RB8是接收到的停止位。
- TI:發(fā)送中斷標志位。在方式0時,當串行發(fā)送第8位數(shù)據(jù)結(jié)束時,或在其它方式,串行發(fā)送停止位的開始時,由內(nèi)部硬件使TI置1,向CPU發(fā)中斷申請。在中斷服務(wù)程序中,必須用軟件將其清0,取消此中斷申請。
- RI:接收中斷標志位。在方式0時,當串行接收第8位數(shù)據(jù)結(jié)束時,或在其它方式,串行接收停止位的中間時,由內(nèi)部硬件使RI置1,向CPU發(fā)中斷申請。也必須在中斷服務(wù)程序中,用軟件將其清0,取消此中斷申請。
-
PCON
其中只有一位SMOD與串行口工作有關(guān)
- SMOD (PCON.7) :波特率倍增位。在串行口方式1、方式2、方式3時,波特率與SMOD有關(guān),當SMOD=1時,波特率提高一倍。復(fù)位時,SMOD=0。
1.8 80C51串行口的工作方式
-
方式0
方式0時,串行口為同步移位寄存器的輸入輸出方式。主要用于擴展并行輸入或輸出口。數(shù)據(jù)由RXD (P3.0) 引腳輸入或輸出,同步移位脈沖由TXD(P3.1)引腳輸出。發(fā)送和接收均為8位數(shù)據(jù),低位在先,高位在后。波特率固定為fosc/12。
-
輸出:
-
輸入:
-
方式1
方式1是10位數(shù)據(jù)的異步通信口。TXD為數(shù)據(jù)發(fā)送引腳,RXD為數(shù)據(jù)接收引腳,傳送一幀數(shù)據(jù)的格式如圖所示。其中1位起始位,8位數(shù)據(jù)位,1位停止位。
-
輸出:
-
輸入:
用軟件置REN為1時,接收器以所選擇波特率的16倍速率采樣RXD引腳電平,檢測到RXD引腳輸入電平發(fā)生負跳變時,則說明起始位有效,將其移入輸入移位寄存器,并開始接收這一幀信息的其余位。接收過程中,數(shù)據(jù)從輸入移位寄存器右邊移入,起始位移至輸入移位寄存器最左邊時,控制電路進行最后一次移位。當RI=0,且SM2=0(或接收到的停止位為1)時,將接收到的9位數(shù)據(jù)的前8位數(shù)據(jù)裝入接收SBUF,第9位(停止位)進入RB8,并置RI=1,向CPU請求中斷。
-
方式2和方式3
方式2或方式3時為11位數(shù)據(jù)的異步通信口。TXD為數(shù)據(jù)發(fā)送引腳,RXD為數(shù)據(jù)接收引腳 。方式2和方式3時起始位1位,數(shù)據(jù)9位(含1位附加的第9位,發(fā)送時為SCON中的TB8,接收時為RB8),停止位1位,一幀數(shù)據(jù)為11位。方式2的波特率固定為晶振頻率的1/64或1/32,方式3的波特率由定時器T1的溢出率決定。
-
輸出:
發(fā)送開始時,先把起始位0輸出到TXD引腳,然后發(fā)送移位寄存器的輸出位(D0)到TXD引腳。每一個移位脈沖都使輸出移位寄存器的各位右移一位,并由TXD引腳輸出。
第一次移位時,停止位“1”移入輸出移位寄存器的第9位上 ,以后每次移位,左邊都移入0。當停止位移至輸出位時,左邊其余位全為0,檢測電路檢測到這一條件時,使控制電路進行最后一次移位,并置TI=1,向CPU請求中斷。 -
輸入:
接收時,數(shù)據(jù)從右邊移入輸入移位寄存器,在起始位0移到最左邊時,控制電路進行最后一次移位。當RI=0,且SM2=0(或接收到的第9位數(shù)據(jù)為1)時,接收到的數(shù)據(jù)裝入接收緩沖器SBUF和RB8(接收數(shù)據(jù)的第9位),置RI=1,向CPU請求中斷。如果條件不滿足,則數(shù)據(jù)丟失,且不置位RI,繼續(xù)搜索RXD引腳的負跳變。
1.9 波特率的計算
? ? ? ?在串行通信中,收發(fā)雙方對發(fā)送或接收數(shù)據(jù)的速率要有約定。通過軟件可對單片機串行口編程為四種工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可變的,由定時器T1的溢出率來決定。
? ? ? ?串行口的四種工作方式對應(yīng)三種波特率。由于輸入的移位時鐘的來源不同,所以,各種方式的波特率計算公式也不相同。
- 方式0的波特率 = fosc/12
- 方式2的波特率 = (2SMOD/64) · fosc
- 方式1的波特率 = (2SMOD/32) · (T1溢出率)
- 方式3的波特率 = (2SMOD/32) · (T1溢出率)
? ? ? ?當T1作為波特率發(fā)生器時,最典型的用法是使T1工作在自動再裝入的8位定時器方式(即方式2,且TCON的TR1=1,以啟動定時器)。這時溢出率取決于TH1中的計數(shù)值:T1 溢出率 = fosc /{12×[256 -(TH1)]}
? ? ? ?在單片機的應(yīng)用中,常用的晶振頻率為:12MHz和11.0592MHz。所以,選用的波特率也相對固定。常用的串行口波特率以及各參數(shù)的關(guān)系如表所示。

1.10 串口如何使用
- TMOD:確定T1的工作方式
- 賦初值:計算T1的初值,裝載TH1、TL1
- TCON:啟動T1(TR1位)
- SCON:確定串行口控制
- IE、IP:中斷方式時,進行中斷設(shè)置
1.11 單片機與單片機的通信
-
點對點
-
多機通信
單片機構(gòu)成的多機系統(tǒng)常采用總線型主從式結(jié)構(gòu)。所謂主從式,即在數(shù)個單片機中,有一個是主機,其余的是從機,從機要服從主機的調(diào)度、支配。80C51單片機的串行口方式2和方式3適于這種主從式的通信結(jié)構(gòu)。當然采用不同的通信標準時,還需進行相應(yīng)的電平轉(zhuǎn)換,有時還要對信號進行光電隔離。在實際的多機應(yīng)用系統(tǒng)中,常采用RS-485串行標準總線進行數(shù)據(jù)傳輸。
2 程序:串口通信——返回收到的數(shù)據(jù),通過串口調(diào)試助手顯示
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
void USARTInit()
{
TMOD = 0x20;// 使用T1:GATE = 0; C/T = 0定時器; M1 = 1、M0 = 0為8位自動重裝
TH1 = 0xF3; TL1 = 0xF3;// 波特率4800
PCON = 0x80;// 倍頻
TR1 = 1;// 啟動T0
SCON = 0x50;
EA = 1; ES = 1;// 中斷允許:總、串口
}
void main()
{
USARTInit();
while (1);
}
void intUSART() interrupt 4// 接收到數(shù)據(jù),SBUF存滿,RI = 1即發(fā)出中斷請求產(chǎn)生中斷
{
u8 receivedData = SBUF;// 讀緩沖器的數(shù)據(jù)保存到變量
RI = 0;// 要手動清零,取消中斷申請
SBUF = receivedData;// 放到緩沖區(qū)就開始發(fā)送了
while(!TI);// 等待直到發(fā)送完成,TI變成1
TI = 0;
}
效果:

















