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

📄 fuzzypid.lst

📁 开发的一个温控仪完整代码
💻 LST
字号:
C51 COMPILER V7.50   FUZZYPID                                                              09/16/2006 22:10:57 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE FUZZYPID
OBJECT MODULE PLACED IN FuzzyPID.OBJ
COMPILER INVOKED BY: D:\SProgram\Keil\C51\BIN\C51.EXE FuzzyPID.c OPTIMIZE(SIZE) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "TempCtrl.h"
   2          
   3          #ifdef USING_FUZZYPID_CONCTRL
              //-----------------------------------------------------------------------------
              char FzE[2];
              char FzEC[2];
              
              //E使用梯形隶属度函数
              FzFunNode code SubE[5]={
                      {1,2,3,4},
                      {2,3,4,6},
                      {3,5,8,7},
                      {4,5,8,6},
                      {4,4,5,8}
              };
              
              //EC使用梯形隶属度函数
              FzFunNode SubEC[5]={
                      {1,2,3,4},
                      {2,3,4,6},
                      {3,5,8,7},
                      {4,5,8,6},
                      {4,4,5,8}
              };
              
              //输出使用单点隶属度函数
              #define FP_NB 10
              #define FP_NM 10
              #define FP_NS 10
              #define FP_ZZ 10
              #define FP_PS 10
              #define FP_PM 10
              #define FP_PB 10
              
              //模糊逻辑规则表
              char code FzPRule[5][5]={
                      FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
                      FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
                      FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
                      FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
                      FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
              };
              
              char code FzIRule[5][5]={
                      FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
                      FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
                      FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
                      FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
                      FP_NB,FP_NB,FP_NB,FP_NB,FP_NB,
              };
              
              void FuzzyPidCtrl()
              {
              //      char i;
                      //E模糊化
C51 COMPILER V7.50   FUZZYPID                                                              09/16/2006 22:10:57 PAGE 2   

              
                      for(i=0;i<5;i++)//寻找E的隶属度
                              if(Error>SubE[i].A0)
                              {//找到第一个隶属度函数
                                      if(Error<=SubE[i].A1)
                                      {//第一段
                                              if(SubE[i].A0==(-127))
                                              {//负无穷
                                                      FzE[0]=255;
                                              }
                                              else
                                              {//
                                                      x1=255.0*(Error-SubE[i].A0)/(SubE[i].A1-SubE[i].A0);
                                                      x1+=0.5;
                                                      FzE[0]=(char)x1;                                
                                              }
                                      }
                                      else if(Error<=SubE[i].A2)
                                      {//第二段
                                              FzE[0]=255;//1.0的隶属度
                                      }
                                      else
                                      {//第三段
                                              if(SubE[i].A3==127)
                                              {//负无穷
                                                      FzE[0]=255;//1.0的隶属度
                                              }
                                              else
                                              {//
                                                      x1=255-255.0*(Error-SubE[i].A2)/(SubE[i].A3-SubE[i].A2);
                                                      x1+=0.5;
                                                      FzE[0]=(char)x1;
                                              }
                                      }
                                      
                                      //第二个隶属度
                                      
                                      if(i!=4)
                                      {//并非最后一个
                                              i++;
                                              if(Error<SubE[i].A0)
                                              {
                                                      FzE[1]=0;
                                              }
                                              else if(Error<=SubE[i].A1)
                                              {//第一段
                                                      x1=255.0*(Error-SubE[i].A0)/(SubE[i].A1-SubE[i].A0);
                                                      x1+=0.5;
                                                      FzE[1]=(char)x1;
                                              }
                                              else if(Error<=SubE[i].A2)
                                              {//第二段
                                                      FzE[1]=255;//1.0的隶属度
                                              }
                                              else
                                              {//第三段
                                                      if(SubE[i].A3==127)
                                                      {//正无穷
                                                              FzE[1]=255;//1.0的隶属度
                                                      }
                                                      else
                                                      {//
C51 COMPILER V7.50   FUZZYPID                                                              09/16/2006 22:10:57 PAGE 3   

                                                              x1=255-255.0*(Error-SubE[i].A2)/(SubE[i].A3-SubE[i].A2);
                                                              x1+=0.5;
                                                              FzE[1]=(char)x1;
                                                      }
                                              }
                                      }
                                      else
                                      {
                                              FzE[1]=FzE[0];
                                              FzE[1]=0;
                                      }
                                      break;
                              }//end of if
              
                      k0=i;//k0第一维
              
                      //EC模糊化
                      for(i=0;i<5;i++)//寻找EC的隶属度
                              if(dError>SubEC[i].A0)
                              {//找到第一个隶属度函数
                                      if(dError<=SubEC[i].A1)
                                      {//第一段
                                              if(SubEC[i].A0==(-127))
                                              {//负无穷
                                                      FzE[0]=255;
                                              }
                                              else
                                              {//
                                                      x1=255.0*(dError-SubEC[i].A0)/(SubEC[i].A1-SubEC[i].A0);
                                                      x1+=0.5;
                                                      FzE[0]=(char)x1;                                
                                              }
                                      }
                                      else if(dError<=SubEC[i].A2)
                                      {//第二段
                                              FzE[0]=255;//1.0的隶属度
                                      }
                                      else
                                      {//第三段
                                              if(SubEC[i].A3==127)
                                              {//负无穷
                                                      FzE[0]=255;//1.0的隶属度
                                              }
                                              else
                                              {//
                                                      x1=255.0-255.0*(dError-SubEC[i].A2)/(SubEC[i].A3-SubEC[i].A2);
                                                      x1+=0.5;
                                                      FzE[0]=(char)x1;
                                              }
                                      }
                                      
                                      //第二个隶属度
                                      
                                      if(i!=4)
                                      {//并非最后一个
                                              i++;
                                              if(dError<SubEC[i].A0)
                                              {
                                                      FzEC[1]=0;
                                              }
                                              if(dError<=SubEC[i].A1)
                                              {//第一段
C51 COMPILER V7.50   FUZZYPID                                                              09/16/2006 22:10:57 PAGE 4   

                                                      x1=255.0*(dError-SubEC[i].A0)/(SubEC[i].A1-SubEC[i].A0);
                                                      x1+=0.5;
                                                      FzE[1]=(char)x1;
                                              }
                                              else if(dError<=SubEC[i].A2)
                                              {//第二段
                                                      FzE[1]=255;//1.0的隶属度
                                              }
                                              else
                                              {//第三段
                                                      if(SubEC[i].A3==127)
                                                      {//正无穷
                                                              FzE[1]=255;//1.0的隶属度
                                                      }
                                                      else
                                                      {//
                                                              x1=255.0-255.0*(dError-SubEC[i].A2)/(SubEC[i].A3-SubEC[i].A2);
                                                              x1+=0.5;
                                                              FzE[1]=(char)x1;
                                                      }
                                              }
                                      }
                                      else
                                      {
                                              FzE[1]=FzE[0];
                                              FzE[1]=0;
                                      }
                                      break;
                              }//end of if
                      k1=i;//k1为第二维
              
                      //△Kp反模糊化
                      x1= FzE[0]*FzEC[0]*FzP_Rule[k1-1][k0-1]+
                              FzE[1]*FzEC[0]*FzP_Rule[k1-1][k0]+
                              FzE[0]*FzEC[1]*FzP_Rule[k1][k0-1]+
                              FzE[1]*FzEC[1]*FzP_Rule[k1][k0];
                      x2= FzE[0]*FzEC[0]+FzE[0]*FzEC[1]+FzE[1]*FzEC[0]+FzE[1]*FzEC[1];
              
                      x1=x1/x2;//已经被放大
              
              
                      ////△Ki反模糊化
                      x3= FzE[0]*FzEC[0]*FzI_Rule[k1-1][k0-1]+
                              FzE[1]*FzEC[0]*FzI_Rule[k1-1][k0]+
                              FzE[0]*FzEC[1]*FzI_Rule[k1][k0-1]+
                              FzE[1]*FzEC[1]*FzI_Rule[k1][k0];
              //      x2= FzE[0]*FzEC[0]+FzE[0]*FzEC[1]+FzE[1]*FzEC[0]+FzE[1]*FzEC[1];
              
                      x3=x3/x2;//已经被放大
              
                      //Fuzzy Output:Pi arithmetic
              
              }
              
              
              ///------------------------------------------------------------------------------
              #endif


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   ----    ----
   CONSTANT SIZE    =   ----    ----
C51 COMPILER V7.50   FUZZYPID                                                              09/16/2006 22:10:57 PAGE 5   

   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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