📄 bat_ctrl_12v24v_led.c
字号:
TR0 = 1; //打开定时器0
TR1 = 1;
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
void Init_RTC()
{
RTCH = 0xE0;
RTCL = 0xFF; //一个周期1s
RTCCON = 0x63; //内部RC振荡器输出时钟,中断使能,RTC启动
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
void Init_WDT()
{
Clr_Dog();
ACC = WDCON; //读取WDT控制寄存器
ACC = ACC|0x04; //置位ACC.2准备启动WDT
WDL = 0x80; //设置8位倒计时器初值
WDCON = ACC; //启动WDT
WFEED1 = 0xA5; //清零第一部分
WFEED2 = 0x5A; //清零第二部分
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
void Init_Interrupt()
{
IT0 = 1; //边沿触发
EX0 = 1; //外部中断1使能
EWDRT = 1; //实时时钟中断使能
EAD = 1; //AD中断使能
ET0 = 1; //
ET1 = 1;
// EA = 1; //总中断使能
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
void Init_All()
{
Clr_Dog();
Init_Var();
Init_IO();
Init_AD();
Init_Timer();
Init_RTC();
Init_WDT();
Init_Interrupt();
Led_Ctrl(1,2); //L3闪烁——正常运行
Led_Ctrl(0,0); //L2灭——没有过充或过放
P04 = 0; //负荷12关
P05 = 0; //负荷11关
P14 = 0; //
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
uchar Get_Mode()
{
uchar t_mode;
Clr_Dog();
switch(Mode)
{
case 0:t_mode = 0;break;
case 1:t_mode = 2;break;
case 2:t_mode = 4;break;
case 3:t_mode = 6;break;
case 4:t_mode = 8;break;
case 5:t_mode = 10;break;
case 6:t_mode = 12:break;
case 7:t_mode = 14;break;
case 8:t_mode = 16:break;
case 9:t_mode = 18:break;
default:t_mode = 0;break;
}
return(t_mode);
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
void GetAd()
{
uchar i;
uint BatTmp,SunTmp;
Clr_Dog();
EAD = 0;
BatTmp = 0;
SunTmp = 0;
for(i=0;i<AD_NUM;i++)
{
BatTmp += AdValue.BatAd[i];
SunTmp += AdValue.SunAd[i];
}
BatValue = BatTmp/AD_NUM;
SunValue = SunTmp/AD_NUM;
EAD = 1;
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
void Display(void)
{
if(SegFlag)
Display(Mode);
else
Display(0xff);
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
void Dis_seg(uchar dat)
{
uchar i;
uchar seg;
if(dat>=0 && dat<=9)
{
seg = segment[dat];
}
else
{
seg = 0;
}
HC595_STC = 0;
for(i=0;i<8;i++)
{
HC595_DAT = dat&0x80; //串行输出一位数据(最高位,第一个输出的对应的是Q7)
HC595_SHC = 0; //移位时钟,数据一位一位地移入寄存器
_nop_();
_nop_();
HC595_SHC = 1;
dat = dat<<1;
}
HC595_STC = 1;
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
void Main_Logic12(uchar TimeMode)
{
Clr_Dog();
if(BatValue>TINGCHONG12)// && P14==0)
{
if(!StopFlag)
{
ET0 = 0;
enPWM = 0; //禁止PWM
P14 = 0; //停止充电
StopFlag = 1; //停止充电
ET0 = 1;
}
PowerFlag = 1; //允许放电
Led_Ctrl(1,2); //运行状态灯L3闪烁
Led_Ctrl(0,1); //过充过放灯L2亮
}
else if(BatValue>GUOCHONG12)
{
if(!StopFlag)
{
ET0 = 0;
enPWM = 1; //允许PWM
ET0 = 1;
}
PowerFlag = 1; //允许放电
if(SunValue>BatValue)
Led_Ctrl(1,1); //运行状态灯L3亮
else
Led_Ctrl(1,2);
Led_Ctrl(0,1); //过充过放灯L2亮
}
else if(BatValue>YUNFANG12)
{
if(!StopFlag)
{
ET0 = 0;
enPWM = 0; //禁止PWM
P14 = 1; //全速充电
ET0 = 1;
}
PowerFlag = 1; //允许放电
if(SunValue>BatValue)
Led_Ctrl(1,1); //运行状态灯L3亮
else
Led_Ctrl(1,2);
Led_Ctrl(0,0); //过充过放灯L2灭
}
else;
Clr_Dog();
if(BatValue<GUOFANG12)
{
P05 = 0; //关闭负荷11
P04 = 0; //关闭负荷12
enPWM = 0; //禁止PWM
P14 = 1; //全速充电
PowerFlag = 0; //禁止放电
if(SunValue>BatValue)
Led_Ctrl(1,1); //运行状态灯L3亮(充电)
else
Led_Ctrl(1,2);
Led_Ctrl(0,2); //过充过放灯L2闪烁(过放)
}
else
{
if(BatValue<YUNCHONG12)
{
enPWM = 0; //禁止PWM
P14 = 1; //全速充电
StopFlag = 0; //允许再次充电
if(SunValue>BatValue)
Led_Ctrl(1,1); //运行状态灯L3亮(充电)
else
Led_Ctrl(1,2);
Led_Ctrl(0,0); //过充过放灯L2灭
}
if(PowerFlag)
{
if(TimeMode == 0)
{
P05 = 1; //启动负荷
P04 = 1; //启动负荷
CtrlFlag = 1;
}
else
{
Clr_Dog();
if(SunValue>=LIANGDENG12)
Delay4min2 = 0;
if(SunValue<=MIEDENG12)
Delay4min1 = 0; //延时清0
if(SunValue<NODELAY12)
{
P05 = 1; //启动负荷11
if(CtrlFlag)
{
P04 = 1; //启动负荷12
}
if(ClrFlag)
{
Seconds = 0; //清0
Minutes = 0; //清0
Hours = 0; //启动负荷的同时时间清0开始计数
ClrFlag = 0; //禁止清0
}
}
else if(SunValue<LIANGDENG12)
{
if(Delay_4min(0)) /*延时4min*/
{
if(SunValue<LIANGDENG12)
{
P05 = 1; //启动负荷
if(CtrlFlag)
{
P04 = 1; //启动负荷
}
if(ClrFlag)
{
Seconds = 0; //清0
Minutes = 0; //清0
Hours = 0; //启动负荷的同时时间清0开始计数
ClrFlag = 0; //禁止清0
}
}
}
}
else;
Clr_Dog();
if(SunValue>MIEDENG12)
{
if(Delay_4min(1))/*延时4min*/
{
if(SunValue>MIEDENG12)
{
P05 = 0; //关闭负荷11
P04 = 0; //关闭负荷12
ClrFlag = 1; //允许清0
CtrlFlag = 1;
}
}
}
if(Hours >= TimeMode && ClrFlag==0)
{
P04 = 0; //关闭负荷12
ClrFlag = 1; //允许清0
CtrlFlag = 0;
}
}
}
}
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
void Main_Logic24(uchar TimeMode)
{
Clr_Dog();
if(BatValue>TINGCHONG24)// && P14==0)
{
if(!StopFlag)
{
ET0 = 0;
enPWM = 0; //禁止PWM
P14 = 0; //停止充电
StopFlag = 1; //停止充电
ET0 = 1;
}
PowerFlag = 1; //允许放电
Led_Ctrl(1,2); //运行状态灯L3闪烁
Led_Ctrl(0,1); //过充过放灯L2亮
}
else if(BatValue>GUOCHONG24)
{
if(!StopFlag)
{
ET0 = 0;
enPWM = 1; //允许PWM
ET0 = 1;
}
PowerFlag = 1; //允许放电
if(SunValue>BatValue)
Led_Ctrl(1,1); //运行状态灯L3亮
else
Led_Ctrl(1,2);
Led_Ctrl(0,1); //过充过放灯L2亮
}
else if(BatValue>YUNFANG24)
{
if(!StopFlag)
{
ET0 = 0;
enPWM = 0; //禁止PWM
P14 = 1; //全速充
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -