欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8549|回復(fù): 5
收起左側(cè)

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

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


單片機(jī)源程序如下:
  1. /**************************************************************************************
  2. *功能:2.4G通信測試                                                                                                                          *
  3. *說明:在兩塊開發(fā)板上分別下載此程序;                                                                                                  *
  4. *                  按鍵P35    發(fā)生數(shù)據(jù)                                                                                             *
  5. *                                   LED1       發(fā)射指示燈                                                                                          *
  6. *                                   LED2                  接受指示燈                                                                                          *
  7. *                                   LED5-8          2.4G的I/O指示燈                                         *
  8. *硬件連接:                        2.4G                  單片機(jī)                                                                                                  *
  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. *作者:研發(fā)中心                                                                                                                                                  *
  16. ***************************************************************************************/

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

  19. #define uchar unsigned char

  20. /***************************************************/
  21. #define TX_ADR_WIDTH   5  // 5字節(jié)寬度的發(fā)送/接收地址
  22. #define TX_PLOAD_WIDTH 4  // 數(shù)據(jù)通道有效數(shù)據(jù)寬度
  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};  // 定義一個靜態(tài)發(fā)送地址
  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. 函數(shù): init_io()

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

  53. /**************************************************
  54. 函數(shù):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. 函數(shù):SPI_RW()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


回復(fù)

使用道具 舉報

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

使用道具 舉報

6#
無效樓層,該帖已經(jīng)被刪除
ID:560195 發(fā)表于 2020-5-15 17:38 | 顯示全部樓層
emmm正在學(xué)習(xí),下載看看
回復(fù)

使用道具 舉報

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

使用道具 舉報

ID:243748 發(fā)表于 2018-6-13 19:11 來自觸屏版 | 顯示全部樓層
這個可以傳視頻嗎
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

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