电子时钟 keil程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ORG 0000H
AJMP MAIN ;跳转到主程序MAIN执行
ORG 000BH
AJMP INTT0 ;跳到INTT0执行
ORG 001BH
LJMP INTT1 ;跳到INTT1执行
ORG 0300H
;************************主函数*******************************************
MAIN:MOV SP,#80H
MOV TMOD,#11H ;设置定时器T0、T1工作于方式1 //16位
MOV TH0,#3CH ;装入时钟定时初值(50ms)
MOV TL0,#0B0H
MOV TH1,#0D8H ;装入闹铃定时初值(10ms)
MOV TL1,#0F0H
MOV 20H,#00H
MOV 21H,#00H
MOV 22H,#09H ;预置时钟分分
MOV 23H,#00H ;预置时钟时时
MOV 51H,#00H
MOV 52H,#00H ;预置显示初始化
MOV 53H,#00H
MOV 54H,#00H
MOV 30H,#10H ;预置闹铃分分
MOV 31H,#00H ;预置闹铃时时
SETB P2.0 ;数码管接P2口,置位数码管,使其全灭
SETB P2.1
SETB P2.2
SETB P2.3
CLR P1.7 ;发光二极管LED7\LED8用于显示秒,清P1.7,发光二极管LED8亮
SETB P1.6 ;置位P1.6,发光二极管LED7灭
SETB EA ;开放总中断
SETB ET0 ;允许T0中断
SETB TR0 ;开启定时器T0
LOOP: LCALL DISPT ;调用时间显示子程序
LCALL RING ;调用闹铃处理子程序
LCALL KEY ;调用按键扫描子程序
JZ LOOP ;无键按下则循环
LCALL CASE ;有键按下则转按键处理子程序执行
SJMP LOOP ;循环
;************* *********T0一秒定时中断程序INTT0********************************
INTT0: PUSH PSW ;状态字入栈保护
PUSH ACC ;累加器入栈保护
MOV TL0,#0B0H ;装入计数初值,12MHZ晶振,形成1S中断
MOV TH0,#3CH
INC 20H ;//20H放中断次数
MOV A,20H
CJNE A,#20,RETURN
CPL P1.7 ;一秒到发光二极管轮流亮,用于显示秒
CPL P1.6
MOV 20H,#00H ;一秒到清20H
MOV A,21H
ADD A,#01H
DA A
MOV 21H,A
CJNE A,#60H,RETURN
MOV 21H,#00H ;一分到,21H单元清零
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,RETURN
MOV 22H,#00H ;一小时到,22H单元清零
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,RETURN
MOV 23H,#00H ;满24,23H单元清零
RETURN: POP ACC
POP PSW
RETI
;*************************时间显示子程序**************************************
DISPT: MOV A,22H
ANL A,#0FH
MOV 2AH,A ;时钟分的低位
MOV A,22H
ANL A,#0F0H
SWAP A
MOV 2BH,A ;时钟分的高位
MOV A,23H
ANL A,#0FH
MOV 2CH,A ;时钟时的低位
MOV A,23H
ANL A,#0F0H
SWAP A
MOV 2DH,A ;时钟时的高位
LED1: SETB P2.3
MOV A,2DH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.0 ;选通
数码管1
MOV P0,A ;显示时钟时的十位部分
LCALL DELAY
LED2: SETB P2.0
MOV A,2CH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.1 ;选通数码管2
MOV P0,A ;显示时钟时的个位部分
LCALL DELAY
LED3: SETB P2.1
MOV A,2BH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.2 ;选通数码管3
MOV P0,A ;显示时钟分的十位部分
LCALL DELAY
LED4: SETB P2.2
MOV A,2AH
JB P1.7,TA2 ;P1.7为1转移
TA1: ADD A,#10 ;用于利用数码管的小数点来表示秒
TA2: MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.3 ;选通数码管4
MOV P0,A ;显示时钟分的个位部分
LCALL DELAY
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;共阳数码管的不带小数点的时间显示码
DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H;共阳数码管的带小数点的时间显示码
;*****************************************按键扫描程序********************
KEY: MOV P3,#0FFH ;准双向口读之前先写入高电平
MOV A,P3
CPL A
ANL A,#3CH
JZ RETK ;无键按下则返回
LCALL DELAY ;延时消抖
MOV A,P3
CPL A
ANL A,#3CH
JZ RETK ;键盘去抖动
MOV R6,A ;将键值存入R6
LOOP1: LCALL DISPT;
MOV A,P3
CPL A
ANL A,#3CH
JNZ LOOP1 ;等待键释放
MOV A,R6
RETK: RET
;***************************按键处理子程序**********************************
CASE: MOV A,R6
CLR P1.0 ;发光二极管LED1亮
JB ACC.2,SETH ;转调整时
JB ACC.3,SETM ;转调整分
JB ACC.5,SETR ;转闹铃设置
JB ACC.4,MB1 ;转秒表子程序
WAITCASE:LCALL DISPT ;无键按下时等待
LCALL KEY
JZ WAITCASE
;**********************时间调整程序*************************************
SETT: LCALL DISPT
LCALL KEY
JZ SETT
MOV A,R6
JB ACC.2,SETH
JB ACC.3,SETM
JB ACC.5,KEYGO ;第二次按为确认离开
KEYGO: SETB P1.0 ;发光二极管LED1、LED2灭
SETB P1.1
RET
SETH: MOV A,23H ;调整时钟时,时加1
ADD A,#01H
DA A ;十进制调整
MOV 23H,A
CJNE A,#24H,HD ;判断是否到24,不到继续
MOV 23H,#00H ;到24时清零
HD: LJMP SETT
SETM: MOV A,22H ;分加1
ADD A,#01H
DA A ;十进制调整
MOV 22H,A
CJNE A,#60H,MD ;判断是否到1小时,不到继续
MOV 22H,#00H ;到1小时则清零
MD: LJMP SETT
;*************************************设置闹铃时间****************************
SETR: SETB P1.0 ;发光二极管LED1灭
CLR P1.1 ;发光二极管LED2亮,改显示状态
LCALL DISPR
MOV R1,#00H ;设置闹钟
时重设R1,用于检测闹铃播放与否
MOV 53H,#03H ;重设闹铃次数
LCALL KEYR ;闹铃时间调整按键检测
JZ SETR
MOV A,R6
JB ACC.2,SETRH
JB ACC.3,SETRM
JB ACC.5,KEYGO ;第二次按为确认离开
SETRH: MOV A,31H ;闹钟时加1
ADD A,#01H
DA A ;十进制调整
MOV 31H,A
CJNE A,#24H,RHD ;判断是否到24,不到继续
MOV 31H,#00H ;到24时则清零
RHD: LJMP SETR
SETRM: MOV A,30H ;闹钟分加1
ADD A,#01H
DA A ;十进制调整
MOV 30H,A
CJNE A,#60H,RMD ;判断是否到1小时,不到继续
MOV 30H,#00H ;到1小时则清零
RMD: LJMP SETR
;************************中途接力跳转*******************************
MB1:AJMP MB
;************************闹钟设置显示子程序****************************
DISPR: MOV A,30H
ANL A,#0FH ;屏蔽高四位
MOV 3AH,A ;保留低位送3AH
MOV A,30H
ANL A,#0F0H ;屏蔽低四位
SWAP A ;高四位与第四位交换
MOV 3BH,A ;将保留的高4位送3BH
MOV A,31H
ANL A,#0FH
MOV 3CH,A ;低位
MOV A,31H
ANL A,#0F0H
SWAP A
MOV 3DH,A ;高位
LEDR1: SETB P2.3
MOV A,3DH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.0
MOV P0,A
LCALL DELAY
LEDR2: SETB P2.0
MOV A,3CH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.1
MOV P0,A
LCALL DELAY
LEDR3: SETB P2.1
MOV A,3BH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.2
MOV P0,A
LCALL DELAY
LEDR4: SETB P2.2
MOV A,3AH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CLR P2.3
MOV P0,A
LCALL DELAY
RET
;**********************************延时子程序***************************
DELAY: MOV R5,#2
D11: MOV R4,#250
D22: DJNZ R4,D22
DJNZ R5,D11
RET
;************************秒表子程序******************************
MB: LCALL DISPTMB
LCALL KEY
JZ MB
MOV A,R6
JB ACC.4,MBKS
ACALL DELAYMB
MOV A,R6
JB ACC.4,MBFH
MBKS: CLR P1.2
;CLR P1.3
MOV TH1,#0D8H ;装入闹铃定时初值(10ms)
MOV TL1,#0F0H
SETB EA ;开放总中断
SETB ET1 ;允许T1中断
SETB TR1 ;开启定时器T1
ACALL DISPTMB
;**************************************************************>
MOV 55H,#00H
MOV 56H,#00H
LCALL KEY ;检测按键S3
MOV A,R6
JB ACC.4,CT
RET
TZ: MOV A,55H
JNZ TZ1
MOV A,56H
JNZ TZ2
CT: MOV 55H,#01H
LJMP TZ
TZ1: MOV 56H,#01H
CLR ET1
LJMP MB
TZ2: MOV 51H,#00H
MOV 52H,#00H
MOV 53H,#00H
MOV 54H,#00H
LCALL DISPTMB
LJMP MB
MBFH: LJMP DISPT
;*******************定时器T1中
断子程序************************
INTT1: PUSH PSW ;状态字入栈保护
PUSH ACC ;累加器入栈保护
MOV TH1,#0D8H ;装入计数初值,12M晶振,形成10MS中断
MOV TL1,#0F0H
INC 50H ;中断服务程序,中断计数器加1
MOV A,50H
CJNE A,#1,RETURN1 ;A不等于1则转移
MOV 50H,#00H ;10ms到清50H
MOV A,51H ;51H十毫秒
ADD A,#01H
MOV 51H,A
CJNE A,#10,RETURN1
MOV 51H,#00H ;100毫秒到,51H单元清零
MOV A,52H ;52H存放百毫秒
ADD A,#01H
MOV 52H,A
CJNE A,#10,RETURN1 ;A不等于10则转移
MOV 52H,#00H ;一秒到,52H单元清零
MOV A,53H ;53H存秒
ADD A,#01H
CPL P1.2 ;1s到发光二极管亮,用于显示秒
MOV 53H,A
CJNE A,#10,RETURN1
MOV 53H,#00H ;满10秒,53H单元清零
MOV A,54H ;54H存十秒
ADD A,#01H
MOV 54H,A
CJNE A,#6,RETURN1
MOV 54H,#00H
RETURN1:POP ACC ;恢复现场
POP PSW
RETI
;**************************秒表时间显示子程序***********************
DISPTMB:NOP
LEDMB1: SETB P2.3
MOV A,54H
MOV DPTR,#TABMB
MOVC A,@A+DPTR
CLR P2.0 ;选通数码管1
MOV P0,A ;显示秒表第四位
LCALL DELAY
LEDMB2: SETB P2.0
MOV A,53H
;显示时钟时的个位部分
JB P1.2,TA22 ;P1.7为1转移
TA11: ADD A,#10 ;用于利用数码管的小数点来表示秒
TA22: MOV DPTR,#TABMB
MOVC A,@A+DPTR
CLR P2.1 ;选通数码管2
MOV P0,A ;显示秒表第三位
LCALL DELAY
LEDMB3: SETB P2.1
MOV A,52H
MOV DPTR,#TABMB
MOVC A,@A+DPTR
CLR P2.2 ;选通数码管3
MOV P0,A ;显示秒表第二位
LCALL DELAY
LEDMB4: SETB P2.2
MOV A,51H
MOV DPTR,#TABMB
MOVC A,@A+DPTR
CLR P2.3 ;选通数码管4
MOV P0,A ;显示秒表第一位
LCALL DELAY
RET
TABMB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;共阳数码管的不带小数点的时间显示码
DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H;共阳数码管的带小数点的时间显示码
;***************************秒表延时子程序*******************************
DELAYMB:MOV R5,#2
D1: MOV R4,#250
D2: DJNZ R4,D2
DJNZ R5,D1
RET
;***********************闹铃时间调整按键扫描及处理子程序*******************
KEYR: MOV P3,#0FFH ;准双向口读之前先写入高电平
MOV A,P3
CPL A
ANL A,#2CH
JZ RETK1 ;无键按下则返回
LCALL DISPR ;延时消抖
MOV A,P3
CPL A
ANL A,#3CH
JZ RETK1 ;键盘去抖动
MOV R6,A ;将键值存入R6
LJMP LOOPR
RETK1:RET
LOOPR: LCALL DISPR
MOV A,P3
CPL A
ANL A,#3CH
JNZ LOOPR ;等待键释放
MOV A,R6
AJMP RETK
;****************************************闹铃检测程序*********************
RING: MOV A,23H ;比较时
CJNE A,31H,RETR
MOV A,22H ;比较分
CJNE A,30H,RETR
LCALL SING
RETR: RET
;**************************************响铃子程序***************************
SING: CJNE R1,#01H,SING1 ;判断是否已经闹铃过一次
LJMP RETS
SING1: SETB ET1
MOV 50H,#00H ;中断计数器清0
MOV 51H,#00H ;音符指针
MOV 52H,#00H ;节拍码指针
MOV 53H,#03H ;设置闹钟不退出响铃次数
GETNOT: MOV A,51H
MOV DPTR,#NOTE ;表头地址送DPTR
MOVC A,@A+DPTR ;查表取音符码
JZ ENDP ;是00H,则结束
MOV R6,A ;存R6
INC 51H
CJNE A,#0FFH,GETMET ;不为0FFH,转取节拍码
LJMP PAUSE ;转休止播放
LJMP GETNOT ;取音符码
GETMET: MOV A,52H
MOV DPTR,#METRE ;取节拍码首地址
MOVC A,@A+DPTR ;取节拍代码送R7
MOV R7,A
INC 52H
PLAY: SETB TR1 ;启动计数
CPL P2.4
LCALL KEY
JNZ RETS
MOV A,R6
MOV R3,A ;音符码存R3
LCALL DELAY1
MOV A,R7 ;取节拍码放A与中断计数比较
CJNE A,50H,PLAY ;断计数器(50H)=R7否,不等继续循环
MOV 50H,#00H ;等于,则取下一代码
LCALL DISPT
LCALL DISPT
LCALL DISPT
LCALL DISPT
CLR TR1
LJMP GETNOT
RETS: SETB P2.4 ;置位蜂鸣器,否则可能产生啸叫
MOV R1,#01H ;表明播放过一次
CLR A ;清除A,防止进入按键处理子程序
LJMP RETR
PAUSE: CLR TR1 ;休止100毫秒
MOV R2,#0DH
DELAY2: MOV R3,#0FFH
LCALL DELAY1
DJNZ R2,DELAY2
RET
ENDP: SETB P2.4
MOV R2,#0C7H ;歌曲结束,延时1秒后继续
END1M: MOV R3,#00H
LCALL DELAY1
DJNZ R2,END1M
DJNZ 53H,SING
RET
DELAY1: NOP ;R3为01H时,DELAY延时为20uS
DELAY3: MOV R4,#02H
DELAY4: DJNZ R4,DELAY4
DJNZ R3,DELAY3
RET
NOTE: DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72H
DB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,98H,72H,7FH
DB 7FH,7FH,7FH,60H,65H,72H,72H,72H,7FH,72H
DB 60H,72H,60H,72H,60H,72H,7FH,72H,7FH,72H,4CH,55H,00H
METRE: DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80H
DB 20H,20H,20H,20H,40H,20H,20H,20H,20H,20H,20H,80H
DB 80H,20H,20H,20H,20H,20H,20H,20H,20H,80H
DB 20H,20H,20H,20H,
40H,20H,20H,20H,20H,20H,20H,40H
END