51单片机倒计时报警器程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

K1 BIT P3.4 ;启动按键控制位
K2 BIT P3.5 ;秒钟控制位
K3 BIT P3.6 ;分钟控制位
K4 BIT P3.7 ;快速计时控制位
SEC EQU R0 ;进行宏定义
MIN EQU R1
HOUR EQU R2
MSEC EQU R3
MOV R4,#0 ;对R4进行赋初值0
ORG 00H
LJMP START ;上电,跳向主程序
ORG 0BH ;T0的中断入口
LJMP IT0P ;跳转到中端服务程序
ORG 0030H
START:
MOV DPTR,#TABLE
MOV SEC,#0 ;秒初始化
MOV MIN,#0 ;分初始化
MOV HOUR,#0 ;时初始化
MOV MSEC,#0 ;毫秒初始化
MOV TH0,#0DAH ;T0置初值
MOV TL0,#64H
MOV TMOD,#01H
SETB ET0 ;允许T0申请中断
SETB EA ;总中断允许
MOV P1,#0FEH ;P1口进行初始化
A1: LCALL DISPLAY1 ;调用显示程序1
JNB K1,S1 ;判断k1是否为0;为0则转移到s1程序
JNB K2,S2 ;判断k2是否为0;为0则转移到s2程序
JNB K3,S3 ;判断k3是否为0;为0则转移到s3程序
JNB K4,S4 ;判断k4是否为0;为0则转移到s4程序
LJMP A1 ;转移到A1
S1: LCALL DELAY; ;调用延时
JB K1,A1 ;k1为1则转移到A1
AK1:SETB TR0 ;启动T0
LJMP HERE; ;原地跳转
S2: LCALL DELAY ;调用延时
JB K2,A1 ;k2为1则转移到A1
AK2:INC SEC ;秒增1
CLR P2.3
MOV A,SEC
CJNE A,#60,J2 ;秒不满60跳转到J2
MOV SEC,#0 ;秒满60清0
LJMP J2;
J2: JB K2,A1; ;k2为1跳转到A1
LCALL DISPLAY1; ;调用显示程序1
LJMP J2;
S3: LCALL DELAY ;调用延时
JB K3,A1
AK3:INC MIN
CLR P2.3
MOV A,MIN;
CJNE A,#60,J3 ;分满60清0
MOV MIN,#0
LJMP J3
J3: JB K3,A1
LCALL DISPLAY1
LJMP J3
S4: LCALL DELAY
JB K4,A1
AK4:INC HOUR
CLR P2.3
MOV A,HOUR
CJNE A,#24,J4 ;时满24清0
MOV HOUR,#0
LJMP J4
J4: JB K4,A1
LCALL DISPLAY1
LJMP J4
HERE: MOV A,HOUR
JNZ DIS1
LCALL DISPLAY2 ;调用显示2
LJMP HERE
DIS1: LCALL DISPLAY1 ;调用显示1
LJMP HERE

;******************************************
;显示控制子程序
;当定时超过一小时时,数码管显示时-分-秒
DISPLAY1:
;显示秒
MOV A,SEC
MOV B,#10
DIV AB
CLR P2.7 ;段选寄存器使能端清零
MOV P0,#0EFH ;写入段选信号
SETB P2.7 ;锁存段选信号
CLR P2.7
CLR P2.6 ;位选寄存器使能端清零
MOVC A,@A+DPTR
MOV P0,A ;写入位选信号
SETB P2.6 ;锁存位选信号
LCALL DELAY
CLR P2.6
MOV A,B
CLR P2.7
MOV P0,#0DFH
SETB P2.7
CLR P2.7
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
LCALL DELAY
CLR P2.6
;显示分
MOV A,MIN
MOV B,#10
DIV AB
CLR P2.7
MOV P0,#0FBH
SETB P2.7
CLR P2.7
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
LCALL DELAY
CLR P2.6
MOV A,B
CLR P2.7
MOV P0,#0F7H
SETB P2.7
CLR

P2.7
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
LCALL DELAY
CLR P2.6
;显示小时
MOV A,HOUR
MOV B,#10
DIV AB
CLR P2.7
MOV P0,#0FEH
SETB P2.7
CLR P2.7
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
LCALL DELAY
CLR P2.6
MOV A,B
CLR P2.7
MOV P0,#0FDH
SETB P2.7
CLR P2.7
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
LCALL DELAY
CLR P2.6
SETB P2.3
RET
;当定时低于一小时时,数码管显示分-秒-毫秒
DISPLAY2:
;显示毫秒
MOV A,MSEC
MOV B,#10
DIV AB
CLR P2.7
MOV P0,#0EFH
SETB P2.7
CLR P2.7
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
LCALL DELAY
CLR P2.6
MOV A,B
CLR P2.7
MOV P0,#0DFH
SETB P2.7
CLR P2.7
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
LCALL DELAY
CLR P2.6
;显示秒
MOV A,SEC
MOV B,#10
DIV AB
CLR P2.7
MOV P0,#0FBH
SETB P2.7
CLR P2.7
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
LCALL DELAY
CLR P2.6
MOV A,B
CLR P2.7
MOV P0,#0F7H
SETB P2.7
CLR P2.7
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
LCALL DELAY
;显示分
MOV A,MIN
MOV B,#10
DIV AB
CLR P2.7
MOV P0,#0FEH
SETB P2.7
CLR P2.7
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
LCALL DELAY
CLR P2.6
MOV A,B
CLR P2.7
MOV P0,#0FDH
SETB P2.7
CLR P2.7
CLR P2.6
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
LCALL DELAY
CLR P2.6
SETB P2.3
RET
;*******************************************************************
;延时子程序,时间大约为
;*******************************************************************
DELAY: MOV R7,#5 ;延时
DEL1:MOV R6,#100
DEL2:DJNZ R6,DEL2
DJNZ R7,DEL1
RET

IT0P:CLR TR0 ;中断服务程序
MOV TH0,#0DAH
MOV TL0,#64H
LCALL CLOCK
SETB TR0
RETI
CLOCK: ;判断计时是否结束
MOV A,HOUR ;判断小时是否为零
JZ MM ; 为零则继续判断分钟
LJMP CLOCK2 ;不为零则继续计时
MM: MOV A,MIN ;判断分钟是否为零
JZ SS ; 为零则继续判断秒
CJNE A,#01,CLOCK2 ;判断分位是否为1,不为1则蜂鸣器流水灯工作在模式一
LJMP CLOCK3 ;判断分位是否为1,不为1则蜂鸣器流水灯工作在模式二

SS: MOV A,SEC ;判断秒是否为零
JZ SSE ;为零则继续判断毫秒
LJMP CLOCK3
SSE: MOV A,MSEC ;判断毫秒是否为零
JZ RUN ;为零则结束计时
LJMP CLOCK3 ;不为零则工作在模式二
CLOCK2:DEC MSEC ;毫秒减1,蜂鸣器流水灯模式一
MOV A,MSEC
CJNE A,#0FFH,LOOP ;判断毫秒减到0之后是否再减1
MOV MSEC,#99

;是,装入初值99

DEC SEC ;秒减1
MOV A,P1 ; 八个二极管灯以1秒为单位,循环右移
RL A;
CLR P2.3 ;蜂鸣器以秒为单位蜂鸣
MOV P1,A;
MOV A,SEC
CJNE A,#0FFH,LOOP ;判断秒减到0之后是否再减1
MOV SEC,#59 ;是,装入初值59

DEC MIN ;分减1
MOV A,MIN
CJNE A,#0FFH,LOOP ;判断分减到0之后是否再减1
MOV MIN,#59 ;是,装入初值59

DEC HOUR ;小时减1
MOV A,HOUR
CJNE A,#0FFH,LOOP ;判断分减到0之后是否再减1
MOV HOUR,#00 ;是,装入初值00

CLOCK3: ;蜂鸣器 流水灯模式二
DEC MSEC
INC R4
CJNE R4,#5,AA1 ;对时间判断,当R4=5时继续运行,R4=5时跳转,使二极管以0.05秒为单位循环右移
MOV A,P1
RL A
CLR P2.3
MOV P1,A;
MOV R4,#0 ;

AA1:
MOV A,MSEC ;判断毫秒减到0之后是否再减1
CJNE A,#0FFH,LOOP
MOV MSEC,#99 ;是,装入初值99


DEC SEC ;秒减1
MOV A,SEC
CJNE A,#0FFH,LOOP ;判断秒减到0之后是否再减1
MOV SEC,#59 ;是,装入初值59

DEC MIN ;分减1
MOV A,MIN
CJNE A,#0FFH,LOOP ;判断分减到0之后是否再减1
MOV MIN,#59 ;是,装入初值59

RUN:
CLR TR0
MOV MSEC,#0
MOV SEC,#0
MOV MIN,#0
MOV HOUR,#0
RUN2:LCALL DISPLAY1 ;计时结束蜂鸣器响,灯全亮
CLR P2.3
MOV P1,#00H
LJMP RUN2


LOOP:RETI ;中断返回

TABLE: DB 0EDH,48H,0F4H,0B5H,99H ;数码管显示表
DB 3DH,7DH,85H,0FDH,0BDH ,0DDH,79H, 6CH,0F1H,7CH,5CH
END

相关文档
最新文档