68精品久久久久久欧美,最近中文字幕完整在线看一,久久亚洲男人天堂,最近中文字幕完整视频高清1

您好,歡迎進入深圳市穎特新科技有限公司官方網(wǎng)站!

您現(xiàn)在的位置:首頁 新聞資訊 >> 新聞頭條 >> 基于51的串行通訊原理及協(xié)議詳解(uart)
新聞資訊
NEWS INFORMATION

基于51的串行通訊原理及協(xié)議詳解(uart)

發(fā)布時間:2019-05-22

串行與并行通訊方式
并行:控制簡單,傳輸速度快。線多,長距離成本較高且同時接受困難。
串行:將數(shù)據(jù)字節(jié)分成一位一位的行駛在一條傳輸線上進行傳輸。如圖:
   

同步與異步串行通訊方式
同步串行通訊方式:同步通訊需要建立發(fā)送方對接收方時鐘的直接控制,是雙方達到完全同步。
異步串行通訊方式:通訊的發(fā)送和接收設備使用各自的時鐘控制數(shù)據(jù)的發(fā)送和接收,為使雙方收發(fā)協(xié)調(diào),要求發(fā)送和接收的時鐘盡可能一致。如圖:


異步通訊方式的特點:
異步通訊以字符構(gòu)成的幀為單位進行傳輸,字符與字符之間的間隙是任意的,但每個字符中的各位是以固定的時間傳送的。其一幀字符信息由4部分組成:起始位、數(shù)據(jù)位、奇偶檢驗位、停止位。在單片機中的通訊一般情況下均使用這種幀格式。如圖:


串行通訊的制式
單工:數(shù)據(jù)傳輸僅沿一個方向,不能實現(xiàn)反向傳輸
半雙工:數(shù)據(jù)可以沿兩個方向傳輸,但是需要分時
全雙工:數(shù)據(jù)可以同時進行雙向傳輸

串行通訊三種錯誤校驗:奇偶校驗、代碼和校驗、循環(huán)冗余校驗

RS232電平與TTL電平的轉(zhuǎn)換
PC使用的串口的電平為RS232的九針串口,MCU使用的電平是TTL電平,要使得PC 和MCU進行通訊,就需要對其電平極性轉(zhuǎn)換。主要的幾款電平轉(zhuǎn)換芯片:MAX232、MAX202、HIN232,SIPEX320等

串行通訊速度的定義_波特率
串行通訊的速率用波特率表示,其定義為:
                   每秒鐘傳送二進制代碼的位數(shù),即1波特=1位/秒,單位bps(位/秒)
eg:每秒鐘傳送240個字符,而每個字符格式包含10位(1起始、8數(shù)據(jù)、1停止),此時的波特率為:
                   10位*240個/秒=2400bps

串行通訊波特率的計算
單片機的串行口可設定為四種工作方式,其中方式0和方式2波特率固定,方式1和方式3波特率可變,由定時器T1的溢出率來決定。計算公式如下:

其中:fosc為系統(tǒng)晶振頻率,通常為12MHz(或者11.0592MHz),SMOD為PCON寄存器的最高位。T1的溢出率即定時器T1溢出的頻率。

電源管理寄存器_PCON

SMOD;該位與串通信波特率有關(guān)。
SMOD=0;串口方式1、2、3時,波特率正常
SMOD=1;串口方式1、2、3時,波特率加倍
SMOD0,LVDF,P0F,此三位為STC_MCU 所特有的,可查看相關(guān)手冊。
GF1、GF0;兩個通用標志位,可隨意使用。
PD;掉電模式設定位,
PD=0;MCU正常工作
PD=1;MCU進入掉電模式
IDL;空閑模式設定位
IDL=0;MCU正常工作
IDL=1;單片機進入空閑模式

單片機的兩種模式狀態(tài):
掉電模式:進入掉電模式后,晶振停震,CPU,定時器,串行口全部停止工作,只有外部中斷繼續(xù)工作,
可有外部中斷低電平觸發(fā)或下降沿觸發(fā)或硬件復位模式喚醒。
空閑模式:除CPU不夠工作外,其余仍繼續(xù)工作,在空閑模式下,可由任一個中斷或者硬件復位喚醒

T1的溢出率
T1的溢出率就是T1定時器溢出的頻率,只要算出T1定時器每一處一次所需的時間T,那么T的倒數(shù)即為他的溢出率。

51串行口結(jié)構(gòu)
51單片機串行口是一個可編程全雙工的通信接口,具有Uart(通用異步收發(fā)器)的全部功能,能同時進行數(shù)據(jù)的發(fā)送與接收,也可作為同步一位寄存器使用。
51_MCU主要由兩個獨立的串行數(shù)據(jù)緩沖寄存器SBUF (一個發(fā)送,一個接收)和發(fā)送控制器、接收控制器,輸入移位寄存器及若干控制門電路。如圖:


串行口控制寄存器_SCON

SM0,SM1;工作方式選擇位,串口有四中工作方式,如下:

SM2;多機通信可控制位,SM2主要用于方式2和方式3,當接收機的SM2=1時,可以利用收的RB8來控制是否激活RI;
RB8=0,不激活RI,收到的信息丟棄
RB8=1,收到的數(shù)據(jù)進入SBUF,并激活RI,進而在中斷服務中將數(shù)據(jù)從SBUF讀走,

當SM2=0時,無論收到的RB8是0還是1,均可以收收到的數(shù)據(jù)進入SBUF,并激活RI,通過控制SM2可實現(xiàn)多機通信。
在方式0時,SM2必須是0,
在方式1時,若SM2=1,則只有接收到有效停止位時,RI才置1

REN;允許串行接收位
REN=1;允許串行口接收數(shù)據(jù)
REN=0;禁止串行口接收數(shù)據(jù)

TB8;方式2、3中發(fā)送數(shù)據(jù)的第九位,可定義其作用,奇偶檢驗,地址幀標志等,方式0和1中,未使用
RB8;方式2、3中接收數(shù)據(jù)的第九位,可定義其作用,奇偶檢驗,地址幀標志等,方式1,若SM2=0,則RB8是接收到的停止位。
TI;發(fā)送中斷標志位,方式0中,串行發(fā)送第8位數(shù)據(jù)結(jié)束時,或者其他方式,串行發(fā)送停止位時,由內(nèi)部硬件置1,向CPU發(fā)出中斷申請,在中斷服務程序中,須用軟件清零,取消此中斷申請。
RI;接收中斷標志位, 方式0中,串行接收第8位數(shù)據(jù)結(jié)束時,或者其他方式,串行接收停止位時,由內(nèi)部硬件置1,向CPU發(fā)出中斷申請,在中斷服務程序中,須用軟件清零,取消此中斷申請

串口方式0,串行口為同步移位寄存器的輸入輸出方式,主要永不擴展并行輸入輸出接口,數(shù)據(jù)由RXD(P3.0)引腳輸入或者輸出,同步移位脈沖由TXD(P3.1)引腳輸出,發(fā)送和接收均為8位數(shù)據(jù),低位在先,高位在后。波特率固定fosc/12

串口方式1;10位數(shù)據(jù)一步通訊口,1起始,8數(shù)據(jù),1停止,TXD(P3.1)為數(shù)據(jù)發(fā)送引腳,RXD(P3.0)為數(shù)據(jù)接收引腳。其傳輸波特率可變,對51而言,波特率有定時器1的溢出率而決定,一般而言,在單片基于單片機,單片機與計算機,計算機與計算機串口通訊時,基本都市選擇方式1,所以此種方式必須掌握。

串口方士2,3;11位數(shù)據(jù)的異步通訊口,XD(P3.1)為數(shù)據(jù)發(fā)送引腳,RXD(P3.0)為數(shù)據(jù)接收引腳。在這兩種方式下,1起始,9數(shù)據(jù),1停止,一幀數(shù)據(jù)11位。方式2的波特率固定為晶晶振頻率的1/64或1/32,方式3的波特率由定時器1的溢出率決定。
方式2和方式2的差別僅在于波特率的選取不同,兩種方式下,接收到的停止位與SBUF,RB8,RI都無關(guān)。

串口方式1的編程實現(xiàn)
方式1數(shù)據(jù)輸出時序圖如下:

當數(shù)據(jù)被寫入SBUF寄存器后,單片機自動開始從起始位發(fā)送數(shù)據(jù),發(fā)送到停止位的開始時,
由內(nèi)部硬件將TI置1,向CPU申請中斷,接下來可在中斷服務程序中進行相關(guān)處理,也可選擇不進入中斷。

用軟件置REN為1時,接收器以所選擇波特率的16倍速率采樣RXD引腳電平,
檢測到RXD引腳輸入電平發(fā)聲負跳變時,則說明起始位有效。
將其移入輸入移位寄存器并開始接受這一幀信息的其余位。

接收過程中,數(shù)據(jù)從輸入移位寄存器右邊移入,起始位移至輸入移位寄存器的最左邊,
控制電路進行最后一次移位,當RI=0且SM2=0(或結(jié)收到的停止位為1)時,
將接受到的9位數(shù)據(jù)前8位數(shù)據(jù)裝入接收SBUF,第九位(停止位)進入RB8,并置RI=1,向CPU申請中斷,

在進行串口的相關(guān)操作之前,需要對單片機的一些特殊寄存器和進行初始化設置
主要是設置產(chǎn)生波特率的定時器1,串行口控制和中斷控制,具體步驟如下:
確定T1的工作方式(編程TMOD寄存器)
計算T1的初值,裝載TH1和TL1
啟動T1(編程TCON中的TR1位)
確定串行口工作方式(編程SCON寄存器)
串行口工作在中斷方式時,要進行中斷設置(編程IE、IP寄存器)


-----------------------------------------------------------------------------------------------------------------------
//串口方式1
TMOD=0X20;    //T1定時器,工作方式2
TH1=0XFD;    //T1定時器裝初值
TL1=0XFD;    //T1定時器裝初值
TR1=1;        //啟動T1定時器
REN=1;        //允許串口接收
SM0=0;        //設定串口工作方式1
SM1=1;        //設定串口工作方式1
EA=1;        //開總中斷
ES=1;        //開串口中斷
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
//串口中斷服務程序
void ser() interrupt 4
{
    RI=0;           //RI清零;因為收到數(shù)據(jù)或者或者發(fā)送了數(shù)據(jù)會由硬件置1
    a=SBUF;           //將SBUF中的數(shù)據(jù)讀走給a
    flag=1;           //中斷標志位置1
}
-----------------------------------------------------------------------------------------------------------------------

串口方式0
串行口為同步移位寄存器的輸入輸出方式,主要永不擴展并行輸入輸出接口,數(shù)據(jù)由RXD(P3.0)引腳輸入或者輸出,同步移位脈沖由TXD(P3.1)引腳輸出,發(fā)送和接收均為8位數(shù)據(jù),低位在先,高位在后。波特率固定fosc/12。

在該模式下,串行口的SBUF是作為同步移位寄存器使用的。
在串行口發(fā)送時。SBUF相當于一個并行進入,串行輸出的移位寄存器,
由單片機的內(nèi)部總線并行接收八位數(shù)據(jù),并從RXD信號線串行輸出,在接收操作時,他有相當于一個串行輸入、并行輸出的移位寄存器。該模式下,SM2,RB8,TB8不起作用。
方式0數(shù)據(jù)輸出時序圖如下:

發(fā)送操作在TI=0時進行,CPU將數(shù)據(jù)移入SBUF后,RXD線上即可發(fā)出8位數(shù)據(jù),TXD上發(fā)送同步脈沖,
8位數(shù)據(jù)發(fā)送完后,TI由硬件置位,并在中斷允許的情況下向CPU申請中斷,
CPU相應中斷后,先用軟件是TI清零,然后再給SBUF送下一個需要發(fā)送的字符,如此重復上述過程。

方式0數(shù)據(jù)輸入時序圖如下:

接收過程在REN=1和RI=0的條件下啟動,為此串行數(shù)據(jù)由RXD線輸入,TXD線輸出同步脈沖,
接收電路接收到8位數(shù)據(jù)后,RI自動置位并在中斷允許的條件下向CPU發(fā)出中斷請求,
CPU 查詢到RI為1或者相應中斷以后便將SBUF中的數(shù)據(jù)送到累加器,RI需要由軟件復位,

需要注意的是:
串行口工作模式0并不是一個同步通訊串口通訊方式,
它的主要用途是與外面的同步移位寄存器相連已達到擴展單片機輸入并行口和輸出并行口的目的。
其可以通過芯片(74LS164)把串口數(shù)據(jù)轉(zhuǎn)化成并口數(shù)據(jù),通過芯片(74LS165)把并行輸出的數(shù)據(jù)轉(zhuǎn)換成串口輸出

-----------------------------------------------------------------------------------------------------------------------
使用串口工作模式0間隔發(fā)送數(shù)據(jù)0XAA
void main()
{
    SCON=0;               //串行口工作方式0
    EA=1;            //開總中斷
    ES=1;            //允許串口中斷
    TI=0;            //發(fā)送中斷標志位
    while(1)
    {
        SBUF=0XAA;   
        delay();
    }
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
void ser0() interrupt 4
{
    TI=0;        //清楚發(fā)送中斷標志位
}
-----------------------------------------------------------------------------------------------------------------------

串口方式2和方式3
均為11位數(shù)據(jù)的異步通信口,唯一的區(qū)別在于傳輸速率的不同。
TXD數(shù)據(jù)發(fā)送引腳,RXD數(shù)據(jù)接收引腳,1起始,
9數(shù)據(jù)(含1位附加第9位,發(fā)送時為SCON中的TB8,接收時為RB8),1停止,一幀數(shù)據(jù)11位。
方式2的波特率固定為晶晶振頻率的1/64或1/32,方式3的波特率由定時器1的溢出率決定。

串口方式2和方式3一幀數(shù)據(jù)傳送格式,如圖:


串口方式2和方式3輸出時序圖:

發(fā)送開始時,先把起始位0輸出到TXD管腳,然后發(fā)送移位寄存器的的輸出位(D0)到TXD引腳
每一個移位脈沖都使輸出移位寄存器的各位右移一位,并由TXD引腳輸出,
第一次移位時,停止位1移入輸出移位寄存器的第9位,以后每次移位,左邊都輸入0
當停止移位至輸出位時,左邊其余位全為零,檢測電路檢測到這一條件時,使控制電路進行最后一次移位,并置TI=1;向CPU請求中斷。

串口方式2和方式3輸入時序圖:

接受時,數(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引腳的負跳變。

在方式2和方式3中,要用到SCON寄存器中的TB8位和RB8位,TB8為數(shù)據(jù)發(fā)送的第9位,用于方式2和方式3,由軟件更改,RB8為數(shù)據(jù)接收的第9位,用于方式2和方式3,在方式1中,如果SM2=0,則RB8用于存放接收到的停止位,在方式0下不適用該位。

-----------------------------------------------------------------------------------------------------------------------
使用串口工作方式2發(fā)送0XAA
void main()
{
    SM0=1;            //SMOSM1為10,串行工作方式2
    SM1=0;            //11位異步收發(fā)(9位數(shù)據(jù))
    TB8=0;            //數(shù)據(jù)發(fā)送的第9位
    EA=1;            //開總中斷
    ES=1;            //允許串口中斷
    TI=0;            //發(fā)送中斷標志位
    while(1)
    {
        SBUF=0XAA;   
        delay();
    }
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
void ser0() interrupt 4
{
    TI=0;        //清楚發(fā)送中斷標志位
}
-----------------------------------------------------------------------------------------------------------------------

單片機雙機通信
通常單片機通信有以下四種實現(xiàn)方式:
TTL電平通信
RS-232C通信
RS-422A通信
RS-485通信

TTL電平通信:


RS-232C通信:


RS-422A通信
RS-422A驅(qū)動器為雙端驅(qū)動器,其中一條線的邏輯為1,另一條線就為0,
具抗干擾型,能夠200mv以上的電位差,
傳輸速率90Kbps,傳輸距離可達1200m,接口電路如下:(全雙工)


RS-485通信
RS-485是RS-422A的變種,422A是全雙工,485為半雙工,
最多可使用32對差分器。如在一個網(wǎng)絡中連接超過32個,還可使用中繼器。
引起傳輸線采用差動信號,所以抗干擾性好,傳輸速率可達1Mbps,接口如下:


多機通信
采用主從結(jié)構(gòu),在整個系統(tǒng)中,有且僅有一個主機,其余全是從機,多機通信所應遵循的原則如下:
A.所有從機的SM2=1;處于接收地址幀狀態(tài)
B.主機發(fā)送一地址幀,其中8位是地址,第9位是地址/數(shù)據(jù)區(qū)分標志,該位置1表示地址幀。
所有從機收到地址幀后,與本季的地址比較,對于地址相符的從機,
是自己的SM2置0(已接收主機隨后發(fā)來的數(shù)據(jù)幀),并把本機地址發(fā)回主機作為應答,
對于地址不符的,仍保持SM2=1,對主機隨后發(fā)來的數(shù)據(jù)幀不予理睬.

C.從機發(fā)送數(shù)據(jù)結(jié)束后,要發(fā)送一幀校驗和,并置第9位(TB8)為1,作為從機數(shù)據(jù)結(jié)束的標志。
D.主機驗證數(shù)據(jù)時,先判斷數(shù)據(jù)接收標志(RB8),若RB8=1;表示數(shù)據(jù)傳送結(jié)束,并比較此幀校驗和,
若正確則會送正確信號00H,命令該從機復位(即重新等待地址幀)。
若校驗和出錯,則發(fā)送0FFH,命令該從機重發(fā)數(shù)據(jù)。
若接受偵的RB8=0;則將數(shù)據(jù)存到緩存區(qū),并準備接收下一幀信息。

E.主機接到從機應答地址后,確認地址是否相符,如果地址不符,
則發(fā)復位信號(數(shù)據(jù)幀中TB8=1),如果地址相符,則TB8清0,開始發(fā)送數(shù)據(jù)。

從機收到復位命令后,會到監(jiān)聽地址狀態(tài)(SM2=1),否則開始接收數(shù)據(jù)和命令。
編程時,可按以下方式操作:
主機發(fā)送的地址聯(lián)絡信號為00H,01H,02H,...(即從機設備地址);地址FFH為命令各從機復位,即回復SM2=1;
主機命令編碼如下:
01H:主機命令從機接收數(shù)據(jù);
02H:主機命令從機發(fā)送數(shù)句;
若有其他數(shù)據(jù),則都按02H對待。

從機狀態(tài)字格式如圖:

若ERR =1;從機收到非法命令。
若TRDY=1;從機發(fā)送準備就緒
若RRDY=1;從機接收準備就緒

通常,從機以中斷方式控制和主機通訊。

多機通信主機流程圖如下:


程序代碼如下:
-----------------------------------------------------------------------------------------------------------------------
#include
#define  uchar unsigned char
#define uint unsigned int
#define SLAVE 0X02   //從機地址
#define  NB 16

uchar rbuf[16];
uchar code tbuf[16]={"master transmit"};

void err()
{
    SBUF=0XFF;
    while(!TI=1);
    TI=0;
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
uchar master(uchar add,uchar com)
{
    while(1)
    {
        SBUF=SLAVE;            //發(fā)呼叫地址
        while(!TI=1);
        TI=0;
        while(!RI=1);
        RI=0;                //等待從機應答
        if(SBUF!=add)
        {
            err();            //地址錯誤,發(fā)復位信號
        }         
        else                //地址相符
        {
            TB8=0;            //清地址標志
            SBUF=cmd;        //發(fā)命令
            while(!TI=1);
            TI=0;
            while(!RI=1);
            RI=0;
            aa=SBUF;        //接收狀態(tài)
            if(aa&0x08==0x08)        //若命令未被接收,發(fā)復位信號
            {
                TB8=1;
                err();
            }
            else
            {
                if(cmd==0X01)          //發(fā)送命令
                {
                    if(aa&0x01==0x01)     //從機準備好接受
                    {
                        do
                        {
                            p=0;              //清校驗和
                            for(i=0;i
                            {
                                SBUF=tbuf[i];    //發(fā)送一數(shù)據(jù)
                                p+=tbuf[i];
                                while(!TI=1);
                                TI=0;
                            }
                            SBUF=p;            //發(fā)送檢驗和
                            while(!TI=1);
                            TI=0;
                            while(!RI=1);
                            RI=0;
                        }
                        while(SBUF!=0);        //接收不正確,重新發(fā)送
                        TB8=1;                //置地址標志
                        return(0);
                    }
                    else
                    if(aa&0x02==0x02)        //是接收命令,從機準備好發(fā)送
                    {
                        while(1)
                        {
                            p=0;        //清檢驗和
                            for(i=0;i
                            {
                                while(!RI=1);
                                RI=0;
                                rbuf[i]=SBUF;        //接收一數(shù)據(jù)
                                p+=rbuf[i];
                            }
                            while(!RI=1);
                            RI=0;
                            if(SBUF==p)
                            {
                                SBUF=0x00;            //校驗和相同發(fā)0X00
                                while(!TI=1);
                                TI=0;
                                break;
                            }
                            else
                            {
                                SBUF=0xFF;
                                while(!TI=1);
                                TI=0;
                            }
                        }
                        TB8=1;              //置地址標志
                        return(0);
                    }
                }

            }
        }
    }

}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
void main()
{
    TMOD=0x20;    //T/C1定義為方式2
    TL1=0XFD;    //置初值
    TH1=0XFD;
    PCON=0X00;
    TR1=1;
    SCON=0XF0;    //串行口方式3
    master(SLAVE,0x01);
    master(SLAVE,0X02);
    while(1);
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
多機通信從機流程圖:


程序如下:
-----------------------------------------------------------------------------------------------------------------------
#include
#define uchar unsigned char
#define uint unsigned int
#define  SLAVE 0X02
#define BN  16

uchar trbuf[16];
uchar rebuf[16];
bit tready;
bit rready;

void str(void);
void sre(void);

void main()
{
     TMOD=0x20;            //T/C1定義為方式2
    TH1=0XFD;
    TL1=0XFD;
    PCON=0X00;
    TR1=1;
    SCON=0XF0;
    ES=1;     //開串行口中斷
    EA=1;     //開總中斷

    while(1)
    {
        tready=1;
        rready=1;   
    }         //假定準備好發(fā)送和接受
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
void ssio(void) interrupt 4
{
    uchar a;
    RI=0;
    ES=0;
    if(SBUF!=SLAVE)
    {
        ES=1;
        goto reti;
    }                      //非本機地址繼續(xù)監(jiān)聽
    SM2=0;                //取消監(jiān)聽狀態(tài)
    SBUF=SLAVE;            //從本地址發(fā)回
    while(!TI=1);
    TI=0;
    while(!RI=1);
    RI=0;
    if(RB8=1)
    {
        SM2=1;
        ES=1;
        goto reti;
    }                      //是復位信號,恢復監(jiān)聽
    a=SBUF;                //接收命令
    if(a==0X01)
    {
        if(rready=1)
            SBUF=0X01;        //接收準備好發(fā)狀體
        else
            SBUF=0X00;
        while(!TI=1);
        TI=0;
        while(!RI=1);
        RI=0;
        if(RB8==1)
        {
            SM2=1;
            ES=1;
            goto reti;
        }
        sre();            //接收數(shù)據(jù)
    }
    else
    {
        if(a==0X02)            //從機向主機發(fā)送數(shù)據(jù)
        {
            if(tready=1)
                SBUF=0X02;        //發(fā)送準備好發(fā)狀體
            else
                SBUF=0X00;
            while(!TI=1);
            TI=0;
            while(!RI=1);
            RI=0;
            if(RB8==1)
            {
                SM2=1;
                ES=1;
                goto reti;
            }
            str();            //發(fā)送數(shù)據(jù)
        }
        else
        {
            SBUF=0X80;            //命令非法,發(fā)狀態(tài)
            while(!TI=1);
            TI=0;
            SM2=1;
            ES=1;             //恢復監(jiān)聽
        }   
    }
    reti;
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
void str(void)            //發(fā)送數(shù)據(jù)塊
{
    uchr p,i;
    tready=0;
    do
    {
        p=0;        //清校驗和
        for(i=0;i
        {
            SBUF=trbuf[i];            //發(fā)送一數(shù)據(jù)
            p+=trbuf[i];
            while(!TI=1);
            TI=0;
        }
        SBUF=p;             //發(fā)送校驗和
        while(!TI=1);
        TI=0;
        while(!RI=1);
        RI=0;
    }while(SBUF!=0);        //主機接收不正確,從新發(fā)送
    SM2=1;
    ES=1;   
}
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------
void sre(void)                  //接收數(shù)據(jù)塊
{
    uchr p,i;
    rready=0;
    while(1)
    {
        p=0;        //清校驗和
        for(i=0;i
        {
            while(!RI=1);
            RI=0;
            rebuf[i]=SBUF;        //接收數(shù)據(jù)
            p+=rebuf[i];
        }
        while(!RI=1);
        RI=0;
        if(SBUF==p)
        {
            SBUF=0X00;
            break;
        }          //校驗和相同發(fā)00
        else
        {
            SBUF=0XFF;           //校驗值不同發(fā)0FF,重新接收
            while(!TI=1);
            TI=0;
        }
    }
    SM2=1;
    ES=1;       
}
-----------------------------------------------------------------------------------------------------------------------

以上是51串口的通訊的協(xié)議內(nèi)容,也可以說是串口通訊協(xié)議。其與Uart等具有相同的傳輸性質(zhì):雙向傳輸,全雙工!

聯(lián)系方式0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

平和县| 当阳市| 内乡县| 南康市| 观塘区| 南丰县| 左贡县| 岳阳市| 龙州县| 和林格尔县| 余干县| 苍梧县| 五峰| 裕民县| 阿克苏市| 临安市| 通化县| 敖汉旗| 什邡市| 乐安县| 巍山| 宜昌市| 呼和浩特市| 裕民县| 宜章县| 兴国县| 甘德县| 山东省| 香格里拉县| 贵港市| 南宫市| 郸城县| 乐至县| 翁牛特旗| 祁阳县| 云阳县| 藁城市| 开鲁县| 澎湖县| 府谷县| 石景山区|