洗衣机程序
dspbuf equ 30h ;显示的值
count equ 41h ;显示的次数
k2 bit p1.0
org 0000h
ljmp main
org 0030h ;;;;;;;;;;;;
;;;;;子程序
delay:
mov r7, #10 ;延时10ms子程序 dly1:
mov r6, #50
djnz r6, $
djnz r7, dly1
ret
;;;不闪烁的显示子程序
display:
mov dptr, #tab
mov a, dspbuf
mov b, #10
div ab
xch a, b
anl a, #0fh
movc a,@a+dptr
mov p3, a
setb p1.4 ;熄灭数码管LED1
clr p1.5 ;点亮数码管LED2
lcall delay
mov a, dspbuf
mov b, #10
div ab
anl a, #0fh
movc a,@a+dptr
mov p3, a
setb p1.5 ;熄灭数码管LED2
clr p1.4 ;点亮数码管LED1
lcall delay
ret
;;0.5秒闪烁的显示程序
display2:
inc count
mov a, #25
clr c
subb a, count
jc dsp20
;;前面的25次要显示
mov dptr, #tab
mov a, dspbuf
mov b, #10
div ab
xch a, b
anl a, #0fh
movc a,@a+dptr
mov p3, a
setb p1.4 ;熄灭数码管LED1
clr p1.5 ;点亮数码管LED2
lcall delay
mov a, dspbuf
mov b, #10
div ab
anl a, #0fh
movc a,@a+dptr
mov p3, a
setb p1.5 ;熄灭数码管LED2
clr p1.4 ;点亮数码管LED1
lcall delay ;;;后面的25次不显示
dsp20:
mov dptr, #tab
mov a, dspbuf
mov b, #10
div ab
xch a, b
anl a, #0fh
movc a,@a+dptr
mov p3, a
setb p1.4 ;熄灭数码管LED1
setb p1.5 ;点亮数码管LED2
lcall delay
mov a, dspbuf
mov b, #10
div ab
anl a, #0fh
movc a,@a+dptr
mov p3, a
setb p1.5 ;熄灭数码管LED2
setb p1.4 ;点亮数码管LED1
lcall delay ;;判断有无到50次
mov a, #50
xrl a, cout
jnz dsp21
mov count , #00 dsp21:
ret
tab:
db 03h, 9fh, 25h
db 0dh, 99h, 59h
db 0c1h, 1fh, 01h
db 0bh
tab2:
db 0c0h, 0f9h, 0b4h
db 0b0h, 99h, 9ah
db 83h, 0f8h, 80h
db 50h
;鸣叫一下程序
play:
clr p1.7
;让LED亮200MS
mov r5, #10 lp2:
lcall display ;显示子程序
djnz r5, lp2
setb p1.7
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main:
mov sp, #50h
mov 30h, #00 ;显示00值
mov count, #00 ; mov dspbuf, 30h lp1:
lcall display ;显示子程序
jb k2, lp1
lcall display ;延时20MS去抖动
jb k2, lp1
;按键按下
key:
inc 30h
mov a, #0ah
xrl a, 30h
jnz key0
mov 30h, #01 key0:
mov dspbuf, 30h
lcall display ;显示子程序
lcall play ;鸣叫
;等待按键释放
lp3:
lcall display ;显示子程序
jnb k2, lp3
lcall display ;延时20MS去抖动
jnb k2, lp3 ;三秒判断
mov r5, #150 lp4:
lcall display ;延时20MS去抖动
jb k2, lp5
lcall display ;延时20MS去抖动
jb k2, lp5
sjmp key lp5:
djnz r5, lp4 ;鸣叫6下开始洗衣
mov r4, #6 lp8:
clr p1.7 ;让LED亮200MS
mov r5, #10 lp6:
lcall display ;显示子程序
djnz r5, lp6
setb p1.7 ;让LED灭200MS
mov r5, #10 lp7:
lcall display ;显示子程序
djnz r5, lp7
djnz r4, lp8 start:
mov 30, #42 ; mov dspbuf, 30h
clr p0.0 ;进水
mov r3, #2 lp12:
;;;一分钟
mov r2, #50 lp11:
mov r4, #60 lp10:
lcall display2
jnb p0.1, xidi ;水位满,结束进水
lcall ifpause ;判断是否暂停
djnz r4, lp10
djnz r2, lp11
dec 30h ;时间减一
mov dspbuf, 30h
djnz r3, lp12 ;2分钟没进满水,继续进水,时间不减 lp20:
lcall display2
jnb p0.1, xidi ;水位满,结束进水
jb k2, nopause2 ;有没有暂停按键
lcall pause nopause2:
sjmp lp20 ;;;;暂停处理子程序
ifpause:
jb k2, nopause1 ;有没有暂停按键
mov a, p0 ;保存现在的状态
push acc
mov p0, #0ffh ;关闭进水、正转、反转
lcall play paus2:
jb k2, paus1 ;等待按键释放
lcall display
sjmp paus2 paus1: ;等待重新启动
jnb k2, paus3
lcall display
sjmp paus1 paus3: ;重新启动按下
lcall play paus31:
jb k2, paus4
lcall display
sjmp paus31 ;等到重新启动的按键释放 paus4:
pop ACC ;恢复状态
mov p0, a nopause1:
ret
;电机正反转达洗衣
xidi:
setb p0.0
mov 30h, #40
mov r2, #15 ;15分钟
xidi12:
mov r3, #14 ;一分的次数 xidi10:
;;;花时4.32s
clr p0.4 ;正转1.6秒
mov r4, #80 xd01:
lcall display2
lcall ifpause ;判断有无暂停
djnz r4, xd01
setb p0.4
;暂停0.56秒
mov r4, #28 xd02:
lcall display2
lcall ifpause ;判断有无暂停
djnz r4, xd02
clr p0.6 ;反转1.6秒
mov r4, #80 xd03:
lcall display2
lcall ifpause ;判断有无暂停
djnz r4, xd03
setb p0.6
;暂停0.56秒
mov r4, #28 xd04:
lcall display2
lcall ifpause ;判断有无暂停
djnz r4, xd04
djnz r3, xidi10
dec 30h ;一分钟时间减一
djnz r2, xidi12 ;;;;;;
paishui:
mov 30h, #25
clr p0.2 ;打开排水阀
;;;排水D秒
mov r3, #01 ts2: ;;;;一秒
mov r4, #50 ts1:
lcall display2
lcall ifpause ;判断有无暂停
jnb p0.1, ts4 ;D秒内水位开关断开,排水正常
djnz r4, ts1 ;;;;有无60秒
inc r3
mov a, #60
xrl a, r3
jnz ts2
;;;;排水不畅报警
sjmp $
;;;排水D秒
ts4:
dec 30h
;;;;一秒
mov r4, #50 ts5:
lcall display2
lcall ifpause ;判断有无暂停
djnz r4, ts5
djnz r3, ts4 ;;;;继续排水T=60秒
mov r3, #60 ts6:
;;;;一秒
mov r4, #50 ts7:
lcall display2
lcall ifpause ;判断有无暂停
djnz r4, ts7
djnz r3, ts6
dec 30h
tuoshui:
mov 30h, #23
clr p0.4 ;电机正转脱水4秒
mov r3, #4 ts9:
;;;;一秒
mov r4, #50 ts8:
lcall display2
lcall ifpause ;判断有无暂停
djnz r4, ts8
djnz r3, ts9
setb p0.4 ;关闭电机正转脱水3秒
mov r3, #3 tss1:
;;;;一秒
mov r4, #50 tss2:
lcall display2
lcall ifpause ;判断有无暂停
djnz r4, tss2
djnz r3, tss1
clr p0.4 ;电机正转脱水三分钟
mov r3, #180 tss3:
;;;;一秒
mov r4, #50 tss4:
lcall display2
lcall ifpause ;判断有无暂停
djnz r4, tss4
djnz r3, tss3
ljmp main