📄 subprog.c
字号:
** 输 出:
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 刘宝贵
** 日 期: 2006年3月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void WriteOutXRAM(unsigned char Address,unsigned char temp8)
{
P0 = Address;
ALE = 0;
P0 = temp8;
WR = 0;
WR = 1;
ALE = 1;
}
/*********************************************************************************************************
** 函数名称: unsigned char ReadOutXRAM(unsigned char Address)
** 功能描述: 读单片机外扩的XRAM,要先不使能单片机内部的XRAM,读完后再使能CPU内部XRAM
** 输 入:
** 输 出:
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 刘宝贵
** 日 期: 2006年3月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
unsigned char ReadOutXRAM(unsigned char Address)
{
unsigned char i;
P0 = Address;
ALE = 0;
P0 = 0xFF;
RD = 0;
i = P0;
RD = 1;
ALE = 1;
return(i);
}
/*********************************************************************************************************
** 函数名称: unsigned int ClaculateSub(unsigned int Count,unsigned int b,unsigned int k)
** 功能描述: 对给定的数据进行处理
** 输 入:
** 输 出:
** 全局变量:
** 调用模块: 无
**
** 作 者: 刘宝贵
** 日 期: 2006年4月6日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
unsigned int ClaculateSub(unsigned int Count,unsigned int b,unsigned int k)
{
unsigned long temp32;
if( (4095-b) > Count)
{
temp32 = (4095-b) - Count;
}
else
{
temp32 = 0;
}
temp32*=k;
temp32/=1000;
return ( (unsigned int)temp32 );
}
/*********************************************************************************************************
** 函数名称: bit TestDataSub(unsigned int Data16A,unsigned int Data16B,unsigned char multiple)
** 功能描述: 测试给定的数据A和数据B是否相差给定的倍数分之一
** 输 入:
** 输 出:
** 全局变量:
** 调用模块: 无
**
** 作 者: 刘宝贵
** 日 期: 2006年4月6日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
bit TestDataSub(unsigned int Data16A,unsigned int Data16B,unsigned char Multiple)
{
if( Data16A > Data16B)
{
if(Data16A - Data16B > Data16A/Multiple)
{
return(1);
}
else
{
return(0);
}
}
else
{
if(Data16B - Data16A > Data16B/Multiple)
{
return(1);
}
else
{
return(0);
}
}
}
/*********************************************************************************************************
** 函数名称: void AdjustVoltage()
** 功能描述: 恒压充电时进行恒压调节
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者: 刘宝贵
** 日 期: 2006年4月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
#define UZero 2
#define IZero 2
void AdjustVoltage()
{
unsigned int DaOffset;
DaOffset = 0;
if(MeasureUAdjust > SetupU + UZero*2)
{//电压大于设定值
if (MeasureUAdjust-SetupU > 50*UZero)
{
DaOffset = (MeasureUAdjust-SetupU)/2;
}
else if (MeasureUAdjust-SetupU > 25*UZero)
{
DaOffset = (MeasureUAdjust-SetupU)/4;
}
else
{
DaOffset = 1;//小偏差 微调
}
if(DaOffset > 20)
{
DaOffset = 20;
}
if(RealTimeDA > DaOffset)
{
RealTimeDA -= DaOffset;
}
else
{
RealTimeDA = 0;
}
}
else if(MeasureUAdjust < SetupU-UZero*2)
{//电压小于设定值
if (MeasureI < SetupI-IZero)
{//电流
if (SetupU - MeasureUAdjust > 50*UZero)
{
DaOffset = (SetupU - MeasureUAdjust)/2;
}
else if(SetupU - MeasureUAdjust > 25*UZero)
{
DaOffset = (SetupU-MeasureUAdjust)/4;
}
else
{
DaOffset = 1;
}
}
if(DaOffset > 10)
{
DaOffset = 10;
}
RealTimeDA+=DaOffset;
}
if(RealTimeDA > SetupIDA)
{
RealTimeDA = SetupIDA;
}
SetupDA(RealTimeDA + DAb);
}
/*********************************************************************************************************
** 函数名称: void RunToStop()
** 功能描述: 由运行状态转为停止状态
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者: 刘宝贵
** 日 期: 2006年4月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void RunToStop()
{
ChangeStateFlag = 1;
while(WriteOutDA>10)
{
if(WriteOutDA>600)
{
WriteOutDA = WriteOutDA-100;
}
else
{
WriteOutDA = WriteOutDA-10;
}
SetupDA(WriteOutDA);
os_wait(K_TMO,100/OS_MSEL_PER_TICKS,0);
}
SetupDA(0);
os_wait(K_TMO,2000/OS_MSEL_PER_TICKS,0);
os_wait(K_TMO,1000/OS_MSEL_PER_TICKS,0);
JDQ_FMC = JDQ_ON;
os_wait(K_TMO,2000/OS_MSEL_PER_TICKS,0);
os_wait(K_TMO,1000/OS_MSEL_PER_TICKS,0);
JDQ_CHARGE = JDQ_OFF;
JDQ_DISCHARGE = JDQ_OFF;
os_wait(K_TMO,10/OS_MSEL_PER_TICKS,0);
ChangeStateFlag = 0;
}
/*********************************************************************************************************
** 函数名称: void Stop()
** 功能描述: 停止状态
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者: 刘宝贵
** 日 期: 2006年6月28日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void Stop()
{
SetupDA(0);
JDQ_FMC = JDQ_ON;
JDQ_CHARGE = JDQ_OFF;
JDQ_DISCHARGE = JDQ_OFF;
}
/*********************************************************************************************************
** 函数名称: void StopToCharge()
** 功能描述: 由停止状态转为充电状态
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者: 刘宝贵
** 日 期: 2006年4月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void StopToCharge()
{
unsigned char i;
unsigned long temp32;
ChangeStateFlag = 1;
SetupDA(0);
os_wait(K_TMO,1500/OS_MSEL_PER_TICKS,0);
os_wait(K_TMO,1500/OS_MSEL_PER_TICKS,0);
if(SetupCurrentDirection == 0)//正常方向
{
JDQ_CHARGE = JDQ_ON;
JDQ_DISCHARGE = JDQ_OFF;
}
else //逆向充电
{
JDQ_CHARGE = JDQ_OFF;
JDQ_DISCHARGE = JDQ_ON;
}
os_wait(K_TMO,1000/OS_MSEL_PER_TICKS,0);
JDQ_FMC = JDQ_OFF;
os_wait(K_TMO,500/OS_MSEL_PER_TICKS,0);
temp32 = SetupI;
temp32*=DAk;
temp32/=10000;
SetupIDA = (unsigned int)temp32;
RealTimeDA = SetupIDA;
for(i = 0;i<100;i++)
{
if(State!=RUN)
{
break;
}
SetupDA(((RealTimeDA + DAb)/100)*i);
os_wait(K_TMO,50/OS_MSEL_PER_TICKS,0);
}
if(State==RUN)
{
SetupDA(SetupIDA + DAb);
}
ChangeStateFlag = 0;
}
/*********************************************************************************************************
** 函数名称: void StopToDisCharge()
** 功能描述: 由停止状态转为放电状态
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
**
** 作 者: 刘宝贵
** 日 期: 2006年4月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void StopToDisCharge()
{
unsigned long temp32;
ChangeStateFlag = 1;
SetupDA(0);
os_wait(K_TMO,1500/OS_MSEL_PER_TICKS,0);
os_wait(K_TMO,1500/OS_MSEL_PER_TICKS,0);
if(SetupCurrentDirection == 0)//正常方向
{
JDQ_CHARGE = JDQ_OFF;
JDQ_DISCHARGE = JDQ_ON;
}
else //逆向充电
{
JDQ_CHARGE = JDQ_ON;
JDQ_DISCHARGE = JDQ_OFF;
}
os_wait(K_TMO,1000/OS_MSEL_PER_TICKS,0);
JDQ_FMC = JDQ_OFF;
os_wait(K_TMO,500/OS_MSEL_PER_TICKS,0);
temp32 = SetupI;
temp32*=DAk;
temp32/=10000;
SetupIDA = (unsigned int)temp32;
RealTimeDA = 0;
// RealTimeDA = SetupIDA;
while(MeasureI < SetupI/20 || RealTimeDA < DAb+150 )
{
if(State!=RUN)
{
break;
}
RealTimeDA+=1;
SetupDA(RealTimeDA);
os_wait(K_TMO,100/OS_MSEL_PER_TICKS,0);
if(RealTimeDA>1000)
{
State = STOP;
}
}
while(RealTimeDA < (SetupIDA+DAb)-10)
{
if(State!=RUN)
{
break;
}
RealTimeDA+=10;
SetupDA(RealTimeDA);
os_wait(K_TMO,200/OS_MSEL_PER_TICKS,0);
}
if(State==RUN)
{
RealTimeDA = SetupIDA + DAb;
SetupDA(RealTimeDA);
}
ChangeStateFlag = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -