一.设计要求:
? ?1.两个按键,一个按键控制风扇转速,一个按键控制发热片温度。
? 2.NTC检测吹出风的温度。
? 3. 三颗灯指示风速等级,充电时复用指示电量,一颗充电指示灯。
? 4.两节电池串联供电,定时5分钟关闭
二. 函数代码
开机跑马灯
void LED_On() ? ?//跑马灯 { ?? ?LED1=0; ?? ?Delay(500); ?? ?LED2=0; ?? ?Delay(500); ?? ?LED3=0; ?? ?Delay(500); ?? ?LED3=1; ?? ?Delay(500); ?? ?LED2=1; ?? ?Delay(500); ?? ?LED1=1; ?? ?Delay(500); }
两路PWM控制风扇和发热片
void PWM1_M(void)?? ?interrupt 3 { ?? ?TL1 = 0x0C;?? ??? ?//设置定时初值 ?? ?TH1 = 0xFE;?? ??? ?//设置定时初值 ?? ?Counter1++; ?? ?Counter2++; ?? ?Counter1%=100;?? ?//计数值变化范围限制在0~99 ?? ?Counter2%=100;?? ?//计数值变化范围限制在0~99 ?? ?if(Counter1<Compare1)?? ?//风扇转速调占空比 ?? ??? ?Motor1=1;?? ??? ?//输出1 ?? ?else?? ??? ??? ??? ?//计数值大于比较值 ?? ??? ?Motor1=0;?? ??? ?//输出0 ?? ? ?? ?if(Counter2<Compare2)? ?//发热温度调占空比 ?? ??? ?Motor2=1; ?? ?else ?? ??? ?Motor2=0; }
电量检测
/*电量检测*/ void Battery_Check(void) { ?? ?if(Run_Mode == RUN_CHARGE_MODE) ?? ?{?? ??? ? ?? ??? ?BAT_Value=XPT2046_ReadAD(XPT2046_XP); ?? ??? ?Low_Battery_Flag=1; //?? ??? ?LED_off();
?? ??? ?if(BAT_Value<BAT_MIN){Chg_State=0;}
?? ??? ?else if((BAT_Value>=BAT_MIN)&&(BAT_Value<BAT_MID)){Chg_State=1;}
?? ??? ?else if((BAT_Value>=BAT_MID)&&(BAT_Value<BAT_MAX)){Chg_State=2;}
?? ??? ?else if(BAT_Value>=BAT_MAX){Chg_State=3;} ?? ??? ? ?? ?} ?? ? ?? ?else if(Run_Mode == RUN_MOTOR_MODE) ?? ?{ ?? ??? ?BAT_Value=XPT2046_ReadAD(XPT2046_XP); ?? ??? ?if(BAT_Value<=BAT_MIN) ?? ??? ?{ ?? ??? ??? ?Bat_V_Check_Time++;
?? ??? ??? ?if(Bat_V_Check_Time>10) ? ?//低电检测5秒钟 ?? ??? ??? ?{ ?? ??? ??? ??? ?Low_Battery_Flag=0; ?? ??? ??? ??? ?Bat_V_Check_Time=0; ?? ??? ??? ??? ?MInit=0; ?? ??? ??? ??? ?M_Flag=0; ?? ??? ??? ??? ?M_speed=0; ?? ??? ??? ??? ?R_level=0; ?? ??? ??? ??? ?LED_off(); ?? ??? ??? ??? ?Sleep_Time=0; ?? ??? ??? ?}?? ??? ??? ? ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?Low_Battery_Flag=1; ?? ??? ??? ?Bat_V_Check_Time=0; ?? ??? ?}?? ? ?? ?} } ?
按键部分
?? ??? ??? ?Key_Scan();?? ??? ?/*扫描按键*/ ?? ??? ? ?? ??? ??? ?switch(Key_Num) ?? ??? ??? ?{ ?? ??? ??? ??? ?case 1: /*K1按下*/?? ? ?? ??? ??? ??? ??? ? ?? ??? ??? ??? ?if((Low_Battery_Flag==0)&&(Key_Num!=0)) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?Run_Mode = RUN_BATTERY_LOW_MODE;
?? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ?} ?? ??? ??? ??? ? ?? ??? ??? ??? ?if(VIN_CHECK==0) ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?M_speed++; ?? ??? ??? ??? ??? ?M_speed%=4; ?? ??? ??? ??? ??? ?M_Flag=1; ?? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?if(M_Flag==1) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?Motor_Time_Max=0; ?? ??? ??? ??? ??? ??? ?if(M_speed==0){MInit=0;LED_off();M_Dis=0;}?? ??? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ??? ?else if(M_speed==1){MInit=1;LED_mode1();} ?? ??? ??? ??? ??? ??? ?else if(M_speed==2){MInit=1;LED_mode2();} ?? ??? ??? ??? ??? ??? ?else if(M_speed==3){MInit=1;Compare1=Speed_3;LED_mode3();}?? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?} ?? ??? ??? ??? ??? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?Sleep_Time=0;?? ??? ??? ??? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?Key_Num = 0; /*响应按键服务处理程序后,按键编号清零,避免一致触发*/ ?? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ??? ? ?? ??? ??? ??? ?case 2:/*K2按下*/?? ?
?? ??? ??? ??? ??? ?if(M_Flag==1) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?R_level++; ?? ??? ??? ??? ??? ??? ?R_level%=3; ?? ??? ??? ??? ??? ??? ?if(R_level==0){Compare2=Level_0;} ?? ??? ??? ??? ??? ??? ?else if(R_level==1){Compare2=Level_1;} ?? ??? ??? ??? ??? ??? ?else if(R_level==2){Compare2=Level_2;} //?? ??? ??? ??? ??? ??? ?else if(R_level==3){Compare2=Level_3;} ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?Sleep_Time=0; ?? ??? ??? ??? ??? ?Key_Num = 0; ?? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ?default:?? ?break; ?? ??? ??? ??? ?}
定义几种运行模式
unsigned char Run_Mode = 0;?? ??? ??? ??? ??? ?//运行模式?? ? //模式 #define RUN_SLEEP_MODE?? ??? ??? ??? ?0?? ? ? ?//休眠模式 #define RUN_MOTOR_MODE?? ??? ??? ??? ?1?? ? ? ?//电机模式 #define RUN_SLEEP_TIME_MODE?? ??? ?2?? ? ? ?//休眠模式 #define RUN_BATTERY_LOW_MODE?? ?3?? ? ? ?//低电量模式 #define RUN_CHARGE_MODE?? ??? ??? ??? ?4?? ? ? ?//充电模式 #define RUN_STANDBY_MODE?? ??? ??? ?5?? ? ? ?//待机模式
unsigned char Motor_Time_Max=0; unsigned char Bat_V_Check_Time=0; unsigned char Low_Battery_Led_Flash=0; unsigned char Chg_State=0;
使用的是普中51开发板,调试的时候用数码管显示可调电阻模拟电压值,使用外部中断恢复休眠模式
?? ??? ??? ??? ?if(Run_Mode == RUN_SLEEP_MODE)? //10秒倒计时进入省电模式 ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?M_Flag=0; ?? ??? ??? ??? ??? ?MInit=0; ?? ??? ??? ??? ??? ?M_speed=0; ?? ??? ??? ??? ??? ?R_level=0; ?? ??? ??? ??? ??? ?M_Dis=1; ?? ??? ??? ??? ??? ?LED_off(); ?? ??? ??? ??? ??? ?Sleep_Time++; ?? ??? ??? ??? ??? ?LED=!LED; ?? ??? ??? ??? ??? ?Bat_V_Check_Time=0; ?? ??? ??? ??? ??? ?Low_Bat_StartFlag=0; ?? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?if(Sleep_Time>20) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ?ET0=0; ?? ??? ??? ??? ??? ??? ?ET1=0; ?? ??? ??? ??? ??? ??? ?PCON=0x02; ?? ??? ??? ??? ??? ??? ?_nop_(); ?? ??? ??? ??? ??? ??? ?_nop_(); ?? ??? ??? ??? ??? ??? ?_nop_(); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ?}
完整代码还在调试中,基本功能可以实现!
|