📄 我同学提供的温度采样子程序.asm
字号:
;程序作者: 马 良 QQ:8297327 电话:13087664858
;温度采样子程序:
;采样值存放在2100h----2163h
;*********************************************************************************
tmpin: mov r0,#00h ;温度采样
naddt: mov a,#00h
mov dptr,#9004h ;读取温度值
movx @dptr,a
clr c
jnc $
mov a,adcc ;ADC缓冲
mov dph,#21h
mov dpl,r0 ;从2100H-2164H存放100个功率采样值
movx @dptr,a
inc r0
cjne r0,#64h,naddt
ret
;*********************************************************************************
;温度滤波子程序:
;滤波值存放在1ah
;*********************************************************************************
tfilter: mov dptr,#2100h ;温度滤波
mov r2,#100 ;采样值首地址
clr psw.5 ;psw.5作为交换标志
dec r2
mov a,r2
mov r3,a
slp1: movx a,@dptr ;读第一个数
mov r6,a
inc dptr
movx a,@dptr ;读下一个数
mov b,a
mov a,r6
cjne a,b,snext1
snext1: jnc snext2 ;a>b时不交换
movx @dptr,a ;交换
clr c
mov a,dpl
subb a,#01h
mov dpl,a
mov a,dph
subb a,#00h
mov dph,a
mov a,b
movx @dptr,a
setb psw.5 ;建立交换标志
inc dptr
snext2: djnz r3,slp1 ;内循环
djnz r2,snext3
sjmp ave
snext3: jb psw.5,tfilter
ave: mov r2,#60 ;置初值
mov r5,#00h
mov r4,#00h
mov dptr,#2114h
clr c
slp2: movx a,@dptr ;计算和
add a,r4
mov r4,a
clr a
addc a,r5
mov r5,a
clr c
inc dptr ;修改控制变量
djnz r2,slp2 ;循环终止控制
mov r7,#60
wfcf1: mov r2,#00h
mov r3,#00h
mov r6,#00h
mov b,#16
clp01: clr c
mov a,r4
rlc a
mov r4,a
mov a,r5
rlc a
mov r5,a
mov a,r3
rlc a
mov r3,a
xch a,r2
rlc a
xch a,r2
mov psw.5,c
clr c
subb a,r7
mov r1,a
mov a,r2
subb a,r6
jb psw.5,clp11
jc clp21
clp11: mov r2,a
mov a,r1
mov r3,a
inc r4
clp21: djnz b,clp01
mov a,r3
jb acc.7,tadd1
clr c
mov a,r3
rlc a
subb a,r7
jc return3
tadd1: mov a,r4
add a,#01h
mov r4,a
mov a,r5
addc a,#00h
mov r5,a
clr psw.5
sjmp return4
return3: setb psw.5
return4: mov 1ah,r4
ret
;*********************************************************************************
;温度线性化子程序:
;入口:1ah 出口:1ch , 1dh
;*********************************************************************************
tlinep: mov dptr, #ttab ;温度线性化
xlp1: clr a ;送表首址到dptr
movc a,@a+dptr ;dptr中内容送赋给a
cjne a,1ah,xlp2 ;与采样值x比较
xlp0: mov r0,#1bh ;相等时开始取值
mov r2,#03h
xlp00: mov @r0,a ;从表中取值存入指定地方
inc r0
inc dptr
clr a
movc a,@a+dptr
djnz r2,xlp00
sjmp xys
xlp2: jc xlp3 ;小于采样值x,转xlp3
clr c
mov a,dpl
subb a,#01h
mov dpl,a ;大于采样值x时,指针跳回上次xi值并取值
mov a,dph
subb a,#00h
mov dph,a
clr c
mov a,dpl
subb a,#01h
mov dpl,a ;大于采样值x时,指针跳回上次xi值并取值
mov a,dph
subb a,#00h
mov dph,a
clr a
movc a,@a+dptr
sjmp xlp0
xlp3: inc dptr ;转下一单元进行比较
inc dptr
sjmp xlp1
xys: clr c
mov a,1ah
subb a,1bh
mov b,#10
mul ab
mov r5,b
mov r4,a
clr c
mov a,1dh
subb a,1bh
mov r7,a
lcall wfcf
mov a,r4
orl a,#0a0h
mov 1dh,a
ret
;*********************************************************************************
;温度设定值子程序:
;入口: 2bh,2ch 出口:41h
;*********************************************************************************
wdzh: mov a,2bh ;温度值转换成电压值
swap a ;温度值BCD码转换成十六进制
anl a,#0fh
mov b,#10
mul ab
mov r3,a
mov a,2bh
anl a,#0fh
add a,r3
aaa: mov dptr,#ttab ;查表找相对应的电压值
clr c
subb a,#0ah
rlc a
mov r1,a
movc a,@a+dptr
mov r2,a
mov a,r1
add a,#2
movc a,@a+dptr
clr c
subb a,r2
mov b,a
mov a,2ah
anl a,#0fh
mul ab
mov r4,a
mov r5,b
mov r7,#10
lcall wfcf
mov a,r4
add a,r2
cjne a,41h,treturn1
ljmp treturn2
treturn1:mov 41h,a ;求得电压值存放于47h
mov 33h,#00h
mov 34h,#00h
mov 35h,#00h
mov 36h,#00h
treturn2:ret
ttab: db 03h,0ah,0bh,0bh
db 11h,0ch,18h,0dh
db 1fh,0eh,2ch,0fh
db 32h,10h,3ah,11h
db 3dh,12h,43h,13h
db 4bh,14h,50h,15h
db 5ah,16h,60h,17h
db 66h,18h,6fh,19h
db 77h,1ah,7ch,1bh
db 81h,1ch,89h,1dh
db 8fh,1eh,95h,1fh
db 9ch,20h,0a1h,21h
db 0a7h,22h,0aeh,23h
db 0b5h,24h,0b9h,25h
db 0beh,26h,0c4h,27h
db 0cah,28h,0d0h,29h
db 0d5h,2ah,0dah,2bh
db 0dfh,2ch,0e4h,2dh
db 0e8h,2eh,0ech,2fh
db 0f1h,30h,0f3h,31h
db 0f8h,32h
;*********************************************************************************
;十六进制转换为十进制子程序:
;*********************************************************************************
htod: mov r1,a
anl a,#0f0h
swap a
mov r2,a
mov a,#00h
cjne r2,#00h,hdlop
ljmp shizero
hdlop: add a,#16h
da a
djnz r2,hdlop
shizero: mov r2,a
mov a,r1
anl a,#0fh
da a
add a,r2
da a
endd: ret
;*********************************************************************************
;温度PID控制子程序: (位置式)
;入口:1ah,41h 出口:49h,4ah
;*********************************************************************************
tempc: mov 42h,#02h
mov 4bh,#65h ;设置P.I.D.参数值
mov 4ch,#1eh
mov 4dh,#30h
mov 4eh,#0a4h
mov 4fh,#24h
mov 40h,#7ah
clr c ;温度控制
mov a,41h
cjne a,1ah,comp
ljmp return2
comp: clr c ;设定值减采样值
subb a,1ah
jnc comp1 ;取绝对值
cpl a
add a,#01h
comp1: clr c
cjne a,42h,cnext1 ;42h存控制精度的值
ljmp return2
cnext1: jnc comp2
ljmp return2
comp2: clr c ;PID控制
mov r5,#00h
mov r4,41h ;给定值送r5r4
mov r3,#00h
mov r2,1ah ;采样值送r3r2
lcall szqb
lcall szjf ;计算偏差量ek
mov 31h,r7
mov 32h,r6 ;ek送31h和32h
mov r5,4bh
mov r4,4ch ;系数I送r5r4
mov r0,#3bh ;积始地址赋给r0
lcall sdcf ;求PI=I*ek
mov r5,31h
mov r4,32h
mov r7,4dh
mov r6,4eh ;系数p送r5r4
mov r0,#37h
lcall sdcf ;Pp=P*(ek-ek-1)
mov r5,3ah
mov r4,39h
mov r3,35h
mov r2,36h
lcall szjf ;Pp+PI
mov 35h,r7
mov 36h,r6
mov r5,31h
mov r4,32h
mov r3,33h
mov r2,34h
lcall szqb
lcall szjf ;ek+ek+2-ek-1
mov r5,4fh
mov r4,40h ;系数D送r5r4
mov r0,#37h
lcall sdcf ;PD=D*(ek+ek+2-2ek-1)
mov 33h,31h
mov 34h,32h
mov r5,3ah
mov r4,39h
mov r3,3eh
mov r2,3dh
lcall szjf ;Pp+PI+PD
mov a,r7
mov r3,a
mov a,r6
mov r2,a
mov r5,35h
mov r4,36h
lcall szjf ;Uk=Uk-1+Pp+PI+PD
mov a,r7
mov r5,a
mov a,r6
mov r4,a
mov r3,#00h
mov r2,41h
lcall szjf
mov 49h,r7
mov 4ah,r6
return2: ret
;*********************************************************************************
;温度控制量输出子程序:
;入口:49h,4ah 出口:DA转换器地址0b000h
;*********************************************************************************
tcda: mov a,49h
cjne a,#00h,cs4
ljmp cs5
cs4: mov r5,49h
mov r4,4ah
mov r3,#00h
mov r2,#80h
lcall szjf
mov a,r7
mov r5,a
mov a,r6
mov r4,a
mov r3,#00h
mov r2,41h
lcall szqb
lcall szjf
mov a,r7
cjne a,#00h,cs6
mov a,r6
ljmp cs7
cs6: cjne a,#80h,cs8
cs8: jnc cs9
mov a,#0ffh
ljmp cs0
cs9: mov a,#00h
ljmp cs0
cs5: mov a,4ah
clr c
subb a,41h
add a,#80h
cs7: cjne a,#0f8h,cs1
cs1: jc cs2
mov a,#0ffh
ljmp cs0
cs2: cjne a,#03h,cs3
cs3: jnc cs0
mov a,#00h
cs0: mov dptr,#0b000h
movx @dptr,a
ret
sdcf: mov a,r7
rlc a
mov 26h.0,c
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
mov 26h.1,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: lcall swcf
mov c,26h.0
anl c,26h.1
jc tpl
mov c,26h.0
orl c,26h.1
jnc tpl
dec r0
dec r0
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
inc r0
mov a,@r0
cpl a
addc a,#00h
mov @r0,a
inc r0
mov a,@r0
cpl a
addc a,#00h
mov @r0,a
tpl: ret
swcf: 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,a
mov a,r6
mov b,r5
mul ab
add a,r3
inc r0
mov @r0,a
clr psw.5
mov a,r2
addc a,b
mov r2,a
jnc last
setb psw.5
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,psw.5
addc a,#00h
inc r0
mov @r0,a
ret
szqb: mov a,r2
cpl a
add a,#01h
mov r2,a
mov a,r3
cpl a
addc a,#00h
mov r3,a
ret
szjf: mov a,r4
add a,r2
mov r6,a
mov a,r5
addc a,r3
mov r7,a
ret
wfcf: clr a
mov r3,a
mov a,r5
subb a,r7
jnc return
mov r0,#16
clp0: clr c
mov a,r4
rlc a
mov r4,a
mov a,r5
rlc a
mov r5,a
mov a,r3
rlc a
mov r3,a
clp1: subb a,r7
jc small
mov r3,a
inc r4
sjmp clp1
small: djnz r0,clp0
mov a,r3
jb acc.7,tadd2
clr c
mov a,r3
rlc a
subb a,r7
jc return
tadd2: mov a,r4
add a,#01h
mov r4,a
mov a,r5
addc a,#00h
mov r5,a
return: ret
delay: mov r6,#0ffh ;r7作为延时参数,调用前传递
d3: mov r5,#0ffh
nop
djnz r5,$
djnz r6,d3
djnz r7,delay
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -