📄 wendukongzhixitong.txt
字号:
CSEG AT 0000H ; 04.7.23 4 KEY; 误差+2/-1度; 滤波
LJMP START0
CSEG AT 400BH
LJMP CLOCK0
CSEG AT 401BH
LJMP CLOCK1
CSEG AT 4100H
PORT8279 EQU 0CFE8H ;8279片选信号
SIGN0 EQU 00H ;20H.0
SIGN1 EQU 01H ;20H.1
SIGN2 EQU 02H ;20H.2
SIGN3 EQU 03H ;20H.3 ; Select Disp
SIGN4 EQU 04H ;20H.4 ; +/- Enable
SIGN5 EQU 05H ;20H.5 ; Enter
;;&&&&&&&&&&&&&&& 主程序 &&&&&&&&&&&&&&&&&&&&&&&&
;===============初始化及赋初值==========================
START0: CLR SIGN3
CLR SIGN4
CLR SIGN5
MOV 2CH,#00H
MOV 2DH,#00H
MOV 2EH,#00H
MOV 3FH,#05H ; 键菜单号初值 4-R(K);3-Kp;2-Ki;1-Kd
MOV 31H,#60 ;R(k)H
MOV 32H,#00H ;R(k)L
MOV 33H,#30H ;KpH
MOV 34H,#00H ;KpL
MOV 35H,#02H ;KiH
MOV 36H,#00H ;KiL
MOV 37H,#01H ;KdH
MOV 38H,#00H ;KdL
MOV 2FH,#00H ;P(k-1)H
MOV 30H,#00H ;P(k-1)L
MOV 3BH,#00H ;E(k-1)H
MOV 3CH,#00H ;E(k-1)L
MOV 3DH,#00H ;E(k-2)H
MOV 3EH,#00H ;E(k-2)L
MOV DPTR,#PORT8279+1 ;8279显示RAM全部清零
MOV A,#0D1H
MOVX @DPTR,A
;================开始运行=============================
STAR1: MOV SP,#70H
MOV R2,#50h ; sample time = (R2)*2mS + ....
MOV TMOD,#01H ;定时器0设置为方式一
MOV TL0,#1BH ;置时间常数,每0.002秒中断一次
MOV TH0,#0FCH ; 计算:0FFFFH-0FC1B=3F4H=996--1000*2uS=2mS
SETB EA
SETB ET0
SETB TR0
STAR2: MOV DPTR,#0CFE9H ;8279命令字
MOVX A,@DPTR
ANL A,#0FH
lcall d1ms
JZ samp ;无键按下,则转SAMP采样子程序
lcall KEYGL ;有键按下,则转EYGL键处理子程序
samp: CJNE R2,#00H,samp ; 采样延时
CLR TR0
LCALL SAMPLING ;调用启动A/D采样子程序
LCALL FILTER ; 调用中值滤波子程序
LCALL SEND ; 调用串行通信子程序
LCALL DIGTOTEM ;调用标度变换子程序
LCALL PID ; 调用pid子程序
JB SIGN3,DISP1
mov 40h,2ah ; 显示温度值
lcall ZHBCD
mov 50h,#11h
mov 51h,#12h
mov 52h,#13h
mov 53h,#10h
DISP1: lcall disp ; 显示参数修改值
LCALL PWMOUT ;调用PWM输出子程序
LJMP STAR1
;&&&&&&&&&&&&&&& 中断服务程序 &&&&&&&&&&&&&&&&&&&&&&&&
;================= CLOCK0 中断 ========================
CLOCK0: MOV TL0,#1BH ;置时间常数,每0.002秒中断一次
MOV TH0,#0FCH
PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
DEC R2
POP DPL
POP DPH
POP PSW
POP ACC
RETI
;=================CLOCK1 中断========================
CLOCK1: MOV TL1,#0CH ;置时间常数,每0.001秒中断一次
MOV TH1,#0FEH
PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
DEC R2
POP DPL
POP DPH
POP PSW
POP ACC
RETI
;&&&&&&&&&&&&&&& 子程序 &&&&&&&&&&&&&&&&&&&&&&&&
;=================采样子程序========================
SAMPLING:MOV R0,#2CH ; 采样值存放初始地址 2CH,2DH,2EH
MOV R3,#03H ; 采样3次
SAMP1: MOV R4,#50H
MOV DPTR,#0CFA0H ; A/D 0809 地址
MOVX @DPTR,A ; 启动采样
LOP1: DJNZ R4,LOP1
MOVX A,@DPTR ; 延时;等待采样结束
mov @r0,a
INC R0
DJNZ R3,SAMP1 ; 循环采样3次
RET
;=================标度转换子程序========================
DIGTOTEM:mov b,#27h ; 标度转换 #27h: 100/255=0.39(比例系数)
mul ab ; Tx=100*xxH/ffH =xx.xx
mov r5,a ; /64h
mov r4,b
mov r3,#00h ; r2r3r4r5/r6r7=r4r5....r2r3
mov r2,#00h
mov r6,#00h
mov r7,#064h
Lcall ndiv
mov a,#63h ;T=99-TX (温度传感器负特性)
clr c
subb a,r5
mov 2ah,a ; 采样值---2AH
RET
;=====================PWM开关输出控制子程序===========================
PWMOUT: MOV R2,30H
MOV TMOD,#10H ;定时器0设置为方式一
MOV TL1,#0CH ;置时间常数,每0.001秒中断一次
MOV TH1,#0FEH ; 0FFFFH-0FE0CH=1F3H=499----500*2uS=1mS
SETB EA
SETB ET1
SETB TR1
RECV4: CJNE R2,#00H,RECV3 ;延时
MOV R2,30H
MOV A,#0FFH
CLR C
SUBB A,30H
MOV R2,A
RECV6: CJNE R2,#00H,RECV5
CLR TR1
RET
RECV5: MOV DPTR,#0CFA8H
MOV A,#0FFH
MOVX @DPTR,A
AJMP RECV6
RECV3: MOV DPTR,#0CFA8H
MOV A,#00H
MOVX @DPTR,A
AJMP RECV4
;===================== 中值滤波子程序 ==========================
FILTER:MOV A,2CH
CJNE A,2DH,CMP1 ; 2C与2D比较,不等则转CMP1
AJMP CMP2 ; (2C)=(2D),则与2E比较
CMP1: JNC CMP2 ; C=1,即(2C)>(2D),则转CMP2,与2E比较
XCH A,2DH ; C=0,即(2C)<(2D),则交换
XCH A,2CH
CMP2: MOV A,2DH
CJNE A,2EH,CMP3 ; 2E与2D比较,不等则转CMP3
MOV 2AH,A ; (2E)=(2D)<(2E)
RET
CMP3: JC CMP4 ; C=1,(2D)<(2E){(2D)<(2C)}则转CMP4,(2E)与(2C)比较
MOV 2AH,A ; C=0,即(2C)>(2D)>(2E)
RET
CMP4: MOV A,2EH
CJNE A,2CH,CMP5 ; 2C与2E比较,不等则转CMP5
MOV 2AH,A ; (2C)=(2E)>(2D)
RET
CMP5: JC CMP6 ; C=1,即(2C)>(2E){(2D)<(2E)}转CMP6
XCH A,2CH ; C=0,(2E)>(2C)>(2D)
CMP6: MOV 2AH,A ; (2C)送A
RET
;=================== 8279 disp 子程序===========================
disp: MOV DPTR,#0CFE9H ;写显示RAM命令字
MOV A,#90H
MOVX @DPTR,A
MOV R7,#06H ; 06为显示位数
MOV R0,#50H ; 存放转换结果地址初值送R0
DL0: MOV A,@R0
MOV DPTR,#TAB ; 转换为显码
MOVC A,@A+DPTR,
MOV DPTR,#0CFE8H ; 8279数据口地址
MOVX @DPTR,A ; 送显码输出
INC R0
DJNZ R7,DL0 ; 没显示完则继续
LJMP DEL1
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
db 40H,31h,1ch,54h,73h,63h,39h
DEL1: MOV R3,#200 ;延时一段时间使显示更稳定
DEL2: MOV R4,#126
DEL3: DJNZ R4,DEL3
DJNZ R3,DEL2
ret
;=======================串行传送通信子程序==============================
SEND: PUSH ACC ;串行通信子程序
TRA1C: MOV DPTR,#0CFE5H
MOVX A,@DPTR
JBC ACC.5,TRA1A
SJMP TRA1C
TRA1A: MOV DPTR,#0CFE0H
POP ACC
MOVX @DPTR,A
RET
;=====================十六进制转换BCD码子程序============================
ZHBCD: MOV A,40H
MOV B,#0AH
DIV AB ; A/B=A....B
SWAP A
ORL A,B ;分离高四位和低四位
MOV R1,A ;并依次存放在50H到51H中
swap a
ANL A,#0FH
MOV 54H,A
MOV A,R1
ANL A,#0FH
MOV 55H,A
RET
;==================== BCD码转换十六进制子程序 ===========================
BCDZH: MOV A,41H ; 二位BCD(压缩为一个字节)转换成一个字节二进制数
anl a,#0f0h
swap a
MOV B,#10
mul AB ; 高位?BCD乘?10
mov r3,a
MOV A,41H
anl a,#0fh
add a,r3 ; 加上低位BCD
MOV 41H,A
RET
;================== 无符号双字节除法子程序 ================================
ndiv: mov a,r3 ; 无符号双字节除法子程序 r2r3r4r5/r6r7=r4r5....r2r3 clr c
subb a,r7
mov a,r2
subb a,r6
jnc ndve1
mov b,#16
sjmp ndvl1
ndve1: setb f0
mov b,#16
ndvl1: clr c
mov a,r5
rlc a
mov r5,a
mov a,r4
rlc a
mov r4,a
mov a,r3
rlc a
mov r3,a
xch a,r2
rlc a
xch a,r2
mov f0,c
clr c
subb a,r7
mov r1,a
mov a,r2
subb a,r6
jb f0,ndvm1
jc ndvd1
ndvm1: mov r2,a
mov a,r1
mov r3,a
inc r5
ndvd1: djnz b,ndvl1
clr f0
ret
;====================延时 1 Second子程序=====================
dlay: mov r4,#40h
delay1:acall d1ms
djnz r4,delay1
ret
;======================延时 1 MS 子程序 =========================
d1ms: mov r6,#10
delay2:mov r7,#80h
djnz r7,$
djnz r6,delay2
ret
;=======================PID控制计算子程序=============================
;入口为2ah,出口为30h
PID: MOV R5,31H ;R(k)送R5R4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -