📄 induction_cooker_v41.asm
字号:
CALL SHOW_ONE ;显示数码管的个位
LDI SHOW_ORDER ,04H
JMP NOALLSHOW
ALLSHOW4:
LDI SHOW_ORDER ,08H
LDA HEAT_POINT ,00H ;判断有无火力档
BAZ NOALLSHOW ;没有
CALL SHOW_AUTO ;显示自动功能
JMP NOALLSHOW
ALLSHOW5:
LDI SHOW_ORDER ,00H
LDA MAIN_STATUS ,00H ;判断是否开机
BA2 $+2
JMP NOALLSHOW
CALL SHOW_DOT ;不是处于自动状态, 显示小数点
JMP NOALLSHOW
NOALLSHOW:
RTNI
;;*****************************************************
;显示火力等级指示灯
;;*****************************************************
SHOW_FIRE: ;显示LED1-LED7
LDI PORTF ,0EH ;设置第一路输出,其他路不输出
LDA MAIN_STATUS ,00H ;判断当前处于深么状态
BA0 SHOW11 ;当前处于加热状态
BA1 SHOW12 ;当前处于保温状态
JMP SHOW13 ;两个状态都不是
SHOW11:
LDI TBR ,0EH
ADI SHOW_POINT ,01H ;显示当前的火力点
CALL 07E0H ;从07E0H读取加热显示状态
STA PORTD ,00H
LDA TBR ,00H
STA PORTE ,00H
JMP SHOW13
SHOW12:
LDI TBR ,0FH
ADI SHOW_POINT ,01H ;显示当前的火力点
CALL 07F0H ;从07F0H读取保温显示状态
STA PORTD ,00H
LDA TBR ,00H
STA PORTE ,00H
SHOW13:
SHOW14:
RTNI
;;*****************************************************
;显示自动功能指示灯子函数
;;*****************************************************
SHOW_AUTO: ;显示LED8-LED9
LDI PORTF ,1101B ;设置第二路输出,其他路不输出
LDA AUTO_STATUS ,00H ;判断是否处于自动模式
BNZ $+2
JMP ENDSHOW2
LDI PORTD ,0000B ;3个LED同时点亮
ENDSHOW2:
RTNI
;;*****************************************************
;显示数码管十位子函数,根据需要显示的数据,从表中查得需要
;的PORT口状态.由于不同的状态需要显示不同的值.在各自的状
;态下,把数据传送给TEMP就可以了
;;*****************************************************
SHOW_TEN: ;显示数码管高位
LDA FAULT_STATUS ,00H ;判断是否出现了硬件性故障
BNZ SHOW_TEN_1 ;出现了硬件性故障
LDA AUTO_STATUS ,00H ;没有出现硬件性故障的时候,检测是否出现了自动功能
BNZ SHOW_TEN_2 ;出现了自动功能
LDA SHOW_STATUS ,00H ;判断是否需要显示定时时间
BA0 $+2
JMP SHOW_TEN_5
LDA SNUM1 ,00H ;显示定时数据高位
STA TEMP ,00H
JMP SHOW_TEN_3
SHOW_TEN_1:
LDI TEMP ,0FH ;显示F
JMP SHOW_TEN_3
SHOW_TEN_2:
; LDA TPER0B ,01H
; STA TEMP ,00H
LDI TEMP ,0AH ;显示A
SHOW_TEN_3:
LDI PORTF ,1011B ;设置第三路输出,其他路不输出
LDI TEMP0 ,0FH ;判断是否SNUM1是0FH
EOR TEMP ,00H ;显示的数不等于0FH
BAZ SHOW_TEN_4
LDI TBR ,0DH
ADI TEMP ,01H
CALL 07D0H
STA PORTD ,00H
LDA TBR ,00H
STA PORTE ,00H
JMP SHOW_TEN_5
SHOW_TEN_4:
LDI PORTD ,0110B
LDI PORTE ,01H
SHOW_TEN_5:
RTNI
;;*****************************************************
;显示数码管个位子函数,根据需要显示的数据,从表中查得需要
;的PORT口状态.由于不同的状态需要显示不同的值.在各自的状
;态下,把数据传送给TEMP就可以了
;;*****************************************************
SHOW_ONE: ;显示数码管低位
LDA FAULT_STATUS ,00H ;判断是否出现了硬件性故障
BNZ SHOW_ONE_1 ;出现了硬件性故障
LDA AUTO_STATUS ,00H ;没有出现硬件性故障的时候,检测是否出现了自动功能
BNZ SHOW_ONE_2 ;出现了自动功能
LDA SHOW_STATUS ,00H ;判断是否需要显示定时时间
BA0 $+2
JMP SHOW_ONE_5
LDA SNUM0 ,00H ;显示定时数据低位
STA TEMP ,00H
JMP SHOW_ONE_3
SHOW_ONE_1:
LDA FAULT_STATUS ,00H
STA TEMP ,00H ;显示硬件性故障类型
JMP SHOW_ONE_3
SHOW_ONE_2:
LDA AUTO_STATUS ,00H
STA TEMP ,00H ;显示自动功能类型
SHOW_ONE_3:
LDI PORTF ,0111B ;设置第三路输出,其他路不输出
LDI TEMP0 ,0FH
EOR TEMP ,00H ;显示的数不等于0FH
BAZ SHOW_ONE_4
LDI TBR ,0DH
ADI TEMP ,01H
CALL 07D0H
STA PORTD ,00H
LDA TBR ,00H
STA PORTE ,00H
JMP SHOW_ONE_5
SHOW_ONE_4:
LDI PORTD ,0110B
LDI PORTE ,01H
SHOW_ONE_5:
RTNI
;;*****************************************************
;显示小数点子函数
;;*****************************************************
SHOW_DOT:
LDI PORTD ,07H ;点亮小数点
LDI PORTE ,0FH
LDI PORTF ,0110B
RTNI
;;*****************************************************
;判键子函数:每隔20MS判断一次,当20MS定时已到的时候置位
;BUTTON_STATUS.2,程序一旦检测到定时已到,那么读取是否存
;在按键.存在,那么设置BUTTON_STATUS.0
;;*****************************************************
BUTTON_SCAN:
CALL INI_PORT
LDA BUTTON_STATUS ,00H ;判断是否20MS定时已满
BA2 $+2
JMP FBT4 ;定时没有到,那么不用检测按键
ANDIM BUTTON_STATUS ,1011B ;清除25MS定时已满标志
CALL FIRSTBUTTON ;判键
LDA BUTTON_STATUS ,00H ;检测是否有按键按下
BA0 $+3 ;有按键按下
LDI BUTTON_STATUS ,00H ;清除按键标志寄存器
JMP FBT4
ANDIM BUTTON_BAK1_L ,0111B
ANDIM BUTTON_BAK2_L ,0111B
ANDIM BUTTON_BAK1_H ,1110B
ANDIM BUTTON_BAK2_H ,1110B ;同步不相干的位
LDA BUTTON_BAK1_L ,00H
SUB BUTTON_BAK2_L ,00H
BNZ FBT2 ;不相等表明前后两次的按键不一样
LDA BUTTON_BAK1_M ,00H
SUB BUTTON_BAK2_M ,00H
BNZ FBT2 ;不相等表明前后两次的按键不一样
LDA BUTTON_BAK1_H ,00H
SUB BUTTON_BAK2_H ,00H
BNZ FBT2 ;不相等表明前后两次的按键不一样
JMP FBT3
FBT2:
LDA BUTTON_BAK1_L ,00H ;不一样,那么用后一次判到的按键值替换前一次判到的按键值
STA BUTTON_BAK2_L ,00H
LDA BUTTON_BAK1_M ,00H
STA BUTTON_BAK2_M ,00H
LDA BUTTON_BAK1_H ,00H
STA BUTTON_BAK2_H ,00H
LDI KEY_CN ,00H ;复位按键计数器
JMP FBT4
FBT3:
ADIM KEY_CN ,01H ;按键计数器寄存器+1
LDA KEY_CN ,00H ;判断是否按键已经出现8次
BA3 FBT4 ;如果没有出现8次,那么认定还没有盼到按键,直到连续8次判到按键才认为出现
LDI KEY_CN ,07H ;如果达到8次,那么还是设定为7,下一次判断到还是认为是8次
LDA BUTTON_STATUS ,00H ;判断这一次按键是否已经处理过
BA1 FBT4 ;按键已经被处理
ORIM BUTTON_STATUS ,08H ;设置出现按键标志
FBT4:
RTNI
;;*****************************************************
;单次判键子函数:这个子函数来判断是否有按键按下,如果有按
;键按下,那么设置BUTTON_STATUS.0位
;;*****************************************************
FIRSTBUTTON:
ANDIM BUTTON_STATUS ,1110B ;清除判键定时已到标志
LDI PORTF ,0FH ;关闭所有显示
LDI PDXOUT ,08H ;设置PORTD为输入口
NOP ;延时
NOP
NOP ;延时
NOP
NOP ;延时
NOP
LDA PORTD ,00H ;读取按键
STA BUTTON_BAK1_L ,00H ;保存从PORTD口读取的按键信息
STA TEMP ,00H ;保存在TEMP中
LDI PDXOUT ,0FH ;读取完毕后设置PORTD为输出口
ORIM TEMP ,08H ;由于PORTD.3没有按键,因此处理这一位
EORIM TEMP ,0FH ;异或,如果有0,那么就会出现1
BNZ $+2 ;出现按键
JMP $+2 ;没有按键出现
ORIM BUTTON_STATUS ,01H ;出现按键设置第一次出现按键标志
LDI PEXOUT ,00H ;设置PORTE为输入口
NOP ;延时
NOP
NOP ;延时
NOP
NOP ;延时
NOP
LDA PORTE ,00H ;读取按键
STA BUTTON_BAK1_M ,00H ;保存从PORTD口读取的按键信息
STA TEMP ,00H ;保存在TEMP中
LDI PEXOUT ,0FH ;读取完毕后设置PORTE为输出口
EORIM TEMP ,0FH ;异或,如果有0,那么就会出现1
BNZ $+2 ;出现按键
JMP $+2 ;没有按键出现
ORIM BUTTON_STATUS ,01H ;出现按键设置第一次出现按键标志
LDI PFXOUT ,00H ;除了PORTF.0,其余的PORTF都设置成为输入口
NOP ;延时
NOP
NOP ;延时
NOP
NOP ;延时
NOP
LDA PORTF ,00H ;读取按键
STA BUTTON_BAK1_H ,00H ;保存从PORTD口读取的按键信息
STA TEMP ,00H ;保存在TEMP中
LDI PFXOUT ,0FH ;设置PORTF为输出口
ORIM TEMP ,01H ;PORTF.0没有按键,因此处理这一位
EORIM TEMP ,0FH ;异或,如果有0,那么就会出现1
BNZ FBUTTONOK ;出现按键
JMP FBUTTONNO ;没有按键出现
FBUTTONOK:
ORIM BUTTON_STATUS ,01H ;出现按键设置第一次出现按键标志
FBUTTONNO:
RTNI
;;*****************************************************
;纪录主函数循环次数子函数.这个主要是当发送完毕探锅脉冲
;后开始纪录程序循环次数,完成15次后,判断出现的振荡次数
;用RUN_COUNTER纪录程序循环次数;用PLUSE_COUNTER纪录出现
;的振荡次数
;;*****************************************************
PINTER_AG:
ADIM RUN_COUNTER ,01H ;循环次数计数器
BNZ $+3
ORIM PLUSE_STATUS ,0010B ;设置有锅探测"定时"已到标志
LDI IE ,0000B ;开启TIMER1中断
RTNI
;;*****************************************************
;蜂鸣器鸣叫子函数,在蜂鸣器鸣叫的时候检测是否鸣叫时间已到
;在按键或者无锅报警或者自动功能完毕的时候,设置蜂鸣器鸣叫
;BUZZER_STATUS=0001B,这个子函数就检测是否160MS定时已到?
;也就是BUZZER_STATUS.1=1?,如果定时已到,那么关闭蜂鸣器
;;*****************************************************
BUZZER_ALARM:
LDA BUZZER_STATUS ,00H ;判断蜂鸣器是否应该鸣叫
BA0 $+2 ;蜂鸣器处于鸣叫状态
JMP KEYALARM1 ;蜂鸣器没有鸣叫
LDA BUZZER_STATUS ,00H ;判断蜂鸣器鸣叫的时间是否已到
BA1 $+2 ;蜂鸣器鸣叫定时已到
JMP KEYALARM1 ;蜂鸣器鸣叫定时没到
ANDIM BUZZER_STATUS ,1110B ;清除蜂鸣器应该鸣叫标志
LDI PWM1 ,0010B
KEYALARM1:
RTNI
;;*****************************************************
;初始化用户寄存器子函数2
;;*****************************************************
INI_CUS_REGISTER2:
LDI AD_STATUS ,00H
LDI HEAT_POINT ,00H ;复位加热火力档
LDI SHOW_POINT ,00H
LDI MAIN_STATUS ,00H ;复位主程序状态寄存器
LDI TIME_STATUS ,00H ;复位定时状态寄存器
LDI SNUM0 ,00H ;复位按键定时计数器个位
LDI SNUM1 ,00H ;复位按键定时计数器高位
ANDIM SHOW_STATUS ,1110B ;清除显示状态寄存器
LDI AUTO_STATUS ,00H ;复位自动功能状态寄存器
LDI WRONG ,0010B
LDI BOIL_STATUS ,00H
LDI PLUSE_COUNTER ,00H
RTNI
;;*****************************************************
;初始化用户寄存器子函数1
;;*****************************************************
INI_CUS_REGISTER1:
RTNI
;;*****************************************************
;初始化动作:蜂鸣器长鸣一声
;;*****************************************************
INI_ACTION:
LDI PWM1 ,0011B ;开启蜂鸣器
ORIM BUZZER_STATUS ,0001B ;设置蜂鸣器处于鸣叫状态
LDI COUNTER_160MS ,08H ;复位160MS定时计数器
ANDIM BUZZER_STATUS ,1101B ;清除蜂鸣器鸣叫定时已到标志
ANDIM BUZZER_STATUS ,1101B ;清除蜂鸣器鸣叫150MS定时已到标志
LDA BUZZER_STATUS ,00H ;判断150MS蜂鸣器鸣叫定时是否已到
BA1 $+4 ;定时已到
CALL TIMER_DETECT
CALL TIME_SOURCE
JMP $-4 ;定时没到
ANDIM BUZZER_STATUS ,1101B ;清除蜂鸣器鸣叫150MS定时已到标志
LDA BUZZER_STATUS ,00H ;判断150MS蜂鸣器鸣叫定时是否已到
BA1 $+4 ;定时已到
CALL TIMER_DETECT
CALL TIME_SOURCE
JMP $-4 ;定时没到
LDI PWM1 ,0010B ;关闭蜂鸣器
RTNI
;;*****************************************************
;定时计数器复位子函数:程序在初始化的时候复位定时计数器
;;*****************************************************
TIMER_RESET:
LDI COUNTER_160MS ,08H ;复位160MS定时计数器
LDI COUNTER_100MS ,05H ;复位100MS定时计数器
LDI COUNTER_500MS ,05H ;复位500MS定时计数器
LDI COUNTER_1S ,0AH ;复位1S定时计数器
LDI COUNTER_3S_L ,05H ;复位3S定时计数器低位
LDI COUNTER_3S_H ,06H ;复位3S定时计数器高位
LDI COUNTER_5S ,05H ;复位5S定时计数器
LDI COUNTER_5S_B ,05H ;复位5S定时备份计数器
LDI COUNTER_30S ,06H ;复位30S定时计数器
LDI COUNTER_1M ,0CH ;复位1M定时计数器
LDI COUNTER_1M_B ,0CH
LDI COUNTER_2M_L ,04H ;复位2M定时计数器低位
LDI COUNTER_2M_H ,06H ;复位2M定时计数器高位
LDI COUNTER_2H_L ,0FH ;复位2H定时计数器低位
LDI COUNTER_2H_H ,08H ;复位2H定时计数器高位
RTNI
;;*****************************************************
;初始化T0子函数:TIMER0计数器配置成为外部计数器,只要外部
;出现一个脉冲,就进入中断
;;*****************************************************
INI_TIMER0:
LDI TL0 ,0FH
LDI TH0 ,0FH
LDI TM0 ,07H
LDI T0SE ,03H ;选择外部时钟源
RTNI
;;*****************************************************
;定时器0中断子程序:用于纪录在检测无锅
;时候出现的脉冲次数
;;*****************************************************
TIMER0:
STA T0_INI_BAK ,01H
ADIM PLUSE_COUNTER ,01H ;脉冲计数器+1
BNZ $+2 ;脉冲计数器不等于0
LDI PLUSE_COUNTER ,0FH ;脉冲计数器等于0,那么脉冲计数器=0FH
LDI IRQ ,00H
LDI IE ,0100B ;开启T0中断
LDA T0_INI_BAK ,01H
RTNI
;;*****************************************************
;定时时钟源:这是采用的市电50Hz作为定时
;时钟源,每隔20MS出现一次中断,并且这个
;地方也是过零点
;;*****************************************************
TIME_SOURCE:
LDA SHOW_STATUS ,00H
BA2 $+2
RTNI
ANDIM SHOW_STATUS ,1011B
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
;过零处理:
;滤波结束,程序能够执行到这个地方说明是出现了正确的时钟
;信号.注意:出现时钟信号的同时也是系统过零的时候
;+++++++++++++++++++++++++++++++++++++++++++++++++++++
LDA PWM_STATUS ,00H ;判断是否需要过零检测
BA2 $+2 ;需要过零检测
JMP NOZERO ;不需要过零检测
ANDIM PWM_STATUS ,1011B ;清除需要过零检测标志
SBI HEAT_POINT ,01H ;检测是否是第一档火力
BAZ ZERO_1 ;是处于第一档火力
LDI PD0H ,01H
LDI PD0M ,0AH
LDI PD0L ,00H ;初始化软启动开始的时
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -