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

📄 leak.txt

📁 基于 PLC935单片机的三相漏电检测系统
💻 TXT
📖 第 1 页 / 共 3 页
字号:

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

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

//将漏电信息移动到页缓冲区
	for(i=0;i<3;i++)
		{
		transDataBuf[i+12] = 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))
		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)
{

}


//---------------------------------------------------------------------------
//函数名称:Ex1_Int
//功能描述:漏电报警中断程序
//输入:无
//输出:无
//---------------------------------------------------------------------------
void Ex1_Int(void) interrupt 2
{
	EA = 0;

	leakageCurrentMsg[0] = 0x01;      		//有漏电发生,1=漏电,0=没漏电

	ADConvert();

	WriteI2CBufData();

	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;
		}

	EA = 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;
}









/****************************************/
/*            CPU   初始化子程序            */
/****************************************/
void Lpc935Init(void)
{
	AUXR1 = 0x00;
	
//时钟的设置
	TRIM |= 0x3F;
	DIVM = 0x00;		//cclk=Fosc

//端口设置
	P0M1=0xDF;		//P0.5 设置为推挽输出状态,其余为输入状态
	P0M2=0x20;
	P1M1=0xFC;		//P1.0/P1.1 设置为准双向状态,P1.2/P1.3/P1.6 设置为开漏输出,
	P1M2=0x4C;		//其余为输入状态
	P2M1=0xFF;		//P2.0 设置为开漏输出,其余为输入状态
	P2M2=0x01;

//------------------------
//	ADINS=0xF7;		  	//1111 0111, 选择除AD03 外所有channel
	ADMODA=0x01;		//0000 0001, 选择转换工作模式,单次转换模式
	ADMODB=0x20; 		//500Khz < ADC CLK < 3.3Mh,二分频,6M/2 =3M, 001x 0000
	ADCON0=0x00;		//选择转换触发模式,立即启动,不中断,0000 0101
	ADCON1=0x00;
	EADEE=0;			//ADC/EEPROM中断不使能


// RTC 设置
	IEN0 = 0xC0; 				//使能RTC中断,使能EA中断
	EWDRT = 1;					//允许看门狗/时钟中断
	WDCON = 0xE0; 				//关闭看门狗中断
	RTCH = RTC_RELOAD_H;
	RTCL = RTC_RELOAD_L; 		//CCLK=6MHz , 1s 中断1次时,RTC的定时值
	RTCCON = 0x63; 				//开启RTC模块

//------------------------
	PCONA = 0x25;
	
//------------------------
	TMOD = 0x21;			//设定T0为方式1,T1为方式2,定时器状态,由TR0和TR1起停
	TH0 = TIME_10ms_H;		//设定定时时间为10ms
	TL0 = TIME_10ms_L;

//UART 设置	
	//TH1 = 0xf3;
	//TL1 = 0xf3;				//波特率为4800
	//PCON = 0x80;			//波特率倍增
	
	SSTAT = 0x00;			//双缓冲器禁止
	SCON = 0x40;			//串行口方式1
	BRGCON = 0x00;
	BRGR1 = 0x09;		//波特率为2400, 6MHz/2400 = x + 16 --> x = 0x09B4
	BRGR0 = 0xB4;
	BRGCON = 0x03;		//启动波特率发生器
	REN = 1;				//启动接收

 	//IT0 = 0;					//外部中断0为电平触发
    IT1 = 1;		   //外部中断1为下降沿触发
	
	ES = 1;
	EX1 = 1;
    ET0 = 1;				//T0中断使能
	TR0 = 1;
	//TR1 = 1;
	
	EA=1;
}




//uint idata delayCount;
//uchar data recCurrentTimeBuf[7];			//暂存当前时间缓冲器[0]=世纪[1]=年[2]=月[3]=日[4]=时[5]=分[6]=秒

⌨️ 快捷键说明

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