免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
RS232串口多機(jī)通信
 基本原理

1、主從多機(jī)通信拓?fù)鋱D

2、主從多機(jī)通信的具體過程 

1)使所有的從機(jī)的SM2位置1,以便接收主機(jī)發(fā)來的地址;
2)主機(jī)發(fā)出一幀地址信息,其中包括8位需要與之通信的從機(jī)地址,第9位為1;
3)所有從機(jī)接收到地址幀后,各自將所接收到的地址與本機(jī)地址比較,對(duì)于地址相同的從機(jī),使SM2位清零以接收主機(jī)隨后發(fā)來的所有信息。對(duì)于地址不符合的從機(jī),仍保持SM2=1的狀態(tài),對(duì)主機(jī)隨后發(fā)來的數(shù)據(jù)不予理睬,直至發(fā)送新的地址幀;
4)主機(jī)給已被尋址的從機(jī)發(fā)送控制命令和數(shù)據(jù)(數(shù)據(jù)幀的第9位為0);
5)本次通信結(jié)束后,從機(jī)重置SM2=1,主機(jī)可再尋址其它從機(jī)。

 主從模式

首先要設(shè)定工作方式3:(主從模式+波特率可變)

SCON位定義:

SCON串口功能寄存器:SM0=1;SM1=1(工作方式3)

注:主機(jī)和從機(jī)都要為工作方式3。

1、工作方式2 (SM0 SM1 :1 0):

串行口為11位異步通信接口。發(fā)送或接收一幀信息包括1位起始位“0”、8位數(shù)據(jù)位、1位可編程位、1位停止位“1”。

發(fā)送數(shù)據(jù):發(fā)送前,先根據(jù)通信協(xié)議由軟件設(shè)置TB8為“奇偶校驗(yàn)位”或“數(shù)據(jù)標(biāo)識(shí)位”,然后將要發(fā)送的數(shù)據(jù)寫入SBUF,即能啟動(dòng)發(fā)送器。

發(fā)送過程是由執(zhí)行任何一條以SBUF為目的寄存器的指令而啟動(dòng)的,把8位數(shù)據(jù)裝入SBUF,同時(shí)還把TB8裝到發(fā)送移位寄存器的第9位上,然后從TXD(P3.1)端口輸出一幀數(shù)據(jù)。

接收數(shù)據(jù):先置REN=1,使串行口為允許接收狀態(tài),同時(shí)還要將RI清“0”。然后再根據(jù)SM2的狀態(tài)和所接收到的RB8的狀態(tài)決定此串行口在信息到來后是否置R1=1,并申請(qǐng)中斷,通知CPU接收數(shù)據(jù)。

當(dāng)SM2=0時(shí),不管RB8為“0”還是為“1”,都置RI=1,此串行口將接收發(fā)送來的信息。當(dāng)SM2=1時(shí),且RB8=1,表示在多機(jī)通信情況下,接收的信息為“地址幀”, 此時(shí)置RI=1,串行口將接收發(fā)來的地址。

當(dāng)SM2=1時(shí),且RB8=0,表示在多機(jī)通信情況下,接收的信息為“數(shù)據(jù)幀”, 但不是發(fā)給本從機(jī)的,此時(shí)RI不置為“1”,因而SBUF中接收的數(shù)據(jù)幀將丟失。

2、工作方式3 (SM0 SM1 :1 1):

為波特率可變的11位異步通信方式,除了波特率有所區(qū)別之外,其余方式都與方式2相同。


 代碼編寫

1、主機(jī).

1)主機(jī)的配置發(fā)送“地址”時(shí),把TB8設(shè)定為1,發(fā)送數(shù)據(jù)時(shí)TB8設(shè)定為0;

2)主機(jī)在配置SCON寄存器時(shí),不需要配置SM2=1;該位主要用于從機(jī)接收地址和數(shù)據(jù)時(shí)的區(qū)分;

3)其發(fā)送幀結(jié)構(gòu)為:

主機(jī)的配置,及相關(guān)程序?yàn)椋?/span>

//主機(jī)為STC12C5A60S2單片機(jī),下面是初始化程序

void UART_init()

{

    TMOD =0x20; //定時(shí)器1,工作方式2:8位、自動(dòng)重裝

    PCON=0x00;//波特率不加倍$

    TH1 = 0xfd; //fd: 9600bps @ 11.0592M

    TL1 = 0xfd; //e8: 1200bps @ 11.0592M

    SCON|= 0xd8;   //串行口工作方式3        主機(jī)模式,不需設(shè)置SM2=1

    TR1 = 1; //啟動(dòng)定時(shí)器1

    ES = 1; //開串口中斷

    EA = 1; //中斷 總開關(guān)

}

//主機(jī)端發(fā)送程序,使用為串口多機(jī)通信

void TXdata(unsignedchar addr,unsigned char *str)

    TB8 = 1; //發(fā)送地址

    SBUF = addr; //把地址發(fā)送出去

    while(!TI); //判斷是否發(fā)送成功(發(fā)送成功后TI會(huì)置1,需手動(dòng)清0)

    TI = 0;!

    TB8 = 0; //發(fā)送數(shù)據(jù)

    while(*str != '\0') //發(fā)送數(shù)組

    {

        SBUF = (*str);

        while(!TI);

        TI = 0;- 

        str++;)

    }

}

//中斷程序

void UartReceive()interrupt 4 //串口中斷服務(wù)函數(shù)

{!

    ES = 0; //關(guān)閉串口中斷

    if(RI) //再次判斷,是否接收到數(shù)據(jù)(接收到數(shù)據(jù)后,RI會(huì)置1,需手動(dòng)清0)

    {

        RXData = SBUF;

            if(RXData== '*') //判斷是否接收到數(shù)據(jù)結(jié)束標(biāo)志 $

            {

               LCD_Write_String(0,0,ReceiveData);

                j_yang=0;$

            }

            else if(RXData=='#')

            {

                LCD_Write_String(0,1,ReceiveData);

                j_yang=0;

            }9 B7 W. E8 g) U3 i8 E

            else //接收到 結(jié)束標(biāo)志 $

            {

                ReceiveData[j_yang] = RXData;//沒有接收到結(jié)束標(biāo)志,正常保存數(shù)據(jù)至數(shù)組

                j_yang++;

            }

    }

    RI = 0; //清除接收標(biāo)志位

    ES = 1; //重新開啟串口中斷

}

2、從機(jī)

1)從機(jī)接收時(shí),首先串口初始化時(shí),使SM2=1(接收地址模式,即只能接收到TB8=1的數(shù)據(jù),才觸發(fā)中斷),主機(jī)發(fā)送TB8=0的數(shù)據(jù),被認(rèn)為是總線上的主機(jī)發(fā)送給別機(jī)的通信數(shù)據(jù),本機(jī)丟棄,不產(chǎn)生中斷。

2)接收的地址與本機(jī)地址相符后,使SM2=0(接收數(shù)據(jù)模式,接收數(shù)據(jù)正常觸發(fā)中斷)

從機(jī)的配置及相關(guān)程序:

//使用的單片機(jī)是STC15W4K48S4,該單片機(jī)設(shè)置獨(dú)立定時(shí)器為波特率發(fā)生器,配置程序,若是不使用此種單片機(jī)或者是此種波特率發(fā)生器,則除了SM2設(shè)置不一樣之外,其他設(shè)置與主機(jī)是一致的。

void Serial_Init()

{

    SCON = 0xf8;            //8位數(shù)據(jù),可變波特率

    AUXR = 0x14;            //允許獨(dú)立波特率發(fā)生器運(yùn)行,獨(dú)立波特發(fā)生器每1個(gè)時(shí)鐘周期記一次數(shù)

    AUXR |= 0x01;           // 獨(dú)立波特率發(fā)生器作為串口1的波特率發(fā)生器,此時(shí)定時(shí)器1得到釋放,可以作為獨(dú)立定時(shí)器使用

    T2L = (65536 - (FOSC/4/BAUD));   //設(shè)置波特率重裝值,其中FOSC為外部晶振的頻率,BAUD為定義的波特率,此處為9600

    T2H = (65536 - (FOSC/4/BAUD))>>8;

    ES = 1;                            //使能串口中斷

    EA = 1;

//中斷服務(wù)程序

void Uart(void)interrupt 4

{

    ES = 0; //關(guān)閉串口中斷

    if(RI) //再次判斷,是否接收到數(shù)據(jù)(接收到數(shù)據(jù)后,RI會(huì)置1,需手動(dòng)清0)

    {

        RXData = SBUF;)

        if(RXstart) //判斷是否接收到過本地址;

        {

            if(RXData != '*') //判斷是否接收到數(shù)據(jù)結(jié)束標(biāo)志*

            {

                ReceiveData[j_yang] = RXData; //沒有接收到結(jié)束標(biāo)志,正常保存數(shù)據(jù)至數(shù)組

                j_yang++;

            }

            else //接收到 結(jié)束標(biāo)志*

            {

                RXstart= 0; //本次接收結(jié)束

                UartSends(ReceiveData);//將接受的數(shù)據(jù)反過來發(fā)送回去

                UartSendChar('#');//默認(rèn)接收以#結(jié)束

                SM2 = 1; //重新 配置為:只接收地址模式,下次發(fā)送TB8=1才中斷

                j_yang = 0;

                Uart_flag1=1;

            }

        }

        if(RXData == 2) //判斷是否呼叫本機(jī),地址范圍:000– 254(00 - FE)

        {

            RXstart = 1; //開始接收數(shù)據(jù)

            SM2 = 0; //配置為:接收數(shù)據(jù) 模式

        }

    }

    RI = 0; //清除接收標(biāo)志位'

    ES = 1; //重新開啟串口中斷

}

 注意事項(xiàng)

1)在寫主機(jī)程序時(shí),發(fā)現(xiàn)如果不寫中斷服務(wù)程序,單片機(jī)會(huì)默認(rèn)一直發(fā)送第一個(gè)字節(jié),最后發(fā)現(xiàn)應(yīng)該是串口中斷程序影響的,沒有串口中斷就會(huì)一直發(fā)送第一個(gè)字節(jié),究其原因是數(shù)據(jù)發(fā)送完成后TI會(huì)置1,這將導(dǎo)致中斷的產(chǎn)生,一旦沒有中斷服務(wù)程序,默認(rèn)不產(chǎn)生中斷,就一直發(fā)不清零。

2)主機(jī)程序配置時(shí),不需要配置SM2,這樣從機(jī)不管是誰(shuí)發(fā)送數(shù)據(jù),主機(jī)都可以接收的到,但是是在通信的時(shí)候做區(qū)分,比如主機(jī)給從機(jī)1發(fā)消息,發(fā)送完成后,從機(jī)1立馬給主機(jī)發(fā)送請(qǐng)求的數(shù)據(jù),發(fā)送完成之后,從機(jī)再配置SM2=1,只接收地址的模式。

3)波特率一定要設(shè)置的一致,否則無法正常通信。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
串行口通信原理及操作流程
單片機(jī)之【串口】篇
51單片機(jī)串口通信波特率設(shè)置
第7章 串行口
單片機(jī)串口
單片機(jī)之串口通信
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服