天线|RF射频
直播中

石径

7年用户 156经验值
私信 关注
[问答]

两个51单片机利用NRF24L01无线模块进行无线通信收不到任何数据怎么办?

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

回帖(5)

罗宏达

2020-6-11 15:39:23
很明显,你的发送主程序执行一次按键后就退出循环了,之后发送完成就结束了
举报

乐侨珂

2020-6-11 15:55:21
1、检查你的函数返回值是“0”还是“1”,比如发送完成的标准写法是“0”,尽量不要写“1”,这在C语言中是标准,表示正常返回
2、去掉这条语句while(CheckACK());试试,容易出错
举报

王洋

2020-6-11 16:07:00
你调试出来了吗,可否把程序给我分享一下
举报

王子云

2020-6-11 16:12:15
你的原理图发出来看看
举报

更多回帖

发帖
×
20
完善资料,
赚取积分