找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 8628|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

nrf24l01遙控小車制作資料

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:164989 發(fā)表于 2017-5-23 21:28 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
分享基于51單片機的nrf24l01遙控小車的一些制作文件,帶發(fā)送和接受的源程序,及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//發(fā)送地址寬度設(shè)置為5個字節(jié)
  6. #define RX_ADDR_WITDH 5//接收地址寬度設(shè)置為5個字節(jié)
  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有效數(shù)據(jù),1-32字節(jié),當(dāng)讀數(shù)據(jù)完成后,數(shù)據(jù)被清除,應(yīng)用于接收模式
  15. #define W_TX_PLOAD    0xA0  // 寫TX FIFO有效數(shù)據(jù),1-32字節(jié),寫操作從字節(jié)0開始,應(yīng)用于發(fā)射模式
  16. #define FLUSH_TX    0xE1  // 清除TX FIFO寄存器,應(yīng)用于發(fā)射模式
  17. #define FLUSH_RX    0xE2  // 清除RX FIFO寄存器,應(yīng)用于接收模式
  18. #define REUSE_TX_PL 0xE3  // 重新使用上一包有效數(shù)據(jù),當(dāng)CE為高過程中,數(shù)據(jù)包被不斷的重新發(fā)射
  19. #define NOP         0xFF  // 空操作,可以用來讀狀態(tài)寄存器
  20. /******************************************************************
  21. // nRF24L01寄存器地址
  22. *******************************************************************/
  23. #define CONFIG      0x00  // 配置寄存器
  24. #define EN_AA       0x01  // "自動應(yīng)答"功能寄存
  25. #define EN_RX_ADDR  0x02  // 接收通道使能寄存器
  26. #define SETUP_AW    0x03  // 地址寬度設(shè)置寄存器
  27. #define SETUP_RETR  0x04  // 自動重發(fā)設(shè)置寄存器
  28. #define RF_CH       0x05  // 射頻通道頻率設(shè)置寄存器
  29. #define RF_SETUP    0x06  // 射頻設(shè)置寄存器
  30. #define STATUS      0x07  // 狀態(tài)寄存器
  31. #define OBSERVE_TX  0x08  // 發(fā)送檢測寄存器
  32. #define CD          0x09  // 載波檢測寄存器
  33. #define RX_ADDR_P0  0x0A  // 數(shù)據(jù)通道0接收地址寄存器
  34. #define RX_ADDR_P1  0x0B  // 數(shù)據(jù)通道1接收地址寄存器
  35. #define RX_ADDR_P2  0x0C  // 數(shù)據(jù)通道2接收地址寄存器
  36. #define RX_ADDR_P3  0x0D  // 數(shù)據(jù)通道3接收地址寄存器
  37. #define RX_ADDR_P4  0x0E  // 數(shù)據(jù)通道4接收地址寄存器
  38. #define RX_ADDR_P5  0x0F  // 數(shù)據(jù)通道5接收地址寄存器
  39. #define TX_ADDR     0x10  // 發(fā)送地址寄存器
  40. #define RX_PW_P0    0x11  // 數(shù)據(jù)通道0有效數(shù)據(jù)寬度設(shè)置寄存器
  41. #define RX_PW_P1    0x12  // 數(shù)據(jù)通道1有效數(shù)據(jù)寬度設(shè)置寄存器
  42. #define RX_PW_P2    0x13  // 數(shù)據(jù)通道2有效數(shù)據(jù)寬度設(shè)置寄存器
  43. #define RX_PW_P3    0x14  // 數(shù)據(jù)通道3有效數(shù)據(jù)寬度設(shè)置寄存器
  44. #define RX_PW_P4    0x15  // 數(shù)據(jù)通道4有效數(shù)據(jù)寬度設(shè)置寄存器
  45. #define RX_PW_P5    0x16  // 數(shù)據(jù)通道5有效數(shù)據(jù)寬度設(shè)置寄存器
  46. #define FIFO_STATUS 0x17  // FIFO狀態(tài)寄存器
  47. //*********************************************************************************
  48. uchar sta;    // 狀態(tài)變量
  49. #define RX_DR  (sta & 0x40)  // 接收成功中斷標(biāo)志
  50. #define TX_DS  (sta & 0x20)  // 發(fā)射成功中斷標(biāo)志
  51. #define MAX_RT (sta & 0x10)  // 重發(fā)溢出中斷標(biāo)志
  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時序函數(shù)*/
  84. uchar SPI_RW(uchar byte)
  85. {
  86.     uchar i;
  87.     for(i=0;i<8;i++)//一字節(jié)8位循環(huán)8次寫入
  88.     {
  89.         if(byte&0x80)//如果數(shù)據(jù)最高位是1
  90.             MOSI=1;//向NRF24L01寫1
  91.         else //否則寫0
  92.             MOSI=0;
  93.         byte<<=1;//低一位移到最高位
  94.         SCK=1;//SCK拉高,寫入一位數(shù)據(jù),同時讀取一位數(shù)據(jù)
  95.         if(MISO)
  96.             byte|=0x01;
  97.         SCK=0;//SCK拉低
  98.     }
  99.     return byte;//返回讀取一字節(jié)
  100. }
  101. /*SPI寫寄存器一字節(jié)函數(shù)*/
  102. /*reg:寄存器地址*/
  103. /*value:一字節(jié)(值)*/
  104. uchar SPI_W_Reg(uchar reg,uchar value)
  105. {
  106.     uchar status;//返回狀態(tài)
  107.     CSN=0;//SPI片選
  108.     status=SPI_RW(reg);//寫入寄存器地址,同時讀取狀態(tài)
  109.     SPI_RW(value);//寫入一字節(jié)
  110.     CSN=1;//
  111.     return status;//返回狀態(tài)
  112. }
  113. /*SPI讀一字節(jié)*/
  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寄存器數(shù)據(jù)*/
  124. /*reg:寄存器地址*/
  125. /*Dat_Buffer:用來存讀取的數(shù)據(jù)*/
  126. /*DLen:數(shù)據(jù)長度*/
  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);//寫入寄存器地址,同時狀態(tài)
  132.     for(i=0;i<Dlen;i++)
  133.     {
  134.         Dat_Buffer[i]=SPI_RW(0);//存儲數(shù)據(jù)
  135.     }
  136.     CSN=1;
  137.     return status;
  138. }
  139. /*SPI向TXFIFO寄存器寫入數(shù)據(jù)*/
  140. /*reg:寫入寄存器地址*/
  141. /*TX_Dat_Buffer:存放需要發(fā)送的數(shù)據(jù)*/
  142. /*Dlen:數(shù)據(jù)長度*/  
  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]);//發(fā)送數(shù)據(jù)
  151.     }
  152.     CSN=1;
  153.     return status;  
  154. }
  155. /*設(shè)置發(fā)送模式*/
  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);/*寫寄存器指令+接收節(jié)點地址+地址寬度*/
  160.     SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);/*為了接收設(shè)備應(yīng)答信號,接收通道0地址與發(fā)送地址相同*/
  161.     SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH);/*寫有效數(shù)據(jù)地址+有效數(shù)據(jù)+有效數(shù)據(jù)寬度*/
  162.     SPI_W_Reg(W_REGISTER+EN_AA,0x01);/*接收通道0自動應(yīng)答*/
  163.     SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);/*使能接收通道0*/
  164.     SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);/*自動重發(fā)延時250US+86US,重發(fā)10次*/
  165.     SPI_W_Reg(W_REGISTER+RF_CH,0);/*(2400+40)MHZ選擇射頻通道0X40*/
  166.     SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);/*1Mbps速率,發(fā)射功率:0DBM,低噪聲放大器增益*/
  167.     SPI_W_Reg(W_REGISTER+CONFIG,0x0e);/*發(fā)送模式,上電,16位CRC校驗,CRC使能*/
  168.     CE=1;//啟動發(fā)射
  169.     _delay_ms(5);/*CE高電平持續(xù)時間最少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. /*檢測應(yīng)答信號*/
  185. uchar Check_Ack(void)
  186. {
  187.     sta=SPI_R_byte(R_REGISTER+STATUS);/*讀取寄存狀態(tài)*/
  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);/*如果沒有這一句只能發(fā)一次數(shù)據(jù),大家要注意*/
  193.         CSN=1;
  194.         return 0;
  195.     }
  196.     else
  197.         return 1;
  198. }

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

  202. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
nrf24l01小車項目.zip (11.15 MB, 下載次數(shù): 293)


評分

參與人數(shù) 2黑幣 +56 收起 理由
菜用雞 + 6 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:164989 發(fā)表于 2017-5-24 12:30 | 只看該作者
PCB是遙控?zé)舻?......
回復(fù)

使用道具 舉報

板凳
ID:182522 發(fā)表于 2017-7-13 11:07 | 只看該作者
很好的資料 謝謝分享
回復(fù)

使用道具 舉報

地板
ID:110278 發(fā)表于 2017-8-4 13:42 | 只看該作者
感謝分享。。。。
回復(fù)

使用道具 舉報

5#
ID:79544 發(fā)表于 2017-11-5 15:04 | 只看該作者
送人玫瑰手留余香,感謝分享!
回復(fù)

使用道具 舉報

6#
ID:5322 發(fā)表于 2017-11-8 10:58 | 只看該作者
很好的資料,謝謝
回復(fù)

使用道具 舉報

7#
ID:312835 發(fā)表于 2018-5-25 10:10 | 只看該作者
打不開
回復(fù)

使用道具 舉報

8#
ID:148126 發(fā)表于 2018-10-27 17:07 | 只看該作者
你這個是2401嗎  分明是別人的資料好不好  我之前見過的  這是紅外遙控好不好   真不知道  你發(fā)這個東西時自己有沒有看過     hi有下面點贊的人是真懂還是假懂    不看看嗎
回復(fù)

使用道具 舉報

9#
ID:372154 發(fā)表于 2019-6-3 02:09 | 只看該作者
好資料,謝謝
回復(fù)

使用道具 舉報

10#
ID:318672 發(fā)表于 2019-6-24 15:40 來自觸屏版 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報

11#
ID:246783 發(fā)表于 2020-3-1 12:30 來自觸屏版 | 只看該作者
還不錯  
回復(fù)

使用道具 舉報

12#
ID:570401 發(fā)表于 2020-3-3 22:56 | 只看該作者
很好的資料 謝謝分享
回復(fù)

使用道具 舉報

13#
ID:614724 發(fā)表于 2020-6-14 13:33 來自觸屏版 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

14#
ID:521719 發(fā)表于 2020-10-5 18:14 | 只看該作者
ymhhmy 發(fā)表于 2017-5-24 12:30
PCB是遙控?zé)舻?......

感謝分享
回復(fù)

使用道具 舉報

15#
ID:553941 發(fā)表于 2020-12-8 14:03 | 只看該作者
霍特 發(fā)表于 2018-10-27 17:07
你這個是2401嗎  分明是別人的資料好不好  我之前見過的  這是紅外遙控好不好   真不知道  你發(fā)這個東西時 ...

我想問問。。你真看過嗎。紅外遙控用到SPI通信嗎。我特地下載看了一下,程序?qū)懙牟粡?fù)雜,但是確實是2401的程序
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表