16.串口通信

計算機通信是將計算機技術和通信技術的相結合,完成計算機與外部設備或計算機與計算機之間的信息交換。
通信有並行通信和串行通信兩種方式。在多微機系統以及現代測控系統中信息的交換多采用串行通信方式。
並行通信:將數據字節的各位用多條數據線同時進行傳送。(採用了8根數據線)
在這裏插入圖片描述
控制簡單,傳輸速度快,但由於傳輸線較長,長距離傳送成本高且接收方的各位同時接受存在困難。
串行通信:將數據字節分成一位一位的形式在一條傳輸線上逐個的傳送。(只需要一根線)
在這裏插入圖片描述
傳輸線少,長距離傳送時成本低,且可以利用電話網等現成的設備,但數據傳送控制較複雜(需要移位)。

串行通信:

異步通信
通信的發送與接收設備使用各自的時鐘控制,爲使收發一致,要求時鐘儘可能一致。
在這裏插入圖片描述
異步通信是以字符(構成的)爲單位進行傳輸,字符與字符之間的間隙(時間間隔)是任意的,但每個字符中的各位是以固定的時間傳送的,即字符之間不一定有“位間隔”的整數倍的關係,但同一字符內的各位之間的距離均爲“位間隔”的整數倍。
數據格式:
在這裏插入圖片描述
異步通信的特點:不要求收發雙方時鐘的嚴格一致,實現容易,設備開銷較小,但每個字符要附加2~3位用於起止位,各幀之間還有間隔,因此傳輸效率不高。
同步通信
同步通信時要建立發送方時鐘對接收方時鐘的直接控制,使雙方達到完全同步。此時,傳輸數據的位之間的距離均爲“位間隔”的整數倍,同時傳送的字符間不留間隙,即保持位同步關係,也保持字符同步關係。發送方對接收方的同步可以通過兩種方法實現。
外同步(左)通過計算機甲時鐘控制計算機乙時鐘
自同步(右)計算機甲數據加時鐘控制計算機乙時鐘
在這裏插入圖片描述
傳輸方向
單工是指數據傳輸僅能沿一個方向,不能實現反向傳輸。(左)
半雙工是指數據傳輸可以沿兩個方向,但需要分時進行。(中)
全雙工是指數據可以同時進行雙向傳輸。(右) (該開發板程序是全雙工)
在這裏插入圖片描述
錯誤校驗:(2,3僅瞭解)
1、奇偶校驗
在發送數據時,數據位尾隨的1位爲奇偶校驗位(1或0)。奇校驗時,數據中“1”的個數與校驗位“1”的個數之和應爲奇數;偶校驗時,數據中“1”的個數與校驗位“1”的個數之和應爲偶數。接收字符時,對“1”的個數進行校驗,若發現不一致,則說明傳輸數據過程中出現了差錯。
2、代碼和校驗
代碼和校驗是發送方將所發數據塊求和(或各字節異或),產生一個字節的校驗字符(校驗和)附加到數據塊末尾。接收方接收數據同時對數據塊(除校驗字節外)求和(或各字節異或),將所得的結果與發送方的“校驗和”進行比較,相符則無差錯,否則即認爲傳送過程中出現了差錯。
3、循環冗餘校驗
這種校驗是通過某種數學運算實現有效信息與校驗位之間的循環校驗,常用於對磁盤信息的傳輸、存儲區的完整性校驗等。這種校驗方法糾錯能力強,廣泛應用於同步通信中。

