找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机315M解码程序_学习型六路无线遥控开关_成品 含原理图PCB

  [复制链接]
跳转到指定楼层
楼主
ID:134239 发表于 2017-9-7 17:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式








全部资料51hei下载地址:
遥控解码6#-15w204.rar (132.27 KB, 下载次数: 500)
http://www.51hei.com/bbs/dpj-54638-1.html 单路
http://www.51hei.com/bbs/dpj-54161-1.html 四路
STC15W204S模拟315M 2272解码程序
工作频率:12M
说明:6路继电器输出,6LED指示,1LED电源指示,1微动开关K1。
          按K1进入编辑模式,LED指示灯全亮。
          在编辑模式下 ,按下遥控器钮,LED1亮>>LED2亮>>LED3亮>>LED4亮>> LED5亮>>LED6亮>>全亮(此模式存储的遥控码是关闭所有的LED)>>退出编辑模式。
          在编辑模式下 ,按K1退出编辑模式或存储有效的遥控码。
          在编辑模式下 ,长按K1 (10S) 删除所有存储的遥控码。      
          在正常模式下 , 按下遥控器钮,及相应的LED.继电器亮灭。
注意: 同一条遥控码 在同一个LED上存两条,相当于亮了又灭,无动作。
优点: 能接收2262的1.2M-4.7M电阻编码,几乎所有的315M遥控器都兼容。
         由于定时读引脚,抗干扰能力强 ,和硬件解码距离无区别。
缺点:占用单片机资源比较多。


单片机源程序如下:
  1. //#include <reg52.h>
  2. #include "stc15w204s.h"
  3. #include "flash.h"                 
  4. typedef unsigned int u16;  //16位无符号整型数
  5. typedef unsigned char u8;  //8位无符号整型数

  6. sbit IR_INPUT = P1^1;
  7. sbit KEY1 = P1^0;
  8. sbit JD1 = P3^0;
  9. sbit JD2 = P3^1;
  10. sbit JD3 = P3^2;
  11. sbit JD4 = P3^3;
  12. sbit JD5 = P3^6;
  13. sbit JD6 = P3^7;

  14. sbit led1 = P5^5;
  15. sbit led2 = P5^4;
  16. sbit led3 = P1^5;
  17. sbit led4 = P1^4;
  18. sbit led5 = P1^3;
  19. sbit led6 = P1^2;


  20. u8 T0RL = 0;  //T0重载值的低字节
  21. u8 ms =1;
  22. u8 ircode_x[3];  //编辑模式解码中间值
  23. u8 ircodex[3];
  24. u8 ircode[6];
  25. u16 code Tm_bz[]={ 31 ,156 ,114 ,134 ,2 ,16 ,8 };         
  26. u8 code YaoKongSu_4 = 4;       //遥控码个数
  27. u8 code DaiMaTiaoSu_20 = 20;  //遥控条数
  28. u8 code LuShu = 6;       //几路遥控
  29. bit WanCengBiaoJi = 0;         //        读完一组数据的标记
  30. bit Bianji = 0;         //进入编辑标记
  31. u8 JIBU=0;    //按键第几步标记
  32. u8 E2BiaoJi;
  33. u8 Tm1[50];

  34. void ConfigTimer0(u8 ms);
  35. void ConfigTimer2(u8 ms);
  36. void xunhuanculi(u8 add);
  37. void Bian_ji();
  38. void Led_jia();
  39. void Flash_del();
  40. void LED_jh(u8 add,bit add1);
  41. void Caozuo_csh();

  42. void main()
  43. {        
  44.     EA = 1;      //开总中断
  45.         IR_INPUT = 1;  //接收引脚
  46.     ConfigTimer2(5);     //配置T2定时 ms
  47.     ConfigTimer0(124);   //配置T0定时 0-255us   
  48.     Caozuo_csh();        
  49.         P1M1= 0x02;                 //0000 0010
  50.         P1M0= 0x00;                 //0000 0000

  51.     while (1)
  52.     {
  53.                  
  54.                           if(WanCengBiaoJi == 1)
  55.                           {        WanCengBiaoJi = 0;
  56.                                            xunhuanculi(0);
  57.                                            xunhuanculi(1);
  58.                                            if((ircode[0]==ircode[3]) && (ircode[1]==ircode[4]) && (ircode[2]==ircode[5]) && ms!=0)
  59.                                            {
  60.                                                            if((ircodex[0]==ircode[0]) && (ircodex[1]==ircode[1]) && (ircodex[2]==ircode[2]) )
  61.                                                                 {    ms=1;        }
  62.                                                                 else
  63.                                                                 {
  64.                                                                          ircodex[0]=ircode[0];
  65.                                                                          ircodex[1]=ircode[1];
  66.                                                                          ircodex[2]=ircode[2];                                                                  
  67.                                                                          if(Bianji==1)
  68.                                                                  { ms = 1; Led_jia();}
  69.                                                                          else
  70.                                                                          { ms=0;}
  71.                                                                 }
  72.                                                 }
  73.                                           
  74.                         ET0 = 1;
  75.                                 
  76.                           }
  77.                         
  78.     }
  79. }
  80. //脉冲解码
  81. void xunhuanculi(u8 add)
  82. {                 
  83.         u8 i, j, x, dat;
  84.         u8 byt;
  85.                
  86.                 x = add*25+1;
  87.         for(i=0; i<3; i++)
  88.         {    dat=i*8;
  89.                      for(j=0; j<8; j++)
  90.                          {      if(Tm1[dat+j+x]<=Tm_bz[6])
  91.                                         {  byt <<= 1; byt |= 0x01; }
  92.                                         else
  93.                                         {  byt <<= 1; }

  94.                          }        
  95.                      ircode[i+ add*3 ] = byt;                                                                        
  96.              }

  97. }
  98. void LED_jh(u8 add,bit add1)
  99. {   bit dat;

  100.     switch(add)
  101.     {
  102.                 case 0: led1 = add1;led2 = add1;led3 = add1;led4 = add1;led5 = add1;led6 = add1;
  103.                         if(Bianji==0)
  104.                                 {dat=!add1;  JD1 = dat;JD2 = dat; JD3 = dat;JD4 = dat;JD5 = dat;JD6 = dat;}
  105.                                 break;
  106.                 case 1: dat= led1;
  107.                                 _nop_();
  108.                                 led1=!dat;
  109.                         if(Bianji==0)
  110.                                 {JD1 = dat; }
  111.                 break;
  112.                 case 2:        dat= led2;
  113.                                 _nop_();
  114.                                 led2=!dat;
  115.                         if(Bianji==0)
  116.                                 {JD2 = dat; }
  117.                 break;
  118.                 case 3: dat= led3;
  119.                                 _nop_();
  120.                                 led3=!dat;
  121.                         if(Bianji==0)
  122.                                 {JD3 = dat; }
  123.                 break;
  124.                 case 4: dat= led4;
  125.                                 _nop_();
  126.                                 led4=!dat;
  127.                         if(Bianji==0)
  128.                                 {JD4 = dat; }
  129.                                 break;
  130.                 case 5: dat= led5;
  131.                                 _nop_();
  132.                                 led5=!dat;
  133.                         if(Bianji==0)
  134.                                 {JD5 = dat; }
  135.                 break;
  136.                 case 6: dat= led6;
  137.                                 _nop_();
  138.                                 led6=!dat;
  139.                         if(Bianji==0)
  140.                                 {JD6 = dat; }
  141.                 break;
  142.                 case 7: led1 = add1;led2 = add1;led3 = add1;led4 = add1;led5 = add1;led6 = add1;
  143.                                 if(Bianji==0)
  144.                                 {dat=!add1;  JD1 = dat;JD2 = dat; JD3 = dat;JD4 = dat;JD5 = dat;JD6 = dat; }
  145.                 break;
  146.             default:break;
  147.     }
  148. }
  149. void Caozuo_csh()
  150. {         
  151.         Bianji=0;
  152.         LED_jh(0,1);   
  153.         JIBU=0;         
  154.    
  155.         P3M1= 0x00;          //0000 0000                                                                  
  156.         P3M0= 0xcf;          //1100 1111


  157. }

  158. //遥控码修改
  159. void Flash_del()
  160. {  if(Bianji==1)
  161.    {  eeprom_erase(0);        Caozuo_csh(); }
  162. }

  163. void Bian_ji()
  164. {   u8 i,dat;

  165.         if(Bianji==0)
  166.         { Bianji=1;
  167.          
  168.           P3M1= 0xcf;          //1100 1111
  169.       P3M0= 0xcf;          //1100 1111
  170.           LED_jh(0,0);
  171.           E2BiaoJi=0xff;
  172.       for(i=0; i<DaiMaTiaoSu_20; i++)
  173.       {           if(eeprom_read(i*YaoKongSu_4)==0xff)
  174.                        {E2BiaoJi=i; break;}
  175.       }
  176.         }
  177.           else
  178.     {        if (E2BiaoJi!= 0xff && JIBU!=0)
  179.         {      dat=         E2BiaoJi*YaoKongSu_4;         
  180.                        eeprom_write(dat,JIBU);        //标记以写入
  181.                            eeprom_write(dat+1,ircode_x[0]);
  182.                            eeprom_write(dat+2,ircode_x[1]);
  183.                            eeprom_write(dat+3,ircode_x[2]);
  184.         
  185.                 }
  186.                 Caozuo_csh();
  187.          }
  188.          
  189. }
  190. void Led_jia()
  191. {     
  192.           JIBU++;
  193.     if(JIBU>(LuShu+1))
  194.         {   Caozuo_csh(); }
  195.         else  
  196.         {   ircode_x[0]=ircodex[0];
  197.                 ircode_x[1]=ircodex[1];
  198.                 ircode_x[2]=ircodex[2];
  199.                 LED_jh(0,1);
  200.                 if(JIBU>LuShu)
  201.                 {  LED_jh(0,0); }
  202.                 else
  203.                 { LED_jh(JIBU,0); }
  204.     }
  205. }                                          


  206. /* 配置并启动T2,ms-T2定时时间 */
  207. void ConfigTimer2(u8 ms)
  208. {
  209.     unsigned long tmp;  //临时变量
  210.    
  211.     tmp = 12000000 / 12;      //定时器计数频率
  212.     tmp = (tmp * ms) / 1000;  //计算所需的计数值
  213.     tmp = 65536 - tmp;        //计算定时器重载值
  214.     tmp = tmp + 18;           //补偿中断响应延时造成的误差
  215.     T2H = (u8)(tmp>>8);  //定时器重载值拆分为高低字节
  216.     T2L = (u8)tmp;
  217.            
  218.         AUXR &= 0xEF;  // 启动T2定时器  方式 :16位重装模式计数器
  219.         AUXR |= 0x10;  // 启动T2定时器
  220.            IE2 &= 0xFB;  // 使能T2中断
  221.         IE2 |= 0x04;  // 使能T2中断
  222.            
  223.     //ET2 = 1;        //使能T2中断
  224.     //T2R = 1;        //启动T2定时器
  225. }
  226. /* 配置并启动T0,us-T0定时时间 */
  227. void ConfigTimer0(u8 ms)
  228. {        
  229.     u8 tmp;  //临时变量

  230.     tmp = 256 -ms ;        //计算定时器重载值
  231.         TMOD &= 0xF0;  // 定时器工作方式  方式 :8位重装模式计数器
  232.         TMOD |= 0x02;  //配置T0为模式2
  233.         T0RL = tmp;
  234.         TH0 = tmp;     //加载T0重载值
  235.     ET0 = 1;        //使能T0中断
  236.     TR0 = 1;        //启动T0
  237.         PT0 = 1;        //配置T0中断为高优先级
  238. }

  239. void EXINT1_ISR() interrupt 1
  240. {          static bit a1,a2,a3;
  241.           static u8 Tm_zz=0;
  242.           static u8 Tm_js=0;
  243.       static u8 Tm=0;


  244.       a3=a2;
  245.       a2=a1;
  246.           a1=IR_INPUT;
  247.           if(a1==a3)
  248.           {a2=a1;}

  249.          if(a3)
  250.           {                              
  251.                         switch(Tm_zz)
  252.                     {                        
  253.                                 case 0:      if(Tm==0)
  254.                                              {         
  255.                                                              if((Tm_js<Tm_bz[0] )|| Tm_js>Tm_bz[1])
  256.                                                                  { Tm_zz=0; Tm=0; Tm_js=0; TH0 = T0RL; }
  257.                                                                  else        
  258.                                                                     {  Tm++; Tm_zz=2; TH0 = 256- Tm_js; TL0=TH0;}
  259.                                                          }
  260.                                                          else
  261.                                                          {         if((Tm_js<Tm_bz[2] )|| Tm_js>Tm_bz[3] )
  262.                                                                  {  Tm_zz=0; Tm=0; Tm_js=0; TH0 = T0RL; }
  263.                                                                    else        
  264.                                                                     { Tm1[Tm]=256-TH0; Tm++; Tm_zz=2;}
  265.                                                          }
  266.                                 
  267.                                 break;
  268.                                 case 1:           if((Tm_js<Tm_bz[4] )|| Tm_js>Tm_bz[5])
  269.                                                          { Tm_zz=0; Tm=0; Tm_js=0; TH0 = T0RL; }         
  270.                                                          else
  271.                                                          { Tm1[Tm]=Tm_js; Tm++; Tm_zz=2;}
  272.                                 break;
  273.                                 case 2:             if( Tm==25)
  274.                                                          {Tm_zz=3;}
  275.                                              if( Tm>=50)
  276.                                                          { ET0 = 0;  WanCengBiaoJi =1; Tm_zz=0; Tm=0; Tm_js=0; TH0 = T0RL; }
  277.                                 break;
  278.                                 default:break;
  279.                     }

  280.           }
  281.          else
  282.          {            
  283.                 switch(Tm_zz)
  284.                     {
  285.                                 case 0:  Tm_js++; break;
  286.                                 case 1:  Tm_js++; break;
  287.                                 case 2:  Tm_js=1; Tm_zz=1; break;
  288.                                 case 3:  Tm_js=1; Tm_zz=0; break;
  289.                             default:break;
  290.                     }
  291.          

  292.          }
  293.          
  294. }



  295. void chamiao()
  296. {        u8 i,x,dat;
  297.         ms++;
  298.         if(ms == 1)
  299.         {
  300.           EA=0 ;
  301.          
  302.           for(i=0; i<DaiMaTiaoSu_20; i++)
  303.           {            dat= i*YaoKongSu_4;
  304.                         x = eeprom_read(dat);
  305.                 if(x != 0xff)
  306.                         {         if(eeprom_read(dat+1)==ircodex[0])
  307.                              {          if(eeprom_read(dat+2)==ircodex[1])
  308.                                           {           if(eeprom_read(dat+3)==ircodex[2])
  309.                                                {   LED_jh(x,1); }
  310.                                           }
  311.                                  }
  312.                         }
  313.                         else
  314.                         {break;}
  315.                
  316.           }
  317.           EA=1 ;

  318.         }
  319.         if(ms > 150 )
  320.         {ircodex[0]=0x00;
  321.          ircodex[1]=0x00;
  322.          ircodex[2]=0x00;
  323.          ms = 1;
  324.         }

  325.   
  326. ……………………

  327. …………限于本文篇幅 余下代码请从51黑帖子顶部下载附件…………
复制代码



评分

参与人数 2黑币 +130 收起 理由
dww465757120 + 30 共享资料的黑币奖励!
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2017-9-7 17:59 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:164988 发表于 2017-9-7 20:11 | 只看该作者
好文章,先标记,等黑币足够时,一定下载分享。
回复

使用道具 举报

地板
ID:229306 发表于 2017-10-12 10:05 | 只看该作者
谢谢了,在我做的控制板上试一下,
回复

使用道具 举报

5#
ID:229306 发表于 2017-10-12 16:04 | 只看该作者
很好,谢谢了!
回复

使用道具 举报

6#
ID:343102 发表于 2018-8-9 07:39 | 只看该作者
谢谢分享!
回复

使用道具 举报

7#
ID:36105 发表于 2018-9-8 22:03 | 只看该作者
多谢分享,努力学习中,相信有大咖们的杰作一定能助我一臂之力
回复

使用道具 举报

8#
ID:63317 发表于 2018-12-3 06:27 | 只看该作者
很实用。手艺精湛
回复

使用道具 举报

9#
ID:240034 发表于 2018-12-4 18:27 | 只看该作者
思路很不错,向楼主学习
回复

使用道具 举报

10#
ID:60263 发表于 2019-4-4 09:14 | 只看该作者
谢谢!不错 有空也做一个
回复

使用道具 举报

11#
ID:473471 发表于 2019-7-6 23:24 来自手机 | 只看该作者
楼主辛苦了,好资料
回复

使用道具 举报

12#
ID:524834 发表于 2019-7-7 07:16 | 只看该作者
好资料,标记一下
回复

使用道具 举报

13#
ID:282095 发表于 2019-7-7 10:31 | 只看该作者
画板软件是PADS吗
回复

使用道具 举报

14#
ID:572103 发表于 2019-9-14 23:18 | 只看该作者
这个可以做成16通的无线开关吗?
回复

使用道具 举报

15#
ID:381390 发表于 2019-9-17 11:41 | 只看该作者
谢谢分享!好资料
回复

使用道具 举报

16#
ID:627633 发表于 2019-10-22 08:51 | 只看该作者
请问能改成点动模式吗?
回复

使用道具 举报

17#
ID:196311 发表于 2020-2-22 22:46 | 只看该作者
谢谢楼主,正好在学习解码,下载参考一下
回复

使用道具 举报

18#
ID:36359 发表于 2020-2-23 21:06 | 只看该作者
谢谢分享 学习学习,下载保存 慢慢研究
回复

使用道具 举报

19#
ID:23303 发表于 2020-2-26 14:55 | 只看该作者
谢谢了,在我做的控制板上试一下
回复

使用道具 举报

20#
ID:46241 发表于 2020-3-15 23:56 来自手机 | 只看该作者
好文章,先标记,等黑币足够时,一定下载分享
回复

使用道具 举报

21#
ID:65237 发表于 2020-4-8 21:00 | 只看该作者
谢谢 要学习要动手做一个 决对的赞 楼主能从中加上解EV1527的
回复

使用道具 举报

22#
ID:716103 发表于 2020-4-9 11:39 | 只看该作者
正在学习433MHz的无线遥控,下载学习了。
回复

使用道具 举报

23#
ID:65237 发表于 2020-4-11 20:25 | 只看该作者
楼主我用你的程序下载在STC11F16XE上怎么开关按下,怎么没反应 是我这IC不行吗 我下载了另外程序试了一下硬件没有问题 我看了一下程序这IC应可以运行的才对 求解?
回复

使用道具 举报

24#
ID:517794 发表于 2020-8-1 09:03 | 只看该作者
315M解码 6控制6 mark
回复

使用道具 举报

25#
ID:53421 发表于 2020-8-22 09:01 | 只看该作者
非常感谢,研究研究。
回复

使用道具 举报

26#
ID:92556 发表于 2020-10-3 00:56 | 只看该作者
不是用了204s头文件吗,还用rge52???
回复

使用道具 举报

27#
ID:261025 发表于 2021-2-3 14:48 | 只看该作者
为什么四路六路我只能使用最后学习的那个按键  之前几个都无法使用  
回复

使用道具 举报

28#
ID:848824 发表于 2021-2-19 09:40 | 只看该作者
433接收头可以吗?
回复

使用道具 举报

29#
ID:48994 发表于 2021-7-5 16:24 | 只看该作者
感谢楼主的分享,正在学习相关资料!
回复

使用道具 举报

30#
ID:826754 发表于 2021-7-18 11:32 | 只看该作者
好文章,先标记,等黑币足够时,一定下载分享
回复

使用道具 举报

31#
ID:343102 发表于 2023-5-14 12:05 | 只看该作者
多谢分享,努力学习!
回复

使用道具 举报

32#
ID:403447 发表于 2023-6-9 09:56 | 只看该作者
先留下尿点,方便回头辨识回来
回复

使用道具 举报

33#
ID:103411 发表于 2023-11-9 13:28 | 只看该作者
正在学习如何解码,感谢楼主分享!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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