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

📄 induction_cooker_v41.asm

📁 中颖SH69P44开发的电磁炉原程序和线路图
💻 ASM
📖 第 1 页 / 共 5 页
字号:
INCLUDE Cooker_head.ASM

LIST P=69P43
ROMSIZE=3*1024
;;*****************************************************
;公司名称:中颖电子(上海)
;程序名称:DCLV40.ASM
;创建人:王辅			时间2003年12月07日
;修改人:王辅			时间2004年01月02日
;功能描述:显示电磁炉工作状态,控制电磁炉的加热流程以及保护电磁炉
;版本:4.1
;;*****************************************************


	
;;*****************************************************
;主程序
;;*****************************************************

	ORG	0000H
PROGRAM:
	JMP	POWERON			;复位入口
	NOP
	JMP	TIMER0			;T0中断子函数
	NOP
	NOP
	ORG	0005H
POWERON:
	
	LDI	PBXOUT	,1101B		;设置PB.2是输出口
	NOP
	NOP
	ANDIM	PORTB	,1011B		;关闭IGBT
	ORIM	PORTB	,0010B
	
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;初始化系统寄存器段;因为每一次复位,系统寄存器的值都一般
;会发生改变,因此需要在程序开始的地方进行复位
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
	CALL	INI_SYS_REGISTER	;设置系统寄存器
	CALL	INI_TIME_SOURCE		;初始化定时系统
	CALL	INI_TIMER0		;初始化定时器0
	
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;非法Reset程序保护,上电查询是否非法复位,如果是非法复位,
;则PSTA1,PSTA2,PSTA3就应该相等,并且根据它们的值,确定当
;前应该执行的程序段
;+++++++++++++++++++++++++++++++++++++++++++++++++++++		
	LDA	PSTA1	,00H		;判断保护标志是否一样
	EOR	PSTA2	,00H
	BNZ	INITIAL1
	LDA	PSTA1	,00H
	EOR	PSTA3	,00H
	BNZ	INITIAL1
	LDA	PSTA1	,00H
	STA	TEMP	,00H
	EORIM	TEMP	,01H
	BAZ	MLP1			;跳转到第一段程序
	LDA	PSTA1	,00H
	STA	TEMP	,00H
	EORIM	TEMP	,02H
	BAZ	MLP0			;跳转到第二段程序
	LDA	PSTA1	,00H
	STA	TEMP	,00H
	EORIM	TEMP	,04H
	BAZ	MLP3			;跳转到第三段程序
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;初始化用户参数寄存器;用户参数寄存器分为两部分是因为存
;在关机后风扇需要继续工作30秒,这些参数和其他的参数不能
;一起复位
;+++++++++++++++++++++++++++++++++++++++++++++++++++++

INITIAL1:
	CALL	RAM_CLEAR		;所有RAM清零
	CALL	INI_PORT		;CLOSE ALL DISPLAY
	CALL	TIMER_RESET		;定时器计数器复位
	CALL	INI_ACTION		;上电初始化动作
	CALL	ADC_INI			;初始化AD寄存器
MLP5:
	CALL	INI_CUS_REGISTER1	;设置用户寄存器
MLP4:
	CALL	INI_CUS_REGISTER2	;设置用户寄存器

MLP0:
	LDI	PSTA1	,02H		;设置第一段程序保护标志
	LDI	PSTA2	,02H		;设置第一段程序保护标志
	LDI	PSTA3	,02H		;设置第一段程序保护标志

	LDI	WDT	,00H		;清除看门狗
	CALL	SHOW_ALL		;全部显示都包含在这个子函数中
	CALL	ADC_GET			;AD采样子函数
	CALL 	BUZZER_ALARM		;鸣器鸣叫子函数
	CALL	PINTER_AG		;纪录程序循环次数
	
	
	CALL	TIMER_DETECT
	CALL	TIME_SOURCE
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	LDA	MAIN_STATUS	,00H	;检测是否处于开机状态
	BA2	$+2			;处于开机状态
	JMP	MLP1			;不是处于开机状态
	
	LDA	HEAT_POINT	,00H	;判断是否可以开始加热
	BAZ	$+2			;不可以加热
	JMP	MLP3			;可以加热
	
	LDA	TIME_STATUS	,00H	;判断5秒定时是否已满
	BA0	$+2			;定时已到
	JMP	$+2			;定时没有到
	ANDIM	MAIN_STATUS	,1011B	;如果5秒内还没有火力按键,那么关机
	CALL	SHOW_DOT		;显示小数点
	JMP	MLP1
MLP3:
	LDI	PSTA1		,04H	;设置第三段程序保护标志
	LDI	PSTA2		,04H	;设置第三段程序保护标志
	LDI	PSTA3		,04H	;设置第三段程序保护标志
	CALL	ADC_GET			;AD采样子函数	
	CALL	PWM_SOFT_STARTUP	;PWM的软启动,每当IGBT重新开启的时候,都需要软启动
	CALL	PWM_SETUP		;PWM修正子函数
	CALL	ADC_GET			;AD采样子函数
	
	LDA	AUTO_STATUS	,00H	;判断是否处于自动功能
	BNZ	MLP3_1			;处于自动功能状态
	
	LDA	MAIN_STATUS	,00H	;判断是否需要保温
	BA1	$+2			;不需要保温
	JMP	MLP3_0
	CALL	HEAT_KEEP		;保温子函数
	JMP	MLP3_0
MLP3_1:
	CALL	FUNCTION_AUTO		;自动功能处理子函数
MLP3_0:
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	DISC_HEAT		;断续加热处理子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	PWM_OUT			;PWM输出控制子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	NEED_ZERO		;是否需要过零检测
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	FAULT_DEAL		;故障处理
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	BOIL_ON			;进行有锅无锅的探测
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数 
	CALL	TIME_DEC		;定时处理子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	PWM_SETUP		;PWM修正子函数
MLP1:
	LDI	PSTA1	,01H		;设置第一段程序保护标志
	LDI	PSTA2	,01H		;设置第一段程序保护标志
	LDI	PSTA3	,01H		;设置第一段程序保护标志
	CALL	ADC_GET			;AD采样子函数
	CALL	ADC_GET			;AD采样子函数
	CALL	FAN_RUN			;这个风扇子函数在关机后30秒的时间内其作用
	CALL	ADC_GET			;AD采样子函数
	CALL	BUTTON_SCAN		;按键扫描子函数
	LDA	BUTTON_STATUS	,00H	;判断是否出现按键
	BA3	MLP2			;出现了按键
	LDA	MAIN_STATUS	,00H	;检测是否应该关机
	BA2	MLP0			;处于开机状态

	ANDIM	PORTB	,1011B		;关闭IGBT
	LDA	FAN_STATUS	,00H	;检测是否需要30秒风扇定时
	BA0	MLP4			;需要
	JMP	MLP5			;不需要
MLP2:
	CALL	FUNCTION		;按键分析子函数
	JMP	MLP0

;;*****************************************************
;定时时间递减子函数:每当1分钟定时到,那么定时计数器-1,直
;到等于0为止.
;;*****************************************************
TIME_DEC:
	LDA	SHOW_STATUS	,00H	;判断是否可以显示数码管
	BA0	$+2			;可以显示数码管
	JMP	NODECSHOW		;不可以显示数码管

	LDA	SNUM0		,00H	;判断按键定时计数器是否等于0
	BNZ	DECSHOW2
	LDA	SNUM1		,00H
	BNZ	DECSHOW2
	CALL	CLOSE_M
	JMP	NODECSHOW
DECSHOW2:

	LDA	TIME_STATUS	,00H	;判断定时是否已经满了一分钟
	BA3	$+2			;定时已满一分钟
	JMP	NODECSHOW		;定时不满一分钟
	ANDIM	TIME_STATUS	,0111B	;清除加热定时标志位(一分钟定时已到)
	LDA	SNUM0	,00H
	BAZ	DECSHOW1		;个位=0
	SBIM	SNUM0	,01H		;个位不等于=0,那么直接-1
	JMP	NODECSHOW
DECSHOW1:	
	LDA	SNUM1	,00H		;检测十位数字是否为0
	BNZ	$+2			;十位不等于0
	JMP	NODECSHOW
	LDI	SNUM0	,09H		;个位数据变为9
	SBIM	SNUM1	,01H		;十位数据减一 
NODECSHOW:
	RTNI
;;*****************************************************
;检测有锅无锅,有锅的时候通过检测电流大小来确定是否无锅,
;如果电流变到一定程度认为无锅,处于无锅的时候,每隔500MS,
;IGBT开启10US,然后通过T0计数脉冲个数,10个以下认为有锅,
;10个以上认为无锅,每当检测到一次,脉冲个数小于10个,那么
;认定有锅,清除无锅故障计数器
;;*****************************************************
BOIL_ON:
	LDA	PLUSE_STATUS	,00H	;探测是否探锅脉冲开始定时
	BA0	BOIL1			;开始了
	RTNI				;没有开始
BOIL1:
	LDA	PLUSE_STATUS	,00H	;判断计数是否结束
	BA1	$+2			;计数已经结束
	RTNI
	LDI	PLUSE_STATUS	,00H	;计数结束,清除探测有锅无锅参数

	LDA	PLUSE_COUNTER	,00H	;如果一个脉冲也没有探测到,那么同样认为无锅(实际是一种故障)
	BNZ	BOIL2
	ORIM	WRONG		,0010B	;设置无锅故障
	RTNI
BOIL2:	
	LDA	PLUSE_COUNTER	,00H	;IGBT没有开启,此时无锅的脉冲个数大于10H,有锅小于0AH
	STA	COMP1		,00H
	LDI	COMP2		,HAVE_BOIL_NUM	;读取判断有锅的常数
	CALL	COMPARE			;比较
	LDA	COMPARE_STATUS	,00H	;读取结果
	BA1	BOIL3			;小于05H,有锅
	ORIM	WRONG		,0010B
	LDI	HAVE_BOIL_CNT	,00H	;清除有锅计数器
	RTNI
BOIL3:
	LDA	HAVE_BOIL_CNT	,00H	;判断有锅计数器是否等于2
	BA1	$+3			;等于
	ADIM	HAVE_BOIL_CNT	,01H	;不等于,那么+1
	JMP	BOIL4
	ANDIM	WRONG		,1101B	;清除出现无锅故障
BOIL4:
	RTNI
	
;;*****************************************************
;断续加热处理子函数:
;;*****************************************************
DISC_HEAT:
	LDA	DCONT_STATUS	,00H	;判断是否处于断续加热状态
	BA0	$+2			;处于断续加热状态
	RTNI				;不是处于断续加热状态
	LDA	DCONT_STATUS	,00H	;判断1秒定时是否已到
	BA2	$+2			;定时已到
	RTNI				;定时没有到
	ANDIM	DCONT_STATUS	,1011B	;清除1秒定时已到标志
	LDA	DCONT_STATUS	,00H	;判断是否处于加热状态
	BA1	HEAT_STATUS		;处于加热状态
	JMP	STOP_STATUS		;处于停止状态
HEAT_STATUS:
	SBIM	COUNTER_HEAT	,01H	;加热计数器-1
	BAZ	$+2			;加热定时已到	
	RTNI				;加热定时没有到
	ANDIM	DCONT_STATUS	,1101B	;清除加热标志

	LDA	COUNTER_HEAT_B	,01H	;读取加热定时备份计数器
	STA	COUNTER_HEAT	,00H	;复位加热定时计数器
	RTNI
STOP_STATUS:
	SBIM	COUNTER_STOP	,01H	;停止计数器-1
	BAZ	$+2			;停止定时已到
	RTNI				;停止定时没有到
	ORIM	DCONT_STATUS	,0010B	;设置处于加热状态

	LDA	COUNTER_STOP_B	,01H	;读取停止定时备份计数器
	STA	COUNTER_STOP	,00H	;复位停止定时计数器
	RTNI
;;*****************************************************
;故障处理子函数:处理故障情况,如果出现无锅故障,那么需要
;分析2分钟内能否恢复,如果还是不能检测到有锅,那么关机.不
;管出现何种故障,都要关闭IGBT,其中WRONG.0=电压故障,.1=无
;锅故障,.2=IGBT温度故障.3=过底温度故障
;;*****************************************************
FAULT_DEAL:
	LDA	WRONG		,00H	;探测故障类型
	BA1	SYSTEM1			;无锅故障处理
	ANDIM	BOIL_STATUS	,1110B	;清除无锅定时开始标志
	LDA	BUZZER_STATUS	,00H	;按键蜂鸣器没有鸣叫?
	BA0	SYSTEM1_0		;按键蜂鸣器在鸣叫
	LDI	PWM1		,0010B	;如果没有无锅故障,并且按键蜂鸣器不鸣叫,那么关闭蜂鸣器
SYSTEM1_0:
	LDA	WRONG		,00H	;此时WRONG!=0,那么存在其他故障
	BNZ	SYSTEM2			;其他故障处理
	JMP	SYSTEM3			;没有故障
SYSTEM1:
	ANDIM	PWM_STATUS	,1101B	;清除开启IGBT标志
	LDA	BOIL_STATUS	,00H	;判断无锅定时是否开始
	BA0	NOBOIL			;无锅定时已经开始
	ORIM	BOIL_STATUS	,0001B	;设定无锅定时开始标志
	ANDIM	BOIL_STATUS	,1001B	;清除5秒和2分钟定时已满标志

	LDI	COUNTER_5S_B	,05H	;复位部分定时计数器
	LDI	COUNTER_2M_L	,04H	;复位2分钟定时计数器
	LDI	COUNTER_2M_H	,06H
	JMP	SYSTEM4
NOBOIL:
	LDA	BOIL_STATUS	,00H	;探测5秒钟是否已满
	BA1	$+2			;已满
	JMP	SYSTEM4			;没有到
	LDA	BUZZER_STATUS	,00H	;探测是否存在按键鸣叫
	BA0	NOBOIL_1		;存在
	LDI	PWM1		,0011B	;开启蜂鸣器
	ORIM	BUZZER_STATUS	,0001B	;设置蜂鸣器处于鸣叫状态
	LDI	COUNTER_160MS	,08H	;复位160MS定时计数器
	ANDIM	BUZZER_STATUS	,1101B	;清除蜂鸣器鸣叫定时已到标志

	ANDIM	BOIL_STATUS	,1101B	;清除5秒定时已到标志
NOBOIL_1:	
	LDA	BOIL_STATUS	,00H	;探测2分钟定时满否
	BA2	$+2			;2分钟无锅定时已满
	JMP	SYSTEM4
	CALL	CLOSE_M			;2分钟还没有锅,那么关机
	JMP	SYSTEM4
SYSTEM2:
	ANDIM	PWM_STATUS	,1101B	;关闭IGBT
	JMP	SYSTEM4
SYSTEM3:
	LDA	DCONT_STATUS	,00H	;判断是否处于断续加热状态
	BA0	$+2			;是
	JMP	SYSTEM5
	LDA	DCONT_STATUS	,00H	;判断是加热还是停止
	BA1	SYSTEM5
	ANDIM	PWM_STATUS	,1101B	;清除允许开启IGBT标志
	JMP	SYSTEM4
SYSTEM5:
	LDA	MAIN_STATUS	,00H	;如果保温达到设定值,那么也不能开启IGBT
	BA3	SYSTEM4
	ORIM	PWM_STATUS	,0010B	;设置开启IGBT标志
SYSTEM4:
	RTNI
	
;;*****************************************************
;需要过零检测子函数:每次重新开启IGBT的时候都需要过零检
;测,在IGBT处于关闭,但是此时需要开启IGBT的时候设置需要过
;零检测标志
;;*****************************************************
NEED_ZERO:
	LDA	PWM_STATUS	,00H	;检测是否需要开启IGBT?
	BA1	$+2			;需要
	JMP	NOTNEED			;不需要  
	LDA	PORTB	,00H		;读取PORTB,检测是否IGBT处于开启状态
	BA2	NOTNEED1		;如果本身IGBT就是开启的,那么不需要检测过零
	
	ORIM	PWM_STATUS	,0100B	;设置需要进行过零检测

	JMP	NOTNEED
NOTNEED1:
	ANDIM	PWM_STATUS	,1011B	;不需要过零检测,清除过零检测标志
NOTNEED:
	RTNI

;;*****************************************************
;PWM控制子函数:控制IGBT的关闭,而IGBT的
;开启只有在过零检测检测到过零的时候才
;能开启IGBT
;;*****************************************************
PWM_OUT:
	LDA	PWM_STATUS	,00H	;检测是否可以开启IGBT
	BA1	$+2			;可以开启IGBT
	JMP	PWMOUT1			;不允许开启IGBT
	JMP	PWMOUT2
PWMOUT1:				
	ANDIM	PORTB	,1011B		;关闭IGBT
	LDI	PD0H		,01H
	LDI	PD0M		,0AH
	LDI	PD0L		,00H
PWMOUT2:
	RTNI
;;*****************************************************
;自动功能子函数
;;*****************************************************
FUNCTION_AUTO:
	SBI	AUTO_STATUS	,01H	;判断是否是自动功能1
	BAZ	AUTO_WATER_B		;是,那么进入自动烧水
	SBI	AUTO_STATUS	,02H	;判断是否是自动功能2
	BAZ	AUTO_RICE_B		;是,那么进入自动褒粥
	SBI	AUTO_STATUS	,03H	;判断是否是自动功能3
	BAZ	AUTO_MF_B		;是,那么进入自动米饭
	SBI	AUTO_STATUS	,04H	;判断是否是自动功能3
	BAZ	AUTO_CC_B		;进入自动炒菜
	SBI	AUTO_STATUS	,05H	;判断是否是自动功能3
	BAZ	AUTO_SK_B		;进入自动烧烤
	SBI	AUTO_STATUS	,06H	;判断是否是自动功能3
	BAZ	AUTO_WN_B		;进入自动温奶
	JMP	AUTO_HUOGUO		;那么进入自动火锅
AUTO_WATER_B:
	JMP	AUTO_WATER
AUTO_RICE_B:
	JMP	AUTO_RICE
AUTO_MF_B:
	JMP	AUTO_MF
AUTO_CC_B:
	JMP	AUTO_CC
AUTO_SK_B:
	JMP	AUTO_SK
AUTO_WN_B:
	JMP	AUTO_WN

FUNCTION_AUTO_END:
	RTNI

;;*****************************************************
;PWM软启动子程序,每当IGBT重新开启的时候PWM每隔20MS+1,
;直到达到设定值为止
;;*****************************************************
PWM_SOFT_STARTUP:
	

	LDA	WRONG		,00H	;如果无锅故障,那么不需要进行软启动
	BA1	SOFT_END
	
	LDA	PORTB		,00H	;如果OC关闭,那么也不需要进行软启动
	BA2	$+2
	JMP	SOFT_END
	

⌨️ 快捷键说明

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