|
本程序不足之处是,待机时功耗有些高,在5.8mA左右,如果睡眠前关掉接收端433,功耗只有40uA,但这样的话遥控就不能用了;有知道怎么降低433接收端功耗的同时,又能保证遥控正常使用的朋友,请指点一下
- void InfraredReception()
- {
- if(CMP2OUT==0){ON_Flag==1;return;}
- //if(T433_OK==1){return;}
- if(mm==24)
- {
- mm=0;
- if(++mm1<6)
- {
- T433_Num=0;
- for(char i=4; i>0; i--)
- {
- T_Data[i] = data;
- }
- T_Data[0] = data; // 存入最新数据
-
- for(char i=4; i>0; i--)
- {
- if(T_Data[i] == T_Data[0])
- {
- T433_Num++;
- }
- }
-
- }
- if(T433_Num>2)
- {
- addr=(T_Data[0]>>8)&0xFFFF;
- if(addr==0xFFFF)
- {
- T433_OK=1;
- value=T_Data[0]&0x0f;
- }
-
- }
- Flag_RecOne=0;
- }
- if(INTEDG==0)//下降沿时计数器清0,开始计时
- {
- num=0;//计数器清0
- TMR2=0;//定时器清0
- INTEDG=1;//改为上升沿
-
- }
- else//下面是当上升沿时做的事
- {
- INTEDG=0;//下降沿。
- Time=num*62;//62.5us定时器中断,,计算下~上的时间
- if(Flag_RecOne==0)
- {
- if((Time>11000) && (Time<12500))//引导码,9ms低加4.5ms高
- {
- Flag_RecOne=1;
- data=0;
- mm=0;
- }else
- {
- data=0;
- }
-
- }
-
- if(Flag_RecOne==1)
- {
-
- if((Time>320) && (Time<460))//置1, 0.56ms低加1.68ms高
- {
- //data[(unsigned char)(mm/8)]=(data[(unsigned char)(mm/8)]>>1)|0x80;
- data=(data << 1)|0x00000001;
- mm++;
- }
- if((Time>1100) && (Time<1250))//置0, 0.56ms低加0.56ms高
- {
- //data[(unsigned char)(mm/8)]=(data[(unsigned char)(mm/8)]>>1) & 0x7f;
- data=data << 1;
- ///RB4 = 1; //测试 0.56ms低加0.56ms高是否通过
- mm++;
- }
-
-
- }
-
- }
-
-
-
- Time=0;
- }
- /***********************************************************
- 中断服务函数
- ***********************************************************/
- void interrupt Isr_Timer()
- {
- if(INTF)//外部中断
- {
-
- InfraredReception();
- INTF=0;
- }
-
- if (TMR2IF)
- { TMR2IF = 0; //若只使能了一个中断源,可以略去判断
- num++;
- if((Flag_0E==1)&&(ON==1))
- {
- num1++;
-
- }
- if (++MainTime >= 32)
- {
- MainTime = 0;
- B_MainLoop = 1;
- }
- }
- else
- {
- PIR1 = 0;
- }
- }
- void WorkSleep()
- {
- #if (0 != C_KEY_WAKEUP)
- OSCCON = 0X70; //配置振荡为8M
- INTCON = 0; //;关断ADC模块及中断使能;
- PIE1 = 0;
- PIE2 = 0;
- PIR1 = 0;
- PIR2 = 0;
- T2CON = 0;
- ADCON0 = 0; //关闭所有模块
- ADCON1 = 0;
- CMP1CON0 = 0;
- CMP2CON0 = 0;
- PWMCON0 = 0;
- //进入休眠前关掉所有功能模块,以降低休眠电流
- KEYCON0=0;
- KEYCON2=0;
- TRISA = 0B00000001; //关闭所有输出,RA0口做唤醒输入
- PORTA = 0B00000000;
- WPUA = 0B00000001; //RA0 开上拉电阻
- IOCA = 0B00000001; //允许RA0的IO电平变化中断
-
- RAIE = 1; //允许PORTA的IO电平变化中断
- PEIE = 1; //要用RORTA中断唤醒,则PEIE必须设为1
- //进入休眠前,必须固定口线电平,这儿全部输出低电平,并关闭所有上拉电阻
- RAIF = 0;
- TRISB = 0;
- PORTB = 0;
- WPUB = 0B00000000;
- //进入休眠模式,触摸允许唤醒的按键后恢复正常工作
- SystemEnterSleep();
- if(RAIF)
- {
- RAIF = 0;
- PORTA;
- }
- //休眠被唤醒,重新配置中断等SFR,使系统进入正常工作
- Init_System();
-
- #endif
- }
- /***********************************************************
- 主循环
- ***********************************************************/
- void main()
- {
- Init_System();
- Init();
- while (1)
- {
- if (B_MainLoop)
- {
- if(++num2>30)//消RGB键抖动,否则按一次跳变好几下
- {
- //T433_OK=0;
- if((ledFlag==4)&&(Flag_CS==1)){Touch_JianBian();Flag_CS=0;};
-
- num2=0;
- }
- B_MainLoop = 0;
- CLRWDT();
- CheckTouchKey();
- Refurbish_Sfr();
- KeyServer();
- if(ON_Flag==1){//关433
- if(++mm4>200)
- { WorkSleep();
- //TRISA = 0b00000011;//RA0引脚被配置为输入
- //PORTA = 0b00000011;
- //PWMCON0 &= ~(0b00011111);
- mm4=0;
- ON_Flag=0;
-
- }
-
- }
- if(RGB_Flag==1)//混合渐变
- { mm2++;
- if((mm2>5)&&(ledFlag==12)){Led_Set();mm2=0;}
- if(mm2>700)
- {
- if(ledFlag==13){Touch_JianBian();}
- mm2=0;
- }
- }
-
- }
- DingShi();
- if(T433_OK==1)//调433键处理函数
- {
-
- T433Server();
- value=0xFE;
- Flag_RecOne=0;
- mm1=0;
- T433_OK=0;
- }
- if(CMP2OUT==0){ON_Flag==1;}
- //比较器,小于阀值
- }
- }
- void DingShi()
- { if(ON==1)
- {
- if(T_Flag==1)//定时30分
- {
- if(num1>=28800000)
- {
- //PWMCON0 &= ~(0b00011111);
- ON_Flag=1;
- ON=0;
- num1=0;
- Flag_0E=0;
- T_Flag=0;
- }
- }
- if(T_Flag==2)//定时1H
- {
- if(num1>=57600000)
- {
- //PWMCON0 &= ~(0b00011000);
- ON_Flag=1;
- ON=0;
- num1=0;
- Flag_0E=0;
- T_Flag=0;
- }
- }
- if(T_Flag==3)//定时2H
- {
- if(num1>=115200000)
- {
- //PWMCON0 &= ~(0b00011000);
- ON_Flag=1;
- ON=0;
- num1=0;
- Flag_0E=0;
- T_Flag=0;
- }
- }
- if((T1S_Flag==1)&&(num1>600))//配合case 0x0E:闪一下
- {
- if(ledFlag==1){set_pwm_duty_cycle(pwm,0,0,0,0);}
- else if(ledFlag==2){set_pwm_duty_cycle(0,pwm,0,0,0);}
- else if(ledFlag==3){set_pwm_duty_cycle(pwm,pwm,0,0,0);}
- else if(ledFlag==5){set_pwm_duty_cycle(pwm_sleep,pwm_sleep,0,0,0);}
- else if(ledFlag==9){set_pwm_duty_cycle(0,0,0,0,pwm_R);}
- else if(ledFlag==10){set_pwm_duty_cycle(0,0,pwm_G,0,0);}
- else if(ledFlag==11){set_pwm_duty_cycle(0,0,0,pwm_B,0);}
- else if(ledFlag==12){RGB_Flag=1;}
- else if(ledFlag==4){set_pwm_duty_cycle(0,0,pwm_G,pwm_B,pwm_R);}
-
- T1S_Flag=0;
- }
- }
- }
- void Touch_TiaoGuang()
- {
- if(ledFlag==4)
- { pwm_R = (R * brightness) / 100;
- pwm_B = (B * brightness) / 100;
- pwm_G = (G * brightness) / 100;
- set_pwm_duty_cycle(0,0,pwm_G,pwm_B,pwm_R);
- }
- if(ledFlag==9)
- { pwm_R = (R1 * brightness) / 100;
- set_pwm_duty_cycle(0,0,0,0,pwm_R);
- }
- if(ledFlag==10)
- { pwm_G = (G1 * brightness) / 100;
- set_pwm_duty_cycle(0,0,pwm_G,0,0);
- }
- if(ledFlag==11)
- { pwm_B = (B1 * brightness) / 100;
- set_pwm_duty_cycle(0,0,0,pwm_B,0);
- }
- if((ledFlag==13)||(ledFlag==12))
- {
- set_pwm_duty_cycle(0,0,0,0,10);
- }
- }
- void Touch_JianBian()
- {
-
- switch (RGB_NUM)
- {
- case 0:
- {
- R=255;
- G=255;
- B=0;
- RGB_NUM=1;
- break;}
- case 1:
- {
- R=80;
- G=255;
- B=0; // 红绿
- RGB_NUM=2;
- break;}
- case 2:
- {
- R=34;
- G=139;
- B=34; // 红绿+
- RGB_NUM=3;
- break;}
-
- case 3:
- {
- R=0; // 绿+++
- G=255;
- B=0;
- RGB_NUM=4;
- break;}
- case 4:
- {
- B=124; // 青
- G=252;
- R=0;
- RGB_NUM=5;
- break;}
- case 5:
- {
- B=255;// 红0绿--蓝+++
- G=255;
- R=0;
- RGB_NUM=6;
- break;}
- case 6:
- {
- B=255;
- G=120;
- R=0;
- RGB_NUM=7;
- break;}
- case 7: // 蓝+
- {
- B=255;
- G=0;
- R=0;
- RGB_NUM=8;
- break;}
- case 8:
- {R=138; // 浅红
- G=43;
- B=226;
- RGB_NUM=9;
- break;}
- case 9:
- {B=127;
- G=0;
- R=255; // 桃红
- RGB_NUM=10;
- break;}
- case 10:
- {R=255; // 红蓝+
- G=0;
- B=255;
- RGB_NUM=11;
- break;}
- case 11:
- {R=255; // 红
- G=0;
- B=0;
- RGB_NUM=0;
- break;}
-
- }
- pwm_R = (R * brightness) / 100;
- pwm_B = (B * brightness) / 100;
- pwm_G = (G * brightness) / 100;
- set_pwm_duty_cycle(0,0,pwm_G,pwm_B,pwm_R);
- }
复制代码
|
|