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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+NRF2401收發一體程序

  [復制鏈接]
ID:269804 發表于 2021-4-18 20:02 | 顯示全部樓層 |閱讀模式
NRF2401收發一套程序只需要修改參數即可實現收發功能。
51hei.png

單片機源程序如下:
  1. #include "NRF24L01.h"

  2. xdata u8 TxAddr[5] = {0x01,0x10,0x34,0x43,0x20}; //發送地址
  3. xdata u8 RxAddr[5] = {0x01,0x10,0x34,0x43,0x20}; //接收地址

  4. void NRF_IO_Init(void)
  5. {
  6.         SCK = 0;
  7. }

  8. u8 NRF_SPI_RW(u8 byte)
  9. {
  10.         u8 i = 0;
  11.         for(i=0;i<8;i++)
  12.         {
  13.                 MOSI = (byte&0x80);
  14.                 byte <<= 1;
  15.                 SCK = 1;
  16.                 byte|=MISO;
  17.                 SCK=0;
  18.         }
  19.        
  20.         return byte;
  21. }


  22. void NRF_WriteReg(u8 regaddr,u8 regval)
  23. {
  24.           CSN = 0;
  25.                 NRF_SPI_RW(regaddr+W_REG);
  26.           NRF_SPI_RW(regval);
  27.           CSN = 1;
  28. }

  29. u8 NRF_ReadReg(u8 regaddr)
  30. {
  31.           CSN = 0;
  32.                 NRF_SPI_RW(regaddr+R_REG);
  33.           regaddr = NRF_SPI_RW(NOP);
  34.           CSN = 1;
  35.                 return regaddr;
  36. }


  37. void NRF_WriteBytes(u8 regaddr,u8*nrfaddr,u8 len)
  38. {
  39.                 u8 i = 0;
  40.           CSN = 0;
  41.                 NRF_SPI_RW(regaddr+W_REG);
  42.           for(i = 0;i<len;i++)
  43.           {
  44.                    NRF_SPI_RW(nrfaddr[i]);
  45.                 }
  46.           CSN = 1;
  47. }

  48. void NRF_ReadBytes(u8 regaddr,u8*nrfaddr,u8 len)
  49. {
  50.                 u8 i = 0;
  51.           CSN = 0;
  52.                 NRF_SPI_RW(regaddr+R_REG);
  53.           for(i = 0;i<len;i++)
  54.           {
  55.                    nrfaddr[i] = NRF_SPI_RW(NOP);
  56.                 }
  57.           CSN = 1;
  58. }


  59. u8 NRF_CheckDev(void)
  60. {
  61.         u8 i  = 0;
  62.   xdata u8 rbuf[5] = {0};
  63.         NRF_WriteBytes(TX_ADDR,TxAddr,5);
  64.         NRF_ReadBytes(TX_ADDR,rbuf,5);
  65.         for(i=0;i<5;i++)
  66.         {
  67.                 if(TxAddr[i]!=rbuf[i])
  68.                 {
  69.                         return 0xff;
  70.                 }
  71.         }
  72.         return 0x0;
  73. }


  74. void NRF_SendMode(void)
  75. {
  76.         NRF_WriteBytes(TX_ADDR,TxAddr,5);    //設置發送地址               
  77.         NRF_WriteReg(EN_AA,0x01);                         //允許P0自動應答
  78.         NRF_WriteReg(EN_RXADDR,0x01);                 //P0接收
  79.         NRF_WriteBytes(RX_ADDR_P0,RxAddr,5); //自動應答地址
  80.         NRF_WriteReg(RF_CH,40);                         //頻率
  81.         NRF_WriteReg(RF_SETUP,0x07);                 //功率和速度
  82.         NRF_WriteReg(CONFIG,0x0e);                 //發送模式       

  83. }

  84. void NRF_RecvMode(void)
  85. {
  86.         NRF_WriteReg(EN_RXADDR,0x01);                 //P0接收
  87.         NRF_WriteBytes(RX_ADDR_P0,RxAddr,5); //接收地址
  88.         NRF_WriteReg(EN_AA,0x01);                         //允許P0自動應答
  89.         NRF_WriteReg(RF_CH,40);                         //頻率
  90.         NRF_WriteReg(RF_SETUP,0x07);                 //功率和速度                       
  91.         NRF_WriteReg(RX_PW_P0,32);         //數據有效寬度
  92.         NRF_WriteReg(CONFIG,0x0f);                 //接收模式

  93. }


  94. //返回值 0 存在設備 1 設備有問題
  95. //參數 0 發送模式   1接收模式
  96. u8 NRF_CONFIG(u8 mode)
  97. {
  98.          
  99.                 NRF_IO_Init();
  100.                 if(NRF_CheckDev()) //檢測設備存在
  101.           {
  102.                                 return 0xff;
  103.                 }

  104.                 switch(mode)
  105.                 {

  106.                         case NRF_TX:NRF_SendMode();                             
  107.                                      break; //發送
  108.                         case NRF_RX:NRF_RecvMode();
  109.                                                                          break; //接收
  110.                        
  111.                         default: return 0xff;
  112.                 }
  113.                
  114.           return 0x00;
  115. }


  116. void NRF_SendData(u8 *sbuf,u8 len)
  117. {
  118.                 CE = 0;
  119.     CSN = 0;
  120.                 if(len>32)len = 32; //限制最大32個字節
  121.           NRF_SPI_RW(WR_TX_PLOAD); //發送fifo地址
  122.           while(len--)
  123.                 {
  124.                   NRF_SPI_RW(*sbuf++);
  125.                 }
  126.                 CSN = 1;
  127.                 CE = 1;
  128. }



  129. void NRF_RecvData(u8 *sbuf,u8 len)
  130. {
  131.     CSN = 0;
  132.                 if(len>32)len = 32; //限制最大32個字節
  133.           NRF_SPI_RW(RD_RX_PLOAD);
  134.           while(len--)
  135.                 {
  136.                  *sbuf=NRF_SPI_RW(NOP);
  137.                         sbuf++;
  138.                 }
  139.                 CSN = 1;
  140. }


  141. u8 NRF_TxOrRxPack(u8 mode,u8 *pbuf,u8 len,u8 timeout)
  142. {
  143.                 static xdata u16 cnt = 0;
  144.                 static xdata u8 SRMode = 0;
  145.           u8 status = 0;
  146.                 if(++cnt>timeout)
  147.                 {
  148.                           cnt = 0;
  149.                           if(mode==NRF_TX) //發送模式
  150.                                 {
  151.                                                 switch(SRMode)
  152.                                                 {
  153.                                                         case 0:NRF_SendData(pbuf,len);SRMode++;
  154.                                                                     break;
  155.                                                         case 1:if(IRQ==0){
  156.                                                                                         status =NRF_ReadReg(STATUS);
  157.                                                                                         NRF_WriteReg(STATUS,status);
  158.                                                                                         if(status&MAX_TX)
  159.                                                                                         {
  160.                                                                                                         NRF_WriteReg(FLUSH_TX,0xff);
  161.                                                                                                         SRMode = 0;
  162.                                                                                                         return MAX_TX; //達到最大重發次數
  163.                                                                                         }
  164.                                                                                         if(status&TX_OK)
  165.                                                                                         {
  166.                                                                                                   SRMode = 0;
  167.                                                                                                         return TX_OK; //成功
  168.                                                                                         }
  169.                                                                                 }
  170.                                                                                 break;
  171.                                                         default: SRMode = 0;
  172.                                                 }
  173.                                 }
  174.                                  if(mode==NRF_RX) //接收模式
  175.                                 {
  176.                                                 status =NRF_ReadReg(STATUS);
  177.                               NRF_WriteReg(STATUS,status); //清除標志位
  178.                                                 if(status&RX_OK) //收到數據
  179.                                           {
  180.                                                         NRF_RecvData(pbuf,len);
  181.                                                         NRF_WriteReg(FLUSH_RX,0xff);//收到數據將RX FIFO清空
  182.                                                         return RX_OK;
  183.                                           }
  184.                                 }
  185.                 }
  186.                
  187.                 return 0xff; //其他錯誤
  188. }
