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

📄 改猛.txt

📁 运用模糊算法和PID调节控制开关磁阻电机的调速。采用的单片机是Intel的80c196KB,编程语言为PL/M.
💻 TXT
📖 第 1 页 / 共 3 页
字号:
        ELSE CALL PWM_OUT;
      END;
      ELSE IF AIM_SPD>300 THEN DO;
        IF RUN_SPD<(AIM_SPD-300) THEN DO;
          IF ZXS>20 THEN DO;
            ZXS=1;
            CALL PWM;
          END;
          ELSE CALL PWM_OUT;
        END;
        ELSE DO;
          IF ZXS>30 THEN DO;
            ZXS=1;
            CALL PWM;
          END;
          ELSE CALL PWM_OUT;
        END;
      END;
      ELSE DO;
        IF ZXS>600 THEN DO;
            ZXS=1;
            CALL PWM;
        END;
        ELSE CALL PWM_OUT;
      END;
    END;
        
        
        
        IF (PIN=0 AND QIN=0) THEN
             ORDER=0;
        ELSE IF (PIN=0 AND QIN=1) THEN
             ORDER=1;
        ELSE IF  (PIN=1 AND QIN=0) THEN
             ORDER=2;
        ELSE  IF  (PIN=1 AND QIN=1) THEN
             ORDER=3;

       IF START_SIGN=1 THEN
          CALL HSO_PROCESS;
       ELSE    DO;

        IF RUN_SPD>400  THEN    CALL STOP;
              ELSE DO;
               AA=1;
               BB=1;
               CC=1;
               DD=1;


              END;
             END;




         P2=2FH;


           IF  RUN_SPD>=350 THEN DO;
         SPD_JS=SPD_JS+1;
         IF SPD_JS=12 THEN DO;
         P2=1FH;
          SPD_JS=0;
        LL1=T8253_0;
        LL2=T8253_0;

         SPD1=LL2*256+LL1;
         SPD1=0FFFFH-SPD1;
          RUN_SPD=  39063/SPD1 ;

          RUN_SPD=RUN_SPD*12;
          RUN_SPD=RUN_SPD-RUN_SPD/10+45;
         CON_8253=30H;
        T8253_0=0FFH;
        T8253_0=0FFH;
          P2=0FFH;
         END;
         END;

        ELSE    DO;

         P2=1FH;
          SPD_JS=0;
        LL1=T8253_0;
        LL2=T8253_0;

         SPD1=LL2*256+LL1;
         SPD1=0FFFFH-SPD1;
          RUN_SPD=  39063/SPD1 ;


         CON_8253=30H;
        T8253_0=0FFH;
        T8253_0=0FFH;
          P2=0FFH;
        END;


         IF RUN_SPD>=100 THEN DO;
        MM=MM+1;
        IF MM=100 THEN
        DO;
         MM=0;
         DISP_STATUS=0;
         CALL DISPLAY;
         END;
         END;






       ENABLE;
       END INT0;


/***********内部计数器0****************/
T0:PROCEDURE INTERRUPT 1;
DISABLE;
  IF DIRECT=0 THEN                 /*正转*/
       DO;
       IF S_T0=1  THEN
       DO;
       TR0=0;
       AA=0;

           S_T0=2;
           TH0=(0FFFFH-324 )/100H ;
           TL0=(0FFFFH-324 )-TH0*100H;
           TR0=1;



       END;
       ELSE IF S_T0=0  THEN
       DO;
       CC=0;
       TR0=0;
          S_T0=3;
           TH0=(0FFFFH-324 )/100H ;
           TL0=(0FFFFH-324 )-TH0*100H;
           TR0=1;
       END;
       ELSE IF S_T0=2  THEN

       AA=1;

       ELSE IF S_T0=3  THEN

       CC=1;


        ELSE IF S_T0=4 THEN
       DO;
       CC=1;
       AA=0;
       END;
       ELSE IF S_T0=5 THEN
       DO;
       AA=1;
       CC=0;
       END;

       ELSE IF S_T0=6 THEN

        AA=0;

       ELSE IF S_T0=7 THEN
        CC=0;
       ELSE IF S_T0=8 THEN
        DO;
        CC=0;
        S_T0=10;
           TH0=(0FFFFH-256)/100H ;
           TL0=(0FFFFH-256)-TH0*100H;
           TR0=1;
        END;
        ELSE IF S_T0=9 THEN
        DO;
        AA=0;
        S_T0=11;
           TH0=(0FFFFH-256)/100H ;
           TL0=(0FFFFH-256)-TH0*100H;
           TR0=1;
        END;

        ELSE IF S_T0=10 THEN
        CC=1;
        ELSE IF S_T0=11 THEN
        AA=1;


        END;
   ELSE DO;                         /*反转*/
        IF S_T0=1  THEN
       DO;
       TR0=0;
       BB=0;
          S_T0=2;
           TH0=(0FFFFH-324 )/100H ;
           TL0=(0FFFFH-324 )-TH0*100H;
           TR0=1;
       END;
       ELSE IF S_T0=0  THEN
       DO;
       DD=0;
       TR0=0;
       S_T0=3;
           TH0=(0FFFFH-324 )/100H ;
           TL0=(0FFFFH-324 )-TH0*100H;
           TR0=1;
       END;
         ELSE IF S_T0=2  THEN

       BB=1;

       ELSE IF S_T0=3  THEN

       DD=1;
       ELSE IF S_T0=4  THEN
        DO;
        DD=1;
        BB=0;
        END;
       ELSE IF S_T0=5  THEN
       DO;
       BB=1;
       DD=0;
       END;
       ELSE IF S_T0=6  THEN
       BB=0;
       ELSE IF S_T0=7  THEN
       DD=0;

        ELSE IF S_T0=8  THEN
       DO;
       DD=0;
         S_T0=10;
           TH0=(0FFFFH-256)/100H ;
           TL0=(0FFFFH-256)-TH0*100H;
           TR0=1;
       END;
       ELSE IF S_T0=10  THEN
       DD=1;

            ELSE IF S_T0=9  THEN
       DO;
       BB=0;
         S_T0=11;
           TH0=(0FFFFH-256)/100H ;
           TL0=(0FFFFH-256)-TH0*100H;
           TR0=1;
       END;
       ELSE IF S_T0=11  THEN
       BB=1;


        END;
        ENABLE;
 END T0;
/***********内部计数器1****************/
 T1:PROCEDURE INTERRUPT 3;
 DISABLE;
  IF DIRECT=0 THEN                       /*正转*/
      DO;
       IF S_T1=1  THEN
       DO;
       TR1=0;
       BB=0;
          S_T1=2;
           TH1=(0FFFFH-324 )/100H ;
           TL1=(0FFFFH-324 )-TH1*100H;
           TR1=1;
       END;
       ELSE IF S_T1=0  THEN
       DO;
       TR1=0;
       DD=0;
       S_T1=3;
           TH1=(0FFFFH-324 )/100H ;
           TL1=(0FFFFH-324 )-TH1*100H;
           TR1=1;
       END;
       ELSE IF S_T1=2  THEN
       BB=1;
        ELSE IF S_T1=3  THEN
       DD=1;

      ELSE IF S_T1=4  THEN
      DO;
      DD=1;
      BB=0;
      END;
      ELSE IF S_T1=5  THEN
      DO;
      DD=0;
      BB=1;
      END;
       ELSE IF S_T1=6  THEN
       BB=0;
        ELSE IF S_T1=7  THEN
        DD=0;

        ELSE IF S_T1=8  THEN
      DO;
      DD=0;
      S_T1=10;
           TH1=(0FFFFH-256)/100H ;
           TL1=(0FFFFH-256)-TH1*100H;
           TR1=1;
      END;
      ELSE IF S_T1=10  THEN
        DD=1;

         ELSE IF S_T1=9  THEN
      DO;
      BB=0;
      S_T1=11;
           TH1=(0FFFFH-256)/100H ;
           TL1=(0FFFFH-256)-TH1*100H;
           TR1=1;
      END;
      ELSE IF S_T1=10  THEN
        BB=1;


        END;
   ELSE DO;                               /*反转*/
       IF S_T1=1  THEN
       DO;
       TR1=0;
       CC=0;
           S_T1=2;
           TH1=(0FFFFH-324 )/100H ;
           TL1=(0FFFFH-324 )-TH1*100H;
           TR1=1;
       END;
       ELSE IF S_T1=0  THEN
       DO;
       TR1=0;
       AA=0;
           S_T1=3;
           TH1=(0FFFFH-324 )/100H ;
           TL1=(0FFFFH-324 )-TH1*100H;
           TR1=1;
       END;
        ELSE IF S_T1=2  THEN
       CC=1;
        ELSE IF S_T1=3  THEN
       AA=1;
        ELSE IF S_T1=4  THEN
         DO;
         AA=1;
         CC=0;
         END;
         ELSE IF S_T1=5  THEN
          DO;
          CC=1;
          AA=0;
         END;
         ELSE IF S_T1=6  THEN
         CC=0;
         ELSE IF S_T1=7  THEN
         AA=0;

         ELSE IF S_T1=8  THEN
          DO;
          AA=0;
           S_T1=10;
           TH1=(0FFFFH-256)/100H ;
           TL1=(0FFFFH-256)-TH1*100H;
           TR1=1;
         END;
         ELSE IF S_T1=10  THEN
         AA=1;

           ELSE IF S_T1=9  THEN
          DO;
          CC=0;
           S_T1=11;
           TH1=(0FFFFH-256)/100H ;
           TL1=(0FFFFH-256)-TH1*100H;
           TR1=1;
         END;
         ELSE IF S_T1=11  THEN
         CC=1;




        END;
        ENABLE;
 END T1;
  /***********内部计数器2****************/
    INT5:PROCEDURE INTERRUPT 5;
      IF TF2=1 THEN
      DO;
         TF2=0;

           T2MOD=02H;
         TH2    =  00H;
         TL2    =  00H;
          RCAP2L=  00H;
         RCAP2H=  00H;

         T2CON  =  06H;
       END;




    END  INT5;
   /***********外部中断1****************/
  INT1:PROCEDURE INTERRUPT 2 ;
   DO;
        P0=0FFH;
        P2=3FH;

      IF P00=1 THEN
     CALL KEY;
      ELSE
      DO CASE S_ADC;



         ADC0=ADC0809_0;

         ADC1=ADC0809_1;

         ADC2=ADC0809_2;

         ADC3=ADC0809_3;

         ADC4=ADC0809_4;

        END;

    END;



   END INT1;
MAINPROG:DO;                     /*主程序*/

         TMOD=55H;

         T2MOD=    02H;        /*定时器2控制方式寄存器*/
         TH2    =  01H;        /*定时器2高字节*/
         TL2    =  01H;        /*定时器2低字节*/
         RCAP2L=  00H;        /*定时器2捕捉低字节*/
         RCAP2H=  00H;        /*定时器2捕捉高字节*/
         T2CON  =  085H;        /*定时器、计数器2控制寄存
器*/

         SPD3=0;
         VV=0;
        CON_8253=30H;        /*8253计数器/定时器0 初始化
*/
        T8253_0=0FFH;
        T8253_0=0FFH;

        CON_8253=0B6H;        /*8253计数器/定时器2初始化
*/
        T8253_2=07DH;
        T8253_2=00H;
        R0=0;
        R0=0;
        CON_8253=72H;
         T8253_1=01H;
         T8253_1=00H;


       IE = 08FH;                /*中断允许控制寄存器*/
         IP = 0FH;
        TCON= 01H;               /*定时器、计数器0,1控制
寄存器*/

         S_ADC=4;
         VV=0;


         RUN_SPD=0;
       DAC0832=0FFH;


       START_SIGN=0;
       DIRECT=0;
       SPD3=2;
       TI=200;

      BID=0;
      DIRECT=0;
       S_SPD=0;

       MM=0;
       A15=1;
      TR2=1;
       SPD4=0;
       START_SIGN=0;


       AIM_SPD=1000;
       KEY_TL=0;
       SPD_STEP=5;
       SIG_VSS1=0;
       E0=0;

         VSS_SPD(1)= 0 ;

       PP=1;
        TEM_S=0;
        TEM_I=0;
        PWM_V=0H;
        TT=0;
       SPD_D=80;
       ZXS=0;
        MAINLOOP:DO;      /*主循环程序*/

          DECLARE KEY_JS BYTE  ;  /*键盘延时计数控制*/
          DECLARE ADC_JS BYTE  ;     /*A/D转化延时计数控
制*/
         P2=0FH;

         IF AIM_SPD<=100 THEN PWM_V=10H;
       ELSE  IF AIM_SPD<=200 THEN PWM_V=15H;
       ELSE  IF AIM_SPD<=500 THEN PWM_V=20H;
          ELSE  IF AIM_SPD<=700 THEN PWM_V=30H;
           ELSE  IF AIM_SPD<=900 THEN PWM_V=30H;

       ELSE  PWM_V=3EH;


       IF  AIM_SPD<=100 THEN   T_V=2;
       ELSE  IF AIM_SPD<=300 THEN  T_V=4;
        ELSE  IF AIM_SPD<=500 THEN  T_V=20;
         ELSE  IF AIM_SPD<=700 THEN  T_V=30;
        ELSE  IF AIM_SPD<=900 THEN  T_V=30;
         ELSE  IF AIM_SPD<=1500 THEN  T_V=30;


         IF AIM_SPD<=500 THEN  SPD_D=3000;
        ELSE  IF AIM_SPD<=900 THEN  SPD_D=3000;
         ELSE  IF AIM_SPD<=1500 THEN  SPD_D=3000;


       IF RUN_SPD>100 THEN DO;
        TEM_S=TEM_S+1;
        IF TEM_S=5  THEN
        DO;
        IF TEM_I<1000 THEN DO;
        TEM(TEM_I)=RUN_SPD;
        TEM(TEM_I+1)=PWM_WIDTH;
          TEM_I=TEM_I+2;
           END;
          TEM_S=0;

         END;
         END;

        IF KEY_TL=1 THEN
        DO;
        KEY_JS=KEY_JS+1;
        IF KEY_JS=20 THEN
        DO;
        KEY_TL=0;
        KEY_JS=0;
        END;
        END;

      IF RUN_SPD<=100  THEN DO;
        MM=MM+1;
        IF MM= 150 THEN
        DO;
         MM=0;

         DISP_STATUS=0;
         CALL DISPLAY;
         R0=0;
         R0=0;
          R0=0;
         R0=0;
         END;
        END;
        
        
   /*  IF START_SIGN=1 THEN DO;
    TT=TT+1;
    
     
          
          
    IF TT=30    THEN DO;


   IF RUN_SPD>AIM_SPD THEN
     SPD5=RUN_SPD-AIM_SPD;
     ELSE  SPD5=AIM_SPD-RUN_SPD;
     
     

       IF SPD5>=SPD_D     THEN
    CALL PWM;

    TT=0;
    END;
    END; 
    
    */
    

















       ADC_JS=ADC_JS+1;
     IF ADC_JS=100 THEN DO;
         PP=PP+1;
         IF PP=100 THEN DO;
         SS=0;
         PP=0;
         END;
         IF S_ADC=4 THEN
            DO;
            S_ADC=0;
            ADC0809_0 =0;


            END;

          ELSE IF S_ADC=0 THEN
             DO;
              S_ADC=1;
             ADC0809_1 =0;


            END;


           ELSE IF S_ADC=1 THEN
             DO;
              S_ADC=2;
             ADC0809_2 =0;


            END;


            ELSE IF S_ADC=2 THEN
               DO;
              S_ADC=3;
             ADC0809_3 =0;


             END;


            ELSE IF S_ADC=3 THEN
               DO;
              S_ADC=4;
             ADC0809_4 =0;


            END;
          ADC_JS=0;
        END;


         IF PP=0 THEN DO;
         RUN_SPD=0;
        CALL DISPLAY;
         END;
   /*  IF START_SIGN=1 THEN DO;

      IF  (ADC0809_1>60H AND AA=0) THEN  AA=1;
      IF  (ADC0809_1<=60H AND AA=0) THEN  AA=0;


       IF  (ADC0809_2>60H AND BB=0) THEN  BB=1;
         IF  (ADC0809_2<=60H AND BB=0) THEN  BB=0;

       IF  (ADC0809_3>60H AND CC=0) THEN CC=1;
          IF  (ADC0809_3<=60H AND CC=0) THEN CC=0;
       IF  (ADC0809_4>60H AND DD=0) THEN  DD=1;
        IF  (ADC0809_4<=60H AND DD=0) THEN  DD=0;

     END; */

        CALL TIME(10);








       TR2=0;


        end;
        GOTO  MAINLOOP;

        END MAINPROG;
END  MAIN_1;





⌨️ 快捷键说明

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