📄 subprog.c
字号:
/*********************************************************************************************************
**相控充电机主控器系统 软件设计:刘宝贵,硬件设计:刘宝贵 调试:刘宝贵
**本系统使用编译器为 keil c51.exe V7.06
**本系统使用汇编器为 keil A51.exe V7.07
**本系统使用联接器为 keil BL51.exe V5.03
**本系统使用 RTX_TINY
**如果等程序有问题或者是Bug请与作者联系
**与作者联系方法:邮箱:baoguiliu@163.com,baoguiliu@sohu.com 电话:0451-6677970-6738
**
**
**VER1.0
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: SubProg.C
**创 建 人: 刘宝贵
**最后修改日期:
**描 述: 本项目所用子函数
**
**--------------历史版本信息----------------------------------------------------------------------------
** 修改人:
** 版 本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include"includes.h"
sbit ALE = P2^0;
/*********************************************************************************************************
** 函数名称: ReadLoopTimes
** 功能描述: 在由蝶式键盘或通信重新启动工步运行时要读取所设定的循环次数
** 输 入:
** 输 出: 将读出的巡环次数放入变量RemainLoopTimes并写入EEPROM
** 全局变量:
** 调用模块:
**
** 作 者: 刘宝贵
** 日 期: 2006年1月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void ReadLoopTimes()
{
unsigned char i;
for(i=0;i<STEP_MAX;i++)
{
Mode = EepromReadByte(ProgramNo*600 + i*20 + 2*0);
if(Mode==99)
{
RemainLoopTimes = 0;
EepromWriteByte(E2RemainLoopTimes ,RemainLoopTimes);
break;
}
if(Mode==77)//如果是设循环次数
{
RemainLoopTimes = EepromReadByte(ProgramNo*600 + i*20 + 2*1);
EepromWriteByte(E2RemainLoopTimes ,RemainLoopTimes);
break;
}
}
i = 0;
}
/*********************************************************************************************************
** 函数名称: CheckSingleStep
** 功能描述:
** 输 入: 无
** 输 出: 0:此工步非法,1:此工步合法
** 全局变量:
** 调用模块:
**
** 作 者: 刘宝贵
** 日 期: 2006年1月17日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
unsigned char CheckSingleStep(void)
{
bit flag = 1;
switch(Mode)
{
case 11://静电
{
if(JumpTimeM>JUMP_TIME_M_MAX)
{
flag = 0;
}
}break;
case 22://充电
case 33://再充电
{
if(SetupU==0 && JumpU==0)
{
flag = 0;
}
if(SetupI>SETUP_I_MAX)
{
flag = 0;
}
if( SetupU>SETUP_U_MAX)
{
flag = 0;
}
if(JumpTimeM > JUMP_TIME_M_MAX)
{
flag = 0;
}
if(JumpU > JUMP_U_MAX)
{
flag = 0;
}
if(JumpQ > JUMP_Q_MAX )
{
flag = 0;
}
}break;
case 44://放电
{
if(SetupU!=0 || JumpU==0)
{
flag = 0;
}
if(SetupI>SETUP_I_MAX)
{
flag = 0;
}
if( SetupU>SETUP_U_MAX)
{
flag = 0;
}
if(JumpTimeM > JUMP_TIME_M_MAX)
{
flag = 0;
}
if(JumpU > JUMP_U_MAX)
{
flag = 0;
}
if(JumpQ > JUMP_Q_MAX )
{
flag = 0;
}
}break;
case 88://反充电
{
if(SetupU!=0 || JumpU!=0)
{
flag = 0;
}
if(SetupI>SETUP_I_MAX)
{
flag = 0;
}
if(JumpTimeM > JUMP_TIME_M_MAX)
{
flag = 0;
}
}break;
case 55://设置电量
{
if(JumpQ > JUMP_Q_MAX)
{
flag = 0;
}
}break;
case 66://设置循环起始点
{
}break;
case 77://设置循环次数
{
if(LoopTimes > LOOP_TIMES_MAX)
{
flag = 0;
}
}break;
case 99://结束
{
if(SetupCurrentDirection>1)
{
flag = 0;
}
}break;
default:
{
flag = 0;
}
}
if(ProgramNo>PROGRAM_NO_MAX || Step>STEP_MAX)
{
flag = 0;
}
return (flag);
}
/*********************************************************************************************************
** 函数名称: SaveSingleStep()
** 功能描述: 将内存中的单步工步信息存入串行EEPROM
** 输 入:
** 输 出:
** 全局变量: ProgramNo,Step,Mode,LoopTimes,SetupI,SetupU,IntervalTimeM,JumpTimeM,JumpU,JumpQ
** 调用模块:
** 注 意:
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void SaveSingleStep(void)
{
EepromWriteByte(ProgramNo*600 + Step*20 + 2*0 , Mode);
EepromWriteByte(ProgramNo*600 + Step*20 + 2*1 , LoopTimes);
EepromWriteWord(ProgramNo*600 + Step*20 + 2*2 , SetupI);
EepromWriteWord(ProgramNo*600 + Step*20 + 2*3 , SetupU);
// EepromWriteWord(ProgramNo*600 + Step*20 + 2*4 , IntervalTimeM);
EepromWriteWord(ProgramNo*600 + Step*20 + 2*5 , JumpTimeM);
EepromWriteWord(ProgramNo*600 + Step*20 + 2*6 , JumpU);
EepromWriteWord(ProgramNo*600 + Step*20 + 2*7 , JumpQ);
if(Mode==99)
{
EepromWriteWord(E2SetupCurrentDirection , SetupCurrentDirection);
}
}
/*********************************************************************************************************
** 函数名称: void LoadSingleStep(unsigned char ProgramNoTemp,unsigned char StepTemp)
** 功能描述: 将串行EEPROM中的单步工步信息存入内存
** 输 入:
** 输 出:
** 全局变量: ProgramNo,Step,Mode,LoopTimes,SetupI,SetupU,IntervalTimeM,JumpTimeM,JumpU,JumpQ
** 调用模块:
** 注 意:
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void LoadSingleStep(unsigned char ProgramNoTemp,unsigned char StepTemp)
{
Mode = EepromReadByte(ProgramNoTemp*600 + StepTemp*20 + 2*0);
LoopTimes = EepromReadByte(ProgramNoTemp*600 + StepTemp*20 + 2*1);
SetupI = EepromReadWord(ProgramNoTemp*600 + StepTemp*20 + 2*2);
SetupU = EepromReadWord(ProgramNoTemp*600 + StepTemp*20 + 2*3);
JumpTimeM = EepromReadWord(ProgramNoTemp*600 + StepTemp*20 + 2*5);
JumpU = EepromReadWord(ProgramNoTemp*600 + StepTemp*20 + 2*6);
JumpQ = EepromReadWord(ProgramNoTemp*600 + StepTemp*20 + 2*7);
}
/*********************************************************************************************************
** 函数名称: void SetupDA(unsigned int temp16)
** 功能描述: 设定DA
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
** 注 意:
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void SetupDA(unsigned int temp16)
{
if(temp16 > 4094)
{
temp16 = 4094;
}
WriteOutDA = temp16;
WriteOutXRAM(CPLD_PWM_HIGH,(unsigned char)(temp16>>8));
WriteOutXRAM(CPLD_PWM_LOW ,(unsigned char)temp16);
}
/*********************************************************************************************************
** 函数名称: Midst
** 功能描述: 求中间值 返回中间值
** 输 入: pbuf被处理数据区首地址,width:被处理数据区宽度
** 输 出: 中间值
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 刘宝贵
** 日 期: 2004年4月19日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
/*
uint16 Midst(uint16 *pbuf, uint8 width)
{
int8 m, n;
uint16 itemp;
uint16 xdata buf[99];
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-2];
itemp+= buf[width/2+1];
itemp+= buf[width/2+2];
itemp/=5;
return itemp;
// return buf[width/2];
}
/*********************************************************************************************************
** 函数名称: uint16 MidstStruct(struct DataRecord *pbuf, uint8 width,uint16 NewRecord)
** 功能描述: 求中间值 返回中间值
** 输 入: pbuf被处理数据区首地址,width:被处理数据区宽度
** 输 出: 中间值
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 刘宝贵
** 日 期: 2006年3月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint16 MidstStruct(struct DataRecord *pbuf, uint8 width,uint16 NewRecord)
{
uint8 i,j;
struct DataRecord *ptemp;
bit flag;
flag = 0;
ptemp = pbuf;
for(i = 0;i<width; i++,pbuf++)
{
if(pbuf->Sequence >0)
{
if(--(pbuf->Sequence)==0)
{
j = i;
}
}
}
pbuf = ptemp + j;
for(i = j;i<width-1; i++,pbuf++)
{
pbuf->Record = (pbuf+1)->Record;
pbuf->Sequence = (pbuf+1)->Sequence;
}
for(;i>0;i--,pbuf--)
{
if(NewRecord < (pbuf-1)->Record)
{
pbuf->Record = (pbuf-1)->Record;
pbuf->Sequence = (pbuf-1)->Sequence;
}
else
{
break;
}
}
pbuf->Record = NewRecord;
pbuf->Sequence = width;
return((ptemp+width/2)->Record);
}
/*********************************************************************************************************
** 函数名称: unsigned char WriteOutXRAM(unsigned char Address,unsigned char temp8)
** 功能描述: 写单片机外扩的XRAM,要先不使能单片机内部的XRAM,写完后再使能CPU内部XRAM
** 输 入:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -