51單片機之串行通信

一、計算機串行通信基礎

     隨着多微機系統的廣泛應用和計算機網絡技術的普及,計算機的通信功能愈來愈顯得重要。計算機通信是指計算機與外部設備或計算機與計算機之間的信息交換。
    通信有並行通信和串行通信兩種方式。在多微機系統以及現代測控系統中信息的交換多采用串行通信方式。

    計算機通信是將計算機技術和通信技術的相結合,完成計算機與外部設備或計算機與計算機之間的信息交換  。可以分爲兩大類:並行通信與串行通信。
    並行通信通常是將數據字節的各位用多條數據線同時進行傳送 。 

 並行通信控制簡單、傳輸速度快;由於傳輸線較多,長距離傳送時成本高且接收方的各位同時接收存在困難。

 串行通信是將數據字節分成一位一位的形式在一條傳輸線上逐個地傳送。

串行通信的特點:傳輸線少,長距離傳送時成本低,且可以利用電話網等現成的設備,但數據的傳送控制比並行通信複雜。 

二、串行通信的基本概念 
1、異步通信與同步通信
1)、異步通信
     異步通信是指通信的發送與接收設備使用各自的時鐘控制數據的發送和接收過程。爲使雙方的收發協調,要求發送和接收設備的時鐘儘可能一致。 

   異步通信是以字符(構成的幀)爲單位進行傳輸,字符與字符之間的間隙(時間間隔)是任意的,但每個字符中的各位是以固定的時間傳送的,即字符之間不一定有“位間隔”的整數倍的關係,但同一字符內的各位之間的距離均爲“位間隔”的整數倍。 


                              異步通信的數據格式 : 

 

      異步通信的特點:不要求收發雙方時鐘的嚴格一致,實現容易,設備開銷較小,但每個字符要附加2~3位用於起止位,各幀之間還有間隔,因此傳輸效率不高。 

 2)、同步通信
同步通信時要建立發送方時鐘對接收方時鐘的直接控制,使雙方達到完全同步。此時,傳輸數據的位之間的距離均爲“位間隔”的整數倍,同時傳送的字符間不留間隙,即保持位同步關係,也保持字符同步關係。發送方對接收方的同步可以通過兩種方法實現。  

                                    外同步                                                                                自同步

2、串行通信的傳輸方向

  單工是指數據傳輸僅能沿一個方向,不能實現反向傳輸。
  半雙工是指數據傳輸可以沿兩個方向,但需要分時進行。
  全雙工是指數據可以同時進行雙向傳輸。 

 

3、串行通信常見的錯誤校驗  

1)、奇偶校驗
      在發送數據時,數據位尾隨的1位爲奇偶校驗位(1或0)。奇校驗時,數據中“1”的個數與校驗位“1”的個數之和應爲奇數;偶校驗時,數據中“1”的個數與校驗位“1”的個數之和應爲偶數。接收字符時,對“1”的個數進行校驗,若發現不一致,則說明傳輸數據過程中出現了差錯。
2)、代碼和校驗
      代碼和校驗是發送方將所發數據塊求和(或各字節異或),產生一個字節的校驗字符(校驗和)附加到數據塊末尾。接收方接收數據同時對數據塊(除校驗字節外)求和(或各字節異或),將所得的結果與發送方的“校驗和”進行比較,相符則無差錯,否則即認爲傳送過程中出現了差錯。
3)、循環冗餘校驗
      這種校驗是通過某種數學運算實現有效信息與校驗位之間的循環校驗,常用於對磁盤信息的傳輸、存儲區的完整性校驗等。這種校驗方法糾錯能力強,廣泛應用於同步通信中。

4、傳輸速率

比特率是每秒鐘傳輸二進制代碼的位數,單位是:位/秒(bps)。如每秒鐘傳送240個字符,而每個字符格式包含10位(1個起始位、1個停止位、8個數據位),這時的比特率爲:
           10位×240個/秒 = 2400 bps

