0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

51單片機(jī)多機(jī)通信原理

GReq_mcu168 ? 來源:未知 ? 作者:胡薇 ? 2018-05-15 09:51 ? 次閱讀

一、多機(jī)通信原理

在多機(jī)通信中,主機(jī)必須要能對各個(gè)從機(jī)進(jìn)行識別,在51系列單片機(jī)中可以通過SCON寄存器的SM2位來實(shí)現(xiàn)。當(dāng)串口以方式2或方式3發(fā)送數(shù)據(jù)時(shí),每一幀信息都是11位,第9位是數(shù)據(jù)可編程位,通過給TB8置1或置0來區(qū)別地址幀和數(shù)據(jù)幀,當(dāng)該位為1時(shí),發(fā)送地址幀;該位為0時(shí),發(fā)送數(shù)據(jù)幀。

在多機(jī)通信過程中,主機(jī)先發(fā)送某一從機(jī)的地址,等待從機(jī)的應(yīng)答,所有的從機(jī)接收到地址幀后與本機(jī)地址進(jìn)行比較,若相同,則將SM2置0準(zhǔn)備接收數(shù)據(jù);若不同,則丟棄當(dāng)前數(shù)據(jù),SM2位不變。

二、多機(jī)通信電路圖

51單片機(jī)多機(jī)通信原理

此處,U1作為主機(jī),U2為從機(jī)1,U3為從機(jī)2。

三、C語言程序

(1)主機(jī)程序

#include#include

#define _SUCC_0x0f//數(shù)據(jù)傳送成功#define _ERR_0xf0//數(shù)據(jù)傳送失敗unsigned char Table[9]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};unsigned char Buff[20];//數(shù)據(jù)緩沖區(qū)unsigned char temp=0xff;sbit KEY1=P1^6;sbit KEY2=P1^7;//unsigned char addr;

//延時(shí)1ms函數(shù)void delay_1ms(unsigned int t){unsigned int x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}//緩沖區(qū)初始化void Buff_init(){unsigned char i;//將Table里的數(shù)據(jù)放到緩沖區(qū)里for(i=0;i<9;i++)???{??Buff[i]= Table[i];??delay_1ms(100);?}?}//串口初始化函數(shù)void serial_init(){?TMOD=0x20;?//定時(shí)器1工作于方式2?TH1=0xfd;???TL1=0xfd;?//波特率為9600?PCON=0;?SCON=0xd0;??//串口工作于方式3?TR1=1;??//開啟定時(shí)器?TI=0;?RI=0;}//發(fā)送數(shù)據(jù)函數(shù)void SEND_data(unsigned char *Buff){?unsigned char i;?unsigned char lenth;?unsigned char check;?lenth=strlen(Buff);??????//計(jì)算數(shù)據(jù)長度?check=lenth;

TI=0;//發(fā)送數(shù)據(jù)長度TB8=0;//發(fā)送數(shù)據(jù)幀SBUF=lenth;while(!TI);TI=0;for(i=0;i;i++)>

TB8=0;//發(fā)送校驗(yàn)字節(jié)SBUF=check;while(!TI);TI=0;}//向指定從機(jī)地址發(fā)送數(shù)據(jù)void ADDR_data(unsigned addr){while(temp!=addr)//主機(jī)等待從機(jī)返回其地址作為應(yīng)答信號{TI=0;//發(fā)送從機(jī)地址TB8=1;//發(fā)送地址幀SBUF=addr;while(!TI);TI=0;RI=0;while(!RI);temp=SBUF;RI=0;}

temp=_ERR_;//主機(jī)等待從機(jī)數(shù)據(jù)接收成功信號while(temp!=_SUCC_){SEND_data(Buff);RI=0;while(!RI);temp=SBUF;RI=0;}}

void main(){Buff_init();serial_init();while(1){if(KEY1==0){delay_1ms(5);if(KEY1==0){while(!KEY1);ADDR_data(0x01);}}if(KEY2==0){delay_1ms(5);if(KEY2==0){while(!KEY2);ADDR_data(0x02);}}

}}

(2)從機(jī)1程序

#include#include

#define addr0x01//從機(jī)1的地址#define _SUCC_0x0f//數(shù)據(jù)傳送成功#define _ERR_0xf0//數(shù)據(jù)傳送失敗unsigned char aa=0xff;//主機(jī)與從機(jī)之間通信標(biāo)志unsigned char Buff[20];//數(shù)據(jù)緩沖區(qū)

//串口初始化函數(shù)void serial_init(){TMOD=0x20;//定時(shí)器1工作于方式2TH1=0xfd;TL1=0xfd;//波特率為9600PCON=0;SCON=0xd0;//串口工作于方式3TR1=1;//開啟定時(shí)器TI=0;RI=0;}//接收數(shù)據(jù)函數(shù)unsigned char RECE_data(unsigned char *Buff){unsigned char i,temp;unsigned char lenth;unsigned char check;

