標(biāo)題:
PC機(jī)與多個(gè)51單片機(jī)串口通訊
[打印本頁]
作者:
xiaojuan
時(shí)間:
2014-10-13 15:00
標(biāo)題:
PC機(jī)與多個(gè)51單片機(jī)串口通訊
最近需要用PC機(jī)與多個(gè)51單片機(jī)通過RS232進(jìn)行通訊。
在多機(jī)通訊中,要保證主機(jī)與所選擇的從機(jī)實(shí)現(xiàn)可靠的通信,
必須保證串口具有識(shí)別的功能。在串行口控制寄存器SCON中
有一位叫做SM2,就是為了多機(jī)通訊而設(shè)置的控制位。多機(jī)通
訊的過程可以如下:1 首先從機(jī)初始化,開中斷,讓其以方式
2或3接收(9位異步通訊方式),置位SM2,REN位,允許接
收,那么當(dāng)SM2=1的時(shí)候,只有當(dāng)接收到的第9位數(shù)據(jù)(RB8)
等于1(接收到的為地址幀)的時(shí)候,前8位數(shù)據(jù)送入接收SBUF
,置位RI,產(chǎn)生中斷。如果接收到的第9位數(shù)據(jù)位0,則將接收
到的數(shù)據(jù)幀丟棄。2 此時(shí)主機(jī)可以先將從機(jī)地址發(fā)送給各個(gè)從機(jī)
系統(tǒng),各個(gè)從機(jī)的串口接收到第9位數(shù)據(jù)RB8為1,由于SM2=1
,置位RI,各個(gè)從機(jī)相應(yīng)中斷,在中斷服務(wù)程序中判斷主機(jī)送來的
地址是否與本機(jī)地址相符合(這個(gè)地址是由軟件編寫人員自行設(shè)
定的),若相符,則清零SM2,準(zhǔn)備接收數(shù)據(jù)。若不符,則保持
SM2=1. 3 第三步主機(jī)開始發(fā)送數(shù)據(jù)幀,此時(shí)前面地址相符合的
從機(jī),SM2=0,主機(jī)發(fā)送的數(shù)據(jù)RB8=0,這樣只有SM2=0的
相符的從機(jī)可以產(chǎn)生接收數(shù)據(jù)中斷,激活中斷標(biāo)志位RI,進(jìn)入中
斷服務(wù)程序,去接收數(shù)據(jù)。其他的從機(jī)因SM2=1,又RB8=0,
不能激活中斷標(biāo)志RI,不能進(jìn)入中斷,則把接收到的數(shù)據(jù)丟失不
做處理。從而保證了這個(gè)數(shù)據(jù)通信的正確性。
上面這個(gè)過程就是51單片機(jī)通過串行口進(jìn)行多機(jī)通訊的完整過程。
但是現(xiàn)在我需要PC機(jī)與多個(gè)51單片機(jī)進(jìn)行通訊,而PC機(jī)上面是
無法實(shí)現(xiàn)這個(gè)RB8的設(shè)置,因?yàn)槲沂怯么谡{(diào)試助手來調(diào)試程序。
那么我
所幸不用上面的多機(jī)通信的方法。而是自己來規(guī)定一個(gè)一個(gè)信息頭
,一個(gè)信息尾。比如F0,A5,然后跟著地址信息。之所以加這么一個(gè)
信息頭,是為了防止數(shù)據(jù)與地址的值相同,造成從機(jī)誤接收。這個(gè)
信息頭設(shè)置的越復(fù)雜一些,避免誤接收的效果就越好,這是很簡單
的道理。
這樣只有從機(jī)接收到這個(gè)代表地址信息的信息頭,而且后面跟著的
地址與自己的地址相符合,才跳轉(zhuǎn)到接受數(shù)據(jù)的程序段。而其他從機(jī)
則是不斷的在接收這些數(shù)據(jù),無論是地址,還是數(shù)據(jù),但是全部丟棄
他們。這樣就從軟件上解決了這個(gè)PC機(jī)與多個(gè)51單片機(jī)多機(jī)通訊調(diào)
試程序時(shí)的一個(gè)缺陷。當(dāng)然可以考慮自己通過VC編寫一個(gè)小的上位機(jī)
軟件,來處理這個(gè)事情,不知道微軟的API是否也有這個(gè)RB8的機(jī)制,
自己才疏學(xué)淺,并不知曉。
下面將自己編寫的簡單程序段放在這里,方便日后參考:
view plaincopy to clipboardprint?
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define __MAX_LEN_ 64
sbit FMQ=P3^7;
uchar addr,s=0,i=0,tmp=0xff;
uchar buf[__MAX_LEN_];
void init_serial()
{
TMOD = 0x20;
TH1 = 250;
TL1 = 250;
TR1 = 1;
PCON = 0x80;
SCON = 0xd0;
}
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<110;j++);
}
void Beep_ok()
{
FMQ=0;
delay(200);
FMQ=1;
delay(200);
FMQ=0;
delay(200);
FMQ=1;
delay(200);
}
void Beep_Addr_OK()
{
FMQ=0;
delay(1000);
FMQ=1;
}
uchar rec_uart(uchar *buf)
{
uchar DATA;
RI = 0;
while(!RI);
DATA=SBUF;
P2 = 0xff;
addr = P2;
if(DATA==addr)
return 0xfe;
buf[s] = SBUF;
s++;
if(s==__MAX_LEN_)
{
s=0;
}
P0=SBUF;
Beep_ok();
return 0xff;
}
void main()
{
init_serial();
EA = 0;
while(1)
{
loop: P2 = 0xff;
addr = P2;
SM2 = 0;
tmp = addr-1;
while(tmp != addr)
{
RI = 0;
while(!RI);
tmp = SBUF;
P1=tmp;
RI = 0;
}
Beep_Addr_OK();
TI = 0;
TB8 = 0;
SBUF = addr;
while(!TI);
TI = 0;
SM2 = 0;
tmp = 0xff;
while(1)
{
while(tmp == 0xff)
{
tmp = rec_uart(buf);
}
if(tmp == 0xfe)
{
Beep_Addr_OK();
goto loop;
}
}
}
}
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define __MAX_LEN_ 64
sbit FMQ=P3^7;
uchar addr,s=0,i=0,tmp=0xff;
uchar buf[__MAX_LEN_];
void init_serial()
{
TMOD = 0x20;
TH1 = 250;
TL1 = 250;
TR1 = 1;
PCON = 0x80;
SCON = 0xd0;
}
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<110;j++);
}
void Beep_ok()
{
FMQ=0;
delay(200);
FMQ=1;
delay(200);
FMQ=0;
delay(200);
FMQ=1;
delay(200);
}
void Beep_Addr_OK()
{
FMQ=0;
delay(1000);
FMQ=1;
}
uchar rec_uart(uchar *buf)
{
uchar DATA;
RI = 0;
while(!RI);
DATA=SBUF;
P2 = 0xff;
addr = P2;
if(DATA==addr)
return 0xfe;
buf[s] = SBUF;
s++;
if(s==__MAX_LEN_)
{
s=0;
}
P0=SBUF;
Beep_ok();
return 0xff;
}
void main()
{
init_serial();
EA = 0;
while(1)
{
loop: P2 = 0xff;
addr = P2;
SM2 = 0;
tmp = addr-1;
while(tmp != addr)
{
RI = 0;
while(!RI);
tmp = SBUF;
P1=tmp;
RI = 0;
}
Beep_Addr_OK();
TI = 0;
TB8 = 0;
SBUF = addr;
while(!TI);
TI = 0;
SM2 = 0;
tmp = 0xff;
while(1)
{
while(tmp == 0xff)
{
tmp = rec_uart(buf);
}
if(tmp == 0xfe)
{
Beep_Addr_OK();
goto loop;
}
}
}
}
程序中,并沒有使用這個(gè)信息頭,當(dāng)然很容易就可以加上,這個(gè)只是個(gè)
簡單的測試,蜂鳴器的響聲,也是調(diào)試程序中使用,另外程序中使用了
goto,破壞了程序的結(jié)構(gòu),以后具體應(yīng)用中再具體編寫合適的程序。
作者:
5000322
時(shí)間:
2017-6-18 13:48
這是一個(gè)好貼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1