⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm.lst

📁 采用811芯片实现单片机读写U盘的源代码
💻 LST
字号:
C51 COMPILER V7.00  COMM                                                                   09/22/2005 17:15:32 PAGE 1   


C51 COMPILER V7.00, COMPILATION OF MODULE COMM
OBJECT MODULE PLACED IN .\out\comm.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE comm.c LARGE BROWSE DEBUG OBJECTEXTEND OBJECT(.\out\comm.obj)

stmt level    source

   1          #define COMM_FILE
   2          #include "include.h"
   3          
   4          //uchar data time;
   5          //uint data r_in=0,r_out=0,t_in=0,t_out=0; /*队列指针*/
   6          //bit r_full=0,t_empty=0,t_done=0;
   7          /*0=接收缓冲区空,1=满;
   8          0=发送缓冲区空,1=正在发送
   9          1=正在发送最后字节;
  10          */
  11          
  12          //uchar xdata t_buf[1024];      /* 串行发送缓冲 */
  13          //uchar xdata r_buf[1024];      /* 串行接收缓冲 */
  14          
  15          /*-----------------------------------------------------
  16          ;     串口数据块发送程序
  17          ;     入口参数:  buffer == 数据缓冲区指针
  18          ;                length == 数据的长度
  19          ;     出口参数:  无
  20          -----------------------------------------------------*/
  21          void send_str(uint length,uchar *buffer)
  22          {
  23   1              do{
  24   2            if((((t_in+1)^t_out)&0x3ff)!=0)         /*t_in+1=t_out 测试缓冲区满*/
  25   2              {
  26   3                              t_buf[t_in]=*buffer;
  27   3                              buffer++;
  28   3                              t_in=++t_in&0x3ff;
  29   3                              length--;
  30   3                              while(t_done);  //如果正在发送最后字节则等待发送完成
  31   3                      if(!t_empty)
  32   3                      {
  33   4                                      t_empty=1;
  34   4                                      TI=1;   //启动新一轮发送
  35   4                      }
  36   3                 }
  37   2              }while(length);
  38   1      }
  39          
  40          /*-----------------------------------------------------
  41          ;     串口字符发送程序
  42          ;     入口参数:  ch == 欲发送的字符串
  43          ;     出口参数:  无
  44          -----------------------------------------------------*/
  45          //void send_char(uchar ch)
  46          //{
  47          //      while(1)
  48          //      {
  49          //      if((((t_in+1)^t_out)&0x3ff)!=0)         /*测试缓冲区满*/
  50          //      {
  51          //                      t_buf[t_in]=ch;
  52          //                      t_in=++t_in&0x3ff;
  53          //                      while(t_done);  //如果正在发送最后字节则等待发送完成
  54          //              if(!t_empty)
  55          //              {
C51 COMPILER V7.00  COMM                                                                   09/22/2005 17:15:32 PAGE 2   

  56          //                              t_empty=1;
  57          //                              TI=1;   //启动新一轮发送
  58          //              }
  59          //                      return;
  60          //      }
  61          //      }
  62          //}
  63          
  64          /*--------------------------------------------------------------
  65                  等待发送结束
  66                  出口参数:
  67                          == 0 正确
  68                          == 1 超时
  69          --------------------------------------------------------------*/
  70          uchar wait_send_end(void)
  71          {
  72   1              uchar i;
  73   1              i = 5;
  74   1              time = 200;                     /*设TIME的初值为200,字符间隔时间为1秒*/
  75   1              do
  76   1              {
  77   2                      if(!t_empty) {return(0);}
  78   2                      if(!time)
  79   2              {
  80   3                      time = 200;               /*设TIME的初值为200,字符间隔时间为1秒*/
  81   3                      i--;
  82   3              }
  83   2              }while(i);
  84   1              return(1);
  85   1      }
  86          
  87          /*-----------------------------------------------------
  88          ;     串口接收程序
  89          ;     入口参数:  buffer == 数据缓冲区指针
  90          ;                length == 数据的长度
  91          ;     出口参数:  == 0 正确
  92          ;                != 0 超时(TIMEO)
  93          -----------------------------------------------------*/
  94          uchar rece(uint length,uchar *buffer)
  95          {
  96   1              uchar rece_one;         /*==1,已接收了一个字节*/
  97   1              uint len;
  98   1      
  99   1              rece_one = 0;
 100   1              len=0;
 101   1              time = 200;                     /*设TIME的初值为200,字符间隔时间为1秒*/
 102   1              while(time)
 103   1              {
 104   2              if(r_out!=r_in)         /*缓冲区非空*/
 105   2                              {
 106   3                                      buffer[len]=r_buf[r_out];
 107   3                                      length--;
 108   3                                      r_out=++r_out&0x3ff;
 109   3                                      if(length==0)   return(0);
 110   3                                      time=200;            /*字符间隔时间为1秒*/
 111   3                                      len++;
 112   3                              }
 113   2              }
 114   1              if(len) return(0xd3);
 115   1              else return(0xd4);
 116   1      }
 117          
C51 COMPILER V7.00  COMM                                                                   09/22/2005 17:15:32 PAGE 3   

 118          /*-----------------------------------------------------
 119               清除串口缓冲区
 120          -----------------------------------------------------*/
 121          void clear_rece_buffer(void)
 122          {
 123   1              r_out=r_in;
 124   1              r_full=0;
 125   1      }
 126          
 127          /*-----------------------------------------------------
 128          ;     串口接收一行程序
 129          ;     入口参数:  buffer == 数据缓冲区指针
 130          ;     出口参数:  == 0 正确
 131          ;                != 0 超时(TIMEO)
 132          -----------------------------------------------------*/
 133          
 134          //uchar receline(uchar *buffer)
 135          //{
 136          //      uchar *buf;
 137          //      buf=buffer;
 138          //      time = 200;                     /*设TIME的初值为200,字符间隔时间为1秒*/
 139          //      while(time)
 140          //      {
 141          //              if(r_out!=r_in)              /*缓冲区非空*/
 142          //              {
 143          //              *buffer = r_buf[r_out];
 144          //                      r_out=++r_out&0x3ff;
 145          //                      time = 200;       /*设TIME的初值为200,字符间隔时间为1秒*/
 146          //              if(*buffer == 0x0a) return 0;
 147          //                      buffer++;
 148          //              }
 149          //      }
 150          //      if(buf!=buffer) return 0xd3;
 151          //      else return 0xd4;       
 152          //}
 153          
 154          /*-----------------------------------------------------
 155          ;     串口接收1byte程序
 156          ;     入口参数:  buffer == 数据缓冲区指针
 157          ;     出口参数:  == 0 没有数据
 158          ;                == 1 返回1Byte,还有接收数据没有被读取
 159          ;                == 3 返回1Byte,没有剩余数据
 160          -----------------------------------------------------*/
 161          
 162          uchar rece_s(uchar *buffer)
 163          {
 164   1              if(r_out!=r_in)         /*缓冲区非空*/
 165   1              {
 166   2                      *buffer=r_buf[r_out];
 167   2                      r_out=++r_out&0x3ff;
 168   2                      if(r_out!=r_in) return 1;
 169   2                      return 3;
 170   2              }
 171   1              return 0;
 172   1      }
 173          
 174          /***********************************************************************************
 175          接收命令包
 176          ***********************************************************************************/
 177          uchar rece_cmd(uchar *cmd,uchar *package,uint *len,uchar *para)
 178          {
 179   1              uchar error,error1,buf[10],xor;
C51 COMPILER V7.00  COMM                                                                   09/22/2005 17:15:32 PAGE 4   

 180   1              uint temp,i;
 181   1              
 182   1              error=rece(2,buf);
 183   1              #ifdef ZLH_DEBUG
 184   1      //      disp_data(2,"A4");
 185   1      //      disp_data(1,&error);
 186   1      //      disp_data(2,buf);
 187   1              #endif
 188   1              if(error){
 189   2                      if((error==0xd3)&&(buf[0]==0x1b)){
 190   3                      error1=rece_s(&buf[1]);
 191   3                      if(error1&&(buf[1]==0x10)) goto RECE_DATA;
 192   3                 }                     
 193   2                 return OVER_TIME;
 194   2              }
 195   1              if(buf[1]==0x1b){
 196   2                      error1=rece_s(&buf[2]);
 197   2              if(error1&&(buf[2]==0x10)) goto RECE_DATA;  
 198   2              else return OVER_TIME;
 199   2         }
 200   1         if((buf[0]!=0x1b)||(buf[1]!=0x10)) return OVER_TIME;
 201   1         
 202   1      RECE_DATA:
 203   1              buf[0]=0x1b;buf[1]=0x10;
 204   1         error=rece(4,&buf[2]);
 205   1         if(error) return CMD_HEAD_ERR;
 206   1                              
 207   1              *cmd=buf[2];
 208   1              *package=buf[3];
 209   1              temp=*((uint *)&buf[4]);
 210   1              temp=temp-6+1;
 211   1              
 212   1              error=rece(temp,para);
 213   1              if(error) return RECE_DATA_ERR;
 214   1              
 215   1              xor=buf[0];
 216   1              for(i=1;i<6;i++)
 217   1                      xor^=buf[i];
 218   1              for(i=0;i<temp-1;i++)
 219   1                      xor^=para[i];   
 220   1      
 221   1              #ifdef ZLH_DEBUG
 222   1      //      disp_data(2,"A4");
 223   1      //      disp_data(1,&xor);
 224   1      //      disp_data(1,&para[temp-1]);
 225   1              #endif
 226   1      //      if(xor==para[temp-1])
 227   1      //      {
 228   1                      *len=temp-1;
 229   1                      return 0;
 230   1      //      }       
 231   1      //      else return XOR_ERR;
 232   1      }
 233          
 234          /****************************************************************************************
 235          发送应答数据包
 236          ****************************************************************************************/
 237          uchar send_data(uchar package,uint len,uchar *para)
 238          {
 239   1              uchar buf[20],xor,j,error;
 240   1              uint i,temp;
 241   1              
C51 COMPILER V7.00  COMM                                                                   09/22/2005 17:15:32 PAGE 5   

 242   1              buf[0]='O';buf[1]='K';
 243   1              buf[2]=package;
 244   1              temp=len+5;
 245   1              buf[3]=(uchar)(temp>>8);
 246   1              buf[4]=(uchar)temp;
 247   1              
 248   1              xor=buf[0];
 249   1              for(i=1;i<5;i++)
 250   1                      xor^=buf[i];
 251   1              if(len){        
 252   2                      for(i=0;i<len;i++)
 253   2                              xor^=para[i];
 254   2              }               
 255   1              for(i=0;i<3;i++){               
 256   2                      send_str(5,buf);
 257   2                      if(len) send_str(len,para);
 258   2                      send_str(1,&xor);
 259   2                      clear_rece_buffer();
 260   2                      if(package){
 261   3                              wait_send_end();
 262   3                              for(j=0;j<10;j++){
 263   4                                      error=rece(1,&buf[10]);
 264   4                                      if((!error)&&((buf[10]==0x32)||(buf[10]==0x33)))
 265   4                                              break;
 266   4                              }
 267   3                              if(j==10) continue;
 268   3                              if(buf[10]==0x32) return 0;
 269   3                      }else{
 270   3                              return 0;
 271   3                      }
 272   2              }
 273   1              return COMM_ERR;                                        
 274   1      }
 275          
 276          /*****************************************************************************************
 277          发送出错应答
 278          *****************************************************************************************/      
 279          void send_error(uchar error)
 280          {
 281   1              uchar buf[20];
 282   1              uchar i;
 283   1              
 284   1              buf[0]='E';
 285   1              buf[1]='R';
 286   1              buf[2]=0;
 287   1              buf[3]=0;buf[4]=6;
 288   1              buf[5]=error;
 289   1              buf[6]=buf[0];
 290   1              for(i=1;i<6;i++)
 291   1                      buf[6]^=buf[i];
 292   1              send_str(7,buf);
 293   1      }
 294          
 295                          
 296                  
 297                  
 298                  


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1150    ----
   CONSTANT SIZE    =   ----    ----
C51 COMPILER V7.00  COMM                                                                   09/22/2005 17:15:32 PAGE 6   

   XDATA SIZE       =   2048      83
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -