查看: 1243|回复: 0
打印 上一主题 下一主题

一键开关机及充电检测

[复制链接]
跳转到指定楼层
沙发
发表于 2015-6-10 09:21:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要实现的功能是:
1、一键开关机
2、关机插入充电器时屏幕显示充电进度条,长按按键开机进入正常工作界面,再次长按按键关机并重新显示充电进度条
3、充满电时提示用户
4、开机状态插入充电器,提示正在充电,拔出时提示充电器拔出


电路实现原理:
(1)当按下按键后,MOS管U1B导通,CAT6219开始工作,输出3.3V电压为系统供电,MUC开始运行并检测到KEY已经变成低电平,说明是按键引起的开机,然后等待3秒钟如果KEY还是低电平,则PWR输出高电平MOS管U1A导通,这时就算按键松开,U1B也会维持导通状态,完成开机操作,如果在3秒内松开按键,则U1B截止,CAT6219停止工作,不会开机。
(2)开机后MUC的ADC可以检测到电池电压,并且BAT_C(图中左下角)经过二极管可以检测到充管理电芯片的充电状态(充电管理芯片第7脚是集电极开路,充电时拉低)。
当检测到正在充电时,LCD显示充电图标。拔出充电器后,BAT_C恢复高电平,LCD提示用户充电器已经拔出。
(3)如果充满电后,充电管理芯片的第6脚BAT_M(截图中没有,需要看原理图)会拉低,这样MCU检测到后 ,LCD显示电池已经充满。
(4)关机状态插入充电器后,充电管理芯片第7脚拉低,D2导通,U1B导通,MCU开始运行,检测到按键并没有按下,则进入关机充电状态(LCD只显示充电状态,其他功能并不工作,想象一下手机关机时充电),PWR输出高电平维持开机状态(充满电后,充电管理芯片的第7引脚会恢复高电平,如果PWR输出高电平,则充满电后U1B会截止)。关机充电状态下长按按键,MCU运行正常测量程序,退出关机充电状态。
(5)正常测量状态下长按按键,如果充电管理芯片第7脚为高电平,说明现在没有连接充电器,那么PWR输出低电平,U1B截止完成关机操作。如果充电管理芯片第7脚为低电平,说明现在连接充电器了,则退出测量程序,进入关机充电状态(LCD只显示充电进度)。

程序:
//开机操作
void start()
{
   uint8_t i=0;
         if(KEY==0)//按键引起的开机
         {
             while(1)
                         {
                             Delay_ms(100);
                                   if(++i>30)//3秒钟之后
                                         {
                                                        PWR_1;//保持开机状态
                                                  //此处显示开机LOGO
                                                  break;
                                         }
                                         else
                                         {
                                            if(KEY!=0) i=0;//按键时间小于3秒
                                         }
                         }
         }
         else//充电引起的开机
         {
             i=0;
                   while(1)
                         {
                             Delay_ms(100);
                                   //此处刷新充电界面
                                   if(KEY==0)//按键按下
                                         {
                                                         if(++i>30)//3秒钟之后
                                                         {
                                                                        PWR_1;//保持开机状态
                                                                        //此处显示开机LOGO
                                                                        break;
                                                         }
                                         }
                                         else //按键抬起就要重新计时
                                         {
                     i=0;                                 
                                         }
                         }
         }
}

//关机操作
void Stop()
{
   uint8_t i=0;
         if((BATC==0)|(BATM==0))//充电状态
         {
             while(1)//充电状态关机后进入充电界面
                         {
                                         Delay_ms(100);
                                   //此处刷新充电界面
                                   if(KEY==0)//按键按下
                                         {
                                                         if(++i>30)//3秒钟之后
                                                         {
                                                                        PWR_1;//保持开机状态
                                                                        //此处显示开机LOGO
                                                                        break;
                                                         }
                                         }
                                         else //按键抬起就要重新计时
                                         {
                     i=0;                                 
                                         }
                         }
         }
         else //非充电状态直接关机
         {
                         //此处关机LOGO
                   PWR_0;
                   while(1);
         }
}

//按键处理  KOK=1 短按     KOK=2 长按  在定时器中断中运行
void KeyScan()
{
                if(KEY==0)
                {                        
                                if(++KCnt>200)
                                {
                                          KSet = 0;
                                          KCnt = 200;
                                          KOK  = 2;
                                }
                                else if(KCnt>10)
                                {
                                          KSet = 1;
                                }
                }
                else
                {
                                 KCnt = 0;
                           if(KSet==1)
                           {
                                                KSet = 0;
                                                KOK = 1;
                                 }
                }
}

int main(void)
{
        SystemInit();
        TIM_INT_Config();
        TIM_OUT_Config();
        IO_Init();
        Systick_Init();
        USART_Configuration();
        initial_lcd();//LCD初始化
        full_display();//全屏填充
        start();//开机
        while(1)
        {
                if(KOK==2)//长按按键关机
                {
                          Stop();
                }
                LED_0;
                Delay_ms(1000);
                LED_1;
                Delay_ms(1000);
        }        
}

本帖PDF
转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

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