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

📄 induction_cooker_v41.asm

📁 中颖SH69P44开发的电磁炉原程序和线路图
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	BC	EVEN_CN1		;没有出现借位,那么表示不等于0
EVEN_CN2:	
	SBIM	EVEN_C2	,01H
	BC	EVEN_CN1		;没有求完平均值
	
	LDA	EVEN_T0		,01H
	STA	TPER0A_B	,01H
	LDA	EVEN_T1		,01H
	STA	TPER0B_B	,01H
	
	LDA	EVEN_T2		,01H	;完成了平均值的求取,那么把锅底温度赋给对应的寄存器
	STA	TPER0A		,01H
	LDA	EVEN_T3		,01H
	STA	TPER0B		,01H
	
	
	LDA	EVEN_I0		,01H
	STA	TPER1A_B	,01H
	LDA	EVEN_I1		,01H
	STA	TPER1B_B	,01H
	
	LDA	EVEN_I2		,01H	;完成了平均值的求取,那么把IGBT温度赋给对应的寄存器
	STA	TPER1A		,01H
	LDA	EVEN_I3		,01H
	STA	TPER1B		,01H
	
	LDA	ACVOL_2		,01H	;完成了平均值的求取,那么把电罔电压赋给对应的寄存器
	STA	ACVOLA		,01H
	STA	AD_STA1		,00H
	LDA	ACVOL_3		,01H
	STA	ACVOLB		,01H
	STA	AD_STA2		,00H
	
	LDA	CURRE_2		,01H
	STA	CURREA		,01H
;	STA	AD_STA3		,00H
	LDA	CURRE_3		,01H
	STA	CURREB		,01H
;	STA	AD_STA4		,00H
	CALL	ADC_INI			;复位AD采样参数
	LDI	EVEN_STATUS	,0FH	;设置每一路AD采样都已完成
EVEN_CN1:
	RTNI

;;*****************************************************
;初始化AD采样参数,一旦出现锅零检测,那么复位一次
;;*****************************************************
ADC_INI:
	LDI	EVEN_C1		,0FH	;初始化256次AD采样计数器
	LDI	EVEN_C2		,0FH
	LDI	TEMP		,00H	;初始化平均值寄存器
	STA	EVEN_T0		,01H	;复位锅底温度平均值寄存器
	STA	EVEN_T1		,01H
	STA	EVEN_T2		,01H
	STA	EVEN_T3		,01H

	STA	EVEN_I0		,01H	;复位IGBT温度平均值寄存器
	STA	EVEN_I1		,01H
	STA	EVEN_I2		,01H
	STA	EVEN_I3		,01H
	
	STA	ACVOL_0		,01H	;复位电压平均值寄存器
	STA	ACVOL_1		,01H
	STA	ACVOL_2		,01H
	STA	ACVOL_3		,01H
	
	STA	CURRE_0		,01H
	STA	CURRE_1		,01H
	STA	CURRE_2		,01H
	STA	CURRE_3		,01H
	RTNI


;;*****************************************************
;ADC_BEGIN:初始化AD采样子函数,当程序开机后执;行这个程序
;;*****************************************************
ADC_BEGIN:
	LDI	VACR		,1101B	;配置ADC参数(外部5V参考电压,PORTA为AD通道)
	LDI	ADCS		,1000B	;设置AN0为当前的AD通道,采集锅底温度
	LDI	GOT		,1110B	;设置开始转化
	LDI	AD_STATUS	,0001B	;设置第一路ADAD转化标志
	RTNI	
	
;;*****************************************************
;风扇运行子函数:进入加热状态风扇就开始运行
;;*****************************************************
FAN_RUN:
	LDA	HEAT_POINT	,00H	;判断是否开始加热?
	BNZ	$+2			;加热
	JMP	FAN_RUN_1		;不加热
	ORIM	PORTB		,1000B	;设置PORTB.3=1,开启风扇
	ORIM	FAN_STATUS	,0001B	;设置需要30秒定时标志
	JMP	FAN_RUN_2
FAN_RUN_1:
	LDA	FAN_STATUS	,00H	;判断是否需要30秒定时
	BA0	$+2			;需要
	RTNI				;不需要
	LDA	FAN_STATUS	,00H	;判断30秒风扇定时是否已到
	BA1	FAN_RUN_3		;定时已到
	ORIM	PORTB		,1000B	;设置PORTB.3=1,开启风扇
	ORIM	FAN_STATUS	,0001B	;设置需要30秒定时标志
	RTNI
FAN_RUN_3:
	ANDIM	FAN_STATUS	,1110B	;清除需要30秒风扇定时标志
	ANDIM	PORTB		,0111B	;设置PB.3=0关闭风扇
FAN_RUN_2:
	RTNI

;;*****************************************************
;按键功能分析子函数:当判断出现了按键后执行这个程序,当执
;行完毕后清除出现按键标志BUTTON_STATUS.3=0,设置按键已经
;处理标志BUTTON_STAUTS.1=1
;;*****************************************************
FUNCTION:

	
	EORIM	BUTTON_BAK1_L	,0FH	;判断是否出现开关按键
	BA0	FUNC1			;开机按键
	LDA	MAIN_STATUS	,00H	;判断是否处于开机状态
	BA2	$+2			;处于开机状态
	JMP	NOFUNC1			;不处于开机状态,那么功能无效
	LDA	BUTTON_BAK1_L	,00H
	BA1	FUNC2
	BA2	FUNC3
	EORIM	BUTTON_BAK1_M	,0FH
	BA0	FUNC4
	BA1	FUNC5
	BA2	FUNC6
	BA3	FUNC7
	EORIM	BUTTON_BAK1_H	,0FH
	BA1	FUNC8
	BA2	FUNC9
	BA3	FUNC10
	JMP	NOFUNC
FUNC1:
	CALL	ONOFFKEY		;开关按键
	JMP	NOFUNC
FUNC2:
	CALL	ALLKEY			;全速加热按键
	JMP	NOFUNC
FUNC3:
	CALL	MAXKEY			;最大火力按键
	JMP	NOFUNC
FUNC4:
	CALL	INCKEY			;INC按键
	JMP	NOFUNC
FUNC5:
	CALL	DECKEY			;DEC按键
	JMP	NOFUNC
FUNC6:
	CALL	MINKEY			;最小火力按键
	JMP	NOFUNC
FUNC7:

	LDA	HEAT_POINT	,00H	;判断是否可以进行加热
	BNZ	$+2			;可以
	JMP	NOFUNC1			;不可以进行加热
	
	CALL	CTKEY			;定时保温选择按键
	JMP	NOFUNC
FUNC8:
	LDA	HEAT_POINT	,00H	;判断是否可以进行加热
	BNZ	$+2			;可以
	JMP	NOFUNC1			;不可以进行加热
	
	ANDIM	TIME_STATUS	,0111B
	CALL	TIMER_RESET
	CALL	ONEKEY			;个位按键
	
	JMP	NOFUNC
FUNC9:
	LDA	HEAT_POINT	,00H	;判断是否可以进行加热
	BNZ	$+2			;可以
	JMP	NOFUNC1			;不可以进行加热
	ANDIM	TIME_STATUS	,0111B
	CALL	TIMER_RESET
	CALL	TENKEY			;十位按键
	
	JMP	NOFUNC
FUNC10:
	CALL	SELKEY			;选择按键
	JMP	NOFUNC
NOFUNC:
	
	LDI	PWM1		,0011B	;开启蜂鸣器
	ORIM	BUZZER_STATUS	,0001B	;设置蜂鸣器处于鸣叫状态
	LDI	COUNTER_160MS	,08H	;复位160MS定时计数器
	ANDIM	BUZZER_STATUS	,1101B	;清除蜂鸣器鸣叫定时已到标志
NOFUNC1:
	LDA	SHOW_POINT	,00H
	STA	HEAT_POINT	,00H
	
	ORIM	BUTTON_STATUS	,0010B	;设置按键已经备处理标志
	ANDIM	BUTTON_STATUS	,0111B	;清除出现按键标志
	LDI	COUNTER_2H_H	,08H	;2小时定时初始化
	LDI	COUNTER_2H_L	,0FH
		
	LDA	MAIN_STATUS	,00H	;判断是否处于保温模式
	BA1	NOT_MIN			;处于保温模式

	SBI	HEAT_POINT	,01H	;判断是否为最小火力
	BAZ	MIN_HEAT_POINT		;是最小火力点
NOT_MIN:
	
	LDI	DCONT_STATUS	,00H	;清除断续加热状态寄存器
	RTNI
MIN_HEAT_POINT:
	LDI	DCONT_STATUS	,0011B	;设置处于断续加热并且处于加热状态
	LDI	TEMP		,MIN_HEAT_TIME
	STA	COUNTER_HEAT_B	,01H
	STA	COUNTER_HEAT	,00H
	LDI	TEMP		,MIN_STOP_TIME
	STA	COUNTER_STOP_B	,01H
	STA	COUNTER_STOP	,00H
	RTNI
	
;;*****************************************************
;ONOFF KEY按键处理子函数,这个按键是处于开机那么设置关机
;处于关机那么设置开机
;;*****************************************************
ONOFFKEY:
	EORIM	MAIN_STATUS	,0100B	;每当出现一次这个按键,开机标志位取反
	
	LDA	MAIN_STATUS	,00H	;判断是否处于关机状态
	BA2	$+3			;开机
	CALL	CLOSE_M
	RTNI
	LDI	FAULT_STATUS	,00H
	
	CALL	TIMER_RESET		;复位定时计数器
	ORIM	MAIN_STATUS	,0001B	;设置默认状态是加热
	RTNI
	
;;*****************************************************
;ALL KEY按键处理子函数,这个按键是全速加热,火力达到2000W
;;*****************************************************
ALLKEY:
	
	LDA	MAIN_STATUS	,00H	;判断是保温还是加热,保温这个按键不起作用
	BA1	ALLKEY1			;如果检测到处于保温模式,这个按键无效
	ORIM	MAIN_STATUS	,01H	;不是处于保温状态,那么设置成为加热状态
	LDI	SHOW_POINT	,0AH	;设置温度/火力为最大模式
	LDI	AUTO_STATUS	,00H	;清零自动标志寄存器
	ANDIM	MAIN_STATUS	,0111B
ALLKEY1:
	RTNI
	
;;*****************************************************
;INC KEY按键处理子函数,在现有的火力或者保温档的基础上增
;加一档
;;*****************************************************
INCKEY:	
	
	LDA	SHOW_POINT	,00H	;判断是否有火力档
	BNZ	INC_1			;设置过火力档
	LDI	SHOW_POINT	,05H	;没有设置火力档
	ORIM	MAIN_STATUS	,0001B	;设置处于加热状态
	JMP	INC_END
INC_1:
	LDA	AUTO_STATUS	,00H	;判断是否处于自动状态
	BNZ	INC_2			;处于自动状态
	SBI	SHOW_POINT	,09H	;判断当前的火力是否最大
	BAZ	INC_END			;9档火力
	BC	INC_END			;10档火力
	ADIM	SHOW_POINT	,01H	;如果不是最大火力,那么火力档+1
	JMP	INC_END
INC_2:
	LDI	SHOW_POINT	,05H	;如果处于自动状态,那么返回来的时候默认中间第5档火力
	LDI	AUTO_STATUS	,00H	;清除自动功能寄存器
	ANDIM	MAIN_STATUS	,0111B
	ORIM	MAIN_STATUS	,0001B	;默认状态是加热状态
INC_END:
	RTNI
	
;;*****************************************************
;MAX KEY按键处理子函数,用最大火力加热,HEAT_POINT=09H
;;*****************************************************
MAXKEY:
	LDI	SHOW_POINT	,09H	;设置火力档是最大火力档
	LDI	AUTO_STATUS	,00H	;清除自动功能寄存器
	ANDIM	MAIN_STATUS	,0111B
	RTNI
	
;;*****************************************************
;DEC KEY按键处理子函数,在现有的基础上-1
;;*****************************************************
DECKEY:
	LDA	SHOW_POINT	,00H	;判断是否有火力档
	BNZ	DEC_1			;设置过火力档
	LDI	SHOW_POINT	,05H	;没有设置火力档
	ORIM	MAIN_STATUS	,0001B	;设置处于加热状态
	JMP	DEC_END
DEC_1:
	LDA	AUTO_STATUS	,00H	;判断是否处于自动状态
	BNZ	DEC_2			;处于自动状态
	LDA	SHOW_POINT	,00H	;判断当前是否处于最小火力点
	STA	TEMP	,00H
	EORIM	TEMP	,01H		;检测当前火力是否为最小火力
	BAZ	DEC_END			;=0表示火力最小,那么不允许再减少
	SBIM	SHOW_POINT	,01H	;如果不是处于最小火力点,那么火力点-1
	JMP	DEC_END
DEC_2:
	LDI	SHOW_POINT	,05H	;如果处于自动状态,那么返回来的时候默认中间第5档火力
	LDI	AUTO_STATUS	,00H	;清除自动功能寄存器
	ANDIM	MAIN_STATUS	,0111B
	ORIM	MAIN_STATUS	,0001B	;默认状态是加热状态
DEC_END:
	RTNI
	
;;*****************************************************
;MIN KEY按键处理子函数
;;*****************************************************
MINKEY:
	LDI	SHOW_POINT	,01H	;设置火力档是最大火力档
	LDI	AUTO_STATUS	,00H	;清除自动功能寄存器
	ANDIM	MAIN_STATUS	,0111B
	RTNI

;;*****************************************************
;CT KEY按键处理子函数,实现保温和加热状态的切换,如果进入
;保温状态,那么清除保温已经达到设定值标志
;;*****************************************************
CTKEY:
	LDA	SHOW_POINT	,00H	;判断是否有加热火力档,没有,那么这个按键无效
	BAZ	CT_END			;没有火力档
	LDA	AUTO_STATUS	,00H	;判断是否处于自动状态
	BNZ	CT_END			;如果处于自动模式,那么无效
	LDA	MAIN_STATUS	,00H	;判断是否处于加热状态
	BA0	CT_1
	ORIM	MAIN_STATUS	,01H	;不是处于加热状态,那么就设置为加热状态
	ANDIM	MAIN_STATUS	,0101B	;清除保温模式以及保温达到设定值

	JMP	CT_END
