OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » DS1302读写程序(原创经典)

共2条 1/1 1 跳转至

DS1302读写程序(原创经典)

菜鸟
2003-11-12 18:48:00    评分
DS1302 采用3线与单片机相连,可以存取内部的寄存器和RAM 本程序提供了DS1302的初始化程序,单字节读写和连续读写程序 其中[color=#DC143C]初始化程序很重要[/color],当初就是因为初始化不好不能启动DS1302 并且单片机每次上电都要执行此程序.我使用该芯片多年了,一直没有 出现什么问题. [color=#DC143C]另外需要注意的是[/color]: 上电时在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 ; ;DS1302写保护 DSWRPRT:MOV CDAT1,#10001110B MOV CDAT2,#10000000B ACALL DSWORD RET [align=right][color=#000066][此贴子已经被作者于2003-11-13 9:49:22编辑过][/color][/align]



关键词: DS1302     读写     程序     原创     经典     CDAT1         

菜鸟
2003-11-17 20:12:00    评分
2楼
没有

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]