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

📄 炉温控制实现.txt

📁 一个硬件的实现程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
八、	程序代码和代码分析
		ORG 	0000H				;偏移量0000H
		LJMP 	MAIN				;跳转到MAIN运行
		ORG 	0003H				;偏移量0003H
		LJMP 	CIT1				;外中断0中断处理
		ORG		000BH				;偏移量000BH
		LJMP 	PIT0				;计时器0溢出中断处理
		ORG 	0013H				;偏移量0013H	
		LJMP 	INT0				;外中断1中断处理
		ORG 	001BH				;偏移量001BH
		LJMP 	PIT1				;计时器1溢出中断处理
		ORG 	0030H				;偏移量0030H
MAIN:	SETB 	P3.5				;截止控制硅
		NOP
		SETB	P3.4				;电网工频过0脉冲
		NOP
		MOV 	SP, 		#60H		;初始化堆栈指针,60H
		MOV 	P1, 	#0FFH		;送FF到P1口,启动14433
		MOV 	DPTR, 	#5FFFH		;下面三行,将显示RAM置1
		MOV 	A, 		#0DCH
		MOVX 	@DPTR, 	A
LP:		MOVX 	A, 		@DPTR		;读出8279状态字
		JB 		ACC.7,	LP			;最高位为1,则跳转到上一步
		MOV 	DPTR, 	#5FFFH		
		MOV 	A,		#00H		;设A为8279控制字000 00000B,左进方式,显
示8个字符,二键锁定,编码扫描
		MOVX 	@DPTR,	A		   ;送控制字
		MOV 	A,		#34H	   ;8279控制字,将系统时钟分频至100kHz的20
		MOVX 	@DPTR,	A		    ;送控制字
		MOV 	TMOD, 	#11H		;设定时模式
		                            ;分别为定时器0、1的高、低位赋初值
		MOV 	TH0, 	#0FFH
		MOV 	TL0, 	#0FFH
		MOV 	TH1, 	#0D8H
		MOV 	TL1, 	#0F0H
		CLR 	22H					;清除按键中断的标志位
		NOP	
		CLR 	23H					;清除外中断0的标志位
		NOP
		CLR 	25H					;清除定时器0溢出中断的标志位
		NOP                       ;循环初始39H到3EH显示数据存储单元,全为暗码
		MOV 	R0, 	#39H
		MOV 	R7, 	#06H
LPP:	MOV 	@R0, 	#17H
		INC 	R0
		DJNZ 	R7, 	LPP     ;循环清除从40H开始,32个数据存储单元
		MOV 	R0, 	#40H
		MOV 	R7, 	#20H
LPPL:	MOV 	@R0, 	#00H
MOV     A,     #1H
ORL     A;     TM0D
MOV     TM0D,  A
MOV     @R0    #00H
		INC		R0
		DJNZ 	R7, 	LPPL
		MOV 	50H, 	#96H		;初始1.5秒时间常数
		LCALL 	DIR					;显示
		CLR 	IT1					;清外中断1类型控制位,低电平触发
		NOP
		SETB 	EX1					;允许外中断1
		NOP
		SETB	IT0					;置位中断0类型控制位,高电平触发
		NOP
		SETB 	EX0					;允许外中断0
		NOP
		MOV	IP, 		#08H		;设中断优先级,计时器1中断最高
		SETB 	EA					;置总中断允许位,允许中断
		NOP
LPPP:	LCALL 	KEYI				;输入给定温度值的十位
		ANL 	A, 		#0FH		;保留低四位,限制在范围
		CJNE	A, 	#0AH, 	LPP1	;比10小则置位进位
LPP1:	JNC 	LPPP				;比10大,重新输入
		MOV 	3EH, 	A			;送键值到相应的显示数据存储单元
        MOV 	40H, 	A			;送设定温度值高位
		LCALL 	DIR					;显示
LPP2:	LCALL 	KEYI				;输入给定温度值的个位
		ANL		A, 		#0FH		;限制处理
		CJNE 	A, 	#0AH, 	LPP3
LPP3:	JNC 	LPP2
		MOV 	3DH,	A			;送键值到相应的显示数据存储单元
        MOV 	41H, 	A			;送设定温度值低位
		LCALL 	DIR					;显示
LP00:	LCALL 	KEYI				;输入采样周期高位
		ANL 	A, 		#0FH		;限制处理
		CJNE 	A, 	#0AH, 	LP01							
LP01:	JNC 	LP00
		MOV 	3AH, 	A			;采样周期高位送相应的显示存储单元
		MOV 	3BH, 	#1AH		;显示t
		MOV 	3CH, 	#17H		;暗码
		LCALL 	DIR					;显示
LP02:	LCALL KEYI					;输入采样周期高位
		ANL 	A, 		#0FH		;限制处理
		CJNE 	A, 	#0AH, 	LP03
LP03:	JNC 	LP02
		MOV 	39H, 	A			;采样周期高位送相应的显示存储单元
		LCALL 	DIR					;显示
		MOV 	A, 		3AH			;取采样周期高位
		MOV 	B, 		#10
		MUL 	AB					;×10
		ADD	A, 		39H			    ;加上低位
		MOV 	5CH, 	A			;保存采样周期二进制
		                           ;转采样周期为BCD码
		MOV 	B, 		#64H
		MUL 	AB
		MOV 	51H, 	B			;送采样周期BCD高位
		MOV 	52H, 	A			;送采样周期BCD低位
LPP4:	LCALL 	KEYI				;输入比例常数十位
		ANL 	A, 		#0FH		;限制处理
		CJNE 	A, 	#0AH, 	LPP5
LPP5:	JNC 	LPP4
		MOV 	3AH, 	A			;处理显示存储单元,不再赘述
		MOV 	3BH, 	#18H
		MOV 	3CH, 	#17H
		MOV 	39H, 	#17H
		LCALL 	DIR
LPP6:	LCALL 	KEYI				;输入比例常数个位
		ANL 	A, 		#0FH
		CJNE 	A,	#0AH, 	LPP7
LPP7:	JNC 	LPP6
		MOV 	39H, 	A
		LCALL 	DIR                ;十、个位转成一个数
		MOV 	A, 		3AH
		MOV 	B, 		#10
		MUL 	AB
		ADD 	A, 		39H
		MOV 	53H, 	A			;比例常数存入53H
LPP8:	LCALL 	KEYI				;输入积分常数百位
		ANL 	A, 		#0FH
		CJNE 	A, 	#0AH, 	LPP9
LPP9:	JNC 	LPP8
		MOV 	3BH, 	A
		MOV 	3CH, 	#19H
		MOV 	3AH,	#17H
		MOV 	39H,	#17H
		LCALL 	DIR
LPPA:	LCALL 	KEYI				;输入积分常数十位
		ANL 	A, 		#0FH
		CJNE	A,	#0AH, 	LPPB
LPPB:	JNC 	LPPA
		MOV 	3AH, 	A
		LCALL 	DIR
LPPC:	LCALL 	KEYI				;输入积分常数个位
		ANL 	A, 		#0FH
		CJNE 	A, 	#0AH, 	LPPD
LPPD:	JNC LPPC
		MOV 	39H, 	A
		LCALL 	DIR
		MOV 	R0,		#3BH		;取积分常数百位
		MOV 	R2, 	#02H		;转换计算的次数
		LCALL 	CDDD				;将三个数按10制权转成一个数
        MOV 	58H, 	R4			;将结果(即积分常数)存入58H
LPPE:	LCALL KEYI					;输入微分常数十位
		ANL 	A, 		#0FH
		CJNE 	A, 	#0AH, 	LPPF
LPPF:	JNC LPPE
		MOV 	3AH, 	A
		MOV 	3BH,	#0DH
		MOV 	3CH,	#17H
		MOV 	39H, 	#17H
		LCALL 	DIR
LPPG:	LCALL 	KEYI				;输入微分常数个位
		ANL 	A, 		#0FH
		CJNE 	A, 	#0AH, 	LPPH
LPPH:	JNC 	LPPG
		MOV 	39H, 	A
		;延时,保持显示
		MOV 	2FH, 	#0FFH
		MOV 	2EH, 	#80H
LPPJ:	LCALL 	DIR
		DJNZ 	2FH, 	LPPJ
		DJNZ 	2EH, 	LPPJ        ;转换
		MOV	A, 		3AH			    ;取微分常数十位
		MOV 	B, 		#10
		MUL	AB					    ;乘10
		ADD 	A, 		39H			;加上微分常数个位
		MOV 	59H, 	A			;送入59H保存微分常数
		MOV 	B, 		53H			;取比例常数
		MUL 	AB					;计算Kd’ = Kp?Kd
		MOV 	56H, 	B			;分别送高低位
		MOV 	57H, 	A
		MOV	    A, 		53H			 ;取比例常数
		MOV 	B, 		58H			;取积分常数
		MUL  	AB					;计算Ki’ = Kp?Ki
		MOV 	54H, 	B			;分别送高低位
		MOV 	55H, 	A			
		MOV 	20H, 	#00H		;清空采样值高低位
		MOV 	21H, 	#00H
		MOV 	A, 		41H			;取温度设定值低位
		ANL 	A, 		#0FH		;保留低四位,存入R0
		MOV 	R0,		A
		MOV 	A, 		40H			;取温度设定值低位
		ANL 	A, 		#0FH		;保留低四位
		MOV 	B, 		#10			;乘10并加上低位
		MUL 	AB
		ADD 	A,		R0
		MOV 	42H, 	A			;存设定值二进制于42H
		MOV 	B, 		#14H		
		DIV 	AB					;计算温度的5%
		JNZ		NZER				;结果是否为0
		MOV 	A, 		#01H		;为0则设最小值为1
NZER:	MOV 	44H, 	A			;将设定值的5%存入44H
		CLR 	26H					;清26H
		NOP
		SETB 	ET1					;置定时器1中断允许位,允许定时器中断
		NOP
		SETB	TR1					;置计时器1中断类型,高电平有效
		NOP
COOP:	MOV 	3CH, 	#00H		;将0送入显示缓冲区3CH
		MOV 	A, 		20H			;将A/D采样值高位送A
		ANL 	A, 		#10H		;保留第4位状态
		SWAP 	A					;A交换高低位
		MOV 	3BH, 	A			;A显示存储单元3BH
		MOV 	A, 		20H			;将A/D采样值高位送A
		ANL 	A, 		#0FH		;保留低4位
		MOV 	3AH, 	A			;A显示存储单元3AH
		MOV 	A, 		21H			;将A/D采样值低位送A
		ANL 	A, 		#0F0H		;保留高4位
		SWAP 	A					;高低位交换
		MOV 	39H, 	A			;A显示存储单元39H
		LCALL 	CDTB				;调用CDTB子程序
		CLR 	C					;清进位位
		MOV 	A,		R3			;将采样结果的二进制值送A
		RRC 	A					;将A除以2
		MOV 	R3, 	A			;结果送入R3
		MOV 	A, 		R4			;将R4内容移入A
		RRC	    A					;A除以2
		MOV 	R4, 	A			;将采样结果二进制值送R4
		MOV 	43H, 	A			;将采样结果二进制值即当前温度送43H
		CLR 	C					;清进位位
		MOV 	A,		42H			;将设定值的二进制值送A
		MOV 	B, 		43H			;将当前温度的二进制值送B
		SUBB 	A, 		B			;计算A减B
		MOV 	45H, 	A			;将当前温差送45H
		MOV 	18H, 	C			;将符号送18H保存
		JNC 	DOOP				;如果设定温度大于当前温度,跳转到DOOP
		CPL 	A					;将A取反
		ADD 	A, 		#01H		;将A加1,计算其补码形式
		MOV 	45H, 	A			;将结果送当前温差
DOOP:	LCALL 	CTBB				;调用CTBB子程序
		MOV 	A, 		#17H		;将17H送A
		MOV 	3CH, 	A			;A显示存储单元3CH
		MOV 	A, 		R3			;将R3内容移入到A
		ANL 	A, 		#0FH		;保留低4位
        MOV 	3BH, 	A			;A显示存储单元3BH
		MOV 	A,		R4			;将当前温度移入到A
		ANL 	A, 		#0F0H		;保留高四位 
		SWAP 	A					;交换A的高低位
		MOV 	3AH, 	A			;A显示存储单元3AH
		MOV 	A, 		R4			;将当前温度放入到A
		ANL 	A, 		#0FH		;保留低4位
		MOV 	39H,	 A			;A显示存储单元39H
		MOV 	A, 		40H			;将设定值的高位送A
		ANL 	A, 		#0FH		;保留低4位
		MOV 	3EH, 	A			;A显示存储单元3EH
		MOV 	A, 		41H			;将设定值的低位送A
		ANL 	A, 		#0FH		;保留低4位
		MOV 	3DH, 	A			;A显示存储单元3DH
		LCALL 	DIR					;调用显示子程序
		MOV 	IP, 		#08H	;将08H移入IP寄存器
		JB 		18H,	CPPP		;如果18H为1则跳转到CPPP
		CLR 	C					;清空C
		MOV 	A, 		45H			;当前温差移入到A
		MOV 	B, 		44H			;将设定值的5%移入到B
		SUBB 	A, 		B			;用A减B
		JC 		CPPP				;如当前温差小于设定值的5%,跳转到CPPP
		CLR 	P3.5				;清定时器1输出状态为0,即激活可控硅
		NOP						;空操作
		LJMP 	COOP				;跳转到COOP
CPPP:	SETB 	P3.5				;置定时器1输出状态为1,关闭可控硅
		NOP						;空操作
		LJMP 	COOP				;跳转到COOP
CIT1:	;外中断0处理子程序
		;入栈保护现场
PUSH 	PSW
		PUSH	ACC
		SETB 	PSW.3				;使用01组寄存器
		SETB 	23H					;外中断0标志置位
		NOP
		MOV 	P1, 	#0FFH		;启动转换
		NOP
CIX1:	MOV 	A, 		P1			;读A/D转换结果
		JNB 	ACC.4, 	CIX1		;判断转换是否结束
		JB 		ACC.2, 	CL1			;判断结果正负
		SETB 	07H					;负,则置位07H
		LJMP 	CL2
CL1:	CLR 	07H					;正,复位07H
CL2:	JB 		ACC.3, 	CL3			;判断千位是否为0
		SETB 	04H					;为0置位04H
		LJMP 	CL4
CL3:	CLR 	04H					;不为0复位04H
CL4:	MOV 	P1, 	#0FFH		;启动转换
		MOV 	A, 		P1
		JNB 	ACC.5, 	CL4			;判断百位是否转换,没有循环等待
		MOV 	R0, 	#20H		;R0为20H
		XCHD 	A, 		@R0		;A与R0低四位交换
CL5:	MOV 	P1, 	#0FFH		;启动转换
		MOV 	A,		P1			;读结果
		JNB 	ACC.6, 	CL5			;十位是否转换,没有循环等待
		SWAP	A					;A的高低位互换
		INC 	R0					;R0内容+1,指向21H
		MOV 	@R0, 	A			;A送21H,21H高位为十位
CL6:	M MOV 	P1, 	#0FFH		;启动转换
		MOV 	A,		P1			;读结果
		JNB 	ACC.7, 	CL6			;个位是否转换,没有循环等待
		XCHD 	A, 		@R0		;与R0低四位交换,21H低位为个位
		MOV 	A, 		20H			;取出百位,即采样值高位
		ANL 	A, 		#0FH		;保留低四位
		XRL 	A, 		#0FH		;是否为全1
		JNZ 	WWW1
		MOV	A, 		20H			;取出20H
		ANL		A,	 	#0F0H		;保留高四位
		MOV 	20H, 	A			;送回20H
WWW1:	SETB 	15H					;转换结束标志
		NOP
		;出栈恢复现场
		POP 	ACC
		POP 	PSW

⌨️ 快捷键说明

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