新人求教51串口收发数据

2019-07-15 22:47发布

本帖最后由 lbb1112 于 2013-8-26 15:04 编辑

51接收16字节数据,首位为FF,再发送FF为首的7字节,为什么我写的这个程序发在仿真的不对
#include <reg51.h>
#include<stdio.h>
#define uchar  unsigned char
#define uint  unsigned int
bit Rec_Flag =0;     //数据接收标志位
bit UART_Flag =0;    //串口接收完成标志位
uchar Rec_Num=0;
//uint rd[16];
uchar f,a,b0,c,hh,hm,hl,xh,xm,xl,yh,ym,yl,zh,zm,zl;
uchar dt[7];
void delay71us(void);
void read(void);
void delay(char x);
void rdtodt(void);
void txde(void);
void main(void)//初始化串口
{
SCON=0x50;
TMOD=0x20;
PCON=0x00;
TL1=0xFD;
TH1=0xFD;
ES=1;
TR1=1;

while(1)
{  
delay(1);
read();
rdtodt();
txde();
}
}
   
void read()
{
loop:while(RI!=0);
f=SBUF;
RI=0;
if(SBUF==0xff)
{ //收到起始位
Rec_Flag=1;
Rec_Num=0;
if(SBUF!=0XFF)
  {goto loop;
  }
}
//delay71us();
while(RI!=0);
  a=SBUF;
RI=0;
  //delay71us();
while(RI!=0);
b0=SBUF;
RI=0;
   
//delay71us();
while(RI!=0);
  c=SBUF;
RI=0;
  
//delay71us();
while(RI!=0);
  hh=SBUF;
RI=0;
  //delay71us();
while(RI!=0);
  hm=SBUF;
RI=0;
  //delay71us();
while(RI!=0);
  hl=SBUF;
RI=0;
// delay71us();
while(RI!=0);
xh=SBUF;
RI=0;

//delay71us();
while(RI!=0);
xm=SBUF;
RI=0;
//delay71us();
while(RI!=0);
xl=SBUF;
RI=0;
//delay71us();
while(RI!=0);
yh=SBUF;
RI=0;
//delay71us();
while(RI!=0);
ym=SBUF;
RI=0;
//delay71us();
  while(!RI);
yl=SBUF;
RI=0 ;
//delay71us();
while(RI!=0);
zh=SBUF;
RI=0;
//delay71us();
while(RI!=0);
zm=SBUF;
RI=0;
//delay71us();
while(RI!=0);
zl=SBUF;
RI=0;

if(f==0xff)//判断是否为有效数据
UART_Flag=1;         //若是正确的数据,则标志位置1
}
  

void delay(char x)
{char i,j;
for(i=0;i<x;i++)
for(j=0;j<110;j++);
}
//void delay71us(void)   //误差 -0.470486111111us
//{
//   unsigned char a;
  //  for(a=31;a>0;a--);
//}
void rdtodt()
{
if(f==0xff)
  {
  dt[0]=f;
  dt[1]=hh;
  dt[2]=hm;
  dt[3]=hl;
  dt[4]=zh;
  dt[5]=zm;
  dt[6]=zl;
}
}
void txde()
{
uchar i=0;
if(UART_Flag==1);
{ //ES=0;
   for(i=0;i<7;i++)
  {
    SBUF=dt;
  while(!ti); //等待发送完成
    TI=0;   //发送完成,TI清0
       }
   }
//ES=1;
//SCON=0x50;
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。