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

📄 phase.c

📁 三相电源缺相及相序检测程序
💻 C
字号:
//#include <REG764.H>
#include <REG922.H> 
//定时器0用作定时器
#define timer0_mode_13bit           TMOD=TMOD&0xf0;TMOD=TMOD|0x00
#define timer0_mode_16bit           TMOD=TMOD&0xf0;TMOD=TMOD|0x01
#define timer0_mode_autoreload      TMOD=TMOD&0xf0;TMOD=TMOD|0x02
#define timer0_mode_counter         TMOD=TMOD|0x04;TL0=0;TH0=0
#define timer0_interrupt_disable    ET0=0
#define timer0_interrupt_enable     ET0=1
#define timer0_run                  TR0=1
#define timer0_stop                 TR0=0
#define timer0_priority_high        PT0=1
#define timer0_priority_low         PT0=0
//定时器1用作定时器
#define timer1_mode_13bit           TMOD=TMOD&0x0f;TMOD=TMOD|0x00
#define timer1_mode_16bit           TMOD=TMOD&0x0f;TMOD=TMOD|0x10
#define timer1_mode_autoreload      TMOD=TMOD&0x0f;TMOD=TMOD|0x20
#define timer1_mode_counter         TMOD=TMOD|0x40;TL0=0;TH0=0
#define timer1_run                  TR1=1
#define timer1_stop                 TR1=0
#define timer1_interrupt_disable    ET1=0
#define timer1_interrupt_enable     ET1=1
#define timer1_priority_high        PT1=1
#define timer1_priority_low         PT1=0
//#define timer1_5ms              TH1=0xb8;TL1=0x00   //5ms
#define timer1_2ms              TH1=0xe3;TL1=0x3c   //2ms
sbit OUTA	=	P0^0;
sbit OUTB	=	P0^1;
sbit OUTC	=	P0^2;
sbit LED6	=	P3^0;		//缺相
sbit LED5	=	P1^3;		//停电
sbit LED4	=	P1^2;		//正常
sbit OUTQX	=	P0^3;		//缺相输出
sbit OUTTD	=	P0^6;		//停电输出
sbit OUTN=	P0^7;		
sbit PN_IN=P1^4;
sbit PA_IN=P1^7;
sbit PB_IN=P1^6;
sbit PC_IN=P3^1;
char aaa;
unsigned char value_A,value_B,value_C,value_N;
bit RTC,sign_QX,sign_TD,PA,PB,PC,PN;
unsigned int bbb,delaytime;
void IO_Init (void)
{
	P0M1	=	0X00;
	P0M2	=	0X00;
	P1M1	=	0X00;
	P1M2	=	0X00;
	P3M1	=	0X00;	
	P3M2	=	0X00;
}
//======================================================================================
	//清狗
//======================================================================================

void ClearWatchDog(void)//清看门狗
{
	EA=0;
	WFEED1=0XA5;
	WFEED2=0X5A;
	EA=1;
//	WDRST	=	0X1E;
//	WDRST	=	0XE1;
}


//=======================================================================================

void InitWatchDog(void)//初始化看门狗
{
	EA=0;
//	WDCON&=0X9D;
//	WDCON|=0X85;
	WDL=0XFF;
	WDCON = 0xc5;
	WFEED1 = 0xa5;
	WFEED2 = 0x5a;
	EA=1;
}


void timer1_init(void)
{
	timer1_stop;
	timer1_mode_16bit;
	timer1_priority_low;
	timer1_interrupt_enable;
	timer1_2ms;
	timer1_run;	
}
void timer0_init(void)
{
	timer0_stop;
	timer0_mode_16bit;
	timer0_priority_low;
	timer0_interrupt_disable;
}
void data_init(void)
{
	OUTA=0;
	OUTB=0;
	OUTC=0;
	OUTQX=0;
	OUTTD=0;
	OUTN=0;
	value_A=0;
	value_B=0;
	value_C=0;
	LED6=1;
	LED5=1;
	LED4=1;
	aaa=0;
	bbb=0;
	delaytime=0;
	PA=0;
	PB=0;
	PC=0;
	RTC=0;
	sign_QX=0;
	sign_TD=0;
}
void main (void)
{
	TRIM&=0XBF;										//
	EA=0;											//关断总中断
	InitWatchDog();									//看门狗初始化
	IO_Init ();										//IO口状态设置
	data_init();									//IO口初始化数据设置
	timer0_init();									//定时器0初始化
	timer1_init();									//定时器1初始化
	EA=1;											//开总中断
	while(1)
	{
		if(PA&&PB&&PC)		  						//A,B,C全正常
		{
		 	LED4	=	1;							//变压器输出指示灯,1=灭为正常
			LED6	=	1;							//停电指示灯,1=灭为不停电
			OUTA	=	1;							//A,B,C输出正常
			OUTB	=	1;
			OUTC	=	1;
			OUTTD	=	0;							//有电
			if(PN)									//正常上电
		 	{
			 	
				LED5	=	1;						//缺相指示灯,1=灭为不缺相
				OUTN	=	1;
			   	OUTQX   =	0;						//未缺相
				sign_QX =	0;						//缺相信号
				sign_TD =	0;						//断电信号
			}
			else									//缺N相
			{
			 	LED5	=	0;					    //缺相亮
				OUTN	=	0;						//缺N相
				OUTQX   =	1;						//未缺相
			}
		}
		else
		{
		 	if((~PA)&&(~PB)&&(~PC))	 				//停电(缺CN、ABN、ACN、BCN,ABC或是停电)
			{
			    LED4=0;							    //变压器输出指示灯,0=亮为不正常
				LED5=1;								//缺相指示灯,1=灭为不缺相
				LED6=0;								//停电指示灯,0=亮为停电
			}
			else
			{
			 	if(bbb>=100)						//定时判断是否缺相  100*2ms=200ms
				{
				 bbb=0;								
				 RTC=0;								//
				 sign_QX=1;							//有缺相信号
				}
				if(sign_QX)							//若是有缺相信号
				{
				 	if(~sign_TD)
					{
					 delaytime=0;
					 LED5=0;						//缺相
					 LED6=1;						//未停电
					 	if(PN)						//PN正常
					 	{
					  		if((~PA)&&PB)
					  		{
							 //缺A
					 		}
							else if((~PB)&&PA)
							{
							 //缺B
							}
							else
							{
							 //缺A,B
							}
							LED4=1;					//变压器输出指示灯,1=灭为不正常
					 	}
						else					    //PN不正常
						{
						 	if(PA&&PB) 				//A,B都为正常,即为缺C
							{
							 //缺 C
							}
							else if((~PA)&&(~PB))	//A,B都不正常	
							{
							 //缺 CN
							}
							LED4=0;					//变压器输出指示灯,0=亮为正常
						}
					}
					else							//缺相信号出现后就出现停电信号
					{
					 	LED4=0;						//变压器输出指示灯,1=灭为不正常
						LED5=0;						//缺相
						if(delaytime<500)			//2MS*500=1S
						{ 	
							LED6=1;					//未停电
						}
						else
						{
						 	LED6=0;					//停电
							sign_QX=0;				//缺相信号为0,即只为停电
						}		
					}
				}
			}
			
		}	
	}
}

static void timer1_isr (void) interrupt 3
{
//	EA=0;
    timer1_2ms;					   //2ms
	aaa++;						   //20*2=40ms
	if(PA_IN==0) value_A++;		   //gai wei 0
	if(PB_IN==0) value_B++;		   //gai wei 0
	if(PC_IN==0) value_C++;		   //gai wei 0
	if(PN_IN==0) value_N++;
	if(aaa>=20)					   //大于40MS
	{
		aaa=0;
		if(value_A>=2) PA=1;	   //A相正常
		else PA=0;
		if(value_B>=2) PB=1;	   //B相正常
		else PB=0;
		if(value_C>=2) PC=1;	   //C相正常
		else PC=0;
		if(value_N>=15) PN=1;	   //N相正常
		else if(value_N<5)PN=0;
		value_A=0;				   //重计时
		value_B=0;
		value_C=0;
		value_N=0;
		ClearWatchDog();		   //清狗
	}
	if((~PA)||(~PB)||(~PC))		   //若A,B,C中有缺相  RTC=1
		RTC=1;
	if(RTC)						   //若RCT=1,BBB增加一
		bbb++;
	if(sign_QX)					   //若是缺相信号,延长时间
		delaytime++;
//	EA=1;
}

⌨️ 快捷键说明

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