2013-05-15 3 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'는 인터럽트 플래그이며 제대로 작동하지만, 통신을 올바르게 등록하려면 인터럽트 벡터 코드가 필요하지 않습니다. BTW, 디버거에서 무슨 일이 벌어지고 있니? 디버거가 없다면, 당신은 printf를 디버그 할 수 있습니까? –

+0

RI와 TI가 각각 데이터를 수신하고 전송할 때 자동으로 하이가됩니다 – Naruto

+0

컨트롤러에서 읽는 중 ... 컨트롤러 1에서 루프를 처음 실행할 때 SBUF를 1로 설정하고 사용자가 TR = 1로 설정하십시오. 하지만 TR = 1이 if 문 외부에서 소수 일 경우 - TR = 1이면 바이트를 전송한다는 의미인가? 다시 시도하고 더 나은 도움을 읽기 ... –

답변

1

, 당신은 0x20에에 TMOD를 설정하는 - 8 비트 자동 리로드하지만, 그 링크에 따르면, 8 비트 모드는 하나가 카운터와 대상에 대한 다른 등록 사용 - 당신이 카운트 업하는 동안 방해를하기 전에 11 개의 틱만주고있는 것을 의미합니다. 나는이 칩의 타이밍에 익숙하지 않지만 작은 값인 것처럼 보인다. 특히 당신은 이것을 "resetTimer16"이라고 부르는데, 이것은 첫 번째 칩이 사용하는 것보다 타이머 모드에 더 잘 적용됩니다. 이 바이트가 BAUD 비율로 인해 수신되지 않는 것입니까? EA, ET1 및 ES 모두 사용 가능 - - 인터럽트, 타이머 1, 시리얼 통신이 허용를 방해하는 파고가

하지 않으면, 내가 조금 파고하겠습니다 ...?

+0

잘 둘 다 9bit 모드로되어 있고 cont 1이 데이터를 보내면 8bit 모드로 들어가고 cont 2가 데이터를 처음 수신 할 때, 또한 내 웹 링크의 다중 프로세스 통신 다이어그램과 같은 것을 사용하여 8bit 모드 – Naruto

+0

으로 이동합니까? –

관련 문제