新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 用单片机系统实现故障诊断

用单片机系统实现故障诊断

作者:时间:2012-03-19来源:网络收藏

4.软件

用Franklin C51[4]编制BP程序关键部分如下:
uchar data i,j;
float xdata show[17]; //征兆
float xdata fault[11]; //类型
float xdata weight[10][17]; //输入层与隐含层间的权重
float xdata vweight[11][10]; //隐含层与输出层间的权重
//这两种权重已在PC机中训练好,烧录在EPROM中。
float xdata Inet[10];
…… //初始化,从采集滤波保存的信号中读取show[17]
for(i=0; i10; i++)
for(j=0; j17; j++)
Inet[i] += weight[i][j]*show[j];
for(i=0; i11; i++)
for(j=0; j10; j++)
fault[i] += vweight[i][j] / (1.0 + exp(-Inet[j]));
for(i=0; i11; i++)
{ if(fault[i] > 0.1)
…… // 显示出并调用通信程序上位机
// 进行通信告知故障
}

通信功能的主要程序如下:
//这里略去了中断服务程序的初始化
uchar idata transmit_buf[8] = fault1;
uchar idata receive_buf[8];
void transmit_data(void)
{ uchar p, i;
transmit_ready = 0;
do{ p = 0; //清校验和
for(i=0; i8; i++)
{ SBUF = transmit_buf[i];//发送一数据
p += transmit_buf;
while(TI != 1);
TI = 0;
}
SBUF = p; //发送校验和
while(TI == 0); TI = 0;
while(RI == 0); RI = 0;
}while (SBUF != 0)//接收不正确,重新发送
SM2 = 1; //设置监听状态
ES = 1; //开串行口中断
}
void receive_data(void)
{
uchar p, i;
receive_ready = 0;
while(1)
{
p=0; //清校验和
for(i=0; i8; i++)
{
while(RI != 1); RI = 0;
receive_buf[i] = SBUF; //接收一数据
p += receive_buf[i];
}
while(RI != 1); RI = 0;
if(SBUF==p) {SBUF=0x00; break;}
//校验和相同,发00
else{
SBUF=0xff; //校验和不同,发0FF
while(TI == 0); TI = 0;}
}
SM2 = 1;
ES = 1;
}



评论


相关推荐

技术专区

关闭