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

📄 pid.asm

📁 PID温度控制程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
       LJMP  GET_U
       ;------------------------

DD4:   LCALL UNSAMEF
       LJMP GET_U

GET_U:
;-----------------------------------
;求E0-E1
;-----------------------------------
        CLR C
        MOV A,E0_L
        SUBB A,E1_L
        JC KKK01
        CLR E0_E1_ZF
        MOV E0_E1,A
        SJMP BILI
   KKK01:SETB E0_E1_ZF
         CLR C
         MOV A,E1_L
         SUBB A,E0_L
         MOV E0_E1,A
         SJMP BILI
   BILI:MOV B,KP
        MOV A,E0_L
        MUL AB
        MOV KPE0_L,A
        MOV KPE0_H,B
        SJMP JIFEN
   JIFEN:MOV B,KI
         MOV A,E_L
         MUL AB
         MOV KPE0_L,A
         MOV KPE0_H,B
         SJMP WEIFEN
   WEIFEN:MOV B,KD
          MOV A,E0_E1
          MUL AB
          MOV KDE0_E1_L,A
          MOV KDE0_E1_H,B
          SJMP GOT_U
  ;------------------------------
  ;通过已得到的各因子计算U
  ;------------------------------------
  GOT_U:
  GOT_U01:MOV U0_L,#8AH
          MOV U0_L,#61H
          JB E0_ZF,TT01
          CLR C
          MOV A,U0_L
          ADD A,KPE0_L
          MOV U_L,A
          MOV A,U0_H
          ADDC A,KPE0_H
          MOV U_H,A
          JC U_UMAX
        SJMP GOT_U02
     TT01:CLR C
          MOV A,U0_L
          SUBB A,KPE0_L
          MOV U_L,A
          MOV A,U0_H
          SUBB A,KPE0_H
          MOV U_H,A
          JC U_UMIN
        SJMP GOT_U02
  GOT_U02:JB E_ZF,TT02
          CLR C
          MOV A,U_L
          ADD A,KIE_L
          MOV U_L,A
          MOV A,U_H
          ADDC A,KIE_H
          MOV U_H,A
          JC U_UMAX
       SJMP GOT_U03
    TT02:  CLR C
           MOV A,U_L
           SUBB A,KIE_L
           MOV U_L,A
           MOV A,U_H
           SUBB A,KIE_H
           MOV U_H,A
           JC U_UMIN
           SJMP GOT_U03
     GOT_U03:JB E0_E1_ZF,TT03
             CLR C
             MOV A,U_L
             ADD A,KDE0_E1_L
             MOV U_L,A
             MOV A,U_H
             ADDC A,KDE0_E1_H
             MOV U_H,A
             JC U_UMAX
           SJMP GOT_U_END
       TT03: CLR C
             MOV A,U_L
             SUBB A,KDE0_E1_L
             MOV U_L,A
             MOV A,U_H
             SUBB A,KDE0_E1_H
             MOV U_H,A
             JC U_UMIN
             SJMP GOT_U_END
     GOT_U_END:CLR C
               MOV A,U_L
               SUBB A,U0_L
               MOV U_L,A
               MOV A,U_H
               SUBB A,U0_H
               MOV U_H,A
               JC U_UMIN
    ;-----------------------------------------
              SJMP U_IS_UMAX
      U_UMAX: MOV U_L,UMAX_L               ;赋最大U
              MOV U_H,UMAX_H
              MOV E1_L,E0_L
              SJMP DDDDD
      U_UMIN: MOV U_L,UMIN_L               ;赋最小U
              MOV U_H,UMIN_H
              MOV E1_L,E0_L

              SJMP DDDDD
     ;----------------------------------------
      U_IS_UMAX:CLR C
                MOV A,U_L
                SUBB A,UMAX_L
                MOV A,U_H
                SUBB A,UMAX_H
                JNC U_UMAX
   DDDDD:     MOV E1_L,E0_L
              MOV E1_H,E0_H
              SJMP GET_PWM
;--------------------------------------
;由U得出PWM
;------------------------------------------
GET_PWM:MOV PWM_0,U_H
        MOV A,#0FFH
        SUBB A,U_H
        MOV PWM_1,A


  SETB PID_T              ;置处理标志位
  LJMP OUT_A




;---------------------------------
;
;---------------------------
 E0_MAX:CLR C
        MOV A,E0_L
        SUBB A,E0MAX_L
        MOV 6AH,A
        MOV A,E0_H
        SUBB A,E0MAX_H
        MOV 6BH,A
        JC DJ2
        MOV E0_L,E0MAX_L
        MOV E0_H,E0MAX_H
    DJ2:RET


;-------------------------------------------
;当E0与E同号时...
;-------------------------------------------
SAMEF:CLR C
      MOV A,E_L
      ADD A,E0_L
      MOV E_L,A
      MOV A,E_H
      ADDC A,E0_H
      MOV E_H,A
      JC E_EMAX
      MOV E_L,EMAX_L
      MOV E_H,EMAX_H
  E_EMAX:CLR C
         MOV A,E_L
         SUBB A,EMAX_L
         MOV A,E_H
         SUBB A,EMAX_H
         JC JJ2
         MOV E_L,EMAX_L
         MOV E_H,EMAX_H
     JJ2:RET
;-------------------------------
;当E0与E异号时...
;-------------------------------
UNSAMEF:CLR C
        MOV A,E_L
        SUBB A,E0_L
        MOV E_L,A
        MOV A,E_H
        SUBB A,E0_H
        MOV E_H,A
        JC JJ3
        RET

JJ3:  CPL E_ZF
      MOV A,E0_L
      SUBB A,E_L
      MOV E_L,A
      MOV A,E0_H
      SUBB A,E_H
      MOV E_H,A


;------------------------------------------------------

 OUT_A:         POP A               ;处理完毕,出栈
          MOV R2,A
          POP A
          MOV R0,A
          POP A
          MOV R4,A
          POP A
          MOV R3,A
          POP A
          MOV R5,A
          POP PSW
          POP B
          POP A
          SETB PID_T

          RET

;--------------------------------------------------------
;双字节二进制数转十进制    非压缩
;----------------------------------------------------------
 DHF:CLR C
     MOV A,CAIYANG_L
     SUBB A,67H
     MOV CAIYANG_L,A
     MOV CAIYANG_L0,A
     MOV A,CAIYANG_H
     SUBB A,68H
     MOV CAIYANG_H,A
     MOV CAIYANG_H0,A                  ;采样值减去0度值

      MOV A,R1
      PUSH A
      CLR A
      MOV 60H,A
      MOV 61H,A
      MOV 62H,A
      MOV R2,#10H
CHANG_1:MOV A,CAIYANG_L
        RLC A
        MOV CAIYANG_L,A
        MOV A,CAIYANG_H
        RLC A
        MOV CAIYANG_H,A
        MOV    A,60H
        ADDC A,60H
        DA A
        MOV 60H,A
        MOV A,61H
        ADDC A,61H
        DA A
        MOV 61H,A
        MOV A,62H
        ADDC A,62H
        DA A
        MOV 62H,A
        DJNZ R2,CHANG_1               ;处理两个字节

JIEYA:MOV A,60H
      ANL A,#0FH
      MOV 44H,A             ;
      MOV A,60H
      ANL A,#0F0H
      SWAP A
      MOV 45H,A             ;
      MOV A,61H
      ANL  A,#0FH
      MOV 46H,A             ;
      MOV A,61H
      ANL A,#0F0H
      SWAP A
      MOV 47H,A             ;

        POP A
        MOV R1,A
        RET
  ;-----------------------------------------------------------------
 ;非压缩BCD码转二进制
 ;-----------------------------------------------------------------
;待转换数据最高地址在R0,字节数减1放在R2
BCDB:
       MOV R3,#00H
       MOV A,@R0
       MOV R4,A
LOOP01:MOV A,R4
       MOV B,#10
      MUL AB
      MOV R4,A
      MOV R5,B
      MOV B,#10
      XCH A,R3
      MUL AB
      ADD A,R5
      MOV R3,A
      XCH A,R4
      DEC R0
      ADD A,@R0
      XCH A,R4
      MOV A,R3
      ADDC A,#0
      MOV R3,A
      DJNZ R2,LOOP01

        RET
;-----------------------------------------------------------------
;脉宽控制子程序
;-------------------------------------------------------------------
PWM_C:PUSH PSW
      PUSH A
      JB B_0,SSS1
      JNB P1.0,SUB_0
      SJMP SUB_1
SUB_0:CLR P1.0
      MOV PWM_11,PWM_1
      DEC PWM_00
      MOV A,PWM_00

      CJNE A,#00H,SSS1
      SJMP SUB_1
SSS1:SETB B_0             ;置处理过标志
      POP A
      POP PSW
      RET

SUB_1:SETB P1.0
      MOV PWM_00,PWM_0
      DEC PWM_11
      MOV A,PWM_11
      CJNE  A,#00H,SSS2
      SJMP SUB_0

 SSS2:SETB B_0
     POP A
     POP PSW
     RET
;-----------------------------------------------------------------
;T0中断子程序
;-----------------------------------------------------------------
;因读键盘程序若放在中断中会影响其他程序正常执行,故读键盘不用T0中断调用;而PID计算部分程序较长,也不放在其中。
T0_INT:
       DJNZ R7,TT1
       SJMP MM1
   TT1:RETI
   MM1:
       MOV R7,#04H   
       CLR B_0 
       LCALL WRITE_LED           ;调用显示
       LCALL PWM_C
       DJNZ R6,TT2
       SJMP MM2
  TT2: RETI

  MM2:
       MOV R6,#100
       DJNZ R5,TT3
       SJMP MM3
TT3:   RETI


   MM3:
       MOV R5,#10
       LCALL CAIYANG          ;调用采样
       DJNZ R4,TT4
       SJMP MM4
  TT4: RETI

   MM4:MOV R4,#02H
       CLR PID_T              ;清PID处理过标志
       RETI





⌨️ 快捷键说明

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