📄 subprogram.c
字号:
/*******************************************************************************************************
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: subprogram.c
**创 建 人: 刘宝贵
**最后修改日期: 2004年4月16日
**描 述: 常用函数
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 刘宝贵
** 版 本: V1.00
** 日 期: 2004年4月16日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
** 修改人: 刘宝贵
** 版 本: V1.10.5
** 日 期: 2004年4月16日
** 描 述:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
/*********************************************************************************************************
** 函数名称: ConfigMe
** 功能描述: 系统配置如果是第一次使用将所有参数初始化,DA置为0
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块: OSSemPend OSSemPost
**
** 作 者: 刘宝贵
** 日 期: 2004年5月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void ConfigMe()//manual config
{
uint8 data i;
for(i=0;i<255;i++)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
ClearDA();
da(0,0);
da(0,1);
P4 |=0xFF;
P5 |=0x0F;
P2 |=0xF0;
P1 |=0xFF;//所有DA_EN脚均为1,使所有398处于采样状态,把所有DA清为0
SumWorkStep = EepromReadByte(SumWorkStepIICBase);
CurrentWorkStep = EepromReadByte(CurrentWorkStepIICBase);
CurrentWorkStepMax = EepromReadByte(CurrentWorkStepMaxIICBase);
Second = EepromReadWord(SecondIICBase);
if(SumWorkStep<13 && CurrentWorkStep<13)
{
for(i=1;i<=SumWorkStep;i++)
{
WorkStep[i].type = EepromReadByte(WorkStepIICBase + i*9 + 0);
WorkStep[i].i = EepromReadWord(WorkStepIICBase + i*9 + 1);
WorkStep[i].limit = EepromReadWord(WorkStepIICBase + i*9 + 3);
WorkStep[i].t = EepromReadWord(WorkStepIICBase + i*9 + 5);
WorkStep[i].u = EepromReadWord(WorkStepIICBase + i*9 + 7);
}
for(i=0;i<24;i++)
{
Cell[i].c = EepromReadWord(Cell_CIICBase+i*4+0);
Cell[i].c = Cell[i].c<<16;
Cell[i].c|= EepromReadWord(Cell_CIICBase+i*4+2);
Cell[i].t = EepromReadWord(Cell_TIICBase + i*2);
Cell[i].s = EepromReadByte(Cell_SIICBase + i);
ReferenceU[i] = EepromReadWord(ReferenceUIICBase + i*2);
}
}//if(SumWorkStep<13)
WorkStepCheck();
Reset =1;
CommCounter = 0;
ALARMLED = 0;//1:on 0:0ff
}
/*********************************************************************************************************
** 函数名称: 给所有DA通道赋值
** 功能描述: 系统配置如果是第一次使用将所有参数初始化,DA置为0
** 输 入: 无
** 输 出: 无
** 全局变量: DAIBuf[] DAUBuf[] WorkStep[] CurrentWorkStep
** 调用模块: OSSemPend OSSemPost EepromReadWord
**
** 作 者: 刘宝贵
** 日 期: 2004年5月23日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void SetupDA(void)
{
uint8 data i;
uint16 xdata temp16a,temp16b;
uint32 xdata temp32;
for(i=0;i<24;i++)
{
temp32 = WorkStep[CurrentWorkStep].i;
temp32 *= 4559;
temp32 /= 2500;
do
{
OSSemPend(IICSem,0);
temp16a = EepromReadWordA(CellParaIICBase+i*16+6*2);
temp16b = EepromReadWordA(CellParaIICBase+i*16+6*2);
OSSemPost(IICSem);
}while(temp16a != temp16b);
if(temp16a>PARAMETER_MAX || temp16a<PARAMETER_MIN)
{
OSSemPend(IICSem,0);
EepromWriteWordA(CellParaIICBase+i*16+6*2,10000);
OSSemPost(IICSem);
temp16a = 10000;
}
temp32 *= temp16a;
temp32 /= 130000;
DAIBuf[i] = (uint16)temp32;
if(DAIBuf[i] > 4095)
{
DAIBuf[i] = 4095;
}
if(WorkStep[CurrentWorkStep].type == CHARGE)
{
temp32 = WorkStep[CurrentWorkStep].u;
temp32*= 4095;
temp32/= 50000;
// temp32 = 3440;//4095 * 2100 / 2500;
do
{
OSSemPend(IICSem,0);
temp16a = EepromReadWordA(CellParaIICBase+i*16+4*2);
temp16b = EepromReadWordA(CellParaIICBase+i*16+4*2);
OSSemPost(IICSem);
}while(temp16a != temp16b);
if(temp16a>PARAMETER_MAX || temp16a<PARAMETER_MIN)
{
OSSemPend(IICSem,0);
EepromWriteWordA(CellParaIICBase+i*16+4*2,10000);
OSSemPost(IICSem);
temp16a = 10000;
}
temp32*=temp16a;
temp32/=9600;
DAUBuf[i] = (uint16)temp32;
if(DAUBuf[i] > 4095 )
{
DAUBuf[i] = 4095;
}
}//if(WorkStep[CurrentWorkStep].type == CHARGE)
else if(WorkStep[CurrentWorkStep].type == DISCHARGE)
{
DAUBuf[i] = 4095;
}
else
{
DAUBuf[i] = 0;
}
}//for(i=0;i<24;i++)
}
/*********************************************************************************************************
** 函数名称: da
** 功能描述: 控制C8051F020的DA输出
** 输 入: dadata:要输出的DA值:0~4095
** dachannel:DA输出的通道0,1
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 刘宝贵
** 日 期: 2004年4月16日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void da(uint16 temp,uint8 channel)
{
if(channel==0)
{
DAC0L=temp&0xff;
DAC0H=(temp>>8)&0xff;
DAC0CN=0x80;
}
else
{
DAC1L=temp&0xff;
DAC1H=(temp>>8)&0xff;
DAC1CN=0x80;
}
}
/*********************************************************************************************************
** 函数名称: midst
** 功能描述: 求中间值 返回中间值
** 输 入: pbuf被处理数据区首地址,width:被处理数据区宽度
** 输 出: 中间值
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 刘宝贵
** 日 期: 2004年4月19日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint16 midst(uint16 *pbuf, uint8 width)
{
int8 m, n;
uint16 itemp;
uint16 xdata buf[10];
for (m = 0; m < width; m++)
{
buf[m] = pbuf[m];
}
for (m = 0; m < width; m++)
{
for ( n = m - 1; n >= 0; n--)
{
if (buf[n+1] > buf[n])
{
itemp = buf[n];
buf[n] = buf[n+1];
buf[n+1] = itemp;
}
}
}
itemp = buf[width/2];
itemp+= buf[width/2-1];
itemp+= buf[width/2+1];
// itemp/=3;
return itemp;
// return buf[width/2];
}
/*********************************************************************************************************
** 函数名称: ClearDA
** 功能描述: 将系统DA置0
** 输 入: 无
** 输 出: 无
** 全局变量: DAUBuf DAIBuf
** 调用模块:
**
** 作 者: 刘宝贵
** 日 期: 2004年5月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void ClearDA(void)
{
uint8 data i;
for(i=0;i<24;i++)
{
DAUBuf[i]=0;
DAIBuf[i]=0;
}
}
/*********************************************************************************************************
** 函数名称: WorkStepInit
** 功能描述: 工步初始化:设置Cell[i].c,Cell[i].t,Cell[i].s,Second
** 输 入: 无
** 输 出: 无
** 全局变量: Cell[i].c,Cell[i].t,Cell[i].s,Second Reset
** 调用模块:
**
** 作 者: 刘宝贵
** 日 期: 2004年5月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void WorkStepInit(uint8 type)
{
uint8 data i;
if(Reset==0)
{
for(i=0;i<24;i++)
{
OS_ENTER_CRITICAL();
if(type !=STOP)
{
Cell[i].c=0;
}
Cell[i].t=0;
Cell[i].s=type;
OS_EXIT_CRITICAL();
}
Second = 0;
}
else
{
Reset = 0;
}
}
/*********************************************************************************************************
** 函数名称: WorkStepCheck
** 功能描述: 工步合法性检查
** 输 入: 无
** 输 出: work_step_lawful 1:合法 0:非法
** 全局变量: SumWorkStep CurrentWorkStep WorkStep[]
** 调用模块: 无
**
** 作 者: 刘宝贵
** 日 期: 2004年5月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
bit WorkStepCheck(void)
{
uint8 data i;
bit work_step_lawful = 1; //工步是否合法
if(CurrentWorkStep > SumWorkStep || SumWorkStep > 12 )
work_step_lawful = 0;
if(WorkStep[SumWorkStep].type !=STOP)
work_step_lawful = 0;
for(i=1;i<=SumWorkStep;i++)
{
switch (WorkStep[i].type)//检测本工步是否有效
{
case 0://停止
{
_nop_();
}break;
case 1://静止
{
if(WorkStep[i].i > 0 || WorkStep[i].t>20*60 || WorkStep[i].t<1*60 )
{
work_step_lawful=0;
}
}break;
case 2://充电
{
if( WorkStep[i].i > 30000 || WorkStep[i].i < 200
||WorkStep[i].limit > 300 || WorkStep[i].limit < 50
||WorkStep[i].t > 360*60 || WorkStep[i].t < 1*60
||WorkStep[i].u > 42000 || WorkStep[i].u < 500
)
{
work_step_lawful=0;
}
}break;
case 3://放电
{
if( WorkStep[i].i > 30000 || WorkStep[i].i < 300
||WorkStep[i].limit > 41000 || WorkStep[i].limit< 23000
||WorkStep[i].t > 120*60 || WorkStep[i].t < 1*60)
{
work_step_lawful=0;
}
}break;
}
}
if(work_step_lawful==0)//如果工步违法,则初始化工步。
{
CurrentWorkStep = 0;
SumWorkStep = 1;
WorkStep[1].type = STOP;
return(0);
}
else
{
return(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -