⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1302program.txt

📁 经典的时钟读写程序
💻 TXT
字号:
DS1302 控制程序 大奉献 

DS1302 采用3线与单片机相连,可以存取内部的寄存器和RAM
    本程序提供了DS1302的初始化程序,单字节读写和连续读写程序
其中初始化程序很重要,当初就是因为初始化不好不能启动DS1302
并且单片机每次上电都要执行此程序.我使用该芯片多年了,一直没有
出现什么问题.
     另外需要注意的是: 上电时在VCC电压达到2.0伏前RST脚须保持逻辑"0". 
RST脚设为逻辑"1"前,SCLK须为逻辑"0". 
    我感觉DS1302的使用并不复杂,选择晶振也很重要,不匹配的晶振
也不容易起振.我一般采用小园的,电子表上常用的那种.

    目前我正在使用HT1380/HT1381 不同的是不含涓流充电和备用
电池电路,可以自己设计一个,用二极管比较简单.

    欢迎大家与我探讨

;51MCU的 DS1302数字时钟芯片 控制程序
;   By:winhi
;      winhimcu@sohu.com

;内存及口线定义
;读写DS1302时使用的内存
CDAT1    EQU    2EH
CDAT2    EQU    2FH
;DS1302 在内存映射  BCD码
;所有数据必须依次存放 秒,分,时,日,月,星期,年
CSEC    EQU    30H    ;秒数据
CMIN    EQU    31H    ;分数据
CHR    EQU    32H    ;小时数据
CDATE    EQU    33H    ;日数据
CMONTH    EQU    34H    ;月数据
CDAY    EQU    35H    ;星期数据
CYEAR    EQU    36H    ;年数据低2位
;读写口线定义
CRST    EQU    P1.3
CIO    EQU    P1.1
CSCLK    EQU    P1.2


;------应用方法
    ;上电复位后初始化DS1302
    ACALL    DSINIT
    MOV    CDAT1,#10000001B
    ACALL    DSRORD
    ANL    A,#01111111B
    MOV    CDAT2,A
    MOV    CDAT1,#10000000B
    ACALL    DSWORD
    ACALL    DSWRPRT    ;写保护
    ;

    ;只读出秒数据 返回在A中
    MOV    CDAT1,#10000001B
    ACALL    DSRORD
    ;

    ;读DS1302中的时钟数据读入到内存
    ACALL    DSRDC
    ;

    ;将内存中的时钟数据写入到DS1302
    MOV     CDAT1,#10001110B        ;打开写保护
    MOV     CDAT2,#00000000B
    ACALL    DSWORD
    ACALL    DSWRC    ;数据写入到DS1302
    ACALL    DSWRPRT    ;写保护
    ;



;----DS1302 控制子程序
; 初始化 DS1302
;   打开写保护  设置涓流充电
DSINIT:    CLR    CSCLK
    NOP
    CLR    CRST
    MOV    CDAT1,#10001110B    ;打开写保护  
    MOV    CDAT2,#00000000B
    ACALL    DSWORD
    MOV    CDAT1,#10010000B    ;涓流充电 R0=2K
    MOV    CDAT2,#10100101B    ;R1=2K 一个二极管
    ACALL    DSWORD
    RET
;
;读DS1302 内容到内存
;  寄存器区: 0区
DSRDC:    PUSH    PSW
    CLR    PSW.3
    CLR    PSW.4
    MOV    R7,#7
    MOV    R0,#CSEC
    MOV    B,#10000001B    ;READ DS1302  SEC
DSRDC1:    CLR    CSCLK
    NOP
    SETB    CRST
    MOV    A,B
    ACALL    DSWRB
    ACALL    DSRDB
    MOV    @R0,A
    INC    R0        ;NEXT ADDRESS/DATA
    MOV    A,B
    ADD    A,#0000010B    ;ADDRESS+1
    MOV    B,A
    CLR    CRST
    NOP
    CLR    CSCLK
    DJNZ    R7,DSRDC1
    POP    PSW
    RET
;
;写内存到DS1302
;  寄存器区: 0区
DSWRC:    PUSH    PSW
    CLR    PSW.3
    CLR    PSW.4
    MOV    R7,#7
    MOV    R0,#CSEC
    MOV    B,#10000000B    ;WRITE DS1302  SEC
DSWRC1:    CLR    CSCLK
    NOP
    SETB    CRST
    MOV    A,B
    ACALL    DSWRB
    MOV    A,@R0
    ACALL    DSWRB
    INC    R0        ;NEXT ADDRESS/DATA
    MOV    A,B
    ADD    A,#0000010B    ;ADDRESS+1
    MOV    B,A
    CLR    CRST
    NOP
    CLR    CSCLK
    DJNZ    R7,DSWRC1
    POP    PSW
    RET
;
;DS1302 单字节命令(数据)写
; DSDAT1=地址 DSDAT2=命令/数据
;  寄存器区: 0区
DSWORD:    PUSH    PSW
    CLR    PSW.3
    CLR    PSW.4
    CLR    CSCLK
    NOP
    SETB    CRST
    MOV    A,CDAT1
    ACALL    DSWRB
    MOV    A,CDAT2
    ACALL    DSWRB
    CLR    CRST
    NOP
    CLR    CSCLK
    POP    PSW
    RET
;
;DS1302 单字节命令(数据)读
; DSDAT1=地址 DSDAT2=命令/数据
;  寄存器区: 0区
DSRORD:    PUSH    PSW
    CLR    PSW.3
    CLR    PSW.4
    CLR    CSCLK
    NOP
    SETB    CRST
    MOV    A,CDAT1
    ACALL    DSWRB
    ACALL    DSRDB
    MOV    CDAT2,A
    CLR    CRST
    NOP
    CLR    CSCLK
    POP    PSW
    RET
;
;DS1302 字节写时序
;  内容在A中
DSWRB:    MOV    R6,#8
    CLR    C
DSWRB1:    CLR    CSCLK
    RRC    A
    MOV    CIO,C
    NOP
    SETB    CSCLK
    DJNZ    R6,DSWRB1
    RET
;
;DS1302 字节读时序
;  内容在A中
DSRDB:    MOV    R6,#8
    CLR    C
DSRDB1:    CLR    CSCLK
    NOP
    MOV    C,CIO
    RRC    A
    SETB    CSCLK
    DJNZ    R6,DSRDB1
    RET
; 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -