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

📄 炉温控制实现.txt

📁 一个硬件的实现程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
		RETI
PLDD:	MOV 	A, 		54H			;取Ki’
		MOV 	B, 		45H			;取当前温差
		MUL 	AB					
		MOV 	R6,		B			;乘得结果高位送R6
		MOV 	R7, 	A			;低位送R7
		CLR 	C					;清进位位
		                            ;当前温差与上次采样时刻误差之差存入R2
		MOV 	A, 		45H	
		MOV 	B, 		46H
		SUBB	A,		B
		MOV 	R2,		A
		MOV 	1BH, 	C			;进位送入1BH
		JNC 	PLD1				;不为负跳转
		;A取反加1,变为补码
		CPL 	A	
		ADD 	A, 		#01H
		MOV 	R2,		 A			;存入R2
PLD1:	MOV 	B, 		53H			;取比例常数
		MUL 	AB					;当前温差与上次采样时刻误差之差乘上比例常
		JB 		1BH, 	PLD2		;根据上一步的进位判断操作是加还是减
		LCALL 	AD67				;加法
		LJMP 	PLD3				;下一步
PLD2:	LCALL 	SU67				;减
PLD3:	CLR 	C					;清进位
		MOV 	A, 		R2			;取当前温差与上次采样时刻误差之差
		MOV 	B, 		56H			;取Kd’
		MUL 	AB					;当前温差与上次采样时刻误差之差乘上Kd’
		JB 		1BH, 	PLD4		;根据进位判断操作是加还是减
		LCALL 	AD67
		LJMP 	PLD5
PLD4:	LCALL 	SU67
PLD5:	CLR C						;清进位
		MOV 	A, 		47H			;取上上次采样时刻的误差
		SUBB 	A, 		46H			;减去上次采样时刻的误差
		JNC 	PLD6				;为正跳转
		                            ;为负,取反加1,变为补码
		CPL 	A
		ADD 	A, 		#01H
PLD6: 	MOV 	B, 		56H			;取Kd’
		MUL 	AB					;上上次采样时刻的误差与上次采样时刻的误差乘
上Kd’
		JC 		PLD7				;如果上上次误差大于上次误差,减法
		LCALL 	AD67				;加法
		LJMP 	PLD8
PLD7:	LCALL 	SU67
PLD8:	MOV 	48H, 	R6			;把R6送入调整量增量高位
		MOV 	49H, 	R7			;R7送入调整量增量低位
		CLR 	C					;清进位
		                        ;计算本次调整量增量低位与上次调整量增量低位之和
		MOV 	A, 		49H	
		ADDC 	A, 		4DH
		MOV 	4BH, 	A			;送入本次调整量低位
		                        ;计算本次调整量增量高位与上次调整量增量高位之和
		MOV	A, 		48H
		ADDC 	A, 		4CH
		MOV 	4AH, 	A			;送入本次调整量高位
		MOV 	47H, 	46H			;上次采样时刻的误差送上上次采样时刻的误差
		MOV	46H, 	45H			;当前温差送上次采样时刻的误差
		MOV 	4CH, 	4AH			;本次调整量高位送上次调整量高位
		MOV 	4DH, 	4BH			;本次调整量低位送上次调整量低位
		RET
AD67:	MOV 	5DH,	B			;A、B送5E、5D暂存
		MOV 	5EH, 	A
		CLR 	C					;清进位
		MOV 	A, 		R7			;取调整量增量低位
		ADD 	A, 		5EH			;加刚才的运算结果
		MOV	R7,		A			;作为新的整量增量低位存入R7
		MOV 	A, 		R6			;取调整量增量高位
		ADD 	A, 		5DH		;加刚才的运算结果
		MOV	R6,		A			;作为新的整量增量高位存入R6
		RET
SU67:	MOV 	5DH, 	B			;A、B送5E、5D暂存
		MOV 	5EH, 	A
		CLR 	C					;清进位
		MOV 	A, 		R7			;取调整量增量低位
		SUBB 	A, 		5EH			;减刚才的运算结果
		MOV	R7,		A			;作为新的整量增量低位存入R7
		MOV 	A, 		R6			;取调整量增量高位
		SUBB 	A, 		5DH		;减刚才的运算结果
		MOV	R6,		A			;作为新的整量增量高位存入R6
		RET
CDTB:	MOV 	R2, 	#03H		;送循环次数3到R2
		MOV 	R0, 	#3CH		;将指针R0制向显示存储单元3CH
CDDD:	MOV 	R3, 	#00H		;清R3
		MOV 	A, 		@R0		;将R0指向的显示缓冲区地址内数据送入A
		MOV 	R4,		A			;将A移入R4,R4用于存储结果,
CDTL:	MOV 	A,		R4			;取R4内容
		MOV 	B,		#10			
		MUL 	AB					;A乘10
		MOV 	R4, 	A			;将计算结果的低位送入R4保存
		MOV 	A, 		B			;将计算结果的高位送入A
		XCH 	A, 		R3			;交换A和R3内容
		MOV 	B, 		#10			
		MUL 	AB					;计算A乘10
		ADD 	A, 		R3			;用结果加上R3的内容
		MOV 	R3,		A			;结果送R3保存
		DEC 	R0					;R0减1,指向显示缓冲区下一地址
		MOV 	A,		R4			;取入R4中保存的数据
		ADD	A, 		@R0		;用当前值加上显示缓冲区中的值
		MOV 	R4, 	A			;将结果送入R4
		MOV 	A, 		R3			;将R3内容移入A
		ADDC 	A, 		#0			;用A加上进位位
		MOV 	R3, 	A			;将结果移入到R3保存
		DJNZ 	R2, 	CDTL		;R2减1,如果不等于零继续,否则跳转到CDTL
		RET						;子程序返回
CTBB:	MOV 	DPTR, 	#TAB1		;将表格TAB1首地址送入DPTR
		CLR 	C					;清进位位
		MOV 	A, 		R4			;将R4值送A
		RLC 	A					;A内容乘2
		MOV 	R4, 	A			;将结果移入R4
		XCH 	A, 		R3			;交换A和R3内容
		RLC 	A					;A内容乘2
		XCH 	A, 		R3			;交换A和R3内容
		ADD 	A, 		DPL			;A加DPTR低位
		MOV 	DPL, 	A			;将结果送DPTR低位
		MOV 	A, 		DPH		;DPTR高位送A
		ADDC	A, 		R3			;A加R3
		MOV 	DPH, 	A			;结果送DPTR高位
		CLR 	A					;清空A
		MOVC 	A, 		@A+DPTR	;根据DPTR查表格
		MOV 	R3, 	A			;将结果送到R3
		CLR 	A					;清A
		INC 	DPTR				;DPTR加1
		MOVC 	A, 		@A+DPTR	;根据DPTR查表格
		MOV 	R4, 	A			;结果送R4
		RET						;子程序返回
		;键值处理子程序
KEYI:	JNB 	22H, 	KEYI		;循环等待中断
		MOV 	A, 		27H			;将键值送A
		CLR 	C					;清进位位
    SUBB 	A, 		#08H		;键值减8
       	JNC 	LC					;如果按下的是8、9、A、B,则跳转到LC
		MOV 	A, 		27H			;如果按下的上0、1、2、3,则直接送到A
		CLR 	22H					;清空22H,表示键值处理结束
		RET						;子程序返回
LC:		MOV 	A, 		27H			;将键值送到A
		CLR 	C					;清进位位
		SUBB 	A, 		#04H		;得到8、9、A、B转换后的键值
		CLR 22H					;清空22H,表示键值处理结束
		RET						;子程序返回
DIR:	MOV 	R2, 	#06H		;显示子程序,和实验一相同
		MOV 	DPTR, 	#5FFFH		;送8279控制口地址到DPTR
		MOV 	A, 		#92H		;8279写显示RAM命令,地址自动加1,从2地
址开始
        MOVX	@DPTR, 	A		;送控制字
		MOV	R1, 	#39H		;令R1指向显示缓冲区39H
TY11:	MOV 	A, 		@R1		;将R1所指地址内的数据送入A
		MOV 	DPTR, 	#CODE		;将表格CODE的地址送入16位数据指针
		MOVC 	A, 		@A+DPTR	;根据表格起始地址+偏移量查找数据
		MOV 	DPTR, 	#5EFFH		;将8279数据口地址送DPTR
        MOVX 	@DPTR, 	A		;送显示数据到8279
		INC 	R1					;显示缓冲区指针加1,指向下一地址
		DJNZ 	R2, 	TY11		;6个缓冲区都读完则继续,否则跳转到TY11
		RET						;子程序返回
CODE:	DB 0C0H, 0F9H, 0A4H, 0B0H	;显示数据的表格
		DB 99H, 92H, 82H, 0F8H, 80H	
		DB 90H, 88H, 83H, 0C6H, 0A1H
		DB 86H, 8EH, 8CH, 0C1H, 89H
		DB 0C7H, 0BFH, 91H, 00H, 0FFH
		DB 8CH, 0C7H, 87H, 0FFH, 0FFH
		;外中断1中断处理子程序,处理8279键盘事件
INT0:	 ;入栈保护现场
PUSH 	ACC				;累加器入栈
		PUSH 	DPH				;DPTR高位入栈
		PUSH 	DPL					;DPTR低位入栈
		MOV 	DPTR, 		#5FFFH	;送8279控制口地址到DPTR
		MOV 	A, 			#40H	;8279控制字,读FIFO 0地址内容,地址不自加
1
    MOVX 	@DPTR, 	A		    ;送控制字
		MOV 	DPTR, 		#5EFFH	;送8279数据口地址到DPTR
		MOVX 	A, 			@DPTR	;读键值
		MOV 	27H, 		A		;将键值送到27H保存
		SETB 	22H					;将22H置位,按键标志
		NOP						    ;空操作
		                            ;出栈恢复现场
		POP 	DPL					;DPTR低位出栈
		POP 	DPH				   ;DPTR高位出栈
		POP 	ACC				    ;累加器出栈
		RETI						;中断处理子程序返回
		                            ;计时器0溢出中断处理子程序
PIT0:	CLR 	TR0					;清计时器0中断类型位,使其为0有效
		NOP						    ;空操作
		MOV 	TH0, 	#0FFH		;复位计时器高位
		MOV 	TL0, 	#0FFH		;复位计时器低位
		SETB 	25H					;置25H
		NOP						    ;空操作
		RETI						;中断处理子程序返回
		;计时器1溢出处理子程序
PIT1:	;入栈保护现场
PUSH 	ACC				;累加器入栈
		PUSH 	PSW				;程序状态字入栈
		SETB 	PSW.4				;使用第三组寄存器,从10H到17H
		CLR 	EX0					;清外部中断0中断允许位,关中断
		NOP						;空操作
		MOV 	TH1, 	#0D8H		;置D8H为计时器1高位初值
		MOV 	TL1,	#0F0H		;置F0H为计时器1低位初值
		MOV 	A, 		50H			;将1.5秒对应的时间常数96H送A
		DEC 	A					;A减1
		MOV 	50H, 	A			;将A送回50H
		JNZ 	P333				;如果控制周期1.5秒不到,跳转到P333
		MOV 	50H, 	#96H		;置1.5秒对应的时间常数96H
		MOV 	5AH, 	4AH		;将本次调整里量增量高位送调整量缓冲单元高位
P333:	LCALL 	OUTT				;调用调整量输出子程序
		CLR 	C					;清进位位
		MOV 	A, 		52H			;送采样周期低位到A
		SUBB 	A,		#01H		;A减1
		MOV 	52H, 	A			;送结果到采样周期低位
		MOV 	A, 		51H			;送采样周期高位到A
		SUBB 	A, 		#01H		;A减1
		MOV 	51H, 	A			;送结果到采样周期高位
		ORL 	A, 		52H			;得到采样周期
		JNZ 	P335				;如果采样周期不为0,跳转到P335
		LCALL 	PLDD				;调用PLDD进行PID运算
		CLR 	C					;清进位位 
		MOV 	A, 		43H 		;将当前温度值送A
		SUBB 	A, 		42H			;减去设定温度值
		JC 		P335				;如果当前温度值小于设定温度值,跳转到P335
		SETB 	P3.5				;截止可控硅
		NOP						;空操作
		LJMP 	P336				;跳转到P336
P335:	NOP
		NOP
P336:	;出栈恢复现场
POP 	PSW				;程序状态字出栈
		POP 	ACC				;累加器出栈
		SETB 	EX0				;置计时器0中断允许位,允许中断
		NOP						;空操作
		RETI					;中断处理子程序返回
		                       ;显示子程序
OUTT:	MOV 	R2, 	5AH			;将调整量高位送R2
		CJNE R2, #00H, 	OUT1	;判断如果R2不等于0,跳转到OUT1
		SETB 	P3.5				;如果调整量高位为0,关闭可控硅
		NOP						;空操作
		RET						;子程序返回
OUT1:	SETB 	TR0					;置计时器0中断类型为高有效
		NOP						;空操作
		SETB 	ET0					;置计时器0中断允许位,允许中断
		NOP						;空操作
		MOV 	IP, 	#02H		;设中断优先级定时器0中断最高
OUT2:	JB 		P3.4, 	OUT2		;如果电网工频过零脉冲为高则跳转到OUT2
									;循环等待T0溢出
		CLR 	P3.5				;启动可控硅
		NOP						    ;空操作
		DEC 	R2					;调整量减1
		MOV 	5AH, 	R2			;调整量送调整量缓冲单元高位
		CLR	25H					    ;清25H
		NOP						    ;空操作
		CLR 	ET0					;清计时器0中断允许位,禁止中断
		NOP						   ;空操作
		RET						   ;子程序返回
TAB1:	DW 0000, 0001, 0002 0003
		DW 0004, 0005, 0006, 0007
		DW 0008, 0009, 0010H, 0011H
		DW 0012H, 0013H, 0014H, 0015H
		DW 0016H, 0017H, 0018H, 0019H
		DW 0020H, 0021H, 0022H,0023H
		DW 0024H, 0025H, 0026H, 0027H
		DW 0028H, 0029H, 0030H, 0031H
		DW 0032H, 0033H, 0034H, 0035H
		DW 0036H, 0037H, 0038H, 0039H
		DW 0040H, 0041H, 0042H, 0043H
		DW 0044H, 0045H, 0046H, 0047H
		DW 0048H, 0049H, 0050H, 0051H
		DW 0052H, 0053H, 0054H, 0055H
		DW 0056H, 0057H, 0058H, 0059H
		DW 0060H, 0061H, 0062H, 0063H
		DW 0064H, 0065H, 0066H, 0067H
		DW 0068H, 0069H, 0070H, 0071H
		DW 0072H, 0073H, 0074H, 0075H
		DW 0076H, 0077H, 0078H, 0079H
		DW 0080H, 0081H, 0082H, 0083H
		DW 0084H, 0085H, 0086H, 0087H
		DW 0088H, 0089H, 0090H, 0091H
		DW 0092H, 0093H, 0094H, 0095H
		DW 0096H, 0097H, 0098H, 0099H
		DW 0100H, 0101H, 0102H,0103H
		DW 0104H, 0105H, 0106H, 0107H
		DW 0108H, 0109H, 0110H, 0111H
		DW 0112H, 0113H, 0114H, 0115H
		DW 0116H, 0117H, 0118H, 0119H
		DW 0120H, 0121H, 0122H,0123H
		DW 0124H, 0125H, 0126H, 0127H
		DW 0128H, 0129H, 0130H, 0131H
		DW 0132H, 0133H, 0134H, 0135H
		DW 0136H, 0137H, 0138H, 0139H
		DW 0140H, 0141H, 0142H,0143H
		DW 0144H, 0145H, 0146H, 0147H
		DW 0148H, 0149H, 0150H, 0151H
		DW 0152H, 0153H, 0154H, 0155H
		DW 0156H, 0157H, 0158H, 0159H
		DW 0160H, 0161H, 0162H,0163H
		DW 0164H, 0165H, 0166H, 0167H
		DW 0168H, 0169H, 0170H, 0171H
		DW 0172H, 0173H, 0174H, 0175H
		DW 0176H, 0177H, 0178H, 0179H
		DW 0180H, 0181H, 0182H,0183H
		DW 0184H, 0185H, 0186H, 0187H
		DW 0188H, 0189H, 0190H, 0191H
		DW 0192H, 0193H, 0194H, 0195H
		DW 0196H, 0197H, 0198H, 0199H
		DW 0200H, 0201H, 0202H,0203H
		DW 0204H, 0205H, 0206H, 0207H
		DW 0208H, 0209H, 0210H, 0211H
		DW 0212H, 0213H, 0214H, 0215H
		DW 0216H, 0217H, 0218H, 0219H
		DW 0220H, 0221H, 0222H,0223H
		DW 0224H, 0225H, 0226H, 0227H
		DW 0228H, 0229H, 0230H, 0231H
		DW 0232H, 0233H, 0234H, 0235H
		DW 0236H, 0237H, 0238H, 0239H
		DW 0240H, 0241H, 0242H,0243H
		DW 0244H, 0245H, 0246H, 0247H
		DW 0248H, 0249H, 0250H, 0251H
		DW 0252H, 0253H, 0254H, 0255H
		END                            

⌨️ 快捷键说明

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