; 说明:
; 开机LED移动速度为500MS,通过按键修改,时间范围在100MS~2500MS之间,
; 启动开关控制LED启停,低运行,高暂停
; 报警输出高电平有效
; 按键修改LED时间,在100MS~2500MS之间,按键按下低电平有效,每按下一次时间增加10MS
$include (reg52.inc)
gpio_led1 equ p1.0
gpio_led2 equ p1.1
gpio_led3 equ p1.2
gpio_led4 equ p1.3
gpio_led5 equ p1.4
gpio_led6 equ p1.5
gpio_led7 equ p1.6
gpio_start equ p3.4
gpio_alarm_in equ p3.3
gpio_alarm_out equ p3.7
gpio_key1 equ p1.7
bseg at 0
flag_10ms:
dbit 1
flag_led:
dbit 1
dseg at 030h
led_peroid:
ds 1
const_led_peroid:
ds 1
key_number:
ds 1
key_delay:
ds 1
cseg at 0
jmp start
cseg at 00bh
jmp isr_t0
start:
call sys_init
;_______________
;主循环开始
loop:
jnb flag_10ms,$
call sys_led
call sys_alarm
call sys_key
clr flag_10ms
clr flag_led
jmp loop
;__________________________
; 初始化
;__________________________
sys_init:
mov sp,#07fh-32
clr gpio_led1
setb gpio_led2
setb gpio_led3
setb gpio_led4
setb gpio_led5
setb gpio_led6
setb gpio_led7
clr flag_10ms
clr flag_led
clr a
mov led_peroid,a
mov key_number,a
mov key_delay,a
mov a,#50 ; 修改数值,改变LED速度,50=500MS(*10MS)
mov const_led_peroid,a
mov tmod,#010h
mov tl0,#0f0h ; 65536-10000,10MS
mov th0,#0d8h ; 65536-10000,10MS
setb et0
setb tr0
setb ea
ret
;__________________________
; 按键
;__________________________
sys_key:
clr a
mov key_number
jnb gpio_key1,sys_key_00
mov key_delay,a
ret
sys_key_00:
mov a,key_delay
clr c
subb a,#100
jnc sys_key_01
inc key_delay
sys_key_01:
mov a,key_delay
xrl a,#3
jnz sys_key_02
orl key_number,#1
;___________________
;处理按键
inc const_led_peroid
mov a,const_led_peroid
xrl a,#250
jnz sys_key_02
mov const_led_peroid,#10
ret
sys_key_02:
ret
;__________________________
; 报警
;__________________________
sys_alarm:
;______________________________________________________________
3.3为外部故障输入模拟开关,低电平报警,P1.7为报警输出,
mov c,gpio_alarm_in
cpl c
mov gpio_alarm_out,c ; 报警输出,高电平有效
ret
;__________________________
; LED
;__________________________
sys_led:
;___________________
;每500MS循环处理灯
jnb gpio_start,label_00 ; 低电平启动
label_000:
ret
label_00:
jnb flag_led,label_000
jb gpio_led1,label_01
setb gpio_led1
clr gpio_led2
ret
label_01:
jb gpio_led2,label_02
setb gpio_led2
clr gpio_led3
ret
label_02:
jb gpio_led3,label_03
setb gpio_led3
clr gpio_led4
ret
label_03:
jb gpio_led4,label_04
setb gpio_led4
clr gpio_led5
ret
label_04:
jb gpio_led5,label_05
setb gpio_led5
clr gpio_led6
ret
label_05:
jb gpio_led6,label_06
setb gpio_led6
clr gpio_led7
ret
label_06:
jb gpio_led7,label_07
setb gpio_led7
clr gpio_led1
ret
label_07:
clr gpio_led1
ret
;__________________________
; T0中断
;__________________________
isr_t0:
push psw
push acc
; clr tr0
mov tl0,#0f0h
mov th0,#0d8h
; setb tr0
setb flag_10ms
inc led_peroid
mov a,led_peroid
xrl a,const_led_peroid
jnz reti_t0
mov led_peroid,a
setb flag_led
reti_t0:
pop acc
pop psw
reti
end |