找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 34261|回复: 22
收起左侧

开源12通道2.4G遥控制作-接收机

  [复制链接]
ID:203249 发表于 2017-5-21 20:36 | 显示全部楼层 |阅读模式
首先感谢开源大神萝莉,感谢开源精神,感谢大学。

友情提示,本教程必须有单片机基础,2.4G遥控基础(至少用过这类遥控)才可以操作。


7个模拟通道,5个开关通道


1-)准备材料
                        keil编译软件
                        stc-isp烧录软件
                        接收机的源码链接: https://pan.baidu.com/s/1pKPC9nX 密码: eaz2
                        usb转ttl下载器(那个宝上面随便搜的)
                         1493445289_452286.png
                        
2-)电路制作材料
                               材料清单:
                               10*10cm孔洞洞板;
                               STC12C5608AD 单片机;
                               12M晶振,30P电容*2;
                               电源电容470uf,无线模块电容大于等于47uf,104电容;
                               发光二极管,1K欧电阻;
                               NRF24L01模块;
                               3.3V稳压芯片;
                               1493446108_212076.png
                               下面那块是从这里裁剪出来的
                               1493445830_593546.png
3-)电路图
                   链接: https://pan.baidu.com/s/1bC5NtW 密码: u3mn

4-)做好的样子(有条件的话可以去打印pcb板)
                           1493447205_90195.png
                           1493447215_898265.png
                           1493447225_650292.png         
5-)下载程序  (下载程序可以焊好晶振后就烧写,这样避免后面焊好下载不了程序的尴尬)   
                            使用keil编译器编译出hex文件
                            用usb转ttl下载器连接做好的板子
                            用stc-isp软件烧写hex文件到板子
                           注意下载的时候不要选择使用内部晶振时钟
6-)注意事项
                        这样子装无线模块是错误的,因为天线下面就是电路,干扰很强,可以使用外置天线解决
                         1493448363_99624.png
                         1493448479_621266.png
                         1493448756_355916.png

如果是新制作的接收机,那么第一次开机就是等待对频状态;
使用金属物品,将接收机5/6通道相互连通在一起(就是把单片机5/6通的引脚短接),然后通电,也可以重新对频;
*如何判断等待对频状态:上电后LED直接高亮;
*如何判断已经对过频:上电时LED灯会闪一下再熄灭。如果此时遥控没有开机,2秒后会再亮;
*如何判断故障状态:上电时LED灯会快速闪烁。可能是无线模块接线不良或电源不稳;
*确认进入等待对频状态,遥控器选择对频,屏幕会显示通信成功。
*如果很长时间不能成功,那么不要折腾怎么对频了、对频怎么这么麻烦、到底怎么对频……(*>﹏<*),这是电路出现问题,检查电路吧。

单片机源程序如下:
  1. #include
  2. #define u8 unsigned char
  3. #define u16 unsigned int

  4. //15系列新增寄存器
  5. sfr IAP_DATA=0xc2;
  6. sfr IAP_ADDRH=0xc3;
  7. sfr IAP_ADDRL=0xc4;
  8. sfr IAP_CMD=0xc5;
  9. sfr IAP_TRIG=0xc6;
  10. sfr IAP_CONTR=0xc7;

  11. sfr AUXR=0x8e;
  12. sfr T2H=0xd6;
  13. sfr T2L=0xd7;
  14. sfr IE2=0xaf;
  15. sfr P1ASF=0x9d;
  16. sfr ADC_CONTR=0xbc;
  17. sfr ADC_RES=0xbd;
  18. sfr ADC_RESL=0xbe;

  19. sfr P5=0xc8;
  20. sfr P0M0=0x94;
  21. sfr P1M0=0x92;
  22. sfr P2M0=0x96;
  23. sfr P3M0=0xb2;
  24. sfr P4M0=0xb4;
  25. sfr P1M1=0x91;

  26. sfr P_SW1   = 0xA2;             //外设功能切换寄存器1
  27. sfr CMOD=0xd9;
  28. sfr CCON=0xd8;
  29. sfr CCAPM1=0xdb;
  30. sfr CCAPM2=0xdc;
  31. sfr CCAP1L=0xeb;
  32. sfr CCAP2L=0xec;
  33. sfr CCAP1H=0xfb;
  34. sfr CCAP2H=0xfc;
  35. sfr CL=0xe9;
  36. sfr CH=0xf9;
  37. sfr PCA_PWM1=0xf3;
  38. sfr PCA_PWM2=0xf4;



  39. /**************************************************************************/
  40. //引脚定义
  41. sbit LED=P1^0;        //定义指示灯

  42. sbit CH1=P3^7;        //定义6个通道输出
  43. sbit CH2=P3^6;
  44. sbit CH3=P3^3;
  45. sbit CH4=P3^2;
  46. sbit CH5=P3^1;
  47. sbit CH6=P3^0;

  48. sbit MDO=P1^5;        //定义无线模块的管脚
  49. sbit SCK=P5^4;
  50. sbit CE=P5^5;
  51. sbit IRQ=P1^4;
  52. sbit MDI=P1^3;
  53. sbit CSN=P1^2;





  54. /**************************************************************************/

  55. u8 code random[100]={4,1,3,2,2,1,0,0,2,2,2,3,4,1,2,1,4,3,3,4,//随机跳频序列
  56.                                                                                  2,0,2,2,3,1,2,3,2,2,2,4,2,4,0,3,4,2,3,1,
  57.                                                                                  0,3,1,3,3,0,2,0,4,3,3,3,3,3,4,1,1,4,3,0,
  58.                            1,0,3,2,3,2,3,3,4,4,1,3,0,0,3,1,3,3,3,0,
  59.                            3,3,4,1,2,4,1,3,0,1,3,4,4,3,2,3,1,2,3,3};



  60.                                                                                        

  61. //无线通信
  62. u8 rx[11];                //接收的11字节数据
  63. u8 tx[11];
  64. u8 m;
  65. u8 hopping_turn,hopping_num,hopping_count;

  66. u8 address[5]={0xe7,0xe7,0xe7,0xe7,0xe7};
  67. u8 code address_0[5]={'L','O','V','E','!'};//使用LOVE作为对频暗语

  68. u8 hopping[5]={10,35,60,85,110};
  69. bit first,restar;
  70. bit connecting,lose;
  71. bit jump_1,jump_2,jump_mode;

  72. u8 NRF_error;


  73. u8 TX_power=3;



  74. //通道输出
  75. u16 timer1,timer2,timer3;
  76. u8 rx_num,receive;
  77. bit LED_flash;
  78. bit out_control_change;
  79. u16 idata out_control_data[8];

  80. u16 CH_data[8]={0,1024,0,1024,0,1024};
  81. u16 data buff[8];
  82. u16 temp1,temp2;
  83. u8 t_output;



  84. //电压检测
  85. u8 t_adc;
  86. u16 adc1,adc2;
  87. u16 voltage_bec,voltage_total;


  88. /**************************************************************************/
  89. //延时函数
  90. void Delay1ms()                //@12.000MHz
  91. {
  92.         unsigned char i, j;
  93.         i = 12;
  94.         j = 168;
  95.         do
  96.         {
  97.                 while (--j);
  98.         } while (--i);
  99. }

  100. void delay_ms(u8 i)
  101. {
  102.         while(i--)
  103.         Delay1ms();
  104. }

  105. /**************************************************************************/
  106. //ROM存储
  107. u8 EEPROM_read(u8 address)
  108. {
  109.         IAP_CMD=0x01;
  110.         IAP_ADDRH=0;
  111.         IAP_ADDRL=address;
  112.         IAP_TRIG=0x5a;                        
  113.         IAP_TRIG=0xa5;
  114.         return IAP_DATA;
  115. }

  116. void EEPROM_write(u8 address,u8 byte)
  117. {
  118.         IAP_CMD=0x02;
  119.         IAP_DATA=byte;
  120.         IAP_ADDRH=0;
  121.         IAP_ADDRL=address;
  122.         IAP_TRIG=0x5a;
  123.         IAP_TRIG=0xa5;
  124.         
  125. }

  126. void EEPROM_clean(u8 address)
  127. {
  128.         IAP_CMD=0x03;
  129.         IAP_ADDRH=0;
  130.         IAP_ADDRL=address;
  131.         IAP_TRIG=0x5a;
  132.         IAP_TRIG=0xa5;
  133. }

  134. void DATA_read()
  135. {
  136.         IAP_CONTR=0x82;
  137.         if((EEPROM_read(0)!=0xe4)||(EEPROM_read(1)!=0xa5))         
  138.         {
  139.            first=1;

  140.         }
  141.         else
  142.         {
  143.           hopping[0]=EEPROM_read(2);
  144.                 hopping[1]=EEPROM_read(3);
  145.                 hopping[2]=EEPROM_read(4);
  146.                 hopping[3]=EEPROM_read(5);
  147.                 hopping[4]=EEPROM_read(6);
  148.                 address[0]=EEPROM_read(7);
  149.                 address[1]=EEPROM_read(8);
  150.                 address[2]=EEPROM_read(9);
  151.                 address[3]=EEPROM_read(10);
  152.                 address[4]=EEPROM_read(11);
  153.         }
  154.         
  155.         if((EEPROM_read(12)!=0xe4)||(EEPROM_read(13)!=0xa5))         
  156.         {
  157.           out_control_data[0]=512;
  158.                 out_control_data[1]=512;
  159.                 out_control_data[2]=80;
  160.                 out_control_data[3]=512;
  161.                 out_control_data[4]=512;
  162.                 out_control_data[5]=512;
  163.                 out_control_data[6]=512;
  164.                 out_control_data[7]=512;

  165.         }
  166.         else
  167.         {
  168.                
  169.                 out_control_data[0]=EEPROM_read(14);
  170.                 out_control_data[0]<<=8;
  171.                 out_control_data[0]+=EEPROM_read(15);
  172.                 out_control_data[1]=EEPROM_read(16);
  173.                 out_control_data[1]<<=8;
  174.                 out_control_data[1]+=EEPROM_read(17);
  175.                 out_control_data[2]=EEPROM_read(18);
  176.                 out_control_data[2]<<=8;
  177.                 out_control_data[2]+=EEPROM_read(19);
  178.                 out_control_data[3]=EEPROM_read(20);
  179.                 out_control_data[3]<<=8;
  180.                 out_control_data[3]+=EEPROM_read(21);
  181.                 out_control_data[4]=EEPROM_read(22);
  182.                 out_control_data[4]<<=8;
  183.                 out_control_data[4]+=EEPROM_read(23);
  184.                 out_control_data[5]=EEPROM_read(24);
  185.                 out_control_data[5]<<=8;
  186.                 out_control_data[5]+=EEPROM_read(25);
  187.                 out_control_data[6]=EEPROM_read(26);
  188.                 out_control_data[6]<<=8;
  189.                 out_control_data[6]+=EEPROM_read(27);
  190.                 out_control_data[7]=EEPROM_read(28);
  191.                 out_control_data[7]<<=8;
  192.                 out_control_data[7]+=EEPROM_read(29);

  193.         }
  194.         

  195.         IAP_CONTR=0;
  196. }
  197. void DATA_save()
  198. {
  199.         IAP_CONTR=0x82;
  200.                 EEPROM_clean(0);
  201.                 EEPROM_write(0,0xe4);
  202.                 EEPROM_write(1,0xa5);
  203.                 EEPROM_write(2,hopping[0]);
  204.                 EEPROM_write(3,hopping[1]);
  205.                 EEPROM_write(4,hopping[2]);
  206.                 EEPROM_write(5,hopping[3]);
  207.                 EEPROM_write(6,hopping[4]);
  208.                 EEPROM_write(7,address[0]);
  209.                 EEPROM_write(8,address[1]);
  210.                 EEPROM_write(9,address[2]);
  211.                 EEPROM_write(10,address[3]);
  212.                 EEPROM_write(11,address[4]);
  213.         
  214.                 if(out_control_change)
  215.                 {
  216.                         EEPROM_write(12,0xe4);
  217.                         EEPROM_write(13,0xa5);
  218.                
  219.                         EEPROM_write(14,out_control_data[0]>>8);
  220.                         EEPROM_write(15,out_control_data[0]);
  221.                         EEPROM_write(16,out_control_data[1]>>8);
  222.                         EEPROM_write(17,out_control_data[1]);
  223.                         EEPROM_write(18,out_control_data[2]>>8);
  224.                         EEPROM_write(19,out_control_data[2]);
  225.                         EEPROM_write(20,out_control_data[3]>>8);
  226.                         EEPROM_write(21,out_control_data[3]);
  227.                         EEPROM_write(22,out_control_data[4]>>8);
  228.                         EEPROM_write(23,out_control_data[4]);
  229.                         EEPROM_write(24,out_control_data[5]>>8);
  230.                         EEPROM_write(25,out_control_data[5]);
  231.                         EEPROM_write(26,out_control_data[6]>>8);
  232.                         EEPROM_write(27,out_control_data[6]);
  233.                         EEPROM_write(28,out_control_data[7]>>8);
  234.                         EEPROM_write(29,out_control_data[7]);
  235.                 }
  236.         
  237.                
  238.                
  239.         
  240.         
  241.         
  242.                 IAP_CONTR=0;
  243. }
  244. /**************************************************************************/
  245. //NRF24L01
  246. u8 SPI(u8 byte)
  247. {
  248.         u8 i;
  249.         for(i=0;i<8;i++)
  250.         {
  251.                 MDI=(byte&0x80);
  252.                 SCK=1;
  253.                 byte<<=1;
  254.                 byte|=MDO;
  255.                 SCK=0;
  256.         }
  257.         return byte;
  258. }

  259. void REG_write(u8 address,u8 command)
  260. {
  261.         CSN=0;
  262.         SPI(0x20+address);
  263.         SPI(command);
  264.         CSN=1;
  265. }

  266. void FIFO_write(u8 DATA_OUT[],u8 lengh)
  267. {
  268.         u8 i;
  269.         CSN=0;
  270.         SPI(0xa0);
  271.         for(i=0;i<lengh;i++)
  272.         SPI(DATA_OUT[i]);
  273.         CSN=1;
  274. }
  275. void FIFO_read(u8 DATA_IN[],u8 lengh)                //读取接收数据缓冲区
  276. {
  277.         u8 i;
  278.         CSN=0;
  279.         SPI(0x61);        //读取命令
  280.         for(i=0;i<lengh;i++)
  281.         DATA_IN[i]=SPI(0);           
  282.         CSN=1;
  283. }

  284. void TX_address(u8 DATA_IN[])
  285. {
  286.         CSN=0;                 
  287.         SPI(0x20+0x10);
  288.         SPI(DATA_IN[0]);
  289.         SPI(DATA_IN[1]);
  290.         SPI(DATA_IN[2]);
  291.         SPI(DATA_IN[3]);
  292.         SPI(DATA_IN[4]);
  293.         CSN=1;  
  294. }  
  295. void RX_address(u8 DATA_IN[])
  296. {
  297.         CSN=0;                 
  298.         SPI(0x20+0x0a);
  299.         SPI(DATA_IN[0]);
  300.         SPI(DATA_IN[1]);
  301.         SPI(DATA_IN[2]);
  302.         SPI(DATA_IN[3]);
  303.         SPI(DATA_IN[4]);
  304.         CSN=1;  
  305. }
  306. void RX_mode()                                 
  307. {
  308.         CE=0;
  309.         REG_write(0x00,0x3b); //CRC,8 bit,Power on,RX
  310.         CE=1;
  311. }                                    
  312.         
  313. void TX_mode()                                 
  314. {
  315.         CE=0;
  316.         REG_write(0x00,0x0a);
  317.   CE=1;
  318. }

  319. void  NRF_power(u8 P)                                //发射功率设置 250k
  320. {                                                                                                               
  321.         CE=0;
  322.         if(P==3)REG_write(0x06,0x27);                  //0db 修正之前注释错误
  323.         else if(P==2)REG_write(0x06,0x25);          //-6db
  324.         else if(P==1)REG_write(0x06,0x23);          //-12db
  325.         else if(P==0)REG_write(0x06,0x21);    //-18db
  326.         CE=1;
  327. }

  328. void NRF_size(u8 l)
  329. {
  330.         CE=0;
  331.         REG_write(0x11,l);  
  332.         CE=1;
  333. }

  334. void NRF_channel(u8 c)
  335. {
  336.         CE=0;
  337.         REG_write(0x05,c);  
  338.         CE=1;
  339. }


  340. void NRF_init()
  341. {        
  342.         CE=0;
  343.         SCK=0;
  344.         REG_write(0x01,0x00); //禁止 自动应答
  345.         REG_write(0x02,0x01); //允许 P0信道
  346.         REG_write(0x04,0x00); //禁止 自动重发
  347.         RX_mode();                          
  348.         NRF_channel(66);
  349.         NRF_power(TX_power);
  350.         NRF_size(11);
  351.         RX_address(address);
  352.         TX_address(address);
  353. }

  354. void NRF_test()        //无线模块终极测试
  355. {        
  356.         u8 reset_err=0;
  357.         CE=0;
  358.         SCK=0;
  359.         CSN=0;
  360.         
  361.         if(SPI(0x20)!=0x0e){reset_err=1;}
  362.         SPI(0x0a);

  363.         CSN=1;

  364.         CSN=0;
  365.         SPI(0x00);

  366.         if(SPI(0x00)!=0x0a){NRF_error|=0x02;}//MOSI bad
  367.         CSN=1;

  368.         REG_write(0x01,0x00);
  369.         REG_write(0x04,0x00);
  370.         REG_write(0x11,1);
  371.         
  372.         FIFO_write(tx,1);
  373.         CE=1;

  374.         delay_ms(2);
  375.         
  376.         CSN=0;

  377.         if(SPI(0x00)!=0x2e){NRF_error|=0x04;}//CE bad
  378.         CSN=1;
  379.                
  380.         if(IRQ)NRF_error|=0x18;        //IRQ bad
  381.         else
  382.         {
  383.                 if(NRF_error&0x04==0)NRF_error|=0x10;                //MISO bad
  384.         }
  385.         CE=1;
  386.         
  387.         if(reset_err&&NRF_error>1)NRF_error|=0x01;//CSN,CLK bad
  388.         
  389.         REG_write(0x07,0x20);        //清除TX中断信号
  390. }

  391. /**************************************************************************/

  392. void data_check(int x,int max,int min)
  393. {
  394.         
  395.         if(x>max)x=max;
  396.         if(x<min)x=min;

  397. }

  398. void initial()
  399. {        
  400.         u8 t;
  401.         
  402.         CH5=0;                        //如果CH5与CH6被短接,重新对码
  403.         Delay1ms();
  404.         if(CH6==0)                  //修正通道6插上舵机不能用
  405.         {
  406.                 P3M0=0x02;          //插上舵机也会使CH6为0,所以将CH5设为推挽
  407.                 CH5=1;
  408.                 Delay1ms();
  409.                 if(CH6)restar=1;   //如果CH6被拉高,说明5/6通道短接,启动重新对码
  410.         }
  411.                  
  412.         LED=0;                //点亮指示灯再关闭,表示单片机正常工作
  413.         delay_ms(100);
  414.         P3M0=0xcf;         //四通接收机实际上是6通。
  415.         P1M1=0x02;        //将6通道输出IO口配置为大电流推挽模式,保证正常驱动电调与舵机
  416.         TMOD=0x01;        //允许两个定时器中断        
  417.         
  418.         if(restar)first=1;
  419.         DATA_read();
  420.         data_check(out_control_data[0],1023,0);
  421.         data_check(out_control_data[1],1023,0);
  422.         data_check(out_control_data[2],1023,0);
  423.         data_check(out_control_data[3],1023,0);
  424.         data_check(out_control_data[4],1023,0);
  425.         data_check(out_control_data[5],1023,0);
  426.         data_check(out_control_data[6],1023,0);
  427.         data_check(out_control_data[7],1023,0);
  428.         

  429.         NRF_test();
  430.         if(NRF_error)
  431.         {
  432.                 t=10;
  433.                 while(t)
  434.                 {
  435.                         LED=0;                //模块错误闪灯
  436.                         delay_ms(50);
  437.                         LED=1;                //模块错误闪灯
  438.                         delay_ms(50);
  439.                         t--;
  440.                 }
  441.         }
  442.         
  443.         NRF_init();

  444.         

  445.         
  446.         if(first)
  447.         {
  448.                 NRF_power(0);
  449.                 NRF_channel(33);
  450.                 TX_address(address_0);
  451.                 RX_address(address_0);
  452.                 while(IRQ);
  453.                 FIFO_read(rx,11);                //读取接收数据
  454.                 CE=0;
  455.                 REG_write(0x07,0x40);        //清除无线模块中断信号
  456.                 CE=1;
  457.                 if(rx[0]==0xa0)
  458.                 {
  459.                         hopping[0]=rx[1];
  460.                         hopping[1]=rx[2];
  461.                         hopping[2]=rx[3];
  462.                         hopping[3]=rx[4];
  463.                         hopping[4]=rx[5];
  464.                         address[0]=rx[6];
  465.                         address[1]=rx[7];
  466.                         address[2]=rx[8];
  467.                         address[3]=rx[9];
  468.                         address[4]=rx[10];
  469.                 }
  470.                
  471.                 tx[0]='O',tx[1]='K';
  472.                 connecting=1;
  473.                 while(connecting)
  474.                 {
  475.                         TX_mode();               
  476.                         NRF_channel(33);
  477.                         TX_address(address_0);
  478.                         RX_address(address_0);
  479.                         FIFO_write(tx,11);
  480.                         Delay1ms();
  481.                         
  482.                         RX_mode();
  483.                         NRF_channel(hopping[0]);
  484.                         TX_address(address);
  485.                         RX_address(address);
  486.                         while(1)
  487.                         {
  488.                                 Delay1ms();
  489.                                 if(IRQ==0)
  490.                                 {
  491.                                         FIFO_read(rx,11);                //读取接收数据
  492.                                         CE=0;
  493.                                         REG_write(0x07,0x40);        //清除无线模块中断信号
  494.                                         CE=1;         
  495.                                         connecting=0;break;
  496.                                 }
  497.                                 t++;if(t>100){t=0;break;}
  498.                         }                          
  499.                 }
  500.                         DATA_save();
  501.         RX_address(address);
  502.         TX_address(address);
  503.         NRF_power(3);
  504.         }
  505.         
  506. }

  507.                                                                                                                                              

  508. main()
  509. {        
  510.         delay_ms(200);delay_ms(200);//开机延时以避过电源波动
  511.         
  512.         initial();
  513.         ADC_CONTR=0x80;                 //ADC配置

  514.                   
  515.         IP=0x02;
  516.         IE=0x82;
  517.         IE2=0x04;
  518.         
  519.         T2L=0x47,T2H=0xf4;
  520.         AUXR=0x10;           //打开定时器2,开始统计信号

  521.         
  522.         NRF_channel(hopping[0]);
  523.         
  524.         
  525.         while(IRQ);
  526.         TR0=1;
  527.         lose=1;
  528.         LED=1;
  529.         while(1)
  530.         {        
  531.                 while(IRQ&lose);
  532.                 if(lose)
  533.                 {        
  534.                         jump_1=0;jump_2=0;hopping_count=0;//收到有效信号后刷新跳频器
  535.                         receive++;timer1=0;timer3=0;m=0;               
  536.                         
  537.                         FIFO_read(rx,11);                //读取接收数据
  538.                         CE=0;
  539.                         REG_write(0x07,0x40);        //清除无线模块中断信号
  540.                         CE=1;
  541.                         
  542.                         TX_mode();
  543.                         tx[0]=rx_num;
  544.                         voltage_bec=32385/adc1;
  545.                         tx[1]=voltage_bec>>8;
  546.                         tx[2]=voltage_bec;
  547.                         voltage_total=(long)adc2*voltage_bec*3/1024;
  548.                         tx[3]=voltage_total>>8;
  549.                         tx[4]=voltage_total;
  550.                         
  551.                         FIFO_write(tx,11);
  552.                         Delay1ms();

  553.                         RX_mode();
  554.                                                 
  555.                         if(jump_mode)
  556.                         {
  557.                                 jump_mode=0;
  558.                                 hopping_turn=random[hopping_num];
  559.                         }
  560.                         hopping_turn++;
  561.                         if(hopping_turn>4)hopping_turn=0;
  562.                         NRF_channel(hopping[hopping_turn]);
  563.                         



  564.                         if(rx[0]==0xa0)
  565.                         {
  566.                                 LED_flash=1,LED=0;
  567.                                 buff[0]=rx[1];
  568.                                 buff[0]<<=2;
  569.                                 buff[0]+=rx[2]>>6;
  570.                                 buff[1]=rx[2]&0x3f;
  571.                                 buff[1]<<=4;
  572.                                 buff[1]+=rx[3]>>4;                        
  573.                                 buff[2]=rx[3]&0x0f;
  574.                                 buff[2]<<=6;
  575.                                 buff[2]+=rx[4]>>2;
  576.                                 buff[3]=rx[4]&0x03;
  577.                                 buff[3]<<=8;
  578.                                 buff[3]+=rx[5];

  579.                                 buff[4]=rx[6];
  580.                                 buff[4]<<=2;
  581.                                 buff[4]+=rx[7]>>6;
  582.                                 buff[5]=rx[7]&0x3f;
  583.                                 buff[5]<<=4;
  584.                                 buff[5]+=rx[8]>>4;                        
  585.                                 buff[6]=rx[8]&0x0f;
  586.                                 buff[6]<<=6;
  587.                                 buff[6]+=rx[9]>>2;
  588.                                 buff[7]=rx[9]&0x03;
  589.                                 buff[7]<<=8;
  590.                                 buff[7]+=rx[10];
  591.                                 
  592.                                 
  593.                                 data_check(buff[0],1023,0);
  594.                                 data_check(buff[1],1023,0);
  595.                                 data_check(buff[2],1023,0);
  596.                                 data_check(buff[3],1023,0);
  597.                                 data_check(buff[4],1023,0);
  598.                                 data_check(buff[5],1023,0);
  599.                                 data_check(buff[6],1023,0);
  600.                                 data_check(buff[7],1023,0);
  601.                                 
  602.                                 out_control_data[0]=buff[0];
  603.                                 out_control_data[1]=buff[1];
  604.                                 out_control_data[2]=buff[2];
  605.                                 out_control_data[3]=buff[3];
  606.                                 out_control_data[4]=buff[4];
  607.                                 out_control_data[5]=buff[5];
  608.                                 out_control_data[6]=buff[6];
  609.                                 out_control_data[7]=buff[7];
  610.                                 
  611.                                 out_control_change=1;
  612.                                 DATA_save();
  613.                                 out_control_change=0;
  614.                                 
  615.                         }
  616.                         else if(rx[0]==0xa1)
  617.                         {
  618.                                 buff[0]=rx[1];
  619.                                 buff[0]<<=2;
  620.                                 buff[0]+=rx[2]>>6;
  621.                                 buff[1]=rx[2]&0x3f;
  622.                                 buff[1]<<=4;
  623.                                 buff[1]+=rx[3]>>4;                        
  624.                                 buff[2]=rx[3]&0x0f;
  625.                                 buff[2]<<=6;
  626.                                 buff[2]+=rx[4]>>2;
  627.                                 buff[3]=rx[4]&0x03;
  628.                                 buff[3]<<=8;
  629.                                 buff[3]+=rx[5];

  630.                                 buff[4]=rx[6];
  631.                                 buff[4]<<=2;
  632.                                 buff[4]+=rx[7]>>6;
  633.                                 buff[5]=rx[7]&0x3f;
  634.                                 buff[5]<<=4;
  635.                                 buff[5]+=rx[8]>>4;                        
  636.                                 buff[6]=rx[8]&0x0f;
  637.                                 buff[6]<<=6;
  638.                                 buff[6]+=rx[9]>>2;
  639.                                 buff[7]=rx[9]&0x03;
  640.                                 buff[7]<<=8;
  641.                                 buff[7]+=rx[10];
  642.                                 
  643.                                 
  644.                                 data_check(buff[0],1023,0);
  645.                                 data_check(buff[1],1023,0);
  646.                                 data_check(buff[2],1023,0);
  647.                                 data_check(buff[3],1023,0);
  648.                                 data_check(buff[4],1023,0);
  649.                                 data_check(buff[5],1023,0);
  650.                                 data_check(buff[6],1023,0);
  651.                                 data_check(buff[7],1023,0);
  652.                                 
  653.                                 CH_data[0]=buff[0];
  654.                                 CH_data[1]=buff[1];
  655.                                 CH_data[2]=buff[2];
  656.                                 CH_data[3]=buff[3];
  657.                                 CH_data[4]=buff[4];
  658.                                 CH_data[5]=buff[5];
  659.                                 CH_data[6]=buff[6];
  660.                                 CH_data[7]=buff[7];                                
  661.                         }
  662.                         
  663.                         


  664.                 }
  665.                 else
  666.                 {
  667.                          hopping_count++;
  668.                         if(hopping_count>5)jump_mode=1;
  669.                         
  670.                         if(jump_mode)
  671.                         {
  672.                                 hopping_num++;
  673.                                 if(hopping_num>99)hopping_num=0;
  674.                                 NRF_channel(hopping[random[hopping_num]]);
  675.                                 lose=1;
  676.                         }
  677.                         else
  678.                         {
  679.                                 hopping_turn++;
  680.                                 if(hopping_turn>4)hopping_turn=0;
  681.                                 NRF_channel(hopping[hopping_turn]);
  682.                                 lose=1;
  683.                         }
  684.                         
  685.                 }
  686.                
  687.         }
  688.         
  689. }


  690. void et0()interrupt 1                //定时器0用作信号输出        
  691. {
  692. TR0=0;
  693.         t_output++;
  694.         switch(t_output)
  695.         {
  696.                
  697.                 case 1:CH1=1;temp1=64750-CH_data[0]*27/20;
  698.                                                 TL0=temp1,TH0=temp1>>8;break;
  699.                                                 
  700.                
  701.                 case 2:CH1=0;temp2=128500-temp1;
  702.                                                 TL0=temp2,TH0=temp2>>8;break;
  703.                 case 3:CH2=1;temp1=64750-CH_data[1]*27/20;
  704.                                                 TL0=temp1,TH0=temp1>>8;break;
  705.                                                 
  706.                                                 
  707.                 case 4:CH2=0;temp2=128500-temp1;
  708.                                                 TL0=temp2,TH0=temp2>>8;break;
  709.                 case 5:CH3=1;temp1=64750-CH_data[2]*27/20;
  710.                                                 TL0=temp1,TH0=temp1>>8;break;
  711.                 case 6:CH3=0;temp2=128500-temp1;
  712.                                                 TL0=temp2,TH0=temp2>>8;break;
  713.                 case 7:CH4=1;temp1=64750-CH_data[3]*27/20;
  714.                                                 TL0=temp1,TH0=temp1>>8;break;
  715.                 case 8:CH4=0;temp2=128500-temp1;
  716.                                                 TL0=temp2,TH0=temp2>>8;break;
  717. ……………………

  718. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有程序51hei提供下载:
萝丽新版6通接收机A版程序.rar (4.53 KB, 下载次数: 187)

评分

参与人数 2黑币 +20 收起 理由
475345347 + 5 绝世好帖!
GUOXUAN + 15 给新来的老师以奖分鼓励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2017-6-3 02:56 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:196311 发表于 2017-6-3 15:56 | 显示全部楼层
就提供接收机代码和发射器图纸,其他配套资料怎么没上来
回复

使用道具 举报

ID:257847 发表于 2017-12-5 19:30 | 显示全部楼层
支持楼主!
回复

使用道具 举报

ID:249545 发表于 2017-12-5 20:38 | 显示全部楼层
支持楼主共享如此雄伟的DIY资料!
回复

使用道具 举报

ID:255989 发表于 2017-12-5 21:01 | 显示全部楼层
LZ强人呀。12通的。想想我就歇菜了!
回复

使用道具 举报

ID:254584 发表于 2018-4-23 16:13 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:254251 发表于 2018-4-27 22:37 | 显示全部楼层
有时间拿来试一下谢谢分享
回复

使用道具 举报

ID:138282 发表于 2018-4-27 22:51 | 显示全部楼层
这谁发的?有没经过群主同意啊
回复

使用道具 举报

ID:79544 发表于 2018-9-26 18:20 | 显示全部楼层
程序下载进去指示灯没反应?
回复

使用道具 举报

ID:399179 发表于 2018-9-27 07:51 来自手机 | 显示全部楼层
等学会了试试
回复

使用道具 举报

ID:79544 发表于 2018-9-27 17:46 | 显示全部楼层
今天搞定12通道萝莉飞控和接收机。对频成功
回复

使用道具 举报

ID:55211 发表于 2018-10-16 09:37 | 显示全部楼层
喜欢航模的可以参考diy
回复

使用道具 举报

ID:280736 发表于 2018-11-13 12:49 | 显示全部楼层
谢谢!学习了!
回复

使用道具 举报

ID:272906 发表于 2019-9-13 10:50 | 显示全部楼层
具体怎么连线的?
回复

使用道具 举报

ID:619608 发表于 2019-10-5 22:22 | 显示全部楼层
解压后怎么没有原理图,只有C文件还不知道能不能用?
回复

使用道具 举报

ID:563109 发表于 2019-10-14 20:25 | 显示全部楼层
没有其他的吗
回复

使用道具 举报

ID:626287 发表于 2019-10-18 20:08 | 显示全部楼层
这个很火啊!!
回复

使用道具 举报

ID:613618 发表于 2019-10-24 14:22 来自手机 | 显示全部楼层
带发射机做成一套就更好了
回复

使用道具 举报

ID:622823 发表于 2019-11-23 19:48 | 显示全部楼层
这个萝莉控本来就是开源的  百度一下什么都有了。
回复

使用道具 举报

ID:469607 发表于 2020-1-12 17:32 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:308570 发表于 2020-9-3 16:19 | 显示全部楼层
萝莉的遥控通用吗?
回复

使用道具 举报

ID:718620 发表于 2021-1-23 15:54 来自手机 | 显示全部楼层
POPLAND 发表于 2019-10-5 22:22
解压后怎么没有原理图,只有C文件还不知道能不能用?

通过程序可以看出来外围电路
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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