📄 weide_timer1.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 + -