新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機實現點對點的數據傳輸-串口通訊

        單片機實現點對點的數據傳輸-串口通訊

        作者: 時間:2016-11-18 來源:網絡 收藏
        單片機在控制本地的外圍期間時,信息的交互是通過8位并行數據總線進行的,但是在較大規模的現代控制系統中,單片機還需要控制遠端的設備,可以利用單片機的串行通信模塊,在學習了RS-232串口通信的原理和時序后,學習了利用RS-232接口實現串口數據傳輸的點對點通信。

        本文引用地址:http://www.104case.com/article/201611/315970.htm

        主要器件:

        1、AT89C52單片機芯片,用于控制串口通信。

        2、接口電平轉換芯片MAX3232,用于實現TTL電平和RS-232電平的轉換。

        試驗流程圖:主機部分



        從機部分:



        試驗電路圖:

        試驗程序代碼:

        //PPDataR.h程序

        #ifndef_PPDATAR_H//防止PPDataT.h被重復引用

        #define_PPDATAR_H

        #include

        #include

        #define uchar unsigned char

        #define uint unsigned int

        /*握手信號宏定義*/

        #define CALL 0x24//主機呼叫

        #define BUSY 0x15//從機忙

        #define OK 0x00//從機準備好

        #define SUCC 0x2A//接收成功

        #define ERR 0xF0//接收錯誤

        #define MAXLEN 64//緩沖區最大長度

        uchar buf[MAXLEN];

        #endif

        //PPDataR.c程序

        #include "PPDataR.h"

        /*發送數據函數*/

        uchar recvdata(uchar *buf)

        {

        uchar i,tmp;

        uchar len;//保存數據長度

        uchar ecc;//保存校驗字節

        /*接收數據長度字節*/

        RI = 0;

        while(!RI);

        len = SBUF;

        RI = 0;

        /*使用len的值為校驗字節ecc賦初值*/

        ecc = len;

        /*接收數據*/

        for (i=0;i

        {

        while(!RI);

        *buf = SBUF;

        ecc = ecc^(*buf);//進行字節校驗

        RI = 0;

        buf++;

        }

        *buf = 0;//表示數據結束

        /*接收校驗字節*/

        while(!RI);

        tmp = SBUF;

        RI = 0;

        /*進行數據校驗*/

        ecc = tmp^ecc;

        if (ecc!=0)//如果校驗錯誤

        {

        *(buf-len) = 0;//清空數據緩沖區

        /*發送校驗錯誤信號ERR */

        TI = 0;

        SBUF = ERR;

        while(!TI);

        TI = 0;

        return 0xff;//返回0xff表示校驗錯誤

        }

        /*發送校驗成功信號SUCC */

        TI = 0;

        SBUF = SUCC;

        while(!TI);

        TI = 0;

        return 0;//校驗成功,返回0

        }

        void init_serial()

        {

        TMOD = 0x20;//定時器T1使用工作方式2

        TH1 = 250;

        TL1 = 250;

        TR1 = 1;//開始計時

        PCON = 0x80;// SMOD = 1

        SCON = 0x50;//工作方式1,波特率9600kbit/s,允許接收

        }

        /*主程序*/

        void main()

        {

        uchar tmp = 0;

        /*串口初始化*/

        init_serial();

        EA = 0;//關閉所有中斷

        while(1)

        {

        /*如果接收到的數據不是CALL,則繼續等待*/

        while (tmp!=CALL)

        {

        RI = 0;

        while(!RI)

        tmp = SBUF;

        RI = 0;

        }

        /*檢測P0口判斷當前是否工作忙,若P0=0xBB,則為忙狀態*/

        P0 = 0xff;

        tmp = P0;

        if(tmp==0xBB)//如果P0口為0xBB,發送BUSY信號

        {

        TI = 0;

        SBUF = BUSY;

        while(!TI);

        TI = 0;

        continue;

        }

        /*否則發送OK信號,表示從機可以接收數據*/

        TI = 0;

        SBUF = OK;

        while(!TI);

        TI = 0;

        /*數據接收*/

        tmp = 0xff;

        while(tmp==0xff)

        {

        tmp = recvdata(buf);//校驗失敗返回0xff,接收成功返回0

        }

        }

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 福泉市| 土默特右旗| 福州市| 中宁县| 托克逊县| 津市市| 海兴县| 吉木萨尔县| 延津县| 红河县| 嘉黎县| 青海省| 开封县| 定陶县| 肥东县| 霸州市| 绩溪县| 敖汉旗| 彰化县| 通山县| 三明市| 定州市| 上林县| 讷河市| 深水埗区| 土默特右旗| 阳曲县| 大悟县| 买车| 明光市| 剑川县| 法库县| 余干县| 大埔区| 新平| 察哈| 敖汉旗| 凌源市| 芜湖县| 乐清市| 兴国县|