我已經編寫了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'是一箇中斷標誌,可以工作,但我會仔細檢查你是否需要某種中斷向量代碼來讓你的通信正確註冊。順便說一句,你的調試器正在發生什麼?如果沒有調試器,你可以打印調試麼? –
當數據分別被接收和發送時,RI和TI自動變高 – Naruto
讀取控制器...第一次通過控制器1中的迴路,如果將SBUF設置爲1而不是進入波特率填充或設置TR = 1。但是,如果在if語句之外引用TR = 1,假設TR = 1意味着傳輸一個字節?再次,閱讀嘗試和幫助更好... –