找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8491|回復(fù): 9
收起左側(cè)

安卓APP控制+單片機(jī)315M無線解碼的七路遙控開關(guān)源碼_學(xué)習(xí)型_成品

  [復(fù)制鏈接]
ID:134239 發(fā)表于 2018-9-2 20:14 | 顯示全部樓層 |閱讀模式
安卓控制+315M無線通信單片機(jī)軟件解碼
成品以運(yùn)行一年以上

手機(jī)控制由易安卓編寫的APP(只寫了安卓程序而且寫的不太好)。
原理圖與線路圖由PADS9.5編輯。
一些調(diào)試工具由易語言編輯。

http://www.torrancerestoration.com/bbs/dpj-54638-1.html 單路
http://www.torrancerestoration.com/bbs/dpj-54161-1.html 四路
http://www.torrancerestoration.com/bbs/dpj-94000-1.html 六路
STC15W408AS模擬315M 2272解碼程序
工作頻率:12M
說明:7路繼電器輸出,7LED指示,1LED電源指示,1微動(dòng)開關(guān)K1。
          按K1進(jìn)入編輯模式,LED指示燈全亮。
          在編輯模式下 ,按下遙控器鈕,LED1亮>>LED2亮>>LED3亮>>LED4亮>> LED5亮>>LED6亮>>LED7亮>>全亮(此模式存儲(chǔ)的遙控碼是關(guān)閉所有的LED)>>退出編輯模式。
          在編輯模式下 ,按K1退出編輯模式或存儲(chǔ)有效的遙控碼。
          在編輯模式下 ,長(zhǎng)按K1 (10S) 刪除所有存儲(chǔ)的遙控碼。      
          在正常模式下 , 按下遙控器鈕,及相應(yīng)的LED.繼電器亮滅。
注意: 同一條遙控碼 在同一個(gè)LED上存兩條,相當(dāng)于亮了又滅,無動(dòng)作。
優(yōu)點(diǎn): 能接收2262的1.2M-4.7M電阻編碼,幾乎所有的315M遙控器都兼容。
         由于定時(shí)讀引腳,抗干擾能力強(qiáng) ,和硬件解碼距離無區(qū)別。
缺點(diǎn):占用單片機(jī)資源比較多。

電路原理圖如下:
0.png

pcb文件在附件中:
0.png

單片機(jī)源程序如下:

  1. #include "stc15XX.h"
  2. #include "flash.h"
  3. #include "delay.h"
  4. #define FOSC 11059200

  5. //typedef unsigned int u16;  //16位無符號(hào)整型數(shù)
  6. //typedef unsigned char u8;  //8位無符號(hào)整型數(shù)

  7. sbit IR_INPUT = P5^5;

  8. sbit KEY1 = P3^2;

  9. sbit led1 = P3^3;
  10. sbit led2 = P3^4;
  11. sbit led3 = P3^5;
  12. sbit led4 = P3^6;
  13. sbit led5 = P3^7;
  14. sbit led6 = P1^0;
  15. sbit led7 = P1^1;


  16. sbit JD1 = P5^4;
  17. sbit JD2 = P1^7;
  18. sbit JD3 = P1^6;
  19. sbit JD4 = P1^5;
  20. sbit JD5 = P1^4;
  21. sbit JD6 = P1^3;
  22. sbit JD7 = P1^2;





  23. bit WiFi_200=0;           //200MS標(biāo)記
  24. bit WiFi_OK=0;           //模塊返回?cái)?shù)據(jù)與比對(duì)值匹配標(biāo)記
  25. bit CongZi=0;
  26. u8 Index;                   //比對(duì)值索引
  27. u8 WiFi_Step=0;    //模塊啟動(dòng)執(zhí)行到的步數(shù)
  28. u16 value;
  29. u16 SS_HZ;
  30. u8 T0RL;
  31. u16 Restart=0;



  32. u8 T0RL = 0;  //T0重載值的低字節(jié)
  33. u8 ms =1;
  34. u8 ircode_x[3];  //編輯模式解碼中間值
  35. u8 ircodex[3];
  36. u8 ircode[6];
  37. u16 code Tm_bz[]={ 31 ,156 ,114 ,134 ,2 ,16 ,8 };         
  38. u8 code YaoKongSu_4 = 8;       //遙控碼個(gè)數(shù)
  39. u8 code DaiMaTiaoSu_20 = 20;  //遙控條數(shù)
  40. bit WanCengBiaoJi = 0;         //        讀完一組數(shù)據(jù)的標(biāo)記
  41. bit Bianji = 0;         //進(jìn)入編輯標(biāo)記
  42. u8 JIBU=0;    //按鍵第幾步標(biāo)記
  43. u8 E2BiaoJi;
  44. u8 pdata Tm1[50];


  45. u8 code WiFi_0[] = "AT\r\n";                        //AT命令是模塊就緒
  46. u8 code WiFi_1[] = "AT+CWMODE=2\r\n";            //設(shè)置為AP模式
  47. u8 code WiFi_2[] = "AT+CWSAP=\"AT-00\",\"12345678\",8,4\r\n ";           //設(shè)置路由
  48. u8 code WiFi_3[] = "AT+RST\r\n";                //重啟模塊                 
  49. u8 code WiFi_4[] = "AT+CIFSR\r\n";                        //獲取本地IP地址
  50. u8 code WiFi_5[] = "AT+CIPMUX=1\r\n";            //啟用多線程
  51. u8 code WiFi_6[] = "AT+CIPSERVER=1,19730\r\n";        //啟用服務(wù)器功能
  52. u8 code WiFi_Len[] = { sizeof(WiFi_0)-1, sizeof(WiFi_1)-1, sizeof(WiFi_2)-1,sizeof(WiFi_3)-1,
  53.                   sizeof(WiFi_4)-1, sizeof(WiFi_5)-1, sizeof(WiFi_6)-1};
  54. u8 code *WiFi_Ptr[] = {&WiFi_0[0],  &WiFi_1[0],  &WiFi_2[0], &WiFi_3[0],
  55.                        &WiFi_4[0],  &WiFi_5[0],  &WiFi_6[0]};
  56. u8 code WiFi_syz[] = { 0,0,0,0,1,0,0,2 };                                            

  57. void ConfigTimer0(u8 ms);        //定時(shí)器0配置
  58. void ConfigTimer3(u8 ms);        //定時(shí)器:CCP/PCA功能實(shí)現(xiàn)16位定時(shí)器功能
  59. void WiFi_initial();            //模塊初始化流程

  60. u8  S_Take(u8 *ptr);                                                                                  //返回字符串長(zhǎng)度
  61. u8  Add_character(u8 *ptr1,u8 len ,u8 ptr);                   //字符串結(jié)尾加字符  
  62. u8  Add_Merge0(u8 *ptr1,u8 len,u8 *ptr2 );                    //字符串合并0         
  63. u8  Add_Merge1(u8 *ptr1, u8 len1 ,u8 *ptr2, u8 len2 ,u8 Ten );//字符串合并1         
  64. u8  Compare(u8 *ptr1, u8 len1, u8 *ptr2, u8 len2);            //字符串查找函數(shù)                                                                                                                                         
  65. void AT_CIPSEND(u8 dat,u8 len);                                                                  //AT命令組裝并發(fā)送

  66. extern void UartDriver();                           // 串口驅(qū)動(dòng)函數(shù)
  67. extern void ConfigUART();                           // 串口配置函數(shù)
  68. extern void UartRxMonitor(u8 ms);           // 串口接收監(jiān)控
  69. extern void UartWrite(u8 *buf, u8 len);// 串口數(shù)據(jù)寫入
  70. /*以下為模擬2262解碼調(diào)用程序 */
  71. void Decoding(u8 add);        //脈沖解碼 ,接收到脈沖編譯成遙控條碼
  72. void Edit();                        //進(jìn)入編輯模式,以便于存儲(chǔ)遙控條碼
  73. void LED_add();                        //編輯模式下LED順序累加
  74. void Flash_Delete();        //刪除Flash記錄,刪除所有的遙控條碼
  75. void LED_Mode(u8 add,u8 add1);         //LED模式變換與查找
  76. void Initialization();        //初始化
  77. void Button_scan();                //按鈕掃描         需在定時(shí)中斷中調(diào)用
  78. void Flash_seek();                //Flash中查找對(duì)應(yīng)值


  79. void main ()
  80. {        
  81.         EA = 1;            //開總中斷
  82.     ConfigTimer0(124); //配置T0定時(shí)1ms
  83.         ConfigTimer3(5);   //CCP/PCA定時(shí)器1ms
  84.     ConfigUART();      //配置波特率為115200

  85.         IR_INPUT = 1;      //接收引腳
  86.         Initialization();  //2622模擬解碼初始化        

  87.     while (1)
  88.     {          //AT流程用
  89.           UartDriver();  //調(diào)用串口驅(qū)動(dòng)
  90.                   if(WiFi_200==1)        //200ms進(jìn)入流程標(biāo)記
  91.                   { WiFi_200=0; WiFi_initial();} //模塊初始化流程
  92.                   //2622模擬解碼用
  93.                   if(WanCengBiaoJi == 1)
  94.                   {        WanCengBiaoJi = 0;
  95.                                    Decoding(0);
  96.                                    Decoding(1);
  97.                                    if((ircode[0]==ircode[3]) && (ircode[1]==ircode[4]) && (ircode[2]==ircode[5]) && ms!=0)
  98.                                    {
  99.                                                    if((ircodex[0]==ircode[0]) && (ircodex[1]==ircode[1]) && (ircodex[2]==ircode[2]) )
  100.                                                         {    ms=1;        }
  101.                                                         else
  102.                                                         {
  103.                                                                  ircodex[0]=ircode[0];
  104.                                                                  ircodex[1]=ircode[1];
  105.                                                                  ircodex[2]=ircode[2];                                                                  
  106.                                                                  if(Bianji==1)
  107.                                                          { ms = 1; LED_add();}
  108.                                                                  else
  109.                                                                  { ms=0;}
  110.                                                         }
  111.                                         }
  112.                                  
  113.                         ET0 = 1;
  114.                         
  115.                   }
  116.     }
  117. }
  118. /*===============================================================================  
  119.   以下為AT控制流程
  120.   ===============================================================================*/

  121. /*AT初始化流程_子程序  
  122.   Ten-命令索引值 sx-成功跳轉(zhuǎn)值 tc=失敗跳轉(zhuǎn)值 */
  123. void WiFi_initial0(u8 Ten)
  124. {
  125.      static u8 JiShi=0;                    //計(jì)數(shù)
  126.          static bit WiFi_fasong=0;  //命令發(fā)送標(biāo)記
  127.          
  128.          Index=WiFi_syz[Ten] ;        //比對(duì)值索引
  129.          if(WiFi_fasong==0)            //發(fā)送數(shù)據(jù)
  130.          {  WiFi_fasong=1;  UartWrite(WiFi_Ptr[Ten], WiFi_Len[Ten]); }
  131.          if(WiFi_OK==1)                   //比對(duì)成功返回標(biāo)記
  132.          {  WiFi_OK=0;  WiFi_fasong=0; JiShi=0;  WiFi_Step=Ten+1; return;}
  133.          JiShi++;         
  134.          if((JiShi&0x07)==0)  //進(jìn)入7次重新初始化發(fā)送標(biāo)記
  135.          {  WiFi_fasong=0; }
  136.          if(JiShi>=50)                  //發(fā)送多次未果認(rèn)定失敗
  137.          { WiFi_fasong=0; JiShi=0; WiFi_Step=10;}
  138. }
  139. //AT初始化流程
  140. void WiFi_initial()         
  141. {                    
  142.           //200ms進(jìn)入一次
  143.           switch (WiFi_Step)     //第幾步索引值
  144.           {         case 0:                        
  145.                         WiFi_initial0(0);//AT命令是模塊就緒
  146.                         break;
  147.              case 1:
  148.                 WiFi_initial0(1);//設(shè)置為AP模式        
  149.                 break;
  150.                  case 2:
  151.                         if(CongZi==1)
  152.                         WiFi_initial0(2);//設(shè)置路由
  153.                         else
  154.                         WiFi_Step=3;
  155.                 break;
  156.                  case 3:
  157.                          WiFi_initial0(3);//重啟模塊         
  158.                 break;
  159.                  case 4:         
  160.                         WiFi_initial0(4);// 獲取本地IP地址
  161.                 break;
  162.                  case 5:
  163.                         WiFi_initial0(5);//啟用多線程
  164.                 break;        
  165.                  case 6:
  166.                         WiFi_initial0(6);//啟用服務(wù)器功能
  167.                 break;                  
  168.                   case 7:
  169.                         Index=WiFi_syz[7];
  170.                         WiFi_Step=8;
  171.                     break;
  172.                  case 8:
  173.                         Restart++;
  174.                         if(Restart > 3000) //10分鐘初始化模塊
  175.                         { Restart=0; WiFi_Step=0; }
  176.                     break;
  177.          default:                                          
  178.                         WiFi_Step=0;                                
  179.                     break;
  180.                     
  181.           }         
  182. }

  183. void LED_Action(u8 *ptr,u8 len)
  184. {
  185.          u8 i;
  186.          bit tem;

  187.          if(ptr[len]=='0')
  188.          {  tem=0;  }
  189.          else
  190.          {  tem=1;  }
  191.          
  192.          for (i=0; i<8; i++)
  193.          {          len++;
  194.               if(ptr[len]=='1')
  195.                    {
  196.                           switch (i)     
  197.                           {         case 0: led1 = tem ; JD1 = !tem ;break;
  198.                                  case 1: led2 = tem ; JD2 = !tem ;break;
  199.                                  case 2: led3 = tem ; JD3 = !tem ;break;
  200.                                  case 3: led4 = tem ; JD4 = !tem ;break;
  201.                                  case 4: led5 = tem ; JD5 = !tem ;break;
  202.                                  case 5: led6 = tem ; JD6 = !tem ;break;
  203.                                  case 6: led7 = tem ; JD7 = !tem ;break;
  204.                                  default: break;
  205.                            }
  206.                           
  207.                   }
  208.                   
  209.          }

  210. }
  211. u8 LED_state(u8 *ptr,u8 len)
  212. {         
  213.      if(led1)
  214.          {  ptr[len]='1'; }
  215.          else
  216.          {  ptr[len]='0'; }
  217.          len++;
  218.          if(led2)
  219.          {  ptr[len]='1'; }
  220.          else
  221.          {  ptr[len]='0'; }
  222.          len++;
  223.          if(led3)
  224.          {  ptr[len]='1'; }
  225.          else
  226.          {  ptr[len]='0'; }
  227.          len++;
  228.          if(led4)
  229.          {  ptr[len]='1'; }
  230.          else
  231.          {  ptr[len]='0'; }
  232.          len++;
  233.          if(led5)
  234.          {  ptr[len]='1'; }
  235.          else
  236.          {  ptr[len]='0'; }
  237.          len++;
  238.          if(led6)
  239.          {  ptr[len]='1'; }
  240.          else
  241.          {  ptr[len]='0'; }
  242.          len++;
  243.          if(led7)
  244.          {  ptr[len]='1'; }
  245.          else
  246.          {  ptr[len]='0'; }
  247.          len++;        
  248.          ptr[len]='1';
  249.          len++;
  250.          return len;
  251. }

  252. /*命令的匯總處理,收到的數(shù)據(jù)格式; +IPD,0,15:@@@@AAT_00  
  253.   ptr-待處理數(shù)據(jù) len 通道位  len1 數(shù)據(jù)起始位 */
  254. void Command(u8 *ptr, u8 len,u8 Ten)
  255. {         
  256.          u8 pdata HuiDa[18];                   //回答字符串
  257.          u8 HuiDa_len;  //回答字符串長(zhǎng)度
  258.      u8 GeSu;                                                           //到達(dá)數(shù)據(jù)長(zhǎng)度緩存值
  259.       
  260.          GeSu =ptr[len+2]-48;
  261.          if(ptr[len+3]!=':')
  262.          { GeSu =GeSu*10+(ptr[len+3]-48); }           //計(jì)算收到數(shù)據(jù)長(zhǎng)度
  263.          GeSu=GeSu-3;                                                   //去掉5位校驗(yàn)位
  264.          Restart=0;

  265.          if(ptr[Ten]=='A')
  266.          {         HuiDa_len = 0;
  267.                 HuiDa_len = Add_Merge0(HuiDa,HuiDa_len,"@@");
  268.                 HuiDa_len = Add_character(HuiDa,HuiDa_len,'A');
  269.                 HuiDa_len = Add_Merge0(HuiDa,HuiDa_len,"\r\n");
  270.                 AT_CIPSEND(ptr[len],HuiDa_len);
  271.                 UartWrite(HuiDa,HuiDa_len);
  272.             WiFi_Step=0;
  273.          }
  274.          else if(ptr[Ten]=='B')
  275.          {  
  276.                  LED_Action(ptr,Ten+1);
  277.             HuiDa_len = 0;
  278.                 HuiDa_len = Add_Merge0(HuiDa,HuiDa_len,"@@");
  279.                 HuiDa_len = Add_character(HuiDa,HuiDa_len,'C');
  280.                 HuiDa_len = LED_state(HuiDa,HuiDa_len);                                                                        
  281.                 HuiDa_len = Add_Merge0(HuiDa,HuiDa_len,"\r\n");
  282.                 AT_CIPSEND(ptr[len],HuiDa_len);
  283.                 UartWrite(HuiDa,HuiDa_len);        
  284.                           
  285.          }
  286.          else if(ptr[Ten]=='C')
  287.          {  HuiDa_len = 0;
  288.                 HuiDa_len = Add_Merge0(HuiDa,HuiDa_len,"@@");
  289.                 HuiDa_len = Add_character(HuiDa,HuiDa_len,'C');
  290.                 HuiDa_len = LED_state(HuiDa,HuiDa_len);                                                                        
  291.                 HuiDa_len = Add_Merge0(HuiDa,HuiDa_len,"\r\n");
  292.                 AT_CIPSEND(ptr[len],HuiDa_len);
  293.                 UartWrite(HuiDa,HuiDa_len);                  
  294.          }
  295. }
  296.         
  297. /*數(shù)據(jù)到達(dá)處理,提取通道位置與數(shù)據(jù)真正起始位,收到的數(shù)據(jù)格式; +IPD,0,15:@@@@AAT_00
  298.   ptr-待處理數(shù)據(jù)  len-處理的起始位*/
  299. void Data_arrival(u8 *ptr, u8 len)
  300. {           
  301.            
  302.            if (ptr[len+1]==',' && ptr[len+3]==':')
  303.            {
  304.                      if(ptr[len+4]=='@' && ptr[len+5]=='@' )
  305.                   {               
  306.                                 Command(ptr,len,len+6);
  307.                   }           
  308.            }
  309.            else if (ptr[len+1]==',' && ptr[len+4]==':')
  310.            {
  311.                      if(ptr[len+5]=='@' && ptr[len+6]=='@' )
  312.                   {               
  313.                                 Command(ptr,len,len+7);
  314.                   }           
  315.            }
  316. }

  317. /* 串口動(dòng)作函數(shù),根據(jù)接收到的數(shù)據(jù)響應(yīng)的動(dòng)作
  318.    buf-接收到的數(shù)據(jù)幀指針,len-數(shù)據(jù)幀長(zhǎng)度 */
  319. void UartAction(u8 *ptr, u8 len)
  320. {
  321.     u8 FanHui;
  322.         u8 code cmd0[] = "OK";
  323.         u8 code cmd1[] = "+CIFSR:APIP";
  324.         u8 code cmd2[] = "+IPD,";  
  325.     u8 code cmdLen[] = {  sizeof(cmd0)-1, sizeof(cmd1)-1, sizeof(cmd2)-1};
  326.     u8 code *cmdPtr[] = {&cmd0[0],  &cmd1[0],  &cmd2[0]};
  327.         
  328.         if (len >= cmdLen[Index])  //首先接收到的數(shù)據(jù)長(zhǎng)度要不小于對(duì)比值長(zhǎng)度
  329.         {   
  330.                 FanHui=Compare(ptr,len,cmdPtr[Index],cmdLen[Index]);
  331.             if (FanHui>0)  //查找到匹配值
  332.                 {
  333.                         if(Index==WiFi_syz[7])
  334.                         {   Data_arrival(ptr, FanHui); } //數(shù)據(jù)進(jìn)一步處理
  335.                         else
  336.                         {   WiFi_OK=1; }
  337.                 }        
  338.         }        
  339. }

  340. /* 配置并啟動(dòng)T0,us-T0定時(shí)時(shí)間 */
  341. void ConfigTimer0(u8 ms)
  342. {        
  343.     unsigned long tmp;  //臨時(shí)變量

  344.         tmp = FOSC / 1000 / 12 ;      //定時(shí)器計(jì)數(shù)頻率
  345.         tmp        = tmp * ms /1000 ;
  346.     tmp = 256 - ms ;        //計(jì)算定時(shí)器重載值
  347.         TMOD &= 0xF0;  // 定時(shí)器工作方式  方式 :8位重裝模式計(jì)數(shù)器
  348.         TMOD |= 0x02;  //配置T0為模式2
  349.         T0RL = tmp;
  350.         TH0 = tmp;     //加載T0重載值
  351.     ET0 = 1;        //使能T0中斷
  352.     TR0 = 1;        //啟動(dòng)T0
  353.         PT0 = 1;        //配置T0中斷為高優(yōu)先級(jí)
  354. }

  355. /* 定時(shí)器:CCP/PCA功能實(shí)現(xiàn)16位定時(shí)器功能 */
  356. void ConfigTimer3(u8 ms)
  357. {
  358.         SS_HZ = FOSC / 1000 / 12 ;      //定時(shí)器計(jì)數(shù)頻率
  359.         SS_HZ = SS_HZ  * ms ;  //計(jì)算所需的計(jì)數(shù)值
  360.         value =         SS_HZ;
  361.         ACC =  P_SW1;
  362.         ACC &=         0xcf;               
  363.         P_SW1 = P_SW1;                //CCP_S0=0 CCP_S1=0
  364.         CCON = 0;                        //初始化PCA控制寄存器
  365.                             //清除CF標(biāo)志
  366.                                                 //PCA定時(shí)器停止
  367.                                                 //清除模塊中斷標(biāo)志                                       
  368.         CL = 0;                                //復(fù)位PCA寄存器
  369.         CH = 0;
  370.         CMOD = 0x00;                //設(shè)置PCA時(shí)鐘
  371.         CCAP0L = value;
  372.         CCAP0H = value>>8;
  373.         value += SS_HZ;
  374.         CCAPM0 = 0x49;                //PCA模塊0為16位定時(shí)器模式
  375.         CR = 1;                                //PCA定時(shí)器開始工作
  376.         
  377. }

  378. void InterruptTimer3() interrupt 7 using 1
  379. {
  380.          static u8 cnt=40;
  381.          
  382.          CCF0 = 0;
  383.          CCAP0L = value;
  384.          CCAP0H = value>>8;
  385.          value += SS_HZ;        
  386.      UartRxMonitor(1);  //串口接收監(jiān)控
  387.          if(cnt--==0)
  388.          { cnt=40; WiFi_200=1; WDT_CONTR=0x37; }   //喂狗  8.4S

  389.          Button_scan();
  390.      Flash_seek();
  391.                   
  392. }
  393. /*字符串結(jié)尾加字符 - 返回:字符串長(zhǎng)度
  394.   ptr1-被加入字符串 len-被加入位置  ptr-加入的單字節(jié)數(shù)據(jù)        */
  395. u8  Add_character(u8 *ptr1,u8 len ,u8 ptr)
  396. {
  397.         ptr1[len] = ptr;
  398.         len++;
  399.         ptr1[len] = '\0';
  400.         return len;
  401. }
  402. /*字符串合并0 - 返回:字符串長(zhǎng)度
  403.   ptr1-被加入字符串 len-被加入位置  ptr2-加入的字符串*/
  404. u8  Add_Merge0(u8 *ptr1,u8 len,u8 *ptr2 )
  405. {
  406.         while (*ptr2 != '\0')
  407.         { ptr1[len] = *(ptr2++); len++; }
  408.         ptr1[len]= '\0';
  409.         return len;
  410. }
  411. /*字符串合并1- 返回:字符串長(zhǎng)度
  412.   ptr1-被加入字符串      len1-被加入位置    ptr2-加入的字符串
  413.   len2-加入的字符串位置  Ten-加入的字符串長(zhǎng)度 */
  414. u8  Add_Merge1(u8 *ptr1, u8 len1 ,u8 *ptr2, u8 len2 ,u8 Ten )
  415. {
  416.         u8 i;
  417.     for (i=0; i<Ten; i++)
  418.         {  ptr1[len1+i] = ptr2[len2+i]; }
  419.         ptr1[len1+i] = '\0';
  420.         return (len1+i);
  421. }
  422. /*返回字符串長(zhǎng)度 */
  423. u8  S_Take(u8 *ptr)
  424. {
  425.         u8 len=0;
  426.         while (ptr[len] != '\0')
  427.         { len++; }
  428.         return len;
  429. }
  430. /* AT命令組裝并發(fā)送 樣本:AT+CIPSEND=0,23\r\n
  431.    dat-通道值 len-待發(fā)送數(shù)據(jù)長(zhǎng)度*/
  432. void AT_CIPSEND(u8 dat,u8 len)
  433. {
  434.      u8 pdata ZiFuc[20];        
  435.          u8        ZiFuc_Tem = 0;
  436.          u8 Ten;

  437.          // 最終字符串:AT+CIPSEND=0,123\r\n
  438.          ZiFuc_Tem = Add_Merge0(ZiFuc,ZiFuc_Tem,"AT+CIPSEND=");
  439.          ZiFuc_Tem = Add_character(ZiFuc,ZiFuc_Tem,dat);        // 寫入通道值
  440.          ZiFuc_Tem = Add_character(ZiFuc,ZiFuc_Tem,',');         
  441.          Ten=len/10%10;
  442.          if(Ten!=0);
  443.          {ZiFuc_Tem = Add_character(ZiFuc,ZiFuc_Tem,Ten+48);}   
  444.          Ten=len%10;
  445.      ZiFuc_Tem = Add_character(ZiFuc,ZiFuc_Tem,Ten+48);         
  446.          ZiFuc_Tem = Add_Merge0(ZiFuc,ZiFuc_Tem,"\r\n");
  447.          UartWrite(ZiFuc,ZiFuc_Tem);
  448.          Delay1ms(20);
  449. }
  450. /* 字符串比較函數(shù),比較兩個(gè)字符串?dāng)?shù)據(jù)是否相同 - 返回:1,成功 0,失敗
  451.    ptr1-被比較字符串   len1-被比較位置   ptr2-比較的字符串
  452.    len2-比較的字符串長(zhǎng)度  */
  453. bit Compare1(u8 *ptr1, u8 len1, u8 *ptr2, u8 len2)
  454. {
  455.           u8 i;

  456.           for (i=0; i<len2; i++)
  457.           {
  458.                     if (ptr1[i+len1] != ptr2[i])
  459.                   { return 0;}
  460.           }
  461.           return 1;
  462. }
  463. /*字符串查找函數(shù),查找字符串與比對(duì)值的首字節(jié)相等的位置,之后進(jìn)一步比對(duì) - 返回:0,失敗  非零, 字符串查找到的位置
  464.   ptr1-被查找字符串   len1-被查找長(zhǎng)度  ptr2-查找的字符串
  465.   len2-查找的字符串長(zhǎng)度  */
  466. u8 Compare(u8 *ptr1, u8 len1, u8 *ptr2, u8 len2)
  467. {         
  468.          u8 i;

  469.         for (i=0; i<(len1-len2); i++)
  470.         {        
  471.              if (ptr1[i] == ptr2[0])
  472.                  {   
  473.                       if ( Compare1(ptr1,i,ptr2,len2))
  474.                           {  return (i+len2); }
  475.                  }

  476.         }
  477.     return 0;  //比較完全部長(zhǎng)度數(shù)據(jù)都相等則返回1
  478. }
  479. /* ==========================================================================================
  480.    以下為模擬2262解碼調(diào)用程序
  481.    ==========================================================================================*/

  482. //脈沖解碼
  483. void Decoding(u8 add)
  484. {                 
  485.         u8 i, j, x, dat;
  486.         u8 byt;
  487.                
  488.                 x = add*25+1;
  489.         for(i=0; i<3; i++)
  490.         {    dat=i*8;
  491.                      for(j=0; j<8; j++)
  492.                          {      if(Tm1[dat+j+x]<=Tm_bz[6])
  493.                                         {  byt <<= 1; byt |= 0x01; }
  494.                                         else
  495.                                         {  byt <<= 1; }

  496.                          }        
  497.                      ircode[i+ add*3 ] = byt;                                                                        
  498.              }

  499. }
  500. void LED_Mode(u8 add,u8 add1)
  501. {   bit dat;
  502.         
  503.     switch(add)
  504.     {
  505.                 case 1: dat= led1;
  506.                                 _nop_();
  507.                                 led1=!dat;
  508.                         if(Bianji==0)
  509.                                 {JD1 = dat; }
  510.                 break;
  511.                 case 2:        dat= led2;
  512.                                 _nop_();
  513.                                 led2=!dat;
  514.                         if(Bianji==0)
  515.                                 {JD2 = dat; }
  516.                 break;
  517.                 case 3: dat= led3;
  518.                                 _nop_();
  519.                                 led3=!dat;
  520.                         if(Bianji==0)
  521.                                 {JD3 = dat; }
  522.                 break;
  523.                 case 4: dat= led4;
  524.                                 _nop_();
  525.                                 led4=!dat;
  526.                         if(Bianji==0)
  527.                                 {JD4 = dat; }
  528.                                 break;
  529.                 case 5: dat= led5;
  530.                                 _nop_();
  531.                                 led5=!dat;
  532.                         if(Bianji==0)
  533.                                 {JD5 = dat; }
  534.                 break;
  535.                 case 6: dat= led6;
  536.                                 _nop_();
  537.                                 led6=!dat;
  538.                         if(Bianji==0)
  539.                                 {JD6 = dat; }
  540.                 break;
  541.                 case 7: dat= led7;
  542.                                 _nop_();
  543.                                 led7=!dat;
  544.                         if(Bianji==0)
  545.                                 {JD7 = dat; }
  546.                 break;
  547.                 case 8: led1 = add1;led2 = add1;led3 = add1;led4 = add1;led5 = add1;led6 = add1; led7 = add1;
  548.                         if(Bianji==0)
  549.                                 {JD1 = !add1;JD2 = !add1; JD3 = !add1;JD4 = !add1;JD5 = !add1;JD6 = !add1;JD7 = !add1; WiFi_Step=0;}
  550.                                 break;
  551.             default:
  552.                         break;
  553.     }

  554. }
  555. //初始化
  556. void Initialization()
  557. {         
  558.         Bianji=0;
  559.         LED_Mode(8,1);   
  560.         JIBU=0;         
  561.    
  562.         P1M1= 0x00;          //1111 1100        推挽輸出                                                         
  563.         P1M0= 0xfc;          //1111 1100
  564.         P5M1= 0x20;          //0010 0000                                                                  
  565.         P5M0= 0x10;          //0001 0000


  566. }

  567. //遙控碼修改
  568. void Flash_Delete()
  569. {  if(Bianji==1)
  570.    {  eeprom_erase(0);        Initialization(); }
  571. }
  572. // 進(jìn)入編輯模式
  573. void Edit()
  574. {   u8 i;
  575.     u8 dat;

  576.         if(Bianji==0)
  577.         { Bianji=1;
  578.          
  579.           P1M1= 0xfc;          //1111 1100        推挽輸出                                                         
  580.           P1M0= 0xfc;          //1111 1100
  581.           P5M1= 0x30;          //0011 0000                                                                  
  582.           P5M0= 0x10;          //0001 0000

  583.           LED_Mode(8,0);
  584.           E2BiaoJi=0xff;
  585.       for(i=0; i<DaiMaTiaoSu_20; i++)
  586.       {           if(eeprom_read(i*YaoKongSu_4)==0xff)
  587.                        {E2BiaoJi=i; break;}
  588.       }
  589.         }
  590.           else
  591.     {        
  592.                 if (E2BiaoJi!= 0xff && JIBU!=0)
  593.         {      dat=        E2BiaoJi*YaoKongSu_4;         
  594.                            eeprom_write(dat+1,JIBU);        //標(biāo)記以寫入
  595.                            eeprom_write(dat,JIBU);        //標(biāo)記以寫入  
  596.                            eeprom_write(dat+2,JIBU);        //標(biāo)記以寫入
  597.                            eeprom_write(dat+3,ircode_x[0]);
  598.                            eeprom_write(dat+4,ircode_x[1]);
  599.                            eeprom_write(dat+5,ircode_x[2]);
  600.         
  601.                            
  602.                 }
  603.                 Initialization();
  604.                 CongZi=1;
  605.                 WiFi_Step=0;
  606.          }
  607.          
  608. }
  609. void LED_add()
  610. {     
  611.           JIBU++;
  612.     if(JIBU>8)
  613.         {   Initialization();  }
  614.         else  
  615.         {   ircode_x[0]=ircodex[0];
  616.                 ircode_x[1]=ircodex[1];
  617.                 ircode_x[2]=ircodex[2];
  618.                 LED_Mode(8,1);
  619.                 if(JIBU==8)
  620.                 LED_Mode(8,0);
  621.                 else
  622.                 LED_Mode(JIBU,1);
  623.     }
  624. }                                          


  625. /* T0中斷服務(wù)函數(shù),執(zhí)行接收2262到來的脈沖 */
  626. void EXINT1_ISR() interrupt 1
  627. {          static bit a1,a2,a3;
  628.           static u8 Tm_zz=0;
  629.           static u8 Tm_js=0;
  630.       static u8 Tm=0;


  631.       a3=a2;
  632.       a2=a1;
  633.           a1=IR_INPUT;
  634.           if(a1==a3)
  635.           {a2=a1;}

  636.          if(a3)
  637.           {                              
  638.                         switch(Tm_zz)
  639.                     {                        
  640.                                 case 0:      if(Tm==0)
  641.                                              {         
  642.                                                              if((Tm_js<Tm_bz[0] )|| Tm_js>Tm_bz[1])
  643.                                                                  { Tm_zz=0; Tm=0; Tm_js=0; TH0 = T0RL; }
  644.                                                                  else        
  645.                                                                     {  Tm++; Tm_zz=2; TH0 = 256- Tm_js; TL0=TH0;}
  646.                                                          }
  647.                                                          else
  648.                                                          {         if((Tm_js<Tm_bz[2] )|| Tm_js>Tm_bz[3] )
  649.                                                                  {  Tm_zz=0; Tm=0; Tm_js=0; TH0 = T0RL; }
  650.                                                                    else        
  651.                                                                     { Tm1[Tm]=256-TH0; Tm++; Tm_zz=2;}
  652.                                                          }
  653.                                 
  654.                                 break;
  655.                                 case 1:           if((Tm_js<Tm_bz[4] )|| Tm_js>Tm_bz[5])
  656.                                                          { Tm_zz=0; Tm=0; Tm_js=0; TH0 = T0RL; }         
  657.                                                          else
  658.                                                          { Tm1[Tm]=Tm_js; Tm++; Tm_zz=2;}
  659. ……………………

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

所有資料51hei提供下載:
遙控解碼7#-15w408.rar (4.52 MB, 下載次數(shù): 168)






評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:69311 發(fā)表于 2018-10-8 22:43 | 顯示全部樓層
謝謝樓主!分享的源碼對(duì)我?guī)椭艽螅?/td>
回復(fù)

使用道具 舉報(bào)

ID:134239 發(fā)表于 2018-12-8 11:40 | 顯示全部樓層
改進(jìn)版
0.png

遙控解碼7-15w408-20-1.5.7z

3.4 MB, 下載次數(shù): 89, 下載積分: 黑幣 -5

00

評(píng)分

參與人數(shù) 1黑幣 +90 收起 理由
admin + 90 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2018-12-11 02:54 | 顯示全部樓層

謝謝分享好東東,改進(jìn)了哪些地方?有時(shí)間做一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:473471 發(fā)表于 2019-7-6 23:31 來自手機(jī) | 顯示全部樓層
好資料,正需要,還有改進(jìn)版
回復(fù)

使用道具 舉報(bào)

ID:711438 發(fā)表于 2020-3-25 12:37 | 顯示全部樓層
沒太看懂,手機(jī)怎么控制315m模塊?wifi吧
回復(fù)

使用道具 舉報(bào)

ID:561138 發(fā)表于 2020-3-27 18:52 來自手機(jī) | 顯示全部樓層
666,功能還有APP控制
回復(fù)

使用道具 舉報(bào)

ID:65237 發(fā)表于 2020-4-8 20:27 | 顯示全部樓層
謝謝分享 正在學(xué)習(xí)中
回復(fù)

使用道具 舉報(bào)

ID:731155 發(fā)表于 2020-4-17 15:50 | 顯示全部樓層
很強(qiáng),還有APP控制
回復(fù)

使用道具 舉報(bào)

ID:65237 發(fā)表于 2020-7-7 21:19 | 顯示全部樓層
樓主你這WIFI模塊是什么型號(hào) 要怎樣配置才能使用  靜待你的佳音
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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