找回密码
 立即注册

QQ登录

只需一步,快速开始

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

2.4G发射接收小车程序电路图+单片机代码

[复制链接]
跳转到指定楼层
楼主
这是一个用2.4无线模块控制的小车电路,实测10米之内无延时

电路原理图如下:


单片机源程序如下:
  1. /*-----------------------------------------------

  2.             独角兽电子产品
  3.         官方讨论群号:900 600 59

  4.   名称:NRF24L01无线遥控简易程序
  5.   内容:利用本店的遥控器,再碰上STC89C52RC就可以了
  6. ------------------------------------------------*/
  7. #include <reg52.h>
  8. #include <intrins.h>
  9. #define uint unsigned int
  10. #define uchar unsigned char

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

  65. sbit    LED     =P0^2;

  66. sbit IN1=P1^0;
  67. sbit IN2=P1^1;
  68. sbit IN3=P1^2;
  69. sbit IN4=P1^3;
  70. sbit IN5=P1^4;
  71. sbit IN6=P1^5;
  72. sbit IN7=P1^6;
  73. sbit IN8=P1^7;

  74. uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
  75. //uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  76. uchar RX_Buffer[RX_DATA_WITDH];

  77. void _delay_us(uint x)
  78. {
  79.     uint i,j;
  80.     for (j=0;j<x;j++)
  81.         for (i=0;i<12;i++);
  82. }

  83. void _delay_ms(uint x)
  84. {
  85.     uint i,j;
  86.     for (j=0;j<x;j++)
  87.         for (i=0;i<120;i++);
  88. }
  89. void nRF24L01_Init(void)
  90. {
  91.     _delay_us(2000);
  92.     CE=0;
  93.     CSN=1;
  94.     SCK=0;
  95.     IRQ=1;
  96. }

  97. uchar SPI_RW(uchar byte)
  98. {
  99.     uchar i;
  100.     for(i=0;i<8;i++)
  101.     {
  102.         if(byte&0x80)
  103.             MOSI=1;
  104.         else
  105.             MOSI=0;
  106.         byte<<=1;
  107.         SCK=1;
  108.         if(MISO)
  109.             byte|=0x01;
  110.         SCK=0;
  111.     }
  112.     return byte;
  113. }

  114. uchar SPI_W_Reg(uchar reg,uchar value)
  115. {
  116.     uchar status;
  117.     CSN=0;
  118.     status=SPI_RW(reg);
  119.     SPI_RW(value);
  120.     CSN=1;
  121.     return status;
  122. }

  123. uchar SPI_R_byte(uchar reg)
  124. {
  125.     uchar status;
  126.     CSN=0;
  127.     SPI_RW(reg);
  128.     status=SPI_RW(0);
  129.     CSN=1;
  130.     return status;
  131. }

  132. uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
  133. {
  134.     uchar reg_value,i;
  135.     CSN=0;
  136.     reg_value=SPI_RW(reg);
  137.     for(i=0;i<Dlen;i++)
  138.     {
  139.         Dat_Buffer[i]=SPI_RW(0);
  140.     }
  141.     CSN=1;
  142.     return reg_value;
  143. }

  144. uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
  145. {
  146.     uchar reg_value,i;
  147.     CSN=0;
  148.     reg_value=SPI_RW(reg);
  149.     for(i=0;i<Dlen;i++)
  150.     {
  151.         SPI_RW(TX_Dat_Buffer[i]);
  152.     }
  153.     CSN=1;
  154.     return reg_value;   
  155. }

  156. void nRF24L01_Set_RX_Mode(void)
  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);
  161.     SPI_W_Reg(W_REGISTER+EN_AA,0x01);//auot ack
  162.     SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);
  163.     SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);
  164.     SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);
  165.     SPI_W_Reg(W_REGISTER+RF_CH,0);
  166.     SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//0db,lna
  167.     SPI_W_Reg(W_REGISTER+CONFIG,0x0f);
  168.      
  169.     CE=1;
  170.     _delay_ms(5);
  171. }

  172. uchar nRF24L01_RX_Data(void)
  173. {
  174. //  uchar i,status;
  175.     sta=SPI_R_byte(R_REGISTER+STATUS);
  176.     if(RX_DR)
  177.     {
  178.         CE=0;
  179.         SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);
  180.     //  P3=RX_Buffer[0];
  181.         SPI_W_Reg(W_REGISTER+STATUS,0xff);
  182.         CSN=0;
  183.         SPI_RW(FLUSH_RX);
  184.         CSN=1;
  185.         return 1;
  186.     }
  187.     else
  188.         return 0;
  189.      
  190. }



  191. /********************************************/
  192. /* 函数功能:检测24L01是否存在              */
  193. /* 返回值;  0  存在                        */
  194. /*           1  不存在                      */
  195. /********************************************/
  196. uchar NRF24L01_Check(void)
  197. {
  198.         uchar check_in_buf[5]={0x11,0x22,0x33,0x44,0x55};
  199.         uchar check_out_buf[5]={0x00};

  200.         CE=0;

  201.         SPI_W_DBuffer(W_REGISTER+TX_ADDR, check_in_buf, 5);

  202.         SPI_R_DBuffer(R_REGISTER+TX_ADDR, check_out_buf, 5);

  203.         if((check_out_buf[0] == 0x11)&&\
  204.            (check_out_buf[1] == 0x22)&&\
  205.            (check_out_buf[2] == 0x33)&&\
  206.            (check_out_buf[3] == 0x44)&&\
  207.            (check_out_buf[4] == 0x55))return 0;
  208.         else return 1;
  209. }

  210. /********************************************
  211. **************定时器0**********/
  212. void InitTimer0()
  213. {
  214.     TMOD = 0x01;
  215.     TH0 = 0x0FC;
  216.     TL0 = 0x18;
  217.     EA = 1;
  218.     ET0 = 1;
  219.     TR0 = 1;
  220. }

  221. uchar a=0,b=0;
  222. //************************************主函数************************************************************   
  223. void main(void)
  224. {
  225.     nRF24L01_Init();
  226.         while(NRF24L01_Check());
  227.         LED=0;
  228.         _delay_ms(100);
  229.         LED=1;
  230.         _delay_ms(100);
  231.         LED=0;
  232.         _delay_ms(100);
  233.         LED=1;
  234.         _delay_ms(100);
  235.         nRF24L01_Set_RX_Mode();
  236.         InitTimer0();
  237.     while(1)
  238.     {
  239.         if(nRF24L01_RX_Data())
  240.                   CE=1;
  241.     }
  242. }

  243. void Timer0Interrupt() interrupt 1
  244. {
  245.     TH0 =(65535-1000)/256;
  246.     TL0 =(65535-1000)%256;
  247.     a++;
  248.         b++;

  249.         if(RX_Buffer[3]==1&&RX_Buffer[4]==1)         //前进
  250.         {
  251.           IN2=0;
  252.           IN4=0;
  253.           IN6=0;
  254.           IN8=0;
  255.           if(a==RX_Buffer[1]+1){IN1=0;IN3=0;IN5=0;IN7=0;}//
  256.           if(a==16){IN1=1;IN3=1;IN5=1;IN7=1;}
  257.         }
  258.         else if(RX_Buffer[3]==3&&RX_Buffer[4]==3)    //后退
  259.         {
  260.           IN1=0;  
  261.           IN3=0;
  262.           IN5=0;
  263.           IN7=0;
  264.           if(a==RX_Buffer[1]+1){IN2=0;IN4=0;IN6=0;IN8=0;}//
  265.           if(a==16){IN2=1;IN4=1;IN6=1;IN8=1;}
  266.         }
  267.         else if((RX_Buffer[3]==2&&RX_Buffer[4]==1)||(RX_Buffer[3]==2&&RX_Buffer[4]==3))//左前转
  268.         {
  269.           IN1=0;
  270.           IN2=0;
  271.           IN3=0;
  272.           IN4=0;
  273.           IN6=0;
  274.           IN8=0;
  275.           if(a==RX_Buffer[2]+1){IN5=0;IN7=0;}//          
  276.           if(a==16){IN5=1;IN7=1;}                //         
  277.         }


  278. /*        else if(RX_Buffer[3]==2&&RX_Buffer[4]==1)//左前转
  279.         {
  280.           IN1=0;
  281.           IN2=0;
  282.           IN3=0;
  283.           IN4=0;
  284.           IN6=0;
  285.           IN8=0;
  286.           if(a==RX_Buffer[2]+1){IN5=0;IN7=0;}//          
  287.           if(a==16){IN5=1;IN7=1;}                //         
  288.         }
  289.         else if(RX_Buffer[3]==2&&RX_Buffer[4]==3)//左后转
  290.         {
  291.           IN1=0;
  292.           IN2=0;
  293.           IN3=0;
  294.           IN4=0;
  295.           IN5=0;
  296.           IN7=0;
  297.           if(a==RX_Buffer[2]+1){IN6=0;IN8=0;}//       
  298.           if(a==16){IN6=1;IN8=1;}                //         
  299.         }*/
  300.         else if((RX_Buffer[3]==1&&RX_Buffer[4]==2)||(RX_Buffer[3]==3&&RX_Buffer[4]==2))//右前转
  301.         {
  302.           IN2=0;
  303.           IN4=0;
  304.           IN5=0;
  305.           IN6=0;
  306.           IN7=0;
  307.           IN8=0;
  308.           if(a==RX_Buffer[1]+1){IN1=0;IN3=0;}//          
  309.           if(a==16){IN1=1;IN3=1;}                //         
  310.         }       
  311.        
  312.                                     
  313. /*        else if(RX_Buffer[3]==1&&RX_Buffer[4]==2)//右前转
  314.         {
  315.           IN2=0;
  316.           IN4=0;
  317.           IN5=0;
  318.           IN6=0;
  319.           IN7=0;
  320.           IN8=0;
  321.           if(a==RX_Buffer[1]+1){IN1=0;IN3=0;}//          
  322.           if(a==16){IN1=1;IN3=1;}                //         
  323.         }
  324.         else if(RX_Buffer[3]==3&&RX_Buffer[4]==2)//右后转
  325.         {
  326.           IN1=0;
  327.           IN3=0;
  328.           IN5=0;
  329.           IN6=0;
  330.           IN7=0;
  331.           IN8=0;
  332.           if(a==RX_Buffer[1]+1){IN2=0;IN4=0;}//       
  333.           if(a==16){IN2=1;IN4=1;}                //         
  334.         }*/                            

  335.         else if(RX_Buffer[3]==1&&RX_Buffer[4]==3)//原地顺时针打转
  336.         {
  337.           IN2=0;
  338.           IN4=0;
  339.           IN5=0;
  340.           IN7=0;
  341.           if(a==RX_Buffer[1]+1){IN6=0;IN8=0;}//
  342.           if(a==16){IN6=1;IN8=1;}
  343.           if(b==RX_Buffer[2]+1){IN1=0;IN3=0;}
  344.           if(b==16){IN1=1;IN3=1;}               
  345.         }else
  346.         {
  347.    IN1=0;   
  348.    IN2=0;
  349.    IN3=0;      
  350.    IN4=0;
  351.    IN5=0;   
  352.    IN6=0;
  353.    IN7=0;      
  354.    IN8=0;
  355.         }
  356.         if(a==16)a=0;
  357.         if(b==16)b=0;
  358. }  
复制代码

所有资料51hei提供下载:
2.4G发射接收小车程序电路图.rar (154.83 KB, 下载次数: 57)


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

使用道具 举报

沙发
ID:597505 发表于 2019-8-8 16:39 | 只看该作者
根本不全的, 就是一广告.
回复

使用道具 举报

板凳
ID:634862 发表于 2019-11-25 23:46 | 只看该作者
无线不都应该有发射和接受程序不同的代码呀,怎么只有发射呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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