找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1792|回复: 2
打印 上一主题 下一主题
收起左侧

关于单片机+nRF24L01调试的几个问题,希望大佬解答

[复制链接]
跳转到指定楼层
楼主
想用两个普中单片机+两个NRF24L01实现无线控制,右侧单片机为发送端,左侧为接收端,原意是想右侧单片机按键K1按下时自身LED2点亮,左侧单片机接收到数据会点亮LED1和LED2。LCD1602显示的两个数,我是想第一个数是发送之前检测status的值,发送后在第二行显示status的值。


问题1:
有一个疑惑是看资料说nrf是3.3v的,但是单片机的VCC输出是5V左右,我看有的人这里用了降压处理,这个有影响吗?因为普中单片机自带的无线接口我看原理图上也没有降压操作吧,最后我将nrf用导线接在了P1端。(最开始接在了自带的无线接口上,害怕接口有问题,但是两种方式都不行)

问题2:
烧录程序之后,status的值是00000111,然后按下按键之后,status的值为00011111,如果两个数据都正确的话,那就是数据发送不成功,达到最大重发次数中断了。为什么呢?希望解答一下。然后我按下复位,第一个status的值也变成00011111了,然后按下按键后 第二个status 的值还是00011111.为什么一样了呢?是因为我第一次发送数据时status值改变了,复位之后 status的值就一直是00011111了吗?还是说lcd上显示的值有错.






问题3:
左侧单片机一直收不到数据,困扰很久了 希望大佬帮忙看一下代码,下面是发射端和接收端的main函数,
发射端:主要是想初始化nrf为发射模式,然后通过按键设定发射的值。然后检测发送前和发送后status的值。
  1. void main(void)
  2. {
  3.         unsigned char tf =0;
  4.         unsigned char TxBuf[32];
  5.          uchar status1[8],status2[8];  
  6.         uchar s1,s2;
  7.         LcdInit();
  8.         init_NRF24L01() ;
  9.         led1=1;
  10.         led2=1;
  11.         Delay(1000);
  12.         s1=SPI_Read(STATUS);
  13.         status1[0]=s1/128;
  14.         status1[1]=s1%128/64;
  15.         status1[2]=s1%64/32;
  16.         status1[3]=s1%32/16;
  17.         status1[4]=s1%16/8;
  18.         status1[5]=s1%8/4;
  19.         status1[6]=s1%4/2;
  20.         status1[7]=s1%2;
  21.   LcdWriteData(status1[0]+0x30);
  22.         LcdWriteData(status1[1]+0x30);
  23.         LcdWriteData(status1[2]+0x30);
  24.         LcdWriteData(status1[3]+0x30);
  25.         LcdWriteData(status1[4]+0x30);
  26.         LcdWriteData(status1[5]+0x30);
  27.         LcdWriteData(status1[6]+0x30);
  28.         LcdWriteData(status1[7]+0x30);
  29.         delayms(4000);
  30.         while(1)
  31.         {        
  32.                 if(K1==0)
  33.                 {
  34.                         Delay(100);
  35.                         if(K1==0)
  36.                         {
  37.                                 TxBuf[0] = 0;
  38.                                 tf=1;
  39.                                 led1=TxBuf[0];
  40.                         
  41.                                 Delay(200);
  42.                         }
  43.                 }
  44.                
  45.                
  46.                 if(tf==1)
  47.                 {
  48.                         nRF24L01_TxPacket(TxBuf);
  49.                         Delay(1000);
  50.                           s2=SPI_Read(STATUS);
  51.                                 status2[0]=s2/128;
  52.                                 status2[1]=s2%128/64;
  53.                                 status2[2]=s2%64/32;
  54.                                 status2[3]=s2%32/16;
  55.                                 status2[4]=s2%16/8;
  56.                                 status2[5]=s2%8/4;
  57.                                 status2[6]=s2%4/2;
  58.                                 status2[7]=s2%2;
  59.                                 LcdWriteCom(0x80+0x40);
  60.                                 LcdWriteData(status2[0]+0x30);
  61.                                 LcdWriteData(status2[1]+0x30);
  62.                                 LcdWriteData(status2[2]+0x30);
  63.                                 LcdWriteData(status2[3]+0x30);
  64.                                 LcdWriteData(status2[4]+0x30);
  65.                                 LcdWriteData(status2[5]+0x30);
  66.                                 LcdWriteData(status2[6]+0x30);
  67.                                 LcdWriteData(status2[7]+0x30);
  68.                                 Delay(1000);
  69.                 }        
  70.                
  71.         }
  72.         
  73. }
复制代码



接收端:先将两个LED灯灭了,然后while循环里配置nrf为接收模式,然后将RxBuf[1]=1(发送的数据是RXBuf[1]=0,这里先置1,保证收到数据的正确性)然后就是将收到的数据 点亮LED灯。
  1. void main(void)
  2. {
  3.         unsigned char RxBuf[32];
  4.         init_NRF24L01() ;
  5.         led1=1;
  6.         led2=1;
  7.         Delay(1000);

  8.         while(1)
  9.         {
  10.                 SetRX_Mode();
  11.                 RxBuf[1]=1;
  12.                 Delay(1000);
  13.                 nRF24L01_RxPacket(RxBuf);  
  14.                 led1=RxBuf[1];
  15.                 led2=RxBuf[1];
  16.                
  17.         }
  18. }
复制代码
最后附有发送端和接收端的源代码(还有一个是收发一体的参考代码)。自我感觉代码没有什么问题吧,如果有的话,希望详细指出一下,谢谢了

nrf.rar

96.91 KB, 下载次数: 10

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:155507 发表于 2019-7-27 07:53 | 只看该作者
我们知道 NRF24L01 的供电电压是 1.9V~3.6V 不能超过这个范围,低了不工作,高了可能烧毁 NRF24L01 芯片。我们常用的 STC89C52 的单片机的供电电压是 5V,我们不能直接给 24L01 这个模块供电,我们需要使用AMS1117-3.3V 稳压芯片把 5V 转成 3.3V 的电压为 24L01 模块供电。

http://www.51hei.com/bbs/dpj-99624-1.html
回复

使用道具 举报

板凳
ID:599634 发表于 2020-2-17 16:37 | 只看该作者
那个开发板下面不是有个无线接口的吗,佛了,也是8脚的你自己看下
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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