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

📄 weide_timer1.asm

📁 威迪家电控制电路
💻 ASM
字号:
;File Name: weide_timer.asm
;Customer: WeiDe
;Editer: Jared Wu
;update date: 1-10-1 23:07
;主要功能
;1,预热7分钟 
;2,在预热时,检测到泡沫进入打浆
;3,电机工作ON/OFF 18s/10s
;4,泡沫触发进入延煮7分钟,1,不挂泡,ON/OFF 4S/10S
;			  2,挂泡,ON/OFF 2S/10S
;5,结束报警1min
;6,保温30min ON/OFF 2S/20S buz 2 short
;7, 改进1:打浆之后,禁止10秒不动作。
;	   蜂鸣器声音间隔加长。
;8, 改进声音:	1,报警长鸣  1-10-25 11:12
;		2,间隔为响0.5秒,停0.5秒	
;		3,上电不响
;9,报警指示灯不闪烁	1-10-25 11:13

 
;function: 1 key --- auto key
;	   1 led --- heat_led
;		 --- power_led
;       
;		  ___   ___
;		1|   \_/   |
;		-|PA3	PA4|-HEAT_LED
;		-|PA2	PA5|-AUTO_KEY
;		-|PA1	PA6|-POWER_OUT
;		-|PA0	PA7|-H/M_OUT, 1-M,0-H
;	TEST	-|PB2	OS2|-
;	BUZ1	-|PB1	OS1|-
;	BUZ0	-|PB0	VDD|-
;		-|VSS	RES|-
;	WATER_L	-|PC0	PC1|-WATER_H
;		 |_________|
;
;----------------------------------------------------------------------
include ht48R05a-1.inc

;----------------------------------------------------------------------
STAT_STANDY	EQU	00H
STAT_PRE_HEAT	EQU	01H
STAT_MOTOR	EQU	02H
STAT_RE_HEAT	EQU	03H
STAT_WARM	EQU	04h
STAT_END	EQU	05H
STAT_WARNING	EQU	06H
STAT_CHECK	EQU	07H


BUZ_S		EQU	25
BUZ_FRE		EQU	235
BUZON		EQU	10110100b
BUZOFF		EQU	10100100b


PRE_HEAT_MAX	EQU	7		;test!!!!!! 7min
MOTOR_TIME_MAX	EQU	4
MOTOR_OFF_TIME	EQU	28
MOTOR_ON_TIME	EQU	18
TEMP_H_COUNT_MAX	EQU	5
W1S_COUNT_MAX	EQU	50
RE_HEAT_MAX	EQU	7		;test!!!!!  7min
CHECK_KEY_DB	EQU	100


;------------------------------------------------------------------------
;PA pin define
hm_out		equ	7	;out
power_out	equ	6	;out
auto		equ	5	;out
heat		equ	4	;out

;------------------------------------------------------------------------
;PB pin define

;------------------------------------------------------------------------
;PC pin define
water_h		equ	1
water_l		equ	0


;----key flag define---------------------------------------------------
no_key		equ	7
auto_1		equ	6
auto_ok		equ	5

;----------flag-----------------
h_disable	equ	7
w1s		equ	6
slow_heat	equ	5
heat_stop	equ	4
hm_start	equ	3
hm_end		equ	2
water_low	equ	1
slow_h		equ	0

;--------buzer----
buz_long	equ	7	;define bit
;buz_warning	equ	6
music		equ	5
music_repeat	equ	4

;------------------------------------------------------------------------
data		.section	'data'
set_status	db	?
wk_status	db	?
wk_stat_bak	db	?
w1s_count	db	?	;wait 1s count 
motor_count	db	?	;motor run count 0~30s +1	;needs ini
motor_time	db	?	;motor run/stop time 4 -1	;needs ini
heat1_count	db	?
heat2_count	db	?
count1		db	?
count2		db	?
flag		db	?
key		db	?
pa_out		db	?
pa_delay	db	?
led_count	db	?
water_normal_c	db	?

buzer		db	?

buz_count	db	?
buz_s_time	db	?
buz_s_bak	db	?

slow_l		db	?
slow_heat_count	db	?	;needs ini
out_delay_count	db	?

warm_count	db	?
warm_time	db	?

;----------------------------------------------------------------------------
wcode	.section 'code'
	org	00h
	sz	TO		;判断是否是上电复位
	jmp	main		;TO=1, watchdog time out

power_on_reset:	
	call	ram_ini
;	mov	a,1
;	mov	buz_s_time,a
	jmp	main


set_warning:
	mov	buz_s_bak,a
	mov	a,wk_status
	mov	wk_stat_bak,a
	mov	a,STAT_WARNING
	mov	wk_status,a
	ret
main:
	clr	wdt	
	
	call	output_con
	call	wait_1s
	call	key_scan
	call	led_con
	call	buz_con
	;call	wendu
	;sz	acc
	;jmp	temp_err_warning
	;clr	temp_err_count
	;call	get_wendu
	;call	div
	
	set	pa.3
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	clr	pa.3
	
	mov	a,20
	call	delay
	
wk_work:	
	
	sza	wk_status
	jmp	wk_work_0
	jmp	wk_standy	;stand_by
wk_work_0:	
	sdz	acc
	jmp	wk_work_1
	jmp	wk_pre_heat	;pre_heat
wk_work_1:
	sdz	acc
	jmp	wk_work_2
	jmp	wk_motor	;motor
wk_work_2:		
	sdz	acc
	jmp	wk_work_3
	jmp	wk_re_heat	;heat again
wk_work_3:	
	sdz	acc
	jmp	wk_work_31
	jmp	wk_warm		;hold warm
wk_work_31:	
	sdz	acc
	jmp	wk_work_4
	jmp	wk_end		;end
wk_work_4:	
	sdz	acc
	jmp	wk_work_5
	jmp	wk_warning	;warning
wk_work_5:	
	sdz	acc
	jmp	power_on_reset
	jmp	wk_check	;check itself
	

;led con
;set_status	auto	heat_led
;
;	0	off	off
;	1	on	off
;	3	off	on
;warning	flash	flash

led_con:
	inc	led_count
	clr	pa_out.heat
;	mov	a,wk_status
;	sub	a,STAT_WARNING
;	sz	z
;	jmp	led_warning
	snz	pa_out.power_out
	ret
	snz	pa_out.hm_out
	set	pa_out.heat
	ret

;led_warning:
;	sz	led_count.5
;	ret
;	set	pa_out.auto
;	set	pa_out.heat
;	ret

;**启动键处理子程序**************
;in stand-by mode, start key con
start_key_con:
	sz	key.auto_ok
	jmp	set_auto_pro
;	sz	key.heat_ok
;	jmp	set_heat_pro
	ret
	
set_auto_pro:
	clr	key.auto_ok
	mov	a,1
	mov	buz_s_time,a
	mov	a,1
	mov	set_status,a
	
	mov	a,STAT_PRE_HEAT
set_status_end:
	mov	wk_status,a
	clr	buz_count
	clr	out_delay_count
	clr	motor_count
	clr	flag
	mov	a,W1S_COUNT_MAX
	mov	w1s_count,a	
	mov	a,MOTOR_TIME_MAX	;motor run 4 time
	mov	motor_time,a
	ret

;set_heat_pro:
;	clr	key.heat_ok
;	mov	a,2
;	mov	set_status,a
;	mov	a,STAT_RE_HEAT
;	jmp	set_status_end
;

;***停止键处理子程序******
;stop_key_con:
;	sz	key.auto_ok
;	jmp	auto_stop_con
;	sz	key.heat_ok
;	jmp	heat_stop_con
;	ret
;	
;auto_stop_con:
;	clr	key.auto_ok
;	mov	a,set_status
;stop_key_pd:	
;	sub	a,1
;	sz	acc
;	ret
;	jmp	key_stop_con
;
;heat_stop_con:
;	clr	key.heat_ok
;	mov	a,set_status
;	dec	acc
;	jmp	stop_key_pd
;	
;key_stop_con:
;	clr	set_status
;	clr	acc
;	jmp	set_status_end


		
;**待机处理模块*************************************************
wk_standy:
	call	start_key_con
	clr	out_delay_count
off_ret:	
heat_off_ret:
	clr	pa_out.power_out
	clr	pa_out.hm_out
	jmp	main_ret
	
	
;****预加热模块********************************************
wk_pre_heat:
	;call	stop_key_con
	sz	pc.water_l
	jmp	water_too_low
	snz	pc.water_h
	jmp	water_over_high
water_normal:
	
	;sz	div_res_h
	;jmp	water_heat_1
	;mov	a,div_res
	;sub	a,TEMPER_80	;temper >80C ?
	;sz	c
	;jmp	water_heat_1
	;sdz	temper_h_count
	snz	flag.w1s
	jmp	heat_on_ret
	inc	heat1_count
	mov	a,heat1_count
	sub	a,60
	snz	c
	jmp	heat_on_ret
	clr	heat1_count	; 1 Mintue
	
	inc	heat2_count
	mov	a,heat2_count
	sub	a,PRE_HEAT_MAX
	snz	c
	jmp	heat_on_ret
	clr	heat2_count

set_motor_status:
	mov	a,STAT_MOTOR
	call	set_status_end
	jmp	heat_off_ret	
	
heat_on_ret:	
	set	pa_out.power_out
	clr	pa_out.hm_out
	jmp	main_ret

water_too_low:
	mov	a,1
	call	delay
	snz	pc.water_l
	jmp	main_ret	;double check water low
	set	flag.water_low
	mov	a,2
	jmp	water_warning	;sencond OTP error in here.
	
water_over_high:
	mov	a,1
	call	delay		;delay 1ms
	sz	pc.water_h
	jmp	water_normal
	jmp	set_motor_status
	
	
water_warning:	
	call	set_warning
	jmp	main_ret
	

;****电机打浆模块***************************************
wk_motor:
	;call	stop_key_con
	sz	pc.water_l
	jmp	water_too_low
	;snz	pc.water_h
	;jmp	water_too_high

	
	snz	flag.w1s
	jmp	main_ret
	
	sz	flag.hm_end
	jmp	wk_motor_end
	sz	flag.hm_start
	jmp	wk_motor_1
	set	flag.hm_start
motor_off_ret:
	set	pa_out.hm_out
	clr	pa_out.power_out
	jmp	main_ret

wk_motor_1:
	inc	motor_count		;1S 计数器
	mov	a,motor_count
	sub	a,MOTOR_ON_TIME
	sz	c
	jmp	motor_off_con_p
motor_on_ret:
	set	pa_out.hm_out
	set	pa_out.power_out
	jmp	main_ret
	
motor_off_con_p:
	mov	a,motor_count
	sub	a,MOTOR_OFF_TIME
	snz	c		;skip if a>off_time
	jmp	motor_off_ret
	clr	motor_count
	
	sdz	motor_time	;判断打浆4次到?
	jmp	main_ret
	
	set	flag.hm_end
	jmp	off_ret

wk_motor_end:				
	mov	a,STAT_RE_HEAT
	call	set_status_end
	set	flag.h_disable
	
;	mov	wk_status,a
;	clr	flag.hm_start
;	clr	flag.hm_end
	;mov	a,RE_HEAT_TIME_MAX	;heat again ? time
	;mov	re_heat_time,a
	jmp	off_ret


;****再加热模块**********************************************
wk_re_heat:
	;call	stop_key_con
wk_re_heat_1:
	sz	pc.water_l
	jmp	water_too_low
	sz	flag.h_disable
	jmp	heat_disable
wk_re_heat_2:
	sz	flag.slow_heat
	jmp	slow_heat_pro

fast_heat:
	;sz	div_res_h
	;jmp	fast_heat_1
	;mov	a,div_res
	;sub	a,TEMPER_98	;temper >98C ?
	;sz	c
	;jmp	fast_heat_2
	;sz	flag.w1s	;1 second?
	;inc	t98_count
	;mov	a,t98_count
	;sub	a,180		;T>98C, and time > 3Min
	;sz	c
	;jmp	set_re_heat_end
	sz	pc.water_h
	jmp	heat_on_ret
	jmp	set_slow_heat

fast_heat_1:
	jmp	heat_on_ret

;fast_heat_2:
;	mov	a,div_res
;	sub	a,TEMPER_85
;	sz	c
;	jmp	fast_heat_1	;>85C, skip
;	clr	t98_count
;	sz	pc.water_h
;	jmp	heat_on_ret	;无泡沫,继续加热

set_slow_heat:
	set	flag.slow_heat	;设置延煮状态标志
	set	flag.heat_stop
	clr	slow_l
	clr	flag.slow_h
	clr	slow_heat_count
	jmp	heat_off_ret
	
slow_heat_pro:
	snz	flag.w1s	
	jmp	main_ret
	
	inc	heat1_count	;延煮状态,慢加热7分钟
	mov	a,heat1_count
	sub	a,60
	snz	c
	jmp	slow_heat_1
	clr	heat1_count	; 1 Mintue
	
	inc	heat2_count
	mov	a,heat2_count
	sub	a,RE_HEAT_MAX
	snz	c
	jmp	slow_heat_1
	clr	heat2_count
	jmp	set_re_heat_end

slow_heat_1:
	sz	flag.heat_stop
	jmp	slow_stop
;solw heat on	
	inc	slow_heat_count
	mov	a,slow_heat_count
	snz	pc.water_h
	jmp	slow_no_over
	sub	a,4		;无挂泡,开4秒
	jmp	slow_on
slow_no_over:
	sub	a,2		;有挂泡,开2秒   
slow_on:
	sz	c
	jmp	set_heat_stop
	jmp	heat_on_ret
	
set_heat_stop:
	set	flag.heat_stop
	clr	slow_heat_count
	jmp	heat_off_ret
	
slow_stop:
	;sz	flag.w1s	;1秒到?
	inc	slow_heat_count
	mov	a,slow_heat_count	;加热器关10秒
	sub	a,10
	sz	c
	jmp	clr_heat_stop
	jmp	heat_off_ret

clr_heat_stop:
	clr	flag.heat_stop
	clr	slow_heat_count
	jmp	heat_on_ret
	
set_re_heat_end:			;到这里,豆浆制作全部结束,进入保温程序
	mov	a,STAT_WARM
	call	set_status_end
	mov	a,60
	mov	buz_s_time,a
	;mov	a,1
	;mov	buz_s_time,a
	;set	buzer.music
	clr	buz_count
	clr	set_status
;	set	buzer.sp_repeat
	;mov	a,60
	;mov	music_repeat_count,a
	jmp	off_ret
	
heat_disable:
	snz	flag.w1s	
	jmp	main_ret
	inc	slow_heat_count
	mov	a,slow_heat_count	;加热器关10秒
	sub	a,10
	sz	c
	jmp	clr_heat_disable
	jmp	heat_off_ret

clr_heat_disable:
	clr	flag.h_disable
	clr	slow_heat_count
	jmp	wk_re_heat_2
	

;****************hold warm*********************8
wk_warm:
	snz	flag.w1s
	jmp	main_ret
	inc	warm_count
	mov	a,warm_count
	sub	a,22
	sz	c
	jmp	clr_warm_count
	mov	a,warm_count
	sub	a,3
	sz	c
	jmp	heat_off_ret
	
	sz	buz_s_time
	jmp	heat_on_ret
	mov	a,2
	mov	buz_s_time,a
	jmp	heat_on_ret
clr_warm_count:
	clr	warm_count
	inc	warm_time
	mov	a,warm_time	;81*22s=30Min
	sub	a,81
	sz	c
	jmp	set_all_end
	jmp	main_ret

set_all_end:
	mov	a,STAT_END
	call	set_status_end
	jmp	main_ret
	



;*********  waiting 1 second *****************************
wait_1s:
	clr	flag.w1s
	sdz	w1s_count		;假设20MS调用一次
	ret
	mov	a,W1S_COUNT_MAX
	mov	w1s_count,a
	set	flag.w1s
	ret

;***正常结束***************************************************
wk_end:
	;mov	a,2
	;mov	buz_s_time,a
	;snz	flag.w1s
	;jmp	off_ret
	;sdz	music_repeat_count
	jmp	off_ret
	;clr	buzer.music_repeat
	;jmp	off_ret
	;jmp	main_ret



;***出错处理模块************************************************	

wk_warning:
	snz	flag.water_low
	jmp	off_ret
	sz	pc.water_l
	jmp	water_low_1	;
	inc	water_normal_c
	mov	a,water_normal_c
	sub	a,40
	sz	c
	jmp	water_normal_1
	clr	buzer.buz_long
	;clr	buzer.buz_warning
	jmp	off_ret
water_low_1:
	set	buzer.buz_long
	;set	buzer.buz_warning
	jmp	off_ret
	
water_normal_1:
	clr	water_normal_c
	clr	flag.water_low
	clr	buzer.buz_long
	;clr	buzer.buz_warning
;	mov	a,2
;	mov	buz_s_time,a
	clr	buz_count	
	mov	a,wk_stat_bak
	mov	wk_status,a
	jmp	off_ret
	
	
main_ret:
	jmp	main

	
;*****自检处理模块************************************************
wk_check:
		
	jmp	off_ret



;上电初始化RAM子程序**********************************************
ram_ini:
	clr	intc
	
	mov	a,BUZOFF
	mov	tmrc,a
	
	clr	acc
	mov	tmr,a
	
	clr	tmr
		
	mov	a,00100000b
	mov	pac,a
	
	clr	pbc
	
	mov	a,03h		;water high/low check
	mov	pcc,a
	
	clr	pa
	;clr	pb
	clr	pc
	
	clr	set_status
	
	;mov	a,4
	;mov	wk_status,a
	clr	wk_status
	clr	wk_stat_bak
	
	mov	a,W1S_COUNT_MAX
	mov	w1s_count,a
	
	clr	motor_count
	
	mov	a,MOTOR_TIME_MAX
	mov	motor_time,a
	
	clr	heat1_count
	clr	heat2_count
	
	clr	count1
	clr	count2
	
	clr	flag
	clr	key
	
	clr	pa_out
	clr	pa_delay
	
	clr	led_count
	clr	water_normal_c
	
	clr	buzer
	clr	buz_count
	clr	buz_s_time
	clr	buz_s_bak
	
	clr	slow_l
	;clr	pb_out
	clr	slow_heat_count
	clr	out_delay_count
		
	clr	warm_time
	clr	warm_count
		
	mov	a,7
	mov	wdts,a
	ret
	
;*****************************************************************
;output_con
;main function: when heat output change (0->1) delay 0.5s output

output_con:
	mov	a,00100000b
	mov	pac,a
	
	mov	a,pa_out
	mov	pa_delay,a
	
	mov	a,out_delay_count
	sub	a,30
	snz	c
	jmp	heat_out_disable

output_c1:
	mov	a,pa_delay
	mov	pa,a
	
	clr	pbc
	;mov	a,pb_out
	;mov	PB,A
	
	set	pcc.water_h
	set	pcc.water_l
	ret 

heat_out_disable:
	inc	out_delay_count
	clr	pa_delay.power_out
	clr	pa_delay.hm_out
	jmp	output_c1


;*****************************************************************
;name: 按键扫描子程序
;input:
;利用led显示输出管脚切换到输入模式交替扫描得到按键值
;sourse: status flag bit: auto,heat, pin define bit
;        key.no_key, heat_1,heat_ok, auto_1,auto_ok.

key_scan:
	
	snz	pa.auto
	jmp	key_auto_push
no_key_push:
	
	set	key.no_key
	clr	key.auto_1
	ret
	
key_auto_push:
	sz	key.auto_1
	jmp	auto_key_pd
	sz	key.no_key
	jmp	auto_key_pd
	ret
	
auto_key_pd:
	clr	key.no_key
	sz	key.auto_1
	jmp	auto_key_ok
	set	key.auto_1
	ret
	
auto_key_ok:
	set	key.auto_ok
	ret	

	
;*****************************************************************
;name: 延时子程序
;input: ACC=需要延时的时间值(ms) @ 4MHz
delay:
	mov	count2,a
delay_st:
	mov	a,230
	mov	count1,a
delay_loop:
	sdz	count1
	jmp	delay_loop
	mov	a,100
	mov	count1,a
delay_loop1:
	sdz	count1
	jmp	delay_loop1
	sdz	count2
	jmp	delay_st
	ret

;*****************************************************************
;name: 蜂鸣器处理子程序
;input: buz_s_time 蜂鸣器短鸣次数寄存器
;	BUZ_S
;	buzer.buz_long 蜂鸣器长鸣标志
buz_con:
	inc	buz_count
	sz	buz_s_time
	jmp	buz_short
	sz	buzer.buz_long
	jmp	buz_on
	mov	a,BUZOFF
	mov	tmrc,a
	clr	buz_count
	ret
buz_short:
	mov	a,buz_count
	sub	a,BUZ_S
	sz	c
	jmp	buz_short_off_p
buz_on:	
	mov	a,BUZ_FRE
	mov	tmr,a
	mov	a,BUZON
	mov	tmrc,a	
	ret
	
buz_short_off_p:
	mov	a,buz_count
	sub	a,BUZ_S*2
	sz	c
	jmp	buz_short_off
buz_off:	
	mov	a,BUZOFF
	mov	tmrc,a
	
	ret
buz_short_off:
	clr	buz_count
	dec	buz_s_time
	ret

⌨️ 快捷键说明

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