0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

DS1302时钟模块及其驱动代码介绍

冬至子 来源:清晨的小树洞 作者:清晨。 2023-11-08 17:18 次阅读

一、DS1302时钟模块

现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。

DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力,该芯片采用普通32.768kHz晶振,DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW。

图1 DS1302时钟模块实物图

图片

图2 DS1302时钟模块封装

1.jpg

DS1302时钟模块的引脚功能介绍如表1所示,而时序不再做陈述,需要再自行查找资料

二、DS1302时钟模块驱动代码

1.头文件

#ifndef DS1302_H

#define DS1302_H

#include"STC15F2K60S2.h"

#ifndef UINT8

#define UINT8unsigned char

#endif

#ifndefDS1302_READ_BURST

#defineDS1302_READ_BURST 0xBF

#endif

#ifndefDS1302_WRITE_BURST

#defineDS1302_WRITE_BURST 0xBE

#endif

sbitDS1302_IO = P1^4;

sbitDS1302_RST = P1^5;

sbit DS1302_SCLK =P1^3;

extern UINT8 xdatatime[9];

extern UINT8 xdatadate[11];

extern UINT8 xdatacurrent_day[2];

//声明全局变量

voidDS1302_WriteByte(UINT8 data_byte);//向ds1302写一个字节

voidDS1302_ReadByte(UINT8 *data_byte);//从ds1302读一个字节

voidDS1302_Start();//操作起始信号

voidDS1302_Over();//操作结束信号

voidDS1302_ClearWriteProtection();//清除写保护

voidDS1302_SetWriteProtection();//设置写保护

voidDS1302_SetTime(UINT8 *ds1302_set_buffer);//设置ds1302的时间

voidDS1302_ReadTime(UINT8 *ds1302_build_buffer);//读取ds1302的时间

voidTime_Build();//系统从ds1302读取时间

void Time_Set();//系统向ds1302设置时间

voidTime_Init();//系统时间初始化

#endif

2.主程序

#include"ds1302.h"

voidDS1302_WriteByte(UINT8 data_byte)//向ds1302写一个字节

{

UINT8 i;

   

    for (i=0;i< 8;i++)

    {

            DS1302_IO = data_byte &0x01;

            DS1302_SCLK = 1;

            data_byte > >= 1;

            DS1302_SCLK = 0;

    }

}

voidDS1302_ReadByte(UINT8 *data_byte) //从ds1302读一个字节

{

UINT8 i;

   

    for (i=0;i< 8;i++)

    {      

            *data_byte > >= 1;

            if (DS1302_IO){*data_byte |=0x80;}

            DS1302_SCLK = 1;

            DS1302_SCLK = 0;

    }

}

voidDS1302_Start()//操作起始信号

{

DS1302_RST  = 0;

    DS1302_SCLK = 0;

    DS1302_RST  = 1;

}

voidDS1302_Over()//操作结束信号

{

DS1302_IO  = 0;

    DS1302_RST = 0;

}

voidDS1302_ClearWriteProtection()//清除写保护

{

DS1302_Start();

    DS1302_WriteByte(0x8E);

    DS1302_WriteByte(0x00);

    DS1302_Over();

}

voidDS1302_SetWriteProtection()//设置写保护

{

DS1302_Start();

    DS1302_WriteByte(0x8E);

    DS1302_WriteByte(0x80);

    DS1302_Over();

}

voidDS1302_SetTime(UINT8 *ds1302_set_buffer)//突发模式下设置时间

{

UINT8 i;



    DS1302_ClearWriteProtection();



    DS1302_Start();

    DS1302_WriteByte(DS1302_WRITE_BURST);

    for (i=0; i< 7; i++)

    {

            DS1302_WriteByte(ds1302_set_buffer[i]);

    }

    DS1302_WriteByte(0x80);//突发模式一次要写8个字节,第八个字节是写保护字节

    DS1302_Over();

}

void DS1302_ReadTime(UINT8*ds1302_read_buffer)//突发模式下读取时间

{

UINT8 i,Temp;



    DS1302_ClearWriteProtection();



    DS1302_Start();

    DS1302_WriteByte(DS1302_READ_BURST);

    for (i=0; i< 7; i++)

    {

            DS1302_ReadByte(ds1302_read_buffer+i);

    }

    DS1302_ReadByte(&Temp);//突发模式一次读8个字节,最后一字节读出来没用

    DS1302_Over();



    DS1302_SetWriteProtection();

}

voidTime_Build()//读取时间后转换成需要的格式

{

UINT8 xdata ds1302_build_buffer[7];

   

    DS1302_ReadTime(ds1302_build_buffer);

    time[7] =(ds1302_build_buffer[0]&0x0f)+'0';

    time[6] =((ds1302_build_buffer[0]&0x70) >>4)+'0';

    time[4] =(ds1302_build_buffer[1]&0x0f)+'0';

    time[3] =((ds1302_build_buffer[1]&0x70) >>4)+'0';

    time[1] =(ds1302_build_buffer[2]&0x0f)+'0';

    time[0] =((ds1302_build_buffer[2]&0x30) >>4)+'0';

    date[9] =(ds1302_build_buffer[3]&0x0f)+'0';

    date[8] =((ds1302_build_buffer[3]&0x30) >>4)+'0';

    date[6] =(ds1302_build_buffer[4]&0x0f)+'0';

    date[5] =((ds1302_build_buffer[4]&0x10) >>4)+'0';

    date[3] =(ds1302_build_buffer[6]&0x0f)+'0';

    date[2] = ((ds1302_build_buffer[6]&0xf0) >>4)+'0';

}

void Time_Set()//将时间转化为对应格式存入ds1302

{

UINT8 xdata ds1302_set_buffer[7];

   

    ds1302_set_buffer[0]  = time[7]-'0';

    ds1302_set_buffer[0] |=((time[6]-'0')&0x07)< < 4;

    ds1302_set_buffer[1]  = time[4]-'0';

    ds1302_set_buffer[1] |=((time[3]-'0')&0x07)< < 4;

    ds1302_set_buffer[2]  = time[1]-'0';

    ds1302_set_buffer[2] |=((time[0]-'0')&0x03)< < 4;

    ds1302_set_buffer[3]  = date[9]-'0';

    ds1302_set_buffer[3] |=((date[8]-'0')&0x03)< < 4;

    ds1302_set_buffer[4]  = date[6]-'0';

    ds1302_set_buffer[4] |=((date[5]-'0')&0x01)< < 4;

    ds1302_set_buffer[6]  = date[3]-'0';

    ds1302_set_buffer[6] |=((date[2]-'0')&0x0f)< < 4;

    ds1302_set_buffer[5] = 0x01;

    DS1302_SetTime(ds1302_set_buffer);

}

void Time_Init()//开机时间初始化

{

Time_Build();

    current_day[0] = date[8];

    current_day[1] = date[9];//保存当前日期,用于检测日期变化

}

三、 DS1302时钟模块与USRAT HMI通信

uchara=0,b=0,c=0,d=0,e=0,f=0;

/**********显示时间**********/        

a = date[2];    //发送年数据

b = date[3];

c = date[5];    //发送月数据

d = date[6];

e = date[8];    //发送日数据

f = date[9];

write_txt("t0.txt=");   //发送文本

write_COM(34);         //双引号

write_COM(a);

write_COM(b);

write_COM(34);

write_END();               //结束符

write_txt("t1.txt=");   //发送文本

write_COM(34);         //双引号

write_COM(c);

write_COM(d);

write_COM(34);

write_END();               //结束符

write_txt("t2.txt=");   //发送文本

write_COM(34);         //双引号

write_COM(e);

write_COM(f);

write_COM(34);

write_END();               //结束符





a = time[0];    //发送时数据

b = time[1];

c = time[3];    //发送分钟数据

d = time[4];

e = time[6];    //发送秒钟数据

f = time[7];

write_txt("t3.txt=");   //发送文本

write_COM(34);         //双引号

write_COM(a);

write_COM(b);

write_COM(34);

write_END();               //结束符

write_txt("t4.txt=");   //发送文本

write_COM(34);         //双引号

write_COM(c);

write_COM(d);

write_COM(34);

write_END();               //结束符

write_txt("t5.txt=");   //发送文本

write_COM(34);         //双引号

write_COM(e);

write_COM(f);

write_COM(34);

write_END();               //结束符



write_txt("t9.txt=");   //发送文本

write_COM(34);

if(week==1)                        //发送星期数据

    write_txt("一");

if(week==2)

    write_txt("二");

