📄 pid.asm
字号:
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 + -