5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)

标题: 自制富斯接收机一代【感谢芝士蛋糕的源码】 [打印本页]

作者: wangluoqishi    时间: 2017-10-2 18:22
标题: 自制富斯接收机一代【感谢芝士蛋糕的源码】
本帖最后由 wangluoqishi 于 2020-6-30 23:00 编辑

// Flysky receiver for STC15W408AS
// Modify by gloeagle
// STC15W408AS 单片机没有T1定时器,需要特别注意,串口只能使用T2计时器来产生波特率
// TO加跳,T2输出  实测副翼输出频率136hz  接舵机然后上电不抖舵,遥控器无操作的时候有轻微的抖舵(408AS没有定时器1)
// PCA0输出电机PWM信号,通过芯片直接驱动电机
// 程序测试正常,剩下的就是来校准电调了

用面包板搭建的电路,测试舵机没啥问题,用万用表测量了P1.1引脚的电压,遥控器控制没问题,当然自己修改代码可以实现电磁舵机的功能
一直想完善这个接收机的电调校准功能,由于各种原因,拖到了最近。结果比较悲剧,A7105模块貌似出现了问题,while(AREG_read(0x02)); 在这个循环中出不来了
最后把源代码贴上,以前虽然学的电气自动化,但是单片机水平比较渣,有模友觉得有错误也可以提出来,V信  gloeagle
uVison V5.14.2.1 编译通过

https://imgcache.qq.com/tencentvideo_v1/playerv3/TPout.swf?max_age=86400&v=20161117&vid=c0199oepqjs&auto=0

  1. //*************************************************************************
  2. // RX A7105 2.4Ghz protocol Flysky/turnigy 9x (v2)
  3. // look at thread: http://www.rcgroups.com/forums/showthread.php?t=1626362
  4. // many thanks to: PhracturedBlue, Dave1993, Surfbreizh, CristiV...
  5. // author: Thierry P閎ayle
  6. //
  7. // Flysky receiver for STC11F04E
  8. // look at thread: http://bbs.mx3g.com/thread-473651-1-1.html
  9. //
  10. // LOLI receiver for STC15W408AS
  11. // look at thread: http://bbs.mx3g.com/thread-498303-1-1.html
  12. //
  13. // Flysky receiver for STC15W408AS
  14. // Modify by gloeagle
  15. // STC15W408AS 单片机没有T1定时器,需要特别注意,串口只能使用T2计时器来产生波特率
  16. // TO加跳,T2输出  实测副翼输出频率136hz  接舵机然后上电不抖舵,遥控器无操作的时候有轻微的抖舵
  17. // 下面计划PCA0输出电机PWM信号,通过芯片直接驱动电机  校准电调是个难点

  18. // 程序测试正常,剩下的就是来校准电调了
  19. //**********************************************************************
  20. //*******晶振选择内置 12Mhz*******//
  21. //#include<reg52.h>
  22. #include <STC15.H>
  23. #include <intrins.h>
  24. #define GUDING                                //固定失控值/自由自定
  25. #define u8 unsigned char
  26. #define u16 unsigned int
  27. #define u32 unsigned long int

  28. ////*****modify
  29. //定义指示灯
  30. sbit LED=P5^5;        //定义指示灯
  31. sbit bind=P5^4; //先接地然后接收机上电,进入对频模式
  32. sbit LED2=P3^7; //排错

  33. ////*****modify
  34. //定义4个通道输出
  35. sbit CH1=P3^2;   //副翼
  36. sbit CH2=P3^3;         //升降
  37. sbit CH3=P3^6;   //方向
  38. //油门-> PWM输出方式,脉冲在P1.1引脚    CCP0/P1.1引脚


  39. //*****定义无线模块的管脚
  40. sbit GIO=P1^2;   
  41. sbit MDI=P1^3;  
  42. sbit SCK=P1^4;
  43. sbit CSN=P1^5;

  44. u8 code A7105_regs[]={                        //模块寄存器设定表
  45.     0xff, 0x42, 0x00, 0x14, 0x00, 0xff, 0xff ,0x00, 0x00, 0x00, 0x00, 0x01, 0x21, 0x05, 0x00, 0x50,
  46.     0x9e, 0x4b, 0x00, 0x02, 0x16, 0x2b, 0x12, 0x00, 0x62, 0x80, 0x80, 0x00, 0x0a, 0x32, 0xc3, 0x0f,
  47.     0x13, 0xc3, 0x00, 0xff, 0x00, 0x00, 0x3b, 0x00, 0x17, 0x47, 0x80, 0x03, 0x01, 0x45, 0x18, 0x00,
  48.     0x01, 0x0f, 0xff,
  49. };
  50. u8 code tx_channels[16][16]={                //跳频表
  51.   {0x0a, 0x5a, 0x14, 0x64, 0x1e, 0x6e, 0x28, 0x78, 0x32, 0x82, 0x3c, 0x8c, 0x46, 0x96, 0x50, 0xa0},
  52.   {0xa0, 0x50, 0x96, 0x46, 0x8c, 0x3c, 0x82, 0x32, 0x78, 0x28, 0x6e, 0x1e, 0x64, 0x14, 0x5a, 0x0a},
  53.   {0x0a, 0x5a, 0x50, 0xa0, 0x14, 0x64, 0x46, 0x96, 0x1e, 0x6e, 0x3c, 0x8c, 0x28, 0x78, 0x32, 0x82},
  54.   {0x82, 0x32, 0x78, 0x28, 0x8c, 0x3c, 0x6e, 0x1e, 0x96, 0x46, 0x64, 0x14, 0xa0, 0x50, 0x5a, 0x0a},
  55.   {0x28, 0x78, 0x0a, 0x5a, 0x50, 0xa0, 0x14, 0x64, 0x1e, 0x6e, 0x3c, 0x8c, 0x32, 0x82, 0x46, 0x96},
  56.   {0x96, 0x46, 0x82, 0x32, 0x8c, 0x3c, 0x6e, 0x1e, 0x64, 0x14, 0xa0, 0x50, 0x5a, 0x0a, 0x78, 0x28},
  57.   {0x50, 0xa0, 0x28, 0x78, 0x0a, 0x5a, 0x1e, 0x6e, 0x3c, 0x8c, 0x32, 0x82, 0x46, 0x96, 0x14, 0x64},
  58.   {0x64, 0x14, 0x96, 0x46, 0x82, 0x32, 0x8c, 0x3c, 0x6e, 0x1e, 0x5a, 0x0a, 0x78, 0x28, 0xa0, 0x50},
  59.   {0x50, 0xa0, 0x46, 0x96, 0x3c, 0x8c, 0x28, 0x78, 0x0a, 0x5a, 0x32, 0x82, 0x1e, 0x6e, 0x14, 0x64},
  60.   {0x64, 0x14, 0x6e, 0x1e, 0x82, 0x32, 0x5a, 0x0a, 0x78, 0x28, 0x8c, 0x3c, 0x96, 0x46, 0xa0, 0x50},
  61.   {0x46, 0x96, 0x3c, 0x8c, 0x50, 0xa0, 0x28, 0x78, 0x0a, 0x5a, 0x1e, 0x6e, 0x32, 0x82, 0x14, 0x64},
  62.   {0x64, 0x14, 0x82, 0x32, 0x6e, 0x1e, 0x5a, 0x0a, 0x78, 0x28, 0xa0, 0x50, 0x8c, 0x3c, 0x96, 0x46},
  63.   {0x46, 0x96, 0x0a, 0x5a, 0x3c, 0x8c, 0x14, 0x64, 0x50, 0xa0, 0x28, 0x78, 0x1e, 0x6e, 0x32, 0x82},
  64.   {0x82, 0x32, 0x6e, 0x1e, 0x78, 0x28, 0xa0, 0x50, 0x64, 0x14, 0x8c, 0x3c, 0x5a, 0x0a, 0x96, 0x46},
  65.   {0x46, 0x96, 0x0a, 0x5a, 0x50, 0xa0, 0x3c, 0x8c, 0x28, 0x78, 0x1e, 0x6e, 0x32, 0x82, 0x14, 0x64},
  66.   {0x64, 0x14, 0x82, 0x32, 0x6e, 0x1e, 0x78, 0x28, 0x8c, 0x3c, 0xa0, 0x50, 0x5a, 0x0a, 0x96, 0x46},
  67. };
  68. u32 id;                                         //对码ID
  69. u8 chanrow,chancol,chanoffset,channel;
  70. u8 txid[21]={0,0,0,0,0,220,5,220,5,232,3,220,5,220,5,220,5,220,5,220,5};
  71. u8 packet[21];
  72. u8 Htemp[8]={5,5,3,5,5,5,5,5};
  73. u8 Ltemp[8]={220,220,232,220,220,220,220,220};
  74. u8 ch=0;
  75. u16 mss;
  76. bit hch,cb;
  77. //modify
  78. ////FS-I6 GUDING -- 通过修改程序,手动获取的  在这定义的值函数里面为啥用不了
  79. unsigned short int ESC_MIN=990;  //小油门行程
  80. unsigned short int ESC_MAX=1980;  //大油门行程
  81. unsigned short int RxESC;
  82. unsigned short int ESCtemp;
  83. //延时定义
  84. void Delay1ms(){                //@12.000MHz
  85.         unsigned char i, j;
  86.         _nop_();
  87.         _nop_();
  88.         i = 10;
  89.         j = 83;
  90.         do
  91.         {
  92.                 while (--j);
  93.         } while (--i);
  94. }

  95. void delay_ms(u16 i){
  96.         while(i--)
  97.         Delay1ms();
  98. }

  99. //错误灯函数
  100. void ErrorLED(){
  101.         LED2=0;               //add    2017
  102.         delay_ms(500);
  103.         LED2=1;
  104.         delay_ms(500);
  105.         LED2=0;
  106. }

  107. void IapIdle(){
  108.     IAP_CONTR = 0;                  //Close IAP function
  109.     IAP_CMD = 0;                    //Clear command to standby
  110.     IAP_TRIG = 0;                   //Clear trigger register
  111.     IAP_ADDRH = 0x80;               //Data ptr point to non-EEPROM area
  112.     IAP_ADDRL = 0;                  //Clear IAP address to prevent misuse
  113. }
  114. u8 EEPROM_read(u8 addr){
  115.     u8 dat;                               //Data buffer
  116.     IAP_CONTR = 0x82;                         //Open IAP function, and set wait time
  117.     IAP_CMD = 0x01;                     //Set ISP/IAP/EEPROM READ command
  118.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  119.     IAP_ADDRH = 0;                          //Set ISP/IAP/EEPROM address high
  120.     IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
  121.     IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
  122.     _nop_();                               //MCU will hold here until ISP/IAP/EEPROM operation complete
  123.     dat = IAP_DATA;                 //Read ISP/IAP/EEPROM data
  124.     IapIdle();                      //Close ISP/IAP/EEPROM function
  125.     return dat;                     //Return Flash data
  126. }
  127. void EEPROM_write(u8 addr,u8 dat){
  128.     IAP_CONTR = 0x82;                         //Open IAP function, and set wait time
  129.     IAP_CMD = 0x02;                          //Set ISP/IAP/EEPROM PROGRAM command
  130.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  131.     IAP_ADDRH = 0;                          //Set ISP/IAP/EEPROM address high
  132.     IAP_DATA = dat;                 //Write ISP/IAP/EEPROM data
  133.     IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
  134.     IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
  135.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  136.     IapIdle();
  137. }
  138. void EEPROM_clean(u8 addr){
  139.     IAP_CONTR = 0x82;                         //Open IAP function, and set wait time
  140.     IAP_CMD = 0x03;                     //Set ISP/IAP/EEPROM ERASE command
  141.     IAP_ADDRL = 0;                      //Set ISP/IAP/EEPROM address low
  142.     IAP_ADDRH = addr;                          //Set ISP/IAP/EEPROM address high
  143.     IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
  144.     IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
  145.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  146.     IapIdle();
  147. }
  148. void IDWR(bit wr){                                         // 1:保存        0:读取
  149.         u8 i;
  150.         if(wr)EEPROM_clean(0),delay_ms(10);
  151.         for(i=0;i<21;i++){
  152.                 if(wr){
  153.                         EEPROM_write(i,txid[i]); }
  154.                 //        txid[i]=packet[i];}
  155.                 else txid[i]=EEPROM_read(i);
  156.         }
  157. }
  158. void SPIwrite(u8 command){                   //时序写
  159.         u8 n=8;
  160.         SCK=0;MDI=0;
  161.         while(n--) {
  162.                 if(command&0x80)MDI=1;
  163.                 else MDI=0;
  164.                 SCK=1;_nop_();SCK=0;
  165.                 command = command << 1;
  166.         }
  167.         MDI=1;
  168. }  
  169. u8 SPIread(void){                                        //时序读
  170.         u8 i,result=0;
  171.         for(i=0;i<8;i++) {                    
  172.                 if(MDI==1)result=(result<<1)|0x01;
  173.                 else result=result<<1;
  174.                 SCK=1;_nop_();SCK=0;_nop_();
  175.         }return result;
  176. }
  177. void AREG_write(u8 address, u8 dat){//写寄存器
  178.         CSN=0;
  179.         SPIwrite(address);
  180.         _nop_();
  181.         SPIwrite(dat);  
  182.         CSN=1;
  183. }
  184. u8 AREG_read(u8 address){                         //读寄存器
  185.         u8 result;
  186.         CSN=0;
  187.         address |=0x40;
  188.         SPIwrite(address);
  189.         result = SPIread();  
  190.         CSN=1;
  191.         return(result);
  192. }
  193. void A7105_WriteID(u32 ida) {                //写模块ID
  194.         CSN=0;
  195.         SPIwrite(0x06);
  196.         SPIwrite((ida>>24)&0xff);
  197.         SPIwrite((ida>>16)&0xff);
  198.         SPIwrite((ida>>8)&0xff);
  199.         SPIwrite((ida>>0)&0xff);
  200.         CSN=1;
  201. }
  202. void Read_Packet(){                                        //读数据包,遥控数据
  203.         u8 i;
  204.         CSN=0;
  205.         SPIwrite(0x45);
  206.         for (i=0;i<21;i++)packet[i]=SPIread();
  207.         CSN=1;
  208. }
  209. void Strobe(u8 address){                        //模块设定
  210.         CSN=0;
  211.         SPIwrite(address);
  212.         CSN=1;
  213. }
  214. ////PWM_config -- modify
  215. void PWM_init()
  216. {
  217.         P1M0=0x00;P1M1=0x00;
  218.         //CMOD=0x80;                   // #10000000B   空闲模式下停止PCA计数器工作;选择PCA时钟源为Fosc/12,禁止PCA计数器溢出时中断
  219.         CMOD=0x00;
  220.         CCON = 0;              // 清零PCA计数器溢出中断请求标志位CF
  221.         CL = 0;                // 清零PCA 计数器
  222.         CH = 0;         
  223.         CCAPM0=0x42;                   // 设置PCA模块0为8位PWM输出方式,脉冲在P1.1引脚    CCP0/P1.1引脚
  224.         CR=1;                                   // PCA计数器开始运行;CR = 0, 不允许 PCA 计数器计数,清零PCA 各模块中断请求标志位CCFn
  225. }
  226. void PWM_ESC()
  227. {
  228.     EA=0;
  229.     RxESC=packet[10];
  230.     RxESC<<=8;
  231.     RxESC+=packet[9];
  232.         RxESC=RxESC/10;
  233.         ESC_MIN=990/10;
  234.         ESC_MAX=1980/10;
  235.         ESCtemp=256-(256*(RxESC-ESC_MIN))/(ESC_MAX-ESC_MIN);
  236.         EA=1;
  237.         CCAP0H=ESCtemp;           //输出特定占空比的PWM
  238. }
  239. ////end
  240. void bind_Flysky(){                                        //对频
  241.         u8 i,counter1=255;
  242.         Strobe(0xA0);
  243.         Strobe(0xF0);
  244.         AREG_write(0x0F,0x00);//比发射低一频道
  245.         Strobe(0xC0);
  246.         while(counter1){
  247.                 delay_ms(10);
  248.                 if(counter1&0x04)LED=1;
  249.                 else LED=0;               
  250.                 if(GIO==0){
  251.                         if((AREG_read(0x00)&0x60)==0){                                       
  252.                                 Read_Packet();
  253.                                 for(i=0;i<21;i++)txid[i]=packet[i];
  254.                                 break;
  255.                         }
  256.                         else{
  257.                                 Strobe(0xA0);
  258.                                 Strobe(0xF0);
  259.                                 AREG_write(0x0F,0x00);
  260.                                 Strobe(0xC0);
  261.                                 continue;
  262.                         }
  263.                 }
  264.                 else{
  265.                 --counter1;
  266.                 if (counter1==0)counter1=255;
  267.                 //LED2=0;  //add    2017
  268.                 }
  269.         }        
  270. }
  271. void flysky_cb(){                                        //主循环
  272.         u8 i,x;
  273.         channel=tx_channels[chanrow][chancol]-chanoffset;//跳频道
  274.         channel-=1;
  275.         Strobe(0xA0);
  276.         Strobe(0xF0);
  277.         AREG_write(0x0F,channel);//设定频道
  278.         Strobe(0xC0);
  279.         chancol=(chancol+1)%16;
  280.         while(1){
  281.                 if(mss>80){    //无信号1.5s后失控保护
  282.                          #ifdef GUDING
  283.                                 Ltemp[2]=232;Htemp[2]=3;
  284.                         #endif        
  285.                         for(i=0;i<8;i++){
  286.                                 #ifdef GUDING        
  287.                                                 if(i==2)continue;
  288.                                                 Ltemp[i]=220;
  289.                                                 Htemp[i]=5;
  290.                                 #else               
  291.                                                 Ltemp[i]=txid[2*i+5];
  292.                                                 Htemp[i]=txid[2*i+6];
  293.                                 #endif
  294.                         }
  295.                 }
  296.                 if(hch){                 //大于20ms加跳
  297.                         hch=0;LED=0;
  298.                         chancol=(chancol+1)%16;
  299.                 //        channel=tx_channels[chanrow][chancol]-1-chanoffset;
  300.                         break;
  301.                 }
  302.                 if (GIO==1)continue;
  303.                 x=AREG_read(0x00);
  304.                 if(x&0x60)continue;//数据检验
  305.                 Read_Packet();//读遥控数据               ↓↓↓↓↓匹配ID
  306.                 if (!(packet[1]==txid[1])&&!(packet[2]==txid[2])&&!(packet[3]==txid[3])&&!(packet[4]==txid[4]))continue;
  307.                 mss=0;
  308.                 if(cb){
  309.                         for (i=0;i<8;i++){//输出                1000~2000
  310.                                 EA=0;               //总中断开关:关
  311.                                 x=packet[6+(2*i)];
  312.                                 if((x>=3)&&(x<=8) ){        //防止溢出
  313.                                         Ltemp[i]=packet[5+(2*i)];
  314.                                         Htemp[i]=x;
  315.                                 }
  316.                                 EA=1;               //总中断开关:开
  317.                         }
  318.                 }        
  319.                 if(cb)LED=1;
  320.                 break;
  321.         }
  322. }
  323. void flysky_init(){          //初始化
  324.         u8 i,k;
  325.         u16 HT;
  326.         P1M0 |= 0x03;     //(00000011B)  设置1口01为10状态
  327.         P3M0 |= 0xcf;     //(11001111B)  设置3口012367为10状态
  328.         P5M0 |= 0x20;     //(00100000B)  5.5 led;5.4 bind
  329.         //TMOD=0x11;                  //(00010001)  T1 T0非自动重装方式(默认)
  330.         TMOD = 0x01;AUXR = 0x00;      //(00000001)  T0非自动重装方式;T2为12T模式
  331.         //IE=0x8a;                    //(10001010)  EA ET1 ET0 开中断 (默认)
  332.         IE |= 0x82;IE2 |= 0x04;       //(10000010)  EA ET0 开中断;//定时器2 开中断
  333.         bind=1;CSN=1;MDI=1;SCK=0;
  334.         delay_ms(10);
  335.         AREG_write(0x00,0x00);
  336.         A7105_WriteID(0x5475c52A);
  337.         for (i = 0; i < 0x33; i++){
  338.                 if(A7105_regs[i] != 0xff)
  339.                         AREG_write(i, A7105_regs[i]);
  340.         }        
  341.         Strobe(0xA0);
  342.         AREG_write(0x02,0x01);
  343.         //ErrorLED();  //  没问题,可以执行
  344.         while(AREG_read(0x02));     //这出现问题了,循环没有出来
  345.         ErrorLED();    //  有问题,没有执行,应该断在循环中,没出来
  346.         AREG_write(0x24,0x13);
  347.         AREG_write(0x26,0x3b);
  348.         AREG_write(0x0F,0x00);
  349.         AREG_write(0x02,0x02);
  350.         while(AREG_read(0x02));
  351.         AREG_write(0x0F,0xA0);
  352.         AREG_write(0x02,0x02);
  353.         while(AREG_read(0x02));
  354.         AREG_write(0x25,0x08);
  355.         Strobe(0xA0);
  356.          while(1){
  357.                 LED=1;
  358.                 delay_ms(500);
  359.                 LED=0;
  360.                 delay_ms(500);
  361.                 if(bind==1){
  362.                         IDWR(0);                //读取ID
  363.                         cb=1;
  364.                         if(txid[0]==0xaa)break;
  365.                         else continue;
  366.                 }
  367.                 else{
  368.                         bind_Flysky();//对频
  369.                         LED=1;        
  370.                         delay_ms(500);
  371.                         LED=0;
  372.                         delay_ms(500);
  373.                         //TR0=TR1=1;              //Modify
  374.                         TR0=1;AUXR|=0x10;
  375.                         cb=0;
  376.                         break;
  377.                 }
  378.         }                        
  379.         //↓↓↓↓↓↓↓↓合拼ID
  380.         id=(txid[1]|((u32)txid[2]<<8)|((u32)txid[3]<<16)|((u32)txid[4]<<24));        
  381.         chanrow=id%16;
  382.         chanoffset=(id&0xff)/16;
  383.         chancol=0;
  384.         if(chanoffset>9)chanoffset=9;
  385.         while(TR0){
  386.                 ////if(bind){IDWR(1);LED=0;TR0=TR1=0;while(1){LED=1;delay_ms(1000);LED=0;delay_ms(1500);};}
  387.                 if(bind){IDWR(1);LED=0;TR0=0;AUXR=0x00;while(1){LED=1;delay_ms(1000);LED=0;delay_ms(1500);};}    //Modify
  388.                 flysky_cb();//4:1024  5:1280  6:1536  7:1792  8:2048
  389.                 if(mss>5){mss=0;
  390.                         for(i=0;i<8;i++){
  391.                                 if((i>3)||(i==2)){
  392.                                         Ltemp[i]=txid[2*i+5]=packet[2*i+5];
  393.                                         Htemp[i]=txid[2*i+6]=packet[2*i+6];
  394.                                         continue;
  395.                                 }
  396.                                 if((packet[2*i+6]<5)||(packet[2*i+6]>6)){
  397.                                         if(k&(1<<i)){k&=(0xfe<<i);LED=1;
  398.                                                 HT=(u16)txid[2*i+5]|(u16)(txid[2*i+6]<<8);
  399.                                                 if(packet[2*i+6]<5){if(HT>900)HT-=100;}
  400.                                                 else if(HT<2000)HT+=100;
  401.                                                 Ltemp[i]=txid[2*i+5]=HT&0xff;
  402.                                                 Htemp[i]=txid[2*i+6]=(HT>>8)&0xff;}
  403.                                         }
  404.                                 else k|=(1<<i);                        
  405.                         }                        
  406.                 }
  407.         }
  408. }
  409. void main(){
  410.     PWM_init();        
  411.         flysky_init();
  412.         //启动加跳和输出定时器 -- Modify
  413.         //TR0=1;TR1=1;                //T0为跳频定时器,T1为输出定时器(默认)
  414.         TR0=1;AUXR |= 0x10;            //T0为跳频定时器,T2为输出定时器
  415.         while(1)flysky_cb();
  416. }
  417. /*
  418. //如果SYSclk的单位用Hz,则T单位用S,
  419. //16位定时器(12T)初值=65536-(SYSclk/12)*T;
  420. //16位定时器(1T)初值=65536-SYSclk*T;
  421. //8位定时器(12T)初值=256-(SYSclk/12)*T;
  422. //8位定时器(1T)初值=256-SYSclk*T;
  423. */
  424. void et0()interrupt 1{                                                  //加跳定时器
  425.         //TH0 =248;TL0 =50;                                              //@12Mhz  2ms        +2
  426.   //初值=65536-(12000000/12)*0.020=45536=B1E0   16位@12Mhz  20ms
  427.         TH0=0xb1;TL0=0xe0;                                            //@12Mhz  20ms
  428.         //TH0=0xD8;TL0=0xF0;                            //@12Mhz  10ms
  429.         //TH0=0x3C;TL0=0xB0;                            //@12Mhz  50ms
  430.         hch=1;
  431.         mss++;
  432.         //PWM_math();                     //函数中,关总中断,开总中断;结果是没波形,电压没有降低
  433. }
  434. //void et1()interrupt 3{                    //输出定时器,定时器T1中断程序
  435. void et2()interrupt 12{                                //输出定时器,定时器T2中断程序
  436.     PWM_ESC();                      //P1.1输出占空比PWM波;函数中,关总中断,开总中断;结果是只有4khz的波形,电压没有降低;
  437.         CH1=0;CH2=0;CH3=0;
  438.         //CH4=0;
  439.         T2H=255-Htemp[ch];                    //@12Mhz   252                3
  440.         T2L=255-Ltemp[ch];                    //@12Mhz   23                232
  441.         switch (ch) {
  442.         case 1:        CH1=1;break;            //副翼
  443.         case 2:        CH2=1;break;            //升降
  444.         case 3:        CH3=1;break;            //方向
  445.         }
  446.         if(ch < 4)ch++;//3通道循环
  447.         else ch=0;
  448. }