if(week==3)

    write_txt("三");

if(week==4)

    write_txt("四");

if(week==5)

    write_txt("五");

if(week==6)

    write_txt("六");

if(week==7)

    write_txt("日");

write_COM(34);

write_END();
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117741
  • 实时时钟
    +关注

    关注

    4

    文章

    210

    浏览量

    65338
  • DS1302
    +关注

    关注

    8

    文章

    448

    浏览量

    50227
  • PCF
    PCF
    +关注

    关注

    0

    文章

    30

    浏览量

    20798
  • 时钟模块
    +关注

    关注

    1

    文章

    45

    浏览量

    14242
收藏 人收藏

    评论

    相关推荐

    DS1302时钟模块简介

    Arduino IDE代码完成效果注意事项材料准备① Arduino UNO R3主板(仅供参考)② DS1302时钟模块③ TM1637四位数码管④ 面包板⑤ 杜邦线若干
    发表于 07-26 06:34

    DS1302基本介绍

    目录DS1302基本介绍电气说明引脚说明时序解读寄存器及其功能地址/命令字节数据字节单次读/写操作1. 发送一个byte的数据2.写入数据3. 接收一个byte的数据4. 读取数据突发(BURS
    发表于 01-17 06:21

    DS1302驱动代码分享

    蓝桥杯单片机 驱动代码总结1. DS1302驱动在官方提供的DS1302驱动
    发表于 02-23 06:18

    时钟DS1302模块实验python代码

    第32讲:时钟DS1302模块实验python代码
    发表于 09-25 08:13

    时钟芯片DS1302及其在数据记录中的应用

    时钟芯片DS1302及其在数据记录中的应用:介绍了美国DALLAS公司推出的低功耗时钟芯片DS1302
    发表于 05-22 08:35 140次下载

    ds1302时钟电路

    ds1302时钟电路
    发表于 05-17 13:17 7773次阅读
    <b class='flag-5'>ds1302</b><b class='flag-5'>时钟</b>电路

    DS1302时钟模块原理图

    ds1302时钟芯片简单介绍及其原理图。
    发表于 04-06 16:01 15次下载

    DS1302时钟模块产品使用手册

    ds1302时钟芯片简单介绍及其原理图。
    发表于 04-06 16:02 4次下载

    基于DS1302芯片的时钟设计

    基于DS1302芯片的时钟设计
    发表于 03-01 12:21 11次下载

    基于实时时钟模块 时钟芯片DS1302

    基于实时时钟模块 时钟芯片DS1302
    发表于 10-16 11:35 39次下载
    基于实时<b class='flag-5'>时钟</b><b class='flag-5'>模块</b> <b class='flag-5'>时钟</b>芯片<b class='flag-5'>DS1302</b>

    ds1302芯片介绍ds1302工作原理解析

    时钟小编相信大家见怪不怪了,那么时钟芯片大家知道是什么吗?今天我们就来谈谈最常用时钟芯片ds1302,主要通过ds1302芯片的
    发表于 10-18 16:19 4.3w次阅读

    DS1302时钟芯片的使用源代码免费下载

    本文档的做作业内容详细介绍的是DS1302时钟芯片的使用源代码免费下载。
    发表于 10-31 17:20 17次下载
    <b class='flag-5'>DS1302</b><b class='flag-5'>时钟</b>芯片的使用源<b class='flag-5'>代码</b>免费下载

    DS1302时钟芯片的Keil代码免费下载

    本文档的主要内容详细介绍的是DS1302时钟芯片的Keil代码免费下载
    发表于 12-23 08:00 6次下载
    <b class='flag-5'>DS1302</b><b class='flag-5'>时钟</b>芯片的Keil<b class='flag-5'>代码</b>免费下载

    时钟模块DS1302万年历设计

    时钟模块DS1302万年历设计说明。
    发表于 04-13 09:35 24次下载

    基于STM32的DS1302时钟模块驱动程序(详细)

    :7针0.96寸OLED屏驱动代码(SPI驱动)1.项目概述本程序采用的主控芯片为STM32F103RCT6,通过主控芯片驱动DS1302
    发表于 01-18 09:14 42次下载
    基于STM32的<b class='flag-5'>DS1302</b><b class='flag-5'>时钟</b><b class='flag-5'>模块</b><b class='flag-5'>驱动</b>程序(详细)