找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 26897|回復(fù): 23
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)應(yīng)用之無(wú)線通訊模塊NRF24L01+(含程序源碼)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本教程關(guān)于NRF24L01+的內(nèi)容十分詳細(xì),對(duì)于大家的學(xué)習(xí)和調(diào)試及其有幫助



內(nèi)含詳細(xì)教程:




單片機(jī)源程序如下:

  1. 接下來(lái)我們寫發(fā)送程序:
  2. //**********************************
  3. //   NRF24L01+模塊發(fā)射程序
  4. //      用8個(gè)LED調(diào)試
  5. //   Txz001 2012.05.16
  6. //**********************************
  7. #include <reg52.h>
  8. typedef unsigned char uchar; //將無(wú)符號(hào)字節(jié)類型重定義為uchar
  9. typedef unsigned int uint;  //將無(wú)符號(hào)整數(shù)類型重定義為Uint
  10. //*********************NRF24L01函數(shù)定義****************************
  11. void delayms(uint t);//毫秒延時(shí)
  12. void init_NRF24L01(void);   //模塊初始化函數(shù)
  13. uchar SPI_RW(uchar reg);    //基本SPI讀寫時(shí)序
  14. uchar SPI_Read(uchar reg);  //從寄存器reg讀一個(gè)字節(jié)
  15. void SetRX_Mode(void);      //設(shè)置接收模式
  16. uchar SPI_RW_Reg(uchar reg, uchar value);  //向寄存器寫一個(gè)字節(jié)
  17. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); // 從緩沖器讀出uchars字節(jié)的數(shù)據(jù)
  18. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); //向緩沖器寫進(jìn)uchars字節(jié)的數(shù)據(jù)
  19. void nRF24L01_TxPacket(uchar * tx_buf); //啟動(dòng)一次發(fā)送
  20. uchar nRF24L01_RxPacket(uchar * rx_buf);//讀取接收的數(shù)據(jù),放入rx_buf數(shù)組
  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    //發(fā)送地址寬度 5字節(jié)
  30. #define RX_ADR_WIDTH    5    //接收地址寬度 5字節(jié)
  31. #define TX_PLOAD_WIDTH  32   // 發(fā)送數(shù)據(jù)寬度 32字節(jié)
  32. #define RX_PLOAD_WIDTH  32   //接收數(shù)據(jù)的寬度 32字節(jié)
  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   // 讀取接收數(shù)據(jù)指令
  39. #define WR_TX_PLOAD     0xA0   // 寫待發(fā)數(shù)據(jù)指令
  40. #define FLUSH_TX        0xE1   //清空發(fā)送緩沖區(qū)
  41. //**************SPI(nRF24L01)寄存器地址常量*****************
  42. #define CONFIG          0x00  // 配置收發(fā)狀態(tài),CRC校驗(yàn)?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式
  43. #define EN_AA           0x01  // 自動(dòng)應(yīng)答功能設(shè)置
  44. #define EN_RXADDR       0x02  // 可用信道設(shè)置
  45. #define SETUP_AW        0x03  // 收發(fā)地址寬度設(shè)置
  46. #define SETUP_RETR      0x04  // 自動(dòng)重發(fā)功能設(shè)置
  47. #define RF_CH           0x05  // 工作頻率設(shè)置
  48. #define RF_SETUP        0x06  // 發(fā)射速率、功耗功能設(shè)置
  49. #define STATUS          0x07  // 狀態(tài)寄存器
  50. #define OBSERVE_TX      0x08  // 發(fā)送監(jiān)測(cè)功能
  51. #define CD              0x09  // 地址檢測(cè)            
  52. #define RX_ADDR_P0      0x0A  // 頻道0接收數(shù)據(jù)地址
  53. #define RX_ADDR_P1      0x0B  // 頻道1接收數(shù)據(jù)地址
  54. #define RX_ADDR_P2      0x0C  // 頻道2接收數(shù)據(jù)地址
  55. #define RX_ADDR_P3      0x0D  // 頻道3接收數(shù)據(jù)地址
  56. #define RX_ADDR_P4      0x0E  // 頻道4接收數(shù)據(jù)地址
  57. #define RX_ADDR_P5      0x0F  // 頻道5接收數(shù)據(jù)地址
  58. #define TX_ADDR         0x10  // 發(fā)送地址寄存器
  59. #define RX_PW_P0        0x11  // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
  60. #define RX_PW_P1        0x12  // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
  61. #define RX_PW_P2        0x13  // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
  62. #define RX_PW_P3        0x14  // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
  63. #define RX_PW_P4        0x15  // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
  64. #define RX_PW_P5        0x16  // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
  65. #define FIFO_STATUS     0x17  // FIFO棧入棧出狀態(tài)寄存器設(shè)置
  66. /*****毫秒延時(shí)子程序*****/
  67. void delayms(uint t)     //約延時(shí)t毫秒
  68. {
  69.   uint i;
  70.   while(t--)
  71.     {
  72.      for(i=0;i<125;i++);
  73.     }        
  74. }
  75. /**********************************************
  76. /*函數(shù):uint SPI_RW(uint uchar)
  77. /*功能:NRF24L01的SPI寫時(shí)序
  78. /**********************************************/
  79. uchar SPI_RW(uchar uuchar)
  80. {
  81. uchar bit_ctr;
  82.     for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 輸出8個(gè)位
  83.     {
  84.   MOSI = (uuchar & 0x80);     //輸出uuhar的最高位
  85.   uuchar = (uuchar << 1);     //左移一位
  86.   SCK = 1;                    // 將時(shí)鐘線置‘1’
  87.   uuchar |= MISO;             //同時(shí)讀取STATUS
  88.   SCK = 0;                //然后再將時(shí)鐘線置‘0’
  89.     }
  90.     return(uuchar);               //返回讀取的值
  91. }
  92. /***********************************************
  93. /*函數(shù):uchar SPI_Read(uchar reg)
  94. /*功能:NRF24L01的SPI讀取一個(gè)字節(jié)時(shí)序
  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寫一個(gè)字節(jié)到寄存器函數(shù)
  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);             //寫數(shù)據(jù)值到reg
  115. CSN = 1;                   // CSN置'1',禁止操作
  116. return(status);            // return nRF24L01 status uchar
  117. }
  118. /*****************************************************************
  119. /*函數(shù):uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  120. /*功能: 用于寫數(shù)據(jù):reg:為寄存器地址,
  121. /*                  pBuf:為待寫入數(shù)據(jù)地址,
  122. /*                  uchars:寫入數(shù)據(jù)的個(gè)數(shù)
  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;           //關(guān)閉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;   //時(shí)種信號(hào)停止讀寫
  143.   IRQ=1;//中斷復(fù)位
  144.   SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  頻道0自動(dòng) ACK應(yīng)答禁止  
  145.   SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);      //禁止自動(dòng)發(fā)送
  146.   SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允許接收地址只有頻道0,   
  147.   SPI_RW_Reg(WRITE_REG + RF_CH, 1);        //   設(shè)置信道工作為2.4GHZ,收發(fā)必須一致
  148.   SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設(shè)置接收數(shù)據(jù)長(zhǎng)度,本次設(shè)置為32字節(jié)
  149.   SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //設(shè)置發(fā)射速率為2MHZ,發(fā)射功率為最大值0dB  
  150. }
  151. /******************************************************
  152. /*函數(shù):void nRF24L01_TxPacket(unsigned char * tx_buf)
  153. /*功能:發(fā)送 tx_buf中數(shù)據(jù)
  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);// 裝載數(shù)據(jù)  
  161. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收發(fā)完成中斷響應(yīng),16位CRC,主發(fā)送
  162. CE=1;   //置高CE,激發(fā)數(shù)據(jù)發(fā)送
  163. delayms(1);
  164. }

  165. //************************************
  166. //              主函數(shù)
  167. //************************************
  168. void main()
  169. {
  170.   uchar  TxBuf[32];
  171.   uchar status;  //定義一個(gè)變量用來(lái)裝讀取到的STATUS數(shù)值
  172.   init_NRF24L01();//NRF24L01初始化
  173.   SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清狀態(tài)寄存器
  174.   status=SPI_Read(STATUS); //讀取狀態(tài)
  175.   P0=~status;//P0口顯示讀取的狀態(tài)
  176.   delayms(4000);//顯示延時(shí)4秒,以便從容看清楚
  177.   P0=0xff;//清除顯示
  178.   delayms(600);
  179.   TxBuf[0]=1;  //我們?cè)O(shè)置個(gè)初值1在想要發(fā)送的數(shù)組的第1個(gè)里變量里。
  180.   while(1)
  181.    { TxBuf[0]=~TxBuf[0];   //這句把要發(fā)送的第1個(gè)變量的值取反,如果原來(lái)是1,現(xiàn)再就為0
  182.      nRF24L01_TxPacket(TxBuf);//裝載數(shù)據(jù)并進(jìn)行一次發(fā)送操作
  183.      status=SPI_Read(STATUS); //發(fā)送完后再讀取狀態(tài)
  184.      P0=~status;  //顯示發(fā)送完后的狀態(tài)
  185.      delayms(500);  //顯示發(fā)送后的信息停留1秒
  186.      P0=0xFF;   //清除顯示
  187.      delayms(500);
  188.    }  
  189. }
復(fù)制代碼

所有資料51hei提供下載:
51單片機(jī)應(yīng)用之無(wú)線通訊模塊NRF24L01 .rar (7.79 MB, 下載次數(shù): 709)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏15 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:184706 發(fā)表于 2019-1-23 13:58 | 只看該作者
圖片很豐富
回復(fù)

使用道具 舉報(bào)

板凳
ID:466516 發(fā)表于 2019-1-28 21:50 | 只看該作者
感覺(jué)要顯示圖片界面的話還是推薦上89c52吧,但還是好評(píng),待我借鑒一下,我回頭帶來(lái)升級(jí)版,哈哈哈
回復(fù)

使用道具 舉報(bào)

地板
ID:466516 發(fā)表于 2019-1-28 21:51 | 只看該作者
挺好,謝樓主,但感覺(jué)要顯示圖片的話這塊單片機(jī)有點(diǎn)勉強(qiáng)了,待我借鑒一下回來(lái)帶上升級(jí)版,哈哈
回復(fù)

使用道具 舉報(bào)

5#
ID:291716 發(fā)表于 2019-1-29 16:30 來(lái)自手機(jī) | 只看該作者
也許我愚鈍,感覺(jué)亂七八糟的。
回復(fù)

使用道具 舉報(bào)

6#
ID:99337 發(fā)表于 2019-3-10 13:19 | 只看該作者
聽(tīng)高級(jí)的
回復(fù)

使用道具 舉報(bào)

7#
ID:490602 發(fā)表于 2019-5-25 17:27 | 只看該作者
你好,我想問(wèn)一下,兩個(gè)單片機(jī)通訊時(shí)地址是設(shè)置成一樣的嗎?
回復(fù)

使用道具 舉報(bào)

8#
ID:168971 發(fā)表于 2019-6-16 09:32 來(lái)自手機(jī) | 只看該作者
看著很不錯(cuò)的教學(xué),下載來(lái)看看
回復(fù)

使用道具 舉報(bào)

9#
ID:577837 發(fā)表于 2019-7-5 11:00 | 只看該作者
sheepppppp2 發(fā)表于 2019-5-25 17:27
你好,我想問(wèn)一下,兩個(gè)單片機(jī)通訊時(shí)地址是設(shè)置成一樣的嗎?

對(duì),地址得要一樣才行
回復(fù)

使用道具 舉報(bào)

10#
ID:234782 發(fā)表于 2019-7-7 13:17 | 只看該作者
謝謝,文檔很詳細(xì)
回復(fù)

使用道具 舉報(bào)

11#
ID:594196 發(fā)表于 2019-8-2 16:36 | 只看該作者
請(qǐng)問(wèn)接收部分該怎么寫(⊙_⊙?)
回復(fù)

使用道具 舉報(bào)

12#
ID:73422 發(fā)表于 2019-8-19 20:40 | 只看該作者
里面的vb程序不全,有沒(méi)有完整的vb程序?
回復(fù)

使用道具 舉報(bào)

13#
ID:48413 發(fā)表于 2019-8-20 19:23 | 只看該作者
學(xué)習(xí)一下非常感謝啊
回復(fù)

使用道具 舉報(bào)

14#
ID:497564 發(fā)表于 2019-12-1 23:33 | 只看該作者
頂一下
回復(fù)

使用道具 舉報(bào)

15#
ID:726437 發(fā)表于 2020-4-10 17:43 | 只看該作者
圖形處理軟件自己做的嗎?
回復(fù)

使用道具 舉報(bào)

16#
ID:781880 發(fā)表于 2020-6-17 16:16 | 只看該作者
感謝分享哦,接收程序在哪里呢
回復(fù)

使用道具 舉報(bào)

17#
ID:120677 發(fā)表于 2020-12-30 08:45 | 只看該作者
發(fā)送和收接的源碼都有的嗎?
回復(fù)

使用道具 舉報(bào)

18#
ID:390416 發(fā)表于 2020-12-30 12:40 | 只看該作者
這是我昨天分享到51hei 上的 無(wú)線模塊通信基礎(chǔ)代碼。有需要的拿去
http://www.torrancerestoration.com/bbs/dpj-200684-1.html
回復(fù)

使用道具 舉報(bào)

19#
ID:390416 發(fā)表于 2020-12-30 12:42 | 只看該作者
chjchj816 發(fā)表于 2020-12-30 08:45
發(fā)送和收接的源碼都有的嗎?

我也在51黑上面分享了無(wú)線通信的代碼和資料包。有需要可以拿去哦 http://www.torrancerestoration.com/bbs/dpj-200684-1.html
回復(fù)

使用道具 舉報(bào)

20#
ID:390416 發(fā)表于 2020-12-30 12:43 | 只看該作者
sheepppppp2 發(fā)表于 2019-5-25 17:27
你好,我想問(wèn)一下,兩個(gè)單片機(jī)通訊時(shí)地址是設(shè)置成一樣的嗎?

無(wú)線模塊的所有參數(shù)都要設(shè)置一樣的,除了工作模式。
我也在51黑上面分享了無(wú)線通信的代碼和資料包。 http://www.torrancerestoration.com/bbs/dpj-200684-1.html
回復(fù)

使用道具 舉報(bào)

21#
ID:390416 發(fā)表于 2020-12-30 12:44 | 只看該作者
xyz12 發(fā)表于 2019-8-2 16:36
請(qǐng)問(wèn)接收部分該怎么寫(⊙_⊙?)

我也在51黑上面分享了無(wú)線通信的代碼和資料包。有需要可以拿去哦 http://www.torrancerestoration.com/bbs/dpj-200684-1.html 接收和發(fā)射 只是工作模式不同
回復(fù)

使用道具 舉報(bào)

22#
ID:290380 發(fā)表于 2021-3-8 14:08 | 只看該作者

謝謝,文檔很詳細(xì)
回復(fù)

使用道具 舉報(bào)

23#
ID:1088834 發(fā)表于 2023-7-28 15:26 | 只看該作者
剛好要做C51單片機(jī)的多機(jī)通訊,很有幫助,謝謝。
回復(fù)

使用道具 舉報(bào)

24#
ID:840718 發(fā)表于 2023-8-2 21:40 | 只看該作者
還算整潔,很有幫忙 謝謝。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表