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++)
{}
}
나는이 문제를 알아 내기 위해 시도하지만 실패를, 그래서 여기에 전문가의 도움을 추구하고 있습니다. 귀하의 도움을 크게 주시면 감사하겠습니다.
감사
당신의 두번째 컨트롤러에서
나는 8051 전문가가 아니므로 소금 한 알을 가지고 이것을 복용하십시오. 하지만 두 컨트롤러 모두 레지스터 값이 코드의 지점에서 변경 될 때까지 기다리는 것으로 설정되어 있지만 사용자의 의견에서 사용할 수있는 인터럽트 컨트롤러가 표시되지 않습니다. 아마도 'RI'는 인터럽트 플래그이며 제대로 작동하지만, 통신을 올바르게 등록하려면 인터럽트 벡터 코드가 필요하지 않습니다. BTW, 디버거에서 무슨 일이 벌어지고 있니? 디버거가 없다면, 당신은 printf를 디버그 할 수 있습니까? –
RI와 TI가 각각 데이터를 수신하고 전송할 때 자동으로 하이가됩니다 – Naruto
컨트롤러에서 읽는 중 ... 컨트롤러 1에서 루프를 처음 실행할 때 SBUF를 1로 설정하고 사용자가 TR = 1로 설정하십시오. 하지만 TR = 1이 if 문 외부에서 소수 일 경우 - TR = 1이면 바이트를 전송한다는 의미인가? 다시 시도하고 더 나은 도움을 읽기 ... –