RI=0;//接收數(shù)據(jù)長度while(!RI);if(RB8==1)//若接收到地址幀,則返回0xfereturn 0xfe;lenth=SBUF;RI=0;check=lenth;for(i=0;i;i++)>

while(!RI);//接收校驗(yàn)字節(jié)if(RB8==1)//若接收到地址幀,則返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check;//將從主機(jī)接收到的校驗(yàn)碼與自己計(jì)算的校驗(yàn)碼比對if(check!=0)//校驗(yàn)碼不一致,表明數(shù)據(jù)接收錯(cuò)誤,向主機(jī)發(fā)送錯(cuò)誤信號,函數(shù)返回0xff{TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0;//校驗(yàn)碼一致,表明數(shù)據(jù)接收正確,向主機(jī)發(fā)送成功信號,函數(shù)返回0x00TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}

void main(){serial_init();while(1){SM2=1;//接收地址幀while(aa!=addr)//從機(jī)等待主機(jī)請求自己的地址{RI=0;while(!RI);aa=SBUF;RI=0;}

TI=0;//一旦被請求,從機(jī)返回自己的地址作為應(yīng)答,等待接收數(shù)據(jù)TB8=0;SBUF=addr;while(!TI);TI=0;

SM2=0;//接收數(shù)據(jù)幀aa=0xff;//從機(jī)接收數(shù)據(jù),并將數(shù)據(jù)保存到數(shù)據(jù)緩沖區(qū)while(aa==0xff){aa=RECE_data(Buff);}if(aa==0xfe)continue;P1=Buff[1];//查看接收到的數(shù)據(jù)}}

(3)從機(jī)2程序

#include#include

#define addr0x02//從機(jī)2的地址#define _SUCC_0x0f//數(shù)據(jù)傳送成功#define _ERR_0xf0//數(shù)據(jù)傳送失敗unsigned char aa=0xff;//主機(jī)與從機(jī)之間通信標(biāo)志unsigned char Buff[20];//數(shù)據(jù)緩沖區(qū)

//串口初始化函數(shù)void serial_init(){TMOD=0x20;//定時(shí)器1工作于方式2TH1=0xfd;TL1=0xfd;//波特率為9600PCON=0;SCON=0xd0;//串口工作于方式3TR1=1;//開啟定時(shí)器TI=0;RI=0;}//接收數(shù)據(jù)函數(shù)unsigned char RECE_data(unsigned char *Buff){unsigned char i,temp;unsigned char lenth;unsigned char check;

RI=0;//接收數(shù)據(jù)長度while(!RI);if(RB8==1)//若接收到地址幀,則返回0xfereturn 0xfe;lenth=SBUF;RI=0;check=lenth;for(i=0;i;i++)>

while(!RI);//接收校驗(yàn)字節(jié)if(RB8==1)//若接收到地址幀,則返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check;//將從主機(jī)接收到的校驗(yàn)碼與自己計(jì)算的校驗(yàn)碼比對if(check!=0)//校驗(yàn)碼不一致,表明數(shù)據(jù)接收錯(cuò)誤,向主機(jī)發(fā)送錯(cuò)誤信號,函數(shù)返回0xff{TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0;//校驗(yàn)碼一致,表明數(shù)據(jù)接收正確,向主機(jī)發(fā)送成功信號,函數(shù)返回0x00TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}

void main(){serial_init();while(1){SM2=1;//接收地址幀while(aa!=addr)//從機(jī)等待主機(jī)請求自己的地址{RI=0;while(!RI);aa=SBUF;RI=0;}

TI=0;//一旦被請求,從機(jī)返回自己地址作為應(yīng)答,等待接收數(shù)據(jù)TB8=0;SBUF=addr;while(!TI);TI=0;

SM2=0;//接收數(shù)據(jù)幀aa=0xff;//從機(jī)接收數(shù)據(jù),并將數(shù)據(jù)保存到數(shù)據(jù)緩沖區(qū)while(aa==0xff){aa=RECE_data(Buff);}if(aa==0xfe)continue;P1=Buff[2];//查看接收到的數(shù)據(jù)}}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 51單片機(jī)
    +關(guān)注

    關(guān)注

    276

    文章

    5707

    瀏覽量

    125751
  • 多機(jī)通信
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    9259

原文標(biāo)題:51單片機(jī)多機(jī)通信

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    51單片機(jī)機(jī)通信問題

    求教各位大哥,我想用幾塊51單片機(jī)實(shí)現(xiàn)一對通信,一個(gè)主機(jī)多個(gè)從機(jī),但是有一個(gè)問題,單片機(jī)連接的
    發(fā)表于 02-29 17:28

    51單片機(jī)機(jī)通信問題

    本人剛接觸單片機(jī)串口通信,雙機(jī)通信可以實(shí)現(xiàn),但是機(jī)通信就搞不懂了,看了很多資料還是不明白,在此
    發(fā)表于 04-21 12:23

    基于51單片機(jī)機(jī)通信的設(shè)計(jì)+源代碼

    通信的電器特性、邏輯電平和各種信息都有其自身的特點(diǎn)。89C51 系列單片機(jī)之間通過多機(jī)通信進(jìn)行數(shù)據(jù)交換時(shí),將串口設(shè)置為工作方式2 或者3,數(shù)
    發(fā)表于 03-10 21:49

    簡述51單片機(jī)機(jī)通信的特點(diǎn)

    簡述51單片機(jī)機(jī)通信的特點(diǎn),一、題目要求使用51單片機(jī)
    發(fā)表于 07-20 07:48

    PC機(jī)MCS-51單片機(jī)間的串行通信設(shè)計(jì)?

    【摘 要】 主要講解了IBM-PC機(jī)與MCS-51單片機(jī)機(jī)系統(tǒng)的通信原理,給出了其硬件接口框圖
    發(fā)表于 05-16 19:43 ?1977次閱讀
    PC<b class='flag-5'>機(jī)</b>與<b class='flag-5'>多</b>MCS-<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>間的串行<b class='flag-5'>通信</b>設(shè)計(jì)?

    51單片機(jī)機(jī)通信過程

    發(fā)表于 12-31 11:55 ?52次下載

    單片機(jī)之間機(jī)通信演示電路設(shè)計(jì)

    本文介紹的是基于單片機(jī)的串行通信演示電路系統(tǒng)設(shè)計(jì)。本設(shè)計(jì)研究的是三個(gè)AT89C51單片機(jī)通過串行通信技術(shù)實(shí)現(xiàn)相互之間的
    發(fā)表于 04-14 16:53 ?1次下載

    機(jī)通信單片機(jī)和pc

    機(jī)通信單片機(jī)和pc
    發(fā)表于 11-04 11:38 ?7次下載

    8031單片機(jī)機(jī)系統(tǒng)的實(shí)時(shí)通信

    隨著單片機(jī)技術(shù)的發(fā)展,其應(yīng)用已從單機(jī)逐漸轉(zhuǎn)向機(jī)或聯(lián)網(wǎng).而機(jī)應(yīng)用的關(guān)鍵在于相互的通信、互傳數(shù)據(jù)
    發(fā)表于 02-02 16:46 ?0次下載

    如何使用51單片機(jī)進(jìn)行機(jī)通信的資料和程序及電路圖免費(fèi)下載

    51 單片機(jī)機(jī)通信,有些特殊。它專有一個(gè)控制位 SM2 。當(dāng)把 SM2 設(shè)置為 1 后,單片機(jī)
    發(fā)表于 08-13 17:32 ?8次下載
    如何使用<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>進(jìn)行<b class='flag-5'>多</b><b class='flag-5'>機(jī)</b><b class='flag-5'>通信</b>的資料和程序及電路圖免費(fèi)下載

    單片機(jī)機(jī)通信系統(tǒng)的設(shè)計(jì)

    當(dāng)51單片機(jī)進(jìn)行機(jī)通信時(shí),串口要工作在方式2和方式3。假設(shè)當(dāng)前
    發(fā)表于 07-11 15:04 ?4510次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>多</b><b class='flag-5'>機(jī)</b><b class='flag-5'>通信</b>系統(tǒng)的設(shè)計(jì)

    MCS-51單片機(jī)機(jī)通信的工作原理解析

    串行口以方式2或方式3接收時(shí),若SM2為1,則僅當(dāng)接收到的第9位數(shù)據(jù)RB8為1時(shí),數(shù)據(jù)才裝入SBUF,置位RI,請求CPU對數(shù)據(jù)進(jìn)行處理;如果接收到的第9位數(shù)據(jù)RB8為0,則不產(chǎn)生中斷標(biāo)志RI,信息丟失,CPU不作任何處理。
    發(fā)表于 10-22 16:18 ?1.3w次閱讀
    MCS-<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>多</b><b class='flag-5'>機(jī)</b><b class='flag-5'>通信</b>的工作原理解析

    51單片機(jī)串口通信

    51單片機(jī)串口通信文章目錄51單片機(jī)串口通信串口介紹硬件電路電平標(biāo)準(zhǔn)常見
    發(fā)表于 11-18 14:06 ?22次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>串口<b class='flag-5'>通信</b>

    51單片機(jī)串口通信

    51單片機(jī)串口通信文章目錄51單片機(jī)串口通信串口介紹硬件電路電平標(biāo)準(zhǔn)常見
    發(fā)表于 11-21 20:36 ?64次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>串口<b class='flag-5'>通信</b>

    關(guān)于51單片機(jī)機(jī)通信競賽實(shí)驗(yàn)

    發(fā)表于 08-24 09:01 ?0次下載
    關(guān)于<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>多</b><b class='flag-5'>機(jī)</b><b class='flag-5'>通信</b>競賽實(shí)驗(yàn)