论坛风格切换切换到宽版
  • 2344阅读
  • 2回复

[求助]急需DS1302应用资料 [复制链接]

上一主题 下一主题
离线qiurisiyu
 
发帖
176
只看楼主 倒序阅读 0楼 发表于: 2008-06-04
请问各位高手,有没有ds1302的应用资料,与单片机接口通信软件,最好是51系列单片机的.最近碰到ds1302了,以前没用过,所以有点麻烦,请各位高手多多支持,谢谢了!
离线bg4iww
发帖
8679
只看该作者 1楼 发表于: 2008-06-07
给你来一份…………………………
附件: DS1302.pdf (0 K) 下载次数:5
离线小比尔/5
发帖
2582
只看该作者 2楼 发表于: 2008-06-07
我写的驱动程序:
接口函数(类面向对象):
初始化:init1302();
读:read1302(属性宏或地址);
  例如:year=read1302(rt_year);
写:wrt1302(属性宏或地址,值);
其它功能请自己开发。

/*----------------------------------------
端口定义组件,版本: mar 7,2008
文件名:portdef.h
----------------------------------------*/
#define rt_sclk p3_0
#define rt_io p3_1
#define rt_rst p3_2


/*----------------------------------------
ds1302 驱动组件,版本: mar 7,2008
下列接口在使用前需要先在程序中定义:
rt_rst, rt_sclk, rt_io
文件名:ds1302a.h
----------------------------------------*/
#include<absacc.h>
#include<portdef.h>

#define uchar unsigned char
#define rt_sec 0x00
#define rt_min 0x01
#define rt_hour 0x02
#define rt_date 0x03
#define rt_month 0x04
#define rt_day 0x05
#define rt_year 0x06
#define rt_ctrl 0x07
#define rt_tchg 0x08
#define rt_clk_burst 0x1f
#define rt_ram_burst 0x3f

sbit acc7=acc^7;
sbit acc0=acc^0;

/* 设置给ds1302初始化时使用的时间 */
/* 依次为:秒 分 时 日 月 星期 年 控制位 */
code uchar init_data[8]={0x00, 0x00, 0x12, 0x01, 0x01, 0x02, 0x08, 0x00};

void init1302();
void wrt1302add(uchar,bit);
void wrt1302(uchar,uchar);
uchar read1302(uchar);
void phy_wrt1302(uchar);
uchar phy_read1302();
void burst_read1302(uchar*,bit);
void burst_wrt1302(uchar*,bit);

void init1302()
{
     wrt1302(rt_ctrl,0);
     burst_wrt1302(init_data,0);
}

void wrt1302add(uchar add,bit rw)
{
     rt_rst=0;
     rt_sclk=0;
     acc=add;
     acc<<=1;
     acc0=rw;
     acc7=1;
     rt_rst=1;
     phy_wrt1302(acc);
}

void wrt1302(uchar add,uchar c)
{
     wrt1302add(add,0);
     phy_wrt1302(c);
     rt_rst=0;
}

uchar read1302(uchar add)
{
     wrt1302add(add,1);
     acc=phy_read1302();
     rt_rst=0;
     return acc;
}

void burst_read1302(uchar*c,bit rc)
{
     uchar i;
     if(rc) {wrt1302add(rt_ram_burst,1); i=31;}
           else {wrt1302add(rt_clk_burst,1); i=8;}
     for(;i>0;i--)
     {
           *c=phy_read1302();
           c++;
     }
     rt_rst=0;
}

void burst_wrt1302(uchar*c,bit rc)
{
     uchar i;
     if(rc) {wrt1302add(rt_ram_burst,0); i=31;}
           else {wrt1302add(rt_clk_burst,0); i=8;}
     for(;i>0;i--)
     {
           phy_wrt1302(*c);
           c++;
     }
     rt_rst=0;
}

void phy_wrt1302(uchar c)            /* 物理层操作:写入一个字节 ,低位在前 */
{
     uchar i;
     acc=c;
     for(i=8;i>0;i--)
     {
           rt_io=acc0;
           rt_sclk=1;
           acc>>=1;
           rt_sclk=0;
     }
}

uchar phy_read1302()            /* 物理层操作:读出一个字节 */
{
     uchar i;
     acc=0;
     for(i=7;i>0;i--)
     {
           rt_sclk=0;
           acc7=rt_io;
           rt_sclk=1;
           acc>>=1;
     }
     rt_sclk=0;
     acc7=rt_io;
     return acc;
}