📄 gsw-04-13.c
字号:
//2005年4月13日//
//基准电压为3.3V//
//有电报警//
//有自动增益//
//在设置时起动自动增益//
//在高压有电时进入设定阀值设定//
//传感器的放大倍数为50//
//在高压有电下读阀值/0.6/0.7 与现有AD值比较,如AD值在两小时内都小于阀值/0.6/0.7 ,不改阀值。
//在高压有电下读阀值/0.6*1.15与现有AD值比较,如有一相大于等于阀值/0.6*1.1时起动计时,
//如在15分钟内AD值都大于等于阀值/0.6*1.1,更改阀值,另外两相同时更改。
//只要有一次小于阀值/0.6*1.15重新时起动计时。
//在高压有电下读阀值/0.6*0.85与现有AD值比较,如在两小时内都AD值小于等于阀值/0.6*0.85,
//或在15分钟AD值都大于等于阀值/0.6/0.7,更改阀值,另外两相同时更改。
//设定的阀值放在X5043内。
#include<c8051F200.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
//uchar *pgen;
sbit AADC =P1^0; //A相的AD转换
sbit BADC =P1^1; //B相的AD转换
sbit CADC =P1^2; //C相的AD转换
sbit A_test =P1^3; //A相的测试
sbit B_test =P1^4; //B相的测试
sbit C_test =P1^5; //C相的测试
sbit relay_test=P1^6; //继电器测试
sbit wait_sound=P1^7; //等待语音
sbit ALED =P2^0;
sbit BLED =P2^1;
sbit CLED =P2^2;
sbit DLED =P2^3;
sbit JKLED =P2^4;
sbit JK =P2^5;
sbit JZ_test=P2^6; //继电器测试打开
sbit SLED =P2^7;
sbit SW1=P0^2; //自检.
sbit SW2=P0^3; //读AD的比较值
sbit so =P0^4;
sbit csx=P0^5;
sbit sck=P0^6;
sbit si =P0^7;
sbit sound_K1 =P3^0;
/////////////////////////////////////
//返回初始值////// =0x80,
//装置正常线路有电 =0X81,
//装置正常线路无电 =0X82,
//装自检故障 =0X83,
//设置成功 =0X84,
//设置不成功 =0X85,
//请在高压有下设置 =0x86,
//请注意高压有电 =0x87;
//提示自动整定成功 =0X88,
//提示自动整定不成功 =0x89,
////////////////////////////////////////
sbit sound_K2 =P3^1;
sbit DZLED =P3^7; //地址LED
uchar xdata timer300ms;
uchar xdata timer40ms;
uint xdata timer60s;
uint xdata timer1s;
uint xdata timer10s;
uchar xdata A_value, B_value,C_value;
uchar xdata AD_value,BD_value,CD_value;
uchar xdata A_PGA,B_PGA,C_PGA;
uchar xdata data_eep;
uchar bdata sound;
uchar bdata order;
sbit order7=order^7;
sbit order6=order^6;
sbit order5=order^5;
sbit order4=order^4;
sbit order3=order^3;
sbit order2=order^2;
sbit order1=order^1;
sbit order0=order^0;
sbit sound0=sound^0;
unsigned long xdata Atimer1t,Btimer1t,Ctimer1t;
unsigned long const timer1t=90000;//30s
uchar const basic_valve=0x3d; //////基本阀值//////
uchar const bot_valve =0x3e; //////最小阀值//////
uchar const initialize_valve=0x1E;//////初始阀值/////
uchar xdata eep[6];
uchar xdata temp_eep[6];
uint xdata timer5s;
//uint xdata timer3s;
uchar data zja_value,zjb_value,zjc_value;
uchar data value_ad, value_bd ,value_cd;
bit a_led;
bit b_led;
bit c_led;
bit d_led;
bit sw1;
bit sw1_flag1;
bit sw1_flag2;
bit sw1_flag3;
bit sw1_flag4;
bit sw2;
bit s_led;
bit sounds_880;
bit sounds_881;
bit sounds_882;
bit A_flag0;
bit A_flag1;
bit A_flag2;
bit A_flag3;
bit B_flag0;
bit B_flag1;
bit B_flag2;
bit B_flag3;
bit C_flag0;
bit C_flag1;
bit C_flag2;
bit C_flag3;
bit sw12flag;
bit read_write_flag;
bit jz_flag1;
bit jz_test_flag;
void sysclk_init(void);
void sound_80(void);
void delay_10us(void);
void delay(uint data x);
void delay_40ms(void);
void jerque(void);
void ABC_test(void);
void ABC_trans(uchar data x);
void SETUP_AD (uchar data y);
void SETUP(void);
void setup_jerque_key(void);
void automatism_valve(void);
void valve_read_write(void);
void PGA(void);
void ini45(void); /*x25045状态寄存器写入程序*/
void outbyte(uchar data x); /*向x25045写一个字节*/
void inbyte(void); /*从x25045读一个字节*/
void stax(void); /*启动x25045命令*/
void endx(void); /*结束x25045命令*/
void msec(uchar data x);
void write_data(uchar data x,uchar data y);
void get_data(uchar data x);
void write_EEPROM(void);
void get_EEPROM(void);
//主程序
void main (void)
{
sysclk_init();
for(;;)
{
ini45();
get_EEPROM();
ABC_test();
SETUP();
automatism_valve();
jerque();
setup_jerque_key();
}
}
//初始化程序//单片机化子程序
void sysclk_init(void)
{
uint xdata i;
WDTCN=0x07;
OSCXCN=0x67; //使用外部晶振
for(i=0;i<256;i++);
while(!(OSCXCN&0x80))
{
WDTCN=0xA5;
}
OSCICN=0x88 ;
EA=0;
// WDTCN=0XDE; //不使用看门狗定时器
// WDTCN=0XAD; //不使用看门狗定时器
WDTCN=0xA5; // 使用看门狗定时器
PRT0MX=0x00;
PRT0CF=0xE0;
P0MODE=0xFF;
PRT1MX=0x00;
PRT1CF=0x00;
P1MODE=0xF8;
PRT2MX=0x00;
PRT2CF=0x00;
P2MODE=0xFF;
PRT3CF=0x00;
P3MODE=0xFF;
REF0CN=0X03; ///////////基准等于3.3V
// REF0CN=0x00; ///////////基准等于2.5V
TMOD=0x01;
TCON=0x11;
CKCON=0x00;
ADC0CN=0x40;
TH0=0Xd8;
TL0=0Xef;
a_led=0;
b_led=0;
c_led=0;
d_led=0;
s_led=0;
jz_flag1=1;
timer5s=0;
timer60s=0;
ABC_trans(0x00);
ABC_trans(0x01);
ABC_trans(0x02);
get_EEPROM();
if ((eep[0]==0x00)||(eep[1]==0x00)||(eep[2]==0x00)||
(eep[0]==0xff)||(eep[1]==0xff)||(eep[2]==0xff)||
(eep[3]<=0x7f)||(eep[4]<=0x7f)||(eep[5]<=0x7f)||
(eep[3]>=0x88)||(eep[4]>=0x88)||(eep[5]>=0x88))
{
ADC0CF=0x82; //SAR=1M PGAIN=1;
eep[0]=initialize_valve;
eep[1]=initialize_valve;
eep[2]=initialize_valve;
eep[3]=0x82; //A_PGA
eep[4]=0x82; //B_PGA
eep[5]=0x82; //C_PGA
write_EEPROM(); //not run???????????????????????
}
IE=0x82;
IP=0xc2;
}
//内部定时器程序
void timer0(void) interrupt 1
{
IP=0XC2;
TH0=0xd8;
TL0=0xef;//////10mstimer////
if(timer300ms<=0x0a)
{
timer300ms++;
}
else
{
timer300ms=0;
if((a_led==1)||(b_led==1)||(c_led==1)||(d_led==1)||(s_led==1))
{
if(s_led==1)
{
SLED=~SLED;
}
if(d_led==1)
{
DLED=~DLED;
}
if(a_led==1)
{
ALED=~ALED;
}
if(b_led==1)
{
BLED=~BLED;
}
if(c_led==1)
{
CLED=~CLED;
}
}
}
/////////////////////////////////
SW1=1;
if(SW1==0)
{
sw2=0;
if(timer40ms>=10)
{
timer40ms=0;
sw1=1;
}
else
{
timer40ms++;
}
}
else
{
timer40ms=0;
}
if(sw1_flag1==1)
{
if(timer5s>=100)
{
sw1_flag2=1;
if(timer5s>=400)
{
timer5s=0;
sw1_flag3=1;
}
else
{
timer5s++;
}
}
else
{
timer5s++;
}
}
else
{
//sw1_flag1=0;
// sw1_flag2=0;
//sw1_flag3=0;
timer5s=0;
}
////////////////////////////////////
SW2=1;
if(SW2==0)
{
sw1=0;
if(timer60s>=300)
{
timer60s=0;
sw2=1;
}
else
{
timer60s++;
s_led=1;
}
}
else
{
timer60s=0;
s_led=0;
sw2=0;
SLED=1;
}
if(sounds_880==1)
{
if(timer1s<=100)
{
timer1s++;
}
else
{
sounds_881=1;
}
}
else
{
timer1s=0;
}
//a_timer1t
if(A_flag0==1)
{
if(Atimer1t>=timer1t)
{
Atimer1t=0;
A_flag1=1;
}
else
{
Atimer1t++;
}
}
else
{
Atimer1t=0;
A_flag0=0;
A_flag1=0;
}
/////b_timer1t
if(B_flag0==1)
{
if(Btimer1t>=timer1t)
{
Btimer1t=0;
B_flag1=1;
}
else
{
Btimer1t++;
}
}
else
{
Btimer1t=0;
B_flag0=0;
B_flag1=0;
}
//////c_timer1t
if(C_flag0==1)
{
if(Ctimer1t>=timer1t)
{
Ctimer1t=0;
C_flag1=1;
}
else
{
Ctimer1t++;
}
}
else
{
Ctimer1t=0;
C_flag0=0;
C_flag1=0;
}
///////sw1+sw2////////////////////
SW1=1;
SW2=1;
if((SW1==0)&&(SW2==0))
{
sw1=0;
sw2=0;
if(timer10s>=100)
{
timer10s=0;
sw12flag=1;
}
else
{
timer10s++;
}
}
else
{
timer10s=0;
sw12flag=0;
}
}
//10uS延时
void delay_10us(void)
{
uchar xdata i;
for(i=0;i<250;i++)
{
WDTCN=0xA5;
}
}
void delay(uint data x)
{
uint xdata i;
for(i=0;i<x;i++)
{
int j;
j=i; //used as NOP
WDTCN=0xA5;
j=j+1; //used as NOP
}
}
//40mS延时子程序//
void delay_40ms(void)
{
uchar xdata k;
for(k=0;k<10;k++)
{
WDTCN=0xA5;
delay(250);
}
}
//语音程序//
void sound_80(void)
{
uchar xdata i;
wait_sound=1;
if(wait_sound==0)
{
WDTCN=0xA5;
sound_K1=1;
sound_K2=1;
delay_40ms();
sound_K1=0;
sound_K2=1;
delay_40ms();
sound_K1=1;
delay_40ms();
for(i=0;i<8;i++)
{
sound_K2=0;
delay_10us();
sound_K1=sound0;
sound=sound>>1;
sound_K2=1;
delay_10us();
}
}
}
//主程序//
void ABC_test(void)
{
if(jz_flag1==1)
{
ABC_trans(0x00);
ABC_trans(0x01);
ABC_trans(0x02);
get_EEPROM();
A_test=1; B_test=1; C_test=1;
if((A_test==0)||(B_test==0)||(C_test==0)||
(A_value>=eep[0])||(B_value>=eep[1])||(C_value>=eep[2]))
{
JK=1;
JKLED=1;
d_led=1;
if(A_test==0)
{
a_led=1;
}
else
{
a_led=0;
if(A_value>=eep[0])
{
ALED=0;
}
else
{
ALED=1;
}
}
if(B_test==0)
{
b_led=1;
}
else
{
b_led=0;
if(B_value>=eep[1])
{
BLED=0;
}
else
{
BLED=1;
}
}
if(C_test==0)
{
c_led=1;
}
else
{
c_led=0;
if(C_value>=eep[2])
{
CLED=0;
}
else
{
CLED=1;
}
}
}
else
{
JKLED=0;JK=0;
ALED=1;a_led=0;
BLED=1;b_led=0;
CLED=1;c_led=0;
DLED=0;d_led=0;
}
if((A_value>=eep[0])||(B_value>=eep[1])||(C_value>=eep[2]))
{
sounds_880=1;
if(sounds_881==1)
{
sounds_880=0;
sounds_881=0;
if((A_value>=eep[0])||(B_value>=eep[1])||(C_value>=eep[2]))
{
if(sounds_882==1)
{
sounds_882=0;
sound=0x87;
sound_80();
}
}
}
}
else
{
sounds_882=1;
sounds_880=0;
sounds_881=0;
}
}
}
//自检程序//
void jerque(void)
{
jz_flag1=0;
SW1=1;
SW2=1;
if((sw1==1)&&(SW1==1)&&(SW2==1))
{
sw1_flag4=1;
sw1=0;
}
if(sw1_flag4==1)
{
if(JKLED==1)
{
JK=1;
JKLED=1;
}
else
{
JKLED=0;
JK=0;
}
A_test=1;B_test=1;C_test=1;
if((A_test==0)||(B_test==0)||(C_test==0))
{
sw1=0;
sound=0x83;
sound_80();
jz_flag1=1;
sw1_flag1=0;
sw1_flag2=0;
sw1_flag3=0;
sw1_flag4=0;
}
else
{
if(jz_test_flag==1)
{
JZ_test=0;
}
sw1_flag1=1;
a_led=1;
b_led=1;
c_led=1;
d_led=1;
get_EEPROM();
if(sw1_flag2==1)
{
if(jz_test_flag==1)
{
SETUP_AD(0x00);
SETUP_AD(0x01);
SETUP_AD(0x02);
}
value_ad=AD_value;
value_bd=BD_value;
value_cd=CD_value;
JZ_test=1;
jz_test_flag=0;
if((value_ad<=0x0a)||(value_bd<=0x0a)||(value_cd<=0x0a))
{
sw1=0;
sw1_flag1=0;
sw1_flag2=0;
sw1_flag3=0;
sw1_flag4=0;
jz_flag1=1;
sound=0x83;
sound_80();
}
else
{
if(sw1_flag3==1)
{
if(jz_test_flag==0)
{
ABC_trans(0x00);
ABC_trans(0x01);
ABC_trans(0x02);
zja_value=A_value;
zjb_value=B_value;
zjc_value=C_value;
}
jz_flag1=1;
sw1_flag1=0;
sw1_flag2=0;
sw1_flag3=0;
sw1_flag4=0;
sw1=0;
if((zja_value>=eep[0])||(zjb_value>=eep[1])||(zjc_value>=eep[2]))
{
sound=0x81;
sound_80();
}
else
{
sound=0x82;
sound_80();
}
}
}
}
}
}
else
{
sw1_flag1=0;
sw1_flag2=0;
sw1_flag3=0;
sw1_flag4=0;
jz_flag1=1;
JZ_test=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -