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

📄 fuzzy_pid.lst

📁 针对被控对象存在的大惯性、纯滞后的特点,采用了模糊控制方式的控制策略,设计了一种高精度温度控制算法
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   FUZZY_PID                                                             01/17/2007 13:01:08 PAGE 9   

 488   1      }
 489           
 490          /***************************************************************************************************
 491                                                                                                                                  50ms定时子程序
 492          说明: 
 493          ***************************************************************************************************/
 494          void time0_50ms(void) interrupt 1
 495          {
 496   1              TL0=-50000%256;
 497   1              TH0=-50000/256;
 498   1      
 499   1              count[2]++;
 500   1      
 501   1              if(count[2]==count[0])
 502   1                      {
 503   2                              outPCM=1;                               //停电
 504   2                              LED3=1;                                 //通电指示灯灭 
 505   2                      }
 506   1              if(count[2]==count[1])          //采样周期到 
 507   1                      {
 508   2                              count[2]=0;     
 509   2                              read_flag=1;
 510   2                              LED2=~LED2;     
 511   2                              serial_flag=1;          //串口发送数据标志
 512   2                       }
 513   1              // serial_flag=1;               //串口发送数据标志
 514   1               
 515   1      //      if(serial_flag)
 516   1      //              {
 517   1      //                      printf("%d",Temp[4]);
 518   1                      //printf("*");
 519   1      //              }
 520   1      }
 521          /***************************************************************************************************
 522                                                                                                                          得到输出通电时间 
 523          ***************************************************************************************************/
 524          void take_time(void)
 525          {
 526   1              uchar column;
 527   1              uchar row;
 528   1      
 529   1              
 530   1              column=table_E();
 531   1              row=table_Ec();                                                 //得到输出控制规则表的行列 
 532   1              outTime=para[2]*Ucontrol[column][row];  
 533   1              count[0]=outTime*20;            //计算通电时间所需的中断次数  
 534   1      }
 535          /***************************************************************************************************
 536                                                                                                                                  输出控制 
 537          ***************************************************************************************************/
 538          void out_control(void)
 539          {
 540   1      
 541   1              
 542   1              if(outTime==0)
 543   1                      outPCM=1;
 544   1              else
 545   1                      {
 546   2                      outPCM=0;                                       //通电
 547   2                      LED3=0;                                         //通电指示灯亮 
 548   2                      }
 549   1              TR0=1;                                          //开启定时器 
C51 COMPILER V7.06   FUZZY_PID                                                             01/17/2007 13:01:08 PAGE 10  

 550   1      }
 551          /***************************************************************************************************
 552                                                                                                                                  随机模式
 553          ***************************************************************************************************/
 554          void rand_model(void)   
 555          {
 556   1              LED4=1;
 557   1              LED5=1;
 558   1              LED6=0;                                                 //相应指示灯亮
 559   1      
 560   1      //      outTime=0;
 561   1              
 562   1              show_LED[3]=11;
 563   1              show_LED[4]=10;
 564   1              show_LED[5]=12;                                 //设定显示值
 565   1              while(1)
 566   1              {
 567   2              
 568   2                      RdTemp();                                       //读取温度
 569   2                      show_LED[0]=Temp[0];
 570   2                      show_LED[1]=Temp[1];
 571   2                      show_LED[2]=Temp[2];
 572   2      
 573   2                      delay(1);                                       //延时1ms 以便读取 正确的温度 ,延时不够便显示初始温度85    
 574   2                      show();
 575   2                      Temp[5]=Temp[4];                   //记录当前温度
 576   2                      
 577   2                      keyscan();
 578   2                      if(button==4||button==1)           //模式转换
 579   2                              {
 580   3                                      TR0=0;
 581   3                                      break;
 582   3                              }
 583   2              /*      if(button==4)                           //进入测控模式
 584   2                              break;
 585   2                      if(button==1)                           //进入修改模式
 586   2                              {
 587   2                                      TR0=0;
 588   2                                      break;
 589   2                              }*/     
 590   2              }
 591   1       }
 592          /***************************************************************************************************
 593                                                                                                                                  修改模式
 594          ***************************************************************************************************/
 595          void trange_model(void)
 596          {
 597   1              LED4=1;
 598   1              LED5=0;
 599   1              LED6=1;                                                                         
 600   1              
 601   1              while(1)
 602   1              {
 603   2                      keyscan();
 604   2                      switch(button)
 605   2                              {
 606   3                                      case 1:select_para();break;
 607   3                                      case 2:Add_para();break;
 608   3                                      case 3:delect_para();break;
 609   3                              //      case 4:TR0=0;break;
 610   3                                      default:break;
 611   3                               }
C51 COMPILER V7.06   FUZZY_PID                                                             01/17/2007 13:01:08 PAGE 11  

 612   2                      if(button==4)                                                   //进入测控模式
 613   2                              {
 614   3                                      TR0=0;
 615   3                                      break;
 616   3                              }
 617   2                      show_LED[0]=para[parameter]/10;
 618   2                      show_LED[1]=para[parameter]%10;
 619   2                      show_LED[2]=12;
 620   2                      show_LED[3]=12;
 621   2                      show_LED[4]=12;
 622   2                      show_LED[5]=parameter+1;
 623   2                      show();
 624   2              }
 625   1              count[1]=para[0]*20;                                            //采样次数 
 626   1      }
 627          /***************************************************************************************************
 628                                                                                                                                  测控模式
 629          ***************************************************************************************************/
 630          void control_model(void)
 631          {
 632   1              LED4=0;                         
 633   1              LED5=1;
 634   1              LED6=1;
 635   1      
 636   1              LED3=1;
 637   1              read_flag=1;
 638   1              serial_flag=1;
 639   1      
 640   1              TR1=1;
 641   1              TI=1;
 642   1              while(1)
 643   1                      {
 644   2                              RdTemp();
 645   2                      
 646   2                              if(read_flag)
 647   2                                      {
 648   3                                              Temp[6]=Temp[4] ;                                                       //得到即时温度 
 649   3                                              take_time();                    //得到通电时间 
 650   3                                              out_control();                  //输出控制 
 651   3                                              read_flag=0;
 652   3                                              Temp[5]=Temp[6];                        //纪录上次温度 
 653   3                                      }
 654   2      
 655   2                              show_LED[0]=Temp[0];
 656   2                              show_LED[1]=Temp[1];
 657   2                              show_LED[2]=Temp[2];
 658   2                              show_LED[3]=12;
 659   2                              show_LED[4]=outTime/10;
 660   2                              show_LED[5]=outTime%10; 
 661   2                              show();
 662   2                              
 663   2                              if(serial_flag)
 664   2                                      {
 665   3                                              printf("%d\n",(uint)Temp[4]);
 666   3                                              //printf("*");
 667   3                                              serial_flag=0;
 668   3                                      }
 669   2      
 670   2                              keyscan();
 671   2                              if(button==1||button==2)                  //模式转换
 672   2                                      {
 673   3                                              TR0=0;
C51 COMPILER V7.06   FUZZY_PID                                                             01/17/2007 13:01:08 PAGE 12  

 674   3                                              TR1=0;
 675   3                                              outPCM=1;
 676   3                                              break;
 677   3                                      }
 678   2                                      
 679   2                      }  
 680   1      }
 681          /***************************************************************************************************
 682                                                                                                                                  初始化子程序
 683          ***************************************************************************************************/
 684          void Initial(void)
 685          {
 686   1              EA=1;                                                             //开启中断允许
 687   1              ET0=1;                                                            //允许定时器0中断
 688   1              TMOD=0x21;                                                       //设定定时器0,工作方式1
 689   1              TL0=-50000%256;                                         //初始化定时器0,定时50ms  
 690   1              TH0=-50000/256; 
 691   1      
 692   1              TL1=0XFD;                                                       //设置波特率9600bps
 693   1              TH1=0XFD;       
 694   1              SCON=0X50;                                                      //串口控制寄存器,工作方式1(8位异步接受/发送器)允许接收
 695   1      
 696   1              count[1]=para[0]*20;                            //采样次数      
 697   1      }
 698          /***************************************************************************************************
 699                                                                                                                                  主程序
 700          ***************************************************************************************************/
 701          void main(void)
 702          {
 703   1              Initial();                                                                                                      //初始化
 704   1              while(1)
 705   1                      {
 706   2                              show();                                                                                         //开机显示200701
 707   2                              keyscan();                                                                                      //扫面键盘
 708   2                              while(button)
 709   2                                      {
 710   3                                              switch(button)
 711   3                                                      {
 712   4                                                              case 1:trange_model();break;            //进入修改模式
 713   4                                                              case 2:rand_model();break;                      //进入随机模式
 714   4                                                              case 4:control_model();break;           //进入测控模式
 715   4                                                              default:button=0;                                       //进入开启状态
 716   4                                                        }
 717   3                                        }
 718   2                      }
 719   1                      
 720   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1149    ----
   CONSTANT SIZE    =     82    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     25    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2       3
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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