📄 induction_cooker_v41.asm
字号:
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 + -