📄 pid.asm
字号:
;定义各标志位和存储单元
;-------------------------------------------------------------
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 + -