| 
 
| 设计了一个发送五位字符的程序,通信时串口调试助手向单片机发送五个字符例如“12345”单片机第一次接收并回显到调试助手时只有前四位“1234”只有在第二次发送后才能收到第五位例如再次发送“12345”会收到“51234”以后每次收到的第一位都是上一次发送的最后一位,这是为什么,波特率4800. #include<reg52.h>
 sbit LED0=P0^0;
 int i=4,j,flag=0;
 unsigned int T=0,temp=1,start=0;
 unsigned char buf,d[5];
 void init();
 void main()
 {
 unsigned char a,b;
 unsigned int c;
 TMOD=0x20;//设定定时器1为工作方式2,8位自装填
 TH1=0xf3;
 TL1=0xf3;//4800
 REN=1;
 SM0=0;
 SM1=1;//10位异步收发波特率计算公式波特率=(2^SMOD/32)*(T1溢出率)
 EA=1;
 ES=1;
 TR1=1;
 while(1)
 {
 if(start==1)
 {
 ES=0;
 SBUF=d[0];
 while(!TI);
 TI=0;
 SBUF=d[1];
 while(!TI);
 TI=0;
 SBUF=d[2];
 while(!TI);
 TI=0;
 SBUF=d[3];
 while(!TI);
 TI=0;
 SBUF=d[4];
 while(!TI);
 TI=0;
 ES=1;
 for(c=T;c>0;c--)//T为脉冲个数
 {
 for(b=12;b>0;b--)
 for(a=248;a>0;a--);
 LED0=1;  //延时一个机器周期
 for(b=12;b>0;b--)
 for(a=248;a>0;a--);
 LED0=0;  //延时一个机器周期
 }
 start=0;
 T=0;
 }
 }
 }
 void UART(void) interrupt 4
 {
 buf=SBUF;
 for(j=0;j<i;j++)
 temp=temp*10;
 T=T+((buf-48)*temp);
 d[4-i]=buf;
 i--;
 temp=1;
 if(i==-1)
 {
 i=4;
 start=1;
 }
 RI = 0;
 }
 | 
 |