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

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

QQ登錄

只需一步,快速開始

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

單片機(jī)+NRF2401收發(fā)一體程序

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

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

  2. xdata u8 TxAddr[5] = {0x01,0x10,0x34,0x43,0x20}; //發(fā)送地址
  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);    //設(shè)置發(fā)送地址               
  77.         NRF_WriteReg(EN_AA,0x01);                         //允許P0自動(dòng)應(yīng)答
  78.         NRF_WriteReg(EN_RXADDR,0x01);                 //P0接收
  79.         NRF_WriteBytes(RX_ADDR_P0,RxAddr,5); //自動(dòng)應(yīng)答地址
  80.         NRF_WriteReg(RF_CH,40);                         //頻率
  81.         NRF_WriteReg(RF_SETUP,0x07);                 //功率和速度
  82.         NRF_WriteReg(CONFIG,0x0e);                 //發(fā)送模式       

  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自動(dòng)應(yīng)答
  89.         NRF_WriteReg(RF_CH,40);                         //頻率
  90.         NRF_WriteReg(RF_SETUP,0x07);                 //功率和速度                       
  91.         NRF_WriteReg(RX_PW_P0,32);         //數(shù)據(jù)有效寬度
  92.         NRF_WriteReg(CONFIG,0x0f);                 //接收模式

  93. }


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

  104.                 switch(mode)
  105.                 {

  106.                         case NRF_TX:NRF_SendMode();                             
  107.                                      break; //發(fā)送
  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個(gè)字節(jié)
  121.           NRF_SPI_RW(WR_TX_PLOAD); //發(fā)送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個(gè)字節(jié)
  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) //發(fā)送模式
  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; //達(dá)到最大重發(fā)次數(shù)
  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); //清除標(biāo)志位
  178.                                                 if(status&RX_OK) //收到數(shù)據(jù)
  179.                                           {
  180.                                                         NRF_RecvData(pbuf,len);
  181.                                                         NRF_WriteReg(FLUSH_RX,0xff);//收到數(shù)據(jù)將RX FIFO清空
  182.                                                         return RX_OK;
  183.                                           }
  184.                                 }
  185.                 }
  186.                
  187.                 return 0xff; //其他錯(cuò)誤
  188. }
復(fù)制代碼
51hei.png
所有資料51hei提供下載:
NRF24L01(整理后).zip (90.47 KB, 下載次數(shù): 102)

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:269804 發(fā)表于 2021-5-9 11:06 來(lái)自手機(jī) | 顯示全部樓層
這個(gè)代碼是利用狀態(tài)機(jī)實(shí)現(xiàn)的,需要代碼無(wú)阻塞
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区在线 | av大片在线观看 | 日韩一区中文字幕 | 日韩精品免费视频 | 亚洲 中文 欧美 日韩 在线观看 | 日本久久久久久久久 | 久久精品国产久精国产 | 国产一区欧美 | 欧美a在线观看 | 国产成人在线观看免费 | 国产一区二区三区四区五区加勒比 | 国产精品毛片一区二区在线看 | 色视频在线观看 | 国产69精品久久久久777 | 狠狠久 | 亚洲欧美国产毛片在线 | 国产午夜视频 | 日日夜夜天天综合 | www.成人久久| 最新中文在线视频 | 久久免费视频2 | 国产韩国精品一区二区三区 | 女人一区| 欧美综合一区 | 99精品一区二区 | 国产中文字幕网 | 国产欧美日韩一区二区三区在线观看 | 超碰人人插 | 在线视频99 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 99精品久久久 | 精品一区二区三区四区外站 | 成人区一区二区三区 | 国产 日韩 欧美 制服 另类 | 一级视频在线免费观看 | 欧美日韩在线成人 | 日本国产欧美 | 99久久中文字幕三级久久日本 | 在线一级片 | 亚洲综合一区二区三区 | 中文字幕av第一页 |