⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subprogram.c

📁 一个分选系统的软件:用SmallRtos操作系统
💻 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 + -