📄 flux_pca.c
字号:
/***********************************************************************************
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 + -