赞助论坛
  • 2841阅读
  • 0回复

串口通信问题请教 [复制链接]

楼层直达

发帖
333
精华
0
金币
73
威望
2
贡献
4
好评
3
注册
2008-12-27
楼主    f20061201 发表于: 2009-08-30 14:34:12 
以下程序不知为何在通信一个循环之后,就不能再正常通信,请那位仁兄给予指点一下,多谢!

#include "reg52.h"
#include<intrins.h>

unsigned char xdata temp[3]={0xDD,0x00,0x00};
unsigned char xdata temp1[20];
unsigned char xdata temp2[5]={0xDD,0x00,0x00,0x00,0xDD};
unsigned char xdata temp3[20];
unsigned char xdata temp4[20];

bit   ICREAD;
bit   ICWRITE;
bit   ICVERFIY;
bit   ICBELL;

unsigned char u,i,y=0;
   
unsigned char xdata Rec_Buffercom[20];//接收数据缓冲区


void System_Init(void)
{
   TMOD=0x20;        //串行口初始化
   TH1=0xFD;
    TL1=0xFD;    //设定波特率 9600

   SCON=0x50;    //串行口工作在方式1,并允许接收    
   IE   |= 0x90;     //Enable Serial Interrupt
  EA=1;
  ES=1;
  TR1=1;            //启动T1

}

void del(unsigned char t)
{
  for(i=0;i<t;i++)
  {
    ;
  }

}
     
void main(void)
{  
          SP=0x50;
   System_Init();        //初始化    
   ICWRITE=1;
          ICVERFIY=1;
          ICBELL=1;
   while(1)
   {
   
        Delay10Us();
      del(10000);    
        if(ICREAD==0)
        {    
           
       
           
                  for(i=0;i<3;i++)  
                  {  
                                y^=temp[i];
                       temp4[i]=temp[i];
                   
               
                  }
                temp4[3]=Rec_Buffercom[10];
                       
                y^=Rec_Buffercom[10];
                for(i=0;i<(Rec_Buffercom[10]);i++)  
                  {
                       temp4[4+i]=temp1[i];
                       
                                y^=temp1[i];
                  }
                temp4[Rec_Buffercom[10]+4] =y;
                EA=0;
            ES=0;
           
            for(i=0;i<(Rec_Buffercom[10]+5);i++)
            {  
                SBUF=temp4[i];
                       do{}  
                       while(!TI);  
                       TI = 0;
               
             
            }
            ICREAD=1;
            EA=1;
          ES=1;            
            y=0;
           
               
               
               
        }        
        Delay10Us();
      del(10000);
      if(ICWRITE==0)
      {  
               
         
          del(10000);
          EA=0;
          ES=0;
         
          for(i=0;i<5;i++)  
              {
                   SBUF =temp2[i];
                   do{}  
                   while(!TI );  
                   TI = 0;
               
              }
         
          ICWRITE=1;
          EA=1;
          ES=1;    
      }
      del(10000);
      Delay10Us();
      if(ICVERFIY==0)      
      {
                 
       
               
          for(i=0;i<5;i++)  
              {
                   SBUF =temp2[i];
                   do{}  
                   while(!TI);  
                   TI = 0;
               
              }
          ICVERFIY=1;
          EA=1;
          ES=1;
         
      }
      Delay10Us();
      del(10000);
      if(ICBELL==0)
      {  
        EA=0;
        ES=0;
        for(i=0;i<5;i++)  
              {
                   SBUF =temp2[i]; //RecBuf[i];
                   do{}  
                   while(!TI);  
                   TI = 0;
               
              }
          ICBELL=1;
          EA=1;
          ES=1;
      }
   }
}


void rxdata(void) interrupt 4 using 2    
{
    EA=0;
      ES=0;
        while(!RI);
        RI=0;
        Rec_Buffercom[0]=SBUF;
        while(!RI);
        RI=0;
        Rec_Buffercom[1]=SBUF;    
     
      if(Rec_Buffercom[1]==0x64)
        {  
          while(!RI);
            RI=0;
            Rec_Buffercom[2]=SBUF;
         
          while(!RI);
            RI=0;
            Rec_Buffercom[3]=SBUF;

            for(i=4;i<(Rec_Buffercom[3]+5);i++)
              {
                  while(!RI);
                   RI=0;
                   Rec_Buffercom[i]=SBUF;
              }
          ICVERFIY=0;
       
        }
       
      if(Rec_Buffercom[1]==0x60)
        {  
           
            while(!RI);
            RI=0;
            Rec_Buffercom[2]=SBUF;
         
          while(!RI);
            RI=0;
            Rec_Buffercom[3]=SBUF;

            for(i=4;i<(Rec_Buffercom[3]+5);i++)
              {
                  while(!RI);
                   RI=0;
                   Rec_Buffercom[i]=SBUF;
              }
          ICWRITE=0;
             
 
        }
      if(Rec_Buffercom[1]==0xb4)
        {  
          while(!RI);
            RI=0;
            Rec_Buffercom[2]=SBUF;
         
          while(!RI);
            RI=0;
            Rec_Buffercom[3]=SBUF;

            for(i=4;i<(Rec_Buffercom[3]+5);i++)
              {
                  while(!RI);
                   RI=0;
                   Rec_Buffercom[i]=SBUF;
              }
          ICBELL=0;
                             
        }
      if(Rec_Buffercom[1]==0x61)
        {    
           
          while(!RI);
            RI=0;
            Rec_Buffercom[2]=SBUF;
         
          while(!RI);
            RI=0;
            Rec_Buffercom[3]=SBUF;

              for(i=4;i<(Rec_Buffercom[3]+5);i++)
              {
                  while(!RI);
                   RI=0;
                   Rec_Buffercom[i]=SBUF;
              }            
          ICREAD=0;        

        }
      EA=1;
      ES=1;
                           

}