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

📄 su232.c

📁 89C52 UPS后备电源 R232通信源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	 }
	}
	LCD_command(CLR,0);
	LCD_write_string(0,LINE1,upsstatexs);
	LCD_write_string(0,LINE2,"OUT FRE:");
	LCD_write_string(8,LINE2,upsdata);//这个是输出频率
	LCD_write_string(12,LINE2,"Hz");delay_5ms();
 	}
	if(sw_id==0x07)
  	{
	xsdat=read5045c(97,4);
	f_xs=xsdat/255.0;
	xsdat=(float)temp*f_xs;
	upsdata=upsxs;
	Yuint_char(xsdat,upsxs);
	if(upsxs[0]=='0')
	{upsxs[0]=' ';
	 if(upsxs[1]=='0')
	 {upsxs[1]=' ';
	 }
	}
	LCD_command(CLR,0);
	LCD_write_string(0,LINE1,upsstatexs);
	LCD_write_string(0,LINE2,"TEMP:");
	LCD_write_string(5,LINE2,upsdata);//显示温度
	LCD_write_char(9,LINE2,0x00);
	LCD_write_string(10,LINE2,"C");delay_5ms();
 	}

	if(sw_id==0x08)
	{
	xsdat=read5045c(65,4);
	f_xs=xsdat/255.0;
	xsdat=(float)battery*f_xs;
	upsdata=upsxs;
	Yuint_char(xsdat,upsxs);
	if(upsxs[0]=='0')
	{upsxs[0]=' ';
	 if(upsxs[1]=='0')
	 {upsxs[1]=' ';
	 }
	}
	LCD_command(CLR,0);
	LCD_write_string(0,LINE1,upsstatexs);
	LCD_write_string(0,LINE2,"BATTERY:");
	LCD_write_string(9,LINE2,upsdata);//显示电池电压
	LCD_write_string(13,LINE2,"V");delay_5ms();
 	}
	

 

}


void mlcl()
{
/*
1  	  Q1     	  状态查询                    	
 2  	  T     	  10 秒测试                   	
 3  	  TL    	  测试直到电池低压            	
 4  	  T<n>  	  按指定的时间测试    	
 5  	  Q     	  打开或关闭蜂鸣器                 	
 6  	  S<n>  	  关机命令                	
 7  	S<n>R<m>	 重启命令     	
 8  	  C     	 取消关机命令         	
 9  	  CT    	 取消测试命令              	
10	   I	  查询UPS基本信息命令	
11	   F	  查询UPS的额定参数的命令	
		*/
//发送数据的结尾是<cr>
uchar state;
uchar ddd;
uchar * upsdata;	//UPS
uchar upsxs[10];
uchar i;
uchar add;
uchar iodat_d;
uint dat;//存放值	
uint dat1;
float f_xs;

if(iodat[0]=='Q')//包括Q和Q1
{
   if(iodat[1]=='1')//(208.4 140.0 208.4 034 59.9 2.05 35.0 00110000<cr>
	{	
	TI=0;
	SBUF='(';
	while(!TI);
	TI=0;
//输入电压:MMM。M
	dat=read5045c(33,4);
	f_xs=dat/255.0; 
	dat=(float)input*f_xs;
	upsdata=upsxs;
	Yuint_char(dat,upsxs);
for(i=0;i<=2;i++)
{
	SBUF=upsxs[i];
	while(!TI);
	TI=0;
}
	SBUF='.';
	while(!TI);
	TI=0;

	SBUF='0';
	while(!TI);
	TI=0;

	SBUF=' ';
	while(!TI);
	TI=0;

//故障电压:NNN。N
	add=193;
	iodat_d=WDT_Read1B(add,0);
	while(iodat_d!=0x0d && add!=209)
 	{
 	 SBUF=iodat_d;
	  while(TI==0); 
 	 TI=0;
 	 add++;
 	 iodat_d= WDT_Read1B(add,0);	
  
 	}


	SBUF=' ';
	while(!TI);
	TI=0;
//输出电压:PPP。P
	dat=read5045c(49,4);
	f_xs=dat/255.0;
	dat=(float)output*f_xs;
	upsdata=upsxs;
	Yuint_char(dat,upsxs);

	SBUF=upsxs[0];
	while(!TI);
	TI=0;
for(i=1;i<=2;i++)
{
	SBUF=upsxs[i];
	while(!TI);
	TI=0;

}
	SBUF='.';
	while(!TI);
	TI=0;


	SBUF='0';
	while(!TI);
	TI=0;

	SBUF=' ';
	while(!TI);
	TI=0;
//输出电流:QQQ
	dat=read5045c(81,4);
	f_xs=dat/255.0;	
	dat=read5045c(145,3);
	f_xs=(f_xs*100)/dat;
	dat=(float)load*f_xs;
	upsdata=upsxs;
	Yuint_char(dat,upsxs);
for(i=0;i<=2;i++)
{
	SBUF=upsxs[i];
	while(!TI);
	TI=0;
}
	SBUF=' ';
	while(!TI);
	TI=0;
//输出频率: RR。R
	upsdata=upsxs;
	Yuint_char(outfre,upsxs);
for(i=1;i<=2;i++)
{
	SBUF=upsxs[i];
	while(!TI);
	TI=0;
}


	SBUF='.';
	while(!TI);
	TI=0;


	SBUF='0';
	while(!TI);
	TI=0;

	SBUF=' ';
	while(!TI);
	TI=0;



//电池电压:S。SS
    dat=read5045c(65,4);
	f_xs=dat/255.0;
	dat1=read5045c(161,3);
	f_xs=(float)battery*f_xs/(float)dat1;
	dat1=2.55*f_xs;
	upsdata=upsxs;
	Yuint_char(dat1,upsxs);
	SBUF=upsxs[0];
	while(!TI);
	TI=0;

	SBUF='.';
	while(!TI);
	TI=0;
for(i=1;i<=2;i++)
{
	SBUF=upsxs[i];
	while(!TI);
	TI=0;

}
	SBUF=' ';
	while(!TI);
	TI=0;
//温度值: TT。T
	dat=read5045c(97,4);
	f_xs=dat/255.0;
	dat=(float)temp*f_xs;
	upsdata=upsxs;
	Yuint_char(dat,upsxs);


for(i=1;i<=2;i++)
{
	SBUF=upsxs[i];
	while(!TI);
	TI=0;
}
	SBUF='.';
	while(!TI);
	TI=0;


	SBUF='0';
	while(!TI);
	TI=0;


	

	SBUF=' ';
	while(!TI);
	TI=0;
//UPS状态:一个字节数:市电不正常1 电池低1 电路不正常1 Ups故障1 后备1 测试1 关机1  蜂鸣响1 停止位:<cr>
state=upsstate;
for(i=1;i<=8;i++)
{
 if(state&0x80)
  {	
  	SBUF='1';
	while(!TI);
	TI=0;
  }
 else
  {	
    SBUF='0';
    while(!TI);
	TI=0;
  }
 state=state<<1;
}

	SBUF=0x0d;
	while(!TI);
	TI=0;



	//状态查询
	}
}
else if(iodat[0]=='S')//包括 S<n> 和S<n>R<m>
{
 if(iodat[3]==0x0d)
  {
	if(iodat[1]==1)s_time=10;
	else
	s_time=(iodat[2]-'0');
	s_flag=1;

  }	



	if(iodat[3]=='R')
	{
 	 if(iodat[1]==1)
	  s_time=10;
	 else
	  s_time=(iodat[2]-'0');

	 s_flag=1;
 	 r_time=iodat[4]-'0';
	 r_time=10*r_time+(iodat[5]-'0');
	 r_time=10*r_time+(iodat[6]-'0');
	 r_time=10*r_time+(iodat[7]-'0');
	 r_time=r_time+s_time+1;
	 r_flag=1;
	}
TH2=15536/256;
TL2=15536%256;
ET2=1;
TR2=1;



	
	
}
else if(iodat[0]=='C')//包括 C 
{

}
else if(iodat[0]=='I')//查询UPS基本信息命令1.2.15
{													//#Company_Name UPS_Model Version<cr>
TI=0;
SBUF='#';
while(TI==0); 
TI=0;
 wrio(1,16);
SBUF=' ';
while(TI==0); 
TI=0;

wrio(17,16);
SBUF=' ';
while(TI==0); 
TI=0;

wrio(225,16); 
SBUF=0x0d;
while(TI==0); 
TI=0;




}
else if(iodat[0]=='F')//查询UPS的额定参数的命令9-12
{				//#MMM.M QQQ SS.SS RR.R<cr>

TI=0;
SBUF='#';
while(TI==0); 
TI=0;
wrio(129,16); 
SBUF=' ';
while(TI==0); 
TI=0;
wrio(145,16); 
SBUF=' ';
while(TI==0); 
TI=0;
wrio(161,16); 
SBUF=' ';
while(TI==0); 
TI=0;
wrio(177,16); 
SBUF=0x0d;
while(TI==0); 
TI=0;
}

else if(iodat[0]=='L')//测试连接的命令
{
TI=0;
SBUF='J';
while(TI==0); 
TI=0;
SBUF=0x0d;
while(TI==0); 
TI=0;

}

else if(iodat[0]=='X')//写5045参数的命令
{
 if(iodat[1]>'0' && iodat[1]<='9')add=(iodat[1]-'1')*16+1;
if(iodat[1]>='a' && iodat[1]<='z')add=(iodat[1]-'a'+9)*16+1;
 i=2;
 while(iodat[i]!=0x0d)
 {
  WDT_Write1B(iodat[i],add,0);	
  i++;add++;
 }
 WDT_Write1B(iodat[i],add,0);
TI=0;
SBUF='x';
while(TI==0); 
TI=0;
SBUF=iodat[1];
while(TI==0); 
TI=0;
SBUF=0x0d;
while(TI==0); 
TI=0;
}
    
else if(iodat[0]=='D')//读5045参数的命令
{
if(iodat[1]>'0' && iodat[1]<='9')add=(iodat[1]-'1')*16+1;
if(iodat[1]>='a' && iodat[1]<='z')add=(iodat[1]-'a'+9)*16+1;
ddd=add+16;
TI=0;
SBUF='d';
while(TI==0); 
TI=0;
SBUF=iodat[1];
while(TI==0); 
TI=0;
 
iodat_d=WDT_Read1B(add,0);
	
 while(iodat_d!=0x0d && add!=ddd)
 {
  SBUF=iodat_d;
  while(TI==0); 
  TI=0;
  add++;
  iodat_d= WDT_Read1B(add,0);	
  
 }
  SBUF=iodat_d;
  while(TI==0); 
  TI=0;
}

mlflag=0;
}



//开关机的定时
void timer2(void) interrupt 5 using 3
{
	TF2=0;
	timef++;
	if(timef>=1200)
	 {
	  	timef=0;
		s_time--;
		r_time--;
	 }
}

/*232串口中断处理程序*/
void uart(void) interrupt 4 using 2
{
 char redata;
 if(RI)
  {
	if(ionum>18)ionum=0;//说明每次收的命令数据长度不能超过19个字节。防止数组过界
	RI=0;
	redata=SBUF;
	if(redata!=0x0d) 
	 {
	  iodat[ionum]=redata;
	  ionum++;
	 }
 	else 
	 {
	  mlflag=1;
   	  iodat[ionum]=0x0d;
	  ionum=0;
   	 }
   }
}

//外中断0的处理程序
void inputfre(void) interrupt 0 
{
  if(frestar)	//结束
   {
	TR0=0;
	infre=1000000/(256*TH0+TL0);
	if(infre==51)infre=50;
	if(infre==49)infre=50;//由于硬件的原因,周期会长点,会出现49

	TH0=0x00;	
	TL0=0x00;
	EX0=0;
   }
  else 	//开始
   {
	frestar=1;
	TF0=0;
	TH0=0x00;	
	TL0=0x00;
	TR0=1;
   }
}

//外中断1的处理程序
void outputfre(void) interrupt 2 
 {
  if(frestar)//结束
   {
	TR0=0;
	outfre=1000000/(256*TH0+TL0);
	if(outfre==51)outfre=50;
	if(outfre==49)outfre=50;//由于硬件的原因,周期会长点,会出现49
	
	TH0=0x00;	
	TL0=0x00;
	EX1=0;
   }
  else //开始
   {
  	frestar=1;
	TF0=0;
	TH0=0x00;
	TL0=0x00;
	TR0=1;
   }
 }
//定时器0
void intsvr1(void) interrupt 1
{
}

/********主函数**********************/
void main(void)
{
	bit sw_flag;	//定义按键的放开和按下的标志位
	uchar i;		//循环用
	bit freflag;	//1输出频率,0输入频率
	uchar m_add;	//读写5045的地址
	uchar mdat_d;	//读写5045的数据
	uchar lcd_num=0;	//记录页号
	uchar w=0;			//显示更新的时间
	uint sw_w;			//LCD休眠的时间
	uchar sw_id1;		//LCD休眠时保存按键值

	LCD_light=1;//背光
	LCD_init(); //LCD初始化
	LCD_command(CLR,0);
 	LCD_write_string(0,LINE1,"Start * * *");
	LCD_write_char(10,LINE1,'*');
    LCD_write_string(0,LINE2,"           Wait!  ");

/*初始化各个中断和定时器*/
	TMOD|=0x20;
	SCON=0x50;
	PCON|=0x80;
	TH1=0xe6;
	TL1=0xe6;
	TR1=1;
	ES=1;
	EA=1;
	TMOD|=0x01;
	TH0=0x00;
	TL0=0x00;
//外部中断的初始化
	IT0=1;IT1=1;	
	ET0=1;
	on_sw=0;
	off_sw=0;
	
	LCD_ZK(0x00,zf_data);//  //建立图案 	
	WDT_WriteSR(0); //5045的初始化
	sw_flag=0;
	w=200;
	sw_w=0;
	LED=0;
	i=20; 
	while(i!=0)
	 {
	  ad_data();//读取各个在线变化的数据.
	  i=i-1;
	 }
    upsstate=upsstate&0xf7;//在线
	LCD_command(CLR,0);
    LCD_write_string(0,LINE1,"   WELCOME  TO     ");
    
	m_add=1;
	i=0;	
	mdat_d=WDT_Read1B(m_add,0);
	while(mdat_d!=0x0d && m_add!=17)
 	{
 	 LCD_write_char(i,LINE2,mdat_d);
 	 m_add++;
	 i++;
  	 mdat_d= WDT_Read1B(m_add,0);	
    }
   

 while(1)    
  {
	sw_w++;
	lcd_num=sw_id;	
	frestar=0;
	if(freflag)
	{
	 EX0=0;
	 IE1=0;
	 EX1=1;
	}
	else 
	{
	 EX1=0;
	 IE0=0;
	 EX0=1;								
	}
	freflag=~freflag;

	if(LCD_MEN==0)	//键盘扫描
 	{
	delay_5ms();
  	if(LCD_MEN==0)
    {sw_flag=1;}
	}
	if(sw_flag==1 && LCD_MEN==1)
		{
		 if(sw_w>=5000)
		  {
		   LCD_light=1;
		   sw_id=sw_id1-1;
		  }
		sw_id+=0x01;
		sw_flag=0;
		sw_w=0;
		}

	WDT_CS=1;

	if(sw_w>=5000)//睡眠
	{
	 if(sw_w==5000)
	  {
	   sw_id1=sw_id;
	   LCD_light=0;
	   LCD_command(CLR,0);
	   sw_w++;
	  }
	 else 
	  {
	   sw_w--;
	  }
	 w=200;
	}

	if(lcd_num==sw_id)
	{	
     if(w==0)
 	 {
	  LCD_MEN1();
	  w=200;//显示的时间
	 }
	 else
	 {
	  w=w-1;
	 }
	}
	else
	{
	 LCD_MEN1();w=200;//显示的时间
	}


	if(s_flag)
	{
	 if(s_time==0)
	  {
		off_sw=1;s_flag=0;
		if(~r_flag)TR2=0;
	    i=100; 	//关机的时间
     	while(i!=0)
	     {
		  delay_5ms();
		  i=i-1;
		 }
	    off_sw=0;	
	  }
	}
	
	if(r_flag)
	 {
	 	if(r_time==0)
		 {
			on_sw=1;r_flag=0;TR2=0;
		 	i=100; 	//开机的时间,这个是错误的写法
		 	while(i!=0)
		  	{
			 delay_5ms();
			 i=i-1;
			}	
		 	on_sw=0;	
		 }
	 }
	ad_data();//读取各个在线变化的数据.
	if(mlflag) mlcl();
  }
}                  



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -