📄 24e1_repeater.lst
字号:
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 + -