📄 kongwen.txt
字号:
;此控温程序是采用PD控温方式,入口在 : BLXS 最大取值 255 WFXS 最大取值 255
; SDWDHH,SDWDHL 设定温度的16进制高低字节存储地址
; WDZHH,WDZHL 当前温度的16进制高低字节存储地址
;
; 出口在: ZSJCSH 加热时间
; ZSJCSL 不加热时间
;
; ZSJCSH+ZSJCSL=200 则一个控温周期= 200*基本定时周期
BCPCHH EQU 30H
BCPCHL EQU 31H
BLCSH EQU 32H
BLCSL EQU 33H
BLXS EQU 34H
WFXS EQU 35H
PCWFH EQU 36H
PCWFL EQU 37H
SCPCHH EQU 38H
SCPCHL EQU 39H
SDWDHH EQU 3AH
SDWDHL EQU 3BH
WDZHH EQU 3CH
WDZHL EQU 3DH
WFCSH EQU 3EH
WFCSL EQU 3FH
ZSJCSH EQU 40H
ZSJCSL EQU 41H
BLPCFH BIT 00H
SCBLPCFH BIT 01H
WFPCFH BIT 02H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;PID控温子程序需定义RAM SDWDHH SDWDHL WDZHL WDZHH BCPCHL BCPCHH SCPCHH SCPCHL
; BLXS WFXS PCWFH PCWFL WFCSL WFCSH BLCSL BLCSH ZSJCSH ZSJCSL
;
; 标志位 BLPCFH SCBLPCFH WFPCFH
PDJS: ;计算e(t) 值
CLR C
MOV A,SDWDHL ;sdwdhh,sdwdhl 存设定温度带一位小数
MOV R7,WDZHL
SUBB A,R7
MOV BCPCHL,A ;存本次偏差低8位
MOV A,SDWDHH
MOV R7,WDZHH
SUBB A,R7
MOV BCPCHH,A ;存本次偏差高8位
JC BOOLL2
CLR BLPCFH ;清比例偏差符号
BOOLL3: JB BLPCFH,JSSZ3 ;符号位为0表示正值,为1表示负值 本次比例偏差符号 为负不加热退出
JB SCBLPCFH,JSSZ2 ;符号位为0表示正值,为1表示负值 上次比例偏差符号
JMP JSSZ1
BOOLL2:
SETB BLPCFH
CLR C
MOV A,#0FFH
SUBB A,BCPCHL ;本次温度大于设定温度,求补锝实际数值 e(t)
MOV BCPCHL,A
MOV A,#0FFH
SUBB A,BCPCHH
MOV BCPCHH,A
INC BCPCHL
JMP BOOLL3
JSSZ3: MOV A,BCPCHL
MOV SCPCHL,A
MOV A,BCPCHH
MOV SCPCHH,A
JB BLPCFH,MLLP1232 ;将本次偏差数值与符号赋给上次保存地址
CLR SCBLPCFH
JMP fool2
MLLP1232:
SETB SCBLPCFH
jmp fool2
JSSZ2: CLR C ;e(t)>0 e(t-1) <0
MOV A,BCPCHL ;计算e(t)-e(t-1) 的结果,存入PCWFL,PCWFH中
ADDC A,SCPCHL
MOV PCWFL,A
MOV A,BCPCHH
ADDC A,SCPCHH
MOV PCWFH,A
CLR WFPCFH
JMP AOOL1
JSSZ1: CLR C ;到此为止,本次e(t) 值已算出,并有符号位,可判正负%%%%%%%%%%%%%%%%%%%%%%%
MOV A,BCPCHL ;计算e(t)-e(t-1) 的结果,存入PCWFL,PCWFH中
SUBB A,SCPCHL ;e(t) e(t-1) 都为正值
MOV PCWFL,A
MOV A,BCPCHH
SUBB A,SCPCHH
MOV PCWFH,A
CLR WFPCFH
JNC AOOL1 ;本次偏差>上次偏差,转走
SETB WFPCFH ;微分偏差符号置位
CLR C
MOV A,#0FFH
SUBB A,PCWFL ;本次偏差<上次偏差,求补锝实际数值
MOV PCWFL,A
MOV A,#0FFH
SUBB A,PCWFH
MOV PCWFH,A
INC PCWFL
AOOL1:
MOV A,BCPCHL
MOV SCPCHL,A
MOV A,BCPCHH
MOV SCPCHH,A
JB BLPCFH,MLLP1 ;将本次偏差数值与符号赋给上次保存地址
CLR SCBLPCFH
JMP MLLP2
MLLP1:
SETB SCBLPCFH
MLLP2:
MOV R2,BCPCHH
MOV R3,BCPCHL
MOV R4,#0 ;求kp*e(t)
MOV R5,#0
MOV R6,#0
MOV R7,BLXS
CALL MULD
MOV BLCSL,R5 ;结果送到比例常数存储
MOV BLCSH,R4
MOV R3,PCWFL
MOV R2,PCWFH
MOV R4,#0
MOV R5,#0
MOV R6,#0
MOV R7,WFXS
CALL MULD ;求kd*(e(t)-e(t-1))
MOV WFCSL,R5
MOV WFCSH,R4 ;结果送到微分常数存储
JB BLPCFH,FOOL2 ;比例相为负,不计算结果,直接赋pouth=#00 poutl=#200,退出中断
JB WFPCFH,AOOL2 ;微分项为负转走
CLR C
MOV A,BLCSL
ADD A,WFCSL ;KP>0,KD>0
MOV ZSJCSL,A ;将结果存入总时间常数中 kp*e(t)+kd*(e(t)-e(t-1))
MOV A,BLCSH
ADDC A,WFCSH
MOV ZSJCSH,A
AOOL4:
CLR C
MOV A,ZSJCSL
SUBB A,#0D0H
MOV A,ZSJCSH
SUBB A,#07H
;为什么是小于2000而不是200呢,因为进行偏差计算时时带一位小数的扩大了10倍
JC AOOL3 ;有借位,说明总时间常数《2000h,数据没有溢出继续
MOV ZSJCSL,#0D0H
MOV ZSJCSH,#07H ;无借位说明总时间常数>2000h,数据溢出赋最大值2000h继续
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -