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

📄 main(2001426).asm

📁 加热器的温度控制
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;数字温度控制显示程序 (CPU:89C2051 晶体:12MHz)
;作者:高宇
;2001、3、17

;主程序用工作寄存器:第0组
;定时测量工作寄存器:第1组
;显示用工作寄存器:  第2组
;AT24C02读写工作寄存器:第3组

MainRAM		SEGMENT DATA
MainMark	SEGMENT BIT

$NOLIST
$INCLUDE        (Lib.H)
$INCLUDE        (END.H)
$LIST

;*************************************************************

SetTimer	EQU	10	;数码管闪烁频率设置
SetWaitTimer	EQU	200	;设置加热温度时,键没按下后等待返回温度显示的时间
SetChangSpeed1	EQU	20	;设定按住键盘后正常速度时增加或减少控制温度的速度()
SetChangSpeed2	EQU	4	;设定按住键盘一段时间后快速增加或减少控制温度的速度()
SetPushKeyMum	EQU	5	;同一键按住五个闪烁周期后加速控制温度设定速度
SetDisplayBit	EQU	3	;设置显示的位数

TempUpH		EQU	01H
TempUpL		EQU	2CH	;设定温度上限为300度
TempDownH	EQU	00H
TempDownL	EQU	00H	;设定温度下限为0度

SetCompKey	EQU	5	;连续读5次,键值相同说明按下了一个键
UpKey		EQU	10H	;上键
DownKey		EQU	11H	;下键
UnKey		EQU	55H	;无键

TempOffset	EQU	01H	;滞回比较温度	;
;-------------------------------------------------------------
;DATA 20H
RSEG	MainMark

XSBJ:		DBIT	1	;数码管显示标记(0 不显示  1 显示)
FHBJ:		DBIT	1	;返回温度显示(0 不返回 1 返回)
ChangOk:	DBIT	1	;改变控制温度允许与否标记(0 否 1 可)
DisplayStatu:	DBIT	1	;数码管显示状态(0 不闪烁  1 闪烁)
SetTempChang:	DBIT	1	;上一步重新设定了控制温度(1 重新设定  0 没有)
ReadTempOK:	DBIT	1	;已经读取了温度
TempContr:	DBIT	1	;是否加热标记

;-------------------------------------------------------------
RSEG	MAINRAM

SetTempHBak1:	DS	1
SetTempLBak1:	DS	1	;设定温度值存贮

VIH:		DS	1	;待测电压整数部分
VIL:		DS	1	;待测电压小数部分
CLOCK:		DS	1	;检测次数计数器
TOTALH:		DS	1	;临时累加器高字节
TOTALM:		DS	1	;临时累加器中字节
TOTALL:		DS	1	;临时累加器低字节
DisPort:	DS	1	;动态显示时应显示的数码管号
Mumber0:	DS	1	;第一个数码管显示数值
Mumber1:	DS	1	;第二个数码管显示数值
Mumber2:	DS	1	;第三个数码管显示数值

Timer:		DS	1	;时间基准(65ms)
Timer1:		DS	1	;时间基准(65ms)
Timer2:		DS	1	;时间基准(65ms)

KeyCount:	DS	1	;同一键按下计数
KeyCodeTemp:	DS	1	;键值缓存
KeyCode:	DS	1	;保存键值

SetTempH:	DS	1
SetTempL:	DS	1	;设定温度值存贮
ChangSpeed:	DS	1	;控制温度设定时速度
PushKeyMumber:	DS	1	;同一键一直按下次数
UpPushKeyCode:	DS	1	;上一次按键保存

BeforTempH:	DS	1
BeforTempL:	DS	1	;上一次温度保存
TempH:          DS      1
TempL:          DS      1


SetTempHBak2:	DS	1
SetTempLBak2:	DS	1	;设定温度值存贮

Counter:	DS	1	;计数器
ProgramAddressT1:	DS	2;断点地址保存

TempSub	:	DS	1	;保存实际温度与控制温度差值
ContrlMumber:	DS	1
;-------------------------------------------------------------
SetTempHE2PROM1	EQU	010H
SetTempLE2PROM1	EQU	011H

SetTempHE2PROM2	EQU	030H
SetTempLE2PROM2	EQU	031H

SetTempHE2PROM3	EQU	050H
SetTempLE2PROM3	EQU	051H	;设定好的控制温度值保存地址及备份地址
;-------------------------------------------------------------


RC		BIT     P1.2	;92h ;RC充放电控制端口(低电平放电)
KeyPort		BIT	P1.2	;键输入口

JUDE		BIT     P3.6	;0B6H;比较电压判断口

XM0		BIT	P1.5	;第三个数码管控制口
XM1		BIT	P1.4	;第四个数码管控制口
XM2		BIT	P1.3	;第五个数码管控制口

TempContrPort	BIT	P1.6	;加热控制(1 加热  0 停止)
;*************************************************************
ISEG    AT      05FH
STACK:  DS      01EH
;分配堆栈



CSEG    AT      0000H
USING	0
;使用第0组寄存器
Start:
	LJMP    Main		;主程序
;-------------------------------------------------------------

CSEG    AT      0003H
	LJMP	Start

CSEG    AT      000BH
	LJMP    DINS		;T0:定时中断子程序

CSEG    AT      0013H
	LJMP	Start

CSEG    AT      001BH
	LJMP    DINS1		;T1:定时中断子程序

CSEG    AT      0023H
	LJMP	Start

;-------------------------------------------------------------
CSEG    AT      030H
Main:


	CLR	TempContr

	MOV     SP,#STACK-1
	MOV     SP,#STACK-1
	;设置堆栈
	CLR	EA
 	MOV	R0,#20H
CLEAR:
	MOV	@R0,A		;清零片内单元
	INC	R0
	CJNE	R0,#5FH,CLEAR

	CLR	ReadTempOK

	MOV	DisPort,#00H	;显示第1个数码管
	MOV	KeyCode,#UnKey
	MOV	KeyCodeTemp,#UnKey

	CLR	EA
	MOV	TMOD,#11H	;定时器设置
	MOV	TH0,#0D8H	;约10mS检测一次
	SETB	RC		;电容放电

	MOV	ContrlMumber,#00H
        MOV     VIH,#00H
        MOV     VIL,#00H
        MOV     TempH,#00H
        MOV     TempL,#00H   

MainEncrypt:
	LCALL	SetTemp		;启动时显示控制温度

  	MOV	A,#00H
	LCALL	SetDisplayMode	;数码管常亮
LOOP:
	SETB	EA
        
        JNB	ReadTempOK,LOOP00
	LCALL	CompTemp        
LOOP00:
        
        MOV     R2,VIH
        MOV     R3,VIL

	MOV	DPTR,#TempTab
	MOV	R1,#19
	LCALL	UNEX2
	CJNE	A,#0FFH,LOOP0
	MOV	R2,BeForTempH
	MOV	R3,BeForTempL
	SJMP	LOOP1		;温度超限则显示上一次的正常温度

LOOP0:
	MOV	A,R4
	MOV	BeForTempH,A
	MOV	TempH,A        
	MOV	R2,A
	MOV	A,R5
	MOV	BeForTempL,A
        MOV     TempL,A
	MOV	R3,A
LOOP1:

        LCALL   IBTD2		;把数值转换成BCD码并存入显示缓冲区中
	MOV	A,KeyCode
	CJNE	A,#UnKey,LOOP2
	LJMP	LOOP
LOOP2:
	LCALL	SetTemp		;若有键按下则进入温度设置模块
	LJMP	LOOP
	NOP
	NOP
;*************************************************************
CompTemp:
	MOV	R2,SetTempH
	MOV	R3,SetTempHBak1
	MOV	R4,SetTempHBak2
	LCALL	VOTE3
	MOV	SetTempH,A
	JNB	F0,CompTemp1
	LCALL	ReadSetTempDate
	LCALL	BackSetTemp

CompTemp1:
	MOV	R2,SetTempL
	MOV	R3,SetTempLBak1
	MOV	R4,SetTempLBak2
	LCALL	VOTE3
	MOV	SetTempL,A
	JNB	F0,CompTemp2
	LCALL	ReadSetTempDate
	LCALL	BackSetTemp

CompTemp2:
	JB	SetTempChang,CompTemp20
;上一步是否已重新设置了新的温度控制值,是则转
	JNB	TempContr,CompTemp4
;是否处于加热状态,没有则转
CompTemp20:
	CLR	SetTempChang
;清除设置新控制温度标志
	CLR	C
	MOV	A,TempL   
	SUBB	A,SetTempL
	MOV	B,A
	MOV	A,TempH
	SUBB	A,SetTempH
	JC	CompTemp5	
;温度是否超过上限判断,否则转。

CompTemp3:
	CLR	C
	MOV	A,TempL   
	SUBB	A,#low(310)
	MOV	A,TempH
	SUBB	A,#high(310)
	JNC	CompTemp31
;温度是否超过300度判断,否则转。
	CLR	TempContr
;停止加热
	RET
CompTemp31:
;温度超过设定300度
	LJMP	ErrorDisplay	
CompTemp4:
;处于没加热(超温)状态
;当温度小于控制温度一定值后再加热
	CLR	C
	MOV	A,TempL 
	ADD	A,#TempOffset
	SUBB	A,SetTempL
	MOV	B,A
	MOV	A,TempH
	SUBB	A,SetTempH
	JNC	CompTemp3	
;设定温度是否超过上限判断,是则转	
CompTemp5:
	CLR	C
	MOV	A,#20
	SUBB	A,B
	JNC	CompTemp6
	MOV	A,#00H
CompTemp6:
	MOV	TempSub,A
	SETB	TempContr
;否则处于加热状态
	RET

;*************************************************************
BackSetTemp:

	MOV	A,SetTempH
	MOV	SetTempHBak1,A
	MOV	SetTempHBak2,A

	MOV	A,SetTempL
	MOV	SetTempLBak1,A
	MOV	SetTempLBak2,A

	RET


;*************************************************************
;设定控制温度子程序
SetTemp:
	CLR	TR0
	CLR	ET0		;关闭温度测量
        CLR     ET1
        CLR     TR1
        
	CLR	TempContrPort

	MOV	Timer1,#00H	;清返回主程序时间计数器
	CLR	FHBJ		;清可返回标记

	MOV	Timer2,#00H	;清控制温度改变时间计数器
	MOV	ChangSpeed,#SetChangSpeed1
	SETB	ChangOk		;按住键后可改变控制温度值

	MOV	PushKeyMumber,#00H


;------------------------------------------------------------
	LCALL	ReadSetTempDate	;读取E2PROM中的设定温度值

;------------------------------------------------------------
	MOV	A,#01H
	LCALL	SetDisplayMode	;数码管闪烁


;-------------------------------------------------------------
SetTemp1:
	LCALL	ReadKey
	MOV	A,KeyCode

	CJNE	A,#UnKey,SetTemp10
;-------------------------------------------------------------
	MOV	Timer2,#00H	;清控制温度改变时间计数器
	MOV	ChangSpeed,#SetChangSpeed1
	SETB	ChangOk		;按住键后可改变控制温度值
	MOV	PushKeyMumber,#00H
	MOV	UpPushKeyCode,#UnKey
	LJMP	SetTemp3
;-------------------------------------------------------------
SetTemp10:					;有键盘按下
	JNB	ChangOk,SetTemp3
	CLR	ChangOk				;改变了控制温度后不允许马上再改变
						;等下次时间到后可再改变
	PUSH	ACC

	CJNE	A,UpPushKeyCode,SetTemp11	;为上键否
	INC	PushKeyMumber			;按键次数加1
	MOV	A,PushKeyMumber
	CJNE	A,#SetPushKeyMum,SetTemp12	;按住相同键的时已到指定时间否
	MOV	PushKeyMumber,#00H		;清按键时间
	MOV	ChangSpeed,#SetChangSpeed2	;加速控制温度调整时间
SetTemp12:
	SJMP	SetTemp13
SetTemp11:
	MOV	UpPushKeyCode,A			;按了另外键
	MOV	PushKeyMumber,#00H
	MOV	ChangSpeed,#SetChangSpeed1	;重新判别按键时间
SetTemp13:
	POP	ACC
;------------------------------------------------------------
	CJNE	A,#UpKey,SetTemp2
	CLR	C
	MOV	A,SetTempL
	SUBB	A,#TempUpL
	MOV	A,SetTempH
	SUBB	A,#TempUpH
	JNC	SetTemp14	;设定温度是否超过上限判断

	MOV	A,SetTempL
	ADD	A,#01
	MOV	SetTempL,A
	MOV	A,SetTempH
	ADDC	A,#00H
	MOV	SetTempH,A
	SJMP	SetTemp3
SetTemp14:
	MOV	SetTempL,#TempDownL
	MOV	SetTempH,#TempDownH
        SJMP	SetTemp3


SetTemp2:
	CJNE	A,#DownKey,SetTemp3
	CLR	C
	MOV	A,#TempDownL
	SUBB	A,SetTempL
	MOV	A,#TempDownH
	SUBB	A,SetTempH
	JNC	SetTemp21	;设定温度是否低于下限判断

	CLR	C
	MOV	A,SetTempL
	SUBB	A,#01
	MOV	SetTempL,A
	MOV	A,SetTempH
	SUBB	A,#00H
	MOV	SetTempH,A
        SJMP	SetTemp3
SetTemp21:
	MOV	SetTempL,#TempUpL
	MOV	SetTempH,#TempUpH

SetTemp3:
;------------------------------------------------------------

	LCALL	BackSetTemp	;备分控制温度到其余二个单元中
 ;------------------------------------------------------------
	MOV     R2,SetTempH
        MOV     R3,SetTempL
        LCALL   IBTD2		;把数值转换成BCD码并存入显示缓冲区中
	LCALL	Display		;显示数码
	LCALL	Dealy

	JNB	FHBJ,SetTemp4	;没到返回时间则继续处于设定温度状态
;------------------------------------------------------------
        CLR     ET1
        CLR     TR1

	LCALL	WriterSetTempDate;控制温度写入E2PROM中

	SETB	SetTempChang	;重新设定了控制温度
;------------------------------------------------------------
	SETB	TR0
	SETB	ET0

	MOV	ContrlMumber,#00H

	MOV	A,#00H
	LCALL	SetDisplayMode	;数码管常亮
	RET

SetTemp4:
         LJMP   SetTemp1
	 NOP
	 NOP

;*************************************************************
;读取设定温度
ReadSetTempDate:
	LCALL	CloseDisplay
        MOV	Counter,#00H

ReadSetTempDate1:
	MOV	A,#SetTempHE2PROM1
	LCALL	ReadI2CDate
	MOV	R2,A
	LCALL   DealyLong
	MOV	A,#SetTempHE2PROM2
	LCALL	ReadI2CDate
	MOV	R3,A
	LCALL   DealyLong
	MOV	A,#SetTempHE2PROM3
	LCALL	ReadI2CDate
	MOV	R4,A
	LCALL   DealyLong

	LCALL	VOTE3
	JB	F0,ReadSetTempDate2
	MOV	SetTempH,A	;设定温度值存贮


	MOV	A,#SetTempLE2PROM1
	LCALL	ReadI2CDate
	MOV	R2,A
	LCALL   DealyLong
	MOV	A,#SetTempLE2PROM2
	LCALL	ReadI2CDate
	MOV	R3,A
	LCALL   DealyLong
	MOV	A,#SetTempLE2PROM3
	LCALL	ReadI2CDate
	MOV	R4,A
	LCALL   DealyLong

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -