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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2566|回復: 3
收起左側

RF24C01在STC15系列單片機中的相互通訊程序

[復制鏈接]
ID:459370 發表于 2019-2-19 15:20 | 顯示全部樓層 |閱讀模式
為了單片機之間的通訊,我做了這個程序分為收端和發端,在發送時可以改變信道來分別控制幾個單片機,所有收端的信道都可設計在一個信道,反正自己玩時多改變一下就可以試出好多功能來。
  1. /*---------------
  2. 發送端主函數
  3. --------------*/

  4. #include<reg51.h>
  5. #include"2401.h"

  6. #define uint unsigned int
  7. #define uchar unsigned char

  8. sbit KEY1=P1^0;                     //發送按鍵
  9. sbit KEY2=P1^1;
  10. sbit KEY3=P1^2;
  11. sbit KEY4=P1^3;
  12. sbit beep=P3^3;                     
  13. sbit LED6=P3^5;                     //發送數據時顯示燈+接收到數據后的功能實現燈
  14. sbit LED5 = P0^1;
  15. sbit LED4 = P3^4;                //繼電器

  16. /*---------------
  17.     延時函數
  18. ------------------*/

  19. void delay_ms(uint z)         
  20. {
  21.     uint y;
  22.     while(z--)
  23.         for(y=110;y>0;y--);
  24. }


  25. /*---------------
  26.     主函數
  27. ------------------*/

  28. void main()
  29. {
  30.      uchar Tx_Buf1[]={1};    //發送的信息1
  31.      uchar Rx_Buf[32];      //接收到的數據暫存器,最多32字節數據  
  32.      init_NRF24L01();        //初始化
  33.      LED6=1;                //初始燈6熄滅   

  34.     while(NRF24L01_Check())                    //檢查不到24l01則報警
  35.     {
  36.         beep=0;
  37.         delay_ms(200);
  38.         beep=1;
  39.         delay_ms(200);
  40.     }
  41.     while(1)
  42.     {   
  43.    
  44.         RX_Mode();
  45.         {                  //接收模式
  46.         if(Rx_Buf[0]==1)                               //若接收到對應的數據則實現對應功能
  47.              {
  48.                  Rx_Buf[0]=0;                //清空數據
  49.                  LED5 = ~LED5;
  50.         
  51.                }
  52.          }
  53.         
  54.    
  55.                            
  56.         while(!nRF24L01_RxPacket(Rx_Buf))     //等待接收數據,返回1則接收到數據,在等待接收數據期間,可以隨時變成發送模式  
  57.         {
  58.             if(KEY1==0)                         //按了按鍵1,則變成發送模式,發送對應數據,發送完后變成接收模式
  59.             {   
  60.                 delay_ms(5);//消抖動
  61.                 if(KEY1==0)
  62.                 {
  63.                      while(!KEY1);
  64.                     TX_Mode();                         //發送模式
  65. //                    SPI_WR_Reg(WRITE_REG + EN_RXADDR,1);
  66.                     SPI_WR_Reg(WRITE_REG + RF_CH, 20);    //經我自已修改了發送頻道后,只有頻道1能接收,在2401.H里去掉了此句話
  67.                      
  68.                     CE = 1;
  69.                     Tx_Buf1[0]=1;                    //將1發送過去
  70.                     nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據
  71.                     LED6=0;
  72.                     delay_ms(300);
  73.                     LED6=1;
  74.                     delay_ms(300);                    //發送后LED1閃一下
  75.                     break;                            //退出最近的循環,從而變回接收模式,這句關鍵
  76.                  }   
  77.              }
  78.              else if(KEY2==0)                     
  79.              {   
  80.                 delay_ms(5);//消抖動
  81.                 if(KEY2==0)
  82.                 {
  83.                      while(!KEY2);
  84.                     TX_Mode();                         //發送模式
  85.                     SPI_WR_Reg(WRITE_REG + RF_CH, 40);    //經我自已修改了發送頻道后,只有頻道1能接收,在2401.H里去掉了此句話
  86.                      
  87.                     CE = 1;
  88.                     Tx_Buf1[0]=2;                    //將2發送過去
  89.                     nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據
  90.                     LED6=0;
  91.                     delay_ms(300);
  92.                     LED6=1;
  93.                     delay_ms(300);                    
  94.                     break;                            //退出最近的循環,從而變回接收模式,這句關鍵
  95.                  }   
  96.               }
  97.               else if(KEY3==0)                        
  98.               {   
  99.                 delay_ms(5);//消抖動
  100.                 if(KEY3==0)
  101.                 {
  102.                      while(!KEY3);
  103.                     TX_Mode();                         //發送模式
  104.                     SPI_WR_Reg(WRITE_REG + RF_CH, 60);    //經我自已修改了發送頻道后,只有頻道1能接收,在2401.H里去掉了此句話
  105.                      
  106.                     CE = 1;
  107.                     Tx_Buf1[0]=3;                    //將3發送過去
  108.                     nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據
  109.                     LED6=0;
  110.                     delay_ms(300);
  111.                     LED6=1;
  112.                     delay_ms(300);                    
  113.                     break;                            //退出最近的循環,從而變回接收模式,這句關鍵
  114.                  }   
  115.               }
  116.               else if(KEY4==0)                         //按了按鍵8,則變成發送模式,發送對應數據,發送完后變成接收模式
  117.               {   
  118.                 delay_ms(5);//消抖動
  119.                 if(KEY4==0)
  120.                 {
  121.                      while(!KEY4);
  122.                     TX_Mode();                         //發送模式
  123.                     SPI_WR_Reg(WRITE_REG + RF_CH, 80);    //經我自已修改了發送頻道后,只有頻道1能接收,在2401.H里去掉了此句話
  124.                      
  125.                     CE = 1;
  126.                     Tx_Buf1[0]=4;                    //將4發送過去
  127.                     nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據
  128.                     LED6=0;
  129.                     delay_ms(300);
  130.                     LED6=1;
  131.                     delay_ms(300);                    
  132.                     break;                            //退出最近的循環,從而變回接收模式,這句關鍵
  133.                  }   
  134.               }
  135.          }
  136.          if(Rx_Buf[0]==1)                               //若接收到對應的數據則實現對應功能
  137.          {
  138.              Rx_Buf[0]=0;                //清空數據
  139.     //         beep = ~beep;

  140.              //LED5 = ~LED5;
  141.              LED4=0;
  142.               delay_ms(5300);
  143.               LED4=1;
  144.               delay_ms(5300);                //接收到數據 后閃爍      
  145.          }
  146.          else if(Rx_Buf[0]==2)
  147.          {
  148.              Rx_Buf[0] = 0;
  149.             LED5 = ~LED5;
  150.          }
  151.     }
  152. }
  153. /*---------------
  154. 發送端
  155. --------------*/

  156. #include<reg51.h>
  157. #include"2401.h"

  158. #define uint unsigned int
  159. #define uchar unsigned char

  160. sbit KEY1=P1^0;                     //發送按鍵
  161. sbit KEY2=P1^1;
  162. sbit KEY3=P1^2;
  163. sbit KEY4=P1^3;
  164. sbit beep=P3^3;                     
  165. sbit LED6=P3^5;                     //發送數據時顯示燈+接收到數據后的功能實現燈
  166. sbit LED5 = P0^1;
  167. sbit LED4 = P3^4;                //繼電器

  168. /*---------------
  169.     延時函數
  170. ------------------*/

  171. void delay_ms(uint z)         
  172. {
  173.     uint y;
  174.     while(z--)
  175.         for(y=110;y>0;y--);
  176. }


  177. /*---------------
  178.     主函數
  179. ------------------*/

  180. void main()
  181. {
  182.      uchar Tx_Buf1[]={1};    //發送的信息1
  183.      uchar Rx_Buf[32];      //接收到的數據暫存器,最多32字節數據  
  184.      init_NRF24L01();        //初始化
  185.      LED6=1;                //初始燈6熄滅   

  186.     while(NRF24L01_Check())                    //檢查不到24l01則報警
  187.     {
  188.         beep=0;
  189.         delay_ms(200);
  190.         beep=1;
  191.         delay_ms(200);
  192.     }
  193.     while(1)
  194.     {   
  195.    
  196.         RX_Mode();
  197.         {                  //接收模式
  198.         if(Rx_Buf[0]==1)                               //若接收到對應的數據則實現對應功能
  199.              {
  200.                  Rx_Buf[0]=0;                //清空數據
  201.                  LED5 = ~LED5;
  202.         
  203.                }
  204.          }
  205.         
  206.    
  207.                            
  208.         while(!nRF24L01_RxPacket(Rx_Buf))     //等待接收數據,返回1則接收到數據,在等待接收數據期間,可以隨時變成發送模式  
  209.         {
  210.             if(KEY1==0)                         //按了按鍵1,則變成發送模式,發送對應數據,發送完后變成接收模式
  211.             {   
  212.                 delay_ms(5);//消抖動
  213.                 if(KEY1==0)
  214.                 {
  215.                      while(!KEY1);
  216.                     TX_Mode();                         //發送模式
  217. //                    SPI_WR_Reg(WRITE_REG + EN_RXADDR,1);
  218.                     SPI_WR_Reg(WRITE_REG + RF_CH, 20);    //經我自已修改了發送頻道后,只有頻道1能接收,在2401.H里去掉了此句話
  219.                      
  220.                     CE = 1;
  221.                     Tx_Buf1[0]=1;                    //將1發送過去
  222.                     nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據
  223.                     LED6=0;
  224.                     delay_ms(300);
  225.                     LED6=1;
  226.                     delay_ms(300);                    //發送后LED1閃一下
  227.                     break;                            //退出最近的循環,從而變回接收模式,這句關鍵
  228.                  }   
  229.              }
  230.              else if(KEY2==0)                     
  231.              {   
  232.                 delay_ms(5);//消抖動
  233.                 if(KEY2==0)
  234.                 {
  235.                      while(!KEY2);
  236.                     TX_Mode();                         //發送模式
  237.                     SPI_WR_Reg(WRITE_REG + RF_CH, 40);    //經我自已修改了發送頻道后,只有頻道1能接收,在2401.H里去掉了此句話
  238.                      
  239.                     CE = 1;
  240.                     Tx_Buf1[0]=2;                    //將2發送過去
  241.                     nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據
  242.                     LED6=0;
  243.                     delay_ms(300);
  244.                     LED6=1;
  245.                     delay_ms(300);                    
  246.                     break;                            //退出最近的循環,從而變回接收模式,這句關鍵
  247.                  }   
  248.               }
  249.               else if(KEY3==0)                        
  250.               {   
  251.                 delay_ms(5);//消抖動
  252.                 if(KEY3==0)
  253.                 {
  254.                      while(!KEY3);
  255.                     TX_Mode();                         //發送模式
  256.                     SPI_WR_Reg(WRITE_REG + RF_CH, 60);    //經我自已修改了發送頻道后,只有頻道1能接收,在2401.H里去掉了此句話
  257.                      
  258.                     CE = 1;
  259.                     Tx_Buf1[0]=3;                    //將3發送過去
  260.                     nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據
  261.                     LED6=0;
  262.                     delay_ms(300);
  263.                     LED6=1;
  264.                     delay_ms(300);                    
  265.                     break;                            //退出最近的循環,從而變回接收模式,這句關鍵
  266.                  }   
  267.               }
  268.               else if(KEY4==0)                         //按了按鍵8,則變成發送模式,發送對應數據,發送完后變成接收模式
  269.               {   
  270.                 delay_ms(5);//消抖動
  271.                 if(KEY4==0)
  272.                 {
  273.                      while(!KEY4);
  274.                     TX_Mode();                         //發送模式
  275.                     SPI_WR_Reg(WRITE_REG + RF_CH, 80);    //經我自已修改了發送頻道后,只有頻道1能接收,在2401.H里去掉了此句話
  276.                      
  277.                     CE = 1;
  278.                     Tx_Buf1[0]=4;                    //將4發送過去
  279.                     nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據
  280.                     LED6=0;
  281.                     delay_ms(300);
  282.                     LED6=1;
  283.                     delay_ms(300);                    
  284.                     break;                            //退出最近的循環,從而變回接收模式,這句關鍵
  285.                  }   
  286.               }
  287.          }
  288.          if(Rx_Buf[0]==1)                               //若接收到對應的數據則實現對應功能
  289.          {
  290.              Rx_Buf[0]=0;                //清空數據
  291.     //         beep = ~beep;

  292.              //LED5 = ~LED5;
  293.              LED4=0;
  294.               delay_ms(5300);
  295.               LED4=1;
  296.               delay_ms(5300);                //接收到數據 后閃爍      
  297.          }
  298.          else if(Rx_Buf[0]==2)
  299.          {
  300.              Rx_Buf[0] = 0;
  301.             LED5 = ~LED5;
  302.          }
  303.     }
  304. }
  305. /*---------------
  306. 發送端
  307. --------------*/

  308. #include<reg51.h>
  309. #include"2401.h"

  310. #define uint unsigned int
  311. #define uchar unsigned char

  312. sbit KEY1=P1^0;                     //發送按鍵
  313. sbit KEY2=P1^1;
  314. sbit KEY3=P1^2;
  315. sbit KEY4=P1^3;
  316. sbit beep=P3^3;                     
  317. sbit LED6=P3^5;                     //發送數據時顯示燈+接收到數據后的功能實現燈
  318. sbit LED5 = P0^1;
  319. sbit LED4 = P3^4;                //繼電器

  320. /*---------------
  321.     延時函數
  322. ------------------*/

  323. void delay_ms(uint z)         
  324. {
  325.     uint y;
  326.     while(z--)
  327.         for(y=110;y>0;y--);
  328. }


  329. /*---------------
  330.     主函數
  331. ------------------*/

  332. void main()
  333. {
  334.      uchar Tx_Buf1[]={1};    //發送的信息1
  335.      uchar Rx_Buf[32];      //接收到的數據暫存器,最多32字節數據  
  336.      init_NRF24L01();        //初始化
  337.      LED6=1;                //初始燈6熄滅   

  338.     while(NRF24L01_Check())                    //檢查不到24l01則報警
  339.     {
  340.         beep=0;
  341.         delay_ms(200);
  342.         beep=1;
  343.         delay_ms(200);
  344.     }
  345.     while(1)
  346.     {   
  347.    
  348.         RX_Mode();
  349.         {                  //接收模式
  350.         if(Rx_Buf[0]==1)                               //若接收到對應的數據則實現對應功能
  351.              {
  352.                  Rx_Buf[0]=0;                //清空數據
  353.                  LED5 = ~LED5;
  354.         
  355.                }
  356.          }
  357.         
  358.    
  359.                            
  360.         while(!nRF24L01_RxPacket(Rx_Buf))     //等待接收數據,返回1則接收到數據,在等待接收數據期間,可以隨時變成發送模式  
  361.         {
  362.             if(KEY1==0)                         //按了按鍵1,則變成發送模式,發送對應數據,發送完后變成接收模式
  363.             {   
  364.                 delay_ms(5);//消抖動
  365.                 if(KEY1==0)
  366.                 {
  367.                      while(!KEY1);
  368.                     TX_Mode();                         //發送模式
  369. //                    SPI_WR_Reg(WRITE_REG + EN_RXADDR,1);
  370.                     SPI_WR_Reg(WRITE_REG + RF_CH, 20);    //經我自已修改了發送頻道后,只有頻道1能接收,在2401.H里去掉了此句話
  371.                      
  372.                     CE = 1;
  373.                     Tx_Buf1[0]=1;                    //將1發送過去
  374.                     nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據
  375.                     LED6=0;
  376.                     delay_ms(300);
  377.                     LED6=1;
  378.                     delay_ms(300);                    //發送后LED1閃一下
  379.                     break;                            //退出最近的循環,從而變回接收模式,這句關鍵
  380.                  }   
  381.              }
  382.              else if(KEY2==0)                     
  383.              {   
  384.                 delay_ms(5);//消抖動
  385.                 if(KEY2==0)
  386.                 {
  387.                      while(!KEY2);
  388.                     TX_Mode();                         //發送模式
  389.                     SPI_WR_Reg(WRITE_REG + RF_CH, 40);    //經我自已修改了發送頻道后,只有頻道1能接收,在2401.H里去掉了此句話
  390.                      
  391.                     CE = 1;
  392.                     Tx_Buf1[0]=2;                    //將2發送過去
  393.                     nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據
  394.                     LED6=0;
  395.                     delay_ms(300);
  396.                     LED6=1;
  397.                     delay_ms(300);                    
  398.                     break;                            //退出最近的循環,從而變回接收模式,這句關鍵
  399.                  }   
  400.               }
  401.               else if(KEY3==0)                        
  402.               {   
  403.                 delay_ms(5);//消抖動
  404.                 if(KEY3==0)
  405.                 {
  406.                      while(!KEY3);
  407.                     TX_Mode();                         //發送模式
  408.                     SPI_WR_Reg(WRITE_REG + RF_CH, 60);    //經我自已修改了發送頻道后,只有頻道1能接收,在2401.H里去掉了此句話
  409.                      
  410.                     CE = 1;
  411.                     Tx_Buf1[0]=3;                    //將3發送過去
  412.                     nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據
  413.                     LED6=0;
  414.                     delay_ms(300);
  415.                     LED6=1;
  416.                     delay_ms(300);                    
  417.                     break;                            //退出最近的循環,從而變回接收模式,這句關鍵
  418.                  }   
  419.               }
  420.               else if(KEY4==0)                         //按了按鍵8,則變成發送模式,發送對應數據,發送完后變成接收模式
  421.               {   
  422.                 delay_ms(5);//消抖動
  423.                 if(KEY4==0)
  424.                 {
  425.                      while(!KEY4);
  426.                     TX_Mode();                         //發送模式
  427.                     SPI_WR_Reg(WRITE_REG + RF_CH, 80);    //經我自已修改了發送頻道后,只有頻道1能接收,在2401.H里去掉了此句話
  428.                      
  429.                     CE = 1;
  430.                     Tx_Buf1[0]=4;                    //將4發送過去
  431.                     nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據
  432.                     LED6=0;
  433.                     delay_ms(300);
  434.                     LED6=1;
  435.                     delay_ms(300);                    
  436.                     break;                            //退出最近的循環,從而變回接收模式,這句關鍵
  437.                  }   
  438.               }
  439.          }
  440.          if(Rx_Buf[0]==1)                               //若接收到對應的數據則實現對應功能
  441.          {
  442.              Rx_Buf[0]=0;                //清空數據
  443.     //         beep = ~beep;

  444.              //LED5 = ~LED5;
  445.              LED4=0;
  446.               delay_ms(5300);
  447.               LED4=1;
  448.               delay_ms(5300);                //接收到數據 后閃爍      
  449.          }
  450.          else if(Rx_Buf[0]==2)
  451.          {
  452.              Rx_Buf[0] = 0;
  453.             LED5 = ~LED5;
  454.          }
  455.     }
  456. }

  457. /*配置文件*/

  458. #ifndef __NRF24L01_H__
  459. #define __NRF24L01_H__
  460. #include<reg51.h>
  461. #define uchar unsigned char
  462. #define uint unsigned int
  463. sfr P5 = 0xC8;
  464. sbit    CE        =P5^5;
  465. sbit    CSN        =P2^4;
  466. sbit    SCK        =P2^1;
  467. sbit     MOSI    =P2^3;
  468. sbit     MISO    =P2^2;
  469. sbit    IRQ        =P3^2;


  470. #define TX_ADR_WIDTH    5       // 5 uints TX address width
  471. #define RX_ADR_WIDTH    5       // 5 uints RX address width
  472. #define TX_PLOAD_WIDTH  32      // 32 uints TX payload
  473. #define RX_PLOAD_WIDTH  32      // 32 uints TX payload
  474. uchar  TX_ADDRESS[TX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7};    //本地地址
  475. uchar  RX_ADDRESS[RX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7};    //接收地址


  476. /************************************
  477.         NRF24L01寄存器指令
  478. ************************************/

  479. #define READ_REG        0x00      // 讀寄存器指令
  480. #define WRITE_REG       0x20     // 寫寄存器指令
  481. #define RD_RX_PLOAD     0x61      // 讀取接收數據指令
  482. #define WR_TX_PLOAD     0xA0      // 寫待發數據指令
  483. #define FLUSH_TX        0xE1     // 沖洗發送 FIFO指令
  484. #define FLUSH_RX        0xE2      // 沖洗接收 FIFO指令
  485. #define REUSE_TX_PL     0xE3      // 定義重復裝載數據指令
  486. #define NOP             0xFF      // 保留


  487. /*************************************
  488.      SPI(nRF24L01)寄存器地址
  489. *************************************/

  490. #define CONFIG          0x00  // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
  491. #define EN_AA           0x01  // 自動應答功能設置
  492. #define EN_RXADDR       0x02  // 可用信道設置
  493. #define SETUP_AW        0x03  // 收發地址寬度設置
  494. #define SETUP_RETR      0x04  // 自動重發功能設置
  495. #define RF_CH           0x05  // 工作頻率設置
  496. #define RF_SETUP        0x06  // 發射速率、功耗功能設置
  497. #define NRFRegSTATUS    0x07  // 狀態寄存器
  498. #define OBSERVE_TX      0x08  // 發送監測功能
  499. #define CD              0x09  // 地址檢測           
  500. #define RX_ADDR_P0      0x0A  // 頻道0接收數據地址
  501. #define RX_ADDR_P1      0x0B  // 頻道1接收數據地址
  502. #define RX_ADDR_P2      0x0C  // 頻道2接收數據地址
  503. #define RX_ADDR_P3      0x0D  // 頻道3接收數據地址
  504. #define RX_ADDR_P4      0x0E  // 頻道4接收數據地址
  505. #define RX_ADDR_P5      0x0F  // 頻道5接收數據地址
  506. #define TX_ADDR         0x10  // 發送地址寄存器
  507. #define RX_PW_P0        0x11  // 接收頻道0接收數據長度
  508. #define RX_PW_P1        0x12  // 接收頻道1接收數據長度
  509. #define RX_PW_P2        0x13  // 接收頻道2接收數據長度
  510. #define RX_PW_P3        0x14  // 接收頻道3接收數據長度
  511. #define RX_PW_P4        0x15  // 接收頻道4接收數據長度
  512. #define RX_PW_P5        0x16  // 接收頻道5接收數據長度
  513. #define FIFO_STATUS     0x17  // FIFO棧入棧出狀態寄存器設置


  514. /*---------------------------------
  515.            子函數集
  516. ---------------------------------*/

  517. uchar NRF24SPI_Send_Byte(uchar dat);
  518. uchar SPI_WR_Reg(uchar reg, uchar value);
  519. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len);
  520. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len);
  521. uchar nRF24L01_RxPacket(unsigned char* rx_buf);
  522. void nRF24L01_TxPacket(unsigned char * tx_buf);
  523. uchar SPI_RD_Reg(uchar reg);
  524. void init_NRF24L01(void);
  525. void TX_Mode(void);
  526. void RX_Mode(void);
  527. void NRF_Send(void);
  528. uchar NRF24L01_Check(void);


  529. /*----------------------------------------------
  530.         發送一字節[MOSI和MISO數據傳遞]
  531. ----------------------------------------------*/

  532. uchar NRF24SPI_Send_Byte(uchar dat)
  533. {
  534.       uchar i;
  535.     for (i = 0; i < 8; i++) //output 8-bit
  536.     {
  537.         //寫入1位數據
  538.         MOSI=(dat & 0x80);    //output 'uchar', MSB to MOSI
  539.         dat<<= 1;           // shift next bit into MSB..
  540.         
  541.         //讀取1位數據
  542.         SCK = 1;                       // Set SCK high..
  543.         if (MISO){
  544.              dat|= 1;
  545.         }else{                         // capture current MISO bit
  546.              dat &= 0xFE;
  547.         }
  548.         SCK = 0;                    // ..then set SCK low again
  549.     }
  550.     return(dat);                    // return read uchar
  551. }
  552. //----------------------------------------------
  553. //延時n個10us
  554. //----------------------------------------------
  555. void Delay_n10us(uint n)   
  556. {
  557.    for(;n>0;n--)
  558.    {
  559.         unsigned char a,b;
  560.      for(b=1;b>0;b--)
  561.          for(a=2;a>0;a--);
  562.    }
  563. }


  564. /*----------------------------------------------
  565.               NRF24L01檢測是否存在
  566. ----------------------------------------------*/

  567. uchar NRF24L01_Check(void)
  568. {
  569.     uchar bu[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
  570.     uchar bu1[5];
  571.     uchar i;        
  572.     SPI_Write_Buf(WRITE_REG+TX_ADDR,bu,5);      //寫入5個字節的地址.   
  573.     SPI_Read_Buf(TX_ADDR,bu1,5);              //讀出寫入的地址      
  574.     for(i=0;i<5;i++)if(bu1!=0XA5)break;                       
  575.     if(i!=5)return 1;                               //NRF24L01不在位   
  576.     return 0;                                        //NRF24L01在位
  577. }   


  578. /*----------------------------------------------
  579.             NRF24L01初始化
  580. ----------------------------------------------*/      

  581. void init_NRF24L01(void)
  582. {
  583.     uchar buf[5]={0};
  584.     Delay_n10us(10);
  585.     CE = 0;            // chip enable
  586.     CSN= 0;            // Spi disable
  587.    
  588.     SPI_Read_Buf(TX_ADDR, buf, TX_ADR_WIDTH);//debug 測試原來的本地地址:復位值是:0xE7 0xE7 0xE7 0xE7 0xE7
  589.   
  590. //    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 寫本地地址   
  591. //    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址

  592. //   
  593. //    SPI_WR_Reg(WRITE_REG + EN_AA, 0x01);      //  頻道0自動    ACK應答允許   
  594. //    SPI_WR_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允許接收地址只有頻道0,如果需要多頻道可以參考Page21  
  595. //    SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 設置自動重發時間和次數:500us + 86us, 10 retrans...
  596. //    SPI_WR_Reg(WRITE_REG + RF_CH, 22);        //   設置信道工作為2.4GHZ,收發必須一致
  597. //    SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設置接收數據長度,本次設置為32字節
  598. //    SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x07);           //設置發射速率為1MHZ,發射功率為最大值0dB
  599. //  
  600. //  SPI_RD_Reg(WRITE_REG + EN_AA);
  601. //  SPI_RD_Reg(WRITE_REG + EN_RXADDR);
  602. //  SPI_RD_Reg(WRITE_REG + RF_CH);
  603. //  SPI_RD_Reg(WRITE_REG + RX_PW_P0);
  604. //  SPI_RD_Reg(WRITE_REG + RF_SETUP);
  605. }


  606. /*----------------------------------------------
  607.   函數:uchar SPI_Read(uchar reg)
  608.   功能:NRF24L01的SPI時序,讀取指定寄存器的內容
  609. ----------------------------------------------*/

  610. uchar SPI_RD_Reg(uchar reg)
  611. {
  612.     uchar reg_val;
  613.     CSN = 0;                            // CSN low, initialize SPI communication...
  614.     NRF24SPI_Send_Byte(reg);            // Select register to read from..
  615.     reg_val = NRF24SPI_Send_Byte(0);    // ..then read registervalue
  616.     CSN = 1;                            // CSN high, terminate SPI communication   
  617.     return(reg_val);                    // return register value
  618. }


  619. /*----------------------------------------------
  620.      函數:uchar SPI_Write(uchar reg)
  621.      功能:NRF24L01的SPI時序,寫入指定寄存器的內容
  622. ----------------------------------------------*/

  623. uchar SPI_WR_Reg(uchar reg, uchar value)
  624. {
  625.     uchar status;
  626.     CSN = 0;                               // CSN low, init SPI transaction
  627.     status = NRF24SPI_Send_Byte(reg);    // select register
  628.     NRF24SPI_Send_Byte(value);          // ..and write value to it..
  629.     CSN = 1;                               // CSN high again
  630.     return(status);                        // return nRF24L01 status uchar
  631. }


  632. /*----------------------------------------------
  633.   函數:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len)
  634.   功能: 用于讀數據
  635.   參數:reg:為寄存器地址
  636.   pBuf:為待讀出數據地址
  637.   uchars:讀出數據的個數
  638. ----------------------------------------------*/

  639. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len)
  640. {
  641.     uint status,i;
  642.     CSN = 0;                            // Set CSN low, init SPI tranaction
  643.     status = NRF24SPI_Send_Byte(reg);   // Select register to write to and read status uchar
  644.     for(i=0;i<Len;i++){
  645.          pBuf = NRF24SPI_Send_Byte(0);
  646.     }
  647.     CSN = 1;                          
  648.     return(status);                        // return nRF24L01 status uchar
  649. }


  650. /*----------------------------------------------
  651. 函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len)
  652. 功能: 用于寫數據
  653. 參數:reg:為寄存器地址
  654. pBuf:為待寫入數據地址
  655. uchars:寫入數據的個數
  656. ----------------------------------------------*/

  657. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len)
  658. {
  659.     uint status,i;
  660.     CSN = 0;                            //SPI使能      
  661.     status = NRF24SPI_Send_Byte(reg);   
  662.     for(i=0; i<Len; i++){
  663.        NRF24SPI_Send_Byte(*pBuf);
  664.          pBuf ++;
  665.     }
  666.     CSN = 1;                               //關閉SPI
  667.     return(status);   
  668. }


  669. /*----------------------------------------------
  670.    函數:void SetRX_Mode(void)
  671.    功能:數據接收配置
  672. ----------------------------------------------*/

  673. void RX_Mode(void)
  674. {
  675.     uchar buf[5]={0};
  676.     CE = 0;
  677.     SPI_Read_Buf(TX_ADDR,buf, TX_ADR_WIDTH);    //debug 測試原來的本地地址:復位值是:0xE7 0xE7 0xE7 0xE7 0xE7
  678.            //SPI_WR_Reg(WRITE_REG + CONFIG, 0x03);//SPI_WR_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收發完成中斷響應,16位CRC    ,主接收
  679.          //SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);        // 寫本地地址   
  680.     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);     // 寫接收端地址
  681.     SPI_WR_Reg(WRITE_REG + EN_AA, 0);                      //頻道0自動    ACK應答允許   
  682.     SPI_WR_Reg(WRITE_REG + EN_RXADDR,0x01);              //允許接收地址只有頻道0,如果需要多頻道可以參考Page21  
  683.     SPI_WR_Reg(WRITE_REG + SETUP_RETR,0x1a);             //設置自動重發時間和次數:500us + 86us, 10 retrans...
  684.     SPI_WR_Reg(WRITE_REG + RF_CH, 40);                    //設置信道工作為2.4GHZ,收發必須一致
  685.     SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);     //設置接收數據長度,本次設置為32字節
  686.     SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x0F);               //設置發射速率為2MHZ,發射功率為最大值0dB
  687.     SPI_WR_Reg(WRITE_REG + CONFIG, 0x0F);
  688.     CE = 1;
  689.     Delay_n10us(20); //200us
  690. }




  691. /*----------------------------------------------
  692.   函數:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  693.   功能:數據讀取后放入rx_buf接收緩沖區中
  694. ----------------------------------------------*/

  695. uchar nRF24L01_RxPacket(unsigned char* rx_buf)
  696. {
  697.     uchar flag=0;
  698.     uchar status;
  699.      
  700.     status=SPI_RD_Reg(NRFRegSTATUS);    //讀取狀態寄存其來判斷數據接收狀況
  701.    
  702.     if(status & 0x40)                    //判斷是否接收到數據
  703.     {
  704.            CE=0;             //SPI使能
  705.          SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);    // read receive payload from RX_FIFO buffer
  706.          flag =1;                                            //讀取數據完成標志
  707.     }
  708.     SPI_WR_Reg(WRITE_REG+NRFRegSTATUS, status);               //接收到數據后RX_DR,TX_DS,MAX_RT都置高為1,通過寫1來清楚中斷標志
  709.     return flag;
  710. }


  711. /*----------------------------------------------
  712.   函數:void TX_Mode(void)
  713.   功能:數據發送配置
  714. ----------------------------------------------*/

  715. void TX_Mode(void)
  716. {
  717.     CE = 0;
  718.     //SPI_WR_Reg(WRITE_REG + CONFIG, 0x02);   //0x0E         // IRQ收發完成中斷響應,16位CRC,主發送
  719.    
  720.     SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 寫本地地址   
  721.     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
  722.     SPI_WR_Reg(WRITE_REG + EN_AA, 0);//0x01);                          //  頻道0自動    ACK應答允許   
  723.     SPI_WR_Reg(WRITE_REG + EN_RXADDR,0);// 0x01);                      //  允許接收地址只有頻道0,如果需要多頻道可以參考Page21  
  724.     SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0);//0x1a);                     // 設置自動重發時間和次數:500us + 86us, 10 retrans...
  725. //    SPI_WR_Reg(WRITE_REG + RF_CH, 40);                                //   設置信道工作為2.4GHZ,收發必須一致
  726.     SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);                 //設置接收數據長度,本次設置為32字節
  727.     SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x0F);                           //設置發射速率為2MHZ,發射功率為最大值0dB

  728.     SPI_WR_Reg(WRITE_REG + CONFIG, 0x0E);
  729. //   CE = 1;
  730. }


  731. /*----------------------------------------------
  732.   函數:void nRF24L01_TxPacket(unsigned char * tx_buf)
  733.   功能:發送tx_buf中數據
  734. ----------------------------------------------*/

  735. void nRF24L01_TxPacket(unsigned char * tx_buf)
  736. {
  737.     CE = 0;            //StandBy I模式   
  738.     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
  739.     SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);              // 裝載數據   
  740.     //SPI_WR_Reg(WRITE_REG + CONFIG, 0x0e);            // IRQ收發完成中斷響應,16位CRC,主發送
  741.     CE = 1;         //置高CE,激發數據發送
  742. }


  743. ///************************************主函數************************************************************
  744. //void NRF_Send(void)
  745. //{
  746. //  //static uint counter=0;
  747. //  static uchar flag=0;  
  748. //   
  749. //   //TX_Mode();
  750. //   
  751. //   //IntervalTimems(100);
  752. //   if(flag==0)
  753. //   {
  754. //      flag=1;
  755. //      //memcpy(TxBuf, "1234567890abcdefghij", 20);
  756. //      nRF24L01_TxPacket(TxBuf);
  757. //   }
  758. //   else
  759. //   {
  760. //      flag=0;
  761. //      //memcpy(TxBuf, "abcdefghij1234567890", 20);
  762. //      nRF24L01_TxPacket(TxBuf);
  763. //   }
  764. //   
  765. //}


  766. #endif   /*__NRF24L01_H__ */
復制代碼

IMG_20190219_183629[1].jpg

RF24C01模塊無線發射接收控制.zip

132.34 KB, 下載次數: 12, 下載積分: 黑幣 -5

RF24C01模塊的收發端程序

評分

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

查看全部評分

回復

使用道具 舉報

ID:424598 發表于 2019-2-20 08:27 | 顯示全部樓層
程序備注得不錯,感謝分享
回復

使用道具 舉報

ID:243748 發表于 2019-2-24 11:51 來自手機 | 顯示全部樓層
無線模塊怎么接線呢?
回復

使用道具 舉報

ID:459370 發表于 2019-2-25 21:15 | 顯示全部樓層
wuxishun 發表于 2019-2-24 11:51
無線模塊怎么接線呢?

直接接到ISP接口上,你查看一下程序里申明與你的單片機ISP引腳相同即可。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久久动漫日韩 | 亚洲毛片 | 欧美涩涩网 | 欧美成人一区二区 | 99久久精品免费看国产小宝寻花 | 欧美伦理一区 | 91视频进入 | 另类亚洲视频 | 中文字幕免费在线 | 亚洲免费人成在线视频观看 | 精品久久久久久亚洲综合网 | 日韩免费av | 日韩av成人 | 国产精品久久九九 | 在线成人福利 | 国产日韩欧美精品 | 日韩中文字幕在线播放 | 亚洲精品乱码久久久久久按摩 | 久久久久国产精品一区 | 亚洲免费av一区 | 找个黄色片 | 亚洲一二三区在线观看 | 艹逼网| 日韩一级免费看 | 一级毛片视频在线 | 久久精品亚洲欧美日韩精品中文字幕 | 国产精品久久久久久久久久 | 国产午夜精品久久久久免费视高清 | 国产成人艳妇aa视频在线 | 久久伊人精品 | av色站| 欧美日韩一区在线 | 在线91| 免费久久久久久 | 99热在这里只有精品 | 99免费视频 | 欧美性成人 | 久久精品国产一区二区电影 | 资源首页二三区 | 日本一区二区三区免费观看 | 日韩成人在线播放 |