📄 炉温控制实现.txt
字号:
八、 程序代码和代码分析
ORG 0000H ;偏移量0000H
LJMP MAIN ;跳转到MAIN运行
ORG 0003H ;偏移量0003H
LJMP CIT1 ;外中断0中断处理
ORG 000BH ;偏移量000BH
LJMP PIT0 ;计时器0溢出中断处理
ORG 0013H ;偏移量0013H
LJMP INT0 ;外中断1中断处理
ORG 001BH ;偏移量001BH
LJMP PIT1 ;计时器1溢出中断处理
ORG 0030H ;偏移量0030H
MAIN: SETB P3.5 ;截止控制硅
NOP
SETB P3.4 ;电网工频过0脉冲
NOP
MOV SP, #60H ;初始化堆栈指针,60H
MOV P1, #0FFH ;送FF到P1口,启动14433
MOV DPTR, #5FFFH ;下面三行,将显示RAM置1
MOV A, #0DCH
MOVX @DPTR, A
LP: MOVX A, @DPTR ;读出8279状态字
JB ACC.7, LP ;最高位为1,则跳转到上一步
MOV DPTR, #5FFFH
MOV A, #00H ;设A为8279控制字000 00000B,左进方式,显
示8个字符,二键锁定,编码扫描
MOVX @DPTR, A ;送控制字
MOV A, #34H ;8279控制字,将系统时钟分频至100kHz的20
倍
MOVX @DPTR, A ;送控制字
MOV TMOD, #11H ;设定时模式
;分别为定时器0、1的高、低位赋初值
MOV TH0, #0FFH
MOV TL0, #0FFH
MOV TH1, #0D8H
MOV TL1, #0F0H
CLR 22H ;清除按键中断的标志位
NOP
CLR 23H ;清除外中断0的标志位
NOP
CLR 25H ;清除定时器0溢出中断的标志位
NOP ;循环初始39H到3EH显示数据存储单元,全为暗码
MOV R0, #39H
MOV R7, #06H
LPP: MOV @R0, #17H
INC R0
DJNZ R7, LPP ;循环清除从40H开始,32个数据存储单元
MOV R0, #40H
MOV R7, #20H
LPPL: MOV @R0, #00H
MOV A, #1H
ORL A; TM0D
MOV TM0D, A
MOV @R0 #00H
INC R0
DJNZ R7, LPPL
MOV 50H, #96H ;初始1.5秒时间常数
LCALL DIR ;显示
CLR IT1 ;清外中断1类型控制位,低电平触发
NOP
SETB EX1 ;允许外中断1
NOP
SETB IT0 ;置位中断0类型控制位,高电平触发
NOP
SETB EX0 ;允许外中断0
NOP
MOV IP, #08H ;设中断优先级,计时器1中断最高
SETB EA ;置总中断允许位,允许中断
NOP
LPPP: LCALL KEYI ;输入给定温度值的十位
ANL A, #0FH ;保留低四位,限制在范围
CJNE A, #0AH, LPP1 ;比10小则置位进位
LPP1: JNC LPPP ;比10大,重新输入
MOV 3EH, A ;送键值到相应的显示数据存储单元
MOV 40H, A ;送设定温度值高位
LCALL DIR ;显示
LPP2: LCALL KEYI ;输入给定温度值的个位
ANL A, #0FH ;限制处理
CJNE A, #0AH, LPP3
LPP3: JNC LPP2
MOV 3DH, A ;送键值到相应的显示数据存储单元
MOV 41H, A ;送设定温度值低位
LCALL DIR ;显示
LP00: LCALL KEYI ;输入采样周期高位
ANL A, #0FH ;限制处理
CJNE A, #0AH, LP01
LP01: JNC LP00
MOV 3AH, A ;采样周期高位送相应的显示存储单元
MOV 3BH, #1AH ;显示t
MOV 3CH, #17H ;暗码
LCALL DIR ;显示
LP02: LCALL KEYI ;输入采样周期高位
ANL A, #0FH ;限制处理
CJNE A, #0AH, LP03
LP03: JNC LP02
MOV 39H, A ;采样周期高位送相应的显示存储单元
LCALL DIR ;显示
MOV A, 3AH ;取采样周期高位
MOV B, #10
MUL AB ;×10
ADD A, 39H ;加上低位
MOV 5CH, A ;保存采样周期二进制
;转采样周期为BCD码
MOV B, #64H
MUL AB
MOV 51H, B ;送采样周期BCD高位
MOV 52H, A ;送采样周期BCD低位
LPP4: LCALL KEYI ;输入比例常数十位
ANL A, #0FH ;限制处理
CJNE A, #0AH, LPP5
LPP5: JNC LPP4
MOV 3AH, A ;处理显示存储单元,不再赘述
MOV 3BH, #18H
MOV 3CH, #17H
MOV 39H, #17H
LCALL DIR
LPP6: LCALL KEYI ;输入比例常数个位
ANL A, #0FH
CJNE A, #0AH, LPP7
LPP7: JNC LPP6
MOV 39H, A
LCALL DIR ;十、个位转成一个数
MOV A, 3AH
MOV B, #10
MUL AB
ADD A, 39H
MOV 53H, A ;比例常数存入53H
LPP8: LCALL KEYI ;输入积分常数百位
ANL A, #0FH
CJNE A, #0AH, LPP9
LPP9: JNC LPP8
MOV 3BH, A
MOV 3CH, #19H
MOV 3AH, #17H
MOV 39H, #17H
LCALL DIR
LPPA: LCALL KEYI ;输入积分常数十位
ANL A, #0FH
CJNE A, #0AH, LPPB
LPPB: JNC LPPA
MOV 3AH, A
LCALL DIR
LPPC: LCALL KEYI ;输入积分常数个位
ANL A, #0FH
CJNE A, #0AH, LPPD
LPPD: JNC LPPC
MOV 39H, A
LCALL DIR
MOV R0, #3BH ;取积分常数百位
MOV R2, #02H ;转换计算的次数
LCALL CDDD ;将三个数按10制权转成一个数
MOV 58H, R4 ;将结果(即积分常数)存入58H
LPPE: LCALL KEYI ;输入微分常数十位
ANL A, #0FH
CJNE A, #0AH, LPPF
LPPF: JNC LPPE
MOV 3AH, A
MOV 3BH, #0DH
MOV 3CH, #17H
MOV 39H, #17H
LCALL DIR
LPPG: LCALL KEYI ;输入微分常数个位
ANL A, #0FH
CJNE A, #0AH, LPPH
LPPH: JNC LPPG
MOV 39H, A
;延时,保持显示
MOV 2FH, #0FFH
MOV 2EH, #80H
LPPJ: LCALL DIR
DJNZ 2FH, LPPJ
DJNZ 2EH, LPPJ ;转换
MOV A, 3AH ;取微分常数十位
MOV B, #10
MUL AB ;乘10
ADD A, 39H ;加上微分常数个位
MOV 59H, A ;送入59H保存微分常数
MOV B, 53H ;取比例常数
MUL AB ;计算Kd’ = Kp?Kd
MOV 56H, B ;分别送高低位
MOV 57H, A
MOV A, 53H ;取比例常数
MOV B, 58H ;取积分常数
MUL AB ;计算Ki’ = Kp?Ki
MOV 54H, B ;分别送高低位
MOV 55H, A
MOV 20H, #00H ;清空采样值高低位
MOV 21H, #00H
MOV A, 41H ;取温度设定值低位
ANL A, #0FH ;保留低四位,存入R0
MOV R0, A
MOV A, 40H ;取温度设定值低位
ANL A, #0FH ;保留低四位
MOV B, #10 ;乘10并加上低位
MUL AB
ADD A, R0
MOV 42H, A ;存设定值二进制于42H
MOV B, #14H
DIV AB ;计算温度的5%
JNZ NZER ;结果是否为0
MOV A, #01H ;为0则设最小值为1
NZER: MOV 44H, A ;将设定值的5%存入44H
CLR 26H ;清26H
NOP
SETB ET1 ;置定时器1中断允许位,允许定时器中断
NOP
SETB TR1 ;置计时器1中断类型,高电平有效
NOP
COOP: MOV 3CH, #00H ;将0送入显示缓冲区3CH
MOV A, 20H ;将A/D采样值高位送A
ANL A, #10H ;保留第4位状态
SWAP A ;A交换高低位
MOV 3BH, A ;A显示存储单元3BH
MOV A, 20H ;将A/D采样值高位送A
ANL A, #0FH ;保留低4位
MOV 3AH, A ;A显示存储单元3AH
MOV A, 21H ;将A/D采样值低位送A
ANL A, #0F0H ;保留高4位
SWAP A ;高低位交换
MOV 39H, A ;A显示存储单元39H
LCALL CDTB ;调用CDTB子程序
CLR C ;清进位位
MOV A, R3 ;将采样结果的二进制值送A
RRC A ;将A除以2
MOV R3, A ;结果送入R3
MOV A, R4 ;将R4内容移入A
RRC A ;A除以2
MOV R4, A ;将采样结果二进制值送R4
MOV 43H, A ;将采样结果二进制值即当前温度送43H
CLR C ;清进位位
MOV A, 42H ;将设定值的二进制值送A
MOV B, 43H ;将当前温度的二进制值送B
SUBB A, B ;计算A减B
MOV 45H, A ;将当前温差送45H
MOV 18H, C ;将符号送18H保存
JNC DOOP ;如果设定温度大于当前温度,跳转到DOOP
CPL A ;将A取反
ADD A, #01H ;将A加1,计算其补码形式
MOV 45H, A ;将结果送当前温差
DOOP: LCALL CTBB ;调用CTBB子程序
MOV A, #17H ;将17H送A
MOV 3CH, A ;A显示存储单元3CH
MOV A, R3 ;将R3内容移入到A
ANL A, #0FH ;保留低4位
MOV 3BH, A ;A显示存储单元3BH
MOV A, R4 ;将当前温度移入到A
ANL A, #0F0H ;保留高四位
SWAP A ;交换A的高低位
MOV 3AH, A ;A显示存储单元3AH
MOV A, R4 ;将当前温度放入到A
ANL A, #0FH ;保留低4位
MOV 39H, A ;A显示存储单元39H
MOV A, 40H ;将设定值的高位送A
ANL A, #0FH ;保留低4位
MOV 3EH, A ;A显示存储单元3EH
MOV A, 41H ;将设定值的低位送A
ANL A, #0FH ;保留低4位
MOV 3DH, A ;A显示存储单元3DH
LCALL DIR ;调用显示子程序
MOV IP, #08H ;将08H移入IP寄存器
JB 18H, CPPP ;如果18H为1则跳转到CPPP
CLR C ;清空C
MOV A, 45H ;当前温差移入到A
MOV B, 44H ;将设定值的5%移入到B
SUBB A, B ;用A减B
JC CPPP ;如当前温差小于设定值的5%,跳转到CPPP
CLR P3.5 ;清定时器1输出状态为0,即激活可控硅
NOP ;空操作
LJMP COOP ;跳转到COOP
CPPP: SETB P3.5 ;置定时器1输出状态为1,关闭可控硅
NOP ;空操作
LJMP COOP ;跳转到COOP
CIT1: ;外中断0处理子程序
;入栈保护现场
PUSH PSW
PUSH ACC
SETB PSW.3 ;使用01组寄存器
SETB 23H ;外中断0标志置位
NOP
MOV P1, #0FFH ;启动转换
NOP
CIX1: MOV A, P1 ;读A/D转换结果
JNB ACC.4, CIX1 ;判断转换是否结束
JB ACC.2, CL1 ;判断结果正负
SETB 07H ;负,则置位07H
LJMP CL2
CL1: CLR 07H ;正,复位07H
CL2: JB ACC.3, CL3 ;判断千位是否为0
SETB 04H ;为0置位04H
LJMP CL4
CL3: CLR 04H ;不为0复位04H
CL4: MOV P1, #0FFH ;启动转换
MOV A, P1
JNB ACC.5, CL4 ;判断百位是否转换,没有循环等待
MOV R0, #20H ;R0为20H
XCHD A, @R0 ;A与R0低四位交换
CL5: MOV P1, #0FFH ;启动转换
MOV A, P1 ;读结果
JNB ACC.6, CL5 ;十位是否转换,没有循环等待
SWAP A ;A的高低位互换
INC R0 ;R0内容+1,指向21H
MOV @R0, A ;A送21H,21H高位为十位
CL6: M MOV P1, #0FFH ;启动转换
MOV A, P1 ;读结果
JNB ACC.7, CL6 ;个位是否转换,没有循环等待
XCHD A, @R0 ;与R0低四位交换,21H低位为个位
MOV A, 20H ;取出百位,即采样值高位
ANL A, #0FH ;保留低四位
XRL A, #0FH ;是否为全1
JNZ WWW1
MOV A, 20H ;取出20H
ANL A, #0F0H ;保留高四位
MOV 20H, A ;送回20H
WWW1: SETB 15H ;转换结束标志
NOP
;出栈恢复现场
POP ACC
POP PSW
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -