两个51单片机简单通信不同步问题

这是A号机代码

#include<reg51.h>
char code map[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(unsigned int t)
{
    unsigned int j;
    for(;t>0;t--)
    for(j=0;j<125;j--);
}
void main()
{
    unsigned char a=0;
    char *p;
    p=0x40;
    TMOD=0x02;
    TH1=TL1=0xf4;
    PCON=(PCON&0x7f);
    SCON=0x50;
    TR1=1;
    while(1)
    {
        SBUF=a;
        while(TI==0);
        TI=0;
        while(RI==0);
        *p=SBUF;
        RI=0;
        if(SBUF==a)
        {
            P2=map[a];
            a++;
            if(a>9)
                a=0;
            delay(500);
        }
    }
}
        

这是B号机代码

#include<reg51.h>
char code map[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main()
{
    unsigned char rec;
    unsigned char *p;
    p=0x40;
    TMOD=0x20;
    TH1=TL1=0xf4;
    PCON=(PCON&0x7f);
    SCON=0x50;
    TR1=1;
    while(1)
    {
        while(RI==0);
        
            rec=SBUF;
                *p=SBUF;
            SBUF=rec;
                RI=0;
            while(TI==0);
            TI=0;
            P2=~map[rec];
          
        
    }
}
        

这是仿真图

img
代码是照着书本打的,有一点细微改动,都在P2口接个数码管,问题就是甲(左)可以正常显示0——9,而乙(右)只显示0,并在甲发送数据的时候闪烁一次,我用了指针看了一眼,在闪烁那一瞬间乙接受到的是F0,同样我用指针也看了一眼甲接受的数据,是正确的。