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

📄 flux_pca.c

📁 一个流量控制仪器的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************************

PCA流量计控制程序  Flux_PCA.C

MCU 型号: Philips P89C668
时钟频率: 11.0592 MHz           6Clock
接口方式: PCA CEX.1
开发环境: Keil C51 V7.06	
开发日期: 2003.09.24
程序编写: BaoFang
	
***********************************************************************************/


#include <REG668.H>
#include <Flux_PCA.H>
#include <Menu.H>
#include <Timer.H>
#include <CAT24WC16P.H>
#include <BitOp.H>
#include <G7000.H>
#include <General.H>
#include <CLOCK_DS1307.H>



#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long


//流量计脉冲到达延时   (为显示流量脉冲使用)
#define	FluxPulseComingDelay	10;


//流量计脉冲计数器,记录所有捕捉到的脉冲,直至清零。
idata ulong	ulFluxPulse;

//流量计脉冲计数器运行允许标志
bit	bFluxPulseRunEnable;

//流量计流量结束标志
bit	bFluxLimitOver;

//流量计正负流量统计标志
bit	bIFFluxPositive;

//流量计脉冲/水流量单位换算比率  脉冲/顿水  --流量计倍率
xdata uint	uiFluxPulsePerTonWater;		//PP2-1的设定量


//流量计流速统计时间(PP2-2)(注意,不能为0!)
xdata uint	uiFluxVelocityTime;

//流量计流速计时
xdata uchar uiFluxVelocityTimeS;


//流量计流量上限(P4)
xdata uint	uiFluxLimit;

//负流量的比例(PP2-3)
xdata uchar ucFluxLimit_Negative;


//流量计剩余水量 整数(正负流量)
xdata long	lFluxRemainInt;

//流量计剩余水量 小数
xdata uchar ucFluxRemainDec;

//流量计脉冲到达标志
xdata uchar	ucFluxPulseComing;

//流量计复位掉电确认位,只使用一次!!!复位后自动允许
//0-曾掉电,现复位无须清零
//1-正常,需要清零!
bit bFluxResetEnable;


//上次的流量计脉冲
xdata ulong ulFluxPulseLast;

//单位时间内的脉冲数(流速)
xdata ulong ulFluxVelocity;

//(流速)整数
xdata ulong	ulFluxVelocityInt;

//(流速)小数
xdata uchar ucFluxVelocityDec;

//CL(SPEEDMAX)	为记录的最大流速			
xdata ulong 	ulRECFluxVelocityMax;

//CL(TodaySPEEDMAX)			记录的当天最大流速			
//xdata ulong 	ulRECFluxVMax_Today;

//CL(TodaySPEEDMAXTIME) 	记录的当天最大流速发生的时间	
//xdata uchar	uc7_RECFluxVMaxDT_Today[7];




/*******************************************************************
		流量计相关存储数据读入函数
函数原型: void fnRead_FluxPulseCounterData();
功能: 	流量计相关存储数据读入函数
********************************************************************/

void fnRead_FluxPulseCounterData()
{
        uchar uc2_temp1[2];
        
        uchar uc8_temp[8];

        //1.	PP2-1  流量计倍率	uint	uiFluxPulsePerTonWater;
                //读入相应地址的数据--双字节
		//读入指定地址,双字节大小的数据:	
                //CAT24WC64P  (N<=8192)(地址:0-8191)
                //CAT24WC16P  (N<=2048)(地址:0-2047)
        fnRead_Eeprom(Menu_AdvanceSet1_2_List[0].ucMenuIDAddress,
                2,uc2_temp1);

        uiFluxPulsePerTonWater = uc2_temp1[1];
        
        uiFluxPulsePerTonWater = uiFluxPulsePerTonWater << 8;

        uiFluxPulsePerTonWater += uc2_temp1[0];


        //2.	PP2-2  流量计流速统计时间	uint	uiFluxVelocityTime;
                //读入相应地址的数据--双字节
		//读入指定地址,双字节大小的数据:	
                //CAT24WC64P  (N<=8192)(地址:0-8191)
                //CAT24WC16P  (N<=2048)(地址:0-2047)
        fnRead_Eeprom(Menu_AdvanceSet1_2_List[1].ucMenuIDAddress,
                2,uc2_temp1);

        uiFluxVelocityTime = uc2_temp1[1];
        
        uiFluxVelocityTime = uiFluxVelocityTime << 8;

        uiFluxVelocityTime += uc2_temp1[0];   


        //3.	P4	流量计流量上限	uint uiFluxLimit;
                //读入相应地址的数据--双字节
		//读入指定地址,双字节大小的数据:	
                //CAT24WC64P  (N<=8192)(地址:0-8191)
                //CAT24WC16P  (N<=2048)(地址:0-2047)
        fnRead_Eeprom(Menu_NormSet1List[3].ucMenuIDAddress,
                2,uc2_temp1);

        uiFluxLimit = uc2_temp1[1];
        
        uiFluxLimit = uiFluxLimit << 8;

        uiFluxLimit += uc2_temp1[0];      
        
        //4.	PP2-3  负流量的比例  uchar ucFluxLimit_ Negative;
                //读入相应地址的数据--单字节
		//读入指定地址,双字节大小的数据:	
                //CAT24WC64P  (N<=8192)(地址:0-8191)
                //CAT24WC16P  (N<=2048)(地址:0-2047)
        fnRead_Eeprom(Menu_AdvanceSet1_2_List[2].ucMenuIDAddress,
                1,uc2_temp1);

        ucFluxLimit_Negative = uc2_temp1[0];
        
        //5.读最大流速
        ulRECFluxVelocityMax = fnRead_SystemRecord3(1,uc8_temp);
        
     
        //流量计的流速统计间隔不能为0!默认为5秒!
        if(uiFluxVelocityTime == 0)
        	uiFluxVelocityTime = 5;
        	
        //此时,重新计时开始统计流速!
        uiFluxVelocityTimeS = 0;
                 
        
}

/*******************************************************************
		流量计脉冲计数器硬件初始化函数
函数原型: void fnInit_FluxPulseCounter();
功能: 	流量计脉冲计数器硬件初始化函数,停止运行。
********************************************************************/
void fnInit_FluxPulseCounter()
{
		//uchar i;
		
        //1.	计数器暂停
        FluxPulseCounterDisable;

        //2.	计数器清零
        ulFluxPulse = 0;
        
        ulFluxPulseLast = 0;

        //所有流量计相关变量初始化。

        bFluxLimitOver = 0;     //默认值 流量未到达

        bIFFluxPositive = 1;    //默认值 正流量统计
        
        ucFluxPulseComing = 0;
        
        lFluxRemainInt = 0;
        ucFluxRemainDec = 0;
        
        //流速初始化
        ulFluxVelocity = 0;
        ulFluxVelocityInt = 0;
        ucFluxVelocityDec = 0;
        
       	//读入系统日期时钟
       	//fnRead_SystemClock();
       	
       	//(最大流速)当天日期读入
       	//for(i=4;i++;i<7)
       	//	uc7_RECFluxVMaxDT_Today[i] = uc8_SystemDateTime[i];
       		
       	//时间清零
       	//for(i=1;i++;i<4)
       	//	uc7_RECFluxVMaxDT_Today[i] = 0;       	
       		
       	//当天最大流速清零
       	//ulRECFluxVMax_Today = 0;

        //流量计相关存储数据读入
        fnRead_FluxPulseCounterData();

        
        //流量计复位允许
        bFluxResetEnable = 1;
        

        //3.	PCA硬件初始化
        
        CH=0;
        CL=0;
        
        CMOD = 0x80;

        CCAPM1 = 0x11;  //负跳变边沿捕捉


        EC=1;
        EA=1;


        //4.	PCA计数器开启
        CCON = 0x40;    //清除所有PCA中断标志,并重新启动PCA捕获


}


/*******************************************************************
		流量计脉冲计数器硬件中断函数
函数原型: void fnINT_FluxPulseCounter_PCA()
功能: 	流量计脉冲计数器硬件中断函数
********************************************************************/
void fnINT_FluxPulseCounter_PCA()  interrupt 6
{
        
        CCON = 0x40;    //清除所有PCA中断标志,并重新启动PCA捕获

        if (bFluxPulseRunEnable)
        {
                ulFluxPulse ++;
                

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -