简易温度控制器设计

更新时间:2023-08-29 14:00:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

;====变量及常数定义段====

INCLUDE "VARDFN.ASM"

;===============

ORG 0000H

LJMP MAIN

ORG 0003H

LJMP INTS

ORG 000BH ;添加变量等定义模块

LJMP T0SER ;转T0中断服务子程序

ORG 002BH

LJMP T2SER

ORG 0030H

MAIN: INCLUDE "INITIAL.ASM" ;添加初始化模块

MLOOP: DJNZ T100MS,A2

MOV T100MS,#25

CLR TR1

MOV R2,TH1

MOV R3,TL1

SETB TR1

MOV TH1,#00H

MOV TL1,#00H

LCALL FTEMP

LCALL FTCTRL

A2: JNB TF0,$ ;4mS到?

CLR TF0 ;清定时标志

MOV TH0,#0F0H ;4mS定时重设

MOV TL0,#60H

LCALL RDKEY ;调用读键状态及去抖处理

LCALL DISP ;调用数码管动态显示

MOV A,STA ;根据状态值散转相应模块

ANL A,#03H

RL A

MOV DPTR,#MTAB

JMP @A+DPTR

MTAB: AJMP WORK0 ;转移到待机模块

AJMP WORK1 ;转移到赋值模块

AJMP WORK2 ;转移到查询模块

AJMP WORK3

AJMP WORK0 ;冗余

;====温度计模块====

WORK0: SETB KKG

MOV R0,#TEMP1

ACALL DSBUDT1

MOV DSB2,#00H

MOV DSB3,#00H

MOV DSB4,#01H

JB ESW1,WK01

JB ESW2,WK02

AJMP MLOOP

WK01: MOV STA,#02H

AJMP MLOOP

WK02: MOV STA,#01H

WK03: AJMP MLOOP

;====设置控制温度模块====

WORK1: SETB KKG

MOV DSB3,#00H

MOV DSB2,#00H

MOV R0,#TEMP0

ACALL DSBUDT1

MOV DSB4,#02H

JNB ESW2,WK11

MOV STA,#00H

SJMP WK13

WK11: CLR A

JB EK0,WK12

INC A

JB EK1,WK12

INC A

JB EK2,WK12

INC A JB EK3,WK12 INC A JB EK4,WK12 INC A JB EK5,WK12 INC A JB EK6,WK12 INC A JB EK7,WK12 ;数据2送显缓 ;LD2亮 ;下次主循环返回WORK0模块 ;查询"0"键 ;查询"1"键 ;查询"2"键 ;查询"3"键 ;查询"4"键 ;查询"5"键 ;查询"6"键 ;查询"7"键

INC A ;查询"8"键

JB EK8,WK12

INC A ;查询"9"键

JNB EK9,WK13

WK12: XCH A,TEMP0 ;键值从数据2的右边移入 SWAP A

ANL A,#0F0H

ORL TEMP0,A

WK13: AJMP MLOOP

;====开关方式温度控制器模块====

WORK2: MOV R1,#TEMP0 ;数据2送显缓

ACALL DSBUDT2

MOV R0,#TEMP1

ACALL DSBUDT1

MOV DSB4,#04H

MOV A,TEMP1

CLR C

SUBB A,TEMP0

JNC WK22

WK21: CLR KKG

SETB LD8

AJMP WK23

WK22: SETB KKG

WK23: JNB ESW1,WK24

MOV STA,#03H

SETB KKG

WK24: AJMP MLOOP

;====脉冲式温度控制模块====

WORK3: SETB EA

MOV R1,#TEMP0

ACALL DSBUDT2

MOV R0,#TEMP1

ACALL DSBUDT1

MOV DSB4,#08H

JNB ESW1,WK31

CLR EA

MOV STA,#00H

WK31: AJMP MLOOP

;====将压缩BCD码送显缓====

DSBUDT1:MOV A,@R0

ANL A,#0FH

MOV DSB0,A

MOV A,@R0

ANL A,#0F0H

SWAP A

MOV DSB1,A

RET

DSBUDT2:MOV A,@R1

ANL A,#0FH

MOV DSB2,A

MOV A,@R1

ANL A,#0F0H

SWAP A

MOV DSB3,A

RET

;====T0中断服务子程序====

;====中断服务子程序====

INTS: ;MOV DSB4,#0AAH

MOV TL2,TCTRL1

MOV TH2,TCTRL0

SETB TR2 ;外部中断;开启T2并允许中断

SETB ET2 ;允许T2中断

CLR TF2

RETI

T2SER: ;MOV DSB4,#55H

CLR KKG ;T2中断触发可控硅

CLR TR2

CLR TF2

CLR ET2

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

SETB KKG

RETI

T0SER: RETI

;====通用子程序段====

INCLUDE "RDKEY.ASM" ;添加读键状态及去抖处理子程序 INCLUDE "DISP.ASM" ;添加数码管动态扫描显示子程序 INCLUDE "FTEMP.ASM" ;脉冲计数值转换温度值子程序 INCLUDE "FTCTRL.ASM" ;求控制时间或T2定时器初值子程序 END

INITIAL:MOV SP,#60H

MOV R0,#20H

MOV R1,#60H

QINGLIN:CLR A

MOV @R0,A

INC R0

DJNZ R1,QINGLIN

MOV KC2,#30

MOV TCMAX0,#0E0H

MOV TCMAX1,#0C0H

MOV SECL,#250

MOV T100MS,#25

MOV TEMP0,#00H

MOV STA,#00H

MOV DSW,#00H

MOV DSB0,#02H

MOV DSB1,#05H

MOV DSB2,#09H

MOV DSB3,#08H

MOV DSB4,#0FFH

MOV TMOD,#51H

SETB TR0

A1: JNB TF0,$

CLR TF0

MOV TH0,#0F0H

MOV TL0,#60H

LCALL DISP

DJNZ SECL,A1

SETB TR1

SETB EX0

SETB IT0

;====读矩阵、独立按键子程序(延时去抖)====

RDKEY: ORL P2,#0FFH ;关闭LED数码显示器

CLR ROW0 ;ROW0=0,扫描K0~3键

NOP ;延时,键盘线越长延时越长

NOP

MOV A,P2

ANL A,#0FH ;K0~3键位保留

XRL A,#0FH ;求反转正逻辑

MOV R6,A ;新的键状态暂存R6

ORL P2,#0FFH ;关闭LED数码显示器

CLR ROW1 ;ROW1=0,扫描K4~7键

NOP ;延时,键盘线越长延时越长

NOP MOV A,P2 ANL A,#0FH XRL A,#0FH SWAP A ADD A,R6 MOV R6,A ORL P2,#0FFH CLR ROW2 NOP NOP MOV A,P2 ;K4~7键位保留 ;求反转正逻辑 ;新的键状态暂存R6 ;关闭LED数码显示器 ;ROW2=0,扫描K8~11键 ;延时,键盘线越长延时越长

ANL A,#03H ;K8~9键位保留

XRL A,#03H ;求反转正逻辑

MOV R7,A ;新的键状态暂存R7

ORL P2,#0FFH ;关闭矩阵键盘

ORL P1,#0C0H

MOV A,P1

ANL A,#0C0H

XRL A,#0C0H

ADD A,R7

MOV R7,A

;读独立按键 ;接独立键盘的位保留 ;求反转正逻辑 CJNE A,KEY0,RDK0 ;键状态变化则转移 CJNE A,KEY1,RDK0

MOV KTMR,#05H ;去抖延时器加载初值 SJMP RDK1

RDK0: MOV A,KTMR ;过了延时时间?

JZ RDK1

DEC KTMR ;延时未结束

MOV R7,KEY1 ;放弃不稳定的键状态

MOV R6,KEY0

RDK1: MOV A,KEY1 ;键前沿提取

XRL A,R7

ANL A,R7

MOV EKEY1,A

MOV KEY1,R7 ;启用键的新状态

MOV A,KEY0 ;键前沿提取

XRL A,R6

ANL A,R6

MOV EKEY0,A

MOV KEY0,R6 ;启用键的新状态

RET

;====脉冲计数值查表转换为温度====

;入口条件<R2:R3>=当前脉冲计数值

;出口<TEMP0:TEMP1>=温度值(压缩BCD码)

;使用R2~R7,ACC,PSW,B,DPTR

FTEMP: CLR A

MOV TEMP1,A

MOV R6,A

MOV R7,A

MOV DPTR,#TTAB

FTP0: MOV A,TEMP1 ;读某温度脉冲数

RL A

MOVC A,@A+DPTR

MOV R4,A

MOV A,TEMP1

RL A

INC A

MOVC A,@A+DPTR

MOV R5,A

CLR C ;<R4:R5>=当前脉冲数-某温度脉冲数 MOV A,R3

SUBB A,R5

MOV R5,A

MOV A,R2

SUBB A,R4

MOV R4,A

JC FTP2 ;"当前脉冲数<某温度脉冲数"则转移 MOV A,R5 ;<R6:R7>=<R4:R5>

MOV R7,A

MOV A,R4

MOV R6,A

MOV A,TEMP1

CJNE A,#99,FTP1

SJMP FTP3

FTP1: INC TEMP1

SJMP FTP0

FTP2: MOV A,R5

ADD A,R7

MOV A,R4

ADDC A,R6

JC FTP3

MOV A,TEMP1

JZ FTP3

DEC TEMP1

FTP3: MOV A,TEMP1 ;温度值转换为压缩BCD码 MOV B,#10

DIV AB

SWAP A

ADD A,B

MOV TEMP1,A

RET

TTAB: DW 213,224,235,246,258,270,283,296,310,324

DW 339,354,370,387,404,421,439,458,477,497

DW 518,539,561,583,606,630,654,680,705,731

DW 758,786,814,843,873,903,934,965,997,1030

DW 1063,1097,1131,1166,1202,1238,1274,1311,1348,1386 DW 1424,1463,1502,1542,1581,1621,1662,1702,1743,1784 DW 1825,1867,1908,1950,1991,2033,2075,2116,2158,2200 DW 2241,2283,2324,2365,2406,2447,2487,2527,2567,2607 DW 2646,2686,2724,2763,2801,2838,2876,2913,2949,2985 DW 3020,3056,3090,3124,3158,3191,3224,3256,3288,3319

;====求控制时间或T2定时器初值子程序====

;入口条件<R2:R3>=当前测得的脉冲数

;出口条件<TCTRL0:1>=T2定时器初值

;使用ACC、B、PSW、DPTR、R2~R5

FTCTRL: MOV A,TEMP0 ;设定温度(压缩BCD)转二进制 MOV R5,A

SWAP A

ANL A,#0FH

MOV B,#0AH

MUL AB

XCH A,R5

ANL A,#0FH

ADD A,R5

MOV R5,A

MOV DPTR,#TTAB ;查设定温度脉冲数

RL A

MOVC A,@A+DPTR

MOV R4,A

MOV A,R5

RL A

INC A

MOVC A,@A+DPTR

CLR C ;<R2:3>=本次误差

SUBB A,R3

MOV R3,A

MOV A,R4

SUBB A,R2

FTC0:

FTC1:

FTC2:

FTC3:

FTC4:

MOV R2,A JB ACC.7,FTC0 ;误差为负则转移 JNZ FTC2 ;偏差>256则转移 SJMP FTC1 CPL A JNZ FTC5 ;偏差<-256则转移 MOV A,R3 ;<R4:5>=KC2*本次误差 MOV B,KC2 MUL AB MOV R5,A MOV R4,B MOV A,R2 MOV B,KC2 MUL AB ADD A,R4 MOV R4,A MOV A,R5 ;<R4:5>=<R4:5>+<TCTRL0:1> ADD A,TCTRL1 MOV R5,A MOV A,R4 JB ACC.7,FTC4 ;被加数为正?负则转移 ADDC A,TCTRL0 MOV R4,A JNC FTC3 ;和<最大值? MOV R4,#0FFH ;<R4:5>=最大值 CJNE R4,#0FFH,FTC6 MOV R5,#00H SJMP FTC6 ADDC A,TCTRL0 MOV R4,A

CLR C ;和>最小值?

MOV A,R5

SUBB A,TCMAX1

MOV A,R4

SUBB A,TCMAX0

JNC FTC6

FTC5: MOV R4,TCMAX0 ;<R4:5>=最小值

MOV R5,TCMAX1

FTC6: MOV C,EX0 ;保存外中断INT0设置 CLR EX0 ;关闭外中断INT0

MOV TCTRL0,R4 ;<TCTRL0:1>=<R4:5>

MOV TCTRL1,R5

MOV EX0,C ;恢复外中断INT0设置 RET

;====5位数码管扫描子程序====

DISP: ORL P2,#1FH ;关闭数码显示器

MOV A,DSW ;根据扫描循环变量转移

ANL A,#07H

RL A

MOV DPTR,#DSTAB

JMP @A+DPTR

DSTAB: AJMP DIS0

AJMP DIS1

AJMP DIS2

AJMP DIS3

AJMP DIS4

AJMP DIS0

AJMP DIS0

AJMP DIS0

DIS0: MOV A,DSB0

ANL A,#0FH

MOV DPTR,#LED7

MOVC A,@A+DPTR

MOV P0,A CLR CS0 MOV DSW,#01H RET ;扫描个位数码管 ;查显缓个位值的七段码表 ;七段码送P0口 ;点亮个位数码管 ;扫描指针指向下十位

DIS1: MOV A,DSB1 ;扫描十位数码管

ANL A,#0FH

MOV DPTR,#LED7 ;查显缓个位值的七段码表 MOVC A,@A+DPTR

MOV P0,A ;七段码送P0口

CLR CS1 ;点亮个位数码管

MOV DSW,#02H ;扫描指针指向下百位

RET

DIS2: MOV A,DSB2 ;扫描百位数码管

ANL A,#0FH

MOV DPTR,#LED7 ;查显缓个位值的七段码表 MOVC A,@A+DPTR

MOV P0,A ;七段码送P0口

CLR CS2 ;点亮个位数码管

MOV DSW,#03H ;扫描指针指向下千位

RET

DIS3: MOV A,DSB3 ;扫描千位数码管

ANL A,#0FH

MOV DPTR,#LED7 ;查显缓个位值的七段码表 MOVC A,@A+DPTR

MOV P0,A CLR CS3 ;七段码送P0口 ;点亮个位数码管

MOV DSW,#04H ;扫描指针指向下指示灯 RET

DIS4: MOV A,DSB4 ;扫描指示灯

CPL A

MOV P0,A

CLR CS4

MOV DSW,#00H

RET

;====LED段码表====

LED7: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H 码

;====变量定义段====

CS0 BIT P2.0 ;个位位选

CS1 BIT P2.1 ;十位位选

CS2 BIT P2.2 ;百位位选

CS3 BIT P2.3 ;千位位选

CS4 BIT P2.4 ;LED灯位选

ROW0 BIT P2.5

ROW1 BIT P2.6

ROW2 BIT P2.7

KKG BIT P3.3

;TF2 BIT T2CON.7

TR2 BIT T2CON.2

DSW EQU 30H ;位选计数

DSB0 EQU 31H ;显示缓冲单元个位

DSB1 EQU 32H ;显示缓冲单元十位

DSB2 EQU 33H ;显示缓冲单元百位

DSB3 EQU 34H ;显示缓冲单元千位

DSB4 EQU 20H ;显示缓冲单元指示灯状态

LD1 BIT DSB4.0 ;指示灯LD1控制位

LD2 BIT DSB4.1 ;指示灯LD2控制位

LD3 BIT DSB4.2 ;指示灯LD3控制位

LD4 BIT DSB4.3 ;指示灯LD4控制位

LD5 BIT DSB4.4 ;指示灯LD5控制位

LD6 BIT DSB4.5 ;指示灯LD6控制位

LD7 BIT DSB4.6 ;指示灯LD7控制位

LD8 BIT DSB4.7 ;指示灯LD8控制位

KEY0 EQU 21H ;键状态字

KEY1 EQU 22H

K0 BIT KEY0.0 ;K0键

K1 BIT KEY0.1 ;K1键 ;0~9,a~f共16个七段

K2 BIT KEY0.2 ;K2键

K3 BIT KEY0.3 ;K3键

K4 BIT KEY0.4 ;K4键

K5 BIT KEY0.5 ;K5键

K6 BIT KEY0.6 ;K6键

K7 BIT KEY0.7 ;K7键

K8 BIT KEY1.0 ;K8键

K9 BIT KEY1.1 ;K9键

SW1 BIT KEY1.6 ;SW1键

SW2 BIT KEY1.7 ;SW2键

EKEY0 EQU 24H ;键前沿字 EKEY1 EQU 25H

EK0 BIT EKEY0.0 ;K0键前沿

EK1 BIT EKEY0.1 ;K1键前沿

EK2 BIT EKEY0.2 ;K2键前沿

EK3 BIT EKEY0.3 ;K3键前沿

EK4 BIT EKEY0.4 ;K4键前沿

EK5 BIT EKEY0.5 ;K5键前沿

EK6 BIT EKEY0.6 ;K6键前沿

EK7 BIT EKEY0.7 ;K7键前沿

EK8 BIT EKEY1.0 ;K8键前沿

EK9 BIT EKEY1.1 ;K9键前沿

ESW1 BIT EKEY1.6 ;SW1键前沿 ESW2 BIT EKEY1.7 ;SW2键前沿 KTMR EQU 35H ;键去抖延时器 STA EQU 36H

TEMP0 EQU 37H

TEMP1 EQU 38H

T100MS EQU 39H

SECL EQU 3AH

TCTRL0 EQU 3BH

TCTRL1 EQU 3CH

TCMAX0 EQU 3DH

TCMAX1 EQU 3EH

KC2 EQU 3FH

本文来源:https://www.bwwdw.com/article/bgfi.html

Top