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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2573|回復: 0
收起左側

基于51單片機&NRF2401L的多通道遙控車程序

[復制鏈接]
ID:751452 發表于 2020-5-26 09:05 | 顯示全部樓層 |閱讀模式
5黑幣
       最近研究NRF2401L無線模塊,想用其做一個遙控車,但是調通了第0通道,其他幾個通道不知道怎么弄了,希望大神指導。
       目前能夠實現的功能只有:遙控按前進,車子前進,按左轉前輪向左偏轉,但是二者不可同時操作,也就是每次只能按下一個按鍵,不然就會紊亂。
下面是遙控器端NRF2401L的驅動程序:
  1. #ifndef NRF24L01_H
  2. #define NRF24L01_H
  3. #include "delay.h"

  4. sbit         MISO        =P2^0;
  5. sbit        SCK          =P2^1;
  6. sbit        CE          =P2^2;

  7. sbit        IRQ                =P2^7;
  8. sbit         MOSI        =P2^6;
  9. sbit        CSN                =P2^5;

  10. /*********NRF24L01*****************/
  11. #define TX_ADR_WIDTH    5          
  12. #define RX_ADR_WIDTH    5          
  13. #define TX_PLOAD_WIDTH  12         
  14. #define RX_PLOAD_WIDTH  12         
  15. uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  16. uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
  17. /*********NRF24L01寄存器指令*****************/
  18. #define READ_REG        0x00          // 讀寄存器指令
  19. #define WRITE_REG       0x20         // 寫寄存器指令
  20. #define RD_RX_PLOAD     0x61          // 讀取接收數據指令
  21. #define WR_TX_PLOAD     0xA0          // 寫待發數據指令
  22. #define FLUSH_TX        0xE1         // 沖洗發送 FIFO指令
  23. #define FLUSH_RX        0xE2          // 沖洗接收 FIFO指令
  24. #define REUSE_TX_PL     0xE3          // 定義重復裝載數據指令
  25. #define NOP             0xFF          // 保留
  26. /*********nRF24L01寄存器地址*****************/
  27. #define CONFIG          0x00  // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
  28. #define EN_AA           0x01  // 自動應答功能設置
  29. #define EN_RXADDR       0x02  // 可用信道設置
  30. #define SETUP_AW        0x03  // 收發地址寬度設置
  31. #define SETUP_RETR      0x04  // 自動重發功能設置
  32. #define RF_CH           0x05  // 工作頻率設置
  33. #define RF_SETUP        0x06  // 發射速率、功耗功能設置
  34. #define STATUS          0x07  // 狀態寄存器
  35. #define OBSERVE_TX      0x08  // 發送監測功能
  36. #define CD              0x09  // 地址檢測           
  37. #define RX_ADDR_P0      0x0A  // 頻道0接收數據地址
  38. #define RX_ADDR_P1      0x0B  // 頻道1接收數據地址
  39. #define RX_ADDR_P2      0x0C  // 頻道2接收數據地址
  40. #define RX_ADDR_P3      0x0D  // 頻道3接收數據地址
  41. #define RX_ADDR_P4      0x0E  // 頻道4接收數據地址
  42. #define RX_ADDR_P5      0x0F  // 頻道5接收數據地址
  43. #define TX_ADDR         0x10  // 發送地址寄存器
  44. #define RX_PW_P0        0x11  // 接收頻道0接收數據長度
  45. #define RX_PW_P1        0x12  // 接收頻道0接收數據長度
  46. #define RX_PW_P2        0x13  // 接收頻道0接收數據長度
  47. #define RX_PW_P3        0x14  // 接收頻道0接收數據長度
  48. #define RX_PW_P4        0x15  // 接收頻道0接收數據長度
  49. #define RX_PW_P5        0x16  // 接收頻道0接收數據長度
  50. #define FIFO_STATUS     0x17  // FIFO棧入棧出狀態寄存器設置

  51. /*NRF24L01的SPI寫時序*/
  52. uchar SPI_RW(uchar datal)
  53. {
  54.         uchar i;
  55.            for(i=0;i<8;i++)
  56.            {
  57.                 MOSI = (datal & 0x80);         
  58.                 datal = (datal << 1);           
  59.                 SCK = 1;                     
  60.                 datal |= MISO;                        
  61.                 SCK = 0;                              
  62.            }
  63.     return(datal);                             
  64. }



  65. /* 讀數據,reg:為寄存器地址,pBuf:為待讀出數據地址,uchars:讀出數據的個數*/
  66. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  67. {
  68.         uchar status,i;
  69.         CSN=0;                  
  70.         status = SPI_RW(reg);              
  71.         for(i=0;i<uchars;i++)
  72.                 pBuf[i] = SPI_RW(0);  
  73.         CSN=1;                           
  74.         return status;               
  75. }


  76. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  77. {
  78.         uchar status,i;
  79.         CSN=0;            
  80.         status = SPI_RW(reg);   
  81.         for(i=0; i<uchars; i++)
  82.         SPI_RW(*pBuf++);
  83.         CSN=1;         
  84.         return status;
  85. }
  86. uint SPI_RW_Reg(uchar reg, uchar value)
  87. {
  88.         uint status;
  89.        
  90.         CSN = 0;                  
  91.         status = SPI_RW(reg);      
  92.         SPI_RW(value);            
  93.         CSN = 1;                  
  94.        
  95.         return(status);         
  96. }

  97. void init_NRF24L01(void)
  98. {
  99.         CE=0;   
  100.         CSN=1;   
  101.         SCK=0;   
  102.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 寫本地地址       
  103.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
  104.         SPI_RW_Reg(WRITE_REG + EN_AA, 0x3f);      //  頻道0自動        ACK應答允許       
  105.         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x3f);  //  允許接收地址只有頻道0,如果需要多頻道可以參考Page21  
  106.         SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   設置信道工作為2.4GHZ,收發必須一致
  107.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設置接收數據長度,本次設置為20字節
  108.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //設置發射速率為1MHZ,發射功率為最大值0dB       
  109.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收發完成中斷響應,16位CRC,主發送
  110. }
  111. void nRF24L01_TxPacket(uchar * tx_buf)
  112. {
  113.         CE=0;                        //StandBy I模式       
  114.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
  115.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 裝載數據       
  116.         CE=1;                 //置高CE,激發數據發送
  117.         Delay(10);
  118.         SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
  119.        
  120.        
  121. }
  122. /***********************************
  123. //檢測24L01是否存在
  124. //返回值:0:成功    1:失敗       
  125. ***********************************/
  126. uchar NRF24L01_Check(void)
  127. {       
  128.         uchar i;
  129.         uchar buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
  130.         SPI_Write_Buf(WRITE_REG+TX_ADDR,buf,5);//寫入5個字節的地址.       
  131.         SPI_Read_Buf(TX_ADDR,buf,5); //讀出寫入的地址  
  132.         for(i=0;i<5;i++){if(buf[i]!=0XA5)break;}                                                                   
  133.         if(i!=5)return 1;//檢測24L01錯誤       
  134.         return 0;                 //檢測到24L01
  135. }
  136. #endif
復制代碼
下面是遙控主程序:

  1. #include "nrf24l01.h"//無線模塊頭文件

  2. sbit LED  = P1^7;           //LED指示

  3. sbit key1 = P1^0;         //1號
  4. sbit key2 = P1^2;         //2號
  5. sbit key3 = P1^4;         //3號
  6. sbit key4 = P1^6;         //4號

  7. sbit key5 = P1^1;         //5號

  8. void main(void)
  9. {         
  10.         uint count=0;       //計數變量
  11.         uchar TxBuf[12];    //發射緩存數組
  12.           
  13.         //無線模塊檢測函數
  14.         MOSI=0;
  15.         while(NRF24L01_Check())
  16.         {
  17.                 LED=1;
  18.                 Delay(200);
  19.                 LED=0;
  20.                 Delay(200);
  21.     }
  22.         init_NRF24L01();   //無線模塊初始化
  23.         TxBuf[0]=0xFF;
  24.         TxBuf[1]=0x00;
  25.        
  26.                 //TxBuf[2]=0x02;//按鍵值
  27.         TxBuf[3]=0x55;
  28.         TxBuf[4]=0x55;
  29.         TxBuf[5]=0x55;
  30.         TxBuf[6]=0x55;
  31.         TxBuf[7]=0x55;
  32.         TxBuf[8]=0x55;
  33.         TxBuf[9]=0x55;
  34.         TxBuf[10]=0x00;
  35.         TxBuf[11]=0xFF;
  36.         while(1)
  37.         {
  38.                 if(!key1)//
  39.                 {
  40.                         Delay(5);
  41.                         if(!key1)
  42.                         {
  43.                                    LED=0;
  44.                                 TxBuf[2]=0x01;
  45.                         }
  46.                 }
  47.                
  48.                
  49.                 if(!key2)//
  50.                 {
  51.                            Delay(5);
  52.                         if(!key2)
  53.                         {
  54.                                    LED=0;
  55.                                 TxBuf[2]=0x02;
  56.                         }
  57.                 }
  58.                
  59.                
  60.                 if(!key3)//
  61.                 {
  62.                            Delay(5);
  63.                         if(!key3)
  64.                         {
  65.                                    LED=0;
  66.                                 TxBuf[2]=0x03;
  67.                         }
  68.                 }
  69.                
  70.                
  71.                 if(!key4)//
  72.                 {
  73.                            Delay(5);
  74.                         if(!key4)
  75.                         {
  76.                                    LED=0;
  77.                                 TxBuf[2]=0x04;
  78.                         }
  79.                 }
  80.                
  81.                
  82.                 if(!key5)
  83.                 {
  84.                            Delay(5);
  85.                         if(!key5)
  86.                         {
  87.                                    LED=0;
  88.                                 TxBuf[2]=0x05;
  89.                         }
  90.                 }
  91.                
  92.                 if(key1 && key2 && key3 && key4 && key5)//沒有,執行下面指示
  93.                 {
  94.                         count++;if(count>330)count=34;
  95.                         if(count%33==0)
  96.                         {
  97.                                 LED=~LED;      //led取反
  98.                         }
  99.                         TxBuf[2]=0x00;
  100.       TxBuf[0]=0x00;                       
  101.                 }
  102.                 nRF24L01_TxPacket(TxBuf);///無線發射函數
  103.                 Delay(5);
  104.         }
  105. }
復制代碼


                                                                                ------------到接收機了-------------
下面是接收機NRF2401L的驅動程序:
  1. #ifndef NRF24L01_H
  2. #define NRF24L01_H
  3. #include "delay.h"

  4. sbit        IRQ                =P1^0;
  5. sbit         MOSI        =P1^1;
  6. sbit        CSN                =P1^2;

  7. sbit         MISO        =P1^3;
  8. sbit        SCK          =P1^4;
  9. sbit        CE          =P1^5;

  10. /*********NRF24L01*****************/
  11. #define TX_ADR_WIDTH    5          
  12. #define RX_ADR_WIDTH    5          
  13. #define TX_PLOAD_WIDTH  12         
  14. #define RX_PLOAD_WIDTH  12         
  15. uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  16. uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址

  17. /*********NRF24L01寄存器指令*****************/
  18. #define READ_REG        0x00          // 讀寄存器指令
  19. #define WRITE_REG       0x20         // 寫寄存器指令
  20. #define RD_RX_PLOAD     0x61          // 讀取接收數據指令
  21. #define WR_TX_PLOAD     0xA0          // 寫待發數據指令
  22. #define FLUSH_TX        0xE1         // 沖洗發送 FIFO指令
  23. #define FLUSH_RX        0xE2          // 沖洗接收 FIFO指令
  24. #define REUSE_TX_PL     0xE3          // 定義重復裝載數據指令
  25. #define NOP             0xFF          // 保留

  26. /*********nRF24L01寄存器地址*****************/
  27. #define CONFIG          0x00  // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
  28. #define EN_AA           0x01  // 自動應答功能設置
  29. #define EN_RXADDR       0x02  // 可用信道設置
  30. #define SETUP_AW        0x03  // 收發地址寬度設置
  31. #define SETUP_RETR      0x04  // 自動重發功能設置
  32. #define RF_CH           0x05  // 工作頻率設置
  33. #define RF_SETUP        0x06  // 發射速率、功耗功能設置
  34. #define STATUS          0x07  // 狀態寄存器
  35. #define OBSERVE_TX      0x08  // 發送監測功能
  36. #define CD              0x09  // 地址檢測           
  37. #define RX_ADDR_P0      0x0A  // 頻道0接收數據地址
  38. #define RX_ADDR_P1      0x0B  // 頻道1接收數據地址
  39. #define RX_ADDR_P2      0x0C  // 頻道2接收數據地址
  40. #define RX_ADDR_P3      0x0D  // 頻道3接收數據地址
  41. #define RX_ADDR_P4      0x0E  // 頻道4接收數據地址
  42. #define RX_ADDR_P5      0x0F  // 頻道5接收數據地址
  43. #define TX_ADDR         0x10  // 發送地址寄存器
  44. #define RX_PW_P0        0x11  // 接收頻道0接收數據長度
  45. #define RX_PW_P1        0x12  // 接收頻道0接收數據長度
  46. #define RX_PW_P2        0x13  // 接收頻道0接收數據長度
  47. #define RX_PW_P3        0x14  // 接收頻道0接收數據長度
  48. #define RX_PW_P4        0x15  // 接收頻道0接收數據長度
  49. #define RX_PW_P5        0x16  // 接收頻道0接收數據長度
  50. #define FIFO_STATUS     0x17  // FIFO棧入棧出狀態寄存器設置


  51. uchar SPI_RW(uchar datal)
  52. {
  53.         uchar i;
  54.            for(i=0;i<8;i++)
  55.            {
  56.                 MOSI = (datal & 0x80);         
  57.                 datal = (datal << 1);           
  58.                 SCK = 1;                     
  59.                 datal |= MISO;                        
  60.                 SCK = 0;                              
  61.            }
  62.     return(datal);                             
  63. }


  64. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  65. {
  66.         uchar status,i;
  67.         CSN=0;                  
  68.         status = SPI_RW(reg);              
  69.         for(i=0;i<uchars;i++)
  70.                 pBuf[i] = SPI_RW(0);  
  71.         CSN=1;                           
  72.         return status;               
  73. }


  74. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  75. {
  76.         uchar status,i;
  77.         CSN=0;            
  78.         status = SPI_RW(reg);   
  79.         for(i=0; i<uchars; i++)
  80.         SPI_RW(*pBuf++);
  81.         CSN=1;         
  82.         return status;
  83. }
  84. uint SPI_RW_Reg(uchar reg, uchar value)
  85. {
  86.         uint status;
  87.        
  88.         CSN = 0;                  
  89.         status = SPI_RW(reg);      
  90.         SPI_RW(value);            
  91.         CSN = 1;                  
  92.        
  93.         return(status);            
  94. }
  95. /* NRF24L01的SPI讀時序   */
  96. uchar SPI_Read(uchar reg)
  97. {
  98.         uchar reg_val;
  99.         CSN=0;                  // CSN low, initialize SPI communication...
  100.         SPI_RW(reg);            // Select register to read from..
  101.         reg_val = SPI_RW(0);    // ..then read registervalue
  102.         CSN=1;                  // CSN high, terminate SPI communication
  103.         return(reg_val);        // return register value
  104. }


  105. void SetRX_Mode(void)
  106. {
  107.         CE=0;
  108.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收發完成中斷響應,16位CRC        ,主接收
  109.         CE=1;
  110.         Delay(1);                                  //注意不能太小
  111. }
  112. /*:數據讀取后放如rx_buf接收緩沖區中    */
  113. uchar nRF24L01_RxPacket(uchar* rx_buf)
  114. {
  115.         uchar  sta;
  116.         sta=SPI_Read(STATUS);             // 讀取狀態寄存器來判斷數據接收狀況               
  117.         SPI_RW_Reg(WRITE_REG+STATUS,sta);   //清除TX_DS或MAX_RT中斷標志
  118.         if(sta&0x40)                 //接收到數據
  119.         {
  120.             //Low_24L01_CE;                         //SPI使能
  121.                 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//讀取數據
  122.                 //SPI_RW_Reg(WRITE_REG+STATUS,0xff);//清除RX FIFO寄存器
  123.                 return 1;                       
  124.         }
  125.         return 0;
  126. }

  127. //接收模式設置,F接收頻率設置,應與發射頻率對應
  128. void init_NRF24L01(void)
  129. {                                                                                                                 
  130.         CE=0;    // chip enable
  131.         CSN=1;   // Spi disable
  132.         SCK=0;   // Spi clock line init high                    
  133.           SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);//寫TX節點地址
  134.           SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //設置TX節點地址,主要為了使能ACK          
  135.           SPI_RW_Reg(WRITE_REG+EN_AA,0x3f);     //使能通道0的自動應答   
  136.           SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x3f); //使能通道0的接收地址  
  137.           SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x1a);//設置自動重發間隔時間:500us + 86us;最大自動重發次數:10次
  138.           SPI_RW_Reg(WRITE_REG+RF_CH,0);        //設置RF通道為40
  139.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);//設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟
  140.           SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
  141.         SPI_RW_Reg(WRITE_REG+CONFIG,0x7e);    //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
  142.         CE=1;    // chip enable
  143.     Delay(50);
  144. }

  145. //檢測24L01是否存在
  146. //返回值:0:成功    1:失敗       
  147. uchar NRF24L01_Check(void)
  148. {       
  149.         uchar i;
  150.         uchar buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
  151.         SPI_Write_Buf(WRITE_REG+TX_ADDR,buf,5);//寫入5個字節的地址.       
  152.         SPI_Read_Buf(TX_ADDR,buf,5); //讀出寫入的地址  
  153.         for(i=0;i<5;i++){if(buf[i]!=0XA5)break;}                                                                   
  154.         if(i!=5)return 1;//檢測24L01錯誤       
  155.         return 0;                 //檢測到24L01
  156. }
  157. #endif
復制代碼
下面是接收機主函數:
  1. #include "nrf24l01.h"  //NRF24L01頭文件

  2. sbit QJ  = P2^4;
  3. sbit HT  = P2^7;
  4. sbit Z  = P2^2;
  5. sbit Y  = P2^3;

  6. sbit LED01 = P0^1;

  7. sbit LED  = P2^0;
  8. sbit KEY   = P3^7;           //確認按鍵


  9. void main(void)
  10. {
  11.        
  12.         uchar flagNo1=0;
  13.         uchar RxBuf[12];    //接收緩存數組
  14.         //無線模塊檢測
  15.         while(NRF24L01_Check())
  16.         {
  17.                 LED=0;
  18.                 Delay(500);
  19.                 LED=1;
  20.                 Delay(500);
  21.     }
  22.         init_NRF24L01();//無線模塊初始化
  23.                
  24.                
  25.         while(1)
  26.         {
  27.                 nRF24L01_RxPacket(RxBuf);//接收從機數據
  28.                 SetRX_Mode();//配置為接收模塊
  29.                 //判斷
  30.                
  31.                         if(RxBuf[2]==0x01)
  32.                         {  QJ=0;}               
  33.                            else {QJ=1;}
  34.                                  
  35.                         if(RxBuf[2]==0x02)
  36.                         {  HT=0; }               
  37.                            else {HT=1;}
  38.                
  39.                         /*   此處省略一部分     */
  40.        
  41.                                  //確認處理
  42.                 if(!KEY)
  43.                 {
  44.                         LED=1;//關閉蜂鳴器
  45.                 }
  46.         }
  47. }
復制代碼






回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区免费 | 成人精品免费视频 | 9色视频在线 | 欧美在线国产精品 | 日日噜噜噜夜夜爽爽狠狠视频, | 欧美成人精品一区二区男人看 | 久综合| 久久久久国产精品免费免费搜索 | 日韩视频在线观看中文字幕 | 国产精品免费一区二区三区四区 | 国产96色在线 | 久久久久亚洲精品 | 91福利电影在线观看 | www.4虎影院 国产999精品久久久影片官网 | 久久综合一区 | h片在线看| 欧美一区不卡 | tube国产 | 欧美日韩在线一区二区三区 | 日本成人片在线观看 | 国产午夜精品一区二区三区嫩草 | 国产一区二区三区精品久久久 | 精品一二三| 亚洲精品自拍 | 国产极品车模吞精高潮呻吟 | 日日干夜夜操 | 福利二区 | 黄网站涩免费蜜桃网站 | 欧美一区二区视频 | 啪啪免费 | 午夜在线视频一区二区三区 | 成人精品啪啪欧美成 | 日韩精品一区二区三区中文在线 | 欧美中文字幕一区二区三区 | 伊人在线视频 | 欧美极品视频在线观看 | 国产美女在线精品免费 | 国产精品毛片一区二区在线看 | 亚洲一区不卡 | 99精品在线免费观看 | 91麻豆精品一区二区三区 |