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

📄 subprog.c

📁 Keil单片机软件开发平台下的一个51系列单片机工程
💻 C
📖 第 1 页 / 共 2 页
字号:
** 输 出:   
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 刘宝贵
** 日 期: 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 + -