📄 clqdq730test.c
字号:
/*******************************************************************************
* Application: Ci Li Qi Dong Qi in W79E825
* Edition: Version:1.0
* Company: CUMT
* Author: LH
* Time: June 2008
*******************************************************************************/
#include <W79E82x.h>
// 电流处理数据
unsigned char ADC_Point0,ADC_Point1,ADC_Point2,ADC_Point3; //
float ADC_SUM1,ADC_SUM2,ADC_SUM3,ADC_SUM4;
unsigned char shc_flag=0; //短路标志计数
unsigned char ADC_RD;
unsigned char ADC_CH;
unsigned char ld_count=0;
long BPD1,BPD2,BPD3; //
unsigned int BPD4;
unsigned int AD0_Buffer[8]; //AD0存储数组
unsigned int AD1_Buffer[8]; //AD1存储数组
unsigned int AD2_Buffer[8]; //AD2存储数组
unsigned int AD3_Buffer[8]; //AD3存储数组
sbit P0_0=P0^0; //控制灯D29
sbit P0_1=P0^1; //控制灯D32
sbit P0_7=P0^7; //控制灯D33
sbit P1_6=P1^6; //控制灯D31
sbit P1_7=P1^7; //控制灯D30
sbit P1_4=P1^4; //控制继电器
void initial(void)
{
TMOD=0x01; //定时器工作在模式1
TH0=0xfd; //四通道每周波采8点,采样间隔2.5/4=0.625ms
TL0=0x8f;
P0M1=0x78; //控制灯的I/O口要设置成推挽输出,AD的I/O口要设置成高阻输入
P0M2=0x83;
P1M1=0x00;
P1M2=0xd0;
P0=0;
P1=0;
CMP1=0; //比较器控制给0,禁止比较器
CMP2=0;
EA=1;
ET0=1;
EADC=0;
AUXR1|=0x04; // 打开ADC电路
ADC_RD=0x55;
ADC_Point0=0;
ADC_Point1=0;
ADC_Point2=0;
ADC_Point3=0;
ADC_CH=0;
ADCCON=0;
ADC_SUM1=0; //用来判断的A判断值
BPD1=0; //用来判断的B判断值
BPD2=0;
BPD3=0;
BPD4=0;
shc_flag=0;
P0_7=1; //控制灯D33 正常状态D33亮
}
//***********************************************
// ADC中断服务程序
// void ADC_ISR() interrupt 11
// {
// ADC_RD=0xAA;
// ADCCON&=0xe7;
// ADC_H=ADCH;
// ADC_L=ADCCON&0xc0;
// ADC_L=ADC_L<<2;
//
// //P0=0xff;
//
// AD0_buffer[0]=ADC_H*4+ADC_L;
// }
//
//************************************
//定时器0中断服务程序
void T0M1_ISR(void) interrupt 1
{
unsigned char i;
unsigned char ADF;
unsigned char ADC_H,ADC_L;
ADF=0;
ADCCON&=0xef;
ADCCON|=0x08;
do
{
ADF=ADCCON&0x10;
}while(ADF!=0x10);
ADCCON&=0xe7;
ADC_H=ADCH;
ADC_L=ADCCON&0xc0;
ADC_L=ADC_L<<2;
switch(ADC_CH)
{
case 1:
{
AD0_Buffer[ADC_Point0]=ADC_H*4+ADC_L;
for(i=0;i<8;i++)
ADC_SUM1+=AD0_Buffer[i];
ADC_Point0++;
if(ADC_Point0==7)
ADC_Point0=0;
ADC_SUM1/=8; //采样八个值求平均值
ADC_SUM1/=82; //通道1入口电压为0.4V时,判断系数APD为1
} break;
case 2:
{
AD1_Buffer[ADC_Point1]=ADC_H*4+ADC_L;
for(i=0;i<8;i++)
ADC_SUM2+=AD1_Buffer[i];
ADC_Point1++;
if(ADC_Point1==7)
ADC_Point1=0;
ADC_SUM2/=8; //采样八个值求平均值
ADC_SUM2/=82; //通道1入口电压为0.4V时,判断系数APD为1
} break;
case 3:
{
AD2_Buffer[ADC_Point2]=ADC_H*4+ADC_L;
for(i=0;i<8;i++)
ADC_SUM3+=AD2_Buffer[i];
ADC_Point2++;
if(ADC_Point2==7)
ADC_Point2=0;
ADC_SUM3/=8; //采样八个值求平均值
ADC_SUM3/=82; //通道1入口电压为0.4V时,判断系数APD为1
} break;
case 4:
{
AD3_Buffer[ADC_Point3]=ADC_H*4+ADC_L;
for(i=0;i<8;i++)
ADC_SUM4+=AD3_Buffer[i];
ADC_Point3++;
if(ADC_Point3==7)
ADC_Point3=0;
ADC_SUM4/=8; //采样八个值求平均值
ADC_SUM4/=82; //通道1入口电压为0.4V时,判断系数APD为1
} break;
default:
break;
}
ADC_RD=0xaa;
TH0=0xfd; //重装定时器0
TL0=0x8f;
}
//=========================================
//断相判断子程序
unsigned char duanxiang(void)
{
//断相判断
float ADC_MAX=0;
float ADC_MIN=0;
if(ADC_SUM1>ADC_SUM2)
{
ADC_MAX=ADC_SUM1;
ADC_MIN=ADC_SUM2;
}
else
{
ADC_MIN=ADC_SUM1;
ADC_MAX=ADC_SUM2;
}
if(ADC_MAX>ADC_SUM3)
{
if(ADC_MIN>ADC_SUM3)
ADC_MIN=ADC_SUM3;
}
else
{
ADC_MAX=ADC_SUM3;
}
if(ADC_MIN/ADC_MAX<=0.6)
{
BPD4+=2;
}
if(ADC_MIN/ADC_MAX>=0.9)
{
BPD4-=2;
}
if(BPD4>0xfffff) //设置上限
BPD4=0xfffff;
if(BPD4<0) //设置下限
{BPD4=0;}
if(BPD4>0xfff)
{
P1_7=1; //断相显示 灯D33
P1_4=1; // 跳继电器
P0_7=0; //正常灯D33灭
return 1;
}
else
{
P1_7=0;
P1_4=0;
P0_7=1;
return 0;
}
}
//=============================================================
void ch1_gl(void)
{
if (ADC_SUM1>=8)
{
shc_flag++;
if(shc_flag>96) //连续检测到12周波短路过流再跳
{
shc_flag=0;
P0_1=1; //短路灯D32亮
P1_4=1; // 跳继电器
P0_7=0; //正常灯D33灭
EA=0;
while(1);
}
}
else if(ADC_SUM1>=6)
{BPD1+=75;} //D31 P0_1=0;
else if(ADC_SUM1>=5)
{BPD1+=60;}
else if(ADC_SUM1>=4)
{ BPD1+=30;}
else if(ADC_SUM1>=3)
{ BPD1+=20;}
else if(ADC_SUM1>=2)
{ BPD1+=12;}
else if(ADC_SUM1>=1.5)
{ BPD1+=6;
} //D30 P1_7=1;
else if(ADC_SUM1>=1.2)
{ BPD1+=1;
}//D32 P0_1=1;P1_6=0;
else if(ADC_SUM1<=0.9)
{
if(ADC_SUM1<=0.6)
{
if(ADC_SUM1<=0.4)
{
if(ADC_SUM1<=0.2)
{ BPD1-=6; }
else {BPD1-=4;}
}
else {BPD1-=3;}
}
else { BPD1-=1;}
}
else {;}
if(BPD1>0xfffff) //设置上限
BPD1=0xfffff;
if(BPD1<0) //设置下限
{
BPD1=0;
}
}
void ch2_gl(void)
{
//2通道过流判断=------------------------------------------------------------------
if (ADC_SUM2>=8)
{
shc_flag++;
if(shc_flag>96) //连续检测到12周波短路过流再跳
{
shc_flag=0;
P0_1=1; //短路灯D32亮
P1_4=1; // 跳继电器
P0_7=0; //正常灯D33灭
EA=0;
while(1);
}
}
else if(ADC_SUM2>=6)
{BPD2+=75;} //D31 P0_1=0;
else if(ADC_SUM2>=5)
{BPD2+=60;}
else if(ADC_SUM2>=4)
{ BPD2+=30;}
else if(ADC_SUM2>=3)
{ BPD2+=20;}
else if(ADC_SUM2>=2)
{ BPD2+=12;}
else if(ADC_SUM2>=1.5)
{ BPD2+=6;
}
else if(ADC_SUM2>=1.2)
{ BPD2+=1;
}
else if(ADC_SUM2<=0.9)
{
if(ADC_SUM2<=0.6)
{
if(ADC_SUM2<=0.4)
{
if(ADC_SUM2<=0.2)
{ BPD2-=6; }
else {BPD2-=4;}
}
else {BPD2-=3;}
}
else { BPD2-=1;}
}
else {;}
if(BPD2>0xfffff) //设置上限
BPD2=0xfffff;
if(BPD2<0) //设置下限
{
BPD2=0;
}
}
void ch3_gl(void)
{
//3通道过流判断-------------------------------------------------------------------
if (ADC_SUM3>=8)
{
shc_flag++;
if(shc_flag>96) //连续检测到12周波短路过流再跳
{
shc_flag=0;
P0_1=1; //短路灯D32亮
P1_4=1; // 跳继电器
P0_7=0; //正常灯D33灭
EA=0;
while(1);
}
}
else if(ADC_SUM3>=6)
{BPD3+=75;} //D31 P0_1=0;
else if(ADC_SUM3>=5)
{BPD3+=60;}
else if(ADC_SUM3>=4)
{ BPD3+=30;}
else if(ADC_SUM3>=3)
{ BPD3+=20;}
else if(ADC_SUM3>=2)
{ BPD3+=12;}
else if(ADC_SUM3>=1.5)
{ BPD3+=6;
}
else if(ADC_SUM3>=1.2)
{ BPD3+=1;
}
else if(ADC_SUM3<=0.9)
{
if(ADC_SUM3<=0.6)
{
if(ADC_SUM3<=0.4)
{
if(ADC_SUM3<=0.2)
{ BPD3-=6; }
else {BPD3-=4;}
}
else {BPD3-=3;}
}
else { BPD3-=1;}
}
else {;}
if(BPD3>0xfffff) //设置上限
BPD3=0xfffff;
if(BPD3<0) //设置下限
{
BPD3=0;
}
}
//-----------------------------------------------------
//主程序
void main (void)
{
unsigned char dx=0;
unsigned char lb=0;
unsigned char gl=0;
initial();
TR0=1;
while(1)
{
//1通道采样过流判断----------------------------------------------------------------------
ADC_CH=1; //设定一通道采样
ADCCON=0;
while(ADC_RD==0x55);
ADC_RD=0x55;
if(dx==0)
{
ch1_gl();
}
//2通道采样过流判断----------------------------------------------------------------------
ADC_CH=2; //设定二通道采样
ADCCON=1;
while(ADC_RD==0x55);
ADC_RD=0x55;
if(dx==0)
{
ch2_gl();
}
//3通道采样过流判断----------------------------------------------------------------------------
ADC_CH=3; //设定三通道采样
ADCCON=2;
while(ADC_RD==0x55);
ADC_RD=0x55;
if(dx==0)
{
ch3_gl();
}
//4通道采样及漏电闭锁判断----------------------------------------------------------------------
do
{
ADC_CH=4; //设定四通道采样
ADCCON=3;
while(ADC_RD==0x55);
ADC_RD=0x55;
if(gl==0&&dx==0)
{
if(ADC_SUM4>=1) // 漏电闭锁判断
{
ld_count++; //漏电闭锁计数
P1_7=0;
}
else {
ld_count=0;
}
if(ld_count>0xf0)
{
ld_count=0xf0;
}
if(ld_count>=50) //连续判断50次即为漏电
{
P1_6=1; //漏电闭锁灯D31亮
P1_4=1; //跳继电器
P0_7=0; //正常灯D33灭
lb=1;
}
else
{
P1_6=0;//漏电闭锁灯D31灭
P0_7=1; //正常灯D33亮
P1_4=0;
lb=0;
}
}
} while(lb);
//过流判断++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(dx==0)
{
if(BPD1>=0x18000||BPD2>=0x18000||BPD3>=0x18000) //判断过流
{
P0_0=1; // 过流D29亮
P0_7=0; //正常灯D33灭
P1_4=1; //控制继电器
gl=1;
}
if(BPD1<0x18000&&BPD2<0x18000&&BPD3<0x18000)
{
P0_0=0; //不过流D29灭
P0_7=1; //正常灯D33亮
P1_4=0;
gl=0;
}
if(gl==1)
continue;
}
//---------------------------------//判断断相
if((ADC_SUM1<1.2&&ADC_SUM1>0.9)||(ADC_SUM2<1.2&&ADC_SUM2>0.9)||(ADC_SUM3<1.2&&ADC_SUM3>0.9))
{
dx=duanxiang();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -