⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 我同学提供的温度采样子程序.asm

📁 也用到了温度PID控制,和我门的不同是采用D/A输出控制量的.主要由温度采样--->温度滤波子程序--->温度线性化----->温度设定值等模块组成.
💻 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 + -