微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > at89c52在串口通信中遇到的问题

at89c52在串口通信中遇到的问题

时间:10-02 整理:3721RD 点击:
由于下位机采用at89c52,串口通信采用中断方式接收与发送,发现自己在串口通信时,上位机发送的数据下位机9针串口有接收指示,但是功能不能实现,还有就是下位机发送数据的时候上位机接收数据的时候有时会出现误码,比如00f0的时候,上位机接收到的时候有时是00f0,有时是f000,就是会出现慢一拍的情况,上下位机的波特率都一样。下面是我的串口程序,高手指导指导下!谢谢了!
void ck_init() interrupt 4 using 1    //串口中断函数
{  ES=0;
    if(RI==1)    //接收停止,置零准备下一次接收
    { RI=0;
   recv[recvnum++]=SBUF;
   temp=recv[0];
   temp<<8;
   temp=temp|recv[1];
     if(recvnum>2)
   {recvnum=0;
    num=num+1;}
    if(num==1)
    {recv[0]<<8;
    alarmH=recv[0]|recv[1];
    num=1;
    }
     if(num==2)
     {recv[0]<<8;
      alarmL=recv[0]|recv[1];
      num=2;
     }
     if(num==3)
     {recv[0]<<8;
      settemperature=recv[0]|recv[1];
      num=3;
     }
     if(num==4)
     {recv[0]<<8;
      zhengwencha=recv[0]|recv[1];
      num=4;
     }
     if(num==5)
    {recv[0]<<8;
     fuwencha=recv[0]|recv[1];
     num=0;
    }
  num=0;
}
   if(TI==1)   //发送停止,置零准备下一次发送
     {
       TI=0;
    if(sendnum<2)
    {send[0]=temp_highbyte;
    send[1]=temp_lowbyte;
       SBUF=send[sendnum++];}
      else
    {sendnum=0;}
    }
    ES=1;
   
    return;
   
  }
void  main(void)
{
ckcsh(); //串口初始化函数   
while(1)
{
  heat_or_cooling();
  if(temp>=0)
     {temp_highbyte=temp/256;
   temp_lowbyte=temp%256;
  }
  else
  {temp_highbyte=((~temp)+1)/256;
  temp_highbyte=(temp_highbyte|0xf0);
  temp_lowbyte=((~temp)+1)%256;
  }
  
  send[0]=temp_highbyte;
  send[1]=temp_lowbyte;
  SBUF=send[sendnum++]; //启动发送数据
  
  alarm();   //报警函数
  if(Flag==1)
    {bell=!bell;
     warn=!warn;}  //蜂鸣器响
      else
   {bell=1;
    warn=1;}
  }  
}

UART中断中的程序有问题,自己好好看。一句一句的想想。看着就感觉你的程序学的不规范

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top