復制代碼
51hei.png
所有資料51hei提供下載:
NRF24L01(整理后).zip (90.47 KB, 下載次數: 102)


評分

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

查看全部評分

回復

使用道具 舉報

ID:28992 發表于 2021-4-19 00:19 | 顯示全部樓層
very good job, thank you sir!
回復

使用道具 舉報

ID:269804 發表于 2021-5-9 11:06 來自手機 | 顯示全部樓層
這個代碼是利用狀態機實現的,需要代碼無阻塞
回復

使用道具 舉報

ID:281029 發表于 2022-4-2 14:38 | 顯示全部樓層
想問下頭文件#include <STC89C5xRC.H>為什么編譯提示有問題
回復

使用道具 舉報

ID:44459 發表于 2022-4-3 23:59 | 顯示全部樓層
謝謝分享  正準備研究一下
回復

使用道具 舉報

ID:269804 發表于 2022-5-20 17:29 | 顯示全部樓層
山川慕白 發表于 2022-4-2 14:38
想問下頭文件#include 為什么編譯提示有問題

需要添加stc的頭文件,用reg52.h 也行可能就是需要改一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩视频一区二区 | 精品国产免费人成在线观看 | 午夜精品在线 | 欧美一区二区三区在线免费观看 | 亚洲精品区| 国产精品免费在线 | 亚洲一区二区三区视频 | 欧美日韩一区二区在线播放 | 欧美日韩亚 | 亚洲视频一区在线观看 | 午夜免费在线 | 久久久蜜桃 | 亚洲精品一区二区三区免 | 欧美综合久久 | 国产精品资源在线 | 99精品视频一区二区三区 | 最新黄色在线观看 | 人和拘一级毛片c | 嫩草视频入口 | 中文字幕视频在线观看 | 中文字幕免费中文 | 一区二区三区四区不卡视频 | 日韩av一区二区在线 | 国产欧美日韩一区二区三区 | 久久午夜精品福利一区二区 | 久久精品亚洲精品国产欧美 | 欧美精品在线看 | 久久精品免费观看 | 欧美午夜视频 | 日韩在线视频一区 | 日本不卡在线视频 | 四虎永久免费在线 | a级毛片毛片免费观看久潮喷 | 一区二区三区在线免费观看 | 亚洲免费久久久 | 午夜免费福利电影 | 日韩在线精品视频 | 天堂在线免费视频 | 欧洲免费毛片 | a网站在线观看 | 久久精品国产一区二区三区不卡 |