一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

51單片機多機通信原理

GReq_mcu168 ? 來源:未知 ? 作者:胡薇 ? 2018-05-15 09:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、多機通信原理

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

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

二、多機通信電路圖

51單片機多機通信原理

此處,U1作為主機,U2為從機1,U3為從機2。

三、C語言程序

(1)主機程序

#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;

//延時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;?//定時器1工作于方式2?TH1=0xfd;???TL1=0xfd;?//波特率為9600?PCON=0;?SCON=0xd0;??//串口工作于方式3?TR1=1;??//開啟定時器?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);??????//計算數(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ā)送校驗字節(jié)SBUF=check;while(!TI);TI=0;}//向指定從機地址發(fā)送數(shù)據(jù)void ADDR_data(unsigned addr){while(temp!=addr)//主機等待從機返回其地址作為應(yīng)答信號{TI=0;//發(fā)送從機地址TB8=1;//發(fā)送地址幀SBUF=addr;while(!TI);TI=0;RI=0;while(!RI);temp=SBUF;RI=0;}

temp=_ERR_;//主機等待從機數(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)從機1程序

#include#include

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

//串口初始化函數(shù)void serial_init(){TMOD=0x20;//定時器1工作于方式2TH1=0xfd;TL1=0xfd;//波特率為9600PCON=0;SCON=0xd0;//串口工作于方式3TR1=1;//開啟定時器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);//接收校驗字節(jié)if(RB8==1)//若接收到地址幀,則返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check;//將從主機接收到的校驗碼與自己計算的校驗碼比對if(check!=0)//校驗碼不一致,表明數(shù)據(jù)接收錯誤,向主機發(fā)送錯誤信號,函數(shù)返回0xff{TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0;//校驗碼一致,表明數(shù)據(jù)接收正確,向主機發(fā)送成功信號,函數(shù)返回0x00TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}

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

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

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

(3)從機2程序

#include#include

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

//串口初始化函數(shù)void serial_init(){TMOD=0x20;//定時器1工作于方式2TH1=0xfd;TL1=0xfd;//波特率為9600PCON=0;SCON=0xd0;//串口工作于方式3TR1=1;//開啟定時器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);//接收校驗字節(jié)if(RB8==1)//若接收到地址幀,則返回0xfereturn 0xfe;temp=SBUF;RI=0;check=temp^check;//將從主機接收到的校驗碼與自己計算的校驗碼比對if(check!=0)//校驗碼不一致,表明數(shù)據(jù)接收錯誤,向主機發(fā)送錯誤信號,函數(shù)返回0xff{TI=0;TB8=0;SBUF=_ERR_;while(!TI);TI=0;return 0xff;}TI=0;//校驗碼一致,表明數(shù)據(jù)接收正確,向主機發(fā)送成功信號,函數(shù)返回0x00TB8=0;SBUF=_SUCC_;while(!TI);TI=0;return 0;}

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

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

SM2=0;//接收數(shù)據(jù)幀aa=0xff;//從機接收數(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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 51單片機
    +關(guān)注

    關(guān)注

    277

    文章

    5711

    瀏覽量

    127414
  • 多機通信
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    9294

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    51單片機通信問題

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

    51單片機通信問題

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

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

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

    簡述51單片機通信的特點

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

    PCMCS-51單片機間的串行通信設(shè)計?

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

    51單片機通信過程

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

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

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

    通信單片機和pc

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

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

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

    如何使用51單片機進行通信的資料和程序及電路圖免費下載

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

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

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

    MCS-51單片機通信的工作原理解析

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

    51單片機串口通信

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

    51單片機串口通信

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

    關(guān)于51單片機通信競賽實驗

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