SCLK BIT P1.0 ;DS1302时钟口P1.0
IO BIT P1.1 ;DS1302数据口P1.1
RST BIT P1.2 ;DS1302片选口P1.2 NOW DATA 40H ORG 0
JMP Reset ORG 100H
Reset:
CALL DS1302_Initial ;初始化DS1302
MOV DPTR,#INIT
CALL DS1302_SetTime ;设置初始时间
MOV R0,#NOW
CALL DS1302_GetTime ;读取当前时间 JMP $ INIT: //秒 分 时 日 月 星期 年
DB 00H,00H,20H,01H,01H,05H,10H
;**************************************
;延时X微秒(STC12C5A60S2@12M)
;不同的工作环境,需要调整此函数
;入口参数:R7
;出口参数:无
;**************************************
Delay: ;6 此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
NOP ;1
NOP ;1
RET ;4
;**************************************
;从DS1302读1字节数据
;入口参数:无
;出口参数:ACC
;**************************************
DS1302_ReadByte:
CLR A
PUSH 0
MOV 0,#8 ;8位计数器
ReadNext:
CLR SCLK ;时钟线拉低
CALL Delay ;延时等待
MOV C,IO ;读取数据
RRC A ;保存数据
SETB SCLK ;时钟线拉高
CALL Delay ;延时等待
DJNZ 0,ReadNext
POP 0
RET ;**************************************
;向DS1302写1字节数据
;入口参数:ACC
;出口参数:无
;**************************************
DS1302_WriteByte:
PUSH 0
MOV 0,#8 ;8位计数器
WriteNext:
CLR SCLK ;时钟线拉低
CALL Delay ;延时等待
RRC A ;移出数据
MOV IO,C ;送出到端口
SETB SCLK ;时钟线拉高
CALL Delay ;延时等待
DJNZ 0,WriteNext
POP 0
RET ;**************************************
;读DS1302某地址的的数据
;入口参数:ACC (地址)
;出口参数:ACC (读出的数据)
;**************************************
DS1302_ReadData:
CLR RST ;拉低片选
CALL Delay ;延时等待
CLR SCLK ;时钟线拉低
CALL Delay ;延时等待
SETB RST ;使能片选
CALL Delay ;延时等待
CALL DS1302_WriteByte ;写地址
CALL DS1302_ReadByte ;读数据
RET ;**************************************
;往DS1302的某个地址写入数据
;入口参数:ACC (地址) B(需写入的数据)
;出口参数:无
;**************************************
DS1302_WritEDAta:
CLR RST ;拉低片选
CALL Delay ;延时等待
CLR SCLK ;时钟线拉低
CALL Delay ;延时等待
SETB RST ;使能片选
CALL Delay ;延时等待
CALL DS1302_WriteByte ;写地址
MOV A,B ;地址数据送入ACC
CALL DS1302_WriteByte ;写数据
RET ;**************************************
;写入初始时间
;入口参数:DPTR (初始值地址)
;出口参数:无
;**************************************
DS1302_SetTime:
MOV A,#8EH
MOV B,#0
CALL DS1302_WriteData ;允许写操作
MOV R7,#80H ;从寄存器80开始
MOV R6,#7 ;连续写7次
SetNext:
CLR A
MOV C A,@A+DPTR
MOV B,A ;数据
MOV A,R7 ;地址
CALL DS1302_WriteData ;写数据
INC R7
INC R7 ;寄存器地址+2
INC DPTR ;数据地址+1
DJNZ R6,SetNext
MOV A,#8EH
MOV B,#80H
CALL DS1302_WriteData ;写保护
RET ;**************************************
;读取当前时间
;入口参数:R0 (数据缓冲区首地址)
;出口参数:无
;**************************************
DS1302_GetTime:
MOV R7,#81H ;从寄存器81开始
MOV R6,#7 ;连续读7次
GetNext:
MOV A,R7 ;地址
CALL DS1302_ReadData ;读数据
MOV @R0,A ;保存数据
INC R7
INC R7 ;寄存器地址+2
INC R0 ;数据地址+1
DJNZ R6,GetNext
RET ;**************************************
;初始化DS1302
;**************************************
DS1302_Initial:
CLR RST
CLR SCLK
MOV A,#8EH
MOV B,#0
CALL DS1302_WriteData ;允许写操作
MOV A,#80H
MOV B,#0
CALL DS1302_WriteData ;时钟启动
MOV A,#90H
MOV B,#0A6H
CALL DS1302_WriteData ;一个二极管+4K电阻充电
MOV A,#8EH
MOV B,#80H
CALL DS1302_WriteData ;写保护
RET END