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

📄 main(2001426).asm

📁 加热器的温度控制
💻 ASM
📖 第 1 页 / 共 2 页
字号:

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

        MOV	Counter,#00H

	RET

ReadSetTempDate2:
	INC	Counter
	MOV	A,Counter
	CJNE	A,#04,ReadSetTempDate3
	MOV	SetTempH,#00H
	MOV	SetTempL,#0C8H
	LCALL	WriterSetTempDate
	SJMP	ReadSetTempDate1 ;若4次读取不正确则重写E2PROM

ReadSetTempDate3:
	CJNE	A,#08,ReadSetTempDate1 ;若8次读取不正确则显示错误码(818)
ErrorDisplay:
	CLR	EA		;禁止中断
	MOV	Mumber0,#0AH
	MOV	Mumber1,#0AH
	MOV	Mumber2,#0BH	;错误代码(ERR)
	LCALL	Display		;显示数码
	LCALL	Dealy
	SJMP	ErrorDisplay

;保存设定温度
WriterSetTempDate:
	LCALL	CloseDisplay

	LCALL	OpenI2c

	MOV	B,SetTempH
	MOV	A,#SetTempHE2PROM1
	LCALL	WriteI2CDate
        LCALL   DealyLong
	MOV	B,SetTempH
        MOV	A,#SetTempHE2PROM2
	LCALL	WriteI2CDate
        LCALL   DealyLong
        MOV	B,SetTempH
	MOV	A,#SetTempHE2PROM3
	LCALL	WriteI2CDate
        LCALL   DealyLong

 	MOV	B,SetTempL
	MOV	A,#SetTempLE2PROM1
	LCALL	WriteI2CDate
        LCALL   DealyLong
	MOV	B,SetTempL
        MOV	A,#SetTempLE2PROM2
	LCALL	WriteI2CDate
        LCALL   DealyLong
        MOV	B,SetTempL
	MOV	A,#SetTempLE2PROM3
	LCALL	WriteI2CDate
        LCALL   DealyLong

	LCALL	CloseI2c
	RET
;*************************************************************
AdjustSpT12:
	MOV	ProgramAddressT1+1,#00H
	MOV	ProgramAddressT1,#00H
	PUSH	ProgramAddressT1+1
	PUSH	ProgramAddressT1
	RETI
;定时中断1子程序:
DINS1:

	POP	ProgramAddressT1
	POP	ProgramAddressT1+1
	PUSH	ProgramAddressT1+1
	PUSH	ProgramAddressT1


	PUSH	ACC
        PUSH    PSW
	PUSH	DPH
	PUSH	DPL
	PUSH	B
;------------------------------------------------------------

;在中断程序中判断堆栈指针及程序是否处于正常范围内运行
	MOV	A,SP
	CJNE	A,#STACK,AdjustSpT11
AdjustSpT11:
	JC	AdjustSpT12;堆栈指针出错

	CLR	C
	MOV	A,ProgramAddressT1+1
	SUBB	A,#LOW(START)
	MOV	A,ProgramAddressT1
	SUBB	A,#HIGH(START)
	JC	AdjustSpT12	;断点小于START则转
	MOV	A,#LOW(ProgramEndAddress)
	SUBB	A,ProgramAddressT1+1
	MOV	A,#HIGH(ProgramEndAddress)
	SUBB	A,ProgramAddressT1
	JC	AdjustSpT12	;断点大于ProgramEndAddress则转
;------------------------------------------------------------

	JB	DisplayStatu,DINS10
	MOV	TH1,#0F0H
	MOV	TL1,#0BFH	;8ms中断一次

	LCALL	ReadKey
	LCALL	Display
	
	JNB	TempContr,DINS00002
	MOV	A,ContrlMumber
	JZ	DINS00002
	CJNE	A,TempSub,DINS00003
DINS00001:
	CLR	TempContrPort
	SJMP	DINS00003
DINS00002:
	SETB	TempContrPort
DINS00003:
	INC	ContrlMumber
	MOV	A,ContrlMumber
	CJNE	A,#20,DINS00004
	MOV	ContrlMumber,#00H
DINS00004:
	POP	B
	POP	DPL
	POP	DPH
	POP	PSW
	POP	ACC
	RETI
	NOP
	NOP

DINS10:
	MOV	TH1,#00H
	MOV	TL1,#00H	;8ms中断一次

	INC	Timer
	MOV	A,Timer
	CJNE	A,#SetTimer,DINS11
	MOV	Timer,#00H
	CPL	XSBJ
DINS11:
	INC	Timer1
	MOV	A,Timer1
	CJNE	A,#SetWaitTimer,DINS12
	MOV	Timer1,#00H
	SETB	FHBJ
	SETB	FHBJ
DINS12:
	INC	Timer2
	MOV	A,Timer2
	CJNE	A,ChangSpeed,DINS13
	MOV	Timer2,#00H
	CPL	ChangOk
DINS13:
	POP	B
	POP	DPL
	POP	DPH
	POP	PSW
	POP	ACC
	RETI


;-------------------------------------------------------------
;定时中断0子程序:
DINS:
	PUSH	ACC
	PUSH	PSW
	SETB	RS0

	CLR	TR0		;定时器初始化
	LCALL	CloseDisplay

	MOV	TH0,#0
	MOV	TL0,#0
	CLR	RC		;电容开始充电
	CLR	RC		;电容开始充电
	SETB	TR0		;开始计时
ADC1:
	JNB	JUDE,ADC1	;等待充电达到Vi
	CLR	TR0		;冻结定时器
	CLR	TR0		;冻结定时器
	MOV	R3,TL0		;读取充电时间间隔
	MOV	R2,TH0

	MOV	TH0,#068H	;约38mS定时
	MOV	TL0,#000H
	SETB	TR0		;定时器继续工作
	SETB	RC		;放电,准备下次充电
	SETB	RC		;放电,准备下次充电

	MOV	A,R3		;累加采样值
	ADD	A,TOTALL
	MOV	TOTALL,A
	MOV	A,R2
	ADDC	A,TOTALM
	MOV	TOTALM,A
	CLR	A
	ADDC	A,TOTALH
	MOV	TOTALH,A

	INC	CLOCK		;检测次数加一
	MOV	A,CLOCK
	ANL	A,#0FH
	NOP
	NOP
	JZ	ADC2
DINSE:
	POP	PSW
	POP	ACC

	RETI ;检测未满16次,中断返回
	NOP
	NOP
ADC2:
	MOV	A,TOTALL	;检测满16次,求平均充电时间,保存到R2R3
	SWAP	A
	ANL	A,#0FH
	MOV	R3,A
	MOV	A,TOTALM
	SWAP	A
	ANL	A,#0F0H
	ORL	A,R3
	MOV	R3,A
	MOV	VIL,A
	MOV	A,TOTALM
	SWAP	A
	ANL	A,#0FH
	MOV	R2,A
	MOV	A,TOTALH
	SWAP	A
	ORL	A,R2
	MOV	R2,A
	MOV	VIH,A

	CLR	A		;清零累加器,为下一次检测作准备
	MOV	TOTALH,A
	MOV	TOTALM,A
	MOV	TOTALL,A

	SETB	ReadTempOK

	LJMP	DINSE
;******************************************************
;*******************************************************
CloseDisplay:
	MOV     P3,#0FFH
	SETB    XM0
	SETB    XM1
	SETB    XM2
	MOV     P3,#0FFH
	SETB    XM0
	SETB    XM1
	SETB    XM2
	RET


;显示数码
Display:
        PUSH    PSW

	SETB	RS1
        MOV	A,DisPort
	CJNE	A,#SetDisplayBit,Display1
	MOV	DisPort,#00H
	MOV	A,#00H
Display1:
	LCALL	DisplayMumber	;每循环一次显示1位数码管
        INC     DisPort

	POP	PSW
	RET
;-------------------------------------------

;显示一位数码
;输入: A 数码管端口号
;       Mumber0 -- Mumber2
;输出   A 键值
DisplayMumber:
	LCALL	CloseDisplay

	JNB	XSBJ,DisplayMumber3

	MOV	B,A
	MOV	R0,#Mumber0
	ADD	A,R0
        MOV     R0,A
	MOV	A,@R0
	MOV	DPTR,#MumberTemp
	MOVC	A,@A+DPTR
	MOV	P3,A
	MOV	A,B
        
	CJNE	A,#00H,DisplayMumber1
	SETB	XM0
	SETB	XM1
	CLR	XM2

	RET
DisplayMumber1:
	CJNE	A,#01H,DisplayMumber2
	SETB	XM0
	CLR	XM1
	SETB	XM2

	RET
DisplayMumber2:
	CJNE	A,#02H,DisplayMumber3
	CLR	XM0
	SETB	XM1
	SETB	XM2
	MOV	A,KeyCodeTemp
	RET
DisplayMumber3:
	RET
MumberTemp:
	DB	0C0H,0F9H,064H,070H,059H
	DB	052H,042H,0F8H,040H,050H
	DB	048H,046H		;A,E
;*************************************************************
;二进制整数转换为十进制数
;输入二进在R2R3中
;输出在Mumber0--Mumber4中
IBTD2:

	CLR	A
	MOV	R4,A
	MOV	R5,A
	MOV	R6,A
	MOV	R7,#16
IBTD21:
	CLR	C
	MOV	A,R3
	RLC	A
	MOV	R3,A
	MOV	A,R2
	RLC	A
	MOV	R2,A
	MOV	A,R6
	ADDC	A,R6
	DA	A
	MOV	R6,A
	MOV	A,R5
	ADDC	A,R5
	DA	A
	MOV	R5,A
	MOV	A,R4
	ADDC	A,R4
	DA	A
	MOV	R4,A
	NOP
	NOP
	DJNZ	R7,IBTD21


	MOV	R0,#Mumber0
	MOV	A,R6
	XCHD	A,@R0
	INC	R0
	SWAP	A
	XCHD	A,@R0
	INC	R0

	MOV	A,R5
	XCHD	A,@R0

	RET
;*************************************************************
;设置显示模式
;输入	A  0 不闪烁
;          1 闪烁
SetDisplayMode:
	CLR	TR1
	CLR	ET1
	SETB	XSBJ	;数码管显示
	JZ	SetDisplayMode1
	SETB	DisplayStatu	;闪烁显示
	SETB	DisplayStatu	;闪烁显示
	MOV	TH1,#00H
	MOV	TL1,#00H
	SETB	TR1
	SETB	ET1
	SETB	EA

	RET
SetDisplayMode1:
	CLR	DisplayStatu	;正常显示
	CLR	DisplayStatu	;正常显示
	MOV	TH1,#0F0H
	MOV	TL1,#0BFH	;8ms中断一次
	SETB	TR1
	SETB	ET1
	SETB	EA


	RET

;*************************************************************
;读键盘
;键值在KeyCode中
ReadKey:
	SETB	KeyPort
	SETB	KeyPort

	MOV	P3,#0FFH
	SETB	XM0
	SETB	XM1
	CLR	XM2

	JB	KeyPort,ReadKey1
	MOV	A,KeyCodeTemp
	CJNE	A,#UpKey,ReadKey01	;上一次按键为上键吗
	INC	KeyCount		;为上键则相同按键次数加1
	MOV	A,KeyCount
	CJNE	A,#SetCompKey,ReadKey00
	MOV	KeyCount,#00H
	MOV	Timer1,#00H	;有键按下时清等待返回计数器
	MOV	KeyCode,#UpKey
ReadKey00:
	RET
ReadKey01:
	MOV	KeyCodeTemp,#UpKey
	MOV	KeyCount,#00H
	RET
;---------------------------------------------------------------
ReadKey1:
	SETB	XM0
	CLR	XM1
	SETB	XM2
	JB	KeyPort,ReadKeyE
	MOV	A,KeyCodeTemp
	CJNE	A,#DownKey,ReadKey11	;上一次按键为上键吗
	INC	KeyCount		;为上键则相同按键次数加1
	MOV	A,KeyCount
	CJNE	A,#SetCompKey,ReadKey10
	MOV	KeyCount,#00H
	MOV	Timer1,#00H	;有键按下时清等待返回计数器
	MOV	KeyCode,#DownKey
ReadKey10:
	RET
ReadKey11:
	MOV	KeyCodeTemp,#DownKey
	MOV	KeyCount,#00H
	RET
;---------------------------------------------------------------
ReadKeyE:
	MOV	KeyCount,#00H
	MOV	KeyCodeTemp,#UnKey
	MOV	KeyCode,#UnKey
	RET
	NOP
	NOP


Dealy:
	MOV	R2,#07H
Delay1:
	MOV	R3,#088H
Delay2:
   	NOP
	NOP
	DJNZ	R3,Delay2
	DJNZ	R2,Delay1
	RET
	NOP
	NOP


;修改表后在调用插值的函数前,端点个数的存放寄存器(R1)的值要改变
TempTab:
	DW	  453,  0,  896, 20, 1345, 40, 1807, 60, 2255, 80
	DW	 2722,100, 3192,120, 3654,140, 4121,160, 4601,180
	DW	 5066,200, 5553,220, 6016,240, 6486,260, 6981,280
	DW	 7465,300, 7944,320, 8439,340, 8697,350

	NOP
	NOP
	NOP
	LJMP	0000H


END

⌨️ 快捷键说明

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