📄 leak.txt
字号:
//--------------------------------------------------------------
//这是个电力线路电压/电流/漏电检测告警系统
//--------------------------------------------------------------
//系统CPU : LPC935
//创建人:Xinjaing Sun
//文件名:leakage.c
//版本: rev 1.0
//日期: 2006-5-8
//描述:
//-------------------------------------------------------------
//修改人:
//日期:
//描述:
//-------------------------------------------------------------
#include"reg935.h"
#include<absacc.h>
#include<intrins.h>
#include"UserDef.h"
sbit powerSwitchControl = P0^5;
//sbit powerSwitchControl = P1^6;
sbit workIndication = P2^0;
uchar bdata flagReg;
sbit initFlag = flagReg^0;
sbit writeEEPROMBufFullFlag = flagReg^1;
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, recChkSum, recDataSize, recCommandBuf;
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];
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 line volt,[1] 保存B line volt ,[3] 保存C line volt
extern uchar data lineCurrent[3]; //[0] 保存A line current,[1] 保存B line current ,[3] 保存C line current
/*漏电信息
[0]--漏电情况,1 : 有漏电;0 : 无漏电
[1]--漏电电流值
[2]--漏电线路,1: 表示A相漏电;2: 表示B相漏电; 3:表示C相漏电
*/
extern uchar data leakageCurrentMsg[3];
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);
//uint idata delayCount;
//uchar data recCurrentTimeBuf[7]; //暂存当前时间缓冲器[0]=世纪[1]=年[2]=月[3]=日[4]=时[5]=分[6]=秒
sbit secClock = P1^6;
//extern uint data delayTime;
//extern uchar data recPresetData[4];
//extern void ReadEEPROMByte(uchar orgAddr, uchar dataSize, uchar *bufPtr);
//extern void EEPROMWriteByte(uchar orgAddr, uchar dataSize, uchar *bufPtr);
void TimeGenerator(void);
//---------------------------------------------------------------------------
//函数名称:main(void)
//功能描述:主函数
//输入:无
//输出:无
//---------------------------------------------------------------------------
main(void)
{
Lpc935Init();
Delay(200); //延时200ms
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)
{
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;
}
}
}
//---------------------------------------------------------------------------
//函数名称:void Delay(uchar t)
//功能描述:延时
//输入: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 = (0xFC & P2)|(0x03 & P0);
return(tempID);
//return(0x21);
}
//---------------------------------------------------------------------------
//函数名称:void movDataToBuf(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;
return;
}
else
writeEEPROMBufFullFlag = FALSE;
}
//将电流数据移动到页缓冲区
for(i=0;i<3;i++)
{
writeEEPROMBuf[wrEEPROMBufPtr] = lineCurrent[i];
wrEEPROMBufPtr++;
if(wrEEPROMBufPtr>=EEPROM_PAGE_SIZE)
{
wrEEPROMBufPtr = 0;
writeEEPROMBufFullFlag = TRUE;
return;
}
else
writeEEPROMBufFullFlag = FALSE;
}
//将漏电信息移动到页缓冲区
for(i=0;i<3;i++)
{
writeEEPROMBuf[wrEEPROMBufPtr] = leakageCurrentMsg[i];
wrEEPROMBufPtr++;
if(wrEEPROMBufPtr>=EEPROM_PAGE_SIZE)
{
wrEEPROMBufPtr = 0;
writeEEPROMBufFullFlag = TRUE;
return;
}
else
writeEEPROMBufFullFlag = FALSE;
}
}
//---------------------------------------------------------------------------
//函数名称:void ByteTransBuf(uchar command, uchar dataSize)
//功能描述:将待发送数据放入发送缓冲区
//输入:command-- 上位机的命令字
// dataSize--发送数据的字节数
//输出:无
//---------------------------------------------------------------------------
void ByteTransBuf(uchar command, uchar dataSize)
{
uchar i;
//将本机地址、命令、数据字节数放入发送缓冲区
transDataBuf[0] = ReadID();
transDataBuf[1] = command;
transDataBuf[2] = dataSize;
//将时间数据移动到发送缓冲区
for(i=0;i<7;i++)
{
transDataBuf[i+3] = recCurrentTimeBuf[i];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -