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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8290|回復: 5
收起左側

NRF24L01無線傳輸模塊的單片機源碼與資料分享

[復制鏈接]
ID:333711 發表于 2018-5-19 15:44 | 顯示全部樓層 |閱讀模式
0.jpg
關于無線模塊,NRF24L01 是 NORDIC 公司最近生產的一款無線通信通信芯片,采用 FSK 調制,內部集成 NORDIC 自己的 Enhanced Short Burst 協議。可以實現點對點或是 1 對 6 的無線通信。
無線通信速度可以達到 2M(bps)。NORDIC 公司提供通信模塊的 GERBER 文件,可以直
接加工生產。嵌入式工程師或是單片機愛好者只需要為單片機系統預留 5 個 GPIO,1 個中
斷輸入引腳,就可以很容易實現無線通信的功能,非常適合用來為 MCU 系統構建無線通信
功能。
NRF24L01 的框圖如 Fig.1 所示,從單片機控制的角度來看,我們只需要關注 Fig.1 右面
的六個控制和數據信號,分別為 CSN、SCK、MISO、MOSI、IRQ、CE。
CSN:芯片的片選線,CSN 為低電平芯片工作。
SCK:芯片控制的時鐘線(SPI 時鐘)
MISO:芯片控制數據線(Master input slave output)
MOSI:芯片控制數據線(Master output slave input)
IRQ:中斷信號。無線通信過程中 MCU 主要是通過 IRQ 與 NRF24L01 進行通信。
CE: 芯片的模式控制線。 在 CSN 為低的情況下,CE 協同 NRF24L01 的 CONFIG 寄
存器共同決定 NRF24L01 的狀態(參照 NRF24L01 的狀態機)。


單片機源程序如下:
  1. /**************************************************************************************
  2. *功能:2.4G通信測試                                                                                                                          *
  3. *說明:在兩塊開發板上分別下載此程序;                                                                                                  *
  4. *                  按鍵P35    發生數據                                                                                             *
  5. *                                   LED1       發射指示燈                                                                                          *
  6. *                                   LED2                  接受指示燈                                                                                          *
  7. *                                   LED5-8          2.4G的I/O指示燈                                         *
  8. *硬件連接:                        2.4G                  單片機                                                                                                  *
  9.                                         CE                    P1^3;                                                                                                    *
  10.                                         CSN                  P1^4;                                                                                                    *
  11.                                         IRQ                   P3^3;                                                                                                    *
  12.                                         MISO                  P1^6;                                                                                                    *
  13.                                         MOSI                  P1^5;                                                                                                    *
  14.                                         SCK                   P1^7;                                                                                                    *
  15. *作者:研發中心                                                                                                                                                  *
  16. ***************************************************************************************/

  17. #include <reg51.h>
  18. #include <api.h>

  19. #define uchar unsigned char

  20. /***************************************************/
  21. #define TX_ADR_WIDTH   5  // 5字節寬度的發送/接收地址
  22. #define TX_PLOAD_WIDTH 4  // 數據通道有效數據寬度
  23. //#define LED P2
  24. sbit LED1=P1^0;
  25. sbit LED2=P1^1;
  26. uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};  // 定義一個靜態發送地址
  27. uchar RX_BUF[TX_PLOAD_WIDTH];
  28. uchar TX_BUF[TX_PLOAD_WIDTH];
  29. uchar flag;
  30. uchar DATA = 0x01;
  31. uchar bdata sta;
  32. sbit  RX_DR         = sta^6;
  33. sbit  TX_DS         = sta^5;
  34. sbit  MAX_RT = sta^4;
  35. sbit KEY=P3^5;
  36. /**************************************************/

  37. /**************************************************
  38. 函數: init_io()

  39. 描述:
  40.     初始化IO
  41. /**************************************************/
  42. void init_io(void)
  43. {
  44.         CE  = 0;        // 待機
  45.         CSN = 1;        // SPI禁止
  46.         SCK = 0;        // SPI時鐘置低
  47.         IRQ = 1;        // 中斷復位
  48. //        LED = 0xff;                // 關閉指示燈
  49. LED1=1;
  50. LED2=1;
  51. }
  52. /**************************************************/

  53. /**************************************************
  54. 函數:delay_ms()

  55. 描述:
  56.     延遲x毫秒
  57. /**************************************************/
  58. void delay_ms(uchar x)
  59. {
  60.     uchar i, j;
  61.     i = 0;
  62.     for(i=0; i<x; i++)
  63.     {
  64.        j = 250;
  65.        while(--j);
  66.            j = 250;
  67.        while(--j);
  68.     }
  69. }
  70. /**************************************************/

  71. /**************************************************
  72. 函數:SPI_RW()

  73. 描述:
  74.     根據SPI協議,寫一字節數據到nRF24L01,同時從nRF24L01
  75.         讀出一字節
  76. /**************************************************/
  77. uchar SPI_RW(uchar byte)
  78. {
  79.         uchar i;
  80.            for(i=0; i<8; i++)          // 循環8次
  81.            {
  82.                    MOSI = (byte & 0x80);   // byte最高位輸出到MOSI
  83.                    byte <<= 1;             // 低一位移位到最高位
  84.                    SCK = 1;                // 拉高SCK,nRF24L01從MOSI讀入1位數據,同時從MISO輸出1位數據
  85.                    byte |= MISO;               // 讀MISO到byte最低位
  86.                    SCK = 0;                    // SCK置低
  87.            }
  88.     return(byte);                   // 返回讀出的一字節
  89. }
  90. /**************************************************/

  91. /**************************************************
  92. 函數:SPI_RW_Reg()

  93. 描述:
  94.     寫數據value到reg寄存器
  95. /**************************************************/
  96. uchar SPI_RW_Reg(uchar reg, uchar value)
  97. {
  98.         uchar status;
  99.           CSN = 0;                   // CSN置低,開始傳輸數據
  100.           status = SPI_RW(reg);      // 選擇寄存器,同時返回狀態字
  101.           SPI_RW(value);             // 然后寫數據到該寄存器
  102.           CSN = 1;                   // CSN拉高,結束數據傳輸
  103.           return(status);            // 返回狀態寄存器
  104. }
  105. /**************************************************/

  106. /**************************************************
  107. 函數:SPI_Read()

  108. 描述:
  109.     從reg寄存器讀一字節
  110. /**************************************************/
  111. uchar SPI_Read(uchar reg)
  112. {
  113.         uchar reg_val;
  114.           CSN = 0;                    // CSN置低,開始傳輸數據
  115.           SPI_RW(reg);                // 選擇寄存器
  116.           reg_val = SPI_RW(0);        // 然后從該寄存器讀數據
  117.           CSN = 1;                    // CSN拉高,結束數據傳輸
  118.           return(reg_val);            // 返回寄存器數據
  119. }
  120. /**************************************************/

  121. /**************************************************
  122. 函數:SPI_Read_Buf()

  123. 描述:
  124.     從reg寄存器讀出bytes個字節,通常用來讀取接收通道
  125.         數據或接收/發送地址
  126. /**************************************************/
  127. uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)
  128. {
  129.         uchar status, i;
  130.           CSN = 0;                    // CSN置低,開始傳輸數據
  131.           status = SPI_RW(reg);       // 選擇寄存器,同時返回狀態字
  132.           for(i=0; i<bytes; i++)
  133.             pBuf[i] = SPI_RW(0);    // 逐個字節從nRF24L01讀出
  134.           CSN = 1;                    // CSN拉高,結束數據傳輸
  135.           return(status);             // 返回狀態寄存器
  136. }
  137. /**************************************************/

  138. /**************************************************
  139. 函數:SPI_Write_Buf()

  140. 描述:
  141.     把pBuf緩存中的數據寫入到nRF24L01,通常用來寫入發
  142.         射通道數據或接收/發送地址
  143. /**************************************************/
  144. uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)
  145. {
  146.         uchar status, i;
  147.           CSN = 0;                    // CSN置低,開始傳輸數據
  148.           status = SPI_RW(reg);       // 選擇寄存器,同時返回狀態字
  149.           for(i=0; i<bytes; i++)
  150.             SPI_RW(pBuf[i]);        // 逐個字節寫入nRF24L01
  151.           CSN = 1;                    // CSN拉高,結束數據傳輸
  152.           return(status);             // 返回狀態寄存器
  153. }
  154. /**************************************************/

  155. /**************************************************
  156. 函數:RX_Mode()

  157. 描述:
  158.     這個函數設置nRF24L01為接收模式,等待接收發送設備的數據包
  159. /**************************************************/
  160. void RX_Mode(void)
  161. {
  162.         CE = 0;
  163.           SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 接收設備接收通道0使用和發送設備相同的發送地址
  164.           SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);               // 使能接收通道0自動應答
  165.           SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);           // 使能接收通道0
  166.           SPI_RW_Reg(WRITE_REG + RF_CH, 40);                 // 選擇射頻通道0x40
  167.           SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);  // 接收通道0選擇和發送通道相同有效數據寬度
  168.           SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);            // 數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益
  169.           SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);              // CRC使能,16位CRC校驗,上電,接收模式
  170.           CE = 1;                                            // 拉高CE啟動接收設備
  171. }
  172. /**************************************************/

  173. /**************************************************
  174. 函數:TX_Mode()

  175. 描述:
  176.     這個函數設置nRF24L01為發送模式,(CE=1持續至少10us),
  177.         130us后啟動發射,數據發送結束后,發送模塊自動轉入接收
  178.         模式等待應答信號。
  179. /**************************************************/
  180. void TX_Mode(uchar * BUF)
  181. {
  182.         CE = 0;
  183.           SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);     // 寫入發送地址
  184.           SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 為了應答接收設備,接收通道0地址和發送地址相同
  185.           SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);                  // 寫數據包到TX FIFO
  186.           SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);       // 使能接收通道0自動應答
  187.           SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   // 使能接收通道0
  188.           SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);  // 自動重發延時等待250us+86us,自動重發10次
  189.           SPI_RW_Reg(WRITE_REG + RF_CH, 40);         // 選擇射頻通道0x40
  190.           SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);    // 數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益
  191.           SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // CRC使能,16位CRC校驗,上電
  192.         CE = 1;
  193. }
  194. /**************************************************/

  195. /**************************************************
  196. 函數:Check_ACK()

  197. 描述:
  198.     檢查接收設備有無接收到數據包,設定沒有收到應答信
  199.         號是否重發
  200. /**************************************************/
  201. uchar Check_ACK(bit clear)
  202. {
  203.         while(IRQ);
  204.         sta = SPI_RW(NOP);                    // 返回狀態寄存器
  205.         if(MAX_RT)
  206.                 if(clear)                         // 是否清除TX FIFO,沒有清除在復位MAX_RT中斷標志后重發
  207.                         SPI_RW(FLUSH_TX);
  208.         SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中斷標志
  209.         IRQ = 1;
  210.         if(TX_DS)
  211.                 return(0x00);
  212.         else
  213.                 return(0xff);
  214. }
  215. /**************************************************/

  216. /**************************************************
  217. 函數:CheckButtons()

  218. 描述:
  219.     檢查按鍵是否按下,按下則發送一字節數據
  220. /**************************************************/
  221. void CheckButtons()
  222. {
  223.         if(KEY==0)
  224.         {
  225.                 delay_ms(20);
  226.                 if(KEY==0)
  227.                 {
  228.                         TX_BUF[0] = DATA;          // 數據送到緩存
  229.                         TX_Mode(TX_BUF);                        // 把nRF24L01設置為發送模式并發送數據
  230.                         LED1=0;

  231.                         Check_ACK(1);               // 等待發送完畢,清除TX FIFO
  232.                         delay_ms(250);
  233.                         delay_ms(250);
  234.                         LED1 = 1;                                // 關閉LED
  235.                         RX_Mode();                                // 設置為接收模式
  236.                         while(!KEY);
  237.                         DATA <<= 1;
  238.                         if(!DATA)
  239.                                 DATA = 0x01;               
  240.                 }
  241.         }
  242.        
  243. }
  244. /**************************************************/

  245. /**************************************************
  246. 函數:main()

  247. 描述:
  248.     主函數
  249. /**************************************************/
  250. void main(void)
  251. {
  252.         init_io();                              // 初始化IO
  253.         RX_Mode();                              // 設置為接收模式
  254.         while(1)
  255.         {
  256.                 CheckButtons();           // 按鍵掃描
  257.                 sta = SPI_Read(STATUS);          // 讀狀態寄存器
  258.             if(RX_DR)                                  // 判斷是否接受到數據
  259.                 {
  260.                         SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH);  // 從RX FIFO讀出數據
  261.                         flag = 1;
  262.                 }
  263.                 SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除RX_DS中斷標志
  264.                 if(flag)                           // 接受完成
  265.                 {
  266.                         flag = 0;                       // 清標志
  267.                         LED2 = 0;//RX_BUF[0];           // 數據送到LED顯示
  268.                         delay_ms(250);
  269.                         delay_ms(250);
  270.                           LED2 = 1;//0xff;                       // 關閉LED
  271.                 }
  272.         }
  273. }
  274. /**************************************************/
復制代碼

所有資料51hei提供下載:
1801 2.4G無線模塊.rar (2.76 MB, 下載次數: 133)
回復

使用道具 舉報

ID:349409 發表于 2018-6-11 14:50 | 顯示全部樓層
單片機無線傳輸,那不是要2個單片機,一個單片機把數據向無線傳輸模塊輸出,轉無線發送。再用一個單片機從無線傳輸模塊中讀取?
回復

使用道具 舉報

ID:243748 發表于 2018-6-13 19:11 來自手機 | 顯示全部樓層
這個可以傳視頻嗎
回復

使用道具 舉報

ID:392961 發表于 2018-12-28 17:45 | 顯示全部樓層
我調試好了,不錯的程序
回復

使用道具 舉報

ID:560195 發表于 2020-5-15 17:38 | 顯示全部樓層
emmm正在學習,下載看看
回復

使用道具 舉報

ID:1043047 發表于 2023-2-14 16:13 | 顯示全部樓層
不知道是不是我想要的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产成人久久久 | 成人一区精品 | 久久精品色欧美aⅴ一区二区 | 天天干夜夜操 | 91精品国产91久久久久久吃药 | 亚洲一区二区在线视频 | 日韩在线中文字幕 | 久久国产精品精品国产色婷婷 | 久久精品视频免费观看 | 亚洲精品www久久久久久广东 | 91欧美精品成人综合在线观看 | 亚洲视频欧美视频 | 国产h视频 | 免费黄色特级片 | 国产精品一区二区av | 黄色三级在线播放 | 久久久久国产精品一区二区 | 国产成人精品综合 | 欧美一区二区 | 欧美视频网 | av网站免费看 | 亚洲国产精品视频一区 | 在线一区二区三区 | 另类专区亚洲 | 青娱乐一区二区 | 免费视频久久 | 日韩欧美中文字幕在线观看 | 亚洲a视频 | 一区二区三区四区不卡视频 | 久久91av | 国产一区二区三区视频 | 亚洲一区二区三区视频免费观看 | 91麻豆精品国产91久久久更新资源速度超快 | av在线伊人 | 中文字幕av第一页 | 久久91| 国产精品久久久久久久久久 | 天天操天天操 | 国产精品一区二区不卡 | 福利在线观看 | 国产国产精品 |