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

📄 main.asm

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

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

;注:在调试板中,加热控制为P1.7,I2C器件开启为P1.6,而在实际电路板中相反

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	;下键
SetKey		EQU	12H	;设定键
UnKey		EQU	55H	;无键

TempOffset	EQU	00H	;滞回比较温度	;
;-------------------------------------------------------------
;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	;是否加热标记

TestCon:	DBIT	1	;确定采样基准值还是实际值
Timerout:	DBIT	1	;温度测量时间溢出标志
;-------------------------------------------------------------
RSEG	MAINRAM

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

VIH:		DS	1	;待测电压整数部分
VIL:		DS	1	;待测电压小数部分

VIHT:		DS	1	;待测电压或基准电压整数部分
VILT:		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	;设定温度值存贮

TempSub	:	DS	1	;保存实际温度与控制温度差值
ContrlMumber:	DS	1

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

;-------------------------------------------------------------
TempOffsetH:	DS	1
TempOffsetL:	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      026H
Main:


	CLR	TempContr

	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   


	MOV	TempOffsetH , #00H
	MOV	TempOffsetL , #00H	;起始时设置测量误差为0
	CLR	TestCon

	CLR	Timerout	;起始时温度测量没有溢出

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

  	MOV	A,#00H
	LCALL	SetDisplayMode	;数码管常亮
LOOP:
	SETB	EA
        
        JNB	ReadTempOK,LOOP00
	LCALL	CompTemp    
	
LOOP00:
        
	MOV	A , TempOffsetH
	ANL	A , #10000000B		;最高位表示误差方向
	JZ	LOOP101
	CLR	C
	MOV	A , VIL
	SUBB	A , TempOffsetL
	MOV	R3 , A
	MOV	A , TempOffsetH
	ANL	A , #01111111B
	MOV	R2 , A
	MOV	A , VIH
	SUBB	A , R2
	MOV	R2 , A
	AJMP	LOOP102
LOOP101:
	MOV	A , VIL
	ADD	A , TempOffsetL
	MOV	R3 , A
	MOV	A , VIH
	ADDC	A , TempOffsetH
	MOV	R2 , A			;进行测量误差修正
LOOP102:

	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:
	CJNE	A,#SetKey,LOOP3
	LJMP	LOOP
LOOP3:
	LCALL	SetTemp		;若有键按下则进入温度设置模块
	LJMP	LOOP
	NOP
	NOP
;*************************************************************
CompTemp:
	MOV	A,SetTempL
	ADD	A,#01H
	MOV	SetTempLBak1,A
	MOV	A,SetTempH
	ADDC	A,#0H
	MOV	SetTempHBak1,A

	CLR	C
	MOV	A,TempL   
	SUBB	A,SetTempLBak1
	MOV	B,A
	MOV	A,TempH
	SUBB	A,SetTempHBak1
	JC	CompTemp5	
;温度是否超过上限判断,否则转。
	MOV	A,B
	JNZ	CompTemp3
	SETB	TempContr
	MOV	TempSub,#21
	RET
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	
CompTemp5:
	CLR	C
	MOV	A,SetTempLBak1
	SUBB	A,TempL
	MOV	B,A

	MOV	A,#160
	SUBB	A,B
	JNC	CompTemp6
	MOV	A,#00H
CompTemp6:
	CLR	C
	MOV	B,A
	SUBB	A,#150
	JNC	CompTemp7
	MOV	A,B
	MOV	B,#8
	DIV	AB
	SJMP	CompTemp8
CompTemp7:
;	ADD	A,#8
;	MOV	B,A
;	CLR	C
;	SUBB	A,#16
;	MOV	A,B
;	JNC	CompTemp8
	MOV	A,#18
CompTemp8:	
	MOV	TempSub,A
	SETB	TempContr
;否则处于加热状态
	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:
	CJNE	A,#SetKey,SetTemp30
	SETB	FHBJ	
;------------------------------------------------------------
SetTemp30:

	MOV     R2,SetTempH
        MOV     R3,SetTempL
        LCALL   IBTD2		;把数值转换成BCD码并存入显示缓冲区中
	LCALL	Display		;显示数码
	LCALL	Dealy

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

        CLR     ET1
        CLR     TR1

	LCALL	WriterSetTempDate;控制温度写入E2PROM中

	SETB	TR0
	SETB	ET0

	MOV	ContrlMumber,#00H

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

SetTemp4:
         LJMP   SetTemp1
	 NOP
	 NOP

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

	MOV	A,#SetTempHE2PROM1
	LCALL	ReadI2CDate
	MOV	SetTempH,A	;设定温度值存贮


	MOV	A,#SetTempLE2PROM1
	LCALL	ReadI2CDate
	MOV	SetTempL,A	;设定温度值存贮

	RET

ErrorDisplay:
	CLR	EA		;禁止中断
	MOV	Mumber0,#0AH
	MOV	Mumber1,#0AH

⌨️ 快捷键说明

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