找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 23876|回复: 23
收起左侧

51单片机应用之无线通讯模块NRF24L01+(含程序源码)

  [复制链接]
ID:401506 发表于 2018-9-23 17:30 | 显示全部楼层 |阅读模式
本教程关于NRF24L01+的内容十分详细,对于大家的学习和调试及其有帮助

图片1.png

内含详细教程:
0.png 0.png 0.png 0.png 0.jpg



单片机源程序如下:

  1. 接下来我们写发送程序:
  2. //**********************************
  3. //   NRF24L01+模块发射程序
  4. //      用8个LED调试
  5. //   Txz001 2012.05.16
  6. //**********************************
  7. #include <reg52.h>
  8. typedef unsigned char uchar; //将无符号字节类型重定义为uchar
  9. typedef unsigned int uint;  //将无符号整数类型重定义为Uint
  10. //*********************NRF24L01函数定义****************************
  11. void delayms(uint t);//毫秒延时
  12. void init_NRF24L01(void);   //模块初始化函数
  13. uchar SPI_RW(uchar reg);    //基本SPI读写时序
  14. uchar SPI_Read(uchar reg);  //从寄存器reg读一个字节
  15. void SetRX_Mode(void);      //设置接收模式
  16. uchar SPI_RW_Reg(uchar reg, uchar value);  //向寄存器写一个字节
  17. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); // 从缓冲器读出uchars字节的数据
  18. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); //向缓冲器写进uchars字节的数据
  19. void nRF24L01_TxPacket(uchar * tx_buf); //启动一次发送
  20. uchar nRF24L01_RxPacket(uchar * rx_buf);//读取接收的数据,放入rx_buf数组
  21. //***********NRF24L01模块IO端口定义******************
  22. sbit CE=P1^0;
  23. sbit CSN =P1^1;
  24. sbit SCK =P1^2;
  25. sbit MOSI =P1^3;
  26. sbit MISO =P1^4;
  27. sbit IRQ =P1^5;
  28. //*****************NRF24L01常量**********************
  29. #define TX_ADR_WIDTH    5    //发送地址宽度 5字节
  30. #define RX_ADR_WIDTH    5    //接收地址宽度 5字节
  31. #define TX_PLOAD_WIDTH  32   // 发送数据宽度 32字节
  32. #define RX_PLOAD_WIDTH  32   //接收数据的宽度 32字节
  33. uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x01,0x02,0x03,0x04,0x05}; //本地地址
  34. uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x01,0x02,0x03,0x04,0x05}; //接收地址
  35. //*****************NRF24L01寄存器指令*******************
  36. #define READ_REG        0x00   // 读寄存器指令
  37. #define WRITE_REG       0x20  // 写寄存器指令
  38. #define RD_RX_PLOAD     0x61   // 读取接收数据指令
  39. #define WR_TX_PLOAD     0xA0   // 写待发数据指令
  40. #define FLUSH_TX        0xE1   //清空发送缓冲区
  41. //**************SPI(nRF24L01)寄存器地址常量*****************
  42. #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
  43. #define EN_AA           0x01  // 自动应答功能设置
  44. #define EN_RXADDR       0x02  // 可用信道设置
  45. #define SETUP_AW        0x03  // 收发地址宽度设置
  46. #define SETUP_RETR      0x04  // 自动重发功能设置
  47. #define RF_CH           0x05  // 工作频率设置
  48. #define RF_SETUP        0x06  // 发射速率、功耗功能设置
  49. #define STATUS          0x07  // 状态寄存器
  50. #define OBSERVE_TX      0x08  // 发送监测功能
  51. #define CD              0x09  // 地址检测            
  52. #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
  53. #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
  54. #define RX_ADDR_P2      0x0C  // 频道2接收数据地址
  55. #define RX_ADDR_P3      0x0D  // 频道3接收数据地址
  56. #define RX_ADDR_P4      0x0E  // 频道4接收数据地址
  57. #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
  58. #define TX_ADDR         0x10  // 发送地址寄存器
  59. #define RX_PW_P0        0x11  // 接收频道0接收数据长度
  60. #define RX_PW_P1        0x12  // 接收频道0接收数据长度
  61. #define RX_PW_P2        0x13  // 接收频道0接收数据长度
  62. #define RX_PW_P3        0x14  // 接收频道0接收数据长度
  63. #define RX_PW_P4        0x15  // 接收频道0接收数据长度
  64. #define RX_PW_P5        0x16  // 接收频道0接收数据长度
  65. #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
  66. /*****毫秒延时子程序*****/
  67. void delayms(uint t)     //约延时t毫秒
  68. {
  69.   uint i;
  70.   while(t--)
  71.     {
  72.      for(i=0;i<125;i++);
  73.     }        
  74. }
  75. /**********************************************
  76. /*函数:uint SPI_RW(uint uchar)
  77. /*功能:NRF24L01的SPI写时序
  78. /**********************************************/
  79. uchar SPI_RW(uchar uuchar)
  80. {
  81. uchar bit_ctr;
  82.     for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 输出8个位
  83.     {
  84.   MOSI = (uuchar & 0x80);     //输出uuhar的最高位
  85.   uuchar = (uuchar << 1);     //左移一位
  86.   SCK = 1;                    // 将时钟线置‘1’
  87.   uuchar |= MISO;             //同时读取STATUS
  88.   SCK = 0;                //然后再将时钟线置‘0’
  89.     }
  90.     return(uuchar);               //返回读取的值
  91. }
  92. /***********************************************
  93. /*函数:uchar SPI_Read(uchar reg)
  94. /*功能:NRF24L01的SPI读取一个字节时序
  95. /***********************************************/
  96. uchar SPI_Read(uchar reg)
  97. {
  98. uchar reg_val;
  99. CSN = 0;             //CSN置'0',允许指令操作
  100. SPI_RW(reg);            //写一条reg指令
  101. reg_val = SPI_RW(0);    //读取reg的值到reg_val
  102. CSN = 1;                //CSN置'1',禁示操作
  103. return(reg_val);        //返回读取的值
  104. }
  105. /***********************************************
  106. /*功能:NRF24L01写一个字节到寄存器函数
  107. /***********************************************/
  108. uchar SPI_RW_Reg(uchar reg, uchar value)
  109. {
  110. uchar status;
  111.   
  112. CSN = 0;                   // CSN置'0',允许操作
  113. status = SPI_RW(reg);      //这指令,并读STATUS
  114. SPI_RW(value);             //写数据值到reg
  115. CSN = 1;                   // CSN置'1',禁止操作
  116. return(status);            // return nRF24L01 status uchar
  117. }
  118. /*****************************************************************
  119. /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  120. /*功能: 用于写数据:reg:为寄存器地址,
  121. /*                  pBuf:为待写入数据地址,
  122. /*                  uchars:写入数据的个数
  123. /*****************************************************************/
  124. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  125. {
  126. uchar status,uchar_ctr;
  127. CSN = 0;            //SPI使能        
  128. status = SPI_RW(reg);   
  129. for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  130.   SPI_RW(*pBuf++);
  131. CSN = 1;           //关闭SPI
  132. return(status);    //  
  133. }
  134. //******************************************
  135. /*NRF24L01初始化
  136. //******************************************/
  137. void init_NRF24L01(void)
  138. {
  139.   delayms(1);
  140.   CE=0;    //  射频停止工作
  141.   CSN=1;   // 停止寄存器读写
  142.   SCK=0;   //时种信号停止读写
  143.   IRQ=1;//中断复位
  144.   SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止  
  145.   SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);      //禁止自动发送
  146.   SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,   
  147.   SPI_RW_Reg(WRITE_REG + RF_CH, 1);        //   设置信道工作为2.4GHZ,收发必须一致
  148.   SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
  149.   SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  
  150. }
  151. /******************************************************
  152. /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
  153. /*功能:发送 tx_buf中数据
  154. /*******************************************************/
  155. void nRF24L01_TxPacket(unsigned char * tx_buf)
  156. {
  157. CE=0;   //StandBy I模式  
  158. SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址  
  159. SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
  160. SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);// 装载数据  
  161. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送
  162. CE=1;   //置高CE,激发数据发送
  163. delayms(1);
  164. }

  165. //************************************
  166. //              主函数
  167. //************************************
  168. void main()
  169. {
  170.   uchar  TxBuf[32];
  171.   uchar status;  //定义一个变量用来装读取到的STATUS数值
  172.   init_NRF24L01();//NRF24L01初始化
  173.   SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器
  174.   status=SPI_Read(STATUS); //读取状态
  175.   P0=~status;//P0口显示读取的状态
  176.   delayms(4000);//显示延时4秒,以便从容看清楚
  177.   P0=0xff;//清除显示
  178.   delayms(600);
  179.   TxBuf[0]=1;  //我们设置个初值1在想要发送的数组的第1个里变量里。
  180.   while(1)
  181.    { TxBuf[0]=~TxBuf[0];   //这句把要发送的第1个变量的值取反,如果原来是1,现再就为0
  182.      nRF24L01_TxPacket(TxBuf);//装载数据并进行一次发送操作
  183.      status=SPI_Read(STATUS); //发送完后再读取状态
  184.      P0=~status;  //显示发送完后的状态
  185.      delayms(500);  //显示发送后的信息停留1秒
  186.      P0=0xFF;   //清除显示
  187.      delayms(500);
  188.    }  
  189. }
复制代码

所有资料51hei提供下载:
51单片机应用之无线通讯模块NRF24L01 .rar (7.79 MB, 下载次数: 684)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:184706 发表于 2019-1-23 13:58 | 显示全部楼层
图片很丰富
回复

使用道具 举报

ID:466516 发表于 2019-1-28 21:50 | 显示全部楼层
感觉要显示图片界面的话还是推荐上89c52吧,但还是好评,待我借鉴一下,我回头带来升级版,哈哈哈
回复

使用道具 举报

ID:466516 发表于 2019-1-28 21:51 | 显示全部楼层
挺好,谢楼主,但感觉要显示图片的话这块单片机有点勉强了,待我借鉴一下回来带上升级版,哈哈
回复

使用道具 举报

ID:291716 发表于 2019-1-29 16:30 来自手机 | 显示全部楼层
也许我愚钝,感觉乱七八糟的。
回复

使用道具 举报

ID:99337 发表于 2019-3-10 13:19 | 显示全部楼层
听高级的
回复

使用道具 举报

ID:490602 发表于 2019-5-25 17:27 | 显示全部楼层
你好,我想问一下,两个单片机通讯时地址是设置成一样的吗?
回复

使用道具 举报

ID:168971 发表于 2019-6-16 09:32 来自手机 | 显示全部楼层
看着很不错的教学,下载来看看
回复

使用道具 举报

ID:577837 发表于 2019-7-5 11:00 | 显示全部楼层
sheepppppp2 发表于 2019-5-25 17:27
你好,我想问一下,两个单片机通讯时地址是设置成一样的吗?

对,地址得要一样才行
回复

使用道具 举报

ID:234782 发表于 2019-7-7 13:17 | 显示全部楼层
谢谢,文档很详细
回复

使用道具 举报

ID:594196 发表于 2019-8-2 16:36 | 显示全部楼层
请问接收部分该怎么写(⊙_⊙?)
回复

使用道具 举报

ID:73422 发表于 2019-8-19 20:40 | 显示全部楼层
里面的vb程序不全,有没有完整的vb程序?
回复

使用道具 举报

ID:48413 发表于 2019-8-20 19:23 | 显示全部楼层
学习一下非常感谢啊
回复

使用道具 举报

ID:497564 发表于 2019-12-1 23:33 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:726437 发表于 2020-4-10 17:43 | 显示全部楼层
图形处理软件自己做的吗?
回复

使用道具 举报

ID:781880 发表于 2020-6-17 16:16 | 显示全部楼层
感谢分享哦,接收程序在哪里呢
回复

使用道具 举报

ID:120677 发表于 2020-12-30 08:45 | 显示全部楼层
发送和收接的源码都有的吗?
回复

使用道具 举报

ID:390416 发表于 2020-12-30 12:40 | 显示全部楼层
这是我昨天分享到51hei 上的 无线模块通信基础代码。有需要的拿去
http://www.51hei.com/bbs/dpj-200684-1.html
回复

使用道具 举报

ID:390416 发表于 2020-12-30 12:42 | 显示全部楼层
chjchj816 发表于 2020-12-30 08:45
发送和收接的源码都有的吗?

我也在51黑上面分享了无线通信的代码和资料包。有需要可以拿去哦 http://www.51hei.com/bbs/dpj-200684-1.html
回复

使用道具 举报

ID:390416 发表于 2020-12-30 12:43 | 显示全部楼层
sheepppppp2 发表于 2019-5-25 17:27
你好,我想问一下,两个单片机通讯时地址是设置成一样的吗?

无线模块的所有参数都要设置一样的,除了工作模式。
我也在51黑上面分享了无线通信的代码和资料包。 http://www.51hei.com/bbs/dpj-200684-1.html
回复

使用道具 举报

ID:390416 发表于 2020-12-30 12:44 | 显示全部楼层
xyz12 发表于 2019-8-2 16:36
请问接收部分该怎么写(⊙_⊙?)

我也在51黑上面分享了无线通信的代码和资料包。有需要可以拿去哦 http://www.51hei.com/bbs/dpj-200684-1.html 接收和发射 只是工作模式不同
回复

使用道具 举报

ID:290380 发表于 2021-3-8 14:08 | 显示全部楼层

谢谢,文档很详细
回复

使用道具 举报

ID:1088834 发表于 2023-7-28 15:26 | 显示全部楼层
刚好要做C51单片机的多机通讯,很有帮助,谢谢。
回复

使用道具 举报

ID:840718 发表于 2023-8-2 21:40 | 显示全部楼层
还算整洁,很有帮忙 谢谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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