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

📄 scomservice.lst

📁 带时钟功能温度和湿度测量的仪器
💻 LST
📖 第 1 页 / 共 3 页
字号:
 419   4                                              case    _CMD_RD_RECNUM:
 420   4                                                      _CallMaster(_CMD_WR_RECNUM);
 421   4                                              break;
 422   4                                              case    _CMD_RD_MCUID:
 423   4                                                      CallMaster(_CMD_WR_MCUID);
 424   4                                              break;
 425   4                                              case    _CMD_RD_PCID:                           //保留的命令
 426   4                                                      CallMaster(_CMD_WR_PCID);
C51 COMPILER V7.20   SCOMSERVICE                                                           11/09/2002 21:11:16 PAGE 8   

 427   4                                              break;
 428   4                                              case    _CMD_RD_PCUSER:                         //保留的命令
 429   4                                                      CallMaster(_CMD_WR_PCUSER);
 430   4                                              break;
 431   4                                      /*--------以下开始为带参数命令----------*/
 432   4                                              //case  _CMD_SITE_INIT:
 433   4                                                              //系统状态初始化
 434   4                                              //              break;
 435   4                                              case    _CMD_WR_PCUSER:                         //保留的命令
 436   4                                                      //MasterUser=UartRecBuf[4];
 437   4                                                      //WriteOneChar(_REMOTE_USER,MasterUser);
 438   4                                              break;
 439   4                                              case    _CMD_WR_PCID:
 440   4                                          #if ((_DETECT_TASK>0)&&(_E2PROM_TASK>0))
 441   4                                                      MasterAddr=UartRecBuf[4];
 442   4                                                      WriteOneChar(_REMOTE_ID,MasterAddr);
 443   4                                              #endif
 444   4                                              break;
 445   4                                              case    _CMD_WR_MCUID:
 446   4                                              #if ((_DETECT_TASK>0)&&(_E2PROM_TASK>0))
 447   4                                                      SlaveAddr=UartRecBuf[4];
 448   4                                                      WriteOneChar(_LOCAL_ID,SlaveAddr);
 449   4                                          #endif
 450   4                                              break;
 451   4                                              case    _CMD_WR_RECNUM:
 452   4                                                      CurRecNum=UartRecBuf[4];
 453   4                                                      WriteOneChar(_CUR_REC_ADDR,CurRecNum);
 454   4                                              break;
 455   4                                              case    _CMD_WR_DATE:
 456   4                                              #if _CLOCK_TASK>0
 457   4                                                      ReadClock(ClkLcmBuf);
 458   4                                                      ClkLcmBuf[_ID_YEAR] =UartRecBuf[4];
 459   4                                                      ClkLcmBuf[_ID_MONTH]=UartRecBuf[5];
 460   4                                                      ClkLcmBuf[_ID_DAY]  =UartRecBuf[6];
 461   4                                                      ClockInitialize(ClkLcmBuf);
 462   4                                                      LcmMode=_DATE_RUN;
 463   4                                          #endif
 464   4                                              break;
 465   4                                              case    _CMD_WR_TIME:
 466   4                                              #if _CLOCK_TASK>0
 467   4                                                      ReadClock(ClkLcmBuf);
 468   4                                                      ClkLcmBuf[_ID_HOUR] =UartRecBuf[4];
 469   4                                                      ClkLcmBuf[_ID_MINUTE]=UartRecBuf[5];
 470   4                                                      ClkLcmBuf[_ID_SECOND]  =UartRecBuf[6];
 471   4                                                      ClockInitialize(ClkLcmBuf);
 472   4                                                      LcmMode=_TIME_RUN;
 473   4                                              #endif
 474   4                                              break;
 475   4                                              case    _CMD_WR_ALARM:                          //保留的命令
 476   4                                                      //;
 477   4                                              break;
 478   4                                              case    _CMD_WR_WEEK:
 479   4                                              #if _CLOCK_TASK>0
 480   4                                                      ReadClock(ClkLcmBuf);
 481   4                                                      ClkLcmBuf[_ID_WEEKLY] =UartRecBuf[4];
 482   4                                                      ClockInitialize(ClkLcmBuf);
 483   4                                                      LcmMode=_WEEKLY_RUN;
 484   4                                              #endif
 485   4                                              break;
 486   4      /*--------------------------------------*/
 487   4                                              default:
 488   4                                              break;          
C51 COMPILER V7.20   SCOMSERVICE                                                           11/09/2002 21:11:16 PAGE 9   

 489   4                              }
 490   3                              //CallMaster(_CMD_ACK);
 491   3                      }
 492   2                      else
 493   2                      {
 494   3                              cmd=0;
 495   3                      }
 496   2                      /*恢复通讯口的初始化状态*/
 497   2                      RecReady=0;
 498   2                      DataBlockCount=0;
 499   2                      RecUpFlg=0;
 500   2                      UartHead=0xeb;
 501   2                      //SystemState=_CMD_NORMAL_RUN;
 502   2                      //#if   _SCOM_TEST>0
 503   2                      //      SendByte(cmd);
 504   2                      //#endif
 505   2                      OpenScom();
 506   2              }
 507   1                      return cmd;
 508   1      }
 509          
 510          //#if  _CRC_EN>0
 511          #define _GOLD_CRC       0       //1:采用gold的CRC
 512          /*#######################################################################################//
 513            Function:     CRCverify()
 514            Description:  计算CRC常数
 515            Input:        CrcLeng、 :有效数据个数
 516                          uchar *Ptr:校验数据缓冲
 517            Output:       Null
 518            Return:       uint 返回余码
 519            Others:       CRC16-CCITT 按字节方式计算
 520            
 521            注:
 522            1.将一组数据进行CRC16运算后得到的CrcResult放在该序列后组成
 523            一个新组;接收方收到该组数据后在进行CRC16运算CrcResult=0表示
 524            无错误否则有错误!移位链的长度与CRC常数的长度相同!两次异或值
 525            还原;求得的CrcResult高字节在前低字节在后;
 526            2.只要移位链最高位出现一个1就要进行一次异或运算而移位链的值
 527            又来自序列所以要判断出序列中的1;
 528            CRC 根据”权”(即多项表达式)的不同而相应的源代码也有稍有不同,
 529            各种常用的权:
 530                  CRC8=X8+X5+X4+1                 //0x0031=1 0011 0001
 531                  CRC-CCITT=X16+X12+X5+1          //0x1021=1 0001 0000 0010 0001
 532                  CRC16=X16+X15+X5+1              //0x8021=1 1000 0000 0010 0001
 533                  CRC12=X12+X11+X3+X2+1           //0x080D=1 1000 0000 1101
 534                  CRC32=X32+X26+X23+X22+X16+X12   //0x04C11DB7=1 0000 0100 1100 
 535                  +X11+X10+X8+X7+X5+X4+X2+X1+1    //0001 0001 1101 1011 0111
 536            r1<-----------r2<---------------------|<------DataIn
 537            |                                     |
 538            ◎------------------------------------◎
 539          #########################################################################################*/
 540          uint CRCverify( uchar *Ptr,uint CrcLeng )       //本函数采用的方式速度最慢
 541          {
 542   1      #if  _GOLD_CRC >0                               //这种实现方式需要为序列空余出两个字节空间 后填充0
                      uchar  Crc_j;                           //循环计数用变量
                      uint   Crc_i;                           //循环计数用变量
                      uchar  r1,r2,r3,r4;                     //临时本地变量r3,r4;移位链r1,r2
                      uint   CrcResult;                       //CRC计算结果存放单元
              
                      *(Ptr+CrcLeng)=0;                       //在序列最后添加两个单元为0
                      *(Ptr+CrcLeng+1)=0;                     //
                      r1=*Ptr;                                //将首两个数据复制到r1、r2
C51 COMPILER V7.20   SCOMSERVICE                                                           11/09/2002 21:11:16 PAGE 10  

                      Ptr++;                                  //CrcResult=(r1<<8)|r2
                      r2=*Ptr;                                //先将前两个数据放入移位链中
                      Ptr++;
                      for (Crc_i=0;Crc_i<CrcLeng;Crc_i++)     //从最高位开始移位
                      {       
                              r3=*Ptr;                        //取出序列中的一个数据进行运算
                              Ptr++;
                              for (Crc_j=0;Crc_j<8;Crc_j++)   //r1(High),r2(Low)作为移位寄存器
                              {       
                                      r4=r1;                  //保存上一次的r1到r4
                                      
                                      /*将16位移位链低字节r2移动一位到高字节r1中*/
                                      r1=(r1<<1);             //移掉最高为等待低位移入
                                      if ((r2&0x80)!=0)
                                              r1++;
                                      
                                      /*把新数的最高位移入移位链低字节r2中*/
                                      r2=(r2<<1);             //移掉最高为等待低位移入
                                      if ((r3&0x80)!=0)
                                              r2++;
                                      r3=(r3<<1);
                                      
                                      /*移位操作完成等待判断是否进行异或运算*/
                                      if ((r4&0x80)!=0)       //如果上一次移位链最高位是1则异或
                                      {       
                                              r1=r1^0x10;     //CRCConstant=0x1021
                                              r2=r2^0x21;     //将移位链与CRC常数进行异或
                                      }
                              }
                      }
                      CrcResult=r1;
                      CrcResult<<=8;
                      CrcResult|=r2;
                      return (CrcResult);
              #else   //采用另外一种实现方式:序列不需要进入移位链 先填充0
 586   1              uchar i;
 587   1              uint CrcResult=0;
 588   1              while(CrcLeng--)
 589   1              {
 590   2                      for(i=0x80; i!=0; i>>=1)
 591   2                      {
 592   3                      /*      只要移位链中最高位为1则移动一次再异或否则只移动*/       
 593   3                              if((CrcResult&0x8000)!=0) 
 594   3                              {
 595   4                                      CrcResult<<=1; 
 596   4                                      CrcResult^=0x1021;      //两次异或值还原;
 597   4                              }                               //1-1
 598   3                              else 
 599   3                                      CrcResult<<=1;          //1-2
 600   3                      /*      只要序列中出现一个1就要进行一次异或运算
 601   3                              以下这句程序可以避免方法一中多余的两个字节      */      
 602   3                              if((*Ptr&i)!=0) 
 603   3                                      CrcResult^=0x1021;      //1-3
 604   3                      }
 605   2                      Ptr++;
 606   2              }
 607   1              return(CrcResult);
 608   1      #endif
 609   1      }       
 610          
 611          
 612          //#######################################################################################//
C51 COMPILER V7.20   SCOMSERVICE                                                           11/09/2002 21:11:16 PAGE 11  

 613          //#######################################################################################//
 614          #endif //#ifdef _SCOM_TASK


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1218    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      10
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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