51单片机I/O口模拟串口接受与发送,接受数据有错误,请问是哪里出问题了呢?


//接收一个字节并发送

#include <reg52.h>
#define uchar unsigned char
sbit RXD0=P1^1;
sbit TXD0=P1^0;

char flag;

uchar T;

void WaitTF0( void )
{
  while(!TF0);
  TF0=0;
}

void S2INI(void)
{
  TMOD |=0x02; 
  TH0=0xA0;   //波特率9600
  TL0=TH0;
  TR0=1; 
  TF0=0;
}
 
void WByte(unsigned int input)
{
  uchar i=8;
    uchar temp;
    
  TR0=1;
    TH0=0xA0;   //9600
  TL0=TH0;
    TXD0=0;                //起始位0
  WaitTF0();   
  while(i--)
  {
    TXD0=(bit)(input & 0x01);
    WaitTF0();
    input>>=1;            //8位数据
  }   
  TXD0=(bit)1;  
  WaitTF0();
  TR0=0;
    flag=0;
}

uchar RByte()            //接收
{
    uchar i=8;
    uchar temp=0;
  if(RXD0==0)
    {
    TR0=1;    
    TH0=0xA0;   //波特率9600
  TL0=TH0;
    WaitTF0(); 
    }
    while(i--)
  {
        temp>>=1;
        temp=temp&0x7f;
        if(RXD==1)
            temp |=0x80;

    }
if(RXD0==1)
{
    WaitTF0();
    flag=1;
}
TR0=0;
return temp;
}

main()
{
    S2INI();
    T=0;
    flag=0;
    RXD0=1;             //初始化,不许接收
    while(1)
    {
        while(RXD0); 
        T=RByte();
        if(flag==1)
          WByte(T);           
    }
}