/*
程序功能:实现三相电相序的检测,正向:一路指示
反向:一路指示
缺相:一路指示
软件思路:根据测试波形,其中一路信号为基准,当这路信号发生电平,其余两 路信号的电平正好一高一低,即正序时为高,反序是为低,这样就可以区分出相序!
完成日期:2009年4月29日
*/
#include <head.h>
#include <c8051f020.h>
void SYSCLK_Init (void); //配置时钟,检测到晶振稳定了后再运行。
void cross_config(void); //交叉配置,配置系统用到的相应功能到端口。
void IO_init(void); //端口初始化程序,初始化端口
void Delay_10ms(unsigned int data time_m);
void power_fwd(void);
void power_rev(void);
void power_error(void);
sbit Pulse_1=P2^3;
sbit Pulse_2=P2^4;
sbit JDQ_1=P2^5;
sbit JDQ_2=P2^6;
sbit JDQ_3=P2^7;
void main(void)
{
EA = 0;
WDTCN = 0xde; // 关闭看门狗
WDTCN = 0xad;
SYSCLK_Init();//配置时钟,检测到晶振稳定了后再运行。
cross_config();//交叉配置,配置系统用到的相应功能到端口。
IO_init();//端口初始化程序,初始化端口,方便后面的输入输出。
//feed_WDT;
while(1) //此处做脉冲循环检测
{
while(Pulse_1) //检测高电平,这是起始需要的
{ Delay_10ms(100); //延时,一个脉冲周期为20MS
//说明:time_m=2 :正反相序指示闪烁,频率高!
// time_m=20 :正反相序指示闪烁,频率有所降低!
// time_m=50 :正反相序指示和缺相指示交替闪烁
// time_m=100:能正常判别相序
while(Pulse_1) //若电平还未变化,说明电源有故障
{
power_error(); //电源缺相
break;
}
while(!Pulse_1) //等待低电平,说明有一“下跳延”
{
if(Pulse_2==0) //电源正序
{power_fwd();}
else if(Pulse_2==1) //电源反序
{power_rev();}
}
break;
}
}
}
void power_fwd(void) //电源正序
{
JDQ_1=1;JDQ_2=0;JDQ_3=0;
}
void power_rev(void) //电源反序
{
JDQ_1=0;JDQ_2=0;JDQ_3=1;
}
void power_error(void) //电源缺相
{
JDQ_1=0;JDQ_2=1;JDQ_3=0;
}
void Delay_10ms(unsigned int data time_m) //每一次循环时间10MS(11.0592MHz)
{
char temp;
for(temp=time_m;temp>0;temp--)
{
unsigned int data ii,jj;
for(ii=0;ii<73;ii++)
{
for(jj=0;jj<100;jj++)
{
_nop_();
_nop_();
_nop_();
}
}
}
}
用户1244364 2009-5-19 09:48
tengjingshu_112148725 2009-5-18 18:03