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

📄 can.lst

📁 该程序完成了c8051外围电路的驱动和串口协议的编写。希望能给大家学习51单片机带来帮助
💻 LST
📖 第 1 页 / 共 2 页
字号:
 239   1              uchRemotAndData[5]= '\0';
 240   1              uchRemotAndData[6]= '\0';
 241   1      
C51 COMPILER V7.10   CAN                                                                   09/18/2008 14:09:31 PAGE 5   

 242   1              
 243   1              writeCANdataRemateFrame(uchRemotAndData);       
 244   1      }
 245          
 246          
 247          
 248          
 249          /////////////////////////////////////////////////////////////////////////////////////////
 250          //void CanFrameInterrupt();
 251          //入口参数:无  
 252          //函数返回:无
 253          //全局变量:uchDataRecBuf[][9]:收到的数据,send_address:发送芯片的地址
 254          //功能描述:整理接收区内的数据
 255          //函数说明
 256          //编写人:  郑福
 257          //编写完成时间: 2007-04-20
 258          //修改人:
 259          //修改完成时间:
 260          //修改原因:                                                
 261          /////////////////////////////////////////////////////////////////////////////////////////
 262          void CanFrameInterrupt(unsigned char *uchReceiData)
 263          {
 264   1              unsigned char uchFrameType;
 265   1              unsigned char uchFrameFlag;
 266   1              unsigned char uchFrameNum;
 267   1              unsigned char uchResidByteNum;
 268   1              unsigned char uchRemoFrameAdd;   //远程帧发送方地址
 269   1              unsigned char uchBagResponFlag;  //00:不需要回应 01:需要回应
 270   1              unsigned char uchRemoFramedata[3];
 271   1              unsigned char *puchReceiData;     //接收数据的指针
 272   1          unsigned  char  uchReceiFrameSerial = 0;
 273   1              unsigned char  uchtemp = 0;
 274   1      
 275   1          puchReceiData=uchReceiData;
 276   1          
 277   1              uchRemoFramedata[0] = 0x10;            //响应帧
 278   1              uchRemoFramedata[1] = 0x00;            //远程帧无数据
 279   1              uchRemoFramedata[2] = '\0';
 280   1              uchReceiFrameSerial = (puchReceiData[4]>>6) & 0x03;
 281   1          uchFrameNum = uchReceiFrameSerial;
 282   1              uchFrameType = puchReceiData[0] & 0xc0;
 283   1              if (uchFrameType == 0xc0)
 284   1              {
 285   2                      uchRemoFrameAdd = puchReceiData[3] & 0x3f;//发送芯片的地址
 286   2      //              Close_CANReSend();//关闭发送超时定时器4                 
 287   2              }
 288   1              else//开始else
 289   1              {               
 290   2                      uchFrameFlag = puchReceiData[2] & 0xc0;   //11 00  00000
 291   2                      if (uchFrameFlag == 0x00)           //0000 0000
 292   2                      {                               
 293   3                              uchDataRecBuf[uchDataRecBufIndex][0] = puchReceiData[3] & 0x3f;//发送芯片的地址
 294   3                              uchDataRecBuf[uchDataRecBufIndex][3] = puchReceiData[5];
 295   3                              uchDataRecBuf[uchDataRecBufIndex][4] = puchReceiData[6];
 296   3                              uchDataRecBuf[uchDataRecBufIndex][5] = puchReceiData[7];
 297   3                              uchDataRecBuf[uchDataRecBufIndex][6] = puchReceiData[8];
 298   3                              uchDataRecBuf[uchDataRecBufIndex][7] = puchReceiData[9];
 299   3                              uchDataRecBuf[uchDataRecBufIndex][8] = puchReceiData[10];
 300   3                              uchDataRecBuf[uchDataRecBufIndex][9] = puchReceiData[11];
 301   3                              uchDataRecBuf[uchDataRecBufIndex][10] = puchReceiData[12];
 302   3                  uchFrameRotateIndex = 0;
 303   3                      }
C51 COMPILER V7.10   CAN                                                                   09/18/2008 14:09:31 PAGE 6   

 304   2                      else 
 305   2                              if( uchFrameFlag == 0x40 ) //0100 0000
 306   2                              {       
 307   3                                      uchtemp = uchFrameRotateIndex*4*8;                              
 308   3                                      uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+3] = puchReceiData[5];
 309   3                                      uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+4] = puchReceiData[6];
 310   3                                      uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+5] = puchReceiData[7];
 311   3                                      uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+6] = puchReceiData[8];
 312   3                                      uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+7] = puchReceiData[9];
 313   3                                      uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+8] = puchReceiData[10];
 314   3                                      uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+9] = puchReceiData[11];
 315   3                                      uchDataRecBuf[uchDataRecBufIndex][uchtemp+uchFrameNum*0x08+10] = puchReceiData[12];
 316   3      
 317   3                      if (uchFrameNum==0x03)
 318   3                      {
 319   4                          uchFrameRotateIndex++;
 320   4                      }
 321   3                              }
 322   2                              else 
 323   2                                      if (uchFrameFlag == 0x80)
 324   2                                      {                                                               
 325   3                                              puchReceiData[0] = puchReceiData[0] & 0x0f;//数据长度
 326   3                          uchDataRecBuf[uchDataRecBufIndex][1] = (uchFrameRotateIndex*4*8+uchFrameNum*8+puchRece
             -iData[0])/256;
 327   3                                              uchDataRecBuf[uchDataRecBufIndex][2] = (uchFrameRotateIndex*4*8+uchFrameNum*8+puchReceiData[0])%256;
 328   3                                              for (uchResidByteNum=0; uchResidByteNum<puchReceiData[0]; uchResidByteNum++)
 329   3                                              {                       
 330   4                                                      uchDataRecBuf[uchDataRecBufIndex][uchFrameRotateIndex*4*8+uchFrameNum*0x08+3+uchResidByteNum] = puch
             -ReceiData[5+uchResidByteNum];
 331   4                                              }
 332   3                                              uchDataRecBuf[uchDataRecBufIndex][uchFrameRotateIndex*4*8+uchFrameNum*0x08+3+uchResidByteNum+1] = '\0
             -';        
 333   3                          uchFrameRotateIndex = 0;
 334   3                                              uchDataRecBufIndex++;//增加一包记录
 335   3                                              if (uchDataRecBufIndex>=8) 
 336   3                                              {
 337   4                                                      uchDataRecBufIndex = 0;//到了包的边界
 338   4                                              }
 339   3                                              if (uchDataRecBufIndex==uchReadDataRecBufIndex)
 340   3                                              {
 341   4                                              uchReadDataRecBufIndex++;  //说明前面的包没有读走,后面的包将要覆盖前面的数据
 342   4                                              }
 343   3                                              uchRemoFrameAdd = puchReceiData[3] & 0x3f;
 344   3                                              uchBagResponFlag = puchReceiData[3] & 0x40;
 345   3                          if ((puchReceiData[2]<<2)!=0xfc)
 346   3                          {
 347   4                                                      if (uchBagResponFlag == 0x40)
 348   4                                                  {
 349   5                                                              SendPackageRemoteFrame(0x47, uchRemoFrameAdd, uchRemoFramedata);  //发送响应帧 
 350   5                                                      }
 351   4                          }
 352   3                                      }
 353   2                                      else 
 354   2                                              if (uchFrameFlag == 0xc0)
 355   2                                              {
 356   3                                                      puchReceiData[0] = puchReceiData[0] & 0x0f;
 357   3                                                      uchDataRecBuf[uchDataRecBufIndex][0] = puchReceiData[3] & 0x3f;//发送芯片的地址
 358   3                                                      uchDataRecBuf[uchDataRecBufIndex][1] = 0;
 359   3                                              uchDataRecBuf[uchDataRecBufIndex][2] = puchReceiData[0];
 360   3                                                      for (uchResidByteNum=0; uchResidByteNum<puchReceiData[0]; uchResidByteNum++)
 361   3                                                      {       
 362   4                                                              uchDataRecBuf[uchDataRecBufIndex][3+uchResidByteNum] = puchReceiData[5+uchResidByteNum];
C51 COMPILER V7.10   CAN                                                                   09/18/2008 14:09:31 PAGE 7   

 363   4                                                      }
 364   3                                                      uchDataRecBuf[uchDataRecBufIndex][3+uchResidByteNum+1] = '\0';  
 365   3                                                      uchDataRecBufIndex++;//增加一包记录
 366   3                                                      if (uchDataRecBufIndex>=8) 
 367   3                                                      {
 368   4                                                              uchDataRecBufIndex=0;     //到了包的边界
 369   4                                                      }
 370   3                                                      if (uchDataRecBufIndex==uchReadDataRecBufIndex)
 371   3                                                  {
 372   4                                                              uchReadDataRecBufIndex++; //说明前面的包没有读走,后面的包将要覆盖前面的数据
 373   4                                                      }
 374   3                                                      uchRemoFrameAdd = puchReceiData[3] & 0x3f;
 375   3                                                      uchBagResponFlag = puchReceiData[3] & 0x40;
 376   3                              if ((puchReceiData[2]<<2)!=0xfc)
 377   3                              {
 378   4                                                              if (uchBagResponFlag == 0x40)
 379   4                                                          {
 380   5                                                                      SendPackageRemoteFrame(0x47, uchRemoFrameAdd, uchRemoFramedata);  //发送响应帧 
 381   5                                                              }
 382   4                              }
 383   3                                              }
 384   2      
 385   2              }// 结束ELSE    
 386   1      }
 387          /////////////////////////////////////////////////////////////////////////////////////////
 388          //unsigned char BagNum(void)
 389          //入口参数:    
 390          //函数返回:包数
 391          //全局变量:uchDataRecBuf[][9]:收到的数据,send_address:发送芯片的地址
 392          //功能描述:读出接收区内的数据
 393          //函数说明:
 394          //编写人:  郑福
 395          //编写完成时间: 2007-04-20
 396          //修改人:
 397          //修改完成时间:
 398          //修改原因:                                                
 399          /////////////////////////////////////////////////////////////////////////////////////////
 400          unsigned char BagNum(void)
 401          {       
 402   1              unsigned char idata uchInforBagNum;
 403   1              if (uchDataRecBufIndex>=uchReadDataRecBufIndex)
 404   1          {
 405   2                      uchInforBagNum = uchDataRecBufIndex-uchReadDataRecBufIndex;//接收缓存区数据
 406   2              }
 407   1              else 
 408   1              {
 409   2                      uchInforBagNum = 8+uchDataRecBufIndex-uchReadDataRecBufIndex;
 410   2              }
 411   1              return uchInforBagNum;   
 412   1      }
 413          
 414          /////////////////////////////////////////////////////////////////////////////////////////
 415          //unsigned char* GetAMessage(void)
 416          //入口参数:    
 417          //函数返回:优先级(即事件类型)0:报警事件,1:系统事件,2:信号,3:初始化数据,4:数据读写
 418          //全局变量:uchDataRecBuf[][9]:收到的数据,send_address:发送芯片的地址
 419          //功能描述:读出接收区内的数据
 420          //函数说明:一定要在指针减一前,关闭CAN中断,指针减一后,打开CAN中断
 421          //编写人:  郑福
 422          //编写完成时间: 2007-04-20
 423          //修改人:
 424          //修改完成时间:
C51 COMPILER V7.10   CAN                                                                   09/18/2008 14:09:31 PAGE 8   

 425          //修改原因:                                                
 426          /////////////////////////////////////////////////////////////////////////////////////////
 427          unsigned char *GetAMessage(void)
 428          { 
 429   1              unsigned char *puchGetRec; 
 430   1              if (uchReadDataRecBufIndex==uchDataRecBufIndex) 
 431   1              {
 432   2                      puchGetRec = '\0';   //没有数据包
 433   2              }
 434   1              else 
 435   1              {
 436   2                      puchGetRec = uchDataRecBuf[uchReadDataRecBufIndex];
 437   2                      if (uchReadDataRecBufIndex<7)
 438   2                      {
 439   3                      uchReadDataRecBufIndex++;
 440   3                      }
 441   2                      else 
 442   2                      {
 443   3                              uchReadDataRecBufIndex = 0;
 444   3                      }
 445   2              }       
 446   1              return puchGetRec; //收到的数据指针
 447   1      }
 448          
 449          /////////////////////////////////////////////////////////////////////////////////////////////////
 450          //void ClearAllMessage();
 451          //入口参数:      无
 452          //函数返回:      无
 453          //功能描述:      清除CAN接收的整包数据
 454          //编写人:        郑福
 455          //编写完成时间:  2007-04-20
 456          //修改人:
 457          //修改完成时间:
 458          //修改原因:
 459          /////////////////////////////////////////////////////////////////////////////////////////////////
 460          void ClearAllMessage()
 461          {
 462   1              uchDataRecBufIndex = uchReadDataRecBufIndex;//清除接收缓存区数据
 463   1      }
 464          
 465          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2194    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   2300      18
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3      23
   IDATA SIZE       =      4      17
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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