5、傳輸距離與傳輸速率的關係

     串行接口或終端直接傳送串行信息位流的最大距離與傳輸速率及傳輸線的電氣特性有關。當傳輸線使用每0.3m(約1英尺)有50PF電容的非平衡屏蔽雙絞線時,傳輸距離隨傳輸速率的增加而減小。當比特率超過1000 bps 時,最大傳輸距離迅速下降,如9600 bps 時最大距離下降到只有76m(約250英尺)。

三、80C51的串行口

    1、80C51串行口的結構

            

    有兩個物理上獨立的接收、發送緩衝器SBUF,它們佔用同一地址99H ;接收器是雙緩衝結構 ;發送緩衝器,因爲發送時CPU是主動的,不會產生重疊錯誤。

 2、80C51串行口的控制寄存器

SCON 是一個特殊功能寄存器,用以設定串行口的工作方式、接收/發送控制以及設置狀態標誌:

SM0和SM1爲工作方式選擇位,可選擇四種工作方式:

 

    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串行口的工作方式

1、方式0
   方式0時,串行口爲同步移位寄存器的輸入輸出方式。主要用於擴展並行輸入或輸出口。數據由RXD(P3.0)引腳輸入或輸出,同步移位脈衝由TXD(P3.1)引腳輸出。發送和接收均爲8位數據,低位在先,高位在後。波特率固定爲fosc/12。   
   1)、方式0輸出:

 

  2)、方式0輸入:

2、方式1
    方式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請求中斷。

3、方式2和方式3:
     方式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引腳的負跳變。 

4、波特率的計算

    在串行通信中,收發雙方對發送或接收數據的速率要有約定。通過軟件可對單片機串行口編程爲四種工作方式,其中方式0和
方式2的波特率是固定的,而方式1和方式3的波特率是可變的,由定時器T1的溢出率來決定。
    串行口的四種工作方式對應三種波特率。由於輸入的移位時鐘的來源不同,所以,各種方式的波特率計算公式也不相同。

方式0的波特率 =  fosc/12
方式2的波特率 =((2^SMOD)/64)· fosc 
方式1的波特率 =((2^SMOD)/32)·(T1溢出率)
方式3的波特率 =((2^SMOD)/32)·(T1溢出率)

 

     當T1作爲波特率發生器時,最典型的用法是使T1工作在自動再裝入的8位定時器方式(即方式2,且TCON的TR1=1,以啓動定時器)。這時溢出率取決於TH1中的計數值。
         T1 溢出率 = fosc /{12×[256 -(TH1)]}
     在單片機的應用中,常用的晶振頻率爲:12MHz和11.0592MHz。所以,選用的波特率也相對固定。常用的串行口波特率以及各參數的關係如表所示。

 

五、串口使用步驟

串行口工作之前,應對其進行初始化,主要是設置產生波特率的定時器1、串行口控制和中斷控制。具體
步驟如下:
1、確定T1的工作方式(編程TMOD寄存器);
2、計算T1的初值,裝載TH1、TL1;
3、啓動T1(編程TCON中的TR1位);
4、確定串行口控制(編程SCON寄存器);
5、串行口在中斷方式工作時,要進行中斷設置(編程IE、IP寄存器)。 

示例程序:編寫串口程序將下位機接收到的信息轉發給上位機

#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;

sbit led = P2^0;

void UsartInit()
{
 TMOD = 0X20;  //定時器工作方式2                    
 TH1 = 0XF3;
 TL1 = 0XF3;  //裝填定時器,波特率爲2400,翻倍後爲4800
 PCON  = 0X80; //SMOD==1,波特率翻倍
 TR1 = 1;      //啓動定時器T1
 SCON = 0X50; //REN=1允許串行接受狀態,串口工作模式1    
 ES = 1;     //開啓中斷
 EA = 1;
 
}



void main()
{
 UsartInit();
 while(1);
}

void uSART() interrupt 4
{
  u8 receiveData = SBUF; //接收字符
  RI = 0;
  SBUF= receiveData;  //發送字符
  while(!TI);  //等待發送完成
  TI = 0;

}

將程序下載到單片機,連接單片機到主機電腦,在電腦上用串口住手發送字符串,可以發現單片機將發送出去的字符串又發送回來。

另外可以參考文章:

《Python實現的簡單的單片機串口助手程序》

https://blog.csdn.net/wangjiaweiwei/article/details/100527749

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