⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fk.c

📁 rs485、八位扫描显示、按键、数字编码器
💻 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 + -