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

📄 leakage.c

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