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