CT_1:
	ORIM	MAIN_STATUS	,02H	;处于加热模式就设置成为保温模式
	ANDIM	MAIN_STATUS	,1110B	;清除加热模式
CT_END:
	RTNI
	
;;*****************************************************
;ONE KEY按键处理子函数
;;*****************************************************
ONEKEY:
	LDA	SHOW_POINT	,00H	;判断是否有加热火力档,没有,那么这个按键无效
	BAZ	ONE_END			;没有火力档
	LDA	AUTO_STATUS	,00H	;是否处于自动功能
	BNZ	ONE_END			;处于自动功能
	
	ORIM	SHOW_STATUS	,0001B	;设置可以显示定时时间标志
	SBI	SNUM0	,09H		;用SNUM0-9,如果有借位,表示下一个数一定是0,如果没有借位,那么还可以再增加1
	BNC	ONE_1			;SNUM0不等于9那么下一个数据+1
	
	LDA	SNUM1	,00H		;SNUM1=0?
	BAZ	$+3			;等于0
	LDI	SNUM0	,00H		;不等于0,那么SNUM0就等于0
	JMP	ONE_END			
	LDI	SNUM0	,01H		;如果等于0,那么SNUM0=1
	JMP	ONE_END
ONE_1
	ADIM	SNUM0	,01H		;没有借位,那么值+1
ONE_END:
	RTNI
	
;;*****************************************************
;TEN KEY按键处理子函数
;;*****************************************************
TENKEY:
	LDA	SHOW_POINT	,00H	;判断是否有加热火力档,没有,那么这个按键无效
	BAZ	TEN_END			;没有火力档
	LDA	AUTO_STATUS	,00H	;是否处于自动功能
	BNZ	TEN_END			;处于自动功能
	
	ORIM	SHOW_STATUS	,0001B	;设置可以显示定时时间标志 
	SBI	SNUM1	,09H		;用SNUM0-9,如果有借位,表示下一个数一定是0,如果没有借位,那么还可以再增加1
	BNC	TEN_1
	LDA	SNUM0	,00H
	BAZ	$+3
	LDI	SNUM1	,00H		;有借位,那么下一个数就是0
	JMP	TEN_END
	LDI	SNUM1	,01H
	JMP	TEN_END
TEN_1:
	ADIM	SNUM1	,01H		;没有借位,那么值+1
TEN_END:
	RTNI
;;*****************************************************
;SEL KEY按键处理子函数
;;*****************************************************
SELKEY:
	LDI	SNUM0		,00H	;清除按键定时计数器
	LDI	SNUM1		,00H
	ANDIM	SHOW_STATUS	,1110B	;清除数码管允许显示标志
	
	LDA	AUTO_STATUS	,00H	;判断是何种自动功能
	BAZ	SELKEY_1		;没有自动功能
	SBI	AUTO_STATUS	,AUTO_NUMBER
	BAZ	SELKEY_1		;自动功能7
	ADIM	AUTO_STATUS	,01H	;自动功能+1
	JMP	SELKEY_2
SELKEY_1:
	LDI	AUTO_STATUS	,01H	;没有自动功能或者自动功能是7,那么设定自动功能1
SELKEY_2:
	LDI	SHOW_POINT	,02H	;设置自动功能开始的时候是最小火力
	LDI	FUNCTION_STATUS	,00H
	ANDIM	MAIN_STATUS	,0101B
	ORIM	MAIN_STATUS	,0001B
	RTNI
	

;;*****************************************************
;显示子函数:分5路显示
;;*****************************************************
SHOW_ALL:
	LDA	SHOW_ORDER	,00H
	BAZ	ALLSHOW1		;显示第一段
	BA0	ALLSHOW2		;显示第二段
	BA1	ALLSHOW3		;显示第三段
	BA2	ALLSHOW4		;显示第四段
	BA3	ALLSHOW5		;显示第五段
	JMP	NOALLSHOW		;没有显示
ALLSHOW1:
	LDI	SHOW_ORDER	,01H	;设置显示第二段
	LDA	HEAT_POINT	,00H	;判断有无火力档
	BAZ	NOALLSHOW		;没有
	LDA	AUTO_STATUS	,00H	;如果处于自动状态,那么不显示这一部分
	BNZ	$+2
	CALL	SHOW_FIRE		;不是处于自动状态显示火力档
	
	JMP	NOALLSHOW
ALLSHOW2:
	
	CALL	SHOW_TEN		;显示数码管的十位
	LDI	SHOW_ORDER	,02H
	JMP	NOALLSHOW
ALLSHOW3:

⌨️ 快捷键说明

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