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

📄 pid.asm

📁 PID温度控制程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;定义各标志位和存储单元
;-------------------------------------------------------------
00E0_ZF   BIT 7FH
E_ZF    BIT 7EH
E0_E1_ZF BIT 76H
KEY_T  BIT 7DH
DIS_T  BIT 7CH
CAIY_T BIT 7BH
PID_T  BIT 7AH
K1_1   BIT 79H                ;设置状态位—闪显判断
KEYDOWN BIT 78H
B_0   BIT  77H                 ;脉宽处理过标志

RR1  EQU  30H
LED_NO  EQU 49H               ;显示第N个LED
CAIYANG_H EQU  66H            ;采样高8位
CAIYANG_L EQU  65H            ;采样低8位
CAIYANG_L0 EQU 63H
CAIYANG_H0 EQU 64H
PWM_1     EQU  69H            ;脉宽控制高电平
PWM_11    EQU  6AH
EMAX_L    EQU 6CH
EMAX_H    EQU 6DH
PWM_0     EQU  6EH            ;脉宽控制低电平
PWM_00    EQU  6FH

SHEDING_L EQU  4CH
SHEDING_H EQU  4DH
E0_L      EQU  50H
E0_H      EQU  51H
E0MAX_L   EQU  52H    ;最大偏差
E0MAX_H   EQU  53H

KP        EQU  20H             ;设置PID参数
KI        EQU  21H
KD        EQU  22H
U0_L      EQU  23H
U0_H      EQU  24H
                   ;U=U0+[KP*E0+KI*E+KD*(E0-E1)]-U0(U0用于保证U在进行方括号内容时不变成负)
KPE0_L    EQU  25H ;因子KP*E0
KPE0_H    EQU  26H ;因子KI*E+KD
KIE_L     EQU  27H ;因子KD*(E0-E1)
KIE_H     EQU  28H
KDE0_E1_L EQU  29H
KDE0_E1_H EQU  2AH
E1_L      EQU  2BH
E1_H      EQU  2CH
E0_E1     EQU  2DH
;2EH,2FH用于标志位
E_L    EQU 58H
E_H    EQU 59H
U_L    EQU 5AH
U_H    EQU 5BH
UMAX_L EQU 5CH   ;最大U
UMAX_H EQU 5DH
UMIN_L EQU 5EH   ;最小U
UMIN_H EQU 5FH


;40H~47H        LED显示缓存区
;60h~62h        16to10的中间缓存
;4DH,4CH        设定值
;66H,65H        采样值
;50H,51H        偏差E0
;52H,53H        E0max
;58H,59H        E
;5AH,5BH        EMAX



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

ORG 0000H

LJMP MAIN
ORG 000BH
LJMP T0_INT
;-----------------------------------------------------
;主程序
;-----------------------------------------------------

ORG 0100H
MAIN:
;----------------------------------------------------
;初始化
;----------------------------------------------------
     MOV SP,#70H
     MOV TMOD,#52H     ;T0定时,T1计数
     CLR EA
     CLR TR0
     CLR TR1
     CLR TF0
     CLR TF1
     CLR KEY_T
     CLR K1_1
     CLR DIS_T
     CLR CAIY_T
     CLR PID_T
     CLR P1.1
     CLR KEYDOWN
MOV TL0,#00H
MOV TH0,#00H
MOV TL1,#00H
MOV TH1,#00H
MOV R7,#04H    ;对250us周期的计数
MOV R6,#100    ;用于对R7计数(R7 1~4计数周期)
MOV R5,#10    ;用于对R6计数周期数计数(R6 1~100计数)
MOV R4,#02H    ;用于对R5计数周期数计数(R5 1~10计数)
MOV R1,#40H

MOV RR1,#08H   ;8个LED
MOV LED_NO,#0F0H
MOV 67H,#0ACH
MOV 68H,#0AH                ;0度值

MOV KP,#35H
MOV KI,#05H
MOV KD,#05H

MOV UMAX_L,#80H
MOV UMAX_H,#0B0H
MOV UMIN_L,#00H
MOV UMIN_H,#01H
MOV E0MAX_L,#05H
MOV E0MAX_H,#00H
MOV EMAX_L,#0EH
MOV EMAX_H,#00H
MOV E_L,#00H
MOV E_H,#00H
MOV E1_L,#00H
MOV E1_H,#00H
MOV PWM_00,#00H
SETB EA
SETB TR0
SETB TR1
SETB ET0
;----------------------------------------------------------
;实验数据
;----------------------------------------------------------
MOV 40H,#00H
MOV 41H,#00H
MOV 42H,#03H
MOV 43H,#01H
MOV 44H,#05H
MOV 45H,#06H
MOV 46H,#07H
MOV 47H,#08H
MOV PWM_0,#3
MOV PWM_1,#3
;------------------------------------------------------------------




START:;LCALL WRITE_LED
;CJNE R7,#04H,PWM_J
      ;LCALL PWM_C

 PWM_J:CJNE R6,#100,PID_J
        LCALL READ_KEY
 PID_J:   CJNE R4,#02H,START
          LCALL PID
      SJMP START
;SJMP $
;-----------------------------------------------------
;读键盘
;-----------------------------------------------------
READ_KEY:
;-------------------------------


    LL1:;JB KEYDOWN,RETURN
         MOV A,P2
         ANL  A,#0F0H
         CJNE A,#0F0H,READ
         RET                 ;无动作返回

   READ:
       ; SETB KEYDOWN           ;置按键标志位
        CJNE A,#070H,LL3
        SJMP KEY4
    LL3:CJNE A,#0B0H,LL4
        SJMP KEY3
    LL4:CJNE A,#0D0H,LL5
        SJMP KEY1
    LL5:CJNE A,#0E0H,LL6
        SJMP KEY2
    LL6:RET

KEY1:JB K1_1,K1RETURN

LOOP1:
     MOV A,P2
     ANL A,#0F0H
     CJNE A,#0F0H,LOOP1                ;判断按键是否松开
     ;CLR KEYDOWN
     CPL K1_1
     MOV R3,#04H
     MOV R0,#43H
     RET
KEY2:JNB K1_1,RETURN
LOOP2:MOV A,P2
     ANL A,#0F0H
     CJNE A,#0F0H,LOOP2            ;判断键是否松开
     ;CLR KEYDOWN
     DEC R0
     DJNZ R3,RETURN

       MOV R0,#043H         ;移位循环回百位
       MOV R3,#04H
       RET
KEY3:JNB K1_1,RETURN
LOOP3:MOV A,P2
      ANL A,#0F0H
      CJNE A,#0F0H,LOOP3
     ; CLR KEYDOWN
;----------------------
     MOV A,@R0
     INC A
     CJNE A,#0AH,SS1
     MOV A,#00H
  SS1:MOV @R0,A
     RET
KEY4:JNB K1_1,RETURN
LOOP4:MOV A,P2
     ANL A,#0F0H
     CJNE A,#0F0H,LOOP4
   ;  CLR KEYDOWN
;---------------------------------
     MOV A,@R0
     CJNE A,#00H,SS2
     MOV A,#0AH
 SS2:DEC A
     MOV @R0,A
     RET

RETURN:;CLR KEYDOWN
       RET
K1RETURN:  MOV A,P2
           ANL A,#0F0H
           CJNE A,#0F0H,K1RETURN           ;按键松开
         CPL K1_1

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

;----------------------------------------------
        ; CLR KEYDOWN
         RET                                ;无效返回
;------------------------------------------------
;写LED
;------------------------------------------------------
WRITE_LED:
          PUSH PSW
          PUSH A

          MOV A,R2
          PUSH A
WR_1:
     MOV DPTR,#TAB

AAA2:MOV A,@R1                    ;R1指向40H~47H显示缓冲区		
     CJNE R1,#41H,HH1             ;带小数点位
     ADD A,#11H
     SJMP HH2

HH1:CJNE R1,#45H,HH2              ;带小数点位
    ADD A,#11H

HH2:MOVC A,@A+DPTR
     INC R1
     INC LED_NO

WRITE:
      MOV R2,#08H      ;每次写进去8位
      CLR P1.6
      MOV P2,#0FFH
LOOP: RRC A
      MOV P1.7,C
      NOP
      SETB P1.6
      NOP
      CLR  P1.6
      DJNZ R2,LOOP
      MOV P2,LED_NO
    DJNZ RR1,RET1
      MOV LED_NO,#0F0H
      MOV RR1,#08H
      MOV R1,#40H

RET1:POP A
     MOV R2,A
     POP A

     POP PSW
     RET
TAB:DB 0D7H,014H,0CDH,05DH,01EH,05BH,0DBH,015H,0DFH,05FH
     ; 0    1    2    3    4    5    6    7    8    9
    DB 00FH,09EH,0C2H,08FH,082H,0D7H,00H,0F7H,034H,0EDH
     ; G    H    L    P    I    D   NON  0.  1.   2.
    DB 07DH,03EH,07BH,0FBH,035H,0FFH,07FH
     ; 3.   4.   5.   6.   7.   8.   9.
;-------------------------------------------------------------------
;采样
;--------------------------------------------------------------------
CAIYANG:
;...........................................................................

        MOV CAIYANG_L,TL1
        MOV CAIYANG_H,TH1

        MOV TH1,#00H
        MOV TL1,#00H
        LCALL DHF                    ;十进制转BCD
        RET
;--------------------------------------------------------------------
;PID处理
;--------------------------------------------------------------------

PID:

JNB PID_T,PID1
       RET             ;如已经处理过就返回
 PID1:  PUSH A          ;入栈保护
       PUSH B
       PUSH PSW
       MOV A,R5
       PUSH A
       MOV A,R3
       PUSH A
       MOV A,R4
       PUSH A
       MOV A,R0
       PUSH A
       MOV A,R2
       PUSH A

    MOV R0,#43H
    MOV R2,#03H
    LCALL BCDB
    MOV SHEDING_H,R3
    MOV SHEDING_L,R4                ;得到设定值
    ;------------------------------------------------------------
    ;PID运算
    ;------------------------------------------------------
      CLR C
      MOV A,SHEDING_L
      SUBB A,CAIYANG_L0
      MOV E0_L,A
      MOV A,SHEDING_H
      SUBB A,CAIYANG_H0
      MOV E0_H,A
      JC  JJ0
      CLR E0_ZF
      LJMP DD00
    ;-----------------------
    JJ0:CLR C
        MOV A,CAIYANG_L0
        SUBB A,SHEDING_L
        MOV E0_L,A
        MOV A,CAIYANG_H0
        SUBB A,SHEDING_H
        MOV E0_H,A
        SETB E0_ZF

   DD00:LCALL E0_MAX
        JC DD0
        JB E0_ZF,DJ1
        LJMP U_UMAX
    DJ1:LJMP U_UMIN
    ;---------------------------------
    ;求E
    ;----------------------------------
    DD0:JB E0_ZF,DD3
        JB E_ZF,DD4
        ;-------------------
        LCALL SAMEF
        LJMP GET_U
        ;------------------
        DD3:JB E_ZF,JJ1
        ;-------------------
        LCALL UNSAMEF
        LJMP GET_U

JJ1:   LCALL SAMEF

⌨️ 快捷键说明

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