找回密码
 立即注册

QQ登录

只需一步,快速开始

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

nrf24l01遥控小车制作资料

  [复制链接]
跳转到指定楼层
楼主
分享基于51单片机的nrf24l01遥控小车的一些制作文件,带发送和接受的源程序,及ad画的原理图和pcb文件等资料

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)



单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. typedef unsigned int uint;
  4. typedef unsigned char uchar;

  5. #define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节
  6. #define RX_ADDR_WITDH 5//接收地址宽度设置为5个字节
  7. #define TX_DATA_WITDH 8//
  8. #define RX_DATA_WITDH 8
  9. /******************************************************************
  10. // nRF24L01指令格式:
  11. *******************************************************************/
  12. #define R_REGISTER    0x00  // 读寄存器
  13. #define W_REGISTER    0x20  // 写寄存器
  14. #define R_RX_PLOAD    0x61  // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式
  15. #define W_TX_PLOAD    0xA0  // 写TX FIFO有效数据,1-32字节,写操作从字节0开始,应用于发射模式
  16. #define FLUSH_TX    0xE1  // 清除TX FIFO寄存器,应用于发射模式
  17. #define FLUSH_RX    0xE2  // 清除RX FIFO寄存器,应用于接收模式
  18. #define REUSE_TX_PL 0xE3  // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射
  19. #define NOP         0xFF  // 空操作,可以用来读状态寄存器
  20. /******************************************************************
  21. // nRF24L01寄存器地址
  22. *******************************************************************/
  23. #define CONFIG      0x00  // 配置寄存器
  24. #define EN_AA       0x01  // "自动应答"功能寄存
  25. #define EN_RX_ADDR  0x02  // 接收通道使能寄存器
  26. #define SETUP_AW    0x03  // 地址宽度设置寄存器
  27. #define SETUP_RETR  0x04  // 自动重发设置寄存器
  28. #define RF_CH       0x05  // 射频通道频率设置寄存器
  29. #define RF_SETUP    0x06  // 射频设置寄存器
  30. #define STATUS      0x07  // 状态寄存器
  31. #define OBSERVE_TX  0x08  // 发送检测寄存器
  32. #define CD          0x09  // 载波检测寄存器
  33. #define RX_ADDR_P0  0x0A  // 数据通道0接收地址寄存器
  34. #define RX_ADDR_P1  0x0B  // 数据通道1接收地址寄存器
  35. #define RX_ADDR_P2  0x0C  // 数据通道2接收地址寄存器
  36. #define RX_ADDR_P3  0x0D  // 数据通道3接收地址寄存器
  37. #define RX_ADDR_P4  0x0E  // 数据通道4接收地址寄存器
  38. #define RX_ADDR_P5  0x0F  // 数据通道5接收地址寄存器
  39. #define TX_ADDR     0x10  // 发送地址寄存器
  40. #define RX_PW_P0    0x11  // 数据通道0有效数据宽度设置寄存器
  41. #define RX_PW_P1    0x12  // 数据通道1有效数据宽度设置寄存器
  42. #define RX_PW_P2    0x13  // 数据通道2有效数据宽度设置寄存器
  43. #define RX_PW_P3    0x14  // 数据通道3有效数据宽度设置寄存器
  44. #define RX_PW_P4    0x15  // 数据通道4有效数据宽度设置寄存器
  45. #define RX_PW_P5    0x16  // 数据通道5有效数据宽度设置寄存器
  46. #define FIFO_STATUS 0x17  // FIFO状态寄存器
  47. //*********************************************************************************
  48. uchar sta;    // 状态变量
  49. #define RX_DR  (sta & 0x40)  // 接收成功中断标志
  50. #define TX_DS  (sta & 0x20)  // 发射成功中断标志
  51. #define MAX_RT (sta & 0x10)  // 重发溢出中断标志
  52. sbit CE=P2^0;
  53. sbit IRQ=P1^0;
  54. sbit CSN=P2^1;
  55. sbit MOSI=P2^3;
  56. sbit MISO=P2^4;
  57. sbit SCK=P2^2;
  58. sbit LED=P0^0;
  59. sbit Key=P3^2;

  60. uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
  61. uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};
  62. uchar RX_Buffer[RX_DATA_WITDH];

  63. void _delay_us(uint x)
  64. {
  65.     uint i,j;
  66.     for (j=0;j<x;j++)
  67.         for (i=0;i<12;i++);
  68. }
  69. void _delay_ms(uint x)
  70. {
  71.     uint i,j;
  72.     for (j=0;j<x;j++)
  73.         for (i=0;i<120;i++);
  74. }
  75. /*nRF24L01初始化*/
  76. void nRF24L01_Init(void)
  77. {
  78.     CE=0;//待机模式Ⅰ
  79.     CSN=1;
  80.     SCK=0;
  81.     IRQ=1;
  82. }
  83. /*SPI时序函数*/
  84. uchar SPI_RW(uchar byte)
  85. {
  86.     uchar i;
  87.     for(i=0;i<8;i++)//一字节8位循环8次写入
  88.     {
  89.         if(byte&0x80)//如果数据最高位是1
  90.             MOSI=1;//向NRF24L01写1
  91.         else //否则写0
  92.             MOSI=0;
  93.         byte<<=1;//低一位移到最高位
  94.         SCK=1;//SCK拉高,写入一位数据,同时读取一位数据
  95.         if(MISO)
  96.             byte|=0x01;
  97.         SCK=0;//SCK拉低
  98.     }
  99.     return byte;//返回读取一字节
  100. }
  101. /*SPI写寄存器一字节函数*/
  102. /*reg:寄存器地址*/
  103. /*value:一字节(值)*/
  104. uchar SPI_W_Reg(uchar reg,uchar value)
  105. {
  106.     uchar status;//返回状态
  107.     CSN=0;//SPI片选
  108.     status=SPI_RW(reg);//写入寄存器地址,同时读取状态
  109.     SPI_RW(value);//写入一字节
  110.     CSN=1;//
  111.     return status;//返回状态
  112. }
  113. /*SPI读一字节*/
  114. uchar SPI_R_byte(uchar reg)
  115. {
  116.     uchar reg_value;
  117.     CSN=0;//SPI片选
  118.     SPI_RW(reg);//写入地址
  119.     reg_value=SPI_RW(0);//读取寄存器的值
  120.     CSN=1;
  121.     return reg_value;//返回读取的值
  122. }
  123. /*SPI读取RXFIFO寄存器数据*/
  124. /*reg:寄存器地址*/
  125. /*Dat_Buffer:用来存读取的数据*/
  126. /*DLen:数据长度*/
  127. uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
  128. {
  129.     uchar status,i;
  130.     CSN=0;//SPI片选
  131.     status=SPI_RW(reg);//写入寄存器地址,同时状态
  132.     for(i=0;i<Dlen;i++)
  133.     {
  134.         Dat_Buffer[i]=SPI_RW(0);//存储数据
  135.     }
  136.     CSN=1;
  137.     return status;
  138. }
  139. /*SPI向TXFIFO寄存器写入数据*/
  140. /*reg:写入寄存器地址*/
  141. /*TX_Dat_Buffer:存放需要发送的数据*/
  142. /*Dlen:数据长度*/  
  143. uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
  144. {
  145.     uchar status,i;
  146.     CSN=0;//SPI片选,启动时序
  147.     status=SPI_RW(reg);
  148.     for(i=0;i<Dlen;i++)
  149.     {
  150.         SPI_RW(TX_Dat_Buffer[i]);//发送数据
  151.     }
  152.     CSN=1;
  153.     return status;  
  154. }
  155. /*设置发送模式*/
  156. void nRF24L01_Set_TX_Mode(uchar *TX_Data)
  157. {
  158.     CE=0;//待机(写寄存器之前一定要进入待机模式或掉电模式)
  159.     SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);/*写寄存器指令+接收节点地址+地址宽度*/
  160.     SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);/*为了接收设备应答信号,接收通道0地址与发送地址相同*/
  161.     SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH);/*写有效数据地址+有效数据+有效数据宽度*/
  162.     SPI_W_Reg(W_REGISTER+EN_AA,0x01);/*接收通道0自动应答*/
  163.     SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);/*使能接收通道0*/
  164.     SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);/*自动重发延时250US+86US,重发10次*/
  165.     SPI_W_Reg(W_REGISTER+RF_CH,0);/*(2400+40)MHZ选择射频通道0X40*/
  166.     SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);/*1Mbps速率,发射功率:0DBM,低噪声放大器增益*/
  167.     SPI_W_Reg(W_REGISTER+CONFIG,0x0e);/*发送模式,上电,16位CRC校验,CRC使能*/
  168.     CE=1;//启动发射
  169.     _delay_ms(5);/*CE高电平持续时间最少10US以上*/
  170. }

  171. uchar Check_Rec(void)
  172. {
  173.     uchar status;
  174.     sta=SPI_R_byte(R_REGISTER+STATUS);
  175.     if(RX_DR)
  176.     {
  177.         CE=0;
  178.         SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
  179.         status=1;
  180.     }
  181.     SPI_W_Reg(W_REGISTER+STATUS,0xff);
  182.     return status;  
  183. }
  184. /*检测应答信号*/
  185. uchar Check_Ack(void)
  186. {
  187.     sta=SPI_R_byte(R_REGISTER+STATUS);/*读取寄存状态*/
  188.     if(TX_DS||MAX_RT)/*如果TX_DS或MAX_RT为1,则清除中断和清除TX_FIFO寄存器的值*/
  189.     {
  190.         SPI_W_Reg(W_REGISTER+STATUS,0xff);
  191.         CSN=0;
  192.         SPI_RW(FLUSH_TX);/*如果没有这一句只能发一次数据,大家要注意*/
  193.         CSN=1;
  194.         return 0;
  195.     }
  196.     else
  197.         return 1;
  198. }

  199. void main(void)
  200. {
  201. ……………………

  202. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
nrf24l01小车项目.zip (11.15 MB, 下载次数: 291)


评分

参与人数 2黑币 +56 收起 理由
菜用鸡 + 6 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:164989 发表于 2017-5-24 12:30 | 只看该作者
PCB是遥控灯的.......
回复

使用道具 举报

板凳
ID:182522 发表于 2017-7-13 11:07 | 只看该作者
很好的资料 谢谢分享
回复

使用道具 举报

地板
ID:110278 发表于 2017-8-4 13:42 | 只看该作者
感谢分享。。。。
回复

使用道具 举报

5#
ID:79544 发表于 2017-11-5 15:04 | 只看该作者
送人玫瑰手留余香,感谢分享!
回复

使用道具 举报

6#
ID:5322 发表于 2017-11-8 10:58 | 只看该作者
很好的资料,谢谢
回复

使用道具 举报

7#
ID:312835 发表于 2018-5-25 10:10 | 只看该作者
打不开
回复

使用道具 举报

8#
ID:148126 发表于 2018-10-27 17:07 | 只看该作者
你这个是2401吗  分明是别人的资料好不好  我之前见过的  这是红外遥控好不好   真不知道  你发这个东西时自己有没有看过     hi有下面点赞的人是真懂还是假懂    不看看吗
回复

使用道具 举报

9#
ID:372154 发表于 2019-6-3 02:09 | 只看该作者
好资料,谢谢
回复

使用道具 举报

10#
ID:318672 发表于 2019-6-24 15:40 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

11#
ID:246783 发表于 2020-3-1 12:30 来自手机 | 只看该作者
还不错  
回复

使用道具 举报

12#
ID:570401 发表于 2020-3-3 22:56 | 只看该作者
很好的资料 谢谢分享
回复

使用道具 举报

13#
ID:614724 发表于 2020-6-14 13:33 来自手机 | 只看该作者
谢谢分享
回复

使用道具 举报

14#
ID:521719 发表于 2020-10-5 18:14 | 只看该作者
ymhhmy 发表于 2017-5-24 12:30
PCB是遥控灯的.......

感谢分享
回复

使用道具 举报

15#
ID:553941 发表于 2020-12-8 14:03 | 只看该作者
霍特 发表于 2018-10-27 17:07
你这个是2401吗  分明是别人的资料好不好  我之前见过的  这是红外遥控好不好   真不知道  你发这个东西时 ...

我想问问。。你真看过吗。红外遥控用到SPI通信吗。我特地下载看了一下,程序写的不复杂,但是确实是2401的程序
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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