📄 单片机应用技术讲座(17)源程序.txt
字号:
RETI
;****************************************************************************
[显示子程序]
DIR: MOV SCON,#00H ;置串行口移位寄存器状态
SETB P1.4 ;开显示
JB 5DH,DL1 ;显示设定温度则转
DL2: MOV DPTR,#SEGT
DL0: MOV A,@R0
MOVC A,@A+DPTR
MOV SBUF,A
LOOP1: JNB TI,LOOP1
CLR TI
INC R0
MOV A,@R0
MOVC A,@A+DPTR
ANL A,#7FH ;使个位带小数点
MOV SBUF,A
LOOP2: JNB TI,LOOP2
CLR TI
INC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV SBUF,A
LOOP3: JNB TI,LOOP3
CLR TI
CLR P1.4
CLR 5DH
RET
DL1: MOV 50H,#0AH ;使小数位黑屏
AJMP DL2
SEGT: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;****************************************************************************
DAAD1: MOV A,#00H ;[加1子程序]
ORL A,@R1
ADD A,#01H
CJNE A,#5AH,DAAD2 ;判断超过90度了吗?
DAAD3: MOV @R1,A
DAA: RET
DAAD2: JC DAAD3
MOV @R1,#28H ;超过90度则回到40度
AJMP DAA
;***************************************************************************
DEEC1: MOV A,@R1 ;[减1子程序]
DEC A
CJNE A,#28H,DEEC2 ;判断低于40度了吗?
DEEC3: MOV @R1,A
DEE: RET
DEEC2: JNC DEEC3
MOV @R1,#5AH ;低于40度则回到90度
AJMP DEE
;****************************************************************************
PTT0: CLR EA ;[T0中断子程序]
PUSH ACC
PUSH PSW
PUSH DPL
PUSH DPH
SETB EA ;压栈后开中断,响应键盘
PPP: LCALL SMAP ;采样数据
LCALL FILTER ;数字滤波
MOV A,2AH ;取采样值
CJNE A,#01H,AAA ;下限40度比较
AJMP BBB
AAA: JC CCC ;小于40度则转移
CJNE A,#0FEH,DDD ;上限90度比较
AJMP BBB ;转到40-90度正常范围内处理
DDD: JC BBB
CLR P1.2 ;大于90度黄灯亮报警
SETB 5EH
CLR P1.1 ; 置标志,启动风扇
AJMP PPP
CCC: CLR P1.3 ;小于40度绿灯亮报警
SETB 5FH
CLR P1.0 ;置标志,启动电炉
AJMP PPP
BBB: SETB P1.0
SETB P1.1
SETB P1.2
SETB P1.3
CLR 5EH
CLR 5FH ;40-90度之间则正常
LCALL PID
JB 20H,EEE ;设定温度< 实际温度,则转到风扇处理
MOV A,29H
ACALL FFF
CLR P1.0
LOOP10: MOV R0,#56H ;存放相乘结果的首址
MOV R1,#55H ;赋显示缓冲区最高位地址(十位)
LCALL SCACOV ;调用“标度转化------二-十进制转化”子程序
MOV R0,#53H ;赋显示首址
LCALL DIR
JB D5H,LOOP10 ;等待T1中断
CLR EA
POP DPH
POP DPL
POP PSW
SETB EA
POP ACC
RETI
EEE: MOV A,28H ;风扇处理
LCALL FFF
CLR P1.1
AJMP LOOP10
FFF: CPL A ;根据PID结果计算T1初值
INC A
MOV TL1,A
MOV TH1,#0FFH
SETB PI1
SETB TR1
SETB ET1
RET
;****************************************************************************
SCACOV: MOV R7,#00H ;[“标度转化------二-十进制转化”子程序]
MOV R6,2AH ;取采样值,并转化为双字节
MOV R5,#33H
MOV R4,#24H ;赋参数(纯小数)
LCALL MULT ;调用双字节乘法子程序
MOV R5,#00H
MOV R4,#28H ;赋参数40度
MOV A,@R0
MOV R3,A
DEC R0
MOV A,@R0 ;存乘法结果的整数
MOV R2,A
LCALL DSUM ;调用加法子程序,且R7,R6为有效值(R7=00H)
MOV A,R6
MOV B,#10
DIV AB
MOV @R1,A ;存十位数
DEC R1
XCH A,B
MOV @R1,A ;存个位数
DEC R0
MOV A,@R0 ;取有效小数
MOV B,#10
DIV AB
DEC R1
MOV @R1,A ;送小数到显示缓冲区
MOV A,B
CJNE A,#5,QQ ;小数四舍五入
QQ: JC PP
MOV A,@R1
ADD A,#01H
DA A
MOV @R1,A
PP: RET
;****************************************************************************
SMAP: MOV R0,#2CH ; [采样子程序]
MOV R1,#03H ;采样次数
SAM1: MOV DPTR,#7FF8H
MOVX @DPTR,A ;启动A/D
MOV R2,#20H
DLY: DJNZ R2,DLY ;延时一小会
HERE: JB P3.3,HERE
MOV DPTR,#7FF8H
MOVX A,@DPTR ;读取转化结果
MOV @R0,A
INC R0
DJNZ R1,SAM1
RET
;****************************************************************************
FILTER: MOV A,2CH ;[数字虑波子程序]
CJNE A,2DH,CMP1
AJMP CMP2
CMP1: JNC CMP2
XCH A,2DH
XCH A,2CH
CMP2: MOV A,2DH
CJNE A,2EH,CMP3
MOV 2AH,A
AJMP RR
CMP3: JC CMP4
MOV 2AH,A
AJMP RR
CMP4: MOV A,2EH
CJNE A,2CH,CMP5
MOV 2AH,A
AJMP RR
CMP5: JC CMP6
XCH A,2CH
CMP6: MOV 2AH,A
RR: RET
;****************************************************************************
PTT1: CLR 00H ;[T1中断子程序]
JB 20H,GGG
SETB P1.0 ;关闭电炉
GG: CLR PT1
RETI
GGG: SETB P1.1 ;关闭风扇
CLR 20H
AJMP GG
;****************************************************************************
DLY10MS: MOV R7,#0A0H ;[延时10毫秒子程序]
DL00: MOV R6,#0FFH
DL11: DJNZ R6,DL11
DJNZ R7,DL00
RET
;****************************************************************************
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
;****************************************************************************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 + -