【问题标题】:communication of 8051 micro controllers C8051微控制器通信C
【发布时间】: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 中启动计时器

标签: c 8051


【解决方案1】:

在您的第二个控制器中,您将 TMOD 设置为 0x20 - 8 位自动重新加载,但根据该链接,8 位模式使用一个寄存器作为计数器,另一个寄存器用于目标 - 这意味着当您计数时起来,你在打断之前只给它 11 次抽动。我不熟悉这个芯片的时序,但这似乎是一个很小的值。特别是考虑到您将其称为“resetTimer16”,它比第一个芯片使用的更适用于定时器模式。这是否会破坏您的波特率,导致无法接收字节?

如果没有,我会继续挖掘......

更多挖掘 - EA、ET1 和 ES 是否都启用 - 是否允许中断、timer1 和串行通信中断?

【讨论】:

  • 好吧,两者都首先处于 9bit 模式,一旦 cont 1 发送数据,它就会进入 8bit 模式,当 cont 2 第一次收到数据时,它也会进入 8bit 模式
  • 在我的网页链接中使用多进程通信图之类的东西?
猜你喜欢
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
相关资源
最近更新 更多