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

📄 general.c

📁 一个流量控制仪器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************************
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 + -