OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » DS1302程序大奉献

共16条 1/2 1 2 跳转至

DS1302程序大奉献

菜鸟
2003-03-17 22:31:00    评分
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 ; ;DS1302写保护 DSWRPRT:MOV CDAT1,#10001110B MOV CDAT2,#10000000B ACALL DSWORD RET [em26][em26]



关键词: DS1302     程序     奉献     CDAT1     数据     ACA    

菜鸟
2003-03-17 22:41:00    评分
2楼
如果改用C写,价值更大。

菜鸟
2003-03-18 01:41:00    评分
3楼
问题是这个子程序乱用内存怎么办?

菜鸟
2003-03-18 02:08:00    评分
4楼
怎么个乱法,请指教

菜鸟
2003-03-18 05:37:00    评分
5楼
因为汇编使用到的DATA区,C语言程序编译时候,可能会把这些区域作为其他变量的数据存储区,这样编译出来的结果必然有问题,所以汇编程序需要告诉C编译器,哪些地址已经被占用,这样虽然可以,但是很麻烦。另外把这些程序作为子程序的时候,传递和返回参数的时候用什么寄存器或者数据区传输呢?不同的编译器是不一样的。 总之,汇编程序的可移植性相当差,C程序就好多了。

菜鸟
2003-03-19 01:55:00    评分
6楼
找一个高速单片机比写汇编程序简单多了。

菜鸟
2003-03-20 02:19:00    评分
7楼
凡是要从需要出发, 没有必要的浪费是不负责任的表现. C与汇编不是谁先进谁落后的问题. (其实高级语言给人提供了一个容易的途径,并不是代表使用者"高级"!). 如果大量的计算和数据处理,用C当然方便.

菜鸟
2004-01-06 23:39:00    评分
8楼
VCC2接5伏,VCC1接电池

菜鸟
2004-02-02 18:46:00    评分
9楼
看时序图觉得也可以,但是我没有试过, 建议你先做一下试验. 如果你的io口紧张是否可以考虑将IO线复用!

菜鸟
2004-02-02 18:53:00    评分
10楼
回autumn: DS1302的vcc2到vcc1之间内置了一些电阻和二极管,可以用软件控制这些电阻和二极管的开关,达到vcc2向vcc1充电的目的. 由于电阻较大,中间还串有二极管,电流较小,所以叫涓流充电,这样对电池也好.

共16条 1/2 1 2 跳转至

回复

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