找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3266|回复: 5
打印 上一主题 下一主题
收起左侧

stc15f2k60s2遥控车nrf24l01接受

[复制链接]
跳转到指定楼层
楼主
通过NRF24L01接受来自遥控器端的操控

单片机源程序如下:
  1. /**********************************************************/
  2. /* 名   称:NRF24L01+无线USB通信模块程序                  */
  3. /* 功   能:发送接收测试程序                              */
  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有效数据,1~32字节
  12. #define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
  13. #define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
  14. #define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
  15. #define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
  16. #define NOP             0xFF  //空操作,可以用来读状态寄存器         
  17. /**********  NRF24L01寄存器地址   *************/
  18. #define CONFIG          0x00  //配置寄存器地址                             
  19. #define EN_AA           0x01  //使能自动应答功能
  20. #define EN_RXADDR       0x02  //接收地址允许
  21. #define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
  22. #define SETUP_RETR      0x04  //建立自动重发
  23. #define RF_CH           0x05  //RF通道
  24. #define RF_SETUP        0x06  //RF寄存器
  25. #define STATUS          0x07  //状态寄存器
  26. #define OBSERVE_TX      0x08  // 发送检测寄存器
  27. #define CD              0x09  // 载波检测寄存器
  28. #define RX_ADDR_P0      0x0A  // 数据通道0接收地址
  29. #define RX_ADDR_P1      0x0B  // 数据通道1接收地址
  30. #define RX_ADDR_P2      0x0C  // 数据通道2接收地址
  31. #define RX_ADDR_P3      0x0D  // 数据通道3接收地址
  32. #define RX_ADDR_P4      0x0E  // 数据通道4接收地址
  33. #define RX_ADDR_P5      0x0F  // 数据通道5接收地址
  34. #define TX_ADDR         0x10  // 发送地址寄存器
  35. #define RX_PW_P0        0x11  // 接收数据通道0有效数据宽度(1~32字节)
  36. #define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节)
  37. #define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节)
  38. #define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节)
  39. #define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
  40. #define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
  41. #define FIFO_STATUS     0x17  // FIFO状态寄存器
  42. /******   STATUS寄存器bit位定义      *******/
  43. #define MAX_TX          0x10            //达到最大发送次数中断
  44. #define TX_OK           0x20            //TX发送完成中断
  45. #define RX_OK           0x40            //接收到数据中断
  46. /*********     24L01发送接收数据宽度定义          ***********/
  47. #define TX_ADR_WIDTH    5     //5字节地址宽度
  48. #define RX_ADR_WIDTH    5     //5字节地址宽度
  49. #define TX_PLOAD_WIDTH  32    //32字节有效数据宽度
  50. #define RX_PLOAD_WIDTH  32    //32字节有效数据宽度

  51. const uchar TX_ADDRESS[TX_ADR_WIDTH]={0xFF,0xFF,0xFF,0xFF,0xFF}; //发送地址
  52. const uchar RX_ADDRESS[RX_ADR_WIDTH]={0xFF,0xFF,0xFF,0xFF,0xFF}; //发送地址

  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   前进
  61. sbit IN3 = P3^7;    //  0   右转            
  62. sbit IN4 = P3^6;    //  0   左转
  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. /* 函数功能:给24L01的寄存器写值(一个字节) */
  86. /* 入口参数:reg   要写的寄存器地址          */
  87. /*           value 给寄存器写的值            */
  88. /* 出口参数:status 状态值                   */
  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);                //发送寄存器地址,并读取状态值
  95.         SPI_RW(value);
  96.         NRF_CSN=1;                  //CSN=1;

  97.         return status;
  98. }
  99. /*************************************************/
  100. /* 函数功能:读24L01的寄存器值 (一个字节)      */
  101. /* 入口参数:reg  要读的寄存器地址               */
  102. /* 出口参数:value 读出寄存器的值                */
  103. /*************************************************/
  104. uchar NRF24L01_Read_Reg(uchar reg)
  105. {
  106.         uchar value;

  107.         NRF_CSN=0;              //CSN=0;   
  108.           SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
  109.         value = SPI_RW(NOP);
  110.         NRF_CSN=1;                     //CSN=1;

  111.         return value;
  112. }
  113. /*********************************************/
  114. /* 函数功能:读24L01的寄存器值(多个字节)   */
  115. /* 入口参数:reg   寄存器地址                */
  116. /*           *pBuf 读出寄存器值的存放数组    */
  117. /*           len   数组字节长度              */
  118. /* 出口参数:status 状态值                   */
  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);                                //发送寄存器地址,并读取状态值             
  125.         for(u8_ctr=0;u8_ctr<len;u8_ctr++)
  126.         pBuf[u8_ctr]=SPI_RW(0XFF);                //读出数据
  127.         NRF_CSN=1;                                 //CSN=1
  128.           return status;                                //返回读到的状态值
  129. }
  130. /**********************************************/
  131. /* 函数功能:给24L01的寄存器写值(多个字节)  */
  132. /* 入口参数:reg  要写的寄存器地址            */
  133. /*           *pBuf 值的存放数组               */
  134. /*           len   数组字节长度               */
  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);                        //发送寄存器值(位置),并读取状态值
  141.           for(u8_ctr=0; u8_ctr<len; u8_ctr++)
  142.         SPI_RW(*pBuf++);                                 //写入数据
  143.         NRF_CSN=1;
  144.           return status;                          //返回读到的状态值
  145. }                                                                                                    

  146. /*********************************************/
  147. /* 函数功能:24L01接收数据                   */
  148. /* 入口参数:rxbuf 接收数据数组              */
  149. /* 返回值: 0   成功收到数据                 */
  150. /*          1   没有收到数据                 */
  151. /*********************************************/
  152. uchar NRF24L01_RxPacket(uchar *rxbuf)
  153. {
  154.         uchar state;
  155.          
  156.         state=NRF24L01_Read_Reg(STATUS);                          //读取状态寄存器的值             
  157.         NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
  158.         if(state&RX_OK)                                                                //接收到数据
  159.         {
  160.                 NRF_CE = 0;
  161.                 NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
  162.                 NRF24L01_Write_Reg(FLUSH_RX,0xff);                                        //清除RX FIFO寄存器
  163.                 NRF_CE = 1;
  164.                 delay_150us();
  165.                 return 0;
  166.         }          
  167.         return 1;//没收到任何数据
  168. }
  169. /********************************************/
  170. /* 函数功能:检测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的有效数据宽度
  194.         NRF24L01_Write_Reg(FLUSH_RX,0xff);                                                                        //清除RX FIFO寄存器   
  195.           NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uchar*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
  196.           NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uchar*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK          
  197.           NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答   
  198.           NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  
  199.           NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
  200.           NRF24L01_Write_Reg(WRITE_REG+RF_CH,0);        //设置RF通道为2.400GHz  频率=2.4+0GHz
  201.           NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0F);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
  202.           NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0f);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
  203.         NRF_CE=1;                                                                          //CE置高,使能发送
  204. }       
  205. void main()
  206. {       
  207. //        P3M0=0X00;
  208. //        P3M1=0X00;
  209. //        P5M0=0X00;
  210. //        P5M1=0X00;       
  211.         while(NRF24L01_Check()); // 等待检测到NRF24L01,程序才会向下执行
  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;                        //前进
  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;                        //前进左
  235.                                 break;
  236.                        
  237.                                 case 'R':
  238.                                 IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 1;                        //前进右
  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. }
复制代码

所有资料51hei提供下载:
接受1-最终.zip (40.73 KB, 下载次数: 48)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-6-30 16:54 | 只看该作者
此贴需要分享原理图后才可获得大量积分
回复

使用道具 举报

板凳
ID:228755 发表于 2018-9-4 10:26 | 只看该作者
原理图

捕获1.PNG (31.71 KB, 下载次数: 28)

捕获1.PNG

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:367087 发表于 2018-10-14 19:16 | 只看该作者
这里面发射程序有嘛
回复

使用道具 举报

5#
ID:409824 发表于 2018-10-15 11:02 来自手机 | 只看该作者
感谢感谢!
回复

使用道具 举报

6#
ID:413453 发表于 2019-12-12 16:45 | 只看该作者
为啥不用stc15f2k60s2的SPI寄存器功能呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表