找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9938|回复: 4
收起左侧

DS1302是怎么初始化时间的

[复制链接]
ID:301330 发表于 2018-6-1 10:18 | 显示全部楼层 |阅读模式
20黑币
程序如下
      DS1302头文件

实现功能:DS1302的控制

补充说明:
***************************************************************/
#ifndef _DS1302_H_
#define _DS1302_H_
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

/*****************DS1302引脚定义*******************/
sbit SCLK = P1^7;        // DS1302时钟信号         7脚
sbit DIO  = P3^2;        // DS1302数据信号         6脚
sbit CE   = P3^4;        // DS1302片选             5脚

/*****************位寻址寄存器定义*******************/
sbit ACC_7 = ACC^7;

/*****************DS1302寄存器宏定义*****************/
#define WRITE_SECOND            0x80
#define WRITE_MINUTE                0x82
#define WRITE_HOUR              0x84
#define WRITE_DAY                      0x86
#define WRITE_MONTH                    0x88
#define WRITE_WEEK              0x8a
#define WRITE_YEA               0x8c

#define READ_SECOND             0x81
#define READ_MINUTE             0x83
#define READ_HOUR               0x85
#define READ_DAY                      0x87
#define READ_MONTH                    0x89
#define READ_WEEK               0x8b
#define READ_YEA                0x8d

#define WRITE_PROTECT           0x8E

/*****************DS1302函数定义*********************/
void Writeds1302 ( uchar addr,dat);        //DS1302指定地址,写数据
uchar Read1302 ( uchar addr );                  //DS1302指定地址,读数据
uchar Read1302_yuanshi(uchar addr);        //DS1302读原始数据函数
void Read_time(void);                                //DS1302读时间日期函数
void DS1302_init(void);                                //DS1302初始化函数

/*****************DS1302变量定义*********************/
uchar data time[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};  //存储秒,分,时,日,月,星期,年
/********************************************************
函数名称:void Writeds1302 ( unsigned char addr,dat )
函数作用:DS1302发送地址,数据
参数说明:addr:地址,dat:数据
********************************************************/
void Writeds1302 ( uchar addr,dat )   
{
        unsigned char i,temp;
        CE=0;         //CE引脚为低,数据传送中止
        SCLK=0;       //清零时钟总线
        CE = 1;       //CE引脚为高,逻辑控制有效
        //发送地址
        for ( i=8; i>0; i-- ) //循环8次移位
        {   
                SCLK = 0;
                temp = addr;
                DIO = (bit)(temp&0x01); //每次传输低字节
                addr >>= 1;             //右移一位
                SCLK = 1;
        }
       
        //发送数据
        for ( i=8; i>0; i-- )
        {   
             SCLK = 0;
             temp = dat;
             DIO = (bit)(temp&0x01);         
             dat >>= 1;                  
             SCLK = 1;
        }
        SCLK=1;
        CE = 0;        
}

/********************************************************
函数名称:uchar Read1302 ( uchar addr )
函数作用:DS1302读取数据并转化成十进制
参数说明:addr参考DS1302寄存器宏定义
********************************************************/
uchar Read1302 ( uchar addr )
{
       unsigned char i,temp,dat1,dat2;
       CE=0;         
       SCLK=0;            
       CE = 1;
       //发送地址
       for ( i=8; i>0; i-- )                      //循环8次移位
       {   
              SCLK = 0;
              temp = addr;
              DIO = (bit)(temp&0x01);          //每次传输低字节
              addr >>= 1;                              //右移一位
              SCLK = 1;
       }
       //读取数据
       for ( i=8; i>0; i-- )
       {
              ACC_7=DIO;
              SCLK = 1;
             ACC>>=1;
              SCLK = 0;
       }
                SCLK=1;   
       CE=0;
       dat1=ACC;
       dat2=dat1/16;                           //数据进制转换
       dat1=dat1%16;                         //十六进制转十进制
       dat1=dat1+dat2*10;
       return (dat1);
}

/********************************************************
函数名称:void Read_time(void)
函数作用:DS1302读取时间日期
参数说明:
********************************************************/
void Read_time(void)
{
        time[0]=Read1302(0x81);
        time[1]=Read1302(0x83);
        time[2]=Read1302(0x85);
        time[3]=Read1302(0x87);
        time[4]=Read1302(0x89);
        time[5]=Read1302(0x8b);
        time[6]=Read1302(0x8d);
}
#endif

回复

使用道具 举报

ID:265843 发表于 2019-3-14 14:58 | 显示全部楼层
unsigned char time_buf[8] = {0x20,0x18,0x08,0x01,0x00,0x00,0x00,0x03};//20180801  00:00:00 周三
ds1302_init(); //DS13023õê¼»ˉ
                ds1302_write_byte(ds1302_control_add,0x00);                        //关写保护
                ds1302_write_byte(ds1302_sec_add,0x80);                                //暂时停掉时钟
                //ds1302_write_byte(ds1302_charger_add,0xa9);            //涓涓充电
                ds1302_write_byte(ds1302_year_add,time_buf[1]);                //年
                ds1302_write_byte(ds1302_month_add,time_buf[2]);        //月
                ds1302_write_byte(ds1302_date_add,time_buf[3]);                //日
                ds1302_write_byte(ds1302_hr_add,time_buf[4]);                //时
                ds1302_write_byte(ds1302_min_add,time_buf[5]);                //分
                ds1302_write_byte(ds1302_sec_add,time_buf[6]);                //秒
                ds1302_write_byte(ds1302_day_add,time_buf[7]);                //周
                ds1302_write_byte(ds1302_control_add,0x80);                        //开写保护
回复

使用道具 举报

ID:461137 发表于 2019-3-14 17:50 | 显示全部楼层
可以自己写进初始时间
回复

使用道具 举报

ID:307851 发表于 2019-7-11 00:00 | 显示全部楼层
lml0508 发表于 2019-3-14 17:50
可以自己写进初始时间

这个初始化时间是怎么计算的啊
回复

使用道具 举报

ID:789560 发表于 2020-7-4 17:56 | 显示全部楼层
stc89cxx 发表于 2019-7-11 00:00
这个初始化时间是怎么计算的啊

初始时间顺序是秒分时日月周年,格式是用BCD码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表