OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6873|回复: 5

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

[复制链接]

5

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2016-3-6
在线时间
9 小时
发表于 2016-6-7 09:45:29 | 显示全部楼层 |阅读模式
5金钱
      想用两个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;                                                                    
                }                                       
}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
853
金钱
853
注册时间
2016-4-7
在线时间
151 小时
发表于 2016-6-8 14:16:07 | 显示全部楼层
很明显,你的发送主程序执行一次按键后就退出循环了,之后发送完成就结束了
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-3-12
在线时间
34 小时
发表于 2016-6-10 15:19:16 | 显示全部楼层
1、检查你的函数返回值是“0”还是“1”,比如发送完成的标准写法是“0”,尽量不要写“1”,这在C语言中是标准,表示正常返回
2、去掉这条语句while(CheckACK());试试,容易出错
回复

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-4-25
在线时间
2 小时
发表于 2017-4-25 23:31:06 | 显示全部楼层
你调试出来了吗,可否把程序给我分享一下
回复

使用道具 举报

3

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-6-22
在线时间
56 小时
发表于 2017-7-13 17:22:13 | 显示全部楼层
你的原理图发出来看看
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2018-8-6
在线时间
0 小时
发表于 2018-8-6 16:58:48 | 显示全部楼层
yunchong 发表于 2017-4-25 23:31
你调试出来了吗,可否把程序给我分享一下

有的话,也分享给我一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-11 03:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表