導航:首頁 > 操作系統 > 多單片機通信

多單片機通信

發布時間:2022-01-29 11:22:49

㈠ 基於RS485匯流排的PC與多個單片機通信的C語言程序

這個問題很簡單,用485通訊的話,思路如下
思路:
PC方面:可以用MSCOMM控制項先發一個字元表示接收地址,後延遲1ms,(注意PC端在485通訊在字元發送過程中一定要加延遲,這是我多次測試的總結,如果是用調試助手的話,他內部代碼已經加過延遲了,就不必考慮這個問題)再發控制指令,初學者建議直接用調試助手
單片機方面:首先對接收數據進行核對,如果不是本地地址,放棄,如果是本地地址,在檢測命令是否正確,如果正確,做出處理後返回PC本地地址並發送命令
我舉個例子教你怎麼玩多站通訊,下面是我已經通過測試的一個程序
#include <reg51.h> //選用晶振11.0592MHz
#include <absacc.h>
#define DATA51 DBYTE[0x80] //80H存數據
#define AddressID 0x31 //本機地址1
sbit RS485E=P3^7; //定義485的使能腳// RS5485E=0為接收狀態 RS5485E=1為發送狀態
sbit MAX485_DIR=P3^7;
main()
{

//****************通訊設置
SCON = 0xF0; //REN=1允許串列接受狀態,串口工作模式3,SM2=1
TMOD|= 0x20; //定時器工作方式2
PCON|= 0x80; //波特率提高一倍
IP=0x10; //串口優先順序高
// TH1 = 0xFD; //baud*2 /* reload value 19200、數據位8、停止位1。效驗位無(11.0592)
TH1 = 0xf4; //fa // //baud*2 /* 波特率4800、數據位8、停止位1。效驗位無 (11.0592M)
TL1 = 0xf4;
TR1 = 1; //開啟定時器1
EA = 1; // 開總中斷
ES = 1; //開串口中斷
RS485E=0; // RS5485E=0為接收狀態 RS5485E=1為發送狀態
while(1);
}

void counter4(void) interrupt 4 using 2 //串口中斷
{
while(RI==0);
RI=0;
if(SBUF==AddressID)
{
while(RI==0);
RI=0;
if(SBUF==0x01) //發送指令
{
MAX485_DIR=1; //開發送
SBUF=AddressID;
while(TI==0);
TI=0;
SBUF=0x6f; //發送o
while(TI==0);
TI=0;
SBUF=0x6b; //發送k
MAX485_DIR=0; //開接收
}

if(SBUF==0x00) //接收
{
//這里怎麼處理就看你自己要怎麼做了,你沒要求,我也不好怎麼寫,就自己寫吧
}
}

}
程序調試通過,可以直接套用

㈡ 單片機多機通信程序

單片機多機通信,一個主機多個從機+一個通信協議就可以了,正常的串口設置就可以,協議可以以數據包形式,如:引導符、從機號、數據長度、指令類型、數據1---數據n、校驗碼、結束符,以主機發送指令從機應答,從機間需由主機協助。

㈢ 多個單片機串口通信如何進行

利用單片機串口控制寄存器SCON中的SM2位選擇模式2或模式3可以進行多機通信,具體說是用第九位TB8和RB8來區分地址幀和數據幀,當TB8為0時發送的是數據幀,通常單片機接收到後直接拋棄,不產生中斷,當TB8為1時發送的是地址幀,單片機收到的第9位(RB8)為1時把收到的前8位地址與本機地址比對,如果相同則切換接收模式以接收接下來的數據幀,如果不同則繼續保持接收地址幀的狀態。

㈣ C51單片機多機通信C語言

單片機a,b,c.a為主機,bc為從機。a上有一個外部中斷0輸入,按第一次a的兩個LED亮500ms,再按一下,b機的兩個LED燈亮500ms,第三次按下c機的兩個LED燈亮500ms,然後周而復始。兩個數碼管分別顯示0/1/2,和abc(bc由從機反饋)

/*

主從通信基本步驟:

1.主機從機初始化為方式2或者3,從機都置SM2=1,允許中斷

2.主機置TB8=1,發送從機地址

3.所有從機均接收主機發送要定址的從機地址

4.被定址的從機確認地址後,置本機SM2=0,向主機返回地址,供主機核對

5.核對無誤後,主機向被定址的從機發送命令,通知從機接受或者發送數據。

6.本次通信結束後,主從機重置SM2=1,主機可再對其他從機定址

*/

******************************************************************

主機a:

******************************************************************

#include<reg51.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharleddata[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00};

ucharMode;

sbitP10=P1^0;

sbitP13=P1^3;

sbitP17=P1^7;

sbitP20=P2^0;

sbitP21=P2^1;

voidUART_init()

{

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

TR1=1;

SCON=0xd0;

ES=1;

EX0=1;

IT0=1;//INT0下跳觸發

EA=1;

TI=0;

}

voidDelayMs(intms)

{

uchari;

while(ms--)

for(i=0;i<120;i++);

}

voidputc_to_SerialPort(ucharc)

{

SBUF=c;

while(TI==0);

TI=0;

}

voidMasterControl(unsignedcharAddr,unsignedcharComd)

{

TB8=1;

putc_to_SerialPort(Addr);

DelayMs(50);

TB8=0;

putc_to_SerialPort(Comd);

DelayMs(50);

}

Ex0_int(void)interrupt0

{

P0=leddata[Mode];

P20=0;

if(Mode==0)

{

P2=leddata[10];

P10=0;

P13=0;

DelayMs(500);

P10=1;

P13=1;

//MasterControl('b','C');

//MasterControl('c','C');

}

elseif(Mode==1)

{

P10=1;

P13=1;

MasterControl('b','O');

//MasterControl('c','C');

}

elseif(Mode==2)

{

P10=1;

P13=1;

//MasterControl('b','C');

MasterControl('c','O');

}

Mode=(Mode+1)%3;

}

com_int(void)interrupt4

{

if(RI)

{

RI=0;

if(SBUF=='b')

{

P2=leddata[11];

}

if(SBUF=='c')

{

P2=leddata[12];

}

}

}

voidmain(void)

{

P0=0x00;

P1=0xff;

P2=0x00;

UART_init();

Mode=0;

while(1);

}

******************************************************************

從機b:

******************************************************************

#include<reg51.h>

#defineucharunsignedchar

ucharRecData;

sbitP10=P1^0;

sbitP13=P1^3;

voidUART_init()

{

TMOD=0x21;

TH1=0xfd;

TL1=0xfd;

TR1=1;

SCON=0xf0;

ES=1;

PS=1;

EA=1;

}

voidDelayMs(intms)

{

uchari;

while(ms--)

for(i=0;i<120;i++);

}

voidputc_to_SerialPort(ucharc)

{

SBUF=c;

while(TI==0);

TI=0;

}

com_int(void)interrupt4

{

if(RI)

{

RecData=SBUF;

RI=0;

if(RB8==1)//地址

{

if(RecData=='b')//是自己的地址,置SM2=0,准備接受數據

{

SM2=0;

putc_to_SerialPort('b');

}

else//不是自己的地址

{

SM2=1;

}

}

if(RB8==0)//數據

{

if(RecData=='O')

{

P10=0;

P13=0;

DelayMs(500);

P10=1;

P13=1;

}

if(RecData=='C')

{

P10=1;

P13=1;

}

SM2=1;

}

}

}

voidmain(void)

{

P0=0xff;

P1=0xff;

UART_init();

while(1);

}

******************************************************************

從機c:

******************************************************************

#include<reg51.h>

#defineucharunsignedchar

ucharRecData;

sbitP10=P1^0;

sbitP13=P1^3;

voidUART_init()

{

TMOD=0x21;

TH1=0xfd;

TL1=0xfd;

TR1=1;

SCON=0xf0;

ES=1;

PS=1;

EA=1;

}

voidDelayMs(intms)

{

uchari;

while(ms--)

for(i=0;i<120;i++);

}

voidputc_to_SerialPort(ucharc)

{

SBUF=c;

while(TI==0);

TI=0;

}

com_int(void)interrupt4

{

if(RI)

{

RecData=SBUF;

RI=0;

if(RB8==1)//地址

{

if(RecData=='c')//是自己的地址,置SM2=0,准備接受數據

{

SM2=0;

putc_to_SerialPort('c');

}

else//不是自己的地址

{

SM2=1;

}

}

if(RB8==0)//數據

{

if(RecData=='O')

{

P10=0;

P13=0;

DelayMs(500);

P10=1;

P13=1;

SM2=1;

}

if(RecData=='C')

{

P10=1;

P13=1;

SM2=1;

}

}

}

}

voidmain(void)

{

P0=0xff;

P1=0xff;

UART_init();

while(1);

}

㈤ 單片機多機通信是怎麼回事

單片機多機通信很復雜的,給你解釋下原理,其他的自己到網上去搜下資料,看下程序就可以理解了的。我們學的是51單片機,我就給你說51單片機的通信原理哈!
51單片機具有多機通信的功能,可實現一台主機於多台從機的通信。
多機通信充分利用了單片機內部的多機通信控制位SM2。當從機SM2=1時,從機只接收主機發出的
地址幀(第九位為1),對數據幀(第九位為0)不予理睬;而當SM2=0時,可接收主機發送過來的所有信息。
多機通信的過程如下:
(1)所有從機SM2均置1,處於只接收地址幀狀態。
(2)主機先發送一個地址幀,其中前8位數據表示地址,第9位為1表示該幀為地址幀。
(3)所有從機接收到地址幀後,進行中斷處理,把接收到的地址與自身地址相比較。地址相符時將SM2清成0,脫離多機狀態,地址不相符的從機不作任何處理,即保持SM2=1。
(4)地址相符的從機SM2=0,可以接收到主機隨後發來的信息,即主機發送的所有信息。收到信息TB8=0,則表示是數據幀,而對於地址不符的從機SM2=1,收到信息TB8=0,則不予理睬,這樣就實現了主機與地址相符的從機之間的雙機通信。
(5)被定址的從機通信結束後置SM2=1,恢復多機通信系統原有的狀態。

㈥ 單片機多機通信有哪些方式呢

主要看距離,板內有iic,spi等,板外can,usb,乙太網。。。

㈦ 51單片機多機通信

樓主先解決雙機通信的函數。

樓主把雙機通信函數,顯示出來,之後,
大家幫你,稍稍改一改,就是多機通信的函數了。

㈧ 關於單片機的多機通信

描述一下硬體連接情況,是在同一組通訊線上還是分兩組通訊線實現1主2從?
如果是通訊匯流排分掛從機,就要將從機的串口設置成空閑地址幀方式,地址幀使用兩個停止位.讓從機在空閑狀態下對2個地址位相應,產生串口服務申請或者中斷.被叫從機發現於自己地址一致就會應,並建立一個停止位的通訊連接.地址不一致的從機同時也收到了地址呼叫,只是因為不是自己而不再響應,直到下一個地址幀到來.如果是這樣,請在從機硬體的TX,RX線上傳接100歐姆電阻避免電流沖擊.
如果是分兩組通訊線,應該沒有問題的.

㈨ 單片機多機通信的基本原理

將一機設為主機,其他設為從機,將從機編號,並存起來,通信時,主機若要對所有機器通信,剛發出一個自己設定好的信號,若要對某一特定機器通信,則發出該機器的編號,各機收到通信請求命令後,將命令與自己存的編號對比,看主機是不是要與本機通信,若是,接收後邊的信號,若不是,則不接收!

㈩ 單片機通信方式有幾種

要看你用的是那個單片機
常用的有UART,SPI,I2C等
也可並行通訊,也可以自定義協議
完全取決於你的應用

閱讀全文

與多單片機通信相關的資料

熱點內容
程序員轉正 瀏覽:208
應用隱私加密忘記密碼怎麼辦 瀏覽:683
2g視頻怎麼壓縮 瀏覽:609
康佳電視伺服器異常怎麼解決 瀏覽:840
怎麼用c語言編譯簡單的小游戲 瀏覽:814
伺服器如何以域用戶登錄 瀏覽:602
安卓os14怎麼默認桌面 瀏覽:549
應用市場下載在哪個文件夾 瀏覽:895
安卓上的谷歌地圖怎麼用 瀏覽:183
安卓命令行打包 瀏覽:516
編程文字與數字教學視頻 瀏覽:817
如何看手機號碼注冊哪些app 瀏覽:413
linux查看總內存 瀏覽:852
python進程間共享 瀏覽:438
js如何獲取本地伺服器地址 瀏覽:70
gfx什麼時候支持安卓十一系統 瀏覽:942
壓縮機90兆帕 瀏覽:932
程序員調侃語句 瀏覽:583
不是php函數的是 瀏覽:1002
壓縮文件好處 瀏覽:787