?? charge.c
字號:
/*****************************************************************
** Project: 充電器
** file : charge.c
** date : 20081205
** author:
** version: v1.0
** description: 控制充電狀態,
** ---------------------------------------------------------------
** date :
** author:
** version:
** description:
******************************************************************/
#include "main.h"
//定義充電相關的控制變量
//定義充電控制狀態
u08 charge_state = STATE0_INITIAL; //系統上電后處于初始化狀態
u08 charge_flag = false; //充電的故障標志,0:故障,1正常
//定義充電控制狀態
u08 charge_hours = 0; //系統上電后小時寄存器初始值
u08 charge_seconds = 0; //系統上電后秒寄存器初始值
u08 charge_hour_flag =false; //小時時間到標志
u08 charge_second_flag =false; //秒時間到標志
//軟定時器內部寄存器
static u08 seconds =0;
static u08 hours =0;
static u08 minutes=0;
/*****************************************************************
** function:設定/獲取充電狀態
*****************************************************************/
void SetChargeState( u08 charge)
{
charge_state =charge;
}
u08 GetChargeState(void)
{
return charge_state;
}
/*****************************************************************
** function:設定/獲取充電標志:0:故障 1正常
*****************************************************************/
void SetChargeFlag( u08 flag)
{
charge_flag =flag;
}
u08 GetChargeFlag(void)
{
return charge_flag;
}
/*****************************************************************
** function :是否充電故障
** 返回 :ture 1:正常,false 0:故障;
*****************************************************************/
u08 GetChargeErr(void)
{
u08 ret;
if( GetUK() == 1)
{
ret = true;
}
else
{
ret = false;
}
//保證充電標志同步更新
SetChargeFlag(ret);
return ret;
}
/*****************************************************************
** function:充電各種狀態下的處理函數======充電初始化
*****************************************************************/
void state0_intial_proc(void)
{
//僅在系統處于該狀態時才執行
while( GetChargeState() == STATE0_INITIAL )
{
STAGE_1_CHARGE_OUT = CHARGE_OFF;
STAGE_2_CHARGE_OUT = CHARGE_OFF;
STAGE_3_CHARGE_OUT = CHARGE_OFF;
OVER_CHARGE_OUT = CHARGE_OFF;
SetLed(_LED1,OFF,OFF);
SetLed(_LED2,OFF,OFF);
SetLed(_LED3,OFF,OFF);
SetLed(_LED_ERR,OFF,OFF);
LedUpdate();
//狀態跳轉
SetChargeState(STATE1_JUDGE_UK);
}
}
/*****************************************************************
** function:充電各種狀態下的處理函數======第一階段前UK判斷處理
*****************************************************************/
void state1_judge_uk_proc(void)
{
//僅在系統處于該狀態時才執行
while( GetChargeState() == STATE1_JUDGE_UK )
{
if( GetChargeErr() == false )
{
ChargeErrorProc();
break;//因為上面函數里有將狀態設置為STATE1_JUDGE_UK 導致死循環 必須跳出
}
else
{
//設定充電標志為正常,非故障
SetChargeFlag(true);
//關閉故障燈
SetLed(_LED_ERR,OFF,OFF);
//狀態跳轉
SetChargeState(STATE2_STAGE_1);
}
}
}
/*****************************************************************
** function:充電各種狀態下的處理函數======第一階段充電處理
*****************************************************************/
void state2_stage_1_proc(void)
{
//僅在系統處于該狀態時才執行
while( GetChargeState() == STATE2_STAGE_1 )
{
//開第一階段執行燈 閃亮
SetLed(_LED1,ON,ON);
//開定時器A
SetTimerBySecond( TIMER_A );
//等待定時A
while(GetTimerBySecond()==false)
{
wdt_reset();
}
//定時到 開第一階段輸出
STAGE_1_CHARGE_OUT = CHARGE_ON;
//開定時器B 20H
SetTimerByHour( TIMER_B );
//等待定時B
while(1)
{
wdt_reset();
//如果U1 ==1
if( (GetU1() == 1) || (GetTimerByHour()==true))
{
//關第一階段充電輸出
STAGE_1_CHARGE_OUT = CHARGE_OFF;
//關第一階段充電指示燈
SetLed(_LED1,OFF,OFF);
break;
}
}
//開定時器C
SetTimerBySecond( TIMER_C );
//等待定時C
while(GetTimerBySecond()==false)
{
wdt_reset();
}
//查詢UK狀態
if( GetChargeErr() == false )
{
// 跳轉到故障處理 等待恢復
ChargeErrorProc();
}
else
{
//狀態正常跳轉
SetChargeState(STATE3_STAGE_2);
}
}
}
/*****************************************************************
** function:充電各種狀態下的處理函數======第2階段充電處理
*****************************************************************/
void state3_stage_2_proc(void)
{
//僅在系統處于該狀態時才執行
while( GetChargeState() == STATE3_STAGE_2 )
{
//開第2階段執行燈 閃亮
SetLed(_LED2,ON,ON);
//開定時器D
SetTimerBySecond( TIMER_D );
//等待定時D
while(GetTimerBySecond()==false)
{
wdt_reset();
}
//定時到 開第2階段輸出
STAGE_2_CHARGE_OUT = CHARGE_ON;
//開定時器E 2H
SetTimerByHour( TIMER_E );
//等待定時E
while(1)
{
wdt_reset();
//如果U2 ==1
if( (GetU2() == 1) || (GetTimerByHour()==true))
{
//關第2階段充電輸出
STAGE_2_CHARGE_OUT = CHARGE_OFF;
//關第2階段充電指示燈
SetLed(_LED2,OFF,OFF);
break;
}
}
//開定時器F
SetTimerBySecond( TIMER_F );
//等待定時F
while(GetTimerBySecond()==false)
{
wdt_reset();
}
//查詢UK狀態
if( GetChargeErr() == false )
{
// 跳轉到故障處理 等待恢復
ChargeErrorProc();
}
else
{
//狀態正常跳轉
SetChargeState(STATE4_STAGE_3);
}
}
}
/*****************************************************************
** function:充電各種狀態下的處理函數======第3階段充電處理
*****************************************************************/
void state4_stage_3_proc(void)
{
//僅在系統處于該狀態時才執行
while( GetChargeState() == STATE4_STAGE_3 )
{
//開第3階段執行燈 閃亮
SetLed(_LED3,ON,ON);
//開定時器D
SetTimerBySecond( TIMER_G );
//等待定時D
while(GetTimerBySecond()==false)
{
wdt_reset();
}
//定時到 開第3階段輸出
STAGE_3_CHARGE_OUT = CHARGE_ON;
//開定時器h 1H
SetTimerByHour( TIMER_H );
//等待定時H
while(1)
{
wdt_reset();
if( GetTimerByHour()==true)
{
//關第3階段充電輸出
STAGE_3_CHARGE_OUT = CHARGE_OFF;
//關第3階段充電指示燈
SetLed(_LED3,OFF,OFF);
//故障指示燈閃亮
SetLed(_LED_ERR,ON,ON);
//充電玩出輸出高電平
OVER_CHARGE_OUT = CHARGE_ON;
//打開1 2 3 階段指示燈,常亮 表面充電完畢
SetLed(_LED1,ON,OFF);
SetLed(_LED2,ON,OFF);
SetLed(_LED3,ON,OFF);
break;
}
}
//查詢UK狀態 等待為0
while( GetUK() == 1 )
{
wdt_reset();
}
SetChargeState(STATE0_INITIAL);//返回初始化狀態
}
}
/*****************************************************************
** function:充電各種狀態下的處理函數======故障處理
*****************************************************************/
void ChargeErrorProc(void)
{
//開故障燈常亮
SetLed(_LED_ERR,ON,OFF);
//將狀態恢復到初始化后的UK判斷
SetChargeState (STATE1_JUDGE_UK);
}
//////////////////////////////////////////////////// //定時相關處理
//系統基準節拍: 50ms中斷間隔
//
SIGNAL( SIG_OVERFLOW1 )
{
static u16 cnt;
TCNT1 = (65535 - 50000); //50ms中斷一次
if( cnt++ > 20 ) //1s到
{
cnt = 0;
seconds++;
//////////////////////////////////////////////////秒定時器判斷
if( charge_seconds > 1 && charge_second_flag ==false )
{
if( seconds >= charge_seconds )
{
charge_second_flag = true;//可通過設定定時器復位該標志
}
}
/////////////////////////////////////////////////// 1分鐘到
if( seconds >=60 )
{
seconds = 0;
minutes ++;
if( minutes >=60 )
{
minutes =0;
hours++ ;
////////////////////////////////////////////時定時器判斷
if(
( charge_hours >= 1) && //應該為》=1,否則1小時定時無法實現
( charge_hour_flag == false )
)
{
if( hours >= charge_hours )
{
charge_hour_flag = true;//可通過設定定時器復位該標志
}
}
if(hours >= 24)
{
hours =0;
}
}
}
}
}
//設定小時級定時器
void SetTimerByHour( u08 setval)
{
cli();
if( setval >= 24 )
{
charge_hours = 24;
}
else
{
charge_hours = setval;
hours =0;//d定時器復位
minutes =0 ;
} charge_hour_flag = false;
sei();
}
//讀取小時定時器標志,是否定時到
u08 GetTimerByHour( void)
{
return charge_hour_flag;
}
//設定秒級定時器 最大定時60s
void SetTimerBySecond( u08 setval)
{
cli();
if( setval >= 60 )
{
charge_seconds = 60;
}
else
{
charge_seconds = setval;
}
seconds = 0;
charge_second_flag = false;
sei();
}
//讀取秒定時器標志,是否定時到
u08 GetTimerBySecond( void)
{
return charge_second_flag;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -