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

📄 ch14-2.c

📁 单片机接口技术(C51版)例程源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*说明:本程序来源于作者本人的科研课题,实际应用的程序   */
/*中有关隶属函数的数据均为课题组成员成果通过大量实验获得,*/
/*本书源程序中的数据并非可以应用的真实数据,敬请谅解      */
#include<stdlib.h>


#define FUZZYVAR 3
#define MAXFUZZYSETNUM 5
#define MAXY 100
#define JIANGROULEVEL   35
/*洗涤剂及辅剂的宏定义*/
#define NOFULIAO        0/*没有辅料*/
#define XIDIJI          1/*洗涤剂*/
#define PIAOBAI         2/*漂白剂*/
#define SHANGJIANG      3/*上浆*/
#define RUHUA           4/*乳化*/
#define PIAOJIANG       5/*漂白+上浆*/
#define PIAOROU         6/*漂白+柔化*/
#define ZHONGHEJI       7/*中和剂*/
#define ROURUANJI       8/*柔软剂*/
#define XIDIJI_RUHUA    9/*洗涤剂+乳化剂*/


typedef unsigned char uchar;
typedef unsigned int uint;
/*模糊推理输出参数结构*/
/*洗涤过程每一阶段参数结构*/
struct tagFuzzyOut
       {
       uchar EffMark;    /*错误标志*/
       uchar FoTemperture;/*洗涤温度*/
       uchar FoWaterLevel;/*洗涤水位*/
       uchar FoWashMode;/*洗涤方式:指标准洗、轻柔洗*/
       uchar FoWashSpeed;/*洗涤速度*/
       uchar FoWashTime;/*洗涤时间*/
       uchar FoAbulentType;/*辅剂类型:指漂白剂、柔化剂等*/
       uchar FoAbulentVolume;
       uchar FoDrainMode;  /* =0  不排水
                              =1  排水
                              =2  中脱(排水后中速脱水)
                              =3  高脱(排水后高速脱水)
                           */
       uchar FoJunbuSpeed;   /*均布速度*/
       uchar FoZhongtuoSpeed;/*中脱速度*/
       uchar FoGaotuoSpeed;  /*高脱速度*/
       uchar FoZhongtuoTime; /*中脱时间*/
       uchar FoGaotuoTime;   /*高脱时间*/
       };

/* 最多阶段数:一次初洗,3次主洗,3次过清,2次处理*/
xdata struct tagFuzzyOut FuzzyOut[9];


/*调用模糊推理程序前人工输入:ExtraAbulentPro,AbulentTempture,
    并应检测布质ClothType、布量ClothVolume、初洗浑浊度cxTurbityValue
*/
xdata uchar ExtraAbulentPro,AbulentTemperture;//定义辅剂类型、辅剂温度
xdata uchar ClothType=15,ClothVolume=23;//定义布质、布量
xdata uint cxTurbityValue=60;//初洗浑浊度值

void FuzzyInfer(void);//模糊推理函数

main()
{
int i;
i=10;

ClothType=15;
ClothVolume=25;
cxTurbityValue=23;
ExtraAbulentPro=PIAOJIANG;
AbulentTemperture=1;

FuzzyInfer();
}


/* 确定成员函数
1.FUZZYVAR =输入模糊变量数(常量): 布质,布量,浑浊度
2.fSetNum[FUZVAR]: 每个模糊变量对应的模糊集数
3.隶属函数:梯形,a, b, c, d四点表示,高度为固定值
4.Trapezoid 顺序记录所有模糊集隶属函数的a,b,c,d,.....数据
5.mfNode 指向Trapzoid
*/

struct tagTrapezoid
       {
       uchar left;
       uchar mid1;
       uchar mid2;
       uchar right;
       };

xdata struct tagTrapezoid TabTrapezoid[11]={{0,0,20,40},{20,40,60,80},{60,80,100,100},
                    {0,0,10,15},{10,15,15,20},{15,20,20,25},{20,25,25,25},
                    {0,0,10,25},{10,25,40,55},{40,55,70,85},{70,85,100,100}};

xdata uchar fSetNum[FUZZYVAR]={3,4,4};

/*主洗、过清阶段数与布量、初/主洗浑浊度关系*/
xdata uchar TabStageNum[8][4]={1,1,1,1,1,1,1,2,1,1,2,2,2,2,3,3,
                                       1,1,2,2,1,2,2,2,2,2,2,3,2,2,3,3};
/* 洗涤方式:0=轻柔洗 1=标准洗  2=单向洗 */


/*洗涤转速、均布、中脱及高脱速度与布质、布量关系*/
xdata uchar TabMotorSpeed[4][12]={1,2,3,4,5,6,7,8,9,10,11,12,
                                       1,2,3,4,5,6,7,8,9,10,11,12,
                                       1,2,3,4,5,6,7,8,9,10,11,12,
                                       1,2,3,4,5,6,7,8,9,10,11,12};

/* 水位与布质、布量关系*/
xdata uchar TabWaterLevel[6][12]={1,2,3,4,5,6,7,8,9,10,11,12,
                                       1,2,3,4,5,6,7,8,9,10,11,12,
                                       1,2,3,4,5,6,7,8,9,10,11,12,
                                       1,2,3,4,5,6,7,8,9,10,11,12,
                                       1,2,3,4,5,6,7,8,9,10,11,12,
                                       1,2,3,4,5,6,7,8,9,10,11,12};

/* 主洗水温   ?*/

/* 主洗洗涤剂量与布量、浑浊度关系*/
xdata uint TabAbulentVolume[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};

/*主洗、过清、处理洗涤时间与布量、浑浊度关系 (一次过清、一般处理、中和处理、柔化处理、上浆处理)*/
xdata uchar TabXidiTime[6][16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
                                           1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
                                          1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
                                           1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
                                          1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
                                          1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

/*主洗、过清、处理脱水方式与布量、布质关系   */
xdata uchar TabDrainMode[3][12]={1,2,3,4,5,6,7,8,9,10,11,12,
                                           1,2,3,4,5,6,7,8,9,10,11,12,
                                           1,2,3,4,5,6,7,8,9,10,11,12};

/*中、高脱时间与布质、布量关系*/
xdata uchar TabDrainTime[2][12]={1,2,3,4,5,6,7,8,9,10,11,12,
                                           1,2,3,4,5,6,7,8,9,10,11,12};

/*推理过程*/

void FuzzyInfer(void)
{

uchar NumToFset(uchar num,uchar m_Sz,uchar *sp);
xdata int i,j,k,stagenum[4];
xdata int sum1,sum2,sum3[10],sim;
xdata uchar fm_ClothType,fm_ClothVolume,fm_cxTurbityValue,Simility[FUZZYVAR][MAXFUZZYSETNUM];


fm_ClothType=NumToFset(0,ClothType,Simility[0]);
fm_ClothVolume=NumToFset(1,ClothVolume,Simility[1]);
fm_cxTurbityValue=NumToFset(2,cxTurbityValue,Simility[2]);


/* 确定主洗、过清阶段数,处理阶段数由辅料种类决定,初洗阶段数=1 */

        stagenum[0]=1;
        j=fSetNum[1];
	for(i=0;i<2;i++)stagenum[i+1]=TabStageNum[i*j+fm_ClothVolume][fm_cxTurbityValue];
	if((stagenum[1]<2)&&((ExtraAbulentPro==PIAOBAI)||(ExtraAbulentPro==RUHUA)||(ExtraAbulentPro==XIDIJI_RUHUA)
 		||(ExtraAbulentPro==PIAOJIANG)||(ExtraAbulentPro==PIAOROU)))stagenum[1]=2; /* 漂白至少应有2步主洗*/
	FuzzyOut[0].EffMark=stagenum[0];
	if(stagenum[1]==1)
		{
                FuzzyOut[1].EffMark=1;
                FuzzyOut[2].EffMark=FuzzyOut[3].EffMark=0;
                }
	else if(stagenum[1]==2)
                {
                FuzzyOut[1].EffMark=FuzzyOut[2].EffMark=1;
                FuzzyOut[3].EffMark=0;
                }
		else {
                     FuzzyOut[1].EffMark=FuzzyOut[2].EffMark=1;
                     FuzzyOut[3].EffMark=1;
                     }
         if(stagenum[2]==1)
                {
                FuzzyOut[4].EffMark=1;
                FuzzyOut[5].EffMark=0;
                FuzzyOut[6].EffMark=0;
                }
		else if(stagenum[2]==2)
                     {
                     FuzzyOut[4].EffMark=FuzzyOut[5].EffMark=1;
                     FuzzyOut[6].EffMark=0;
                     }
                     else
                         {
                          FuzzyOut[4].EffMark=1;
                          FuzzyOut[5].EffMark=1;
                          FuzzyOut[6].EffMark=1;
                         }
	switch(ExtraAbulentPro)
	{
	case PIAOBAI:
	case SHANGJIANG:
	case ROURUANJI:
    case NOFULIAO:
		FuzzyOut[7].EffMark=1;
		FuzzyOut[8].EffMark=0;
		stagenum[3]=1;
		break;
	case PIAOJIANG:
	case PIAOROU:
		FuzzyOut[7].EffMark=FuzzyOut[8].EffMark=1;
		stagenum[3]=2;
		break;
	}

/* 洗涤方式: 标准洗涤*/

   for(i=0;i<9;i++)FuzzyOut[i].FoWashMode=1;

/*  料种  */
	for(i=0;i<9;i++)FuzzyOut[i].FoAbulentType=NOFULIAO;
	switch(ExtraAbulentPro)
	{
	case PIAOBAI:
	case PIAOROU:
	case PIAOJIANG:
                FuzzyOut[1].FoAbulentType=XIDIJI;
	        if(stagenum[1]==2)
                	{
               		FuzzyOut[2].FoAbulentType=PIAOBAI;
			}
		        else
		           {
			   FuzzyOut[2].FoAbulentType=XIDIJI;
			   FuzzyOut[3].FoAbulentType=PIAOBAI;
		           }
		FuzzyOut[7].FoAbulentType=ZHONGHEJI;
		if(ExtraAbulentPro==PIAOJIANG)FuzzyOut[8].FoAbulentType=SHANGJIANG;
	 	if(ExtraAbulentPro==PIAOROU)FuzzyOut[8].FoAbulentType=ROURUANJI;
		break;
        case RUHUA:
               FuzzyOut[1].FoAbulentType=XIDIJI;
	        if(stagenum[1]==2)
                	{
               		FuzzyOut[2].FoAbulentType=RUHUA;
			}
		        else
		           {
			   FuzzyOut[2].FoAbulentType=XIDIJI;
			   FuzzyOut[3].FoAbulentType=RUHUA;
		           }
               break;
        case XIDIJI_RUHUA:
               if(stagenum[1]==1)FuzzyOut[1].FoAbulentType=XIDIJI_RUHUA;
	             else if(stagenum[1]==2)
                	{
                        FuzzyOut[1].FoAbulentType=XIDIJI;

⌨️ 快捷键说明

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