📄 pwm.asm
字号:
ORG 0000H
JMP MAIN
ORG 000BH
JMP SHUCHU
ORG 0023H
JMP CHUAN
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;初始化
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MAIN: FLAG EQU 10H
CLR FLAG
MOV SP,#27H
MOV SCON,#90H ;设置为方式2
MOV PCON,#80H
MOV TMOD,#01H
;MOV IE,#98H
;MOV IP,#10H ;串口优先
SETB EA ;开中断
SETB ES ;串行口中断
SETB ET0 ;使用TIMER0中断
CLR TR0
SETB PT0
MOV TH0,#10H
MOV TL0,#10H
SETB P2.7 ;关输出
CLR RS1
CLR RS0
MOV 67H,#060H ;设置温度给定值Tg=30度
MOV 68H,#02 ;设置KP
MOV 69H,#01 ;设置Ki
MOV 6AH,#01 ;设置KD
MOV 6BH,#0
MOV 6CH,#0
MOV 6DH,#0
MOV 6EH,#0
MOV 6FH,#0
MOV 70H,#0
MOV 71H,#0
MOV 72H,#0
MOV 73H,#0
MOV 74H,#0
MOV 75H,#0
MOV 76H,#0
MOV 77H,#0
MOV 78H,#0
MOV 79H,#0
MOV 7AH,#0
MOV 7BH,#10H ;初始定时时间
MOV 7CH,#10H
SETB TR0
KAI: ;MOV 66H,#00H
MOVX @R0,A
WAIT: JB P1.7,ADC
JMP WAIT
ADC : MOVX A,@R0
;ADD A,#08H
MOV 66H,A ;采集温度Tc=66H
MOV B,#04H ;采集数据除4
DIV AB
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;数据作十进制调整
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CLR C
MOV R5,#00H
MOV R4,#00H
MOV R3,#08H
NEXT: RLC A
MOV R2,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R2
DJNZ R3,NEXT
MOV A,R5
CLR TB8
MOV SBUF,A ;发送数据
JBC TI ,$
MOV R5,#10 ;每2秒采集温度一次
LOOP1: LCALL XIAODUO
DJNZ R5,LOOP1
LCALL PID
;SETB TR0
JMP KAI
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;PID子程序
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PID: MOV A,67H ;计算Ei,先取温度给定值
CLR C
SUBB A,66H ;Ei
JNC PID1 ;判Ei正负,如为正,跳至PID1
;CLR TR0
SETB FLAG
CLR P2.7
MOV 7DH ,#0FFH
MOV 7EH, #0FDH
JMP CHUPID
CPL A ;Ei为负,求补
ADD A,#01H
SETB 30H ;Ei为负,符号位置1
SJMP PID2
PID1: CLR 30H ;Ei为正,符号位置0
SETB TR0
PID2: MOV 6BH,A ;Ei值存6BH
MOV R1,6BH ;计算Ei-(Ei-1),先将Ei送R1
MOV C,30H ;将Ei的符号位送20H位
MOV 20H,C
MOV R2,6CH ;将(Ei-1)值送R2
MOV C,31H ;将(Ei-1)的符号位送21H
MOV 21H,C
LCALL DJF ;
MOV 6EH,R3 ;将差值Ei-(Ei-1)送6EH
MOV C,22H ;将差值Ei-(Ei-1)的符号位送33H
MOV 33H,C
MOV R1,6CH ; 计算(Ei-1)-(Ei-2),先将(Ei-1)值送R1
MOV C,31H ; 将(Ei-1)的符号位值送20H
MOV 20H,C
MOV R2,6DH ; 将(Ei-2)值送R2
MOV C,32H ; 将(Ei-2)的符号位值送21H
MOV 21H,C
LCALL DJF ;
MOV 6FH,R3 ; 将差值(Ei-1)-(Ei-2)送6FH
MOV C,22H ; 将差值(Ei-1)-(Ei-2)的符号位送34H
MOV 34H,C
MOV R1,6EH ; 计算[Ei-(Ei-1)]-[(Ei-1)-(Ei-2)],先将Ei-(Ei-1)值送R1
MOV C,33H ; 将Ei-(Ei-1)的符号位值送20H
MOV 20H,C
MOV R2,6FH ; 将(Ei-1)-(Ei-2)值送R2
MOV C,34H ; 将(Ei-1)-(Ei-2)的符号位值送21H
MOV 21H,C
LCALL DJF
MOV 70H,R3 ; 将差值[Ei-(Ei-1)]-[(Ei-1)-(Ei-2)]送70H
MOV C,22H ; 将差值[Ei-(Ei-1)]-[(Ei-1)-(Ei-2)]的符号位送35H
MOV 35H,C
MOV A,68H ; 计算Kp[Ei-(Ei-1)],将Kp送A
MOV B,6EH ; 将[Ei-(Ei-1)]送B
MUL AB
MOV 71H,B ; 将Kp[Ei-(Ei-1)]存71H(高位),72H(低位)
MOV 72H,A
MOV A,69H ; 计算Ki*Ei,将Ki送A
MOV B,6BH ; 将Ei送B
MUL AB
MOV 73H,B ; Ki*Ei 存73H(高位),74H(低位)
MOV 74H,A
MOV A,6AH ;计算Kd [Ei-(Ei-1)]-[(Ei-1)-(Ei-2)],将Kd送A
MOV B,70H ;将[Ei-(Ei-1)]-[(Ei-1)-(Ei-2)]送B
MUL AB
MOV 75H,B ; Kd [Ei-(Ei-1)]-[(Ei-1)-(Ei-2)]存75H(高位),76H(低位)
MOV 76H,A
MOV R1,71H ; 计算Kp[Ei-(Ei-1)]+Ki*Ei
MOV R2,72H
MOV C,33H
MOV 23H,C
MOV R3,73H
MOV R4,74H
MOV C,30H
MOV 24H,C
LCALL SJF
MOV 77H,R5 ;将Kp[Ei-(Ei-1)]+Ki*Ei送77H(高位),78H(低位)
MOV 78H,R6
MOV C,25H ;将Kp[Ei-(Ei-1)]+Ki*Ei的符号位送36H
MOV 36H,C
MOV R1,77H ; 计算&Ui
MOV R2,78H
MOV C,36H
MOV 23H,C
MOV R3,75H
MOV R4,76H
MOV C,35H
MOV 24H,C
LCALL SJF
MOV 79H,R5 ; 将&Ui送79H(高位),7AH(低位)
MOV 7AH,R6
MOV C,25H ; 将&Ui的符号位送37H
MOV 37H,C
MOV R1,79H ; 输出PWM时间的计算
MOV R2,7AH
MOV C,37H
MOV 23H,C
MOV R3,7BH
MOV R4,7CH
CLR 24H
LCALL SJF
MOV 7BH,R5
MOV 7CH,R6
MOV 7DH,7BH
MOV 7EH,7CH
; MOV R1,7DH ; 计算Ui
; MOV R2,7EH
; CLR 23H
; MOV R3,79H
; MOV R4,7AH
; MOV C,37H
; MOV 24H,C
; LCALL SJF
; JNB 25H,PID3
; MOV 7BH,#00H ; 如为负,则令输出值为0
; MOV 7CH,#00H
; SJMP PID4
; PID3: MOV 7BH,R5 ; 否则,将计算得到Ui值送7BH(高位)、7CH(低位)
; MOV 7CH,R6
PID4: MOV 6DH,6CH ; 数据始代,(Ei-1)值送(Ei-2)
MOV 6CH,6BH ; Ei值送(Ei-1)
; MOV 7DH,7BH ; Ui值送(Ui-1)
; MOV 7EH,7CH
CHUPID: RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;单字节带符号的减法子程序
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DJF: JB 20H,DJF4
JB 21H,DJF2
CLR C
MOV A,R1
SUBB A,R2
MOV R3,A
JC DJF1
CLR 22H
RET
DJF1: MOV A,R3
CPL A
ADD A,#01H
MOV R3,A
SETB 22H
RET
DJF2: MOV A,R1
ADD A,R2
MOV R3,A
JNC DJF3
MOV R3,#0FFH
DJF3: CLR 22H
RET
DJF4: JB 21H,DJF6
MOV A,R1
ADD A,R2
MOV R3,A
JNC DJF5
MOV R3,#0FFH
DJF5: SETB 22H
RET
DJF6: CLR C
MOV A,R2
SUBB A,R1
MOV R3,A
JC DJF1
CLR 22H
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;双字节带符号数的加法子程序
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SJF: JB 23H,SJF3
JB 24H,SJF2
MOV A,R2
ADD A,R4
MOV R6,A
MOV A,R1
ADDC A,R3
MOV R5,A
JNC SJF1
MOV R5,#0FFH
MOV R6,#0FFH
SJF1: CLR 25H
RET
SJF2: CLR C
MOV A,R2
SUBB A,R4
MOV R6,A
MOV A,R1
SUBB A,R3
MOV R5,A
JC SJF4
CLR 25H
RET
SJF3: JB 24H,SJF5
CLR C
MOV A,R4
SUBB A,R2
MOV R6,A
MOV A,R3
SUBB A,R1
MOV R5,A
JC SJF4
CLR 25H
RET
SJF4: MOV A,R6
CPL A
ADD A,#01H
MOV R6,A
MOV A,R5
CPL A
ADDC A,#00H
MOV R5,A
SETB 25H
RET
SJF5: MOV A,R2
ADD A,R4
MOV R6,A
MOV A,R1
ADDC A,R3
MOV R5,A
JNC SJF6
MOV R5,#0FFH
MOV R6,#0FFH
SJF6: SETB 25H
RET
SHUCHU: PUSH A
PUSH PSW
JB FLAG,GAO
CLR P2.7
MOV TH0,7DH
MOV TL0,7EH
SETB FLAG
JMP HUI
GAO: SETB P2.7
MOV A,#0FFH
SUBB A,7EH
MOV TL0,A
MOV A,#0FFH
SUBB A,7DH
MOV TH0,A
CLR FLAG
HUI: POP PSW
POP A
RETI
CHUAN: PUSH A
PUSH PSW
JNB RI ,HUI001
MOV A,SBUF
MOV 67H,A
JBC RI,$
HUI001: CLR TI
POP PSW
POP A
RETI
XIAODUO: MOV R7,#100 ;采集延时
D1: MOV R6,#248
DJNZ R6,$
DJNZ R7,D1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -