2013-05-15 49 views
2

我已經編寫了2個微控制器之間的通信代碼。控制器1向控制器2發送一個號碼並進入8位發送模式,如果號碼匹配,則控制器2也進入8位模式。代碼編譯沒有錯誤或警告,但我仍然沒有得到任何輸出在Proteus上。我張貼的代碼:8051微控制器的通信C

void resetTimer16(); 


void main() 
{ 
unsigned char i; 

i=0; 

SCON=0x80;  // 9bit data mode 

TMOD=0x10; // 16bit timer mode 

resetTimer16(); 

TR1=1; 

while(1) 
{ 
    if(i==0) 
     SBUF=1; // send slave 1 id 
    else 
     { 
      TMOD=0x20;  // move into 8 bit mode 

      TH1=-12; // considering a baud rate of 2400 to achieve 

      SBUF='U'; 

      TR1=1; 
     } 

    while(TI==0) 
    { 
     if(TF1==1) 
     { 
      if(i==0) 
       resetTimer16(); 

      TF1=0; 
     } 
    } 

    TI=0; 

    i++;   

    if(i==2) 
     break; 
} 

while(1); 
} 


void resetTimer16() 
{ 
TH1=0xff; 
TL1=0xf4; 
} 

控制器2(接收器)

sbit rs=P2^4; 
sbit en=P2^5; 

void resetTimer16(); 
void sendDataLCD(unsigned char dataa); 
void sendCommandLCD(unsigned char); 
void delay(); 

void main() 
{ 
unsigned char i,dataa; 

i=0; 
dataa=0; 

SCON=0x90; // enabled receiving and 9bit mode 

TMOD=0x20; 

      sendCommandLCD(0x38); 
     sendCommandLCD(0x0E); 
     sendCommandLCD(0x01); 
     sendCommandLCD(0x02); 

resetTimer16(); 

while(1) 
{ 
    while(RI==0) 
    { 
     if(TF1==1) 
     { 
      if(i==0) 
       resetTimer16(); 

      dataa=1; 
      TF1=0; 
     } 
    } 
    RI=0; 

    dataa=SBUF; 

    if(dataa==1) 
    { 
     i=1; 

     TMOD=0x10; // move into 8bit mode 

     TH1=-12; 

     TR1=1; 
    } 

    while(RI==0); 

    RI=0; 

    dataa=SBUF; 


    if(dataa>0) // for testing purpose controler 1 is not sending data =0 
    { 
     sendDataLCD(dataa); 
    } 

} 
} 

void resetTimer16() 
{ 
TH1=0xff; 
TL1=0xf4; 
} 

void sendDataLCD(unsigned char dataa) 
{ 
P1=dataa; 

rs=1; 

en=1; 
delay(); 
en=0; 
} 

void sendCommandLCD(unsigned char cmd) 
{ 
P1=cmd; 

rs=0; 

en=1; 
delay(); 
en=0; 
} 

void delay() 
{ 
unsigned char i,j; 

for(i=0;i<255;i++) 
    for(j=0;j<255;j++) 
    {} 
} 

我試圖搞清楚這個問題,但是我失敗了,所以我在這裏尋求高手幫忙。非常感謝您的幫助。

問候

+0

我不是8051的專家,所以請帶上一粒鹽。但是我看到兩個控制器都被設置爲等待寄存器值在代碼中的點上改變,但是我沒有看到從你的註釋中啓用了任何中斷控制器。也許'RI'是一箇中斷標誌,可以工作,但我會仔細檢查你是否需要某種中斷向量代碼來讓你的通信正確註冊。順便說一句,你的調試器正在發生什麼?如果沒有調試器,你可以打印調試麼? –

+0

當數據分別被接收和發送時,RI和TI自動變高 – Naruto

+0

讀取控制器...第一次通過控制器1中的迴路,如果將SBUF設置爲1而不是進入波特率填充或設置TR = 1。但是,如果在if語句之外引用TR = 1,假設TR = 1意味着傳輸一個字節?再次,閱讀嘗試和幫助更好... –

回答

1

在你的第二個控制器,你要設置TMOD爲0x20 - 8位自動重裝,但根據該鏈接,8位模式使用一個登記櫃檯,另一個用於目的地 - 意思是說,當你數起來時,你只會在打斷前給它11次抽搐。我不熟悉這個芯片的時間,但這似乎是一個小值。特別是考慮到你稱之爲「resetTimer16」,它比第一塊芯片使用的定時器模式更適用。這是否搞砸了你的波特率導致字節不被接收?

如果沒有,我會保持在一個位挖...

更多挖掘 - 是EA,ET1和ES所有啓用 - 被中斷,定時器和串行通信中斷允許嗎?

+0

兩者都處於9位模式,並且一旦cont 1發送數據,它將進入8位模式,並且當cont 2第一次接收數據時,它也會以8位模式運行,使用類似我的Web鏈接中的多進程通信圖的東西 – Naruto

+0

? –