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

📄 24e1_repeater.lst

📁 NRF24E1的信号中继程序,可使得传输距离更远,可用与做工业数据传输.
💻 LST
📖 第 1 页 / 共 3 页
字号:
 420   1              for (i=0;i<ADDR_COUNT;i++)
 421   1              {
 422   2                      SpiReadWrite(rfAddress2[i]);
 423   2              }
 424   1              SpiReadWrite(crc);
 425   1              for (i=0;i<4;i++)
 426   1              {
 427   2                      SpiReadWrite(pBuf[i]);
C51 COMPILER V7.08   24E1_REPEATER                                                         11/17/2006 16:36:46 PAGE 8   

 428   2              }
 429   1              CE = 0;
 430   1              Delay100us(6);                              // Wait until finished transmitting (200us + 256us)//delay(5)
 431   1      }
 432          
 433          
 434          
 435          /*****************************************************************************************
 436          //函数名:void SendAck(unsigned char msgid)
 437          //输入:发送的数据
 438          //输出:无
 439          //功能描述:发送发送缓冲区的数据
 440          /*****************************************************************************************/
 441          void SendAck(unsigned char msgid)
 442          {
 443   1          
 444   1          int8u i;
 445   1      
 446   1          SetTxMode();
 447   1          CE = 1;
 448   1          Delay100us(2);
 449   1      
 450   1          for (i=0;i<4;i++)
 451   1          {
 452   2              SpiReadWrite(rfAddress[i]);
 453   2          }
 454   1          SpiReadWrite(msgid);                        
 455   1          CE = 0;
 456   1          Delay100us(1);                               
 457   1                                                      
 458   1      }
 459          /*****************************************************************************************
 460          //函数名:int8u ReceivePacket(int8u *pBuf)
 461          //输入:接收数据缓冲区
 462          //输出:成功返回1,否则返回0
 463          //功能描述:接收数据存在缓冲区内
 464          /*****************************************************************************************/
 465          int8u ReceivePacket(int8u *pBuf)
 466          {
 467   1              int8u i,cmd;
 468   1      
 469   1              SetRxMode();
 470   1              CE = 1;    
 471   1              ResetTimer(1);
 472   1              while(DR1 == 0)
 473   1              {
 474   2                      if (ReadTimer(1) > 1000)
 475   2                      {
 476   3                              CE = 0;
 477   3                              return 0;
 478   3                      }
 479   2              }
 480   1              cmd = SpiReadWrite(0);
 481   1              i = 0;
 482   1              while(DR1)
 483   1              {
 484   2                      pBuf[i] = SpiReadWrite(0);
 485   2                      i++;
 486   2                      if (i == 5)
 487   2                      break;
 488   2              }
 489   1              while(DR1)
C51 COMPILER V7.08   24E1_REPEATER                                                         11/17/2006 16:36:46 PAGE 9   

 490   1              {
 491   2                      SpiReadWrite(0);
 492   2              }
 493   1              CE = 0;
 494   1              return cmd;
 495   1      }
 496          
 497          /******************************************************************************************
 498          *******************************************************************************************
 499          ************************************中断服务程序*******************************************
 500          *******************************************************************************************
 501          ******************************************************************************************/
 502          void Timer0ISR (void) interrupt 1  using 1              //定时器0中断
 503          {
 504   1              TF0 = 0;                                        // Clear Timer0 interrupt
 505   1              TH0 = t0hrel;                                   // Reload Timer0 high byte
 506   1              TL0 = t0lrel;                                   // Reload Timer0 low byte
 507   1              timer[0]++;                                     // Increment timer[0]
 508   1              timer[1]++;                                     // Increment timer[1
 509   1      }
 510          
 511          
 512          
 513          /*
 514          void UartISR (void) interrupt 4 using 2                 //串口中断
 515          {
 516                  int8u temp;
 517                  
 518                  EA = 0;
 519                  if(RI)
 520                  {
 521                          temp = SBUF;
 522                          if(temp == '@')                         //帧头
 523                          {               
 524                                  Rx.Buf[0] = '@';
 525                                  Rx.Counter = 1; 
 526                          }
 527                          else if(temp == '*')                    //帧尾
 528                          {               
 529                                  Rx.Buf[Rx.Counter] = temp;
 530                                  Rx.Buf[Rx.Counter + 1] = '\0';
 531                                  Rx.NewData = 1;
 532                          }
 533                          else if(Rx.Counter < 39){
 534                                  Rx.Buf[Rx.Counter] = temp;
 535                                  Rx.Counter += 1;
 536                          }
 537                          RI = 0;
 538                  }
 539                  if(TI)
 540                  {
 541                          TI = 0;
 542                  }
 543                  EA = 1;
 544          }
 545          
 546          */
 547          /******************************************************************************************
 548          *******************************************************************************************
 549          ******************************************主程序*******************************************
 550          *******************************************************************************************
 551          ******************************************************************************************/
C51 COMPILER V7.08   24E1_REPEATER                                                         11/17/2006 16:36:46 PAGE 10  

 552          void main(void)
 553          {       
 554   1              unsigned char temp,crc;
 555   1              unsigned char ack=0;                //ack为接收标记,若有则为1,退出循环
 556   1              unsigned char re_send_times,ack2;   //ack2为接受应答的值,若收到为0XAA
 557   1      
 558   1              SciInit();
 559   1              TimerInit();
 560   1              EA=1;  
 561   1              LEDR=0;
 562   1              LEDG=0;
 563   1              delay(5000);
 564   1              LEDR=1;
 565   1              LEDG=1;
 566   1              
 567   1              Nrf24E1Init();
 568   1      
 569   1              while(1)
 570   1              {
 571   2                      temp = ReceivePacket(buf);
 572   2                      crc=buf[0];
 573   2                      if(temp != 0)
 574   2                      {
 575   3                              SendAck(0xaa);
 576   3                              
 577   3      
 578   3                              // 转发和重发机制
 579   3                              ack=0;
 580   3                              re_send_times=0;
 581   3                              while(!ack)
 582   3                              {
 583   4                                      Nrf24E1Init2();
 584   4                                      TransmitPacket(buf,crc);
 585   4                                      ack2=0;
 586   4                                      ack2=WaitAck();
 587   4                                      if(ack2!=0xaa)
 588   4                                      {
 589   5                                              LEDR=1;
 590   5                                              LEDG=0;
 591   5                                              delay(5000);
 592   5                                              LEDR=1;
 593   5                                              LEDG=1;
 594   5                                              ack=0;
 595   5                                              re_send_times++;
 596   5                                              if(re_send_times>=3) ack=1;
 597   5                                              delay(10000);   
 598   5                                      }
 599   4                                      else
 600   4                                      {
 601   5                                              LEDR=0;
 602   5                                              LEDG=0;
 603   5                                              delay(5000);
 604   5                                              LEDR=1;
 605   5                                              LEDG=1;
 606   5                                              ack=1;
 607   5                                      }
 608   4                                      
 609   4                                      
 610   4                              }
 611   3                              delay(5000);
 612   3                              Nrf24E1Init();
 613   3                              
C51 COMPILER V7.08   24E1_REPEATER                                                         11/17/2006 16:36:46 PAGE 11  

 614   3                      }
 615   2              }
 616   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    677    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     72       9
   IDATA SIZE       =   ----    ----
   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 + -