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

📄 leakage.c

📁 基于 PLC935单片机的三相漏电检测系统
💻 C
📖 第 1 页 / 共 2 页
字号:
			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];
	}

    //将电压数据移动到页缓冲区
	for(i=0;i<3;i++)
	{
		transDataBuf[i+10] = lineVolt[i];
	}

    //将电流数据移动到页缓冲区
	for(i=0;i<3;i++)
	{
		transDataBuf[i+13] = lineCurrent[i];
	}

    //将漏电信息移动到页缓冲区
	for(i=0;i<3;i++)
	{
		transDataBuf[i+16] = leakageCurrentMsg[i];
	}
}


//---------------------------------------------------------------------------
//函数名称:void PageTransBuf(uchar command)
//功能描述:将待发送数据放入发送缓冲区
//输入:    command-- 上位机的命令字
//输出:无
//---------------------------------------------------------------------------

void PageTransBuf(uchar command)
{
    //将本机地址、命令、数据字节数放入发送缓冲区
	transDataBuf[0] = ReadID();
	transDataBuf[1] = command;
	transDataBuf[2] = EEPROM_PAGE_SIZE;

	if(command == COM_RD_ALL_DATA)
	{

		EEPROMRdAddr = EEPROM_ORG_ADDR;

		while(IRcvStr(0xA0, EEPROMRdAddr, transDataBuf+3, EEPROM_PAGE_SIZE))	  //0xA0:AT24C512固有地址
		   EEPROMRdAddr += 128;
	}
	else
	{
		EEPROMRdAddr = EEPROMWrAddr - EEPROM_PAGE_SIZE * recRdBatDataSize[1] * recRdBatDataSize[0];

		while(IRcvStr(0xA0, EEPROMRdAddr, transDataBuf+3, EEPROM_PAGE_SIZE))
		   EEPROMRdAddr += 128;
	}
}


//---------------------------------------------------------------------------
//函数名称:void ChkLeakageCurrentLine(void)
//功能描述:检测漏电线路
//输入:无
//输出:无
//---------------------------------------------------------------------------
//void ChkLeakageCurrentLine(void)
//{

//}


//---------------------------------------------------------------------------
//函数名称:rut
//功能描述:外部中断1
//输入:无
//输出:无
//---------------------------------------------------------------------------
void rut(void) interrupt 2
{
	lightControl = FALSE ; 

    TH1 = Time_1s_H	;
	TL1 = Time_1s_L	;

	TR1 = 1;

	ET1 = 1;	
}

//---------------------------------------------------------------------------
//函数名称:Timer1_Int
//功能描述:定时1的中断程序
//输入:无
//输出:无
//---------------------------------------------------------------------------
void Timer1_Int(void) interrupt 3
{
    static uchar second_c = 100;

	TR1 = 0 ;

    second_c--;
	if(!second_c)
	{
       lightControl = TRUE ;
	 
	   TR1 = 0 ;
	 }
     else  
	   TR1 = 1;
}

//---------------------------------------------------------------------------
//函数名称:Timer0_Int
//功能描述:定时10 ms  的中断程序
//输入:无
//输出:无
//---------------------------------------------------------------------------
void Timer0_Int(void) interrupt 1
{
	static uchar second_cnt = 100;

	TR0 = 0;

	TH0 = TIME_10ms_H;
	TL0 = TIME_10ms_L;

	second_cnt --;
	if(second_cnt == 50)
	   workIndication = !workIndication;		//500ms 翻转一次

	//时间已达1  秒
	if(!second_cnt)
	{
	   sampleTimeFlag = TRUE;
	   second_cnt = 100;
	}
	TR0 = 1;
}


//---------------------------------------------------------------------------
//函数名称:Serial_Int()
//功能描述:串行口中断程序
//输入:无
//输出:无
//---------------------------------------------------------------------------
void Serial_Int(void) interrupt 4 
{
	uchar recBuf;
    static uchar scnt;

	EA = 0;
    scnt++;														//关闭中断
	if(_testbit_(TI))                                           //JBC指令  是发送中断
	{
		if(transDataPtr < transDataBuf[2] + 3)					//是否已经发送完毕
		{
			SBUF = transDataBuf[transDataPtr];					//发送数据 对SBUF覆值,即为发送数据
			transCheckSum +=  transDataBuf[transDataPtr];
			transDataPtr++;

			if(transDataPtr == transDataBuf[2]+2)               //发送校验字  发送结束
				SBUF = transCheckSum;
		 }
	}

 	if(_testbit_(RI))                                           //是接收中断
 	{
 		recBuf = SBUF;

		switch(recStatus)
		{
			case INIT_STAT:
				if(recBuf == SYNC)								//是同步信号
				{
					recStatus = ADDR_STAT;
					recChkSum = SYNC;						    //初始化校验和
				}
				break;

	        case ADDR_STAT:
	    		if(recBuf == ReadID())							//是本机地址
	    		{
	    			recChkSum += recBuf;
					recStatus = COMMAND_STAT;
				}
				else
				{
					recStatus = INIT_STAT;
					recChkSum = 0;
				}
				break;

			case COMMAND_STAT:
				recCommandBuf = recBuf;
				recChkSum += recBuf;
				if((recCommandBuf==COM_INIT)||(recCommandBuf==COM_TIME)\
				     ||(recCommandBuf==COM_RD_CUR_DATA)||(recCommandBuf==COM_RD_BATCH_DATA)\
				     ||(recCommandBuf==COM_RD_ALL_DATA))
				{//合法命令
				   recStatus = SIZE_STAT;
				}
				else if(recCommandBuf == TERM_CUR_TX_ERR)		//上位机回应终端接收当前数据错误
					 {
					    curTransErrFlag = TRUE;
					    recStatus = INIT_STAT;
					 }
				else if(recCommandBuf==TERM_BAT_TX_ERR)			//上位机回应终端接收批量数据错误
					 {
					    batTransErrFlag = TRUE;
					    recStatus = INIT_STAT;
					 }
				else if(recCommandBuf==TERM_ALL_TX_ERR)			//上位机回应终端接收所有数据错误
					 {
					    allDataTransErrFlag = TRUE;
					    recStatus = INIT_STAT;
					 }
				else											//其它不确定错误
				{
					recStatus = INIT_STAT;
					recChkSum = 0;
				}
				break;

			case SIZE_STAT:
				recDataSize = recBuf;
				recChkSum += recBuf;

				if(recDataSize > 0)
					recStatus = DATA_STAT;
				else
					recStatus = VERIFY_STAT;
				break;

			case DATA_STAT:
				switch(recCommandBuf)
				{
					case COM_INIT:								//上位机发出 读取预置信息(消防控制类型)  命令
						recChkSum += recBuf;
						recPresetData[recDataCnt] = recBuf;
						recDataCnt++;
						if(recDataCnt == recDataSize)			//数据接收完毕
						{
							recDataCnt = 0;
							recStatus = VERIFY_STAT;
						}
						break;

					case COM_TIME:
						recChkSum += recBuf;
						recCurrentTimeBuf[recDataCnt] = recBuf;
						recDataCnt++;
						if(recDataCnt==recDataSize)				//数据接收完毕
						{
							recDataCnt = 0;
							recStatus = VERIFY_STAT;
						}
						break;

					case COM_RD_CUR_DATA:
						recChkSum += recBuf;
						recStatus = VERIFY_STAT;
				    	break;

					case COM_RD_BATCH_DATA:
						recChkSum += recBuf;
						recRdBatDataSize[recDataCnt] = recBuf;
						recDataCnt++;
						if(recDataCnt==recDataSize)				//数据接收完毕
						{
							recDataCnt = 0;
							recStatus = VERIFY_STAT;
						}
						break;

					case COM_RD_ALL_DATA:
						recChkSum += recBuf;
						recStatus = VERIFY_STAT;
						break;

					}

				break;

			case VERIFY_STAT:
				if(recChkSum==recBuf)					        //校验正确
				{
					recErrorFlag = FALSE;
					switch(recCommandBuf)				        //根据不同命令置相应标志
					{
						case COM_INIT:
							initFlag = TRUE;
							break;

						case COM_TIME:
							timeVerifyFlag = TRUE;
							break;

						case COM_RD_CUR_DATA:
				     		rdCurDataFlag = TRUE;
							break;

						case COM_RD_BATCH_DATA:
							rdBatDataFlag = TRUE;
							break;

						case COM_RD_ALL_DATA:
							rdAllDataFlag = TRUE;
							break;
					}

				 }
				 else
				 {
					recErrorFlag = TRUE;
				  }
				  break;

			default:
				recStatus = INIT_STAT;
				break;
		}

	}
	EA = 1;														//打开中断
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -