📄 current3.c.bak
字号:
#include <current.h>
sbit con_hf=P4^0;
sbit con_water=P4^1;
sbit con_gas1=P4^6;
sbit con_gas2=P4^7;
sbit current_out=P4^4;
sbit current_enable=P4^5;
sbit send_enable=P3^4;
sbit stop=P3^5;
sbit gate=P4^2;
xdata unsigned char sbuffer[7] _at_ 0x7000;
xdata unsigned char rbuffer[55] _at_ 0x7007;
xdata unsigned int *point _at_ 0x703E;
xdata unsigned int adl _at_ 0x7040;
xdata unsigned int adh _at_ 0x7042;
xdata unsigned int ad _at_ 0x7044;
xdata unsigned int numbers _at_ 0x7046;
xdata unsigned int I1 _at_ 0x7048;
xdata unsigned int I2 _at_ 0x704A;
xdata unsigned int ad_v _at_ 0x704C;
xdata unsigned int ad_i _at_ 0x704E;
xdata unsigned long delt _at_ 0x7050;
xdata unsigned long delt1 _at_ 0x7054;
xdata unsigned long c_t0 _at_ 0x7058;
xdata unsigned long AD1 _at_ 0x705C;
xdata unsigned long AD2 _at_ 0x7060;
xdata unsigned long AD3 _at_ 0x7064;
xdata unsigned long AD4 _at_ 0x7068;
xdata unsigned long AD5 _at_ 0x706C;
xdata unsigned long da _at_ 0x7070;
xdata unsigned char c_cm1 _at_ 0x7074;
xdata unsigned char n_pulse _at_ 0x7075;
xdata unsigned char n_base _at_ 0x7076;
xdata unsigned int IM_ahf _at_ 0x7077;
xdata unsigned int IMM_ahf _at_ 0x7079;
xdata unsigned int IB_ahf _at_ 0x707B;
xdata unsigned int IBB_ahf _at_ 0x707D;
xdata unsigned char IML_ahf _at_ 0x707F;
xdata unsigned char IMH_ahf _at_ 0x7080;
xdata unsigned char IMML_ahf _at_ 0x7081;
xdata unsigned char IMMH_ahf _at_ 0x7082;
xdata unsigned char IBL_ahf _at_ 0x7083;
xdata unsigned char IBH_ahf _at_ 0x7084;
xdata unsigned char IBBL_ahf _at_ 0x7085;
xdata unsigned char IBBH_ahf _at_ 0x7086;
xdata unsigned char COMM _at_ 0X7087;
xdata unsigned char SLA _at_ 0X7088;
xdata unsigned char FF _at_ 0X7089;
xdata unsigned char GET _at_ 0X708A;
xdata unsigned char S_ANSW _at_ 0X708B;
xdata unsigned char R_ANSW _at_ 0X708C;
xdata unsigned char POINTER0 _at_ 0X708D;
xdata unsigned char POINTER1 _at_ 0X708E;
xdata unsigned char work _at_ 0X708F;
xdata unsigned char RSUM _at_ 0X7090;
xdata unsigned char SSUM _at_ 0X7091;
xdata unsigned char err _at_ 0x7092;
xdata unsigned char tab2 _at_ 0x7093;
xdata unsigned char tab3 _at_ 0x7094;
xdata unsigned char c_adc _at_ 0x7095;
xdata unsigned char c_t1 _at_ 0x7096;
xdata unsigned char p_sec _at_ 0x7097;
xdata unsigned char s_byte_nums _at_ 0x7098;
xdata unsigned char r_byte_nums _at_ 0x7099;
xdata unsigned char nonce_sec _at_ 0x709A;
xdata unsigned char c_cm2 _at_ 0X709B;
xdata unsigned char avc_ok _at_ 0X709C;
xdata unsigned char delt_state _at_ 0X709D;
xdata unsigned int I11 _at_ 0X709E;
xdata unsigned int I12 _at_ 0X70A0;
xdata unsigned int I21 _at_ 0X70A2;
xdata unsigned int I22 _at_ 0X70A4;
xdata unsigned int delt_ahf _at_ 0X70A6;
xdata unsigned long t _at_ 0X70A8;
xdata unsigned long c_ahf_p _at_ 0X70AC;
xdata unsigned long c_ahf_b _at_ 0X70B0;
xdata unsigned int IM _at_ 0x70B4;
xdata unsigned int IB _at_ 0x70B6;
xdata unsigned char IML _at_ 0x70B8;
xdata unsigned char IMH _at_ 0x70B9;
xdata unsigned char IBL _at_ 0x70BA;
xdata unsigned char IBH _at_ 0x70BB;
xdata unsigned long out1 _at_ 0x70BC;
xdata unsigned long out2 _at_ 0x70C0;
xdata float temp_delt _at_ 0X70C4;
bit receive_p_out,receive_p_in,demand,in_sector,YOUHU,ad_finish,
pre_melt_ok,igniting,new_sec,close_gas1,close_gas2,i_v,decrease,overtime,
start,urgent_stop,edge,resend,send,called,open_gas1,open_gas2,close_gas1_ok,
close_gas2_ok,close_gas_ok,ans,i_slope_ok,need_para,to_begin,ignit_ok,
current_add,current_dec,kk,err_ok,current_err,ahf_ok,ahf_p_b;
void delay(unsigned int num)
{
data unsigned int i,ii;
for(i=0;i<num;i++)
{
for(ii=0;ii<255;ii++);
}
}
void start_i2()
{
data unsigned int time;
P1_6=1; //SCL
P1_7=1; //SDA
S1CON=0x47; //ENS1=1 STA=0 STO=0 SI=0 AA=1
PS1=1;FF=0;
EA=1;
ES1=1;
STA=1;
time=0;
do
{
time++;
if(time>10000)
{
FF=1;
}
}while(FF==0);
FF=0;
ES1=0;
}
void start_i2a()
{
P1_6=1; //SCL
P1_7=1; //SDA
S1CON=0x47; //ENS1=1 STA=0 STO=0 SI=0 AA=1
PS1=1;
EA=1;
ES1=1;
STA=1;
}
void ini_sbuf(unsigned char a,b,c,d,e,f,g)
{
sbuffer[0]=a;
sbuffer[1]=b;
sbuffer[2]=c;
sbuffer[3]=d;
sbuffer[4]=e;
sbuffer[5]=f;
sbuffer[6]=g;
}
unsigned char get_byte_nums(unsigned char type)
{
unsigned char numbers;
switch(type)
{
case infor_sec:
case command:
case program:
case answer: numbers=4;
break;
case err_infor:
case parameter1: numbers=5;
break;
case parameter:
case infor: numbers=6;
break;
case parameter2: numbers=7;
break;
case call_result: numbers=8;
break;
case p_out_sec: numbers=55;
break;
case p_in_sec: numbers=24;
break;
case edit_sec: numbers=64;
break;
default: break;
}
return numbers;
}
void TR_noans()
{
REN=0;
POINTER0=0;
SSUM=0;
send=1;
send_enable=0;
c_t1=0;
TR1=1;
while(POINTER0<s_byte_nums);
TR1=0;
send_enable=1;
REN=1;
}
void TR_ans()
{
ans=1;
REN=0;
POINTER1=0;
RSUM=0;
// TB8=1;
POINTER0=0;
SSUM=0;
send=1;
send_enable=0;
c_t1=0;
TR1=1;
while(POINTER0<s_byte_nums);
TR1=0;
send_enable=1;
if(overtime==1)
overtime=0;
REN=1;
send=0;
c_t1=0;
TR1=1;
while(POINTER1<r_byte_nums&&overtime==0);
TR1=0;
POINTER1=0;
RSUM=0;
if(overtime==1)
{
err=2;
overtime=0;
}
ans=0;
}
void com_type()
{
switch(rbuffer[2])
{
case com_calling: called=1;break;
case com_start: start=1;break;
case com_decrease: decrease=1;break; //衰减
// case com_decrease_ok: kk=0;break;
case com_current_add: current_add=1;break; //电流加
case com_current_dec: current_dec=1;break; //电流减
case com_demand: demand=1;break;
case com_open_gas1: open_gas1=1;break;
case com_open_gas2: open_gas2=1;break;
case com_close_gas1: close_gas1=1;break;
case com_close_gas2: close_gas2=1;break;
case com_ignit: igniting=1;break;
case com_ignit_ok: ignit_ok=1;break;
case com_i_slope_ok: i_slope_ok=1;break;
case com_pre_melt_ok: pre_melt_ok=1;break;
case com_need_para: need_para=1;break;
case com_goto_begin: to_begin=1;break;
case com_err_ok: err_ok=1;break;
default: break;
}
}
void data_type() //对接收到的数据分辨类型
{
switch(rbuffer[1])
{
case command: com_type();break;
case answer: R_ANSW=rbuffer[1];break;
case infor: {
switch(rbuffer[2])
{
case com_sector: {
nonce_sec=rbuffer[3];
in_sector=1;
new_sec=1;
}break;
case com_weld_simu: YOUHU=rbuffer[3];break;
case com_delt_switch: delt_state=rbuffer[3];break;
default: break;
}
}break;
case p_out_sec: receive_p_out=1;break;
case p_in_sec: {
nonce_sec=rbuffer[2];
receive_p_in=1;
}break;
default: break;
}
}
void answer_judge()
{
unsigned char c_err;
c_err=0;
resend: if(R_ANSW!=OK)
{
c_err++;
if(c_err<3)
{
TR_ans();
goto resend;
}
else
{
err=2;
// err_operate();
}
}
else
R_ANSW=0;
}
void start_t2()
{
TM2CON=0x8D; //16位溢出,分频系数8,f/12
EA=1;
TM2IR=0;
}
void EX0_INT (void) interrupt 0 //急停
{
EX0=0;
send_enable=1;
if(YOUHU)
{
current_enable=0; //关电源使能
con_hf=1; //关高频使能
}
while(err_ok==0)
{
if(called==1)
{
if(current_err==0)
{
ini_sbuf(M_main,answer,OK,0,0,0,0);
s_byte_nums=4;
TR_noans();
}
else
{
ini_sbuf(M_main,err_infor,M_current,err,0,0,0);
s_byte_nums=5;
TR_noans();
current_err=0;
err=0;
stop=1;
}
called=0;
}
}
urgent_stop=1;
}
void T0_INT (void) interrupt 1
{
c_t0++;
/*
if(ahf_ok==1)
{
if(c_t0==c_ahf_p||c_t0==c_ahf_b)
{
if(current_out==1)
{
if(ahf_p_b==1&&c_t0==c_ahf_p)
{
// TR0=0;
ahf_p_b=0;
IM8=IMML;
IM4=IMMH;
UPD=0X00;
TR0=1;
}
else if(ahf_p_b==0&&c_t0==c_ahf_b)
{
// TR0=0;
ahf_p_b=1;
IM8=IML;
IM4=IMH;
UPD=0X00;
TR0=1;
}
}
else if(current_out==0)
{
if(ahf_p_b==1&&c_t0==c_ahf_p)
{
// TR0=0;
ahf_p_b=0;
IB8=IBBL;
IB4=IBBH;
UPD=0X00;
TR0=1;
}
else if(ahf_p_b==0&&c_t0==c_ahf_b)
{
// TR0=0;
ahf_p_b=1;
IB8=IBL;
IB4=IBH;
UPD=0X00;
TR0=1;
}
}
c_t0=0;
}
}
*/
}
void EX1_INT(void) interrupt 2 //错误检测
{
unsigned char get_err;
EX1=0;
get_err=P5;
get_err=get_err&0x08;
if(get_err==0)
err=4;
else
{
get_err=P5;
get_err=get_err&0x10;
if(get_err==0)
err=5;
else
{
get_err=P5;
get_err=get_err&0x20;
if(get_err==0)
err=6;
else
{
get_err=P5;
get_err=get_err&0x30;
if(get_err==0)
err=8;
else
{
get_err=P5;
get_err=get_err&0x40;
if(get_err==0)
err=7;
}
}
}
}
if(err!=0)
{
current_err=1;
stop=0;
}
else
EX1=1;
}
void T1_INT (void) interrupt 3
{
c_t1++;
if(send==1)
{
if(c_t1==7)
{
S0BUF=sbuffer[POINTER0];
c_t1=0;
}
}
else
{
if(c_t1==100)
{
TR1=0;
overtime=1;
}
}
}
void TR_INT (void) interrupt 4 //串行口中断
{
EA=0; //关中断
if(TI==1) //发送完成
{
TI=0;
POINTER0++; //发送缓冲指针加1
if(POINTER0<s_byte_nums-1)
SSUM=SSUM+sbuffer[POINTER0]; //6个数据字节求和
else
sbuffer[s_byte_nums-1]=SSUM+sbuffer[0]; //数据和加地址生成校验码
if(POINTER0==s_byte_nums)
REN=1;
}
if(RI==1) //接收完成
{
RI=0;
POINTER1++; //接收缓冲指针加1
rbuffer[POINTER1-1]=S0BUF; //从接收缓冲读出数据
if(rbuffer[0]==M_current||rbuffer[0]==M_ALL||rbuffer[0]==M_current_RW)
{
SM2=0;
if(POINTER1==2) //获取字节个数
r_byte_nums=get_byte_nums(rbuffer[1]);
if(POINTER1<r_byte_nums)
RSUM=RSUM+rbuffer[POINTER1-1]; //生成校验码
else
{
SM2=1;
if(RSUM==rbuffer[r_byte_nums-1])
{
if(ans==0)
{
POINTER1=0;
RSUM=0;
}
S_ANSW=OK;
data_type();
}
else
{
S_ANSW=FAIL;
if(resend==0)
resend=1;
}
r_byte_nums=4;
}
}
else
POINTER1=0;
}
EA=1; //开中断
}
void S1_int (void) interrupt 5 //I2C
{
ES1=0;
if(S1STA==0x00)
{
FF=1;
S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
}
if(S1STA==0x08)
{
S1DAT=SLA;
S1CON=0xC5; //STA=0 STO=0 SI=0 AA=1
}
if(S1STA==0x10)
{
S1DAT=SLA;
S1CON=0xC5; //STA=0 STO=0 SI=0 AA=1
}
if(S1STA==0x18)
{
S1DAT=COMM;
S1CON=0xC5; //STA=0 STO=0 SI=0 AA=1
}
if(S1STA==0x20)
{
FF=1;
S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
}
if(S1STA==0x28)
{
S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
FF=1;
}
if(S1STA==0x30)
{
FF=1;
S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
}
if(S1STA==0x38)
S1CON=0xE5; //STA=1 STO=0 SI=0 AA=1
if(S1STA==0x40)
S1CON=0xC5; //STA=0 STO=0 SI=0 AA=1
if(S1STA==0x48)
{
FF=1;
S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
}
if(S1STA==0x50)
{
GET=S1DAT;
S1CON=0xC1; //STA=0 STO=0 SI=0 AA=0
}
if(S1STA==0x58)
{
FF=1;
S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
}
ES1=1;
}
void CT0_int (void) interrupt 6 //横摆使能输入
{
CTI0=0;
CTCON=CTCON&0XFC; //禁止上升、下降
if(edge==0)
{
current_out=1; //峰值
IEN1=IEN1&0XDF; //禁止CM1,停峰、基时间
if(ahf_ok==1)
{
IM8=IML_ahf;
IM4=IMH_ahf;
IB8=IMML_ahf;
IB4=IMMH_ahf;
UPD=0X00;
}
else
{
IM8=IML;
IM4=IMH;
IB8=IML;
IB4=IMH;
UPD=0X00;
}
edge=1;
CTCON=CTCON|0X01; //CT0上升沿
}
else
{
edge=0;
current_out=0;
CTCON=CTCON|0X02; //CT0下降沿
CML1=TML2+0XE2; //峰值时间
if(CML1<TML2)
CMH1=(TMH2+1)+0X04;
else
CMH1=TMH2+0X04;
c_cm1=0;
IEN1=IEN1|0X20; //允许CM1,峰、基时间
}
}
void CT2_int (void) interrupt 8 //采样保持脉冲
{
CTI2=0;
if(current_out==1&&ad_finish==1)
{
ad_finish=0; //采样进行标志
if(i_v==0)
ADCON=0x09; //启动电流采样
else
ADCON=0X08; //启动电压采样
}
}
void ADC_int (void) interrupt 10 //AD采样中断
{
ADCON=ADCON&0xEF; //清ADC中断标志
CTCON=CTCON&0XCF;
IEN1=IEN1&0XFB; //禁止CT2
c_adc++;
adh=ADCH;
adl=ADCON&0xC0;
adh=adh<<2;
adl=adl>>6;
ad=adh+adl;
da=ad;
AD5=(da*5000)/0x3FF;
if(i_v==0) //电流采样
{
ad_i=10000*AD5/4920;
if(ad_i<50) //电流小于5.0A
tab2++;
if(c_adc==1)
{
AD1=ad_i;
AD2=ad_i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -