找回密码
 立即注册

QQ登录

只需一步,快速开始

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

带433遥控解码的RGB+Y+W灯控单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:1148743 发表于 2025-5-27 14:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本程序不足之处是,待机时功耗有些高,在5.8mA左右,如果睡眠前关掉接收端433,功耗只有40uA,但这样的话遥控就不能用了;有知道怎么降低433接收端功耗的同时,又能保证遥控正常使用的朋友,请指点一下

  1. void InfraredReception()
  2. {       
  3.         if(CMP2OUT==0){ON_Flag==1;return;}
  4.         //if(T433_OK==1){return;}
  5.         if(mm==24)
  6.         {       
  7.                 mm=0;               
  8.                 if(++mm1<6)
  9.                 {
  10.                         T433_Num=0;
  11.                         for(char i=4; i>0; i--)
  12.                         {
  13.                                 T_Data[i] = data;
  14.                         }
  15.                                 T_Data[0] = data;  // 存入最新数据
  16.                                
  17.                         for(char i=4; i>0; i--)
  18.                         {
  19.                                 if(T_Data[i] == T_Data[0])
  20.                                 {
  21.                                         T433_Num++;
  22.                                 }
  23.                         }
  24.                        
  25.                 }
  26.                         if(T433_Num>2)
  27.                         {
  28.                                 addr=(T_Data[0]>>8)&0xFFFF;
  29.                                 if(addr==0xFFFF)
  30.                                 {
  31.                                         T433_OK=1;
  32.                                         value=T_Data[0]&0x0f;
  33.                                 }       
  34.                        
  35.                         }
  36.                 Flag_RecOne=0;
  37.         }

  38.                 if(INTEDG==0)//下降沿时计数器清0,开始计时
  39.                 {       
  40.                         num=0;//计数器清0
  41.                         TMR2=0;//定时器清0
  42.                         INTEDG=1;//改为上升沿
  43.                        
  44.                 }
  45.                 else//下面是当上升沿时做的事
  46.                 {       
  47.                         INTEDG=0;//下降沿。
  48.                         Time=num*62;//62.5us定时器中断,,计算下~上的时间
  49.                         if(Flag_RecOne==0)
  50.                         {       
  51.                                 if((Time>11000) && (Time<12500))//引导码,9ms低加4.5ms高
  52.                                 {       
  53.                                         Flag_RecOne=1;
  54.                                         data=0;
  55.                                         mm=0;
  56.                                 }else
  57.                                 {
  58.                                         data=0;       
  59.                                 }
  60.                                
  61.                         }
  62.                        
  63.                         if(Flag_RecOne==1)
  64.                         {
  65.                                
  66.                                 if((Time>320) && (Time<460))//置1, 0.56ms低加1.68ms高
  67.                                 {       
  68.                                         //data[(unsigned char)(mm/8)]=(data[(unsigned char)(mm/8)]>>1)|0x80;
  69.                                         data=(data << 1)|0x00000001;
  70.                                         mm++;
  71.                                 }
  72.                                 if((Time>1100) && (Time<1250))//置0, 0.56ms低加0.56ms高               
  73.                                 {
  74.                                         //data[(unsigned char)(mm/8)]=(data[(unsigned char)(mm/8)]>>1) & 0x7f;
  75.                                         data=data << 1;
  76.                                         ///RB4 = 1;             //测试 0.56ms低加0.56ms高是否通过
  77.                                         mm++;
  78.                                 }
  79.                                
  80.                                
  81.                         }
  82.                        
  83.                 }
  84.        
  85.        
  86.                        
  87.         Time=0;
  88. }
  89. /***********************************************************
  90. 中断服务函数
  91. ***********************************************************/
  92. void interrupt Isr_Timer()
  93. {       
  94.         if(INTF)//外部中断
  95.         {       
  96.                
  97.                 InfraredReception();
  98.                 INTF=0;
  99.         }
  100.        
  101.         if (TMR2IF)
  102.         {        TMR2IF = 0;                //若只使能了一个中断源,可以略去判断
  103.                 num++;               
  104.                 if((Flag_0E==1)&&(ON==1))
  105.                 {
  106.                         num1++;
  107.                        
  108.                 }
  109.                 if (++MainTime >= 32)
  110.                 {       
  111.                         MainTime = 0;
  112.                         B_MainLoop = 1;
  113.                 }
  114.         }
  115.         else
  116.         {
  117.                 PIR1 = 0;
  118.         }

  119. }

  120. void WorkSleep()
  121. {
  122. #if (0 != C_KEY_WAKEUP)
  123.                 OSCCON = 0X70;                        //配置振荡为8M
  124.                 INTCON = 0;                        //;关断ADC模块及中断使能;
  125.                 PIE1 = 0;
  126.                 PIE2 = 0;
  127.                 PIR1 = 0;
  128.                 PIR2 = 0;
  129.                 T2CON = 0;
  130.                 ADCON0 = 0;                                        //关闭所有模块
  131.                 ADCON1 = 0;
  132.                 CMP1CON0 = 0;
  133.                 CMP2CON0 = 0;
  134.                 PWMCON0 = 0;
  135.                 //进入休眠前关掉所有功能模块,以降低休眠电流
  136.                 KEYCON0=0;
  137.                 KEYCON2=0;
  138.                 TRISA = 0B00000001;                 //关闭所有输出,RA0口做唤醒输入
  139.                 PORTA = 0B00000000;
  140.                 WPUA  = 0B00000001;                        //RA0 开上拉电阻
  141.                 IOCA = 0B00000001;                        //允许RA0的IO电平变化中断
  142.                
  143.                 RAIE = 1;                                        //允许PORTA的IO电平变化中断
  144.                 PEIE = 1;                                        //要用RORTA中断唤醒,则PEIE必须设为1
  145.                 //进入休眠前,必须固定口线电平,这儿全部输出低电平,并关闭所有上拉电阻
  146.                 RAIF = 0;
  147.                 TRISB = 0;
  148.                 PORTB = 0;
  149.                 WPUB  = 0B00000000;
  150.                 //进入休眠模式,触摸允许唤醒的按键后恢复正常工作
  151.                 SystemEnterSleep();
  152.                 if(RAIF)
  153.                 {
  154.                         RAIF = 0;
  155.                         PORTA;
  156.                 }
  157.                 //休眠被唤醒,重新配置中断等SFR,使系统进入正常工作
  158.                 Init_System();
  159.        
  160. #endif
  161. }
  162. /***********************************************************
  163. 主循环
  164. ***********************************************************/
  165. void main()
  166. {
  167.         Init_System();
  168.         Init();
  169.         while (1)
  170.         {
  171.                 if (B_MainLoop)
  172.                 {                       
  173.                         if(++num2>30)//消RGB键抖动,否则按一次跳变好几下
  174.                         {       
  175.                                 //T433_OK=0;
  176.                                 if((ledFlag==4)&&(Flag_CS==1)){Touch_JianBian();Flag_CS=0;};
  177.                                
  178.                                 num2=0;
  179.                         }       
  180.                         B_MainLoop = 0;
  181.                         CLRWDT();
  182.                         CheckTouchKey();
  183.                         Refurbish_Sfr();
  184.                         KeyServer();
  185.                         if(ON_Flag==1){//关433
  186.                                 if(++mm4>200)
  187.                                 {        WorkSleep();
  188.                                         //TRISA = 0b00000011;//RA0引脚被配置为输入
  189.                                         //PORTA = 0b00000011;
  190.                                         //PWMCON0 &= ~(0b00011111);
  191.                                         mm4=0;
  192.                                         ON_Flag=0;
  193.                                        
  194.                                 }
  195.                                
  196.                         }
  197.                         if(RGB_Flag==1)//混合渐变
  198.                         {        mm2++;
  199.                                 if((mm2>5)&&(ledFlag==12)){Led_Set();mm2=0;}
  200.                                 if(mm2>700)
  201.                                 {
  202.                                         if(ledFlag==13){Touch_JianBian();}
  203.                                         mm2=0;
  204.                                 }                               
  205.                         }
  206.        
  207.                 }
  208.                 DingShi();
  209.                 if(T433_OK==1)//调433键处理函数
  210.                 {
  211.                                
  212.                         T433Server();
  213.                         value=0xFE;
  214.                         Flag_RecOne=0;
  215.                         mm1=0;
  216.                         T433_OK=0;
  217.                 }
  218.                 if(CMP2OUT==0){ON_Flag==1;}
  219.                         //比较器,小于阀值
  220.         }
  221. }
  222. void DingShi()
  223. {        if(ON==1)
  224.         {
  225.                 if(T_Flag==1)//定时30分
  226.                 {                                       
  227.                         if(num1>=28800000)
  228.                         {
  229.                                 //PWMCON0 &= ~(0b00011111);
  230.                                 ON_Flag=1;  
  231.                                 ON=0;
  232.                                 num1=0;
  233.                                 Flag_0E=0;
  234.                                 T_Flag=0;
  235.                         }
  236.                 }
  237.                 if(T_Flag==2)//定时1H
  238.                 {                                       
  239.                         if(num1>=57600000)
  240.                         {
  241.                                 //PWMCON0 &= ~(0b00011000);  
  242.                                 ON_Flag=1;
  243.                                 ON=0;
  244.                                 num1=0;
  245.                                 Flag_0E=0;
  246.                                 T_Flag=0;
  247.                         }
  248.                 }
  249.                         if(T_Flag==3)//定时2H
  250.                 {                                       
  251.                         if(num1>=115200000)
  252.                         {
  253.                                 //PWMCON0 &= ~(0b00011000);
  254.                                 ON_Flag=1;  
  255.                                 ON=0;
  256.                                 num1=0;
  257.                                 Flag_0E=0;
  258.                                 T_Flag=0;
  259.                         }
  260.                 }
  261.                 if((T1S_Flag==1)&&(num1>600))//配合case 0x0E:闪一下
  262.                 {
  263.                                 if(ledFlag==1){set_pwm_duty_cycle(pwm,0,0,0,0);}                               
  264.                         else if(ledFlag==2){set_pwm_duty_cycle(0,pwm,0,0,0);}
  265.                         else if(ledFlag==3){set_pwm_duty_cycle(pwm,pwm,0,0,0);}       
  266.                         else if(ledFlag==5){set_pwm_duty_cycle(pwm_sleep,pwm_sleep,0,0,0);}
  267.                         else if(ledFlag==9){set_pwm_duty_cycle(0,0,0,0,pwm_R);}       
  268.                         else if(ledFlag==10){set_pwm_duty_cycle(0,0,pwm_G,0,0);}
  269.                         else if(ledFlag==11){set_pwm_duty_cycle(0,0,0,pwm_B,0);}
  270.                         else if(ledFlag==12){RGB_Flag=1;}       
  271.                         else if(ledFlag==4){set_pwm_duty_cycle(0,0,pwm_G,pwm_B,pwm_R);}
  272.                                
  273.                         T1S_Flag=0;
  274.                 }
  275.         }
  276. }
  277. void Touch_TiaoGuang()
  278. {
  279.         if(ledFlag==4)
  280.         {        pwm_R = (R * brightness) / 100;
  281.                 pwm_B = (B * brightness) / 100;
  282.                 pwm_G = (G * brightness) / 100;                                                                       
  283.                 set_pwm_duty_cycle(0,0,pwm_G,pwm_B,pwm_R);
  284.         }
  285.         if(ledFlag==9)
  286.         {        pwm_R = (R1 * brightness) / 100;                                                               
  287.                 set_pwm_duty_cycle(0,0,0,0,pwm_R);
  288.         }
  289.         if(ledFlag==10)
  290.         {        pwm_G = (G1 * brightness) / 100;                                                               
  291.                 set_pwm_duty_cycle(0,0,pwm_G,0,0);
  292.         }
  293.         if(ledFlag==11)
  294.         {        pwm_B = (B1 * brightness) / 100;                                                               
  295.                 set_pwm_duty_cycle(0,0,0,pwm_B,0);
  296.         }
  297.         if((ledFlag==13)||(ledFlag==12))
  298.         {       
  299.                 set_pwm_duty_cycle(0,0,0,0,10);
  300.         }
  301. }
  302. void Touch_JianBian()
  303. {
  304.                                
  305.         switch (RGB_NUM)
  306.         {
  307.                 case 0:
  308.                         {
  309.                         R=255;       
  310.                         G=255;       
  311.                         B=0;       
  312.                         RGB_NUM=1;                                                       
  313.                         break;}
  314.                 case 1:
  315.                    {
  316.                         R=80;       
  317.                         G=255;       
  318.                         B=0;  // 红绿               
  319.                         RGB_NUM=2;                                                               
  320.                         break;}
  321.                 case 2:
  322.                         {
  323.                         R=34;       
  324.                         G=139;       
  325.                         B=34;  // 红绿+
  326.                         RGB_NUM=3;
  327.                         break;}
  328.                        
  329.                 case 3:
  330.                         {
  331.                         R=0;                                // 绿+++               
  332.                         G=255;
  333.                         B=0;
  334.                         RGB_NUM=4;       
  335.                         break;}
  336.                 case 4:
  337.                         {                                                       
  338.                         B=124;        // 青       
  339.                         G=252;
  340.                         R=0;
  341.                         RGB_NUM=5;
  342.                         break;}                                                       
  343.                 case 5:
  344.                         {
  345.                         B=255;// 红0绿--蓝+++       
  346.                         G=255;
  347.                         R=0;       
  348.                         RGB_NUM=6;
  349.                         break;}
  350.                 case 6:                                                                       
  351.                         {
  352.                         B=255;
  353.                         G=120;
  354.                         R=0;
  355.                         RGB_NUM=7;                                                                                                                                                                                                               
  356.                         break;}
  357.                 case 7:                        // 蓝+                                                 
  358.                         {
  359.                         B=255;
  360.                         G=0;
  361.                         R=0;
  362.                         RGB_NUM=8;                                                                                                                                                                                                                           
  363.                         break;}
  364.                 case 8:                                                                       
  365.                         {R=138;  // 浅红
  366.                         G=43;
  367.                         B=226;
  368.                         RGB_NUM=9;                                                                                                                                                                                                                                                                                                                                                   
  369.                         break;}
  370.                 case 9:                                                                       
  371.                         {B=127;
  372.                         G=0;
  373.                         R=255;  // 桃红  
  374.                         RGB_NUM=10;                                                                                                                                                                          
  375.                         break;}
  376.                 case 10:                                                                       
  377.                         {R=255;  // 红蓝+  
  378.                         G=0;
  379.                         B=255;
  380.                         RGB_NUM=11;                                                                                                                                                                                                                                                                                                                                                   
  381.                         break;}
  382.                 case 11:                                                                       
  383.                         {R=255;  // 红  
  384.                         G=0;
  385.                         B=0;                                                                                                                  
  386.                         RGB_NUM=0;                                                                                                                                                                           
  387.                         break;}
  388.                        
  389.                 }
  390.                 pwm_R = (R * brightness) / 100;
  391.                 pwm_B = (B * brightness) / 100;
  392.                 pwm_G = (G * brightness) / 100;                                                                       
  393.                 set_pwm_duty_cycle(0,0,pwm_G,pwm_B,pwm_R);       

  394. }
复制代码


RGB触摸带调光.rar

305.46 KB, 下载次数: 0

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

使用道具 举报

沙发
ID:28752 发表于 2025-5-28 07:02 | 只看该作者
使用一个IO控制RX模组开关,间隔一定时间,打rx模组一段时间,收到信号常开,长时间不收信号,继续进入间歇开RX模组...
回复

使用道具 举报

板凳
ID:584814 发表于 2025-6-2 22:32 | 只看该作者
433接收端功耗与单片机和程序无关。
可用单片机控制433接收器间歇性休眠,在功能与功耗之间找平衡。
回复

使用道具 举报

地板
ID:584814 发表于 2025-6-2 23:17 | 只看该作者
RGB触摸带调光.rar里缺少工程文件和sc.h
回复

使用道具 举报

5#
ID:1148743 发表于 2025-6-3 18:42 | 只看该作者
man1234567 发表于 2025-6-2 22:32
433接收端功耗与单片机和程序无关。
可用单片机控制433接收器间歇性休眠,在功能与功耗之间找平衡。

你好,有歇性休眠相关的例程吗,试了多次,都 没实现
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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