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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3970|回復: 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, 下載次數: 58)


分享到:  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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天堂资源最新在线 | 日批免费观看 | 亚洲精品中文字幕中文字幕 | 久久久.com| 欧美a级成人淫片免费看 | 天天欧美 | 欧美日韩中 | 精品国产乱码久久久久久丨区2区 | www.午夜 | 久久新 | 色偷偷噜噜噜亚洲男人 | 国产高清视频 | aa级毛片毛片免费观看久 | 午夜色婷婷 | 国产精品视频久久久 | av香港经典三级级 在线 | 国产a区| 人人九九精| 亚洲精品一区二区三区蜜桃久 | 欧美视频第三页 | 亚洲一二三区精品 | 日本天堂视频在线观看 | 夜夜骚 | av激情在线 | 欧美高清成人 | 亚洲精品视频在线播放 | 91精品久久久久久久久中文字幕 | 国产视频h| 亚洲日本欧美日韩高观看 | 国产成人网 | 久久久久久久国产精品影院 | 伊人热久久 | 91国在线高清视频 | 一区二区激情 | 日韩精品一区二区三区四区 | 成人免费在线小视频 | 丝袜 亚洲 另类 欧美 综合 | 精品国产18久久久久久二百 | 亚洲一区二区av | 国产99久久精品 | 久久国产美女视频 |