51单片机课程设计之日历闹钟.docx
《51单片机课程设计之日历闹钟.docx》由会员分享,可在线阅读,更多相关《51单片机课程设计之日历闹钟.docx(16页珍藏版)》请在冰点文库上搜索。
![51单片机课程设计之日历闹钟.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/d7e2ca75-e8d8-4664-98c1-af643142ff4c/d7e2ca75-e8d8-4664-98c1-af643142ff4c1.gif)
51单片机课程设计之日历闹钟
(三)题目三:
日历时钟设计
1.利用MCS-51内部定时器定时,编程实现年、月、日、时、分、秒的显示,显示格式为:
年月日:
08-06-24
时分秒:
09-12-35
也可自行设定显示格式,两部分可按键切换显示。
2.能按键调整日期、时间的数值。
3.能设置报警时间,报警时间可设置两个以上。
4.其它扩展功能:
如12小时制/24小时制等。
CLKBITP1.6;时钟信号端
DISPBITP1.7;串出锁存端
DBUFEQU30H;秒的最低位地址
LEDBITP1.1
TW2BIT21H;加12的标志位
AD1EQU50H;秒
AD2EQU51H;分
AD3EQU52H;时
AD4EQU53H;天
AD5EQU54H;月
AD6EQU55H;年
;初始化存储单元结束
ORG0000H
LJMPMAIN
ORG001BH;T1断入口
LJMPINT_INT1
ORG0030H
MAIN:
MOVR0,#AD1
MOVR7,#06H
LOOP0:
MOVA,#00H
MOV@R0,A
INCR0
DJNZR7,LOOP0;R0~R7清零
MOVAD1,#23H
MOVAD2,#0CH
MOVAD3,#09H
MOVAD4,#18H
MOVAD5,#06H
MOVAD6,#08H;初始化时间为9:
12:
35,日期为08年6月24日
SETBEA
SETBET1;允许T1中断
MOVTMOD,#10H;T1许工作,选择方式1
MOVTH0,#3CH
MOVTL0,#0B0H;送入计数初值0.05s
MOVR5,#14H;定时1s,初始化结束
SETBTR1;开启T1
LOOP:
LCALLKEY;扫描键盘
MOVP0,A
CJNEA,#0FEH,NEXT1;0FEH为1键
LCALLDY1MS
LCALLKEYDONE
NEXT1:
SJMPLOOP;扫描键盘看是否需要调整日历
DISPLAY:
LCALLKEY;扫描键盘
CJNEA,#0DFH,L1;0DFH为6键
SETBPSW.1;显示十二小时
LJMPM
L1:
CJNEA,#0EFH,L2;0EFH为5键
CLRPSW.1;显示二十四小时
CLRTW2
LJMPM
L2:
CJNEA,#0CFH,L;0CFH为5+6键
SETBPSW.1
SETBTW2;TW2=1表示把十二表示法转换成二十四小时
LJMPM
L:
CLRTW2
M:
LCALLKEY
CJNEA,#9FH,NEXTL;7FH为8键
SETBPSW.5
LJMPZHUAN1
NEXTL:
CJNEA,#0BFH,ZHUAN1;0BFH为7键
CLRPSW.5
ZHUAN1:
JBPSW.5,DAY;PSW.5=0调整时间,为1则调整日期
MOVA,AD1;调整时间键码分离
MOVB,#0AH
DIVAB
MOVR0,#DBUF
MOV@R0,B
INCR0
MOV@R0,A
MOVA,AD2
MOVB,#0AH
DIVAB
INCR0
MOV@R0,B
INCR0
MOV@R0,A
JBPSW.1,M1
LJMPM2
M1:
;判断时间是否大于12
MOVA,AD3
MOVB,#0CH
SUBBA,B
JCN1
MOVAD3,A
LJMPN1
M2:
JNBTW2,N1;判断是否加12
MOVA,AD3
ADDA,#00H
MOVAD3,A
CLRTW2
N1:
MOVA,AD3
MOVB,#0AH
DIVAB
INCR0
MOV@R0,B
INCR0
MOV@R0,A
SJMPDDISP
DAY:
;调整日期键码分离
MOVA,AD4
MOVB,#0AH
DIVAB
MOVR0,#DBUF
MOV@R0,B
INCR0
MOV@R0,A
MOVA,AD5
MOVB,#0AH
DIVAB
INCR0
MOV@R0,B
INCR0
MOV@R0,A
MOVA,AD6
MOVB,#0AH
DIVAB
INCR0
MOV@R0,B
INCR0
MOV@R0,A
DDISP:
;显示,串入并出的方式,上升沿写入
MOVR0,#DBUF
MOVR7,#06H
MOVDPTR,#TABLE
LOOP2:
MOVA,@R0
MOVCA,@A+DPTR
MOVR6,#08H;显示秒
;CLRC
LOOP3:
CLRCLK
RRCA
MOVDISP,C
SETBCLK
DJNZR6,LOOP3
INCR0
DJNZR7,LOOP2
RET
KEYDONE:
;人工手动调整日历
AGAINB:
LCALLDY250MS;防抖250ms
LCALLKEY
CJNEA,#9FH,NEXTL1;7FH为8键
SETBPSW.5
LJMPZHUAN12
NEXTL1:
CJNEA,#0BFH,ZHUAN12
CLRPSW.5;以上为扫描键盘并设置PSW.5
ZHUAN12:
JBPSW.5,NEXT6B;判断调整日期还是时间
CJNEA,#0FDH,NEXTA;0FDH为2键,如果按键值为FDH则结束
LJMPBACK
NEXTA:
CJNEA,#0FBH,NEXTB;0FBH为3键
INCAD1;秒加1
MOVA,AD1
CJNEA,#3CH,AGAINA
MOVAD1,#00H
SJMPAGAINA
NEXTB:
CJNEA,#0F7H,NEXTC;0F7H为4键
INCAD2;分加1
MOVA,AD2
CJNEA,#3CH,AGAINA
MOVAD2,#00H
SJMPAGAINA
NEXTC:
CJNEA,#0EFH,AGAINA;0EFH为5键
INCAD3;时加1
MOVA,AD3
CJNEA,#18H,AGAINA
MOVAD3,#00H
NEXTT:
SJMPAGAINA
NEXT6B:
CJNEA,#0FDH,NEXTAB;JIESHUJIAN;0FDH为2键
LJMPBACK
NEXTAB:
CJNEA,#0FBH,NEXTBB;0FBH为3键
INCAD4;日加1
MOVA,AD4
CJNEA,#20H,AGAINA
MOVAD4,#01H
SJMPAGAINA
NEXTBB:
CJNEA,#0F7H,NEXTCB;0F7H为4键
INCAD5;月加1
MOVA,AD5
CJNEA,#0DH,AGAINA
MOVAD5,#01H
SJMPAGAINA
NEXTCB:
CJNEA,#0EFH,AGAINA;0EFH为5键
INCAD6;年加1
MOVA,AD6
CJNEA,#64H,AGAINA
MOVAD6,#00H
AGAINA:
LCALLDISPLAY
LJMPAGAINB
BACK:
RET
INT_INT1:
DJNZR5,NEXTS1;循环20次,每次循环为0.05秒,共0.05*20=1秒
MOVR5,#14H
LCALLDISPLAY;满一秒后的显示
LJMPMEND
NEXTS1:
LJMPNEXTS;满一秒后的显示
MEND:
MOVA,AD1
CJNEA,#0AH,LAREMEND
SETBLED;满十秒关蜂鸣器,否则继续
LAREMEND:
INCAD1
MOVA,AD1
CJNEA,#3CH,NEXTS2
LJMPMEND1
NEXTS2:
LJMPNEXTS;以上为看是否修改秒,满60,分加一否则跳转继续
MEND1:
MOVAD1,#00H
INCAD2
MOVA,AD2
CJNEA,#3CH,NEXTS3
LJMPMEND2
NEXTS3:
LJMPNEXTS;以上为看是否修改分,满60,时加一否则跳转继续
MEND2:
MOVAD2,#00H
INCAD3
MOVA,AD3
CJNEA,#08h,NEXT
AJMPDIANLIANG
NEXT:
CJNEA,#0Bh,NORMAL
DIANLIANG:
CLRLED;以上为两个蜂鸣器报警
NORMAL:
MOVA,AD3
CJNEA,#18H,NEXTS4;不满二十四小时跳出
LJMPMEND3;满二十四后跳到清零小时继续加天
NEXTS4:
LJMPNEXTS
MEND3:
MOVAD3,#00H
INCAD4
MOVA,AD5
CJNEA,#02H,JIXUTIAN;判断是否为二月份
MOVA,AD6
MOVB,#4H
DIVAB
MOVA,B
JZRUNNIAN;判断是否为闰年
PINGNIAN:
MOVA,AD4;平年
CJNEA,#1DH,NEXTS
MOVAD4,#01H
AJMPJIXUYUE
RUNNIAN:
MOVA,AD4;闰年
CJNEA,#1EH,NEXTS
MOVAD4,#01H
AJMPJIXUYUE
JIXUTIAN:
;不为二月,再查看是那个月
MOVA,AD5
CJNEA,#01H,PAN1
LJMPDAYUE
PAN1:
CJNEA,#03H,PAN3
LJMPDAYUE
PAN3:
CJNEA,#04H,PAN4
LJMPXIAOYUE
PAN4:
CJNEA,#05H,PAN5
LJMPDAYUE
PAN5:
CJNEA,#06H,PAN6
LJMPXIAOYUE
PAN6:
CJNEA,#07H,PAN7
LJMPDAYUE
PAN7:
CJNEA,#08H,PAN8
LJMPDAYUE
PAN8:
CJNEA,#09H,PAN9
LJMPXIAOYUE
PAN9:
CJNEA,#10H,PAN10
LJMPDAYUE
PAN10:
CJNEA,#11H,DAYUE
LJMPXIAOYUE
DAYUE:
MOVA,AD4;月份:
1,3,5,7,8,10,12
CJNEA,#20H,NEXTS
MOVAD4,#01H
AJMPJIXUYUE
XIAOYUE:
MOVA,AD4;月份:
2,4,6,8,11
CJNEA,#1FH,NEXTS
MOVAD4,#01H
JIXUYUE:
INCAD5;满月后加年
CJNEA,#0DH,NEXTS
MOVAD5,#01H
INCAD6
MOVA,AD6
CJNEA,#64H,NEXTS;年满100后清零
MOVAD6,#00H
NEXTS:
;再赋初值
MOVTH0,#3CH
MOVTL0,#0B0H
RETI
DY250MS:
;延迟防抖250ms
MOVR4,#0FAH
LOOP8:
LCALLDY1MS
DJNZR4,LOOP8
RET
DY1MS:
;延迟防抖1ms
MOVR5,#0FAH
LOOP7:
MOVR7,#70H
DJNZR5,LOOP7
RET
;键盘扫描子程序
KEY:
;SETBP1.7
CLRP1.7;低电平锁存
NOP
NOP
SETBP1.7
MOVR7,#07H;高电平输出
MOVA,#0FFH
AGAIN3:
CLRP2.3
NOP
NOP
SETBP2.3
MOVC,P3.5;把p3.5的状态存入C
RLCA;键盘状态存入A
DJNZR7,AGAIN3;扫描七个按键
RET
TABLE:
DB42H,0F6H,13H,92H,0A6H,8AH,0AH,0F2H,02H,82H;0123456789
;子程序功能索引:
;KEY--扫描键盘
;DDISP--显示
;NEXTS--重新赋初值
;DY1MS--延迟防抖1ms
END