1. 試述MCS—51單片機的多機通訊原理
用串口連接,其中一個為主機,其餘為從機,所有從機的RXD都接到主機的TXD端,TXD接到主機的RXD端,所有通信都有主機來發起,從機不能主動發起通信操作,只能等待,而且從機之間通信要通過主機中轉。串列埠控制寄存器SCON要做相應的配置。
2. 簡述mcs 51單片機實現多機通信的過程
使用串口的方式 2 和方式3 ,通過使用第九數據位和內置UART0 地址識別硬體支持一個主處理器與一個或多個從處理器之間的多機通信。當主機開始一次數據傳輸時先發送一個用於選擇目標從機的地址位元組。地址位元組與數據位元組的區別是:地址位元組的第九位為邏輯1;數據位元組的第九位總是設置為邏輯0。
如果從機的SM20 位(SCON0.5)被置『1』,則只有當接收到的第九位為邏輯1(RB80=1),收到有效的停止位並且接收的數據位元組與UART0 從地址匹配時UART0 才會產生中斷。在接收地址的中斷處理程序中,從機應清除它的SM20 位以允許後面接收數據位元組時產生中斷。一旦接收完整個消息,被定址的從機應將它的SM20 位重新置『1』以忽略所有的數據傳輸,直到它收到下一個地址位元組。在SM20 為邏輯『1』時,UART0 忽略所有那些與UART0 地址不匹配以及第九位不是邏輯『1』的位元組。
可以將多個地址分配給一個從機,或將一個地址分配給多個從機從而允許同時向多個從機進行「廣播」式發送。主機可以被配置為接收所有的傳輸數據,或通過實現某種協議使主/從角色能臨時變換以允許原來的主機和從機之間進行半雙工通信。
3. 89C51系列單片機串口通信的四種方式極其特點
80C51串列通信共有4種工作方式,由串列控制寄存器SCON中SM0SM1決定.
方式0是同步移位寄存器方式,幀格式8位,波特率固定:fosc/12;
方式1是8位非同步通信方式,幀格式10位,波特率可變:T1溢出率/n(n=32或16);
方式2是9位非同步通信方式,幀格式樣11位,波特率固定:fosc/n(n=64或32);
方式3是9位非同步通信方式,幀格式11位,波特率可變:T1溢出率/n(n=32或16);
方式1,2,3的區別方要表現在幀格式及波特率兩個方面.
方式1與方式2幀格式相同波特率不同:方式1波特率可變與T1溢出率有關;方式2波特率固定.
方式1與方式3波特率相同幀格式不同:方式1幀格式10位;方式3幀格式11位.
方式1,2,3通信過程完全相同,均為非同步通信方式.
方式0 移位寄存器 作同步傳輸方式,波特率固定,
方式1、2 非同步通信,波特率可變,應用范圍廣
方式3 應用於多機通信
串列窗口,是看不見敲進去的字元的。
要想看見,須再用一個串列窗口。
方式 0 :這種工作方式比較特殊,與常見的微型計算機的串列口不同,它又叫同步移位寄存器輸出方式。在這種方式下,數據從 RXD 端串列輸出或輸入,同步信號從 TXD 端輸出,波特率固定不變,為振盪率的 1/12 。該方式是以 8 位數據為一幀,沒有起始位和停止位,先發送或接收最低位。
方式 2 :採用這種方式可接收或發送 11 位數據,以 11 位為一幀,比方式 1 增加了一個數據位,其餘相同。第 9 個數據即 D8 位具有特別的用途,可以通過軟體摟控制它,再加特殊功能寄存器 SCON 中的 SM2 位的配合,可使 MCS-51 單片機串列口適用於多機通信。方式 2 的波特率固定,只有兩種選擇,為振盪率的 1/64 或 1/32 ,可由 PCON 的最高位選擇。
方式 3 :方式 3 與方式 2 完全類似,唯一的區別是方式 3 的波特率是可變的。而幀格式與方式 2- 樣為 11 位一幀。所以方式 3 也適合於多機通信。
ORG 0000H
SJMP START
ORG 0023H
LJMP UART_INT
START:
;*****串口初始化********
;MOV PCON,#80H ;SMOD=1 X2
;MOV SCON,#50H ;串口方式1(10位)
MOV SCON,#0D0H ;串口方式3(11位)
MOV TMOD,#20H ;T1為8位重裝
MOV TH1,#0FDH ;9600PTS 11.0592M (12T)
MOV TL1,#0FDH
MOV TH0,#0FFH
MOV TL0,#0FFH
;**********************
SETB ES
SETB TR1
SETB EA
SJMP $
UART_INT:
CLR RI
MOV A,SBUF
RRC A
MOV P1.0,C
RETI
給你個關鍵字,去搜唄,labview 串口通信 ,只要labview可以串口通信了,那就能跟單片機套上了
其實你完全可以用Vc++的MFC裡面的串口控制項去寫,幾句話而已,也可以控制
我來告訴你標准答案!80C51串列通信共有4種工作方式,由串列控制寄存器SCON中SM0SM1決定.
方式0是同步移位寄存器方式,幀格式8位,波特率固定:fosc/12;
方式1是8位非同步通信方式,幀格式10位,波特率可變:T1溢出率/n(n=32或16);
方式2是9位非同步通信方式,幀格式樣11位,波特率固定:fosc/n(n=64或32);
方式3是9位非同步通信方式,幀格式11位,波特率可變:T1溢出率/n(n=32或16);
方式1,2,3的區別方要表現在幀格式及波特率兩個方面.
方式1與方式2幀格式相同波特率不同:方式1波特率可變與T1溢出率有關;方式2波特率固定.
方式1與方式3波特率相同幀格式不同:方式1幀格式10位;方式3幀格式11位.
方式1,2,3通信過程完全相同,均為非同步通信方式.
串口可以一對多,主從方式,串口有一位用作識別碼,主機先要發送接受數據的從機地址,只有地址相符,從機才能使能接受,然後主機發送
把:if(a==1)
改為:if(a==0x31)
試試。
4. 51單片機如何連接多個器件
當然是通過引腳了,但是如果器件設備是有介面的也可以使用各種匯流排連接(特定的引腳)。如:RS232介面
5. 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);
}
6. 51單片機雙機通信
//=====================================================================
// 多機通訊主機程序
//zhuji.c
//writer:穀雨 2008年3月22日於EDA實驗室
//註:主機先發送地址,接收到應答後,再發送數據
//=====================================================================#include<reg52.h>#define addr1 0x31 //從機1地址
#define addr2 0x32 //從機2地址unsigned char xx[10];
unsigned char p = 0;void delay_1ms(unsigned int i)
{
unsigned char j;
while ((i--)!=0) {for (j=0;j<125;j++);}
}
void Uart_Init(void)
{
TMOD = 0x20; //定時器T1使用工作方式2
TH1 = 0XF3; TL1 = 0XF3; PCON = 0x00; //SMOD=1;
SCON = 0xf0; //工作方式3,9位數據位,波特率9600bit/s,允許接收
SM2 = 0;
TR1 = 1; //開始計時
EA = 1; //中斷允許
ES = 1; //串列中斷允許}
void Serial_INT() interrupt 4
{
if(!RI) return; ES = 0;
RI = 0;
xx[p] = SBUF;
p++;
ES = 1;
}
void send_addr(unsigned char addr) //發送地址
{
p = 0;
TB8 = 1; //發送地址幀
SBUF=addr; //發送地址
while(!TI); //等待發送完畢
TI=0; //軟體復位TI
}
void send_data(unsigned char ddata) //發送數據
{
TB8=0; //發送數據幀
SBUF=ddata; //發送數據
while(!TI);
TI=0; //軟體復位TI
}void main()
{
Uart_Init();
delay_1ms(2000);
while(1)
{
send_addr(addr1); //向從機1發地址
send_data(0x33);
send_data(0x01); delay_1ms(500);
if(xx[9]=='0') P1=0xaa; delay_1ms(500); send_addr(addr2); //向從機2發地址
send_data(0x33);
send_data(0x01); delay_1ms(500);
if(xx[9]=='9') P1=0x55; delay_1ms(500);
}
// while(1);
} //=====================================================================
// 多機通訊從機1程序
//cong1.c
//writer:穀雨 2008年3月22日於EDA實驗室
//註:
//=====================================================================
#include<reg52.h>
#define addr 0x31 //從機1地址unsigned char receive;
unsigned char xx[ ]={"1234567890"};void Uart_Init(void)
{
TMOD = 0x20; //定時器T1使用工作方式2
TH1 = 0XF3; TL1 = 0XF3; PCON = 0x00; //SMOD=1;
SCON = 0xf0; //工作方式3,9位數據位,波特率9600bit/s,允許接收 TR1 = 1; //開始計時
EA = 1; //中斷允許
ES = 1; //串列中斷允許}void Serial_INT() interrupt 4
{
if(!RI) return;
RI=0;
if(RB8==1)
{
if(SBUF==addr) SM2=0;
else SM2=1;
}
if(RB8==0) receive=SBUF;
}void SendOneByte(unsigned char c)
{
TB8=0;
SBUF = c;
while(!TI);
TI = 0;
}
void SendListChar(unsigned char *DData,unsigned char Ef)
{
unsigned char L=0; if(Ef!=0)
{
for( ;L<Ef;L++) //顯示有效長度
SendOneByte(DData[L]); //發送單個字元
}else
while (DData[L]!='\0') //發送至字串結束
{
SendOneByte(DData[L]); //發送單個字元
L++; //下一個字元
}
}void main()
{
Uart_Init();
while(1)
{
switch(receive)
{
case 0xff:
break;
case 0x01: //在此可以寫入要完成的動作,最多可完成256個動作
SendListChar(xx,0);
break;
case 0x02:
break;
case 0x33:
P1=!P1; //為方便其間,賦值給P1口,測P1口電平來檢測該程序
break;
default:
break;
}
receive=0xff;
}
}
7. 簡述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#機的緩沖區。