📄 leakage.c
字号:
//--------------------------------------------------------------
//这是个电力线路电压/电流/漏电检测告警系统
//--------------------------------------------------------------
//系统CPU: LPC935
//文件名: leakage.c
//版本: rev 1.0
//日期: 2007-9-1
//描述:
//-------------------------------------------------------------
//修改人:
//日期:
//描述:
//-------------------------------------------------------------
#include<reg935.h>
#include<absacc.h>
#include<intrins.h>
#include<UserDef.h>
sbit powerSwitchControl = P0^5;
sbit workIndication = P2^0;
sbit light = P1^4 ;
sbit lightControl = P1^6 ;
uchar bdata flagReg;
sbit initFlag = flagReg^0;
sbit writeEEPROMBufFullFlag = flagReg^1; //EEPROM写满标志
sbit leakageCurrentAlarm = flagReg^2; //漏电报警标志
sbit sampleTimeFlag = flagReg^3; //采样时间
sbit curTransErrFlag = flagReg^4; //
sbit batTransErrFlag = flagReg^5; //
sbit allDataTransErrFlag = flagReg^6; //
sbit recErrorFlag = flagReg^7; //
uchar bdata rdDataFlagReg;
sbit timeVerifyFlag = rdDataFlagReg^0; //
sbit rdCurDataFlag = rdDataFlagReg^1; //
sbit rdBatDataFlag = rdDataFlagReg^2; //
sbit rdAllDataFlag = rdDataFlagReg^3; //
sbit delaySwitchFlag = rdDataFlagReg^4; //延时关闸刀
//uchar data recClrCommandData[2]; //暂存清存储器的起始地址[0]=高位[1]=低位
uchar data recPresetData[4]; //暂存预置信息, [0]--消控类型,[1]--漏电流阈值,[2]--延时小时数,[3]--延时分钟数
uint data delayTime;
extern uint idata delayCount;
uchar data recRdBatDataSize[2]; //暂存读的批量数,最大512 批次,[0]--高位;[1]--低位
uchar data recStatus, recDataSize, recCommandBuf, recChkSum;
uchar data recDataCnt;
//发送数据缓冲器, [0]=address [1]=command [2]=size [3..(3+size-1)]=data(0)..data(size-1)
uchar xdata transDataBuf[EEPROM_PAGE_SIZE+3];//EEPROM_PAGE_SIZE = 128
uchar data transDataSize, transCheckSum;
uchar data transDataPtr;
uchar xdata writeEEPROMBuf[EEPROM_PAGE_SIZE];
uchar data wrEEPROMBufPtr;
uint data EEPROMWrAddr = EEPROM_ORG_ADDR; //写EEPROM 地址指针
uint data EEPROMRdAddr = EEPROM_ORG_ADDR; //读EEPROM 地址指针
extern uchar data recCurrentTimeBuf[7]; //暂存当前时间缓冲器[0]=世纪[1]=年[2]=月[3]=日[4]=时[5]=分[6]=秒
extern uchar data lineVolt[3]; //[0] 保存A 相电压,[1] 保存B 相电压 ,[2] 保存C 相电压
extern uchar data lineCurrent[3]; //[0] 保存A 相电流,[1] 保存B 相电流 ,[2] 保存C 相电流
extern uchar data leakageCurrentMsg[3]; //漏电信息
/*漏电信息
[0]--漏电情况,1: 有漏电; 0: 无漏电
[1]--漏电电流值
[2]--漏电线路,1: 表示A相漏电;2: 表示B相漏电; 3:表示C相漏电
*/
uchar idata delaySwitchOrgCnt[3];
uchar idata delaySwitchEndCnt[3];
void Delay(uchar);
void Lpc935Init(void);
uchar ReadID(void);
void ByteTransBuf(uchar, uchar);
void PageTransBuf(uchar);
void WriteI2CBufData(void);
void SampleLeakageCurrent(void);
extern void ReadEEPROMByte(uchar, uchar, uchar*);
extern void EEPROMWriteByte(uchar, uchar, uchar*);
extern void ADConvert(void);
extern void GetBus(void);
extern void SendByte(uchar);
extern bit ISendStr(uchar, uint , uchar*, uchar);
extern bit IRcvStr(uchar, uint, uchar *, uchar);
//---------------------------------------------------------------------------
//函数名称:main(void)
//功能描述:主函数
//输入:无
//输出:无
//---------------------------------------------------------------------------
main(void)
{
Lpc935Init();
Delay(200); //延时200ms
lightControl = 1;
flagReg = 0;
rdDataFlagReg = 0;
recStatus = INIT_STAT; //
//wrEEPROMBufPtr = writeEEPROMBuf;
ReadEEPROMByte(EEPROM_ALARM_TYPE_ORG_ADDR, 4, recPresetData); //读取漏电保护类型
ReadEEPROMByte(EEPROM_TIME_ADDR, 7, recCurrentTimeBuf); //读取已存的时间
delayTime = recPresetData[2]; //高位字节传送
delayTime = delayTime<<8;
delayTime = recPresetData[3]; //低位字节传送
while(1)
{
recPresetData[1] = 0x9B ;
if(initFlag)
{
EA = 0;
EEPROMWriteByte(EEPROM_ALARM_TYPE_ORG_ADDR, 4, recPresetData);
EA = 1;
initFlag = FALSE;
}
else if(timeVerifyFlag)
{
EA = 0; //中断禁止
EEPROMWriteByte(EEPROM_CUR_TIME_ORG_ADDR, 7, recCurrentTimeBuf);
EA = 1; //打开中断
timeVerifyFlag = FALSE;
}
else if(rdCurDataFlag)
{
ByteTransBuf(COM_RD_CUR_DATA, 16);
SBUF = SYNC;
transCheckSum = SYNC;
if(!curTransErrFlag)
rdCurDataFlag = FALSE;
else
rdCurDataFlag = TRUE;
}
else if(rdBatDataFlag)
{
if(EEPROMRdAddr==EEPROMWrAddr)
{
rdBatDataFlag = FALSE;
}
else
{
if(!batTransErrFlag)
{
PageTransBuf(COM_RD_BATCH_DATA);
SBUF = SYNC;
transCheckSum = SYNC;
}
else
{
EEPROMRdAddr = EEPROMRdAddr - 128;
PageTransBuf(COM_RD_BATCH_DATA);
SBUF = SYNC;
transCheckSum = SYNC;
batTransErrFlag = FALSE;
}
}
}
else if(rdAllDataFlag)
{
if(EEPROMRdAddr==EEPROMWrAddr)
{
rdAllDataFlag = FALSE;
}
else
{
if(!allDataTransErrFlag)
{
PageTransBuf(COM_RD_ALL_DATA);
SBUF = SYNC;
transCheckSum = SYNC;
}
else
{
EEPROMRdAddr = EEPROMRdAddr - 128;
PageTransBuf(COM_RD_ALL_DATA);
SBUF = SYNC;
transCheckSum = SYNC;
allDataTransErrFlag = FALSE;
}
}
}
else if(recErrorFlag)
{
transDataBuf[0] = ReadID();
transDataBuf[1] = recCommandBuf|0x80;
transDataBuf[2] = 0;
SBUF = SYNC;
transCheckSum = SYNC;
recErrorFlag = FALSE;
}
else if(delaySwitchFlag)
{
if(delayCount==delayTime)
{
powerSwitchControl = OPEN_SWITCH; //断开闸刀
}
else if(delayCount>=(delayTime+1))
{
powerSwitchControl = CLOSE_SWITCH; //取消闸刀控制
delaySwitchFlag = FALSE;
}
else
{
powerSwitchControl = CLOSE_SWITCH; //不切断闸刀
}
}
else if(sampleTimeFlag)
{
EA = 0;
ADConvert();
WriteI2CBufData();
EA = 1;
sampleTimeFlag = FALSE;
}
else if(writeEEPROMBufFullFlag)
{
if(EEPROMWrAddr<=0xFFFF)
{
if(ISendStr(0xA0, EEPROMWrAddr, writeEEPROMBuf, EEPROM_PAGE_SIZE));
EEPROMWrAddr += 128;
}
else
{
EEPROMWrAddr = EEPROM_ORG_ADDR;
if(ISendStr(0xA0, EEPROMWrAddr, writeEEPROMBuf, EEPROM_PAGE_SIZE));
EEPROMWrAddr += 128;
}
writeEEPROMBufFullFlag = FALSE;
}
else if(leakageCurrentMsg[1]>=recPresetData[1])
{
leakageCurrentMsg[0] = 0x01;
lightControl = TRUE ;
switch(recPresetData[0])
{
case SWITCH_OFF:
if(leakageCurrentMsg[1]>=recPresetData[1])
powerSwitchControl = OPEN_SWITCH; //断开闸刀
else
powerSwitchControl = CLOSE_SWITCH; //不断开闸刀
break;
case NO_SWITCH_OFF:
powerSwitchControl = CLOSE_SWITCH; //不断开闸刀
break;
case DELAY_SWITCH_OFF: //延时断开闸刀
if(leakageCurrentMsg[1]>=recPresetData[1])
{
delayCount = 0;
delaySwitchFlag = TRUE;
}
else
{
powerSwitchControl = CLOSE_SWITCH; //不断开闸刀
delaySwitchFlag = FALSE;
}
break;
}
}
}
}
//---------------------------------------------------------------------------
//函数名称:void Delay(uchar t)
//功能描述:延时 t ms
//输入:uchar t (所要延时的长度)
//输出:无
//---------------------------------------------------------------------------
void Delay(uchar t) //延时1ms
{
uchar i;
while(t-- > 0)
{
for(i=0;i<120;i++)
{;}
}
}
//---------------------------------------------------------------------------
//函数名称:uchar ReadID(void)
//功能描述:读取本机地址
//输入:无
//输出:地址码
//---------------------------------------------------------------------------
uchar ReadID(void)
{
uchar tempID;
tempID = P0;
tempID = tempID >> 6;
tempID = (0xFC & P2)|(0x03 & tempID);
return(tempID);
//return(0x21);
}
//---------------------------------------------------------------------------
//函数名称:void WriteI2CBufData(void)
//功能描述:写缓冲区 满检测
//输入:无
//输出:无
//---------------------------------------------------------------------------
void WriteI2CBufData(void)
{
uchar i;
//将时间数据移动到页缓冲区
for(i=0;i<7;i++)
{
writeEEPROMBuf[wrEEPROMBufPtr] = recCurrentTimeBuf[i];
wrEEPROMBufPtr++;
if(wrEEPROMBufPtr >= EEPROM_PAGE_SIZE)
{
wrEEPROMBufPtr = 0;
writeEEPROMBufFullFlag = TRUE;
return;
}
else
writeEEPROMBufFullFlag = FALSE;
}
//将电压数据移动到页缓冲区
for(i=0;i<3;i++)
{
writeEEPROMBuf[wrEEPROMBufPtr] = lineVolt[i];
wrEEPROMBufPtr++;
if(wrEEPROMBufPtr >= EEPROM_PAGE_SIZE)
{
wrEEPROMBufPtr = 0;
writeEEPROMBufFullFlag = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -