;K4设置完成
ACALL LED_BL //LED闪动 SETB TR0 //启动定时器 RET
///////////////延时子程序/////////////
//DELAY:MOV R5,#20 //延时0.5s的延时子程序;所输出的频率是下一个延时子程序的2倍;
//LAY2: MOV R6,#100 //LAY1: MOV R7,#100 // DJNZ R7,$ // DJNZ R6,LAY1 // DJNZ R5,LAY2 // RET
DELAY:
//延时时间是:2msX(R5)
MOV R6,#10 D1:MOV R7,#100 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,DELAY RET
//////////////工作指示灯////////////// LED_BL: MOV R4,#6 LE1:CPL WLED
MOV R5,#25 //延时50ms
15
//工作指示灯闪烁
ACALL DELAY DJNZ R4,LE1 RET
/////////////计数单元清0子程序////////////// INIT:
MOV DEDA,#0 MOV SEC,#0 MOV MIN,#9 MOV HOUR,#8 RET
/////////////////蜂鸣器////////////////// BZ:MOV R6,#250 //使蜂鸣器响一声 B1:ACALL DEX CPL SPK DJNZ R6,B1 MOV R5,#50 ; CLR P2.2 ;CLR P2.3 ACALL DELAY RET
////////////蜂鸣器短暂延时子程序////////// DEX:MOV R7,#180 DE1:NOP
DJNZ R7,DE1 RET
/////////////加载打铃时间子程序////////////// CONVA: MOV A,HH MOV B,#10 DIV AB
//将HOUR内的值转换为十位和个位分别表示的十进制数字,便于用两位
16
数码管显示出来小时值
MOV DPTR,#TABLE //DPTR指针指向表的首地址 MOVC A,@A+DPTR MOV BUF,A MOV A,B MOVC A,@A+DPTR MOV BUF+1,A MOV A,MM MOV B,#10 DIV AB
MOV DPTR,#TABLE MOVC A,@A+DPTR MOV BUF+2,A MOV A,B MOVC A,@A+DPTR MOV BUF+3,A RET
//开始转换分钟
////////////设置打铃时间子程序////////////////// SET_ATIME: ACALL CONVA NO: ACALL DISP ;K2调整小时 JB K2,N1 JNB K2,$ INC HH MOV A,HH CJNE A,#24,N11 MOV HH,#0 N11:
17
ACALL CONVA ACALL DISP JMP NO
;K3调整分钟时间 N1:JB K3,N2 JNB K3,$ INC MM MOV A,MM CJNE A,#60,N21 MOV MM,#0
N21:ACALL CONVA //加载打铃时间数据 ACALL DISP
JMP NO
;K4设置完成 N2:JB K1,NO JNB K1,$ ;设置完成 ACALL LED_BL
ACALL CONV //加载现在时间数据 CPL ALB
//此处为判断是否启用闹铃
JNB ALB,M31 ACALL BZ ACALL BZ ACALL BZ JMP LOOP M31:
ACALL BZ //闹铃停止,发出一声 JMP LOOP RET
//////////////执行闹铃时间处理子程序//////////////
18
//连鸣三声为启用闹铃
TIME_OUT: X1:ACALL LED_BL ACALL BZ
JB K4,X1 JNB K4,$ ACALL LED_BL
CLR ALB //清除闹铃位 RET
////////////检查打铃时间子程序//////////////// TIME_PRO: JB ALB,TI3
RET
TI3: MOV A,HOUR MOV B,HH CJNE A,B,BK
MOV A,MIN MOV B,MM CJNE A,B,BK
ACALL TIME_OUT //执行检查时间处理 BK: RET TAL:
DB 0C6H,80H,90H,88H,83H TAL1: DB 0F9H END
19