基于51单片机和时钟芯片ds1302的数字时钟设计内容摘要:

SETB T_CLK CLR T_RST DJNZ R7,S1302 CLR T_RST CLR T_CLK SETB T_RST MOV B,8EH。 控制寄存器 LCALL WRITEBYTE MOV B,80H。 控制, wp=1,写保护 LCALL WRITEBYTE SETB T_CLK CLR T_RST POP ACC MOV R1,A POP ACC。 A 恢复数据 14 RET。 GET1302:。 从 ds1302 读时间秒 /时 /分 MOV R0,SECOND。 R0 MOV R7,03H。 R7 MOV R2,81H。 R2 G13021:CLR T_RST CLR T_CLK SETB T_RST MOV B,R2 LCALL WRITEBYTE。 写操作时,将一字节的内容由 B 写至 DS1302 中 LCALL READBYTE。 读操作时,将一字节的内容读至 A 中 MOV @R0,A INC R0 INC R2 INC R2 SETB T_CLK CLR T_RST DJNZ R7,G13021 RET。 WRITEBYTE:。 写 B 寄存器中的内容至 1302 一字节 MOV R4,08H。 R4 INBIT1:MOV A,B RRC A MOV B,A SETB T_IO。 T_IO 口做输入口 MOV T_IO,C SETB T_CLK CLR T_CLK DJNZ R4,INBIT1 RET。 READBYTE:。 读 1302 一字节至 A 寄存器 MOV R4,8。 R4 OUTBIT1:MOV C,T_IO RRC A SETB T_CLK CLR T_CLK DJNZ R4,OUTBIT1 RET。 END DS0302。 ****** **************按键操作 ********************* ANJIAN_FUNCTION:。 功能选择键中断 接至 15 WAIT:JB ,WAIT SETB TR0。 启动定时器 0,延时 10ms JNB TF0,$ JNB ,$。 检测按键是否弹起 SETB EX1。 在有功能选择的时候开中断 1 INC FUNC PUSH ACC。 保存 A 中的数值 MOV A,FUNC CJNE A,03H,FUN_1 MOV LINE0,80H。 分隔符下移,以便区分于校时操作 MOV LINE1,80H FUN_1:CJNE A,04H,FUN_2 MOV LINE0,80H。 分隔符下移,以便区分于校时操作 MOV LINE1,80H FUN_2:CJNE A,05H,ANJIAN_FUNCTION_RET。 控制所要置数的计数位闪动 SETB ET1 CLR EX1。 在功能选择的时退出开中断 1 MOV FUNC,00H MOV LINE0,40H。 显示分和秒的间隔符 MOV LINE1,40H。 显示小时和分的间隔符 ANJIAN_FUNCTION_RET: POP ACC。 恢复 A 中的值 RETI。 校时加 中断 COUNT_UP: PUSH ACC MOV A,FUNC CLR C SUBB A,00H。 检测当前有无校时或者对闹铃的操作 CJNE A,00H,COUNT_UP_NEXT AJMP COUNT_UP_RET。 *****************时 ******************** COUNT_UP_NEXT: CJNE A,01H,COUNT_UP_1。 检测当前操作是否为时钟校时 时钟位 INC HOUR0 MOV R6,HOUR1。 校时 R6 CJNE R6,02H,COUNT_UP_0_1。 先判断小时高位是否已计数值 2 MOV R6,HOUR0 CJNE R6,04H,COUNT_UP_RET MOV HOUR1,00H MOV HOUR0,00H AJMP COUNT_UP_RET。 返回 COUNT_UP_0_1: MOV R6,HOUR0 CJNE R6,0AH,COUNT_UP_RET 16 MOV HOUR0,00H INC HOUR1 AJMP COUNT_UP_RET。 ***************分 **************************** COUNT_UP_1: CJNE A,02H,COUNT_UP_2。 校时 分 INC MIN0 MOV R6,MIN0 CJNE R6,0AH,COUNT_UP_1_1。 先判断分的低位 INC MIN1 MOV MIN0,00H COUNT_UP_1_1: MOV R6,MIN1 CJNE R6,06H,COUNT_UP_RET MOV MIN1,00H。 SJMP COUNT_UP_RET COUNT_UP_RET: LCALL HECHENG MOV SECOND,ZANCUN_SECOND。 每次校时秒都归零 LCALL SET1302。 每加一次对当前计数值进行一次重置 POP ACC RETI COUNT_UP_2: CJNE A,03H,COUNT_UP_3。 闹铃 时 CLR ET1。 暂停对 DS1302 的读操作 MOV R6,HOUR1。 时 R6 CJNE R6,02H,COUNT_UP_2_1。 先判断小时高位是否已计数值 2 INC HOUR0 MOV R6,HOUR0 CJNE R6,04H,COUNT_UP_NLRET MOV HOUR1,00H MOV HOUR0,00H AJMP COUNT_UP_NLRET。 返回 COUNT_UP_2_1: INC HOUR0 MOV R6,HOUR0 CJNE R6,0AH,COUNT_UP_NLRET MOV HOUR0,00H INC HOUR1 SJMP COUNT_UP_NLRET COUNT_UP_3:CJNE A,04H,COUNT_UP_RET。 闹铃 分 CLR ET1。 暂停对 DS1302 的读操作 INC MIN0 MOV R6,MIN0 CJNE R6,0AH,COUNT_UP_3_1。 先判断分的低位 17 INC MIN1 MOV MIN0,00H COUNT_UP_3_1:MOV R6,MIN1 CJNE R6,06H,COUNT_UP_NLRET MOV MIN1,00H COUNT_UP_NLRET: LCALL HECHENG POP ACC RETI。 *********** 有按键时重置 ds1302 当前位计数值 (R5) **************。 功能 :将当前时,分的高低显示计数值分别合成为 HOUR,MINUTE,对校时时 ds1302 重新写入数据做准备 HECHENG:。 R0,A PUSH ACC。 对 R0 的值压栈 MOV A,FUNC CLR C SUBB A,00H。 检测当前有无校时或者对闹铃的操作 CJNE A,01H,HECHENG_1 MOV ZANCUN0,HOUR0 MOV ZANCUN1,HOUR1 ANL ZANCUN0,0FH ANL ZANCUN1,0FH MOV R5,A。 保存 A 中的值 MOV A,ZANCUN1 SWAP A ADD A,ZANCUN0 MOV HOUR,A MOV A,R5。 恢复 A 的计数值 SJMP HECHENG_RET HECHENG_1: CJNE A,02H,HECHENG_2 MOV ZANCUN0,MIN0 MOV ZANCUN1,MIN1 ANL ZANCUN0,0FH ANL ZANCUN1,0FH MOV R5,A。 保存 A 中的值。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。