?? fk.c
字號:
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_();
sbit pwm1=P1^1;
sbit pwm2=P1^2;
sbit r485=P1^3;/*0接收,1發送*/
sbit pl_km=P1^4;/*旁路接觸器*/
sbit ud_km=P1^5;/*正負補償*/
sbit sc_b=P1^6;
sbit sc_c=P1^7;
sbit adc_cs=P3^2;
sbit adc_v=P3^3;
sbit adc_a=P3^4;
sbit adc_clk=P3^5;
sbit bx_jd=P3^7;
uchar tj_v,xw,in_v,in_a;
uchar v_av,a_av,v_avl,a_avl,v_gd,i_gd,i_kz,t_add,t_sub,obj_v,gz_bz,v_add,v_sub,t_w,ol_t,
ol_lj,ol_num,a_bl,bc_bt,bc_t,sr_num,sr_com,sr_pro;
uchar sr_dat[13];
uint t0_lj,a_zs,sr_data,st_data,second,t_run;
bit ud_pwm,t0_int,sr_int,st_int,on_off,bc_zf,bc_ds,gy_gz,sr_zt,sr_ov,t0bit,kz_off;
void delay1(uchar x)
{ uchar temp;
for (temp=x;temp>0;temp--)
{nop;}
}
bit jy_ch()
{bit tempbit=0;
uchar temp;
uint tempint1=0,tempint2=0;
if((xw==sr_dat[1])||(sr_dat[1]==0))
{
for(temp=7;temp>0;temp--)tempint1+=sr_dat[temp];
tempint2=sr_dat[8]<<12;
tempint2|=sr_dat[9]<<8;
tempint2|=sr_dat[10]<<4;
tempint2|=sr_dat[11];
if(tempint2==tempint1)
{ tempbit=1;
sr_com=sr_dat[2];
sr_pro=sr_dat[3];
sr_data=sr_dat[4]<<12;
sr_data|=sr_dat[5]<<8;
sr_data|=sr_dat[6]<<4;
sr_data|=sr_dat[7];
}
}
return(tempbit);
}
r_exe()
{
uint tempint;
uchar temp;
sr_dat[0]=0xa5;
sr_dat[12]=0xe7;
switch(sr_dat[2])
{
case 0:
switch(sr_dat[3])
{
case 0:sr_dat[4]=sr_dat[5]=0;
sr_dat[6]=v_av>>4; sr_dat[7]=v_av&0xf;
break;
case 1: temp=a_zs>>8;
sr_dat[4]=temp>>4;
sr_dat[5]=temp&0xf;
temp=a_zs&0xff;
sr_dat[6]=temp>>4;
sr_dat[7]=temp&0xf;
break;
case 2: temp=tj_v/16;
if(bc_zf)tempint=temp+v_av;
else tempint=v_av-temp;
if(tempint>255)tempint=255;
sr_dat[4]=sr_dat[5]=0;
sr_dat[6]=tempint>>4; sr_dat[7]=tempint&0xf;
}
break;
case 1:
switch(sr_dat[3])
{
case 0:v_gd=sr_dat[6]<<4;v_gd|=sr_dat[7];
break;
case 1:i_gd=sr_dat[6]<<4;i_gd|=sr_dat[7];
break;
case 2:t_run=sr_dat[4]<<12;t_run|=(sr_dat[5]<<8);
t_run|=(sr_dat[6]<<4);t_run|=sr_dat[7];
break;
case 3:v_add=sr_dat[6]<<4;v_add|=sr_dat[7];
break;
case 4:v_sub=sr_dat[6]<<4;v_sub|=sr_dat[7];
break;
case 5:i_kz=sr_dat[6]<<4;i_kz|=sr_dat[7];
break;
case 6:ol_t=sr_dat[6]<<4;ol_t|=sr_dat[7];
break;
case 7:a_bl=sr_dat[6]<<4;a_bl|=sr_dat[7];
break;
case 8:bc_bt=sr_dat[6]<<4;bc_bt|=sr_dat[7];
break;
case 9:gy_gz=sr_dat[7];
break;
case 10:bc_ds=sr_dat[7];
break;
case 11:kz_off=sr_dat[7];
}
break;
case 2:
switch(sr_dat[3])
{
case 0:gz_bz=7;on_off=0;/*強迫關機*/
break;
case 1:if((gz_bz==0)||(gz_bz==7)){gz_bz=0;on_off=1;}
break;
case 2:gz_bz=0;
}
}
if(gz_bz!=0){sr_dat[2]=3;sr_dat[3]=gz_bz;}
else
{if(!on_off)sr_dat[2]=0;
else
{if(bc_zf)sr_dat[2]=1;
else sr_dat[2]=2;
}
}
tempint=0;
for(temp=7;temp>0;temp--)
{
tempint+=sr_dat[temp];
}
temp=tempint>>8;
sr_dat[8]=temp>>4;
sr_dat[9]=temp&0xf;
temp=tempint&0xff;
sr_dat[10]=temp>>4;
sr_dat[11]=temp&0xf;
}
main()
{
bit tempbit;
uint tempint;
uchar temp,ch1,ch2;
/*初始化*/
bx_jd=1;
pwm1=0;
nop
nop
pwm2=1;
pl_km=1;
ud_km=1;
r485=0;
TMOD=0x22;
SCON=0X40;
PCON=0;
SMOD=1;
TH1=0XFD;/*9600 *波特*/
TH0=0;
TR1=1;
TR0=1;
ET0=1;
ES=1;
EA=1;
t_run=0;
second=0;
t_run=255;
t_add=0;
t_sub=0;
v_gd=210;
on_off=0;
ol_lj=0;
ol_num=0;
sr_num=0;
REN=1;
RI=0;
sr_zt=0;
bx_jd=0;
/*工作區*/
while(1)
{
/*電壓讀取*電流讀取**/
ch1=ch2=0;
adc_cs=0;
for(temp=9;temp>0;temp--)
{ adc_clk=1;delay1(2);
adc_clk=0;delay1(2);
ch1=(ch1<<1)|adc_v;
ch2=(ch2<<1)|adc_a;
}
adc_cs=1;
tempint=v_av<<8;
tempint+=v_avl;
tempint-=v_av;
tempint+=ch1;
v_avl=tempint&0xff;
v_av=tempint>>8;
tempint=a_av<<8;
tempint+=a_avl;
tempint-=a_av;
tempint+=ch2;
a_avl=tempint&0xff;
a_av=tempint>>8;
/*計算、保護及動作*/
a_zs=a_av*a_bl;
if(kz_off)
{if(a_zs<i_kz)
{gz_bz=6;
on_off=0;
tj_v=0;
}
else if(gz_bz==6)gz_bz=0;
}
else if(gz_bz==6)gz_bz=0;
if(a_zs<=i_gd)
{
ol_num=0;
ol_lj=0;
}
else
{tempint=i_gd<<1;
tempint+=i_gd;
if(a_zs>tempint)
{gz_bz=4;
on_off=0;
pl_km=1;
tj_v=0;
}
else
{tempint=a_zs-i_gd;
if(tempint<255)ol_num=tempint;
else ol_num=255;
}
}
if(ol_lj>ol_t)
{if(!gz_bz)gz_bz=3;
on_off=0;
pl_km=1;
tj_v=0;
}
if(v_av<v_gd)
{if(!bc_zf)bc_t=0;
if(bc_t>bc_bt){bc_zf=1;ud_km=0;}
if(bc_ds&&bc_zf)
{temp=v_gd-v_av;
if(temp<40)
{obj_v=temp*6;
if(gz_bz<3)gz_bz=0;
}
else
{if((!gz_bz)&&(!bc_zf))gz_bz=1;
if(!bc_ds)on_off=0;
pl_km=1;
tj_v=0;
}
}
else
{if(!gz_bz&&!bc_ds)gz_bz=1;
on_off=0;
pl_km=1;
tj_v=0;
}
}
else
if(v_av>v_gd)
{if(bc_zf)bc_t=0;
if(bc_t>bc_bt){bc_zf=0;ud_km=1;}
if(!bc_zf)
{temp=v_av-v_gd;
if(temp<40)
{obj_v=temp*6;
if(gz_bz<3)gz_bz=0;
}
else
{
if(gy_gz)
{
if(!gz_bz)gz_bz=2;
on_off=0;
pl_km=1;
tj_v=0;
}
else {if(gz_bz<3)gz_bz=0;
obj_v=tj_v=0xff;
}
}
}
else
{if(!gz_bz)gz_bz=1;
on_off=0;
pl_km=1;
tj_v=0;
}
}
if(v_add!=0)tempint=3600/v_add;
else tempint=255;
if(tempint<255)t_add=tempint;
else t_add=255;
if(v_sub!=0)tempint=3600/v_sub;
else tempint=255;
if(tempint<255)t_sub=tempint;
else t_sub=255;
/*時間處理*/
if(t0_int)
{t0_int=0;
t0_lj++;
if(t0_lj>=720)
{if(second<255)second++;
if(bc_t<255)bc_t++;
t0_lj=0;
tempint=ol_lj;
tempint+=ol_num;
if(tempint<255)ol_lj=tempint;
else ol_lj=255;
}
if(on_off)
{
if(tj_v>obj_v)
{t_w++;
if(t_w>=t_add)
{if(tj_v<255)tj_v++;
t_w=0;
}
}
else if(tj_v<obj_v)
{
if(t_w>=t_sub)
{if(tj_v>0)tj_v--;
t_w=0;
}
}
if(tj_v=obj_v) t_w=0;
}
}
if(!on_off)
{
tj_v=0;
if(!gz_bz)
if(second>=t_run)
{second=0;
on_off=1;
pl_km=0;
}
}
/*t0預處理*/
if(tj_v<18)
{
pwm1=0;
nop
nop
pwm2=1;
t0bit=0;
TH0=0;
}
else if(tj_v>238)
{
pwm2=0;
nop
nop
pwm1=1;
t0bit=0;
TH0=0;
}
else t0bit=1;
/*相位讀取*/
if(sc_c)
{if(sc_b)xw=1;else xw=2;}
else xw=3;
/*通訊處理*/
tempbit=0;
if(sr_int)
{sr_int=0;
if(sr_ov)tempbit=jy_ch();
sr_zt=1;
}
if(tempbit)
{REN=0;
r485=1;
r_exe();
TI=0;
SBUF=sr_dat[0];
sr_num++;
}
if(st_int)
{st_int=0;
if(sr_ov)
{RI=0;
REN=1;
r485=0;
sr_num=0;
sr_zt=0;
}
}
}
}
void tint1() interrupt 1 using 3
{EA=0;
TF0=0;
if(t0bit)
{
if(ud_pwm)
{
pwm1=0;
nop
nop
pwm2=1;
ud_pwm=0;
TH0=tj_v;
}
else
{
pwm2=0;
nop
nop
pwm1=1;
ud_pwm=1;
TH0=255-tj_v;
}
}
t0_int=1;
TF1=0;
EA=1;
}
void sint1() interrupt 4 using 2
{uchar temp;
if(RI)
{RI=0;
sr_int=1;
temp=SBUF;
if(temp==0xa5)
{sr_num=0;
REN=1;
}
sr_dat[sr_num]=temp;
if(temp==0xe7)
{sr_num=0;
sr_ov=1;
}
else
{if(sr_num>=12) sr_num=0;
else sr_num++;
}
}
if(TI)
{st_int=1;
TI=0;
SBUF=sr_dat[sr_num];
sr_num++;
if(sr_num>12)
sr_ov=1;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -