一.设计要求:
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_();
}
}
完整代码还在调试中,基本功能可以实现!