📄 炉温控制实现.txt
字号:
RETI
PLDD: MOV A, 54H ;取Ki’
MOV B, 45H ;取当前温差
MUL AB
MOV R6, B ;乘得结果高位送R6
MOV R7, A ;低位送R7
CLR C ;清进位位
;当前温差与上次采样时刻误差之差存入R2
MOV A, 45H
MOV B, 46H
SUBB A, B
MOV R2, A
MOV 1BH, C ;进位送入1BH
JNC PLD1 ;不为负跳转
;A取反加1,变为补码
CPL A
ADD A, #01H
MOV R2, A ;存入R2
PLD1: MOV B, 53H ;取比例常数
MUL AB ;当前温差与上次采样时刻误差之差乘上比例常
JB 1BH, PLD2 ;根据上一步的进位判断操作是加还是减
LCALL AD67 ;加法
LJMP PLD3 ;下一步
PLD2: LCALL SU67 ;减
PLD3: CLR C ;清进位
MOV A, R2 ;取当前温差与上次采样时刻误差之差
MOV B, 56H ;取Kd’
MUL AB ;当前温差与上次采样时刻误差之差乘上Kd’
JB 1BH, PLD4 ;根据进位判断操作是加还是减
LCALL AD67
LJMP PLD5
PLD4: LCALL SU67
PLD5: CLR C ;清进位
MOV A, 47H ;取上上次采样时刻的误差
SUBB A, 46H ;减去上次采样时刻的误差
JNC PLD6 ;为正跳转
;为负,取反加1,变为补码
CPL A
ADD A, #01H
PLD6: MOV B, 56H ;取Kd’
MUL AB ;上上次采样时刻的误差与上次采样时刻的误差乘
上Kd’
JC PLD7 ;如果上上次误差大于上次误差,减法
LCALL AD67 ;加法
LJMP PLD8
PLD7: LCALL SU67
PLD8: MOV 48H, R6 ;把R6送入调整量增量高位
MOV 49H, R7 ;R7送入调整量增量低位
CLR C ;清进位
;计算本次调整量增量低位与上次调整量增量低位之和
MOV A, 49H
ADDC A, 4DH
MOV 4BH, A ;送入本次调整量低位
;计算本次调整量增量高位与上次调整量增量高位之和
MOV A, 48H
ADDC A, 4CH
MOV 4AH, A ;送入本次调整量高位
MOV 47H, 46H ;上次采样时刻的误差送上上次采样时刻的误差
MOV 46H, 45H ;当前温差送上次采样时刻的误差
MOV 4CH, 4AH ;本次调整量高位送上次调整量高位
MOV 4DH, 4BH ;本次调整量低位送上次调整量低位
RET
AD67: MOV 5DH, B ;A、B送5E、5D暂存
MOV 5EH, A
CLR C ;清进位
MOV A, R7 ;取调整量增量低位
ADD A, 5EH ;加刚才的运算结果
MOV R7, A ;作为新的整量增量低位存入R7
MOV A, R6 ;取调整量增量高位
ADD A, 5DH ;加刚才的运算结果
MOV R6, A ;作为新的整量增量高位存入R6
RET
SU67: MOV 5DH, B ;A、B送5E、5D暂存
MOV 5EH, A
CLR C ;清进位
MOV A, R7 ;取调整量增量低位
SUBB A, 5EH ;减刚才的运算结果
MOV R7, A ;作为新的整量增量低位存入R7
MOV A, R6 ;取调整量增量高位
SUBB A, 5DH ;减刚才的运算结果
MOV R6, A ;作为新的整量增量高位存入R6
RET
CDTB: MOV R2, #03H ;送循环次数3到R2
MOV R0, #3CH ;将指针R0制向显示存储单元3CH
CDDD: MOV R3, #00H ;清R3
MOV A, @R0 ;将R0指向的显示缓冲区地址内数据送入A
MOV R4, A ;将A移入R4,R4用于存储结果,
CDTL: MOV A, R4 ;取R4内容
MOV B, #10
MUL AB ;A乘10
MOV R4, A ;将计算结果的低位送入R4保存
MOV A, B ;将计算结果的高位送入A
XCH A, R3 ;交换A和R3内容
MOV B, #10
MUL AB ;计算A乘10
ADD A, R3 ;用结果加上R3的内容
MOV R3, A ;结果送R3保存
DEC R0 ;R0减1,指向显示缓冲区下一地址
MOV A, R4 ;取入R4中保存的数据
ADD A, @R0 ;用当前值加上显示缓冲区中的值
MOV R4, A ;将结果送入R4
MOV A, R3 ;将R3内容移入A
ADDC A, #0 ;用A加上进位位
MOV R3, A ;将结果移入到R3保存
DJNZ R2, CDTL ;R2减1,如果不等于零继续,否则跳转到CDTL
RET ;子程序返回
CTBB: MOV DPTR, #TAB1 ;将表格TAB1首地址送入DPTR
CLR C ;清进位位
MOV A, R4 ;将R4值送A
RLC A ;A内容乘2
MOV R4, A ;将结果移入R4
XCH A, R3 ;交换A和R3内容
RLC A ;A内容乘2
XCH A, R3 ;交换A和R3内容
ADD A, DPL ;A加DPTR低位
MOV DPL, A ;将结果送DPTR低位
MOV A, DPH ;DPTR高位送A
ADDC A, R3 ;A加R3
MOV DPH, A ;结果送DPTR高位
CLR A ;清空A
MOVC A, @A+DPTR ;根据DPTR查表格
MOV R3, A ;将结果送到R3
CLR A ;清A
INC DPTR ;DPTR加1
MOVC A, @A+DPTR ;根据DPTR查表格
MOV R4, A ;结果送R4
RET ;子程序返回
;键值处理子程序
KEYI: JNB 22H, KEYI ;循环等待中断
MOV A, 27H ;将键值送A
CLR C ;清进位位
SUBB A, #08H ;键值减8
JNC LC ;如果按下的是8、9、A、B,则跳转到LC
MOV A, 27H ;如果按下的上0、1、2、3,则直接送到A
CLR 22H ;清空22H,表示键值处理结束
RET ;子程序返回
LC: MOV A, 27H ;将键值送到A
CLR C ;清进位位
SUBB A, #04H ;得到8、9、A、B转换后的键值
CLR 22H ;清空22H,表示键值处理结束
RET ;子程序返回
DIR: MOV R2, #06H ;显示子程序,和实验一相同
MOV DPTR, #5FFFH ;送8279控制口地址到DPTR
MOV A, #92H ;8279写显示RAM命令,地址自动加1,从2地
址开始
MOVX @DPTR, A ;送控制字
MOV R1, #39H ;令R1指向显示缓冲区39H
TY11: MOV A, @R1 ;将R1所指地址内的数据送入A
MOV DPTR, #CODE ;将表格CODE的地址送入16位数据指针
MOVC A, @A+DPTR ;根据表格起始地址+偏移量查找数据
MOV DPTR, #5EFFH ;将8279数据口地址送DPTR
MOVX @DPTR, A ;送显示数据到8279
INC R1 ;显示缓冲区指针加1,指向下一地址
DJNZ R2, TY11 ;6个缓冲区都读完则继续,否则跳转到TY11
RET ;子程序返回
CODE: DB 0C0H, 0F9H, 0A4H, 0B0H ;显示数据的表格
DB 99H, 92H, 82H, 0F8H, 80H
DB 90H, 88H, 83H, 0C6H, 0A1H
DB 86H, 8EH, 8CH, 0C1H, 89H
DB 0C7H, 0BFH, 91H, 00H, 0FFH
DB 8CH, 0C7H, 87H, 0FFH, 0FFH
;外中断1中断处理子程序,处理8279键盘事件
INT0: ;入栈保护现场
PUSH ACC ;累加器入栈
PUSH DPH ;DPTR高位入栈
PUSH DPL ;DPTR低位入栈
MOV DPTR, #5FFFH ;送8279控制口地址到DPTR
MOV A, #40H ;8279控制字,读FIFO 0地址内容,地址不自加
1
MOVX @DPTR, A ;送控制字
MOV DPTR, #5EFFH ;送8279数据口地址到DPTR
MOVX A, @DPTR ;读键值
MOV 27H, A ;将键值送到27H保存
SETB 22H ;将22H置位,按键标志
NOP ;空操作
;出栈恢复现场
POP DPL ;DPTR低位出栈
POP DPH ;DPTR高位出栈
POP ACC ;累加器出栈
RETI ;中断处理子程序返回
;计时器0溢出中断处理子程序
PIT0: CLR TR0 ;清计时器0中断类型位,使其为0有效
NOP ;空操作
MOV TH0, #0FFH ;复位计时器高位
MOV TL0, #0FFH ;复位计时器低位
SETB 25H ;置25H
NOP ;空操作
RETI ;中断处理子程序返回
;计时器1溢出处理子程序
PIT1: ;入栈保护现场
PUSH ACC ;累加器入栈
PUSH PSW ;程序状态字入栈
SETB PSW.4 ;使用第三组寄存器,从10H到17H
CLR EX0 ;清外部中断0中断允许位,关中断
NOP ;空操作
MOV TH1, #0D8H ;置D8H为计时器1高位初值
MOV TL1, #0F0H ;置F0H为计时器1低位初值
MOV A, 50H ;将1.5秒对应的时间常数96H送A
DEC A ;A减1
MOV 50H, A ;将A送回50H
JNZ P333 ;如果控制周期1.5秒不到,跳转到P333
MOV 50H, #96H ;置1.5秒对应的时间常数96H
MOV 5AH, 4AH ;将本次调整里量增量高位送调整量缓冲单元高位
P333: LCALL OUTT ;调用调整量输出子程序
CLR C ;清进位位
MOV A, 52H ;送采样周期低位到A
SUBB A, #01H ;A减1
MOV 52H, A ;送结果到采样周期低位
MOV A, 51H ;送采样周期高位到A
SUBB A, #01H ;A减1
MOV 51H, A ;送结果到采样周期高位
ORL A, 52H ;得到采样周期
JNZ P335 ;如果采样周期不为0,跳转到P335
LCALL PLDD ;调用PLDD进行PID运算
CLR C ;清进位位
MOV A, 43H ;将当前温度值送A
SUBB A, 42H ;减去设定温度值
JC P335 ;如果当前温度值小于设定温度值,跳转到P335
SETB P3.5 ;截止可控硅
NOP ;空操作
LJMP P336 ;跳转到P336
P335: NOP
NOP
P336: ;出栈恢复现场
POP PSW ;程序状态字出栈
POP ACC ;累加器出栈
SETB EX0 ;置计时器0中断允许位,允许中断
NOP ;空操作
RETI ;中断处理子程序返回
;显示子程序
OUTT: MOV R2, 5AH ;将调整量高位送R2
CJNE R2, #00H, OUT1 ;判断如果R2不等于0,跳转到OUT1
SETB P3.5 ;如果调整量高位为0,关闭可控硅
NOP ;空操作
RET ;子程序返回
OUT1: SETB TR0 ;置计时器0中断类型为高有效
NOP ;空操作
SETB ET0 ;置计时器0中断允许位,允许中断
NOP ;空操作
MOV IP, #02H ;设中断优先级定时器0中断最高
OUT2: JB P3.4, OUT2 ;如果电网工频过零脉冲为高则跳转到OUT2
;循环等待T0溢出
CLR P3.5 ;启动可控硅
NOP ;空操作
DEC R2 ;调整量减1
MOV 5AH, R2 ;调整量送调整量缓冲单元高位
CLR 25H ;清25H
NOP ;空操作
CLR ET0 ;清计时器0中断允许位,禁止中断
NOP ;空操作
RET ;子程序返回
TAB1: DW 0000, 0001, 0002 0003
DW 0004, 0005, 0006, 0007
DW 0008, 0009, 0010H, 0011H
DW 0012H, 0013H, 0014H, 0015H
DW 0016H, 0017H, 0018H, 0019H
DW 0020H, 0021H, 0022H,0023H
DW 0024H, 0025H, 0026H, 0027H
DW 0028H, 0029H, 0030H, 0031H
DW 0032H, 0033H, 0034H, 0035H
DW 0036H, 0037H, 0038H, 0039H
DW 0040H, 0041H, 0042H, 0043H
DW 0044H, 0045H, 0046H, 0047H
DW 0048H, 0049H, 0050H, 0051H
DW 0052H, 0053H, 0054H, 0055H
DW 0056H, 0057H, 0058H, 0059H
DW 0060H, 0061H, 0062H, 0063H
DW 0064H, 0065H, 0066H, 0067H
DW 0068H, 0069H, 0070H, 0071H
DW 0072H, 0073H, 0074H, 0075H
DW 0076H, 0077H, 0078H, 0079H
DW 0080H, 0081H, 0082H, 0083H
DW 0084H, 0085H, 0086H, 0087H
DW 0088H, 0089H, 0090H, 0091H
DW 0092H, 0093H, 0094H, 0095H
DW 0096H, 0097H, 0098H, 0099H
DW 0100H, 0101H, 0102H,0103H
DW 0104H, 0105H, 0106H, 0107H
DW 0108H, 0109H, 0110H, 0111H
DW 0112H, 0113H, 0114H, 0115H
DW 0116H, 0117H, 0118H, 0119H
DW 0120H, 0121H, 0122H,0123H
DW 0124H, 0125H, 0126H, 0127H
DW 0128H, 0129H, 0130H, 0131H
DW 0132H, 0133H, 0134H, 0135H
DW 0136H, 0137H, 0138H, 0139H
DW 0140H, 0141H, 0142H,0143H
DW 0144H, 0145H, 0146H, 0147H
DW 0148H, 0149H, 0150H, 0151H
DW 0152H, 0153H, 0154H, 0155H
DW 0156H, 0157H, 0158H, 0159H
DW 0160H, 0161H, 0162H,0163H
DW 0164H, 0165H, 0166H, 0167H
DW 0168H, 0169H, 0170H, 0171H
DW 0172H, 0173H, 0174H, 0175H
DW 0176H, 0177H, 0178H, 0179H
DW 0180H, 0181H, 0182H,0183H
DW 0184H, 0185H, 0186H, 0187H
DW 0188H, 0189H, 0190H, 0191H
DW 0192H, 0193H, 0194H, 0195H
DW 0196H, 0197H, 0198H, 0199H
DW 0200H, 0201H, 0202H,0203H
DW 0204H, 0205H, 0206H, 0207H
DW 0208H, 0209H, 0210H, 0211H
DW 0212H, 0213H, 0214H, 0215H
DW 0216H, 0217H, 0218H, 0219H
DW 0220H, 0221H, 0222H,0223H
DW 0224H, 0225H, 0226H, 0227H
DW 0228H, 0229H, 0230H, 0231H
DW 0232H, 0233H, 0234H, 0235H
DW 0236H, 0237H, 0238H, 0239H
DW 0240H, 0241H, 0242H,0243H
DW 0244H, 0245H, 0246H, 0247H
DW 0248H, 0249H, 0250H, 0251H
DW 0252H, 0253H, 0254H, 0255H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -