【发布时间】:2013-05-15 17:29:39
【问题描述】:
我编写了一个用于 2 个微控制器之间通信的代码。控制器 1 向控制器 2 发送一个数字并进入 8 位传输模式,如果数字匹配,控制器 2 也进入 8 位模式。代码正在编译,没有错误或警告,但我仍然没有在 Proteus 上得到任何输出。我正在发布代码:
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 专家,所以对此持保留态度。但是我看到两个控制器都被设置为等待寄存器值在代码中的某个点发生变化,但是我没有看到您的 cmets 启用了任何中断控制器。也许'RI'是一个中断标志并且有效,但我会仔细检查你不需要某种中断向量代码来让你的通信正确注册。顺便说一句,你的调试器发生了什么?如果没有调试器,你可以 printf 调试吗?
-
RI和TI分别在接收和发送数据时自动变高
-
正在阅读您的控制器...第一次通过控制器 1 中的循环时,它遇到了将 SBUF 设置为 1 并且没有落入您的波特率内容或设置 TR= 的 If 情况1.但是你在你的 if 语句之外做了 Prime TR=1 - 假设 TR=1 意味着传输一个字节?再次,阅读以尝试更好地提供帮助......
-
mikroe.com/chapters/view/65 非常酷。现在我可以说你的语言并提供更多帮助......
-
TR=1 在 8051 中启动计时器