0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

DS1302時鐘模塊及其驅(qū)動代碼介紹

冬至子 ? 來源:清晨的小樹洞 ? 作者:清晨。 ? 2023-11-08 17:18 ? 次閱讀

一、DS1302時鐘模塊

現(xiàn)在流行的串行時鐘電路很多,如DS1302、 DS1307、PCF8485等。這些電路的接口簡單、價格低廉、使用方便,被廣泛地采用。

DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM實時時鐘電路,它可以對年、月、日、周、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.0V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。

DS1302內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產(chǎn)品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,同時提供了對后備電源進行涓細電流充電的能力,該芯片采用普通32.768kHz晶振,DS1302 工作時功耗很低保持數(shù)據(jù)和時鐘信息時功率小于1mW。

圖1 DS1302時鐘模塊實物圖

圖片

圖2 DS1302時鐘模塊封裝

1.jpg

DS1302時鐘模塊的引腳功能介紹如表1所示,而時序不再做陳述,需要再自行查找資料。

二、DS1302時鐘模塊驅(qū)動代碼

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寫一個字節(jié)

voidDS1302_ReadByte(UINT8 *data_byte);//從ds1302讀一個字節(jié)

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

voidDS1302_Over();//操作結(jié)束信號

voidDS1302_ClearWriteProtection();//清除寫保護

voidDS1302_SetWriteProtection();//設置寫保護

voidDS1302_SetTime(UINT8 *ds1302_set_buffer);//設置ds1302的時間

voidDS1302_ReadTime(UINT8 *ds1302_build_buffer);//讀取ds1302的時間

voidTime_Build();//系統(tǒng)從ds1302讀取時間

void Time_Set();//系統(tǒng)向ds1302設置時間

voidTime_Init();//系統(tǒng)時間初始化

#endif

2.主程序

#include"ds1302.h"

voidDS1302_WriteByte(UINT8 data_byte)//向ds1302寫一個字節(jié)

{

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讀一個字節(jié)

{

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()//操作結(jié)束信號

{

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)//突發(fā)模式下設置時間

{

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);//突發(fā)模式一次要寫8個字節(jié),第八個字節(jié)是寫保護字節(jié)

    DS1302_Over();

}

void DS1302_ReadTime(UINT8*ds1302_read_buffer)//突發(fā)模式下讀取時間

{

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);//突發(fā)模式一次讀8個字節(jié),最后一字節(jié)讀出來沒用

    DS1302_Over();



    DS1302_SetWriteProtection();

}

voidTime_Build()//讀取時間后轉(zhuǎn)換成需要的格式

{

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()//將時間轉(zhuǎn)化為對應格式存入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];    //發(fā)送年數(shù)據(jù)

b = date[3];

c = date[5];    //發(fā)送月數(shù)據(jù)

d = date[6];

e = date[8];    //發(fā)送日數(shù)據(jù)

f = date[9];

write_txt("t0.txt=");   //發(fā)送文本

write_COM(34);         //雙引號

write_COM(a);

write_COM(b);

write_COM(34);

write_END();               //結(jié)束符

write_txt("t1.txt=");   //發(fā)送文本

write_COM(34);         //雙引號

write_COM(c);

write_COM(d);

write_COM(34);

write_END();               //結(jié)束符

write_txt("t2.txt=");   //發(fā)送文本

write_COM(34);         //雙引號

write_COM(e);

write_COM(f);

write_COM(34);

write_END();               //結(jié)束符





a = time[0];    //發(fā)送時數(shù)據(jù)

b = time[1];

c = time[3];    //發(fā)送分鐘數(shù)據(jù)

d = time[4];

e = time[6];    //發(fā)送秒鐘數(shù)據(jù)

f = time[7];

write_txt("t3.txt=");   //發(fā)送文本

write_COM(34);         //雙引號

write_COM(a);

write_COM(b);

write_COM(34);

write_END();               //結(jié)束符

write_txt("t4.txt=");   //發(fā)送文本

write_COM(34);         //雙引號

write_COM(c);

write_COM(d);

write_COM(34);

write_END();               //結(jié)束符

write_txt("t5.txt=");   //發(fā)送文本

write_COM(34);         //雙引號

write_COM(e);

write_COM(f);

write_COM(34);

write_END();               //結(jié)束符



write_txt("t9.txt=");   //發(fā)送文本

write_COM(34);

if(week==1)                        //發(fā)送星期數(shù)據(jù)

    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();
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5294

    瀏覽量

    119814
  • 實時時鐘
    +關(guān)注

    關(guān)注

    4

    文章

    235

    瀏覽量

    65642
  • DS1302
    +關(guān)注

    關(guān)注

    8

    文章

    449

    瀏覽量

    50577
  • PCF
    PCF
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    20865
  • 時鐘模塊
    +關(guān)注

    關(guān)注

    1

    文章

    50

    瀏覽量

    14356
收藏 人收藏

    評論

    相關(guān)推薦

    DS1302時鐘模塊簡介

    Arduino IDE代碼完成效果注意事項材料準備① Arduino UNO R3主板(僅供參考)② DS1302時鐘模塊③ TM1637四位數(shù)碼管④ 面包板⑤ 杜邦線若干
    發(fā)表于 07-26 06:34

    DS1302基本介紹

    目錄DS1302基本介紹電氣說明引腳說明時序解讀寄存器及其功能地址/命令字節(jié)數(shù)據(jù)字節(jié)單次讀/寫操作1. 發(fā)送一個byte的數(shù)據(jù)2.寫入數(shù)據(jù)3. 接收一個byte的數(shù)據(jù)4. 讀取數(shù)據(jù)突發(fā)(BURS
    發(fā)表于 01-17 06:21

    DS1302驅(qū)動代碼分享

    藍橋杯單片機 驅(qū)動代碼總結(jié)1. DS1302驅(qū)動在官方提供的DS1302驅(qū)動
    發(fā)表于 02-23 06:18

    時鐘芯片DS1302及其在數(shù)據(jù)記錄中的應用

    時鐘芯片DS1302及其在數(shù)據(jù)記錄中的應用:介紹了美國DALLAS公司推出的低功耗時鐘芯片DS1302
    發(fā)表于 05-22 08:35 ?140次下載

    ds1302時鐘電路

    ds1302時鐘電路
    發(fā)表于 05-17 13:17 ?7938次閱讀
    <b class='flag-5'>ds1302</b><b class='flag-5'>時鐘</b>電路

    DS1302時鐘模塊原理圖

    ds1302時鐘芯片簡單介紹及其原理圖。
    發(fā)表于 04-06 16:01 ?15次下載

    DS1302時鐘模塊產(chǎn)品使用手冊

    ds1302時鐘芯片簡單介紹及其原理圖。
    發(fā)表于 04-06 16:02 ?4次下載

    基于DS1302芯片的時鐘設計

    基于DS1302芯片的時鐘設計
    發(fā)表于 03-01 12:21 ?12次下載

    基于實時時鐘模塊 時鐘芯片DS1302

    基于實時時鐘模塊 時鐘芯片DS1302
    發(fā)表于 10-16 11:35 ?40次下載
    基于實時<b class='flag-5'>時鐘</b><b class='flag-5'>模塊</b> <b class='flag-5'>時鐘</b>芯片<b class='flag-5'>DS1302</b>

    51單片機DS1302實時時鐘驅(qū)動程序

    本文首先闡述了ds1302引腳及功能,其次介紹DS1302的控制字節(jié)及電路圖,最后詳細介紹了51單片機DS1302實時
    發(fā)表于 05-15 08:45 ?9405次閱讀
    51單片機<b class='flag-5'>DS1302</b>實時<b class='flag-5'>時鐘</b><b class='flag-5'>驅(qū)動</b>程序

    DS1302時鐘芯片的使用源代碼免費下載

    本文檔的做作業(yè)內(nèi)容詳細介紹的是DS1302時鐘芯片的使用源代碼免費下載。
    發(fā)表于 10-31 17:20 ?17次下載
    <b class='flag-5'>DS1302</b><b class='flag-5'>時鐘</b>芯片的使用源<b class='flag-5'>代碼</b>免費下載

    微雪電子RTC 時鐘模塊 DS1302簡介

    RTC 時鐘模塊 DS1302實時時鐘 SPI接口 板載紐扣電池座 支持三線或四線同步串行通信 應用于手持設備 電子手表 鬧鐘 型號 D
    的頭像 發(fā)表于 12-30 10:03 ?3244次閱讀
    微雪電子RTC <b class='flag-5'>時鐘</b><b class='flag-5'>模塊</b> <b class='flag-5'>DS1302</b>簡介

    DS1302時鐘芯片的Keil代碼免費下載

    本文檔的主要內(nèi)容詳細介紹的是DS1302時鐘芯片的Keil代碼免費下載
    發(fā)表于 12-23 08:00 ?6次下載
    <b class='flag-5'>DS1302</b><b class='flag-5'>時鐘</b>芯片的Keil<b class='flag-5'>代碼</b>免費下載

    畢業(yè)設計之時鐘模塊設計DS1302

    模塊:使用的芯片是:DS1302芯片,DS1302芯片是一個自動計時的時鐘模塊,有8個時鐘寄存
    發(fā)表于 11-15 11:51 ?4次下載
    畢業(yè)設計之<b class='flag-5'>時鐘</b><b class='flag-5'>模塊</b>設計<b class='flag-5'>DS1302</b>

    基于STM32的DS1302時鐘模塊驅(qū)動程序(詳細)

    0.96寸OLED屏驅(qū)動代碼(SPI驅(qū)動)1.項目概述本程序采用的主控芯片為STM32F103RCT6,通過主控芯片驅(qū)動DS1302
    發(fā)表于 01-18 09:14 ?58次下載
    基于STM32的<b class='flag-5'>DS1302</b><b class='flag-5'>時鐘</b><b class='flag-5'>模塊</b><b class='flag-5'>驅(qū)動</b>程序(詳細)