久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 26819|回復: 23
打印 上一主題 下一主題
收起左側

51單片機應用之無線通訊模塊NRF24L01+(含程序源碼)

  [復制鏈接]
跳轉到指定樓層
樓主
本教程關于NRF24L01+的內容十分詳細,對于大家的學習和調試及其有幫助



內含詳細教程:




單片機源程序如下:

  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, 下載次數: 709)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

地板
ID:466516 發表于 2019-1-28 21:51 | 只看該作者
挺好,謝樓主,但感覺要顯示圖片的話這塊單片機有點勉強了,待我借鑒一下回來帶上升級版,哈哈
回復

使用道具 舉報

5#
ID:291716 發表于 2019-1-29 16:30 來自手機 | 只看該作者
也許我愚鈍,感覺亂七八糟的。
回復

使用道具 舉報

6#
ID:99337 發表于 2019-3-10 13:19 | 只看該作者
聽高級的
回復

使用道具 舉報

7#
ID:490602 發表于 2019-5-25 17:27 | 只看該作者
你好,我想問一下,兩個單片機通訊時地址是設置成一樣的嗎?
回復

使用道具 舉報

8#
ID:168971 發表于 2019-6-16 09:32 來自手機 | 只看該作者
看著很不錯的教學,下載來看看
回復

使用道具 舉報

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

對,地址得要一樣才行
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

13#
ID:48413 發表于 2019-8-20 19:23 | 只看該作者
學習一下非常感謝啊
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

謝謝,文檔很詳細
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久99网 | 欧美精品一区在线发布 | 美女视频一区二区 | 欧美成人精品 | 国产精品99久久久久久久vr | 国产精品一区二区三区在线 | 日日久 | 成人午夜精品 | 狠狠婷婷综合久久久久久妖精 | 国产xxxx岁13xxxxhd | 日韩成人av在线 | 欧美成人高清 | 日本一区二区电影 | 日韩视频在线观看中文字幕 | 国产日批 | 精品久久久久香蕉网 | 亚洲高清在线 | 亚洲麻豆| 国产这里只有精品 | 成人在线免费网站 | 国产成人免费视频网站视频社区 | 人干人操 | 天天看天天操 | 亚洲在线一区二区 | 国产精品亚洲精品日韩已方 | 男人影音 | 亚洲综合色网站 | 天天草天天操 | 久久午夜剧场 | 亚洲精品91| 国产欧美日韩一区 | 日韩欧美在 | 福利视频网站 | 国产特黄一级 | 亚洲一区中文字幕 | 99精品久久 | 成人性视频免费网站 | av中文字幕网 | 久久国产三级 | 亚洲国产成人精品久久久国产成人一区 | 久久久精品久久 |