复制代码

模友画的原理图,借用一下 (, 下载次数: 45)





作者: pinkama    时间: 2017-10-4 11:54
厉害!羡慕!支持!


作者: yanjian    时间: 2017-10-21 20:14
我也要仿制接收机,谢谢!

作者: xiaobao147    时间: 2017-10-25 19:19


作者: yanjian    时间: 2017-10-29 12:33
测试了,这个版本不错!
可以用15W408AS了

作者: shmily5909    时间: 2017-10-29 15:03
楼主你这样做,让原厂接收机怎么想,不过我喜欢,继续鼓捣天地飞如何?

作者: lldsww    时间: 2018-4-25 17:01
请问你还有自制蛋糕的 接收机的资料嘛? 我看 模型三国上不去了啊

作者: wangluoqishi    时间: 2018-4-26 11:45
lldsww 发表于 2018-4-25 17:01
请问你还有自制蛋糕的 接收机的资料嘛? 我看 模型三国上不去了啊

程序里面有备注的,单片机接电源,接个LED灯,再就是舵机输出,很简单

作者: dukecheng    时间: 2018-5-25 10:38
stc15w408as做接收比stc15w204s效果好吗?还是可以增加功能?还是其它原因?

作者: wangluoqishi    时间: 2018-5-25 11:00
dukecheng 发表于 2018-5-25 10:38
stc15w408as做接收比stc15w204s效果好吗?还是可以增加功能?还是其它原因?

我自己增加了电调的功能,只实现了标准行程,没实现校准油门行程的功能,每个遥控器的油门行程都不一样的

作者: wangluoqishi    时间: 2018-5-25 11:02
dukecheng 发表于 2018-5-25 10:38
stc15w408as做接收比stc15w204s效果好吗?还是可以增加功能?还是其它原因?

手里只有408,所以就用的40。要用204估计要改代码

作者: dukecheng    时间: 2018-5-25 11:36
wangluoqishi 发表于 2018-5-25 11:02
手里只有408,所以就用的40。要用204估计要改代码

我还以为408好一些呢。我104,204,408都买了一些,用最便宜的了


作者: zxy882266    时间: 2018-7-5 19:09
没人研究接收机啊?比买成品便宜多了,还在摸索萝莉控

作者: jianwen0527    时间: 2018-8-2 23:02
楼主有没有 二代的代码呢。那个芝士蛋糕的下载不了

作者: w7767896789    时间: 2018-8-3 19:26
多谢楼主,我在你的代码基础上修改成6通道的程序了,我看代码最多能改成8通道,但是我fs-I6没有刷固件,原厂固件测试是可以的,我看你原来程序用了PCA,我猜测你可能想要输出PWM,但是stc15的pwm不用中断的话只能3个io输出也就是3个通道,而且pwm频率较高不适合舵机,我就把pca代码删去了,还是用的定时器T2输出pwm
  1. //*************************************************************************
  2. // RX A7105 2.4Ghz protocol Flysky/turnigy 9x (v2)
  3. // look at thread: http://www.rcgroups.com/forums/showthread.php?t=1626362
  4. // many thanks to: PhracturedBlue, Dave1993, Surfbreizh, CristiV...
  5. // author: Thierry Pébayle
  6. //
  7. // Flysky receiver for STC11F04E
  8. // look at thread: http://bbs.mx3g.com/thread-473651-1-1.html
  9. //
  10. // LOLI receiver for STC15W408AS
  11. // look at thread: http://bbs.mx3g.com/thread-498303-1-1.html
  12. //
  13. // Flysky receiver for STC15W408AS
  14. // Modify by gloeagle
  15. // STC15W408AS μ¥Ƭ»úûóDT1¶¨ê±Æ÷£¬Dèòaìرe×¢òa£¬′®¿úÖ»Äüê1óÃT2¼Æê±Æ÷à′2úéú2¨ìØÂê
  16. // TO¼óìø£¬T2êä3ö  êμ2a¸±òíêä3öÆμÂê136hz  ½ó¶æ»úè»oóéÏμç2»¶¶¶æ£¬ò£¿ØÆ÷ÎT2ù×÷μÄê±oòóDÇá΢μĶ¶¶æ
  17. // ÏÂÃæ¼Æ»®PCA0êä3öμç»úPWMDÅoÅ£¬í¨1yD¾Æ¬Ö±½óÇy¶ˉμç»ú  D£×¼μçμ÷êǸöÄÑμã

  18. // 3ìDò2aêÔÕy3££¬ê£ÏÂμľíêÇà′D£×¼μçμ÷áË
  19. //**********************************************************************
  20. //*******¾§ÕñÑ¡ÔñÄúÖà 12Mhz*******//

  21. #include <STC15.H>
  22. #include <intrins.h>
  23. #define GUDING                                //1춨꧿ØÖμ/×Ôóé×Ô¶¨
  24. #define u8 unsigned char
  25. #define u16 unsigned int
  26. #define u32 unsigned long int

  27. ////*****modify
  28. //¶¨òåÖ¸ê¾μÆ
  29. sbit LED=P5^5;        //¶¨òåÖ¸ê¾μÆ
  30. sbit bind=P5^4; //Ïè½óμØè»oó½óêÕ»úéÏμ磬½øèë¶ÔÆμÄ£ê½
  31. sbit LED2=P3^7; //ÅÅ′í

  32. ////*****modify
  33. //¶¨òå4¸öí¨μàêä3ö
  34. sbit CH1=P3^2;   //¸±òí
  35. sbit CH2=P3^3;         //éy½μ
  36. sbit CH3=P3^6;   //·½Ïò
  37. sbit CH4=P3^7;   //roll
  38. sbit CH5=P1^0;   //·½Ïò
  39. sbit CH6=P1^1;   //roll
  40. //óíÃÅ-> PWMêä3ö·½ê½£¬Âö3åÔúP1.1òy½Å    CCP0/P1.1òy½Å


  41. //*****¶¨òåÎTÏßÄ£¿éμÄ1ü½Å
  42. sbit GIO=P1^2;   
  43. sbit MDI=P1^3;  
  44. sbit SCK=P1^4;
  45. sbit CSN=P1^5;

  46. u8 code A7105_regs[]={                        //Ä£¿é¼Ä′æÆ÷é趨±í
  47.     0xff, 0x42, 0x00, 0x14, 0x00, 0xff, 0xff ,0x00, 0x00, 0x00, 0x00, 0x01, 0x21, 0x05, 0x00, 0x50,
  48.     0x9e, 0x4b, 0x00, 0x02, 0x16, 0x2b, 0x12, 0x00, 0x62, 0x80, 0x80, 0x00, 0x0a, 0x32, 0xc3, 0x0f,
  49.     0x13, 0xc3, 0x00, 0xff, 0x00, 0x00, 0x3b, 0x00, 0x17, 0x47, 0x80, 0x03, 0x01, 0x45, 0x18, 0x00,
  50.     0x01, 0x0f, 0xff,
  51. };
  52. u8 code tx_channels[16][16]={                //ìøÆμ±í
  53.   {0x0a, 0x5a, 0x14, 0x64, 0x1e, 0x6e, 0x28, 0x78, 0x32, 0x82, 0x3c, 0x8c, 0x46, 0x96, 0x50, 0xa0},
  54.   {0xa0, 0x50, 0x96, 0x46, 0x8c, 0x3c, 0x82, 0x32, 0x78, 0x28, 0x6e, 0x1e, 0x64, 0x14, 0x5a, 0x0a},
  55.   {0x0a, 0x5a, 0x50, 0xa0, 0x14, 0x64, 0x46, 0x96, 0x1e, 0x6e, 0x3c, 0x8c, 0x28, 0x78, 0x32, 0x82},
  56.   {0x82, 0x32, 0x78, 0x28, 0x8c, 0x3c, 0x6e, 0x1e, 0x96, 0x46, 0x64, 0x14, 0xa0, 0x50, 0x5a, 0x0a},
  57.   {0x28, 0x78, 0x0a, 0x5a, 0x50, 0xa0, 0x14, 0x64, 0x1e, 0x6e, 0x3c, 0x8c, 0x32, 0x82, 0x46, 0x96},
  58.   {0x96, 0x46, 0x82, 0x32, 0x8c, 0x3c, 0x6e, 0x1e, 0x64, 0x14, 0xa0, 0x50, 0x5a, 0x0a, 0x78, 0x28},
  59.   {0x50, 0xa0, 0x28, 0x78, 0x0a, 0x5a, 0x1e, 0x6e, 0x3c, 0x8c, 0x32, 0x82, 0x46, 0x96, 0x14, 0x64},
  60.   {0x64, 0x14, 0x96, 0x46, 0x82, 0x32, 0x8c, 0x3c, 0x6e, 0x1e, 0x5a, 0x0a, 0x78, 0x28, 0xa0, 0x50},
  61.   {0x50, 0xa0, 0x46, 0x96, 0x3c, 0x8c, 0x28, 0x78, 0x0a, 0x5a, 0x32, 0x82, 0x1e, 0x6e, 0x14, 0x64},
  62.   {0x64, 0x14, 0x6e, 0x1e, 0x82, 0x32, 0x5a, 0x0a, 0x78, 0x28, 0x8c, 0x3c, 0x96, 0x46, 0xa0, 0x50},
  63.   {0x46, 0x96, 0x3c, 0x8c, 0x50, 0xa0, 0x28, 0x78, 0x0a, 0x5a, 0x1e, 0x6e, 0x32, 0x82, 0x14, 0x64},
  64.   {0x64, 0x14, 0x82, 0x32, 0x6e, 0x1e, 0x5a, 0x0a, 0x78, 0x28, 0xa0, 0x50, 0x8c, 0x3c, 0x96, 0x46},
  65.   {0x46, 0x96, 0x0a, 0x5a, 0x3c, 0x8c, 0x14, 0x64, 0x50, 0xa0, 0x28, 0x78, 0x1e, 0x6e, 0x32, 0x82},
  66.   {0x82, 0x32, 0x6e, 0x1e, 0x78, 0x28, 0xa0, 0x50, 0x64, 0x14, 0x8c, 0x3c, 0x5a, 0x0a, 0x96, 0x46},
  67.   {0x46, 0x96, 0x0a, 0x5a, 0x50, 0xa0, 0x3c, 0x8c, 0x28, 0x78, 0x1e, 0x6e, 0x32, 0x82, 0x14, 0x64},
  68.   {0x64, 0x14, 0x82, 0x32, 0x6e, 0x1e, 0x78, 0x28, 0x8c, 0x3c, 0xa0, 0x50, 0x5a, 0x0a, 0x96, 0x46},
  69. };
  70. u32 id;                                         //¶ÔÂëID
  71. u8 chanrow,chancol,chanoffset,channel;
  72. u8 txid[21]={0,0,0,0,0,220,5,220,5,232,3,220,5,220,5,220,5,220,5,220,5};
  73. u8 packet[21];
  74. u8 Htemp[8]={5,5,3,5,5,5,5,5};
  75. u8 Ltemp[8]={220,220,232,220,220,220,220,220};
  76. u8 ch=0;
  77. u16 mss;
  78. bit hch,cb;
  79. //modify
  80. ////FS-I6 GUDING -- í¨1yDT¸Ä3ìDò£¬êÖ¶ˉ»ñè¡μÄ  ÔúÕa¶¨òåμÄÖμoˉêyàïÃæÎaé¶óÃ2»áË
  81. unsigned short int ESC_MIN=990;  //D¡óíÃÅDD3ì
  82. unsigned short int ESC_MAX=1980;  //′óóíÃÅDD3ì
  83. unsigned short int RxESC;
  84. unsigned short int ESCtemp;
  85. //Ñó걶¨òå
  86. void Delay1ms(){                //@12.000MHz
  87.         unsigned char i, j;
  88.         _nop_();
  89.         _nop_();
  90.         i = 10;
  91.         j = 83;
  92.         do
  93.         {
  94.                 while (--j);
  95.         } while (--i);
  96. }

  97. void delay_ms(u16 i){
  98.         while(i--)
  99.         Delay1ms();
  100. }

  101. //′íÎóμÆoˉêy
  102. void ErrorLED(){
  103.         LED2=0;               //add    2017
  104.         delay_ms(500);
  105.         LED2=1;
  106.         delay_ms(500);
  107.         LED2=0;
  108. }

  109. void IapIdle(){
  110.     IAP_CONTR = 0;                  //Close IAP function
  111.     IAP_CMD = 0;                    //Clear command to standby
  112.     IAP_TRIG = 0;                   //Clear trigger register
  113.     IAP_ADDRH = 0x80;               //Data ptr point to non-EEPROM area
  114.     IAP_ADDRL = 0;                  //Clear IAP address to prevent misuse
  115. }
  116. u8 EEPROM_read(u8 addr){
  117.     u8 dat;                               //Data buffer
  118.     IAP_CONTR = 0x82;                         //Open IAP function, and set wait time
  119.     IAP_CMD = 0x01;                     //Set ISP/IAP/EEPROM READ command
  120.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  121.     IAP_ADDRH = 0;                          //Set ISP/IAP/EEPROM address high
  122.     IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
  123.     IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
  124.     _nop_();                               //MCU will hold here until ISP/IAP/EEPROM operation complete
  125.     dat = IAP_DATA;                 //Read ISP/IAP/EEPROM data
  126.     IapIdle();                      //Close ISP/IAP/EEPROM function
  127.     return dat;                     //Return Flash data
  128. }
  129. void EEPROM_write(u8 addr,u8 dat){
  130.     IAP_CONTR = 0x82;                         //Open IAP function, and set wait time
  131.     IAP_CMD = 0x02;                          //Set ISP/IAP/EEPROM PROGRAM command
  132.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  133.     IAP_ADDRH = 0;                          //Set ISP/IAP/EEPROM address high
  134.     IAP_DATA = dat;                 //Write ISP/IAP/EEPROM data
  135.     IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
  136.     IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
  137.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  138.     IapIdle();
  139. }
  140. void EEPROM_clean(u8 addr){
  141.     IAP_CONTR = 0x82;                         //Open IAP function, and set wait time
  142.     IAP_CMD = 0x03;                     //Set ISP/IAP/EEPROM ERASE command
  143.     IAP_ADDRL = 0;                      //Set ISP/IAP/EEPROM address low
  144.     IAP_ADDRH = addr;                          //Set ISP/IAP/EEPROM address high
  145.     IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
  146.     IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
  147.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  148.     IapIdle();
  149. }
  150. void IDWR(bit wr){                                         // 1:±£′æ        0:¶áè¡
  151.         u8 i;
  152.         if(wr)EEPROM_clean(0),delay_ms(10);
  153.         for(i=0;i<21;i++){
  154.                 if(wr){
  155.                         EEPROM_write(i,txid[i]);
  156.                                                                        }
  157.                 //        txid[i]=packet[i];}
  158.                 else txid[i]=EEPROM_read(i);
  159.         }
  160. }
  161. void SPIwrite(u8 command){                   //ê±DòD′
  162.         u8 n=8;
  163.         SCK=0;MDI=0;
  164.         while(n--) {
  165.                 if(command&0x80)MDI=1;
  166.                 else MDI=0;
  167.                 SCK=1;_nop_();SCK=0;
  168.                 command = command << 1;
  169.         }
  170.         MDI=1;
  171. }  
  172. u8 SPIread(void){                                        //ê±Dò¶á
  173.         u8 i,result=0;
  174.         for(i=0;i<8;i++) {                    
  175.                 if(MDI==1)result=(result<<1)|0x01;
  176.                 else result=result<<1;
  177.                 SCK=1;_nop_();SCK=0;_nop_();
  178.         }return result;
  179. }
  180. void AREG_write(u8 address, u8 dat){//D′¼Ä′æÆ÷
  181.         CSN=0;
  182.         SPIwrite(address);
  183.         _nop_();
  184.         SPIwrite(dat);  
  185.         CSN=1;
  186. }
  187. u8 AREG_read(u8 address){                         //¶á¼Ä′æÆ÷
  188.         u8 result;
  189.         CSN=0;
  190.         address |=0x40;
  191.         SPIwrite(address);
  192.         result = SPIread();  
  193.         CSN=1;
  194.         return(result);
  195. }
  196. void A7105_WriteID(u32 ida) {                //D′Ä£¿éID
  197.         CSN=0;
  198.         SPIwrite(0x06);
  199.         SPIwrite((ida>>24)&0xff);
  200.         SPIwrite((ida>>16)&0xff);
  201.         SPIwrite((ida>>8)&0xff);
  202.         SPIwrite((ida>>0)&0xff);
  203.         CSN=1;
  204. }
  205. void Read_Packet(){                                        //¶áêy¾Y°ü,ò£¿Øêy¾Y
  206.         u8 i;
  207.         CSN=0;
  208.         SPIwrite(0x45);
  209.         for (i=0;i<21;i++)packet[i]=SPIread();
  210.         CSN=1;
  211. }
  212. void Strobe(u8 address){                        //Ä£¿éé趨
  213.         CSN=0;
  214.         SPIwrite(address);
  215.         CSN=1;
  216. }

  217. ////end
  218. void bind_Flysky(){                                        //¶ÔÆμ
  219.         u8 i,counter1=255;
  220.         Strobe(0xA0);
  221.         Strobe(0xF0);
  222.         AREG_write(0x0F,0x00);//±è·¢éäμíò»Æμμà
  223.         Strobe(0xC0);
  224.         while(counter1){
  225.                 delay_ms(10);
  226.                 if(counter1&0x04)LED=1;
  227.                 else LED=0;               
  228.                 if(GIO==0){
  229.                         if((AREG_read(0x00)&0x60)==0){                                       
  230.                                 Read_Packet();
  231.                                 for(i=0;i<21;i++)txid[i]=packet[i];
  232.                                 break;
  233.                         }
  234.                         else{
  235.                                 Strobe(0xA0);
  236.                                 Strobe(0xF0);
  237.                                 AREG_write(0x0F,0x00);
  238.                                 Strobe(0xC0);
  239.                                 continue;
  240.                         }
  241.                 }
  242.                 else{
  243.                 --counter1;
  244.                 if (counter1==0)counter1=255;
  245.                 //LED2=0;  //add    2017
  246.                 }
  247.         }        
  248. }
  249. void flysky_cb(){                                        //Ö÷Ñ-»·
  250.         u8 i,x;
  251.         channel=tx_channels[chanrow][chancol]-chanoffset;//ìøÆμμà
  252.         channel-=1;
  253.         Strobe(0xA0);
  254.         Strobe(0xF0);
  255.         AREG_write(0x0F,channel);//é趨Æμμà
  256.         Strobe(0xC0);
  257.         chancol=(chancol+1)%16;
  258.         while(1){
  259.                 if(mss>80){    //ÎTDÅoÅ1.5soó꧿ر£»¤
  260.                          #ifdef GUDING
  261.                                 Ltemp[2]=232;Htemp[2]=3;
  262.                         #endif        
  263.                         for(i=0;i<8;i++){
  264.                                 #ifdef GUDING        
  265.                                                 if(i==2)continue;
  266.                                                 Ltemp[i]=220;
  267.                                                 Htemp[i]=5;
  268.                                 #else               
  269.                                                 Ltemp[i]=txid[2*i+5];
  270.                                                 Htemp[i]=txid[2*i+6];
  271.                                 #endif
  272.                         }
  273.                 }
  274.                 if(hch){                 //′óóú20ms¼óìø
  275.                         hch=0;LED=0;
  276.                         chancol=(chancol+1)%16;
  277.                 //        channel=tx_channels[chanrow][chancol]-1-chanoffset;
  278.                         break;
  279.                 }
  280.                 if (GIO==1)continue;
  281.                 x=AREG_read(0x00);
  282.                 if(x&0x60)continue;//êy¾Y¼ìÑé
  283.                 Read_Packet();//¶áò£¿Øêy¾Y               ¡y¡y¡y¡y¡yÆ¥ÅäID
  284.                 if (!(packet[1]==txid[1])&&!(packet[2]==txid[2])&&!(packet[3]==txid[3])&&!(packet[4]==txid[4]))continue;
  285.                 mss=0;
  286.                 if(cb){
  287.                         for (i=0;i<8;i++){//êä3ö                1000~2000
  288.                                 EA=0;               //×üÖD¶Ï¿a1Ø:1Ø
  289.                                 x=packet[6+(2*i)];
  290.                                 if((x>=3)&&(x<=8) ){        //·àÖ1òç3ö
  291.                                         Ltemp[i]=packet[5+(2*i)];
  292.                                         Htemp[i]=x;
  293.                                 }
  294.                                 EA=1;               //×üÖD¶Ï¿a1Ø:¿a
  295.                         }
  296.                 }        
  297.                 if(cb)LED=1;
  298.                 break;
  299.         }
  300. }
  301. void flysky_init(){          //3õê¼»ˉ
  302.         u8 i,k;
  303.         u16 HT;
  304.         P1M0 = 0x03;     //(00000011B)  éèÖÃ1¿ú01Îa10×′ì¬
  305.         P3M0 = 0xcf;     //(11001111B)  éèÖÃ3¿ú012367Îa10×′ì¬
  306.         P5M0 = 0x20;     //(00100000B)  5.5 led£»5.4 bind

  307.         TMOD = 0x01;AUXR = 0x00;      //(00000001)  T0·Ç×Ô¶ˉÖØ×°·½ê½;T2Îa12TÄ£ê½

  308.         IE |= 0x82;IE2 |= 0x04;       //(10000010)  EA ET0 ¿aÖD¶Ï;//¶¨ê±Æ÷2 ¿aÖD¶Ï
  309.         bind=1;CSN=1;MDI=1;SCK=0;
  310.         delay_ms(10);
  311.         AREG_write(0x00,0x00);
  312.         A7105_WriteID(0x5475c52A);
  313.         for (i = 0; i < 0x33; i++){
  314.                 if(A7105_regs[i] != 0xff)
  315.                         AREG_write(i, A7105_regs[i]);
  316.         }        
  317.         Strobe(0xA0);
  318.         AREG_write(0x02,0x01);
  319.         //ErrorLED();  //  Ã»Îêìa£¬¿éòÔÖ′DD
  320.         while(AREG_read(0x02));     //Õa3öÏÖÎêìaáË£¬Ñ-»·Ã»óD3öà′
  321.         ErrorLED();    //  óDÎêìa£¬Ã»óDÖ′DD£¬ó|¸Ã¶ÏÔúÑ-»·ÖD£¬Ã»3öà′
  322.         AREG_write(0x24,0x13);
  323.         AREG_write(0x26,0x3b);
  324.         AREG_write(0x0F,0x00);
  325.         AREG_write(0x02,0x02);
  326.         while(AREG_read(0x02));
  327.         AREG_write(0x0F,0xA0);
  328.         AREG_write(0x02,0x02);
  329.         while(AREG_read(0x02));
  330.         AREG_write(0x25,0x08);
  331.         Strobe(0xA0);
  332.          while(1){
  333.                 LED=1;
  334.                 delay_ms(500);
  335.                 LED=0;
  336.                 delay_ms(500);
  337.                 if(bind==1){
  338.                         IDWR(0);                //¶áè¡ID
  339.                         cb=1;
  340.                         if(txid[0]==0xaa)break;
  341.                         else continue;
  342.                 }
  343.                 else{
  344.                         bind_Flysky();//¶ÔÆμ
  345.                         LED=1;        
  346.                         delay_ms(500);
  347.                         LED=0;
  348.                         delay_ms(500);
  349.                         //TR0=TR1=1;              //Modify
  350.                         TR0=1;AUXR|=0x10;
  351.                         cb=0;
  352.                         break;
  353.                 }
  354.         }                        
  355.         //¡y¡y¡y¡y¡y¡y¡y¡yoÏÆ′ID
  356.         id=(txid[1]|((u32)txid[2]<<8)|((u32)txid[3]<<16)|((u32)txid[4]<<24));        
  357.         chanrow=id%16;
  358.         chanoffset=(id&0xff)/16;
  359.         chancol=0;
  360.         if(chanoffset>9)chanoffset=9;
  361.         while(TR0){
  362.                 ////if(bind){IDWR(1);LED=0;TR0=TR1=0;while(1){LED=1;delay_ms(1000);LED=0;delay_ms(1500);};}
  363.                 if(bind){IDWR(1);LED=0;TR0=0;AUXR=0x00;while(1){LED=1;delay_ms(1000);LED=0;delay_ms(1500);};}    //Modify
  364.                 flysky_cb();//4:1024  5:1280  6:1536  7:1792  8:2048
  365.                 if(mss>5){mss=0;
  366.                         for(i=0;i<8;i++){
  367.                                 if((i>3)||(i==2)){
  368.                                         Ltemp[i]=txid[2*i+5]=packet[2*i+5];
  369.                                         Htemp[i]=txid[2*i+6]=packet[2*i+6];
  370.                                         continue;
  371.                                 }
  372.                                 if((packet[2*i+6]<5)||(packet[2*i+6]>6)){
  373.                                         if(k&(1<<i)){k&=(0xfe<<i);LED=1;
  374.                                                 HT=(u16)txid[2*i+5]|(u16)(txid[2*i+6]<<8);
  375.                                                 if(packet[2*i+6]<5){if(HT>900)HT-=100;}
  376.                                                 else if(HT<2000)HT+=100;
  377.                                                 Ltemp[i]=txid[2*i+5]=HT&0xff;
  378.                                                 Htemp[i]=txid[2*i+6]=(HT>>8)&0xff;}
  379.                                         }
  380.                                 else k|=(1<<i);                        
  381.                         }                        
  382.                 }
  383.         }
  384. }
  385. void main(){
  386.    
  387.         flysky_init();
  388.         //Æô¶ˉ¼óìøoíêä3ö¶¨ê±Æ÷ -- Modify
  389.         TR0=1;AUXR |= 0x10;            //T0ÎaìøÆ춨ê±Æ÷£¬T2Îaêä3ö¶¨ê±Æ÷
  390.         while(1)flysky_cb();
  391. }

  392. void et0()interrupt 1{                                                  //¼óìø¶¨ê±Æ÷
  393.         //TH0 =248;TL0 =50;                                              //@12Mhz  2ms        +2
  394.   //3õÖμ=65536-(12000000/12)*0.020=45536=B1E0   16λ@12Mhz  20ms
  395.         TH0=0xb1;TL0=0xe0;                                            //@12Mhz  20ms
  396.         //TH0=0xD8;TL0=0xF0;                            //@12Mhz  10ms
  397.         //TH0=0x3C;TL0=0xB0;                            //@12Mhz  50ms
  398.         hch=1;
  399.         mss++;

  400. }

  401. void et2()interrupt 12{                                //êä3ö¶¨ê±Æ÷£¬¶¨ê±Æ÷T2ÖD¶Ï3ìDò

  402.         CH1=0;CH2=0;CH3=0;
  403.         CH4=0;CH5=0;CH6=0;
  404.          
  405.         T2H=255-Htemp[ch];                    //@12Mhz   252                3
  406.         T2L=255-Ltemp[ch];                    //@12Mhz   23                232
  407.         switch (ch) {

  408.                                 case 0:        CH1=1;break;            //¸±òí
  409.         case 1:        CH2=1;break;            //éy½μ
  410.         case 2:        CH3=1;break;            //·½Ïò
  411.                           case 3:        CH4=1;break;            //
  412.         case 4:        CH5=1;break;            //
  413.                           case 5:        CH6=1;break;            //
  414.         }
  415.       ch=(ch+1)%6;
  416. }

复制代码


作者: wangluoqishi    时间: 2018-8-11 17:55
w7767896789 发表于 2018-8-3 19:26
多谢楼主,我在你的代码基础上修改成6通道的程序了,我看代码最多能改成8通道,但是我fs-I6没有刷固件,原厂固 ...

pwm输出的是电机信号

作者: wangluoqishi    时间: 2018-8-11 17:56
jianwen0527 发表于 2018-8-2 23:02
楼主有没有 二代的代码呢。那个芝士蛋糕的下载不了

github上有二代的代码,没测试过

作者: gosong    时间: 2018-8-12 00:23
楼主你好,我自己在做stc15w型号的(用stc11f04e的diy成功),做了4个15w都下载不了程序,(按图片说明插txd-9,rxd-10),能教我要怎么下载程序吗?谢谢

作者: wangluoqishi    时间: 2018-8-12 11:48
gosong 发表于 2018-8-12 00:23
楼主你好,我自己在做stc15w型号的(用stc11f04e的diy成功),做了4个15w都下载不了程序,(按图片说明插tx ...

下载很简单的,有可能你芯片坏了吧,换一个芯片试一试

作者: gosong    时间: 2018-8-12 11:53
wangluoqishi 发表于 2018-8-12 11:48
下载很简单的,有可能你芯片坏了吧,换一个芯片试一试

好的谢谢我试试


作者: dukecheng    时间: 2018-10-18 10:29
楼主能改程序增加ppm输出吗

作者: boutd    时间: 2018-10-24 18:07
  不错 啊  参考
作者: boutd    时间: 2018-12-5 09:28
最后把源代码贴上  --  不错啊  再次备忘
作者: fengjlong    时间: 2018-12-10 23:44
学习了,支持楼主!!!
作者: tcjsjxx    时间: 2019-5-24 21:41
楼主,这个接收距离如何?

作者: shorty    时间: 2019-6-5 18:17
有教学吗 需要买哪些零件
作者: gaocl    时间: 2019-6-8 15:11
本帖最后由 gaocl 于 2019-6-8 15:13 编辑

接线图或原理图呢?不会跟STC11f04E那个是一样的吧?
作者: wangluoqishi    时间: 2019-6-14 23:26
tcjsjxx 发表于 2019-5-24 21:41
楼主,这个接收距离如何?

用一代协议,距离稍远一点  玩小飞机够用了  大飞机不建议用,存在失控风险



作者: wangluoqishi    时间: 2019-6-14 23:29
shorty 发表于 2019-6-5 18:17
有教学吗 需要买哪些零件

主要就是stc单片机    这就是自己玩一玩,要是做成品就需要自己绘制电路板了  有基础就简单多了

作者: wangluoqishi    时间: 2019-6-14 23:30
gaocl 发表于 2019-6-8 15:11
接线图或原理图呢?不会跟STC11f04E那个是一样的吧?

源代码里对应的单片机端口   对应上就行

作者: gaocl    时间: 2019-7-12 16:57
本帖最后由 gaocl 于 2019-7-12 19:36 编辑

可以打个板子出来分享
作者: 4920614    时间: 2019-8-13 07:05
还是开源的东西好  特别是航模这个爱好  感谢楼主的分享和爱捣鼓的铁牛们
作者: hanhan235813    时间: 2019-9-9 21:50
楼主,按照你的程序烧录后,对频时灯一直闪,无法和接收机连接。下图是按照之前STC11F04E的接线图画的,你看和你制作的连接方式有哪些不一样的? (, 下载次数: 232)

作者: 炽羽渡尘    时间: 2020-2-8 16:41
楼主你好,请问现在还有哪里可以找到芝士蛋糕的高频头固件吗

作者: xunlongliu    时间: 2021-11-27 06:39
我怎么看这个主芯片的定义有点像富斯R8B接收机用的芯片(原厂的R8B接收机主芯片没有字)

作者: XQ8398    时间: 2021-12-1 17:01

作者: hitzkz    时间: 2022-4-18 16:01
gosong 发表于 2018-8-12 00:23
楼主你好,我自己在做stc15w型号的(用stc11f04e的diy成功),做了4个15w都下载不了程序,(按图片说明插tx ...

大佬手头有资料吗?或者链接啥的,我现在手头也只有11F04的单片机





欢迎光临 5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年) (http://wz.5imx.com/) Powered by Discuz! X3.3