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

📄 induction_cooker_v41.asm

📁 中颖SH69P44开发的电磁炉原程序和线路图
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	
	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 + -