📄 ds1302+-
字号:
;****************************************************************
;* ★★★ DS1302 + DS18B20电子钟测试实验程序 ★★★ *
;* (电子驿站单片机实验板、开发板配套例程,程序转载请著明出处。) *
;* E-mail: support@ourmpu.com QQ留言:451338254 476485321 *
;* 编程:ourmpu http://www.ourmpu.com/ 更多例程请登陆网站 *
;****************************************************************
;* 数码管的1~4位显示时钟和分钟 *
;* 数码管的第5位显示秒钟 *
;* 秒钟的十位由P1.0~P1.5发光二极管来指示,分别表示0~50妙 *
;* 实验时请将RST/CLK/IO分别接在P3.0/P3.1/P3.2上,插回P1口跳线 *
;* 本程序供参考,没有加入时间调整功能及定时,闹铃功能 *
;* 用户可以修改该程序,实现多点定时、定闹功能,定时时间设置 *
;* 可以保存在24C04或93C46上,实现断电保存设置 *
;* 设置参数也可以保存在DS1302内部的31自己RAM当中,也可以保存 *
;****************************************************************
ORG 0000H
AJMP START
ORG 0033H
START:
SECOND EQU 30H ;妙
MIN EQU 31H ;分
HR EQU 32H ;时
DATE EQU 33H ;日
MONTH EQU 34H ;月
DAY EQU 35H ;年
YEAR EQU 36H ;星期
BMJSBUF EQU 37H ;半秒计数
RST BIT P3.0
CLK BIT P3.1
IO BIT P3.2
K2 BIT P3.3
K3 BIT P3.4
K4 BIT P3.5
DPBIT BIT 00H ;半秒标志
SSEC BIT 01H ;设置妙
SMIN BIT 02H ;设置分
SETHR BIT 03H ;设置时
SDATE BIT 04H ;设置日
SMON BIT 05H ;设置月
SDAY BIT 06H ;设置星期
SYEAR BIT 07H ;设置年
SETBIT BIT 08H ;总设置状态标志
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV 20H,#00H
MOV SP,#60H
MOV SECOND,#02H
MOV MIN,#28H
MOV HR,#21H
MOV DATE,#26H
MOV MONTH,#03H
MOV DAY,#03H
MOV YEAR,#08H
LCALL SET1302 ;初始化为07年3月6日 星期二 18:28:00
LCALL STR1302 ;启动计时
MAIN: LCALL R_1302 ;读出当前时间
LCALL DISPLAY
AJMP MAIN
DISPLAY: DJNZ R3,DISPLAY1
MOV R3,#118
CPL DPBIT
DISPLAY1:
SETB P2.7 ;关闭液晶背光
CLR P2.6 ;开启数码管显示
MOV A,HR ;第1位显示显示十位
SWAP A
ANL A,#00001111B
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0
SETB P2.1
SETB P2.2
SETB P2.3
SETB P2.4
LCALL DELAY
LCALL SK2
MOV A,HR ;第2位显示小时个位
ANL A,#00001111B
MOV DPTR,#SGTB
MOVC A,@A+DPTR
JB DPBIT,DPXY1
ANL A,#01111111B
DPXY1: MOV P0,A
SETB P2.0
CLR P2.1
SETB P2.2
SETB P2.3
SETB P2.4
LCALL DELAY
LCALL SK2
MOV A,MIN ;第3位显示分钟十位
SWAP A
ANL A,#00001111B
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
SETB P2.1
CLR P2.2
SETB P2.3
SETB P2.4
LCALL DELAY
LCALL SK2
MOV A,MIN ;第4位显示分钟个位
ANL A,#00001111B
MOV DPTR,#SGTB
MOVC A,@A+DPTR
JB DPBIT,DPXY2
ANL A,#01111111B
DPXY2: MOV P0,A
SETB P2.0
SETB P2.1
SETB P2.2
CLR P2.3
SETB P2.4
LCALL DELAY
LCALL SK2
MOV A,SECOND ;第5位显示秒钟个位
ANL A,#00001111B
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A
SETB P2.0
SETB P2.1
SETB P2.2
SETB P2.3
CLR P2.4
LCALL DELAY
LCALL SK2
MOV A,SECOND ;用P1.0~P1.5指示灯指示秒钟十位的0~5
SWAP A
ANL A,#00001111B
SEC0: CJNE A,#0,SEC1
MOV P1,#11111110B ;P1.0点亮,表示秒的10位数为0
SEC1: CJNE A,#1,SEC2
MOV P1,#11111101B ;P1.1点亮,表示秒的10位数为1
SEC2: CJNE A,#2,SEC3
MOV P1,#11111011B ;P1.2点亮,表示秒的10位数为2
SEC3: CJNE A,#3,SEC4
MOV P1,#11110111B ;P1.3点亮,表示秒的10位数为3
SEC4: CJNE A,#4,SEC5
MOV P1,#11101111B ;P1.4点亮,表示秒的10位数为4
SEC5: CJNE A,#5,SECE
MOV P1,#11011111B ;P1.5点亮,表示秒的10位数为5
SECE: NOP
RET
;************* 8位共阳数码管字型表 *****************
SGTB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,89H,0A3H,8CH,0C8H
;******** 延时子程序 ********
DELAY: MOV R1,#2
Y1: MOV R2,#200
DJNZ R2,$
DJNZ R1,Y1
RET
;------ 初始化1302 ------
SET1302: CLR RST
CLR CLK
SETB RST
MOV A,#8EH ;控制寄存器
LCALL W_BIT
MOV A,#00H ;写操作前WP=0
LCALL W_BIT
SETB CLK
CLR RST
MOV R0,#SECOND
MOV R7,#7 ;秒 分 时 日 月 星期 年
MOV R1,#80H ;秒写地址
SET1302A:
CLR RST
CLR CLK
SETB RST
MOV A,R1
LCALL W_BIT
MOV A,@R0
LCALL W_BIT
INC R0
INC R1
INC R1
SETB CLK
CLR RST
DJNZ R7,SET1302A
CLR RST
CLR CLK
SETB CLK
NOP
CLR RST
NOP
CLR CLK
SETB RST
MOV A,#90H
LCALL W_BIT
MOV A,#10100101B ;充电器设置
LCALL W_BIT
SETB CLK
CLR RST
CLR CLK
SETB RST
MOV A,#8EH
LCALL W_BIT
MOV A,#80H ;恢复写保护
LCALL W_BIT
SETB CLK
CLR RST
RET
;------读取一字节RAM ------
T_6061: CLR RST
CLR CLK
SETB RST
MOV A,R1
LCALL W_BIT
LCALL R_BIT
SETB CLK
CLR RST
RET
;------ 从DS1302读出7字节时间数据 ------
R_1302: MOV R0,#SECOND
MOV R7,#7
MOV R1,#81H ;秒地址
R_1302A: CLR RST
CLR CLK
SETB RST
MOV A,R1
LCALL W_BIT
LCALL R_BIT
MOV @R0,A
INC R0
INC R1
INC R1
SETB CLK
CLR RST
DJNZ R7,R_1302A
RET
;-----写任意一地址---R1 为地址,R0 为数据-----
SETONE: CLR CLK
CLR RST
CLR CLK
NOP
SETB RST
MOV A,#8EH
LCALL W_BIT
MOV A,#00H
LCALL W_BIT
SETB CLK
CLR RST
CLR CLK
NOP
CLR RST
CLR CLK
SETB RST
MOV A,R1
LCALL W_BIT
MOV A,R0
LCALL W_BIT
NOP
SETB CLK
CLR RST
NOP
NOP
CLR RST
CLR CLK
SETB RST
MOV A,#8EH
LCALL W_BIT
MOV A,#80H
LCALL W_BIT
SETB CLK
CLR RST
RET
;------ 启动1302计时 ------
STR1302: CLR RST
CLR CLK
SETB RST
MOV A,#8EH ;控制寄存器
LCALL W_BIT
MOV A,#00H ;写操作前WP=0
LCALL W_BIT
SETB CLK
CLR RST
CLR CLK
SETB CLK
NOP
CLR RST
NOP
CLR CLK
SETB RST
MOV A,#90H
LCALL W_BIT
MOV A,#10100101B ;充电器设置
LCALL W_BIT
SETB CLK
CLR RST
CLR CLK
SETB RST
MOV A,#8EH
LCALL W_BIT
MOV A,#80H ;恢复写保护
LCALL W_BIT
SETB CLK
CLR RST
RET
;------ 写8位数据到DA1302 ------
W_BIT: MOV R4,#8
W_BIT1: RRC A
MOV IO,C
SETB CLK
CLR CLK
DJNZ R4,W_BIT1
RET
;------ 从DS1302读出8位数据 ------
R_BIT: MOV R4,#8
R_BIT1: MOV C,IO
RRC A
SETB CLK
CLR CLK
DJNZ R4,R_BIT1
RET
;----------------------------------
BCD_HEX:
MOV A,6FH
ANL A,#0FH
MOV B,A
MOV A,6FH
MOV 6FH,B
SWAP A
ANL A,#0FH
MOV B,#0AH
MUL AB
ADD A,6FH
;MOV 6FH,A
RET
HEX_BCD:
MOV A,6FH
MOV B,#10
DIV AB
SWAP A
ADD A,B
;MOV 6FH,A
RET
;=================================
SK2: JB K2,SK3
ACALL YS10MS
JB K2,SK3
ACALL SOUND
;K2DD: JNB K2,K2DD
SJMP SKRET
SK3: JB K3,SK4
ACALL YS10MS
JB K3,SK4
ACALL SOUND
;K3DD: JNB K3,K3DD
SJMP SKRET
SK4: JB K4,SKRET
ACALL YS10MS
JB K4,SKRET
ACALL SOUND
;K4DD: JNB K1,K4DD
SKRET: RET
YS10MS: MOV R7,#128
DL1: MOV R6,#0FFH
DL0: DJNZ R6,DL0
DJNZ R7,DL1
RET
;******* 音效子程序 *******
SOUND: MOV R7,#228
SDL1: CPL P3.7
MOV R6,#0FFH
SDL0: DJNZ R6,SDL0
DJNZ R7,SDL1
RET
;=================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -