📄 phase.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 + -