📄 general.c
字号:
/***********************************************************************************
C51 通用函数库 General.C
MCU 型号: Philips P89C668
时钟频率: 11.0592 MHz 6Clock
开发环境: Keil C51 V7.06
开发日期: 2003.09.17
程序编写: BaoFang
***********************************************************************************/
#include <REG668.H>
#include <G7000.H>
#include <BitOp.H>
#include <Menu.H>
#include <CAT24WC16P.H>
#include <Timer.H>
#include <TurnControl.H>
#include <CLOCK_DS1307.H>
#include <Flux_PCA.H>
#include <P89C668.H>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//外部4路输入检测量缓冲区
idata uchar ucInputFlagBuf;
//外部4路输入检测量设置区
idata uchar ucInputFlagPermit;
//高级设定PP RAM缓冲区
xdata uchar ucBuf_AdvanceSet[AdvanceSetLength];
//普通设定 P RAM缓冲区
xdata uchar ucBuf_NormSet[NormSetLength];
/*******************************************************************
外部4路输入检测量设置存储数据读入
函数原型: void fnRead_SystemInputFlagPermitData();
功能: 外部4路输入检测量设置存储数据读入
T1 PP3-1 0
T2 PP3-2 1
T3 PP3-3 2
T4 PP3-4 3
T3种类1 PP3-5 4
T3种类2 PP3-6 5
******************************************************************/
void fnRead_SystemInputFlagPermitData()
{
uchar ucTemp1;
uchar ucTemp2;
for (ucTemp1=0;ucTemp1<6;ucTemp1++)
{
//PP3 对于外部开关输入的检测设定
//读入相应地址的数据--单字节
//读入指定地址,单字节大小的数据:
//CAT24WC64P (N<=8192)(地址:0-8191)
//CAT24WC16P (N<=2048)(地址:0-2047)
fnRead_Eeprom(Menu_AdvanceSet1_3_List[ucTemp1].ucMenuIDAddress,
1,&ucTemp2);
if (ucTemp2 == 0)
{
//置0
ucInputFlagPermit = fnBitClr(ucInputFlagPermit,ucTemp1);
}
else
{
//置1
ucInputFlagPermit = fnBitSet(ucInputFlagPermit,ucTemp1);
}
}
}
/*******************************************************************
外部4路输入检测量设置BUF读入
函数原型: void fnReadBuf_SystemInputFlagPermitData();
功能: 外部4路输入检测量设置存储数据读入
T1 PP3-1 0
T2 PP3-2 1
T3 PP3-3 2
T4 PP3-4 3
T3种类1 PP3-5 4
T3种类2 PP3-6 5
******************************************************************/
void fnReadBuf_SystemInputFlagPermitData()
{
uchar ucTemp1;
uchar ucTemp2;
for (ucTemp1=0;ucTemp1<6;ucTemp1++)
{
//PP3 对于外部开关输入的检测设定 PPAD_PP3_1
//读入相应地址的数据--单字节
ucTemp2 = ucBuf_AdvanceSet[ PPAD_PP3_1 +ucTemp1];
if (ucTemp2 == 0)
{
//置0
ucInputFlagPermit = fnBitClr(ucInputFlagPermit,ucTemp1);
}
else
{
//置1
ucInputFlagPermit = fnBitSet(ucInputFlagPermit,ucTemp1);
}
}
}
/*******************************************************************
指定输入通道检测
函数原型: uchar fnCheck_SystemInputFlag(uchar ucInputNum);
功能: 指定输入通道检测
1. 读入外部4路输入 INSET
2. 和检测设置比较,检测指定通道。1 - 4
******************************************************************/
uchar fnCheck_SystemInputFlag(uchar ucInputNum)
{
//1. 读入外部4路输入 INSET
ucInputFlagBuf = INSET;
//2. 和检测设置比较,检测指定通道。
if (ucInputNum == 3)
{
// T3的检测
if (fnBitTest(ucInputFlagPermit , ucInputNum-1 ))
{
//T3种类2
if (fnBitTest(ucInputFlagPermit , 6-1 ))
{
//返回值 = 检测值 。
if( fnBitTest(ucInputFlagBuf , ucInputNum-1 ) )
return 1;
else
return 0;
}
else
{
//返回值 = 检测值 取反。
if( fnBitTest(ucInputFlagBuf , ucInputNum-1 ) )
return 0;
else
return 1;
}
}
else
{
//通道无效
return(0xFF);
}
}
else
// T1/T2/T4 的检测
if (fnBitTest(ucInputFlagPermit , ucInputNum-1 ))
{
//通道有效
if (fnBitTest(ucInputFlagBuf , ucInputNum-1 ))
{
//高电平 1-断开
return(1);
}
else
{
//低电平 0-闭合
return(0);
}
}
else
{
//通道无效
return(0xFF);
}
}
/*******************************************************************
读入系统设置函数
函数原型: void fnRead_SystemSetToBuf();
功能: 从外部EEPROM存储器中读入系统设定的信息到RAM的缓冲区。
高级设定PP xdata uchar ucBuf_AdvanceSet[AdvanceSetLength];
普通设定 P xdata uchar ucBuf_NormSet[NormSetLength];
******************************************************************/
void fnRead_SystemSetToBuf()
{
//读入系统高级设定PP
//读入指定地址,大小的数据:
//CAT24WC64P (N<=8192)(地址:0-8191)
//CAT24WC16P (N<=2048)(地址:0-2047)
fnRead_Eeprom(AdvanceSetAddress,AdvanceSetLength,ucBuf_AdvanceSet);
//读入系统普通设定 P
//读入指定地址,大小的数据:
//CAT24WC64P (N<=8192)(地址:0-8191)
//CAT24WC16P (N<=2048)(地址:0-2047)
fnRead_Eeprom(NormSetAddress,NormSetLength,ucBuf_NormSet);
}
/*******************************************************************
读入系统记忆RAM数据函数
函数原型: void fnRead_SystemZRAM();
功能:从DS1307的调电保持RAM中读取系统数据,恢复特定的变量
注意:DS1307的地址从DS1307RAMAddress0开始+相对地址
读入前,时段计时应该关闭!
******************************************************************/
void fnRead_SystemZRAM()
{
union{
uchar c[4];
ulong x;
}ucX_temp;
union{
uchar c[2];
uint x;
}ucX2_temp;
//按地址顺序读入所有变量
//ucSystemTurnNum; 系统时段 系统当前运行时段指针(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemTurnNum ,
1,
&ucSystemTurnNum);
//uchar uc5_TurnTime[5]; 系统运行剩余时间(Timer.C) 注意4字节,分秒不记录
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemTurnTime ,
4,
uc5_TurnTime);
uc5_TurnTime[4] = 0;
//uchar uc2_SystemTurnCon[2]; 系统当前控制量(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemTurnCon ,
2,
uc2_SystemTurnCon);
//uchar ucSystemTurnNumSaved; 保存的系统时段指针(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SavedSystemTurnNum ,
1,
&ucSystemTurnNumSaved);
//uchar uc5_SystemTurnTimeSaved[5];
//保存的系统时段时间量(TurnControl.C)注意4字节,分秒不记录
fnRead_DS1307RAM( DS1307RAMAddress0 + SavedSystemTurnTime ,
4,
uc5_SystemTurnTimeSaved);
uc5_SystemTurnTimeSaved[4] = 0;
//uchar uc2_SystemTurnConSaved[2]; 保存的系统时段控制量(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SavedSystemTurnCon ,
2,
uc2_SystemTurnConSaved);
//uint uiSystemGen0; CL(GEN0) 系统总还原的次数(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemGen0 ,
2,
ucX2_temp.c);
uiSystemGen0 = ucX2_temp.x;
//uint uiSystemGen1; CL(GEN1) 系统1还原的次数(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemGen1 ,
2,
ucX2_temp.c);
uiSystemGen1 = ucX2_temp.x;
//uint uiSystemGen2; CL(GEN2) 系统2还原的次数(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemGen2 ,
2,
ucX2_temp.c);
uiSystemGen2 = ucX2_temp.x;
//uint uiSystemGen3; CL(GEN3) 系统3还原的次数(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemGen3 ,
2,
ucX2_temp.c);
uiSystemGen3 = ucX2_temp.x;
//uint uiSystemGen4; CL(GEN4) 系统4还原的次数(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemGen4 ,
2,
ucX2_temp.c);
uiSystemGen4 = ucX2_temp.x;
//idata ulong ulFluxPulse;
//流量计脉冲计数器,记录所有捕捉到的脉冲,直至清零。(Flux_PCA.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemFluxPulse ,
4,
ucX_temp.c);
//流量计读入中断保护!
//计数器暂停
//FluxPulseCounterDisable;
EC=0;
ulFluxPulse = ucX_temp.x;
//流量计脉冲计数器运行允许
//FluxPulseCounterEnable;
EC=1;
//xdata uchar ucSystemCouse; 系统触发变量(位选择)(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemCouse ,
1,
&ucSystemCouse);
//xdata uchar ucSystemAlarm; 系统报警变量(位选择)(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemAlarm ,
1,
&ucSystemAlarm);
//xdata uchar ucSystemPause; 系统暂停变量(位选择)(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemPause ,
1,
&ucSystemPause);
//xdata uchar ucSystemRG1; 系统中间变量(位选择)(TurnControl.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemRG1 ,
1,
&ucSystemRG1);
//uchar uc7_RECFluxVelocityMaxDateTime_Today[7]; 记录的当天最大流速发生的时间(Flux_PCA.C)
/* fnRead_DS1307RAM( DS1307RAMAddress0 + SystemTodayREC_VTime ,
7,
uc7_RECFluxVMaxDT_Today);
//ulong ulRECFluxVelocityMax_Today; 记录的当天最大流速(Flux_PCA.C)
fnRead_DS1307RAM( DS1307RAMAddress0 + SystemTodayREC_V ,
4,
ucX_temp.c);
ulRECFluxVMax_Today = ucX_temp.x;
*/
}
/*******************************************************************
保存系统记忆RAM数据函数
函数原型: void fnWrite_SystemZRAM();
功能:在DS1307的调电保持RAM中写入系统数据,备份特定的变量
注意:DS1307的地址从DS1307RAMAddress0开始+相对地址
******************************************************************/
void fnWrite_SystemZRAM()
{
union{
uchar c[4];
ulong x;
}ucX_temp;
union{
uchar c[2];
uint x;
}ucX2_temp;
//按地址顺序保存所有变量
//ucSystemTurnNum; 系统时段 系统当前运行时段指针(TurnControl.C)
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemTurnNum ,
1,
&ucSystemTurnNum);
//uchar uc5_TurnTime[5]; 系统运行剩余时间(Timer.C) 注意4字节,分秒不记录
//为防止与时间中断冲突
//关定时器中断
timer0_int_disable; //time0中断使能
ucX_temp.c[0] = uc5_TurnTime[0];
ucX_temp.c[1] = uc5_TurnTime[1];
ucX_temp.c[2] = uc5_TurnTime[2];
ucX_temp.c[3] = uc5_TurnTime[3];
//开定时器中断
timer0_int_enable; //time0中断使能
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemTurnTime ,
4,
ucX_temp.c);
//uc5_TurnTime[4] = 0;
//uchar uc2_SystemTurnCon[2]; 系统当前控制量(TurnControl.C)
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemTurnCon ,
2,
uc2_SystemTurnCon);
//uchar ucSystemTurnNumSaved; 保存的系统时段指针(TurnControl.C)
fnWrite_DS1307RAM( DS1307RAMAddress0 + SavedSystemTurnNum ,
1,
&ucSystemTurnNumSaved);
//uchar uc5_SystemTurnTimeSaved[5];
//保存的系统时段时间量(TurnControl.C)注意4字节,分秒不记录
fnWrite_DS1307RAM( DS1307RAMAddress0 + SavedSystemTurnTime ,
4,
uc5_SystemTurnTimeSaved);
//uc5_SystemTurnTimeSaved[4] = 0;
//uchar uc2_SystemTurnConSaved[2]; 保存的系统时段控制量(TurnControl.C)
fnWrite_DS1307RAM( DS1307RAMAddress0 + SavedSystemTurnCon ,
2,
uc2_SystemTurnConSaved);
//uint uiSystemGen0; CL(GEN0) 系统总还原的次数(TurnControl.C)
ucX2_temp.x = uiSystemGen0;
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemGen0 ,
2,
ucX2_temp.c);
//uint uiSystemGen1; CL(GEN1) 系统1还原的次数(TurnControl.C)
ucX2_temp.x = uiSystemGen1;
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemGen1 ,
2,
ucX2_temp.c);
//uint uiSystemGen2; CL(GEN2) 系统2还原的次数(TurnControl.C)
ucX2_temp.x = uiSystemGen2;
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemGen2 ,
2,
ucX2_temp.c);
//uint uiSystemGen3; CL(GEN3) 系统3还原的次数(TurnControl.C)
ucX2_temp.x = uiSystemGen3;
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemGen3 ,
2,
ucX2_temp.c);
//uint uiSystemGen4; CL(GEN4) 系统4还原的次数(TurnControl.C)
ucX2_temp.x = uiSystemGen4;
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemGen4 ,
2,
ucX2_temp.c);
//计数器暂停
//FluxPulseCounterDisable;
EC=0;
//idata ulong ulFluxPulse;
//流量计脉冲计数器,记录所有捕捉到的脉冲,直至清零。(Flux_PCA.C)
ucX_temp.x = ulFluxPulse;
//流量计脉冲计数器运行允许
//FluxPulseCounterEnable;
EC=1;
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemFluxPulse ,
4,
ucX_temp.c);
//xdata uchar ucSystemCouse; 系统触发变量(位选择)(TurnControl.C)
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemCouse ,
1,
&ucSystemCouse);
//xdata uchar ucSystemAlarm; 系统报警变量(位选择)(TurnControl.C)
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemAlarm ,
1,
&ucSystemAlarm);
//xdata uchar ucSystemPause; 系统暂停变量(位选择)(TurnControl.C)
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemPause ,
1,
&ucSystemPause);
//xdata uchar ucSystemRG1; 系统中间变量(位选择)(TurnControl.C)
fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemRG1 ,
1,
&ucSystemRG1);
//uchar uc7_RECFluxVelocityMaxDateTime_Today[7]; 记录的当天最大流速发生的时间(Flux_PCA.C)
/* fnWrite_DS1307RAM( DS1307RAMAddress0 + SystemTodayREC_VTime ,
7,
uc7_RECFluxVMaxDT_Today);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -