51单片机设计可移动试热吹风机

一.设计要求:

   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_();
                    }
                }

完整代码还在调试中,基本功能可以实现!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值