请教两个51单片机利用NRF24L01无线模块进行无线通信发送数据的问题

2019-07-18 17:08发布

       想用两个51单片机和NRF24L01模块实现无线通信,两个单片机一个做主机一个做从机,每个上面都连接无线模块。当按下主机上某按键时,会将对应的数据发送出去,比如按下主机键1则主机发送数据1,按下主机键2则主机发送数据2,从机一直处于接收模式,但是现在的实验现象却一直有问题,从机始终只能接收到第一次按键按下所发送的数据,以后再按按键,从机就收不到主机发来的数据,比如先按键1再按键2,从机就只能收到数据1,以后再按键从机也收不到任何数据;先按键2再按键1,从机就只能收到数据2,以后再按键从机也收不到任何数据。不知道是哪里出了问题。
主机程序
#include "NRF24L01.H"
sbit key1 = P3^0;
sbit key2 = P3^1;                  
sbit LED1=P1^0;
sbit LED2=P1^1;


uchar keyscan()                //按键函数
{
  uchar temp;
  if(key1==0)
    {
      delay_ms(10);
      if(key1==0)
        {
          temp=1;
        }
    }
  if(key2==0)
    {
      delay_ms(10);
      if(key2==0)
        {
          temp=2;
        }
    }
  return temp;
}


void main()
{
    uint flag=1,key;
    CE = 0;
    SCK = 0;
    CSN = 1;
    Serial_Init();   //初始化串口
    while(1)   //循环检测按键  并将对应数据发送出去       
    {           
          while(flag)
          {
            key=keyscan();              //检测按键,有按键按下则退出内循环执行后面的语句
                if((key==1)|(key==2))      
                flag=0;               
          }
                    
          TX_Mode();          //发送模式,将数据发送出去
          Delay(100);          
          if(key==1)
          {
           LED1=0;
           Transmit(Tx_Buf1);       //Tx_Buf1=0x01
           Serial_SendString(Tx_Buf1);
          }
          if(key==2)
          {
           LED2=0;
           Transmit(Tx_Buf2);           //Tx_Buf2=0x02
           Serial_SendString(Tx_Buf2);
          }
          while(CheckACK());
          Delay(100);
          
          LED1=1;
          LED2=1;                                             
          flag=1;                      //flag置1,则可执行下一次按键检测操作
        }                                       
}
从机程序

#include "NRF24L01.H"                  
sbit LED=P1^0;
void main()
{
    CE = 0;
    SCK = 0;
    CSN = 1;
   Serial_Init();  //初始化串口                         
   while( 1 )
        {
          RX_Mode();  //设置为接收模式,循环接收
          Delay(100);  //防止编译警告                          
          if(nRF24L01_RxPacket(Rx_Buf1))   如果接收到数据
                {
                           LED=1;                         
                           Serial_SendString(Rx_Buf1);   //就将数据显示在电脑上
                }
                  else
                          LED=0;                                                                    
                }                                       
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。