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

📄 pid.txt

📁 该程序描述了用单片机实现离散的PID控制器
💻 TXT
字号:
 这个是温控系统中的一段
后面的什么电炉电扇就别管了

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 








 

⌨️ 快捷键说明

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