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

📄 leak.txt

📁 基于 PLC935单片机的三相漏电检测系统
💻 TXT
📖 第 1 页 / 共 3 页
字号:
//--------------------------------------------------------------
//这是个电力线路电压/电流/漏电检测告警系统
//--------------------------------------------------------------
//系统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 + -