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

📄 mmm.lst

📁 矿工定位系统单端
💻 LST
📖 第 1 页 / 共 5 页
字号:
 223   3              }
 224   2      
 225   2        }
 226   1       else
 227   1       {
 228   2             TI_1=0;
 229   2                 
 230   2        }
 231   1      }
 232                   /****************************************************************************
 233          *                                                                           *
 234          * Function:     isr_UART                                                    *
 235          *                                                                           *
 236          * Input:        -                                                           *
 237          * Output:       -                                                           *
C51 COMPILER V7.05   MMM                                                                   04/11/2005 02:18:28 PAGE 5   

 238          *                                                                           *
 239          * Description:                                                              *
 240          ****************************************************************************/
 241          void isr_UART(void) interrupt 4 using 2
 242          {
 243   1        unsigned char c , oldRecvState , i , bcc;
 244   1      
 245   1      //  WatchDog();
 246   1        
 247   1        if ( RI )                                         // Receive Command
 248   1        { 
 249   2          TR0 = 0 ;                              //stop t0
 250   2              c  = SBUF;
 251   2              RI = 0;
 252   2              if (RecvReady)
 253   2              {
 254   3              SendReady = FALSE;
 255   3          oldRecvState = RecvState;
 256   3              RecvState = RECV_STX;
 257   3        
 258   3        
 259   3          switch (oldRecvState)
 260   3              {                           
 261   4                case RECV_STX:         // Receive STX and answer DLE
 262   4                                                               if (c == STX)
 263   4                                           { 
 264   5                                                                 RecvState = RECV_ADDR0;
 265   5                                                                 START_T0(T_533_ms);
 266   5                                                               }
 267   4                                                               else
 268   4                                           {
 269   5                                                                 CALL_isr_T0() ;
 270   5                                           };
 271   4                                                       break;
 272   4       
 273   4            case RECV_ADDR0:       
 274   4                                                               if (c ==  ADDR)//0xd2)//MeterNum.chrX[3])
 275   4                                           {
 276   5                                     RecvState = RECV_ADDR1;
 277   5                                                                 START_T0(T_533_ms);
 278   5                                                               }
 279   4                                                               else
 280   4                                           {
 281   5                                                                 CALL_isr_T0() ;
 282   5                                           };
 283   4                                                       break;
 284   4            case RECV_ADDR1:       
 285   4                                                               if (c == 0x02)//MeterNum.chrX[2])
 286   4                                           {
 287   5                                     RecvState = RECV_ADDR2;
 288   5                                                                 START_T0(T_533_ms);
 289   5                                                               }
 290   4                                                               else
 291   4                                           {
 292   5                                                                 CALL_isr_T0() ;
 293   5                                           };
 294   4                                                       break;
 295   4            case RECV_ADDR2:       
 296   4                                                               if (c == 0x96)//MeterNum.chrX[1])
 297   4                                           {
 298   5                                     RecvState = RECV_ADDR3;
 299   5                                                                 START_T0(T_533_ms);
C51 COMPILER V7.05   MMM                                                                   04/11/2005 02:18:28 PAGE 6   

 300   5                                                               }
 301   4                                                               else
 302   4                                           {
 303   5                                                                 CALL_isr_T0() ;
 304   5                                           };
 305   4                                                       break;
 306   4      
 307   4            case RECV_ADDR3:       
 308   4                                                               if (c ==0x49) //MeterNum.chrX[0])
 309   4                                           { 
 310   5                                                                // LED_RED = ~LED_RED;
 311   5                                     En485 = SEND;
 312   5                                     //Ir_En = SEND;
 313   5                                                                 SBUF = DLE ;
 314   5                                                                 RecvState = RECV_DATA_DLE_ETX;
 315   5                                                                 DataDleReceived = FALSE;
 316   5                                                                 Index = 0;
 317   5                                                                 Cmdok = FALSE; 
 318   5                                                                 
 319   5                                                                 while( !TI );
 320   5                                                                 TI = FALSE;
 321   5                                                                 En485 = RECV;
 322   5                                     //Ir_En = RECV;
 323   5                                                                 START_T0(T_533_ms);
 324   5                                                               }
 325   4                                                               else
 326   4                                           {
 327   5                                                                 CALL_isr_T0() ;
 328   5                                           };
 329   4                                                       break;
 330   4      
 331   4                case RECV_DATA_DLE_ETX:// Receive data,DEL,ETX  and answer DLE
 332   4                                                               if (c == DLE) 
 333   4                                           { 
 334   5                                                                 if (!DataDleReceived)        //如果上一个不是DLE        丢掉
 335   5                                             {
 336   6                                                   DataDleReceived = TRUE;
 337   6                                                   RecvState = RECV_DATA_DLE_ETX;
 338   6                                                   START_T0(T_533_ms);
 339   6                                                   break;
 340   6                                             }
 341   5                                             else                                         //如果上一个是DLE
 342   5                                             {
 343   6                                                   DataDleReceived = FALSE; //留下
 344   6                                             };
 345   5                                                               }
 346   4                                                               else if (c == ETX)
 347   4                                                                    {
 348   5                                                              if (DataDleReceived)  //如果是结束标记    处理
 349   5                                                  {
 350   6                                                         DataDleReceived = FALSE;
 351   6                                                                                 
 352   6                                                                                 bcc = 0;
 353   6                                                     for (i = 0; i < Index; i++)
 354   6                                                     {
 355   7                                                         bcc ^= SerBuffer[i];
 356   7                                                     } ;
 357   6      
 358   6                                                                                 if( bcc == 0) 
 359   6                                                                                 { En485 = SEND;
 360   7                                               //Ir_En = SEND;
 361   7                                                                                   Cmdok = TRUE;
C51 COMPILER V7.05   MMM                                                                   04/11/2005 02:18:28 PAGE 7   

 362   7                                                                                   SBUF = DLE ;
 363   7                                                                                       while( !TI );
 364   7                                                                           TI = FALSE;
 365   7                                               En485 = RECV;
 366   7                                             //LED_RED = ~LED_RED;
 367   7                                               //Ir_En = RECV;
 368   7                                                                                 }
 369   6                                                                                 else
 370   6                                                                                 { En485 = SEND;
 371   7                                               //Ir_En = SEND;
 372   7                                                                                   Cmdok = FALSE;
 373   7                                                                                   SBUF = NAK ;
 374   7                                                                                       while( !TI );
 375   7                                                                           TI = FALSE;
 376   7                                               En485 = RECV;
 377   7                                               //Ir_En = RECV;
 378   7                                                                                 };
 379   6                                                                                      RecvState=RECV_STX;
 380   6                                                         break;
 381   6                                                  }
 382   5                                                  else
 383   5                                                  {
 384   6                                                         DataDleReceived = FALSE;   //如果不是结束标记  留下
 385   6                                                  };
 386   5                                                                    };
 387   4      
 388   4                                                               if (Index < SERBUFLEN)             //将数据写入SerBuffer[]
 389   4                                           {
 390   5                                             SerBuffer[Index++] = c;
 391   5                                           };
 392   4                                           RecvState = RECV_DATA_DLE_ETX;
 393   4                                           START_T0(T_533_ms);
 394   4                                                               break;
 395   4      
 396   4            case RECV_DLE: //Recieve answer from HOST
 397   4                                                               if ( c == DLE)
 398   4                                                               {
 399   5                                      En485 = SEND;
 400   5                                      //Ir_En = SEND;
 401   5                                                                  for (i = 0; i < (3 + SerBuffer[2] +1); i++)  //send data
 402   5                                              {  
 403   6                                                     SBUF = SerBuffer[i];
 404   6                                                     while (!TI);
 405   6                                                     TI = FALSE;
 406   6                                                     if ( SerBuffer[i] == DLE )          //send DLE two
 407   6                                                     {
 408   7                                                       SBUF = DLE;
 409   7                                                       while (!TI);
 410   7                                                       TI = FALSE;
 411   7                                                     };
 412   6                                              };
 413   5                                                               
 414   5                                                                      SBUF = DLE;                //send END
 415   5                                                                      while (!TI);
 416   5                                                  TI = FALSE;
 417   5      
 418   5                                                                      SBUF = ETX;
 419   5                                                                      while (!TI);
 420   5                                                  TI = FALSE;
 421   5                                                                      RecvState = RECV_DLE_OR_NAK ;
 422   5                                                  START_T0(T_533_ms);
 423   5                                      En485 = RECV;
C51 COMPILER V7.05   MMM                                                                   04/11/2005 02:18:28 PAGE 8   

 424   5                                      //Ir_En = RECV;
 425   5                                                               }
 426   4                                                               else
 427   4                                                               {
 428   5                                                                 CALL_isr_T0() ;
 429   5                                                               };
 430   4                                                               break;
 431   4      
 432   4            case RECV_DLE_OR_NAK: //Recieve answer from HOST
 433   4                                                               if ( c == DLE)
 434   4                                                               {
 435   5                                                                 SendOk = TRUE;
 436   5                                                                 SendReady = FALSE;
 437   5                                                                 RecvReady = TRUE;
 438   5                                                                 RecvState = RECV_STX;
 439   5                                                               }
 440   4                                                               else 
 441   4                                                               {
 442   5                                                                 SendOk = FALSE;
 443   5                                                                 SendReady = TRUE;
 444   5                                                                 RecvReady = FALSE;
 445   5                                                                 CALL_isr_T0() ;
 446   5                                                               };
 447   4                                   En485 = RECV;
 448   4                                   //Ir_En = RECV;
 449   4                                                               break;
 450   4      
 451   4                default:                           
 452   4                                       CALL_isr_T0() ;
 453   4                                                       break;
 454   4      
 455   4              };//end of case

⌨️ 快捷键说明

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