这个是温控系统中的一段
后面的什么电炉电扇就别管了
PID: MOV R5,#00H ;[PID算法子程序]
MOV R4,2DH ;取Nx值
MOV R3,#00H
MOV R2,#28H ;取40度值
LCALL CPL1
LCALL DSUM ;求(Nx-28H)的值
MOV R0,#5AH ;赋乘法运算暂存单元地址首址
MOV R5,#05H
MOV R4,#1CH ;赋参数(5.12)
LCALL MULT ;调无符号数乘法
MOV 31H,5BH
MOV 32H,5AH ;存放结果的有效值
MOV R5,31H
MOV R4,32H ;取双字节的Ur(设定值)
MOV R3,2AH
MOV R2,#00H ;取双字节的Ui(k)(实测值)
ACALL CPL1 ;取Ui(k)的补码
ACALL DSUM ;计算E(k)
MOV 39H,R7
MOV 3AH,R6 ;存E(K)
MOV R5,35H
MOV R4,36H ;取KI参数
MOV R0,#4AH
ACALL MULT1 ;计算PI=KI*E(K)
MOV R5,39H
MOV R4,3AH ;取E(K)
MOV R3,3BH
MOV R2,3CH ;取E(K-1)
ACALL CPL1
ACALL DSUB ;求E(K)-E(K-1)
MOV R5,33H
MOV R4,34H ;取Kp参数
MOV R0,#46H
ACALL MULT1 ;求Kp*[E(K)-E(K-1)]
MOV R5,49H
MOV R4,48H
MOV R3,4DH
MOV R2,4CH
ACALL DSUM ;求Kp*[E(K)-E(K-1)]+KI*E(K)
MOV 4AH,R7
MOV 4BH,R6 ;保存上式之和
MOV R5,39H
MOV R4,3AH ;取E(K)
MOV R3,3DH
MOV R2,3EH ;取E(K-2)
ACALL DSUM ;计算E(K)+E(K-2)
MOV A,R7
MOV R5,A
MOV A,R6
MOV R4,A
MOV R3,3BH
MOV R2,3CH ;取E(k-1)
ACALL CPL1
ACALL DSUM ;求出E(K)+E(K-2)-2*E(K-1)
MOV A,R7
MOV R5,A
MOV A,R6
MOV R4,A
MOV R3,3BH
MOV R2,3CH
ACALL CPL1
ACALL DSUM
MOV R5,37H
MOV R4,38H ;取Kd参数
MOV R0,#46H
ACALL MULT1 ;求出Pd=Kd*[E(K)+E(K-2)-2*E(K-1)]
MOV R5,49H
MOV R4,48H ;取Pd
MOV R3,4AH
MOV R2,4BH ;取Kp*[E(K)-E(K-1)]+KI*E(K)
ACALL DSUM ;计算Pd+PI
MOV A,R7
MOV R3,A
MOV A,R6 ;取Pd+PI
MOV R2,A
MOV R5,2FH
MOV R4,30H ;取P(k-1)
ACALL DSUM ;求P(K)=Pd+Pp+P(K-1)
MOV 2FH,R7
MOV 30H,R6 ;存P(k)到P(k-1)
MOV 29H,2FH
MOV 3DH,3BH
MOV 3EH,3CH ;存E(K-1)到E(K-2)
MOV 3BH,39H
MOV 3CH,3AH ;存E(K)到E(k-1)
MOV A,31H ;取设定值
CJNE A,2AH,AA2 ;比较设定值与实测值
AA3: CLR 20H ;清电炉标志
AA1: RET
AA2: JNC AA3
SETB 20H ;清风扇标志位
MOV R3,39H
MOV R2,3AH
LCALL CPL1
MOV A,R3
MOV R7,A
MOV A,R2
MOV R6,A
MOV R5,42H
MOV R4,43H ;取K(风扇)参数
MOV R0,#5AH
ACALL MULI1 ; 计算P`=K*E(K),且结果防在51H,50H单元中
MOV 28H,5BH ;取8位有效值,放到28H单元中
AJMP AA1
这是pid中调用的几个子程序!
;**********************************************************
DSUM: MOV A,R4 ;[双字节加法子程序]:(R5R4)+(R3R2)-->(R7R6) ADD A,R2
MOV R6,A
MOV A,R5
ADDC A,R3
MOV R7,A
RET
;**********************************************************
CPL1: MOV A,R2 ;[双字节求补子程序]:(R3R2)求补
CPL A
ADD A,#01H
MOV R2,A
MOV A,R3
CPL A
ADDC A,#00H
MOV R3,A
RET
;**********************************************************
MULT1: MOV A,R7 ;[双字节有符号数乘法]:被乘数(R7R6),乘数(R5R4) RLC A
MOV 5CH,C ;被乘数符号C1-->5CH位
JNC POS1 ;为正数则转
MOV A,R6 ;为负数则求补
CPL A
ADD A,#01H
MOV R6,A
MOV A,R7
CPL A
ADDC A,#00H
MOV R7,A
POS1: MOV A,R5 ;取乘数
RLC A ;乘数符号C2-->5DH位
MOV 5DH,C
JNC POS2 ;为整数则转
MOV A,R4
CPL A
ADD A,#01H
MOV R4,A
MOV A,R5
CPL A
ADDC A,#00H
MOV R5,A
POS2: ACALL MULT ;调双字节无符号数乘法子程序
MOV C,5CH
ANL C,5DH
JC TPL ;负负相乘则转
MOV C,5CH
ORL C,5DH
JNC TPL ;正正相乘则转
DEC R0
MOV A,@R0
CPL A
ADD A,#01H
MOV @R0,A
INC R0
MOV A,@R0
CPL A
ADDC A,#00H
MOV @R0,A
TPL: RET
;**********************************************************
MULT: MOV A,R6
MOV B,R4 ;取低位相乘
MUL AB
MOV @R0,A
MOV R3,B
MOV A,R4
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
MOV A,B
ADDC A,#00H
MOV R2,AMOV A,R6
MOV B,R5
MUL AB
ADD A,R3
INC R0
MOV @R0,A
CLR 5BH
MOV A,R2
ADDC A,B
MOV R2,A
JNC LAST
SETB 5BH ;置进位标志
LAST: MOV A,R7
MOV B,R5
MUL AB
ADD A,R2
INC R0
MOV @R0,A ;存积的第二字节
MOV A,B
ADDC A,#00H
MOV C,5BH
ADDC A,#00H
INC R0
MOV @R0,A
RET
END
;********增量式PID控制算法程序***********
;T、TD、TI、KP依次从30H,33H,36H,39H开始。
;A,B,C的值依次存在BLOCK1,BLOCK2,BLOCK3的地址里
; 这里R(k)给的是定值
;
ORG 0000H
BLOCK1 EQU 43H ;A,B ,C
BLOCK2 EQU 46H
BLOCK3 EQU 49H
UK EQU 4CH ;存结果UK
RK EQU 50H
EK EQU 53H ;存放偏差值E(k)的始址
EK1 EQU 56H ;存放E(k-1)的始址
EK2 EQU 59H ;存放E(k-2)的始址
CK EQU 5CH ;采样数据始址
BUFF EQU 60H ;暂存区
BUFF1 EQU 63H
BUFF2 EQU 66H
REC EQU 69H
TEST:
MOV RK,#01H ;常数Rk的BCD码浮点数
MOV RK+1,#12H ;1.25
MOV RK+2,#50H
MOV 3CH,#01H ;常数1的BCD码浮点数
MOV 3DH,#10H
MOV 3EH,#00H
MOV 40H,#01H ;常数2的BCD码浮点数
MOV 41H,#20H
MOV 42H,#00H
MOV 30H,#01H ;T的BCD 码浮点数
MOV 31H,#23H ;2.34
MOV 32H,#40H
MOV 33H,#01H ;Td的BCD码浮点数
MOV 34H,#35H ;3.54
MOV 35H,#40H
MOV 36H,#01H ;Ti的BCD码浮点数
MOV 37H,#11H ;1.12
MOV 38H,#20H
MOV 39H,#01H ;Kp的BCD码浮点数
MOV 3AH,#12H ;1.25
MOV 3BH,#50H
MOV R0,#RK ;指向BCD码浮点操作数
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#3CH
LCALL BTOF
MOV R0,#40H
LCALL BTOF
MOV R0,#39H
LCALL BTOF
MOV R0,#36H ;指向BCD码浮点操作数Ti
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#33H ;指向BCD码浮点操作数Td
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#30H ;指向BCD码浮点操作数T
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R1, #BUFF1 ;保存30H中的值 即T值
LCALL FMOVR0
MOV R1, #36H ;计算A值(1+T/Ti+Td/T).Kp
LCALL FDIV
MOV R1,#3CH ;常数1
LCALL FADD
MOV R0,#33H ;保存33H中的值
MOV R1,#BUFF
LCALL FMOVR0
MOV R1,#BUFF1
LCALL FDIV
MOV R1,#30H ;30H里存的是T/Ti+1
LCALL FADD
MOV R1,#39H
LCALL FMUL
MOV R1 ,#BLOCK1 ;将结果保存在BLOCK1中
LCALL FMOVR0
MOV R1,#BUFF1 ;30H恢复原值
MOV R0,#30H
LCALL FMOV
MOV R1,#BUFF ;33H恢复原值
MOV R0,#33H
LCALL FMOV
MOV R0,#40H ;计算B的值Kp.(1+2.Td/T)
MOV R1,#33H
LCALL FMUL
MOV R1,#30H
LCALL FDIV
MOV R1,#3CH
LCALL FADD
MOV R1,#39H
LCALL FMUL
MOV R1,#BLOCK2 ;保存B值到BLOCK2中
LCALL FMOVR0
MOV R0,#39H ;计算C的值Kp.Td/T
MOV R1,#33H
LCALL FMUL
MOV R1,#30H
LCALL FDIV
MOV R1,#BLOCK3 ;保存C值到BLOCK3中
LCALL FMOVR0
MOV R0,#EK1 ;将EK1,EK2设初值0
LCALL FCLR
MOV R0,#EK2
LCALL FCLR
MOV REC,#03H ;设置采样次数
LOOP: MOV CK,#7eH ;采样数据暂时给了一个定值
MOV CK+1,#21H ;0.002112
MOV CK+2,#12H
MOV R0,#CK
LCALL BTOF
MOV R0,#RK