1. 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);
}
2. 51單片機多機通信(跪求程序)
想伸手拿,別人給你做項目。可能做不到。。。。自己學一下,別人給出點方案是可以的
3. 單片機多機通信是怎麼回事
單片機多機通信很復雜的,給你解釋下原理,其他的自己到網上去搜下資料,看下程序就可以理解了的。我們學的是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,恢復多機通信系統原有的狀態。
4. 簡述at89s51單片機主從結構多機通信原理
簡述MCS-51系列單片機主從結構多機通信原理,設有一台主機與三台從機通信,其中一台從機通信地址號為01H,請敘述主機呼叫從機並向其傳送一個位元組數據的過程。(請給出原理圖)
答:
原理圖如上圖所示,假設主機呼叫01H從機,首先呼叫:主機發送地址幀0000 00011(TB8)此時各從機的SM2位置1,且收到的RB8=1,故激活RI。各從機將接收到的地址與地機地址比較,結果1#機被選中,則其SM2清零;0#、2#機不變。接著傳數;主機發送數據幀,×××× ××××0 ,此時1#機SM2=0, RB8=0 則激活RI,而0#,2#機SM2=1,RB8=0則不激活RI,然後數據進入1#機的緩沖區。
5. 簡述80C51單片機多機通信的特點。
多機通信是工作於方式2和方式3,SM2位主要用於方式2和方式3。接收狀態,當串列口工作於方式2或3,以及SM2=1時,只有當接收到第9位數據(RB8)為1時,才把接收到的前8位數據送入SBUF,且置位RI發出中斷申請,否則會將接受到的數據放棄。當SM2=0時,就不管第位數據是0還是1,都難得數據送入SBUF,並發出中斷申請。
工作於方式0時,SM2必須為0。
(3).REN:允許接收位。
REN用於控制數據接收的允許和禁止,REN=1時,允許接收,REN=0時,禁止接收。
(4).TB8:發送接收數據位8。
在方式2和方式3中,TB8是要發送的——即第9位數據位。在多機通信中同樣亦要傳輸這一位,並且它代表傳輸的地址還是數據,TB8=0為數據,TB8=1時為地址。
(5).RB8:接收數據位8。
在方式2和方式3中,RB8存放接收到的第9位數據,用以識別接收到的數據特徵。
(6).TI:發送中斷標志位。
可定址標志位。方式0時,發送完第8位數據後,由硬體置位,其它方式下,在發送或停止位之前由硬體置位,因此,TI=1表示幀發送結束,TI可由軟體清「0」。
(7).RI:接收中斷標志位。
可定址標志位。接收完第8位數據後,該位由硬體置位,在其他工作方式下,該位由硬體置位,RI=1表示幀接收完成。
電源管理寄存器PCON
PCON主要是為CHMOS型單片機的電源控制而設置的專用寄存器,單元地址是87H,其結構格式如下:
表2 PCON電源管理寄存器結構
PCON D7 D6 D5 D4 D3 D2 D1 D0
位符號 SMOD - - - GF1 GF0 PD IDL
在CHMOS型單片機中,除SMOD位外,其他位均為虛設的,SMOD是串列口波特率倍增位,當SMOD=1時,串列口波特率加倍。系統復位默認為SMOD=0。
6. 單片機如何實現多機串口通訊
可以選用 MCS-51 單片機。
它有多機串口通信的解決方案。
7. 用max485 51單片機多機通信問題
多機通信,不一定畫上 MAX485,直接連接,就可以實驗程序了。
前面初始化,已經是 SM2=1,只能收到 TB8=1 的數據。
所以,程序中,並不需要再判斷 RB8 是否為一。
;-------------------
if (RI) {
RI = 0;
a = SBUF;
if(a == 0x01) { // (2好從機為02)
SM2 = 0;
delay(10);
P35 = 1; //fasong
SBUF = 0x12;
while(!TI); //--樓主這里漏掉了分號
TI = 0;
P35 = 0;
SM2 = 1; //繼續設置為僅收取 TB8=1 的狀態
}
}
參考:
http://hi..com/do_sermon/item/46b7c92b103d24cea4275a77
8. MCS-51單片機的串列介面有()種工作方式其中方式()為多機通訊方式
MCS-51單片機的串列介面有(4)種工作方式其中方式(3)為多機通訊方式
8051各中斷源的中斷請求是屬於什麼級別是由(IE)寄存器的內容決定的
決定程序執行順序的寄存器是(PC),它的最大定址范圍是(64K)。PC的值是(程序運行當前)的地址。
P0口當不作系統擴展時,可作(IO)使用。當作系統擴展時,P0口擔任分時復用的匯流排口。在這種情況下,應在外部加(鎖存器)將地址數據鎖存,地址鎖存信號用(ALE)。
根據串列通信數據傳輸的方向,可將串列通信系統傳輸方式分為(單工)方式,(半雙工)方式和(全雙工)方式。
9. 試述MCS—51單片機的多機通訊原理
用串口連接,其中一個為主機,其餘為從機,所有從機的RXD都接到主機的TXD端,TXD接到主機的RXD端,所有通信都有主機來發起,從機不能主動發起通信操作,只能等待,而且從機之間通信要通過主機中轉。串列埠控制寄存器SCON要做相應的配置。
10. 簡述mcs 51單片機實現多機通信的過程
使用串口的方式 2 和方式3 ,通過使用第九數據位和內置UART0 地址識別硬體支持一個主處理器與一個或多個從處理器之間的多機通信。當主機開始一次數據傳輸時先發送一個用於選擇目標從機的地址位元組。地址位元組與數據位元組的區別是:地址位元組的第九位為邏輯1;數據位元組的第九位總是設置為邏輯0。
如果從機的SM20 位(SCON0.5)被置『1』,則只有當接收到的第九位為邏輯1(RB80=1),收到有效的停止位並且接收的數據位元組與UART0 從地址匹配時UART0 才會產生中斷。在接收地址的中斷處理程序中,從機應清除它的SM20 位以允許後面接收數據位元組時產生中斷。一旦接收完整個消息,被定址的從機應將它的SM20 位重新置『1』以忽略所有的數據傳輸,直到它收到下一個地址位元組。在SM20 為邏輯『1』時,UART0 忽略所有那些與UART0 地址不匹配以及第九位不是邏輯『1』的位元組。
可以將多個地址分配給一個從機,或將一個地址分配給多個從機從而允許同時向多個從機進行「廣播」式發送。主機可以被配置為接收所有的傳輸數據,或通過實現某種協議使主/從角色能臨時變換以允許原來的主機和從機之間進行半雙工通信。