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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于NRF24L01無線模塊實時改變頻率?附單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:895128 發表于 2021-4-22 14:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這個程序怎么按鍵更改無線模塊的接受頻率啊
也就是 SPI_RW_Reg(WRITE_REG + RF_CH, 40);      中這個40.我想通過按鍵改成0,20,60,80,這樣的

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned char uint;
  5. //****************************************NRF24L01端口定義***************************************
  6. sbit  MISO =P1^6;  //nRF24L01引腳定義
  7. sbit  MOSI =P1^5;
  8. sbit  SCK  =P1^7;
  9. sbit  CE   =P1^2;
  10. sbit  CSN  =P1^3;
  11. sbit  IRQ  =P1^4;
  12. //************************************按鍵***************************************************
  13. sbit        KEY1=P3^5;
  14. sbit        KEY2=P3^4;
  15. //************************************數碼管位選*********************************************
  16. sbit        led3=P2^0;
  17. sbit        led2=P2^1;
  18. sbit        led1=P2^2;
  19. sbit        led0=P2^3;
  20. sbit        le1=P1^0;
  21. sbit        le2=P1^1;
  22. //************************************蜂明器***************************************************
  23. sbit         BELL=P3^6;
  24. int n;
  25. uchar num;

  26. //***********************************數碼管0-9編碼*******************************************
  27. uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段碼
  28. uchar seg1[10]={0x40,0x4F,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};         //0~~9段碼
  29. char temp[6];
  30. uchar RxBuf[20]={0};
  31. //*********************************************NRF24L01*************************************
  32. #define TX_ADR_WIDTH    5           // 5 uints TX address width
  33. #define RX_ADR_WIDTH    5           // 5 uints RX address width
  34. #define TX_PLOAD_WIDTH  20          // 20 uints TX payload
  35. #define RX_PLOAD_WIDTH  20          // 20 uints TX payload
  36. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  37. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
  38. //***************************************NRF24L01寄存器指令*******************************************************
  39. #define READ_REG        0x00          // 讀寄存器指令
  40. #define WRITE_REG       0x20         // 寫寄存器指令
  41. #define RD_RX_PLOAD     0x61          // 讀取接收數據指令
  42. #define WR_TX_PLOAD     0xA0          // 寫待發數據指令
  43. #define FLUSH_TX        0xE1         // 沖洗發送 FIFO指令
  44. #define FLUSH_RX        0xE2          // 沖洗接收 FIFO指令
  45. #define REUSE_TX_PL     0xE3          // 定義重復裝載數據指令
  46. #define NOP             0xFF          // 保留
  47. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  48. #define CONFIG          0x00  // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
  49. #define EN_AA           0x01  // 自動應答功能設置
  50. #define EN_RXADDR       0x02  // 可用信道設置
  51. #define SETUP_AW        0x03  // 收發地址寬度設置
  52. #define SETUP_RETR      0x04  // 自動重發功能設置
  53. #define RF_CH           0x05  // 工作頻率設置
  54. #define RF_SETUP        0x06  // 發射速率、功耗功能設置
  55. #define STATUS          0x07  // 狀態寄存器
  56. #define OBSERVE_TX      0x08  // 發送監測功能
  57. #define CD              0x09  // 地址檢測           
  58. #define RX_ADDR_P0      0x0A  // 頻道0接收數據地址
  59. #define RX_ADDR_P1      0x0B  // 頻道1接收數據地址
  60. #define RX_ADDR_P2      0x0C  // 頻道2接收數據地址
  61. #define RX_ADDR_P3      0x0D  // 頻道3接收數據地址
  62. #define RX_ADDR_P4      0x0E  // 頻道4接收數據地址
  63. #define RX_ADDR_P5      0x0F  // 頻道5接收數據地址
  64. #define TX_ADDR         0x10  // 發送地址寄存器
  65. #define RX_PW_P0        0x11  // 接收頻道0接收數據長度
  66. #define RX_PW_P1        0x12  // 接收頻道0接收數據長度
  67. #define RX_PW_P2        0x13  // 接收頻道0接收數據長度
  68. #define RX_PW_P3        0x14  // 接收頻道0接收數據長度
  69. #define RX_PW_P4        0x15  // 接收頻道0接收數據長度
  70. #define RX_PW_P5        0x16  // 接收頻道0接收數據長度
  71. #define FIFO_STATUS     0x17  // FIFO棧入棧出狀態寄存器設置
  72. //**************************************************************************************
  73. void Delay(unsigned int s);
  74. void inerDelay_us(unsigned char n);
  75. void init_NRF24L01(void);
  76. uint SPI_RW(uint uchar);
  77. uchar SPI_Read(uchar reg);
  78. void SetRX_Mode(void);
  79. uint SPI_RW_Reg(uchar reg, uchar value);
  80. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
  81. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
  82. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
  83. void nRF24L01_TxPacket(unsigned char * tx_buf);
  84. //*****************************************長延時*****************************************
  85. void Delay(unsigned int s)
  86. {
  87.         unsigned int i;
  88.         for(i=0; i<s; i++);
  89.         for(i=0; i<s; i++);
  90. }
  91. //******************************************************************************************
  92. uint         bdata sta;   //狀態標志
  93. sbit        RX_DR        =sta^6;
  94. sbit        TX_DS        =sta^5;
  95. sbit        MAX_RT        =sta^4;
  96. /******************************************************************************************
  97. /*延時函數
  98. /******************************************************************************************/
  99. void inerDelay_us(unsigned char n)
  100. {
  101.         for(;n>0;n--)
  102.                 _nop_();
  103. }
  104. //****************************************************************************************
  105. /*NRF24L01初始化
  106. //***************************************************************************************/
  107. void init_NRF24L01(void)
  108. {
  109.   inerDelay_us(100);
  110.          CE=0;    // chip enable
  111.          CSN=1;   // Spi disable
  112.          SCK=0;   // Spi clock line init high
  113.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 寫本地地址        
  114.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
  115.         SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);                                                       //  頻道0自動        ACK應答允許        
  116.         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允許接收地址只有頻道0,如果需要多頻道,可以參考Page21  
  117.   SPI_RW_Reg(WRITE_REG + RF_CH, 40);        //   設置信道工作為2.4GHZ,收發必須一致
  118.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設置接收數據長度,本次設置為32紙?
  119.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //設置發射速率為1MHZ,發射功率為最大值0dB

  120. }

  121. /****************************************************************************************************
  122. /*函數:uint SPI_RW(uint uchar)
  123. /*功能:NRF24L01的SPI寫時序
  124. /*詳細請參考Page19
  125. /****************************************************************************************************/
  126. uint SPI_RW(uint uchar)
  127. {
  128.         uint bit_ctr;
  129.            for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
  130.            {
  131.                 MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
  132.                 uchar = (uchar << 1);           // shift next bit into MSB..
  133.                 SCK = 1;                      // Set SCK high..
  134.                 uchar |= MISO;                         // capture current MISO bit
  135.                 SCK = 0;                              // ..then set SCK low again
  136.            }
  137.     return(uchar);                             // return read uchar
  138. }
  139. /****************************************************************************************************
  140. /*函數:uchar SPI_Read(uchar reg)
  141. /*功能:NRF24L01的SPI時序
  142. /*詳細請參考Page19
  143. /****************************************************************************************************/
  144. uchar SPI_Read(uchar reg)
  145. {
  146.         uchar reg_val;
  147.         
  148.         CSN = 0;                // CSN low, initialize SPI communication...
  149.         SPI_RW(reg);            // Select register to read from..
  150.         reg_val = SPI_RW(0);    // ..then read registervalue
  151.         CSN = 1;                // CSN high, terminate SPI communication
  152.         
  153.         return(reg_val);        // return register value
  154. }
  155. /****************************************************************************************************/
  156. /*功能:NRF24L01讀寫寄存器函數
  157. /****************************************************************************************************/
  158. uint SPI_RW_Reg(uchar reg, uchar value)
  159. {
  160.         uint status;
  161.         
  162.         CSN = 0;                   // CSN low, init SPI transaction
  163.         status = SPI_RW(reg);      // select register
  164.         SPI_RW(value);             // ..and write value to it..
  165.         CSN = 1;                   // CSN high again
  166.         
  167.         return(status);            // return nRF24L01 status uchar
  168. }
  169. /****************************************************************************************************/
  170. /*函數:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  171. /*功能: 用于讀數據,reg:為寄存器地址,pBuf:為待讀出數據地址,uchars:讀出數據的個數
  172. /****************************************************************************************************/
  173. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  174. {
  175.         uint status,uchar_ctr;
  176.         
  177.         CSN = 0;                                    // Set CSN low, init SPI tranaction
  178.         status = SPI_RW(reg);                       // Select register to write to and read status uchar
  179.         
  180.         for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
  181.                 pBuf[uchar_ctr] = SPI_RW(0);    //
  182.         
  183.         CSN = 1;                           
  184.         
  185.         return(status);                    // return nRF24L01 status uchar
  186. }
  187. /*********************************************************************************************************
  188. /*函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  189. /*功能: 用于寫數據:為寄存器地址,pBuf:為待寫入數據地址,uchars:寫入數據的個數
  190. /*********************************************************************************************************/
  191. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  192. {
  193.         uint status,uchar_ctr;
  194.         
  195.         CSN = 0;            //SPI使能      
  196.         status = SPI_RW(reg);   
  197.         for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  198.                 SPI_RW(*pBuf++);
  199.         CSN = 1;           //關閉SPI
  200.         return(status);    //
  201. }
  202. /****************************************************************************************************/
  203. /*函數:void SetRX_Mode(void)
  204. /*功能:數據接收配置
  205. /****************************************************************************************************/
  206. void SetRX_Mode(void)
  207. {
  208.         CE=0;
  209.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收發完成中斷響應,16位CRC        ,主接收
  210.         CE = 1;
  211.         inerDelay_us(130);
  212. }
  213. /******************************************************************************************************/
  214. /*函數:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  215. /*功能:數據讀取后放如rx_buf接收緩沖區中
  216. /******************************************************************************************************/
  217. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  218. {
  219.     unsigned char revale=0;
  220.         sta=SPI_Read(STATUS);        // 讀取狀態寄存其來判斷數據接收狀況
  221.         if(RX_DR)                                // 判斷是否接收到數據
  222.         {
  223.             CE = 0;                        
  224.         SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  225.                 revale =1;                        //讀取數據完成標志
  226.         }
  227.         SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到數據后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來其清除中斷標志
  228.         return revale;
  229. }
  230. /***********************************************************************************************************
  231. /*函數:void nRF24L01_TxPacket(unsigned char * tx_buf)
  232. /*功能:發送 tx_buf中數據
  233. /**********************************************************************************************************/
  234. void nRF24L01_TxPacket(unsigned char * tx_buf)
  235. {
  236.         CE=0;                        //StandBy I模式        
  237.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
  238.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 裝載數據        
  239.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收發完成中斷響應,16位CRC,主發送
  240.         CE=1;                 //置高CE,激發數據發送
  241.         inerDelay_us(10);
  242. }
  243. //***********************************************串口初始化***********************************************
  244. void StartUART( void )        
  245. {                                                  
  246.      SCON = 0x50;
  247.      TMOD = 0x20;
  248.      TH1 = 0xFA;
  249.      TL1 = 0xFA;                        //波特率4800
  250.      PCON = 0x00;
  251.      TR1 = 1;
  252. }
  253. //***********************************************通過串口向PC發送***********************************************
  254. void R_S_Byte(uchar R_Byte)
  255. {        
  256.          SBUF = R_Byte;  
  257.      while( TI == 0 );                                //查詢法
  258.            TI = 0;   
  259. }
  260. //***********************************************數碼動態掃描顯示***********************************************
  261. void disdignit()
  262. {
  263.         P0=0xC6;                          //C
  264.         led0=0;
  265.         Delay(10);
  266.         led0=1;
  267.         P0=seg[temp[1]];          //小數位
  268.         led1=0;
  269.         Delay(10);
  270.         led1=1;
  271.         P0=seg1[temp[5]];    //十位
  272.         led2=0;
  273.         Delay(10);
  274.         led2=1;
  275.         P0=seg[temp[4]];           //個位
  276.         led3=0;
  277.         Delay(10);
  278.         led3=1;
  279. }
  280. //************************************主函數************************************************************
  281. void main(void)
  282. {
  283.         uchar i=0;        
  284.   init_NRF24L01() ;                        //NRF24L01初始化
  285.         StartUART();
  286.         Delay(1);
  287.         BELL=1;

  288.         while(1)
  289.         {
  290. //***********************************************************************************************
  291.         SetRX_Mode();
  292.                    if(nRF24L01_RxPacket(RxBuf))
  293.                 {
  294.                         temp[0]=RxBuf[3];                                                      //符號位
  295.                         temp[2]=((RxBuf[2]<<4)|RxBuf[1]);                        //整數位
  296.                         temp[1]=RxBuf[0];                                                        //小數位
  297.                   temp[4]=RxBuf[2];                                                        //十位
  298.                    temp[5]=RxBuf[1];                                                        //個位
  299.                         disdignit();                //數碼管顯示溫度
  300.                         R_S_Byte('t');     //串口顯示溫度
  301.                         disdignit();                //數碼管顯示溫度
  302.                         disdignit();                //數碼管顯示溫度
  303.                         R_S_Byte(0x30+temp[4]);     //串口顯示溫度
  304.                         R_S_Byte(0x30+temp[5]);     //串口顯示溫度
  305.                         R_S_Byte('.');              //串口顯示溫度
  306.                         R_S_Byte(0x30+temp[1]);     //串口顯示溫度
  307.                         disdignit();                //數碼管顯示溫度
  308.                         disdignit();                //數碼管顯示溫度
  309.                         disdignit();                //數碼管顯示溫度
  310.                         for(i=0;i<3;i++)
  311.                         {
  312.                         R_S_Byte(temp[2-i]);     //串口顯示溫度
  313.                         Delay(60);
  314.                         }
  315.                 }
  316.                         disdignit();                //數碼管顯示溫度
  317.                         
  318.                 if(temp[2]>=0x30)                        //大于30度時報警,0x30轉換成10進制為48
  319.                 {
  320.                         
  321.                         BELL=0;                           //打開蜂明器
  322.                         Delay(10);
  323.                 }
  324.                 else
  325.                 {
  326.                         BELL=1;                  //關閉蜂明器
  327.         }        

  328.                
  329.                
  330.                 }
  331. }


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

使用道具 舉報

沙發
ID:390416 發表于 2021-4-23 09:45 | 只看該作者
很簡單啊  設置一組頻率表,如果通信失敗 那么就改變頻率。發送端的順時針選頻,接收端不斷的逆時針選頻。兩者保持一定的速度差。那么 總會有一個頻率碰上的。
回復

使用道具 舉報

板凳
ID:895128 發表于 2021-4-27 12:36 | 只看該作者
重點是怎么改變頻率,因為頻率是一開始就初始化的。
回復

使用道具 舉報

地板
ID:490426 發表于 2022-7-20 15:47 | 只看該作者
想問樓主這個能改嗎?我改 了就通信不上了,是這樣改嗎
回復

使用道具 舉報

5#
ID:879348 發表于 2022-7-20 15:49 | 只看該作者
改變頻道即可,沒什么難度的
回復

使用道具 舉報

6#
ID:1062022 發表于 2023-2-2 21:44 | 只看該作者
最近入門也在研究這個24L01 正好也用得上這個跳頻,只不過我這是單向發送的
SPI_RW_Reg(WRITE_REG + RF_CH, 40); 直接給后面這個信道給一個變量
例如SPI_RW_Reg(WRITE_REG + RF_CH, xindao);
然后在main函數大循環里面寫個類似于這樣的
if(key1==0)
                        xindao = 60;
if(key1==1)
                        xindao = 40;
我實驗了一下是可行的
回復

使用道具 舉報

7#
ID:1034262 發表于 2023-2-2 22:55 | 只看該作者
直接給通道值就可以了。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品自在线 | 日日干夜夜草 | 国产精品久久av | 欧美成人免费 | 日韩三片 | 国产精品视频免费观看 | 国产视频久久久 | 美女天堂av| 亚洲aⅴ | 伊人伊人伊人 | 一区二区三区中文字幕 | 欧美一区2区三区4区公司二百 | va精品| 欧美一区二区三区久久精品 | 成人免费视频 | 91免费高清视频 | 欧美日韩国产精品 | 久久综合婷婷 | 久久精品视频网站 | 亚洲精品视频导航 | 欧美精品一二三区 | 久久亚洲综合 | 动漫www.被爆羞羞av44 | 91丨九色丨国产在线 | 韩日在线视频 | 中文字幕 视频一区 | 亚洲国产精品一区二区www | 日韩成人在线观看 | 成人欧美一区二区三区黑人孕妇 | jizz在线看片 | 国产精品一二三区 | 91视频在线 | 91精品免费| 激情欧美一区二区三区中文字幕 | 欧美 日韩 国产 一区 | 欧美一区二区三区在线观看视频 | 色呦呦在线 | 久久精品色欧美aⅴ一区二区 | 久热久热| 在线观看视频一区二区三区 | 91国产视频在线 |