相关程序
;程序功能:如题
;采用定时中断方式
;单片机平常处于“睡眠”(省电)状态
;单片机型号:89c51
;晶振频率:12mhz
m_time30 equ 7fh ;倒计时单元
m_time1 equ 7fh-1 ;1s计时单元
ledx_r bit p1.5
ledx_y bit p1.4
ledx_g bit p1.3
ledy_r bit p1.2
ledy_y bit p1.1
ledy_g bit p1.0
org 0 ;复位入口,所有灯均为“灭”
sjmp main ;转至main
org 0bh ;定时器0中断入口
ljmp timer0 ;转至timer0
org 30h
main: mov tmod,#1 ;设定时器0工作方式1:16位计时器方式
mov th0,#3ch ;置50ms定时器定时初值
mov tl0,#0b0h ;置50ms定时器定时初值
mov r0,#10 ;r0做定时累计单元,10*50ms=0.5s
setb et0 ;允许定时器0中断
setb ea ;总中断允许
mov m_time1,#20 ;1s计时单元置初值:20*50ms=1s
mov m_time30,#30h ;倒计时单元置初值:30秒
lcall dsp_time ;调用倒计时显示输出子程序
clr ledx_g ;“亮”x向绿灯
clr ledy_r ;“亮”y向红灯
setb tr0 ;启动定时器0
sleep_loop: orl pcon,#1 ;进入省电方式
sjmp sleep_loop ;转至sleep_loop重新进入省电方式
timer0: orl tl0,#0b0h ;重置50ms定时器定时初值
mov th0,#3ch ;重置50ms定时器定时初值
djnz m_time1,timer0_1;1s计时单元减1不为零转至timer0_1返回中断
mov m_time1,#20 ;1s计时单元减1为零重置初值
mov a,m_time30 ;倒计时单元减1
add a,#99h
da a
mov m_time30,a
jnz timer0_2 ;倒计时单元不为零转至timer0_2
;倒计时单元等于零时的处理程序
setb ledx_y ;“灭”黄灯
setb ledy_y ;“灭”黄灯
mov c,ledx_g ;以当前x方向绿灯状态作为参考
mov ledx_r,c ;改变x向红灯
mov ledy_g,c ;改变y向绿灯
cpl c
mov ledx_g,c ;改变x向绿灯
mov ledy_r,c ;改变y向红灯
mov m_time30,#30h ;重置倒计时单元初值:30秒
timer0_0: lcall dsp_time ;调用倒计时显示输出子程序
timer0_1: reti ;开中断返回
timer0_2: cjne a,#5,timer0_0 ;倒计时单元不等于5转至timer0_0
;倒计时单元等于5处理程序
clr ledx_y ;“亮”x向黄灯
clr ledy_y ;“亮”y象黄灯
sjmp timer0_0 ;转至timer0_0
;倒计时显示输出子程序
dsp_time: mov dptr,#dsp_lab ;取显示码表地址指针
mov a,m_time30 ;取倒计时高位显示码
swap a
anl a,#0fh
movc a,@a+dptr
mov p0,a ;倒计时高位显示码由p0输出
mov a,m_time30 ;取倒计时低位显示码
anl a,#0fh
movc a,@a+dptr
mov p2,a ;倒计时低位显示码由p2输出
ret ;子程序返回
dsp_lab:
;dpgfedcba
db 11000000b ;“0”显示码
db 11111001b ;“1”显示码
db 10100100b ;“2”显示码
db 10110000b ;“3”显示码
db 10011001b ;“4”显示码
db 10010011b ;“5”显示码
db 10000010b ;“6”显示码
db 11111000b ;“7”显示码
db 10000000b ;“8”显示码
db 10010000b ;“9”显示码