📄 su232.c
字号:
}
}
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 + -