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

📄 main.lst

📁 这是一个单片机的项目
💻 LST
📖 第 1 页 / 共 3 页
字号:
 396          功能:ClearComRam
 397          描述:清零字节数存储地址
 398          参数:address---需要清零的地址
 399          返回:无
 400          *****************************************************************************************/
 401          void ClearComRam(uint address)
 402          {
 403   1          uchar temp[2];
 404   1          temp[0]=0x00;
 405   1          temp[1]=0x00;
 406   1          ComWriteBytes(address,temp,2);
 407   1      }
 408          
 409          /****************************************************************************************
 410          功能:SetComDataBytes;设置字节数的函数
 411          描述:设置公共RAM的字节长度。是先读出长度,再累加一个需要设置的长度。
 412          参数:address---需要设置字节数的地址;len---需要设置的长度。
 413          返回:无
 414          ****************************************************************************************/
 415          void SetComDataBytes(uint address,uchar len)
 416          {
 417   1              uint num;
 418   1              uchar temp[2];
 419   1              ComReadBytes(address,temp,2);
 420   1              num = temp[0] + temp[1] * 0x100 + len;   
 421   1              temp[0]=num%256;
 422   1              temp[1]=num/256; 
 423   1          ComWriteBytes(address,temp,2);
 424   1      }
 425          
 426          /****************************************************************************************
 427          功能:GetComDataBytes;取到字节数的函数
C51 COMPILER V7.50   MAIN                                                                  03/17/2008 20:43:15 PAGE 8   

 428          描述:取得公共RAM里的数据字节数
 429          参数:address---存放字节数的地址
 430          返回:uint
 431          ****************************************************************************************/
 432          uint GetComDataBytes(uint address)
 433          {
 434   1              uint num;
 435   1              uchar temp[2];
 436   1              ComReadBytes(address,temp,2);
 437   1              num = temp[0] + temp[1] * 256;
 438   1              return num;
 439   1      }
 440          
 441          /****************************************************************************************
 442          功能:MainSerialReceive,串口接受,完整的一串命令保存
 443          描述:MainSerialReceive主要负责接收服务器用串口发来的命令数据,并且保存在RecvOrderBuff数组
 444               中,当达到接收个数时候,设置FlagSaveSerial标志,然后由SaveSerial函数来保存命令,命令
 445                   主要分为InitState---命令的起始标志状态,CommandState---包标志状态,DataState---数据
 446                   状态组成;FlagOrderSaved是接收的命令已保存的标志,只有当接收数组的命令已保存才可以再
 447                   次接收,否则可能冲掉原来的命令。
 448          参数:无
 449          返回:无
 450          ****************************************************************************************/
 451          void MainSerialReceive(void) interrupt 4 using 0
 452          {
 453   1          uchar ch;
 454   1          if(RI)
 455   1          {        
 456   2              RI = 0;
 457   2              ch=SBUF;
 458   2             switch (RecvState) 
 459   2                 {
 460   3               case InitState:  
 461   3                    if (ch == StartFlag && FlagOrderSaved) // 开始字节
 462   3                         {  RecvCount = 0;
 463   4                        RecvState=CommandState; // 下一个状态
 464   4                                    RecvOrderBuff[RecvCount++]=ch; 
 465   4                     }
 466   3                     break;
 467   3      
 468   3               case CommandState:
 469   3                    if (!valid_cmd[ch])// 无效命令字节
 470   3                                { 
 471   4                        RecvState=InitState; 
 472   4                    } 
 473   3                            else 
 474   3                                {
 475   4                        RecvState=DataState;
 476   4                        RecvOrderBuff[RecvCount++]=ch; // 保存命令
 477   4      
 478   4                        switch(ch)
 479   4                        {
 480   5                          case CmdWs :
 481   5                               RecvSize=LenCmdWs;
 482   5                               break;
 483   5                                              case CmdSlave: 
 484   5                                                       RecvSize=LenCmdSlave;
 485   5                               break;
 486   5                          case CmdTime:
 487   5                                                       RecvSize=LenCmdTime ;
 488   5                               break;
 489   5                          case CmdAlarm :
C51 COMPILER V7.50   MAIN                                                                  03/17/2008 20:43:15 PAGE 9   

 490   5                                                       RecvSize=LenCmdAlarm;
 491   5                               break;
 492   5                          case CmdChannelPara:
 493   5                                                       RecvSize=LenCmdChannelPara;
 494   5                               break;
 495   5                                              case CmdGetChannelPara:
 496   5                                                   RecvSize=LenCmdGetChannelPara;
 497   5                                                   break;
 498   5                                              case CmdSlaveEnable:
 499   5                               RecvSize=LenCmdSlaveEnable;
 500   5                                                   break;
 501   5                          case CmdWsControl:
 502   5                               RecvSize=LenCmdWsControl;
 503   5                                                       FlagCmdWsControl=1;
 504   5                               break;
 505   5                          default:
 506   5                               break;
 507   5                                        }
 508   4                    }
 509   3                    break;
 510   3      
 511   3               case DataState: // 数据包内容
 512   3                     RecvOrderBuff[RecvCount++]=ch; // 保存数据
 513   3                              
 514   3                     if ((RecvCount)==RecvSize) //数据接收完毕
 515   3                         {                                               
 516   4                         if(!FlagCmdWsControl)  //当不是外设控制包的时候
 517   4                                         {
 518   5                             RecvState=InitState;                  
 519   5                             FlagSaveSerial=1;
 520   5                                 FlagOrderSaved = 0;
 521   5                                         }
 522   4                                         else
 523   4                                         {
 524   5                                                 FlagCmdWsControl=0;
 525   5                             RecvSize=LenCmdWsControl+RecvOrderBuff[LenCmdWsControl-1];
 526   5                                         }
 527   4                     }
 528   3                     break;
 529   3                        default: 
 530   3                     RecvState=InitState;
 531   3                     break;
 532   3                }
 533   2           }
 534   1      }
 535          
 536          /****************************************************************************************
 537          功能:SaveSerial,保存串口接收的一帧数据到自己的内存
 538          描述:当FlagSaveSerial=1的时候,将MainSerialReceive接收到RecvOrderBuff数组的数据保存到相应
 539               的存储空间中去。
 540          参数:无
 541          返回:无
 542          ****************************************************************************************/
 543          void SaveSerial()
 544          {   
 545   1              uchar ch;
 546   1              uchar i,j,k;
 547   1          uint Len;
 548   1              uint SaveAddr1;
 549   1      
 550   1          ch=RecvOrderBuff[1];
 551   1      
C51 COMPILER V7.50   MAIN                                                                  03/17/2008 20:43:15 PAGE 10  

 552   1              switch(ch)
 553   1              {
 554   2                  case CmdTime:  //时间命令包,总是保留最新的数据,无需叠加存储
 555   2                                                 SaveAddr1=MyTimeStart ;
 556   2                                                 MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存 
 557   2                                                 MyWriteOneByte(MyLenTimer,LenCmdTime); //存字节数
 558   2                                                 FlagOrderSaved = 1;  //设置命令已保存的标志,可以再接收命令了。
 559   2                                                 SendEndSignal();     //回送一个$$命令
 560   2                                                 break;
 561   2                  case CmdSlaveEnable:  //从机使能包,总是保留最新的数据,无需叠加存储
 562   2                                                 SaveAddr1= MySlaveEnable;
 563   2                             MyWriteOneByte(MyLenSlaveEnable,LenCmdSlaveEnable);
 564   2                                                 MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存 
 565   2                                                 MyWriteOneByte(MySlaveEnableNewFlag, 0x01); //置位从机使能更新状态表示。
 566   2                                                 FlagOrderSaved = 1;  //设置命令已保存的标志,可以再接收命令了。
 567   2                                                 SendEndSignal();     //回送一个$$命令
 568   2                                         break;
 569   2                  case CmdGetChannelPara: //获取从机外设基数偏差信息命令
 570   2                                                 Len=GetMyDataBytes(MyLenChannelInfo);
 571   2                                                 if(Len + RecvSize < MaxGetChannelParaLen)
 572   2                                                 {
 573   3                                                    SaveAddr1=MyChannelInfoStart + Len;                         
 574   3                                                    MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存
 575   3                                                        SetMyDataBytes(MyLenChannelInfo,LenCmdGetChannelPara);
 576   3                                                        FlagOrderSaved = 1;  //设置命令已保存的标志,可以再接收命令了。
 577   3                                                        SendEndSignal();     //回送一个$$命令
 578   3                                                 }
 579   2                                             break;
 580   2                      case CmdAlarm: //报警输出包
 581   2                                                 Len=GetMyDataBytes(MyLenOutput);
 582   2                                                 if(Len + RecvSize < MaxAlarmLen)
 583   2                                                 {
 584   3                                                    SaveAddr1=MyOutputStart + Len;
 585   3                                                    MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存 
 586   3                                                        SetMyDataBytes(MyLenOutput,LenCmdAlarm);
 587   3                                                        FlagOrderSaved = 1;  //设置命令已保存的标志,可以再接收命令了。
 588   3                                                        SendEndSignal();     //回送一个$$命令
 589   3                                                 }
 590   2                                             break;
 591   2                      case CmdChannelPara: //通道参数包
 592   2                                                 i=RecvOrderBuff[2]; //取得从机编号
 593   2                                                 j=RecvOrderBuff[3]; //取得外设编号
 594   2                                                 k=RecvOrderBuff[4]; //取得通道编号
 595   2                                                 SaveAddr1=Slave1Ws1ChannelInfo + (i-1)*0x500 + (j-1)* 0x100+k*9; //通过从机编号,外设编号,通道编

⌨️ 快捷键说明

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