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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3851|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

stc15f2k60s2遙控車nrf24l01接受

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
通過NRF24L01接受來自遙控器端的操控

單片機(jī)源程序如下:
  1. /**********************************************************/
  2. /* 名   稱:NRF24L01+無線USB通信模塊程序                  */
  3. /* 功   能:發(fā)送接收測試程序                              */
  4. #include<stc15f2k60s2.h>
  5. #include<intrins.h>
  6. typedef unsigned char uchar;
  7. typedef unsigned char uint;

  8. /**********  NRF24L01寄存器操作命令  ***********/
  9. #define READ_REG        0x00  //讀配置寄存器,低5位為寄存器地址
  10. #define WRITE_REG       0x20  //寫配置寄存器,低5位為寄存器地址
  11. #define RD_RX_PLOAD     0x61  //讀RX有效數(shù)據(jù),1~32字節(jié)
  12. #define WR_TX_PLOAD     0xA0  //寫TX有效數(shù)據(jù),1~32字節(jié)
  13. #define FLUSH_TX        0xE1  //清除TX FIFO寄存器.發(fā)射模式下用
  14. #define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
  15. #define REUSE_TX_PL     0xE3  //重新使用上一包數(shù)據(jù),CE為高,數(shù)據(jù)包被不斷發(fā)送.
  16. #define NOP             0xFF  //空操作,可以用來讀狀態(tài)寄存器         
  17. /**********  NRF24L01寄存器地址   *************/
  18. #define CONFIG          0x00  //配置寄存器地址                             
  19. #define EN_AA           0x01  //使能自動(dòng)應(yīng)答功能
  20. #define EN_RXADDR       0x02  //接收地址允許
  21. #define SETUP_AW        0x03  //設(shè)置地址寬度(所有數(shù)據(jù)通道)
  22. #define SETUP_RETR      0x04  //建立自動(dòng)重發(fā)
  23. #define RF_CH           0x05  //RF通道
  24. #define RF_SETUP        0x06  //RF寄存器
  25. #define STATUS          0x07  //狀態(tài)寄存器
  26. #define OBSERVE_TX      0x08  // 發(fā)送檢測寄存器
  27. #define CD              0x09  // 載波檢測寄存器
  28. #define RX_ADDR_P0      0x0A  // 數(shù)據(jù)通道0接收地址
  29. #define RX_ADDR_P1      0x0B  // 數(shù)據(jù)通道1接收地址
  30. #define RX_ADDR_P2      0x0C  // 數(shù)據(jù)通道2接收地址
  31. #define RX_ADDR_P3      0x0D  // 數(shù)據(jù)通道3接收地址
  32. #define RX_ADDR_P4      0x0E  // 數(shù)據(jù)通道4接收地址
  33. #define RX_ADDR_P5      0x0F  // 數(shù)據(jù)通道5接收地址
  34. #define TX_ADDR         0x10  // 發(fā)送地址寄存器
  35. #define RX_PW_P0        0x11  // 接收數(shù)據(jù)通道0有效數(shù)據(jù)寬度(1~32字節(jié))
  36. #define RX_PW_P1        0x12  // 接收數(shù)據(jù)通道1有效數(shù)據(jù)寬度(1~32字節(jié))
  37. #define RX_PW_P2        0x13  // 接收數(shù)據(jù)通道2有效數(shù)據(jù)寬度(1~32字節(jié))
  38. #define RX_PW_P3        0x14  // 接收數(shù)據(jù)通道3有效數(shù)據(jù)寬度(1~32字節(jié))
  39. #define RX_PW_P4        0x15  // 接收數(shù)據(jù)通道4有效數(shù)據(jù)寬度(1~32字節(jié))
  40. #define RX_PW_P5        0x16  // 接收數(shù)據(jù)通道5有效數(shù)據(jù)寬度(1~32字節(jié))
  41. #define FIFO_STATUS     0x17  // FIFO狀態(tài)寄存器
  42. /******   STATUS寄存器bit位定義      *******/
  43. #define MAX_TX          0x10            //達(dá)到最大發(fā)送次數(shù)中斷
  44. #define TX_OK           0x20            //TX發(fā)送完成中斷
  45. #define RX_OK           0x40            //接收到數(shù)據(jù)中斷
  46. /*********     24L01發(fā)送接收數(shù)據(jù)寬度定義          ***********/
  47. #define TX_ADR_WIDTH    5     //5字節(jié)地址寬度
  48. #define RX_ADR_WIDTH    5     //5字節(jié)地址寬度
  49. #define TX_PLOAD_WIDTH  32    //32字節(jié)有效數(shù)據(jù)寬度
  50. #define RX_PLOAD_WIDTH  32    //32字節(jié)有效數(shù)據(jù)寬度

  51. const uchar TX_ADDRESS[TX_ADR_WIDTH]={0xFF,0xFF,0xFF,0xFF,0xFF}; //發(fā)送地址
  52. const uchar RX_ADDRESS[RX_ADR_WIDTH]={0xFF,0xFF,0xFF,0xFF,0xFF}; //發(fā)送地址

  53. sbit NRF_CE   = P3^2;
  54. sbit NRF_CSN  = P1^2;
  55. sbit NRF_MISO = P1^4;
  56. sbit NRF_MOSI = P1^3;
  57. sbit NRF_SCK  = P1^5;
  58. sbit NRF_IRQ  = P3^3;
  59. sbit IN1 = P1^1;        //         0   后退
  60. sbit IN2 = P1^0;    //  0   前進(jìn)
  61. sbit IN3 = P3^7;    //  0   右轉(zhuǎn)            
  62. sbit IN4 = P3^6;    //  0   左轉(zhuǎn)
  63. uchar rece_buf[32];

  64. void delay_150us()
  65. {
  66.         uint i;

  67.         for(i=0;i>150;i++);
  68. }
  69. /***************************************************************/

  70. /*******************************************************************/
  71. uchar SPI_RW(uchar byte)
  72. {
  73.         uchar bit_ctr;
  74.         for(bit_ctr=0;bit_ctr<8;bit_ctr++)  // 輸出8位
  75.         {
  76.                 NRF_MOSI=(byte&0x80);                         // MSB TO MOSI
  77.                 byte=(byte<<1);                                        // shift next bit to MSB
  78.                 NRF_SCK=1;
  79.                 byte|=NRF_MISO;                                // capture current MISO bit
  80.                 NRF_SCK=0;
  81.         }
  82.         return byte;
  83. }

  84. /*********************************************/
  85. /* 函數(shù)功能:給24L01的寄存器寫值(一個(gè)字節(jié)) */
  86. /* 入口參數(shù):reg   要寫的寄存器地址          */
  87. /*           value 給寄存器寫的值            */
  88. /* 出口參數(shù):status 狀態(tài)值                   */
  89. /*********************************************/
  90. uchar NRF24L01_Write_Reg(uchar reg,uchar value)
  91. {
  92.         uchar status;

  93.         NRF_CSN=0;                  //CSN=0;   
  94.           status = SPI_RW(reg);                //發(fā)送寄存器地址,并讀取狀態(tài)值
  95.         SPI_RW(value);
  96.         NRF_CSN=1;                  //CSN=1;

  97.         return status;
  98. }
  99. /*************************************************/
  100. /* 函數(shù)功能:讀24L01的寄存器值 (一個(gè)字節(jié))      */
  101. /* 入口參數(shù):reg  要讀的寄存器地址               */
  102. /* 出口參數(shù):value 讀出寄存器的值                */
  103. /*************************************************/
  104. uchar NRF24L01_Read_Reg(uchar reg)
  105. {
  106.         uchar value;

  107.         NRF_CSN=0;              //CSN=0;   
  108.           SPI_RW(reg);                        //發(fā)送寄存器值(位置),并讀取狀態(tài)值
  109.         value = SPI_RW(NOP);
  110.         NRF_CSN=1;                     //CSN=1;

  111.         return value;
  112. }
  113. /*********************************************/
  114. /* 函數(shù)功能:讀24L01的寄存器值(多個(gè)字節(jié))   */
  115. /* 入口參數(shù):reg   寄存器地址                */
  116. /*           *pBuf 讀出寄存器值的存放數(shù)組    */
  117. /*           len   數(shù)組字節(jié)長度              */
  118. /* 出口參數(shù):status 狀態(tài)值                   */
  119. /*********************************************/
  120. uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
  121. {
  122.         uchar status,u8_ctr;
  123.         NRF_CSN=0;                           //CSN=0      
  124.           status=SPI_RW(reg);                                //發(fā)送寄存器地址,并讀取狀態(tài)值             
  125.         for(u8_ctr=0;u8_ctr<len;u8_ctr++)
  126.         pBuf[u8_ctr]=SPI_RW(0XFF);                //讀出數(shù)據(jù)
  127.         NRF_CSN=1;                                 //CSN=1
  128.           return status;                                //返回讀到的狀態(tài)值
  129. }
  130. /**********************************************/
  131. /* 函數(shù)功能:給24L01的寄存器寫值(多個(gè)字節(jié))  */
  132. /* 入口參數(shù):reg  要寫的寄存器地址            */
  133. /*           *pBuf 值的存放數(shù)組               */
  134. /*           len   數(shù)組字節(jié)長度               */
  135. /**********************************************/
  136. uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
  137. {
  138.         uchar status,u8_ctr;
  139.         NRF_CSN=0;
  140.           status = SPI_RW(reg);                        //發(fā)送寄存器值(位置),并讀取狀態(tài)值
  141.           for(u8_ctr=0; u8_ctr<len; u8_ctr++)
  142.         SPI_RW(*pBuf++);                                 //寫入數(shù)據(jù)
  143.         NRF_CSN=1;
  144.           return status;                          //返回讀到的狀態(tài)值
  145. }                                                                                                    

  146. /*********************************************/
  147. /* 函數(shù)功能:24L01接收數(shù)據(jù)                   */
  148. /* 入口參數(shù):rxbuf 接收數(shù)據(jù)數(shù)組              */
  149. /* 返回值: 0   成功收到數(shù)據(jù)                 */
  150. /*          1   沒有收到數(shù)據(jù)                 */
  151. /*********************************************/
  152. uchar NRF24L01_RxPacket(uchar *rxbuf)
  153. {
  154.         uchar state;
  155.          
  156.         state=NRF24L01_Read_Reg(STATUS);                          //讀取狀態(tài)寄存器的值             
  157.         NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中斷標(biāo)志
  158.         if(state&RX_OK)                                                                //接收到數(shù)據(jù)
  159.         {
  160.                 NRF_CE = 0;
  161.                 NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//讀取數(shù)據(jù)
  162.                 NRF24L01_Write_Reg(FLUSH_RX,0xff);                                        //清除RX FIFO寄存器
  163.                 NRF_CE = 1;
  164.                 delay_150us();
  165.                 return 0;
  166.         }          
  167.         return 1;//沒收到任何數(shù)據(jù)
  168. }
  169. /********************************************/
  170. /* 函數(shù)功能:檢測24L01是否存在              */
  171. /* 返回值;  0  存在                        */
  172. /*           1  不存在                      */
  173. /********************************************/           
  174. uchar NRF24L01_Check(void)
  175. {
  176.         uchar check_in_buf[5]={0x11,0x22,0x33,0x44,0x55};
  177.         uchar check_out_buf[5]={0x00};

  178.         NRF_SCK=0;
  179.         NRF_CSN=1;   
  180.         NRF_CE=0;

  181.         NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_in_buf, 5);

  182.         NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);

  183.         if((check_out_buf[0] == 0x11)&&\
  184.            (check_out_buf[1] == 0x22)&&\
  185.            (check_out_buf[2] == 0x33)&&\
  186.            (check_out_buf[3] == 0x44)&&\
  187.            (check_out_buf[4] == 0x55))return 0;
  188.         else return 1;
  189. }                       


  190. void NRF24L01_RT_Init(void)
  191. {       
  192.         NRF_CE=0;                  
  193.           NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//選擇通道0的有效數(shù)據(jù)寬度
  194.         NRF24L01_Write_Reg(FLUSH_RX,0xff);                                                                        //清除RX FIFO寄存器   
  195.           NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,TX_ADR_WIDTH);//寫TX節(jié)點(diǎn)地址
  196.           NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,RX_ADR_WIDTH); //設(shè)置TX節(jié)點(diǎn)地址,主要為了使能ACK          
  197.           NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);     //使能通道0的自動(dòng)應(yīng)答   
  198.           NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  
  199.           NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//設(shè)置自動(dòng)重發(fā)間隔時(shí)間:500us + 86us;最大自動(dòng)重發(fā)次數(shù):10次
  200.           NRF24L01_Write_Reg(WRITE_REG+RF_CH,0);        //設(shè)置RF通道為2.400GHz  頻率=2.4+0GHz
  201.           NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0F);  //設(shè)置TX發(fā)射參數(shù),0db增益,2Mbps,低噪聲增益開啟   
  202.           NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f);    //配置基本工作模式的參數(shù);PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
  203.         NRF_CE=1;                                                                          //CE置高,使能發(fā)送
  204. }       
  205. void main()
  206. {       
  207. //        P3M0=0X00;
  208. //        P3M1=0X00;
  209. //        P5M0=0X00;
  210. //        P5M1=0X00;       
  211.         while(NRF24L01_Check()); // 等待檢測到NRF24L01,程序才會(huì)向下執(zhí)行
  212.         NRF24L01_RT_Init();
  213.         //LED=1;                       
  214.         while(1)
  215.         {                  
  216.                 if(NRF24L01_RxPacket(rece_buf)==0)       
  217.                 {
  218.                 //        LED = 0;
  219.                         switch(rece_buf[1])
  220.                         {
  221.                                 case 'G':
  222.                                 IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 1;                        //前進(jìn)
  223.                                 break;
  224.                        
  225.                                 case 'S':
  226.                                 IN1 = 1; IN2 = 1; IN3 = 1; IN4 = 1;                        //停止
  227.                                 break;
  228.                        
  229.                                 case 'B':
  230.                                 IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 1;                        //后退
  231.                                 break;
  232.                        
  233.                                 case 'L':
  234.                                 IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0;                        //前進(jìn)左
  235.                                 break;
  236.                        
  237.                                 case 'R':
  238.                                 IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 1;                        //前進(jìn)右
  239.                                 break;
  240.                        
  241.                                 case 'Q':
  242.                                 IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 0;                        //后退左
  243.                                 break;
  244.                        
  245.                                 case 'W':
  246.                                 IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 1;                        //后退右
  247.                                 break;       
  248.                         }
  249.                         //LED=1;
  250.                 }
  251.         }
  252. }
復(fù)制代碼

所有資料51hei提供下載:
接受1-最終.zip (40.73 KB, 下載次數(shù): 49)


評分

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

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2018-6-30 16:54 | 只看該作者
此貼需要分享原理圖后才可獲得大量積分
回復(fù)

使用道具 舉報(bào)

板凳
ID:228755 發(fā)表于 2018-9-4 10:26 | 只看該作者
原理圖

捕獲1.PNG (31.71 KB, 下載次數(shù): 58)

捕獲1.PNG

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

地板
ID:367087 發(fā)表于 2018-10-14 19:16 | 只看該作者
這里面發(fā)射程序有嘛
回復(fù)

使用道具 舉報(bào)

5#
ID:409824 發(fā)表于 2018-10-15 11:02 來自手機(jī) | 只看該作者
感謝感謝!
回復(fù)

使用道具 舉報(bào)

6#
ID:413453 發(fā)表于 2019-12-12 16:45 | 只看該作者
為啥不用stc15f2k60s2的SPI寄存器功能呢?
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕免费 | 久久久久国产一级毛片高清网站 | 国产欧美在线播放 | 国产成人免费视频网站高清观看视频 | 在线观看www | 色黄网站 | 国产成人免费视频网站高清观看视频 | 视频二区国产 | 精品国产乱码久久久久久牛牛 | 国产高清精品网站 | 国产高清免费视频 | 91精品久久久久久久99 | 青青久草 | 一区二区视频免费观看 | 美女福利网站 | 日日操操| av喷水| 狠狠插狠狠操 | 欧美日韩一区二区三区在线观看 | 国产精品一区二区视频 | 中文字幕av一区二区三区 | 久操av在线 | 中文字幕乱码一区二区三区 | 亚洲一区精品在线 | 欧美精品一区二区三区在线 | 欧美福利| 精品久久国产 | 欧美一区二区黄 | 久久久精 | 欧美成人高清视频 | 欧美激情精品久久久久久 | 日韩精品四区 | 国产精品亚洲综合 | 亚洲精品免费视频 | 国产亚洲精品久久19p | 中文字字幕一区二区三区四区五区 | 亚洲精品乱码久久久久久按摩观 | 成人性视频免费网站 | 丁香婷婷综合激情五月色 | 午夜精品久久久 | 国产成人一区二区三区久久久 |