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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

nRF24L01一鍵遙控接收端LED燈與蜂鳴器響

[復制鏈接]
跳轉到指定樓層
樓主
基于51單片機的nrf24l01一鍵遙控LED燈

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

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit beep=P3^7;

  6. //****************************NRF24L01端 口 定 義 **************************
  7. sbit CE    =P2^0; //芯片使能
  8. sbit CSN   =P2^1; //片選信號
  9. sbit SCK   =P2^2; //串行時鐘信號
  10. sbit MOSI  =P2^3; //主收從發
  11. sbit MISO  =P2^4; //主發從收
  12. sbit IRQ   =P2^5; //中斷查詢

  13. //*****************************************延時函數***************************************//
  14. void delayus(uint us)
  15. {
  16.         for(;us >0;us--)
  17.         {        
  18.                 _nop_();
  19.         }
  20. }


  21. //*****************************NRF24L01的接收和發送地址***************************************//
  22. #define TX_ADR_WIDTH    5   // 5個字節的TX地址長度
  23. #define RX_ADR_WIDTH    5   // 5個字節的RX地址長度
  24. #define TX_PLOAD_WIDTH  16  // ?個字節的TX數據長度
  25. #define RX_PLOAD_WIDTH  16  // ?個字節的RX數據長度
  26. uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  27. uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
  28. //***************************************NRF24L01寄存器指令**********************************//
  29. #define READ_REG        0x00          // 讀寄存器
  30. #define WRITE_REG       0x20         // 寫寄存器
  31. #define RD_RX_PLOAD     0x61          // 讀取接收數據
  32. #define WR_TX_PLOAD     0xA0          // 寫待發數據
  33. #define FLUSH_TX        0xE1         // 沖洗發送 FIFO
  34. #define FLUSH_RX        0xE2          // 沖洗接收 FIFO
  35. #define REUSE_TX_PL     0xE3          // 定義重復裝載數據
  36. #define NOP             0xFF          // 保留
  37. //*************************************SPI(nRF24L01)寄存器地址*****************************//
  38. #define CONFIG          0x00  // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
  39. #define EN_AA           0x01  // 自動應答功能設置
  40. #define EN_RXADDR       0x02  // 可用信道設置
  41. #define SETUP_AW        0x03  // 收發地址寬度設置
  42. #define SETUP_RETR      0x04  // 自動重發功能設置
  43. #define RF_CH           0x05  // 工作頻率設置
  44. #define RF_SETUP        0x06  // 發射速率、功耗功能設置
  45. #define STATUS          0x07  // 狀態寄存器
  46. #define OBSERVE_TX      0x08  // 發送監測功能
  47. #define CD              0x09  // 地址檢測           
  48. #define RX_ADDR_P0      0x0A  // 頻道0接收數據地址
  49. #define RX_ADDR_P1      0x0B  // 頻道1接收數據地址
  50. #define RX_ADDR_P2      0x0C  // 頻道2接收數據地址
  51. #define RX_ADDR_P3      0x0D  // 頻道3接收數據地址
  52. #define RX_ADDR_P4      0x0E  // 頻道4接收數據地址
  53. #define RX_ADDR_P5      0x0F  // 頻道5接收數據地址
  54. #define TX_ADDR         0x10  // 發送地址寄存器
  55. #define RX_PW_P0        0x11  // 接收頻道0接收數據長度
  56. #define RX_PW_P1        0x12  // 接收頻道0接收數據長度
  57. #define RX_PW_P2        0x13  // 接收頻道0接收數據長度
  58. #define RX_PW_P3        0x14  // 接收頻道0接收數據長度
  59. #define RX_PW_P4        0x15  // 接收頻道0接收數據長度
  60. #define RX_PW_P5        0x16  // 接收頻道0接收數據長度
  61. #define FIFO_STATUS     0x17  // FIFO棧入棧出狀態寄存器設置
  62. void init_NRF24L01();
  63. uchar SPI_RW(uchar num);
  64. uchar SPI_Read(uchar reg);
  65. void SetRX_Mode();
  66. void SetTx_Mode();
  67. uchar SPI_RW_Reg(uchar reg, uchar value);
  68. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
  69. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
  70. void nRF24L01_RxPacket(uchar *rx_buf);
  71. void nRF24L01_TxPacket(uchar *tx_buf);

  72. //****************************************狀態標志****************************************//
  73. uchar         bdata sta;
  74. sbit        RX_DR        =sta^6;
  75. sbit        TX_DS        =sta^5;
  76. sbit        MAX_RT        =sta^4;
  77. //********************************NRF24L01初始化******************************************//
  78. void init_NRF24L01()
  79. {
  80.     delayus(100);
  81.          CE=0;    // 片選使能
  82.          CSN=1;   // SPI使能
  83.          SCK=0;   // SPI時鐘拉低
  84.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //寫本地地址        
  85.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); //寫接收端地址
  86.         SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);                             //通道0自動應答         
  87.         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);                         //允許接收地址頻道0
  88.         SPI_RW_Reg(WRITE_REG + RF_CH, 0x32);                             //設置信道工作頻率,收發必須一致
  89.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);                //設置接收數據長度
  90.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);                                    //設置發射速率為2MHZ,發射功率為最大值0dB        
  91.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x7c);                                                          //IRQ引腳不顯示中斷 掉電模式  1~16CRC校驗
  92. }
  93. /****************************************************************************************************
  94. /*函數:uint SPI_RW(uint uchar)
  95. /*功能:NRF24L01的SPI寫時序
  96. /****************************************************************************************************/
  97. uchar SPI_RW(uchar num)
  98. {
  99.         uchar bit_ctr;
  100.            for(bit_ctr=0;bit_ctr<8;bit_ctr++)  // output 8-bit
  101.            {
  102.                 MOSI = (num & 0x80);            // output 'uchar', MSB to MOSI
  103.                 num = (num << 1);               // shift next bit into MSB..
  104.                 SCK = 1;                        // Set SCK high..
  105.                 num |= MISO;                               // capture current MISO bit
  106.                 SCK = 0;                                // ..then set SCK low again
  107.            }
  108.     return(num);                                   // return read uchar
  109. }
  110. /****************************************************************************************************
  111. 函數:uchar SPI_Read(uchar reg)
  112. 功能:NRF24L01的SPI時序
  113. ****************************************************************************************************/
  114. uchar SPI_Read(uchar reg)
  115. {
  116.         uchar reg_val;
  117.         
  118.         CSN = 0;                // CSN low, initialize SPI communication...
  119.         SPI_RW(reg);            // Select register to read from..
  120.         reg_val = SPI_RW(0);    // ..then read registervalue
  121.         CSN = 1;                // CSN high, terminate SPI communication
  122.         
  123.         return(reg_val);        // return register value
  124. }
  125. /****************************************************************************************************/
  126. /*功能:NRF24L01讀寫寄存器函數
  127. /****************************************************************************************************/
  128. uchar SPI_RW_Reg(uchar reg, uchar value)
  129. {
  130.         uchar status;
  131.         CSN = 0;                   // CSN low, init SPI transaction
  132.         status = SPI_RW(reg);      // select register
  133.         SPI_RW(value);             // ..and write value to it..
  134.         CSN = 1;                   // CSN high again
  135.         return(status);            // return nRF24L01 status uchar
  136. }
  137. /****************************************************************************************************/
  138. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
  139. {
  140.         uchar status,byte_ctr;
  141.         CSN = 0; // Set CSN low, init SPI tranaction
  142.         status = SPI_RW(reg); // Select register to write to and read status byte
  143.         for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
  144.         pBuf[byte_ctr] = SPI_RW(0); // Perform SPI_RW to read byte from nRF24L01
  145.         CSN = 1; // Set CSN high again
  146.         return(status); // return nRF24L01 status byte
  147. }
  148. /*********************************************************************************************************
  149. /*函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  150. /*功能: 用于寫數據:為寄存器地址,pBuf:為待寫入數據地址,uchars:寫入數據的個數
  151. /*********************************************************************************************************/
  152. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  153. {
  154.         uchar status,uchar_ctr;
  155.         
  156.         CSN = 0;            //SPI使能      
  157.         status = SPI_RW(reg);   
  158.         for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  159.                 SPI_RW(*pBuf++);
  160.         CSN = 1;           //關閉SPI
  161.         return(status);    //
  162. }
  163. //********** nrf收發程序 **********
  164. void nrf_RxTx(uchar mod_nrf,uchar *buff) //NRF24L01收發程序        
  165. {                        
  166.         static uchar mod_nrf_b;

  167. //******進入發射模式******
  168.         if(mod_nrf == 't')
  169.         {
  170.                 if(mod_nrf_b != 't')
  171.                 {        
  172.                         mod_nrf_b = 't';
  173.                         CE = 0;
  174.                         SPI_RW_Reg(WRITE_REG+STATUS,0xff);         //清除中斷標志
  175.                         SPI_RW_Reg(FLUSH_TX,0x00);                        //清除TX_FIFO寄存器
  176.                         SPI_RW_Reg(WRITE_REG + CONFIG,0x7e);//IRQ引腳不顯示中斷 上電 發射模式  1~16CRC校驗
  177.                         CE = 1;
  178.                         delayus(130);//從CE = 0 到 CE = 1;即待機模式到收發模式,需要最大130us                  
  179.                 }
  180.                
  181. //******發送數據******
  182.                 CE = 0;                        //StandBy I模式        
  183.                 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
  184.                 SPI_Write_Buf(WR_TX_PLOAD,buff,TX_PLOAD_WIDTH);                          // 裝載數據
  185.                 CE = 1;                 //置高CE激發數據發送
  186.                 delayus(130);//從CE = 0 到 CE = 1;即待機模式到收發模式,需要最大130us
  187.                
  188.                 delayus(100); //給發送數據一點時間         比發送速度較快 延時可以比接收少
  189.                 sta = SPI_Read(STATUS);//讀取狀態寄存器的值
  190.                 SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除對應的中斷
  191.                                                 
  192.                 if(TX_DS == 1)//發送成功再清除tx fifo寄存器
  193.                 {        
  194.                         CE = 0;                        
  195.                         SPI_RW_Reg(FLUSH_TX,0x00); //清除tx fifo寄存器        //********重要*********
  196.                         CE = 1;
  197.                 }                                                               
  198.                                 
  199.         }
  200. //******進入接收模式******
  201.         else if(mod_nrf == 'r')//接收模式
  202.         {
  203.                 if(mod_nrf_b != 'r')
  204.                 {
  205.                         mod_nrf_b = 'r';
  206.                         CE = 0;
  207.                         SPI_RW_Reg(WRITE_REG+STATUS,0xff);        //清除中斷標志
  208.                         SPI_RW_Reg(FLUSH_RX,0x00);                         //清除RX_FIFO寄存器
  209.                         SPI_RW_Reg(WRITE_REG + CONFIG, 0x7f);//IRQ引腳不顯示中斷 上電 接收模式   1~16CRC校驗   
  210.                         CE = 1;
  211.                         delayus(130);//從CE = 0 到 CE = 1;即待機模式到收發模式,需要最大130us
  212.                 }               
  213.                 delayus(500); //不能少 值可調  給接收數據一點時間
  214.                 sta = SPI_Read(STATUS);
  215.                 SPI_RW_Reg(WRITE_REG+STATUS,sta);   
  216.                 if(RX_DR == 1)   
  217.                 {
  218.                         CE = 0;  
  219.                         SPI_Read_Buf(RD_RX_PLOAD,buff,RX_PLOAD_WIDTH);//讀取數據 存入數組
  220.                         SPI_RW_Reg(FLUSH_RX,0x00);//清除rx fifo寄存器        數據不抖動
  221.                         CE = 1;
  222.                 }                  
  223.          }
  224. }



  225. void main()
  226. {
  227.         uchar idata RxBuf[16];        //接收緩存 存入idata區
  228.         uchar idata TxBuf[16];        //發送緩存
  229.         uint t_while = 0;
  230.         uint t_tx = 100;
  231.         uint t_rx = 100;

  232.         init_NRF24L01();                //nrf24l01初始化
  233.         
  234.         RxBuf[0] = 0;
  235.         TxBuf[0] = 1;
  236.         
  237.         while(1)
  238.         {        
  239.                 t_while = t_rx ;
  240.                 while(t_while--)                        //一旦接收成功就跳出循環 最多接收t_while次        
  241.                 {        
  242.                         nrf_RxTx('r',RxBuf);        //接收模式
  243.                         
  244.                         if(RX_DR == 1)                        //接收成功
  245.                                 break;                                //跳出循環進入發送模式
  246.                 }
  247.                
  248.                 if(RxBuf[0] == 0x10)               
  249.                 {
  250.                         beep=0;
  251.                         
  252.                 }
  253.                 else
  254.                 {
  255.                         beep=1;
  256.                 }
  257.         }
  258. }
復制代碼

所有資料51hei提供下載:
nRF24L01一鍵遙控接收端蜂鳴器響.zip (51.74 KB, 下載次數: 53)


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

使用道具 舉報

無效樓層,該帖已經被刪除
板凳
ID:352449 發表于 2019-5-8 22:10 | 只看該作者
接收端怎么工作的
回復

使用道具 舉報

地板
ID:352449 發表于 2019-5-11 16:21 | 只看該作者
有原理圖嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表