傳輸速率
比特率通常又叫波特率,是每秒鐘傳輸二進制代碼的位數,單位是:位/秒(bps)。如每秒鐘傳送240個字符,而每個字符格式包含10位(1個起始位、1個停止位、8個數據位),這時的比特率爲:
10位×240個/秒 = 2400 bps
傳輸距離與傳輸速率的關係
串行接口或終端直接傳送串行信息位流的最大距離與傳輸速率及傳輸線的電氣特性有關。當傳輸線使用每0.3m(約1英尺)有50PF電容的非平衡屏蔽雙絞線時,傳輸距離隨傳輸速率的增加而減小。當比特率超過1000 bps 時,最大傳輸距離迅速下降,如9600 bps 時最大距離下降到只有76m(約250英尺)。(波特率和傳輸距離成反比)
串行通信的接口標準
一、RS-232C接口
RS-232C是EIA(美國電子工業協會)1969年修訂RS-232C標準。RS-232C定義了數據終端設備(DTE)與數據通信設備(DCE)之間的物理接口標準。
1、機械特性
RS-232C接口規定使用25針連接器,連接器的尺寸及每個插針的排列位置都有明確的定義。(陽頭)(現多使用9針,右圖)
在這裏插入圖片描述
2、功能特性
在這裏插入圖片描述
*重點2,3,7
3、過程特性
規定了信號之間的時序關係,以便正確的接收和發送數據。
遠程通信連接:
在這裏插入圖片描述
近程通信連接:
在這裏插入圖片描述
RS-232C電平與TTL電平轉換驅動電路
在這裏插入圖片描述
採用RS-232C接口存在的問題
1、傳輸距離短,傳輸速率低
RS-232C總線標準受電容允許值的約束,使用時傳輸距離一般不要超過15米(線路條件好時也不超過幾十米)。最高傳送速率爲20Kbps。
2、有電平偏移
RS-232C總線標準要求收發雙方共地。通信距離較大時,收發雙方的地電位差別較大,在信號地上將有比較大的地電流併產生壓降。
3、抗干擾能力差
RS-232C在電平轉換時採用單端輸入輸出,在傳輸過程中當干擾和噪聲混在正常的信號中。爲了提高信噪比,RS-232C總線標準不得不採用比較大的電壓擺幅。
RS-422A接口(相對於RS-232C有所提高)
在這裏插入圖片描述
RS-422A輸出驅動器爲雙端平衡驅動器。如果其中一條線爲邏輯“1”狀態,另一條線就爲邏輯“0”,比採用單端不平衡驅動對電壓的放大倍數大一倍。差分電路能從地線干擾中拾取有效信號,差分接收器可以分辨200mV以上電位差。若傳輸過程中混入了干擾和噪聲,由於差分放大器的作用,可使干擾和噪聲相互抵消。因此可以避免或大大減弱地線干擾和電磁干擾的影響。RS-422A傳輸速率(90Kbps)時,傳輸距離可達1200米。
RS-485接口
在這裏插入圖片描述
RS-485是RS-422A的變型:RS-422A用於全雙工,而RS-485則用於半雙工。RS-485是一種多發送器標準,在通信線路上最多可以使用32 對差分驅動器/接收器。如果在一個網絡中連接的設備超過32個,還可以使用中繼器。
RS-485的信號傳輸採用兩線間的電壓來表示邏輯1和邏輯0。由於發送方需要兩根傳輸線,接收方也需要兩根傳輸線。傳輸線採用差動信道,所以它的干擾抑制性極好,又因爲它的阻抗低,無接地問題,所以傳輸距離可達1200米,傳輸速率可達1Mbps。
RS-485是一點對多點的通信接口,一般採用雙絞線的結構。普通的PC機一般不帶RS485接口,因此要使用RS-232C/RS-485轉換器。對於單片機可以通過芯片MAX485來完成TTL/RS-485的電平轉換。在計算機和單片機組成的RS-485通信系統中,下位機由單片機系統組成,上位機爲普通的PC機,負責監視下位機的運行狀態,並對其狀態信息進行集中處理,以圖文方式顯示下位機的工作狀態以及工業現場被控設備的工作狀況。系統中各節點(包括上位機)的識別是通過設置不同的站地址來實現的。
80C51的串行口
80C51串行口的結構
在這裏插入圖片描述
有兩個物理上獨立的接收、發送緩衝器SBUF,它們佔用同一地址99H ;接收器是雙緩衝結構 ;發送緩衝器,因爲發送時CPU是主動的,不會產生重疊錯誤。
80C51串行口的控制寄存器
SCON 是一個特殊功能寄存器,用以設定串行口的工作方式、接收/發送控制以及設置狀態標誌:
在這裏插入圖片描述
SM0和SM1爲工作方式選擇位,可選擇四種工作方式:(一般使用方式1)
在這裏插入圖片描述
SM2,多機通信控制位,主要用於方式2和方式3。當接收機的SM2=1時可以利用收到的RB8來控制是否激活RI(RB8=0時不激活RI,收到的信息丟棄;RB8=1時收到的數據進入SBUF,並激活RI,進而在中斷服務中將數據從SBUF讀走)。當SM2=0時,不論收到的RB8爲0和1,均可以使收到的數據進入SBUF,並激活RI(即此時RB8不具有控制RI激活的功能)。通過控制SM2,可以實現多機通信。
在方式0時,SM2必須是0。在方式1時,如果SM2=1,則只有接收到有效停止位時,RI才置1。
REN,允許串行接收位。由軟件置REN=1,則啓動串行口接收數據;若軟件置REN=0,則禁止接收。
TB8,在方式2或方式3中,是發送數據的第九位,可以用軟件規定其作用。可以用作數據的奇偶校驗位,或在多機通信中,作爲地址幀/數據幀的標誌位。
在方式0和方式1中,該位未用。
RB8,在方式2或方式3中,是接收到數據的第九位,作爲奇偶校驗位或地址幀/數據幀的標誌位。在方式1時,若SM2=0,則RB8是接收到的停止位。
TI,發送中斷標誌位。在方式0時,當串行發送第8位數據結束時,或在其它方式,串行發送停止位的開始時,由內部硬件使TI置1,向CPU發中斷申請。在中斷服務程序中,必須用軟件將其清0,取消此中斷申請。
RI,接收中斷標誌位。在方式0時,當串行接收第8位數據結束時,或在其它方式,串行接收停止位的中間時,由內部硬件使RI置1,向CPU發中斷申請。也必須在中斷服務程序中,用軟件將其清0,取消此中斷申請。
PCON中只有一位SMOD與串行口工作有關 :
在這裏插入圖片描述
SMOD(PCON.7) 波特率倍增位。在串行口方式1、方式2、方式3時,波特率與SMOD有關,當SMOD=1時,波特率提高一倍。復位時,SMOD=0。
80C51串行口的工作方式
一、方式0
方式0時,串行口爲同步移位寄存器的輸入輸出方式。主要用於擴展並行輸入或輸出口。數據由RXD(P3.0)引腳輸入或輸出,同步移位脈衝由TXD(P3.1)引腳輸出。發送和接收均爲8位數據,低位在先,高位在後。波特率固定爲fosc/12。
1、方式0輸出:
在這裏插入圖片描述
2、方式0輸入:
在這裏插入圖片描述
二、方式一
方式1是10位數據的異步通信口。TXD爲數據發送引腳,RXD爲數據接收引腳,傳送一幀數據的格式如圖所示。其中1位起始位,8位數據位,1位停止位。
在這裏插入圖片描述
1、方式1輸出:
在這裏插入圖片描述
2、方式1輸入:
在這裏插入圖片描述
用軟件置REN爲1時,接收器以所選擇波特率的16倍速率採樣RXD引腳電平,檢測到RXD引腳輸入電平發生負跳變時,則說明起始位有效,將其移入輸入移位寄存器,並開始接收這一幀信息的其餘位。接收過程中,數據從輸入移位寄存器右邊移入,起始位移至輸入移位寄存器最左邊時,控制電路進行最後一次移位。當RI=0,且SM2=0(或接收到的停止位爲1)時,將接收到的9位數據的前8位數據裝入接收SBUF,第9位(停止位)進入RB8,並置RI=1,向CPU請求中斷。
三、方拾二和方式三:(相對於方式一多了一個RB8或TB8)
方式2或方式3時爲11位數據的異步通信口。TXD爲數據發送引腳,RXD爲數據接收引腳 。
在這裏插入圖片描述
方式2和方式3時起始位1位,數據9位(含1位附加的第9位,發送時爲SCON中的TB8,接收時爲RB8),停止位1位,一幀數據爲11位。方式2的波特率固定爲晶振頻率的1/64或1/32,方式3的波特率由定時器T1的溢出率決定。
1、方式2和方式3輸出
在這裏插入圖片描述
發送開始時,先把起始位0輸出到TXD引腳,然後發送移位寄存器的輸出位(D0)到TXD引腳。每一個移位脈衝都使輸出移位寄存器的各位右移一位,並由TXD引腳輸出。
第一次移位時,停止位“1”移入輸出移位寄存器的第9位上 ,以後每次移位,左邊都移入0。當停止位移至輸出位時,左邊其餘位全爲0,檢測電路檢測到這一條件時,使控制電路進行最後一次移位,並置TI=1,向CPU請求中斷。
2、方式2和方式3輸入
在這裏插入圖片描述
接收時,數據從右邊移入輸入移位寄存器,在起始位0移到最左邊時,控制電路進行最後一次移位。當RI=0,且SM2=0(或接收到的第9位數據爲1)時,接收到的數據裝入接收緩衝器SBUF和RB8(接收數據的第9位),置RI=1,向CPU請求中斷。如果條件不滿足,則數據丟失,且不置位RI,繼續搜索RXD引腳的負跳變。
波特率的計算
在串行通信中,收發雙方對發送或接收數據的速率要有約定。通過軟件可對單片機串行口編程爲四種工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可變的,由定時器T1的溢出率來決定。
串行口的四種工作方式對應三種波特率。由於輸入的移位時鐘的來源不同,所以,各種方式的波特率計算公式也不相同。
方式0的波特率 = fosc/12
方式2的波特率 =(2SMOD/64)· fosc
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)
當T1作爲波特率發生器時,最典型的用法是使T1工作在自動再裝入的8位定時器方式(即方式2,且TCON的TR1=1,以啓動定時器)。這時溢出率取決於TH1中的計數值。
T1 溢出率 = fosc /{12×[256 -(TH1)]}
在單片機的應用中,常用的晶振頻率爲:12MHz和11.0592MHz。所以,選用的波特率也相對固定。常用的串行口波特率以及各參數的關係如表所示。
在這裏插入圖片描述
串口的使用
串行口工作之前,應對其進行初始化,主要是設置產生波特率的定時器1、串行口控制和中斷控制。具體
步驟如下:
確定T1的工作方式(編程TMOD寄存器);(方式二、定時器功能)
計算T1的初值,裝載TH1、TL1;(TH1即爲初值)
啓動T1(編程TCON中的TR1位);
確定串行口控制(編程SCON寄存器);(串行口工作在方式幾)
串行口在中斷方式工作時,要進行中斷設置(編程IE寄存器)。

單片機與單片機的通信

一、點對點的通信
硬件連接 (利用了兩個MAX232A芯片)
在這裏插入圖片描述
二、多機通信
1、硬件連接
單片機構成的多機系統常採用總線型主從式結構。所謂主從式,即在數個單片機中,有一個是主機,其餘的是從機,從機要服從主機的調度、支配。80C51單片機的串行口方式2和方式3適於這種主從式的通信結構。當然採用不同的通信標準時,還需進行相應的電平轉換,有時還要對信號進行光電隔離。在實際的多機應用系統中,常採用RS-485串行標準總線進行數據傳輸。
在這裏插入圖片描述
串口通信實驗程序

#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;

void UssartInit()
{
	TMOD=0x20;//設置計數器工作方式2
	TH1=0xF3;
	TL1=0xF3;//計數器初始值設置,波特率爲4800,高四位和低四位初值一致,因爲用到的是8位自動重裝定時器
	TR1=1;//打開計數器
	SCON=0x50;//設置爲工作方式1
	PCON=0x80;//波特率加倍
	ES=1;//打開接收中斷
	EA=1;//打開總中斷
}

void main()
{
	UssartInit();//串口初始化
	while(1);
}

void Ussart() interrupt 4
{
	u8 receiveData;
	receiveData=SBUF;//存儲接收到的數據
	RI=0;//接收中斷位置0
	SBUF=receiveData;//將接收到的數據放入到接收寄存器
	while(!TI);//等待數據發送完成
	TI=0;//清除發送完成標誌位
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章