MCS-51學習小結之RS232通訊[轉載]

zengweion發表於2012-12-10

MCS-51學習小結之RS232通訊

原文:http://blog.ednchina.com/ZHOUNACHU/1603473/message.aspx

隨著多微機系統的廣泛使用和計算機網路技術的普及,計算機的通訊功能越來越顯得重要,一般來說,可以採用序列通訊和並行通訊兩種方式,由於序列通訊方式使用線路少、成本低,特別是在遠端傳輸時,可以避免多條線路的不一致而被廣泛使用,其中,RS232通訊是比較常用的,操作起來也簡單,對於一般的全雙工通訊,只需要3根訊號線就可以了,即一條TXD線、一條RXD線和一條地線。

 

我手裡用的是9D型串列埠,它的引腳分佈為2RXD3TXD5:邏輯地。

MCS-51的序列傳送和序列接收利用了P3口的第二功能,P3.0作為序列資料的接收線RXDP3.1作為序列資料線的傳送線TXD。序列通訊的控制暫存器佔據了26SFR中的3個,其中,PCONSCON用於設定序列口工作方式以及確定資料的傳送和接收波特率,SBUF實際上由兩個8位暫存器組成,一個用於存放將要傳送的資料,另一個用於存放接收到的資料,起著資料的緩衝作用。

 

記得還是大二暑假的時候開始接觸RS232通訊,當時對這3SFR的概念非常模糊,那個時候的數位電路是自學的,基礎不紮實,現在回頭好好理解一下,發現這種通訊操作起來還是比較簡單的,關鍵是要把這3SFRFunctional Block Diagram理解清楚,這涉及到一些數位電路方面的知識,一點體會就是電路基礎一定要過硬,否則控制程式將無從寫起。

序列口通訊有4種工作方式可供選擇,我這次除錯的是方式1,即10位非同步收發方式,這種方式比較常用。波特率的設定這裡就不多說了,有專門的表可以直接查詢,可以按照自己的需求選擇其中一種就OK了。需要注意的是,這裡資料的傳送有兩種途徑可供選擇,分別為:

1)查詢式:CPU通過查詢通訊埠TXDRXD的狀態進行資料的傳送,它的優點是硬體連線和查詢程式十分簡單,但是CPU在查詢等待過程中會降低效率。

2)中斷法:中斷傳送是利用CPU本身的中斷功能來實現對終端的資料傳送,這種方式可以提高CPU的工作效率。

下面是我修改好的程式,我儘量把它寫的清楚、簡單、易懂、格式標準:

(1)查詢法:

#include "reg52.h"

 

#define uchar unsigned char 

#define uint  unsigned int

 

uchar temp;

//************************************************

void send_back() //資料返回子程式

{

    SBUF="P1";

    while(!TI);  //等待資料傳送完畢

    TI="0";        //將傳送標誌位清零

}

//************************************************

void main()

{

    TMOD="0x20";    //定時器1,工作方式

    TH1=0xFD;

    TL1=0xFD;     //給定時器1裝初值,設定波特率為9600bps

    PCON="0x00";    //波特率不進行加倍

    SM0=0;

    SM1=1;        //序列工作方式1

    REN="1";        //允許接收資料

    TR1=1;        //啟動定時器1

    while(1)

    {

        if(RI==1) //接收到資料時該位自動置為1

        {

            RI="0"; //將接收標誌位清零,否則上位機會一直不停地傳送資料

            temp="SBUF";

            P1=temp;

            send_back(); //把接收到的資料返回PC

        }

    }

}

 

 

(2)中斷法:

#include<reg52.h>

#define uchar unsigned char 

#define uint  unsigned int

//************************************************

void send_back() //資料返回子程式

{

    SBUF="P1";

    while(!TI);  //等待資料傳送完畢

    TI=0; //將傳送標誌位清零

}

//************************************************

void main()

{

    TMOD="0x20";    //定時器1,工作方式

    TH1 =0xfd; 

    TL1 =0xfd;    //給定時器1裝初值,設定波特率為9600bps

    PCON="0x00";    //波特率不進行加倍

    SM0 =0;

    SM1 =1;       //序列工作方式1

    REN =1;       //允許接收資料

    ES  =1;       //開啟串列埠中斷4

    TR1 =1;       //啟動定時器1

    EA  =1;       //開啟總中斷

    while(1); 

}

//************************************************

void UART() interrupt 4

{

    if(RI==1)  //接收到資料時該位自動置為1

    {

        RI="0";  //將接收標誌位清零,否則上位機會一直不停地傳送資料

        P1=SBUF;

        send_back();//把接收到的資料返回PC

    }

}

 

除錯這個通訊程式時,發現使用串列埠除錯傳送資料時必須使用16進位制模式傳送,否則微控制器收不到資料,以後得記住這一點.

相關文章