❶ 51單片機怎麼雙機通信
你好!!
單片機雙機通訊,就是直接單片機的串口RX和TX直接連接,然後通過串口命令完成通訊!
給你一個實例,可以完全滿足你的要求!
希望幫到你,滿意請採納!
❷ 設計一個單片機雙機通信系統,並編寫通信程序
串口調試助手是PC端的軟體,用來從PC的串口發送和接收數據的。我們調試PC和單片機之間通訊的時候用來模擬PC端應用軟體給單片機發送數據和接收單片機發送的數據的。你調試的是單片機和單片機之間的通訊,不適合用串口調試助手的。
但是單片機和單片機通訊不容易知道實際通訊的數據,所以存在很大的調試難度。如果條件允許的話,一般是通過單片機連PC串口,讓PC模擬模塊收發數據來驗證串口通訊是否正常(PC端能夠直接看到單片機發送的數據,從而判斷程序是否符合同模塊的通訊要求),再把PC換成模塊進行通訊。這樣調試比較方便。
你和模塊通訊也是單純的串口通訊。
我又仔細分析了一下你的系統,按你的意思應該是拿51單片機做上位機。習慣上我們把PC稱為上位機,所以剛才沒明白。
1、SMOD是用來給串口波特率硬體倍頻的。在串口模式1,2,3下,如果SMOD=0波特率是4800,那麼SMOD=1時波特率是9600。它存在的理由就是:如果要求的波特率非常快,在給定晶振條件下SMOD=0已經滿足不了,才需要SMOD=1倍頻。
比如你11.0592MHZ在SMOD=0時波特率最大28800bps達不到要求的57600bps,所以你要用SMOD=1倍頻才能實現。
你串口要選擇模式1,波特率是可變的,取決於定時器1的溢出速率:
波特率=(2SMOD÷32)×定時器1 溢出速率
通常會使用定時器1 工作在定時器工作模式2下,這時定時值中的TL1 做為計數,TH1 做為自動重裝值 ,這個定時模式下,定時器溢出後,TH1 的值會自動裝載到TL1,再次開始計數,這樣可以不用軟體去干預,使得定時更准確。在這個定時模式2 下定時器1 溢出速率的計算公式如下:
溢出速率=(計數速率)/(256-TH1) ;
計數速率= 11.0592M/12;
算了一下是TH1=255(#0FFH);就是計數器走一個計數周期。
2、你不用關心什麼叫做數據包,只是一種形象的叫法。把一串數據作為一次通訊的內容,這一串數據就是一個包了。那個2位和4位只是寫法上便於你理解的,
如01H +0000H + 01H + 03H + 0005H
對應上面的包格式解釋0000H是地址碼保留字0005H是校驗和。
而串口通訊一幀只能發送一個位元組。發送的時候只能 01H + 00H +00H + 01H + 03H + 00H + 05H 依序發送。
用匯編寫的話流程就是 寫入第一個位元組01H到SBUF,等待直到TI=1,發送第二個位元組00H,等待直到TI=1,發送第三個位元組00H,如此循環直到發送完05H為止。
3、類似發送,應答8181H也是81H+81H兩個位元組回復的。可以用中斷,也可以用查詢。例如2的發送通訊中05H發送完之後就要開始查詢RI直到RI=1,然後就把 SBUF中的位元組讀出來,是81H,清RI後再查詢RI直到RI=1,把 SBUF中的位元組讀出來,是81H,清RI。如果判斷兩個接收的都是81H那就表明收包正確。
4、串口通訊一幀只能發送一個位元組。這個就不是問題了。
+我hi交流,不留Q,不留程序。
❸ 在單片機的串口通信中,雙機通信與單機通信有什麼不同
在單片機的串口通信中,有雙機通信,卻沒有單機通信,你給自己打電話怎麼打?要通信,至少要有兩個單片機。兩個單片機互相通信叫雙機通信。另一種應該是多機通信,在多機通信模式下,通常是一個主機發送,多個從機接收。就好比,一個老師在講課/發送,很多的學生在聽課/接收,學生也想發送/發言答題,一是老師提問學生,二是學生舉手經老師允許才可發言。
❹ 單片機雙機通信是不是要對兩個單片機分別寫程序
是啊。針對發送和接受的單片機都要進行編程。
現在的單片機應該都有串口模塊(TXD和RXD兩個管腳),通過串口發送數據的流程一般都是:1,設置串口模塊的相關寄存器,如格式寄存器(8位,有無校驗位等),波特率寄存器;2,發送的話就向發送數據寄存器寫入數據,接收數據則不需要;3,通過標志位或中斷的方式表明發送或接收動作完成。
你用的單片機如果有模擬器就用模擬器驗證,或者單片機支持在線調試就使用在線驗證的方式。
❺ 51單片機雙機通訊問題
#include<reg51.h> //發送 供參考
sbitk0=P1^0; //這是10按鍵
sbitk1=P1^1; //發送0-9 的編碼
sbitk2=P1^2;
sbitk3=P1^3;
sbitk4=P1^4;
sbitk5=P1^5;
sbitk6=P1^6;
sbitk7=P1^7;
sbitk8=P3^3;
sbitk9=P3^4;
sbitled=P3^5;
bit y0,y1,y2,y3,y4,y5,y6,y7,y8,y9;
voidmain(void)
{
SCON=0x50; //REN=1允許串列接受狀態,串口工作模式1
TMOD|=0x20; //定時器工作方式2
PCON|=0x80; //數據位8、停止位1。效驗位無(12M)
TH1=0xFD; //TH1=0xFD;波特率9600
TL1=0xFD;
TR1 =1;
while(1)
{
if(k0==0&&y0==0){y0=1;SBUF=0xc0;led=0;}
if(k0==1){y0=0;}
if(k1==0&&y1==0){y1=1;SBUF=0xf9;led=0;}
if(k1==1){y1=0;}
if(k2==0&&y2==0){y2=1;SBUF=0xa4;led=0;}
if(k2==1){y2=0;}
if(k3==0&&y3==0){y3=1;SBUF=0xb0;led=0;}
if(k3==1){y3=0;}
if(k4==0&&y4==0){y4=1;SBUF=0x99;led=0;}
if(k4==1){y4=0;}
if(k5==0&&y5==0){y5=1;SBUF=0x92;led=0;}
if(k5==1){y5=0;}
if(k6==0&&y6==0){y6=1;SBUF=0x82;led=0;}
if(k6==1){y6=0;}
if(k7==0&&y7==0){y7=1;SBUF=0xf8;led=0;}
if(k7==1){y7=0;}
if(k8==0&&y8==0){y8=1;SBUF=0x80;led=0;}
if(k8==1){y8=0;}
if(k9==0&&y9==0){y9=1;SBUF=0x90;led=0;}
if(k9==1){y9=0;}
if(led==0)
{
while(!TI);
TI=0;
led=1;
}
}
}
#include<reg51.h>//接收
voidmain(void)
{
SCON=0x50; //REN=1允許串列接受狀態,串口工作模式1
TMOD|=0x20; //定時器工作方式2
PCON|=0x80; //數據位8、停止位1。效驗位無(12M)
TH1=0xFD; //TH1=0xFD;波特率9600
TL1=0xFD;
TR1 =1;
ES =1; //開串口中斷
EA =1; //開總中斷
P1=0xbf;
while(1)
{
}
}
voidchuankou(void)interrupt4
{
if(RI==1)
{
RI=0;
TI=0;
P1=SBUF; // 顯示0-9
}
}
❻ 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;
}
}
❼ 單片機 雙機通信 程序
雙機通信不需要安裝虛擬埠軟體
,兩機通過txd
<==>
rxd
直接通信。
#include
#define
uchar
unsigned
char;
#define
uint
unsigneed
int;
uchar
a0,a1,a2,a3,temp,i;
uchar
code
tab[
]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit
p2_0=p2^0;
sbit
p2_1=p2^1;
sbit
p2_2=p2^2;
sbit
p2_3=p2^3;
void
delay(int
ms)
{
while(ms--)
for(i=0;i<123;i++);
}
void
inituart()
{
tmod=0x20;
//m1=1,m0=0
定時器1工作方式2(定時常數重裝,8
位)
scon=0x50;
//sm0=0,sm1=1,ren=1
串口工作方式1,允許接收
th1=0xfd;
//晶振11.0592時,波特率9600
tl1=th1;
//tl1計數,溢出後,th1值送入tl1
ea=1;
//開總中斷
es=1;
//允許串口中斷
tr1=1;
//啟動定時器1
}
void
disp()
{
a0=temp%2;
a1=temp/2%2;
a2=temp/2/2%2;
a3=temp/2/2/2%2;
p2_0=0;
p0=tab[a0];
delay(1);
p2_0=1;
p2_1=0;
p0=tab[a1];
delay(1);
p2_1=1;
p2_2=0;
p0=tab[a2];
delay(1);
p2_2=1;
p2_3=0;
p0=tab[a3];
delay(1);
p2_3=1;
}
void
main()
{
inituart();
//調用串口初始化子程序
while(1)
{
disp();
sbuf=p1;
while(ti==0);
ti=0;
}
}
void
uartinterrupt(
)
interrupt
4
{
if(ri)
{
ri=0;
temp=sbuf;
}
}
❽ 求51單片機雙機通訊C程序!!! 要求是全雙工的!!!!
多位元組的數據傳輸,是需要制定規則的,收發雙方都要按照規則通信。
參考下圖。
❾ 單片機雙機通信程序
雙機器通信很容易的。如果用Proteus模擬的話還得安裝虛擬埠軟體。
❿ 單片機多機通信與雙機通信問題
多機通信就1個單片機與多個單片機通信,雙機通信就是兩個單片機通信,或一PC與多機,或一pc與單片機,這個這么好理解還拿出來問!