<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

DS1302時鐘芯片的電路和程序

冬至子 ? 來源:永珂在線 ? 作者:沙鷗520 ? 2023-11-02 14:07 ? 次閱讀

本文介紹DS1302時鐘芯片的電路和程序。

DS1302是由美國DALLAS公司推出的具有涓細電流充電能力的低功耗實時時鐘芯片。它可以對年、月、日、周、時、分、秒進行計時,并且具有閏年補償等多種功能。

1、參考電路

如下參考電路已經過實踐驗證,可正常工作。

圖片

其中,PU151到PU153對應DS1302的SCLK,IO,RST引腳,需接到微處理器(如單片機)的相關引腳。

第8腳加上3V的后備紐扣電池,時鐘在主電路掉電時也可以持續運行。

2、參考程序

實踐驗證,以下兩個程序任意一個都是可以運行的。

2.1參考程序1

//DS1302設置子程序

#include "ds1302.h"

sbit sclk=P3^3;//DS1302設置

sbit rst=P3^5;

sbit io=P3^4; //DS1302三個管腳定義

unsigned char xdata time[7]={23,1,3,20,5,6,7};//0年 1周 2月 3日 4時 5分 6秒 有符號

unsigned char write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//DS1302寫時間寄存器地址

unsigned char read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//讀

void write_ds1302_byte(unsigned char dat) //DS1302寫字節函數

{

unsigned char i;

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

{

sclk=0; //下降沿數據有效

io=dat&0x01;

dat=dat>>1;

sclk=1;

}

}

void write_ds1302(unsigned char add,unsigned char dat)

{

rst=0;

nop ();

sclk=0;

nop ();

rst=1;

nop ();

write_ds1302_byte(add);

write_ds1302_byte(dat);//發送地址后立即發送數據,沒有停頓

rst=0;

nop ();

sclk=1;

io=1;

}

unsigned char read_ds1302(unsigned char add)

{

unsigned char i,dat=0;

rst=0;

nop ();

sclk=0;

nop ();

rst=1;

nop ();

write_ds1302_byte(add);//發送地址后DS1302立即送出數據

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

{

dat=dat>>1;

sclk=0;

if(io)

dat=dat|0x80;

sclk=1;

}

rst=0;

nop ();

sclk=0;

nop ();

sclk=1;

io=0; //223-3-20,1改為0后可保存數據

return dat;

}

void ds1302_init()

{

unsigned char i,j;

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

{

j=time[i]/10;

time[i]=time[i]%10;

time[i]=time[i]+j*16; //轉換為BCD碼

}

write_ds1302(0x8e,0x00);//去除寫保護

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

{

write_ds1302(write_add[i],time[i]);

}

write_ds1302(0x8e,0x80);//加寫保護

}

void read_time()//讀時間

{

unsigned char i;

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

{

time[i]=read_ds1302(read_add[i]);

time[i]=time[i]/16*10+time[i]%16;//轉換BCD碼為十進制

}

if (time[4]>23) time[4]=23;

if (time[5]>59) time[5]=59;

if (time[6]>59) time[6]=59;

}

說明:

●如果要讀取時間,就調用read_time()子程序,讀取的時鐘數據存入time[]數組;

●如果要設置時間,就調用ds1302_init()子程序,要設置的時鐘數據預先存入time[]數組;

●ds1302_init()子程序不能每次開機運行,只需在修改時間時運行即可。

2.2參考程序2

#include "DS1302.h"

#define uchar unsigned char

#define uint unsigned int

//DS1302宏定義部分

#define WRITE_SECOND 0x80 //寫秒地址

#define WRITE_MINUTE 0x82 //寫分地址

#define WRITE_HOUR 0x84 //寫時地址

#define WRITE_DATE 0x86 //寫日地址

#define WRITE_MONTH 0x88 //寫月地址

#define WRITE_WEEK 0x8A //寫周地址

#define WRITE_YEAR 0x8C //寫年地址

#define WRITE_PROTECT 0x8E //寫保護

#define READ_SECOND 0x81 //讀秒地址

#define READ_MINUTE 0x83 //讀分地址

#define READ_HOUR 0x85 //讀時地址

#define READ_DATE 0x87 //讀日地址

#define READ_MONTH 0x89 //讀月地址

#define READ_WEEK 0x8B //讀周地址

#define READ_YEAR 0x8D //讀年地址

sbit ACC_7 = ACC^7; //位尋址寄存器定義

sbit SCLK = P3^3; // DS1302時鐘信號6腳

sbit DIO= P3^4; // DS1302數據信號5腳

sbit CE = P3^5; // DS1302片選7腳

uchar xdata time[7]={23,1,3,2,5,6,7}; //依次存放年月日周時分秒,十進制表示,2023年1月3日周2 5:6:7

//地址、數據發送子程序

void Write1302 ( unsigned char 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; 

          } 

          CE = 0;

}

//數據讀取子程序

unsigned char Read1302 ( unsigned char 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; 

          }         

          CE=0; 

          dat1=ACC; 

          dat2=dat1/16;                                                      //數據進制轉換              

          dat1=dat1%16;                                                      //十六進制轉十進制  

          dat1=dat1+dat2*10; 

          return (dat1);

}

//初始化 DS1302

void InitialDS1302(void)

{

//初始化為130424日周3 232756秒  注意,Write1302函數第二個參數16進制,需進行十進制到十六進制轉碼,如參數里:秒0X56表示56秒,0X12表示12月,0x23表示23時等,以下已轉碼。

          Write1302 (WRITE_PROTECT,0X00);                  //禁止寫保護  

          Write1302 (WRITE_SECOND,time[6]/10*16+time[6]%10);                   //秒位初始化  

          Write1302 (WRITE_MINUTE,time[5]/10*16+time[5]%10);                  //分鐘初始化  

          Write1302 (WRITE_HOUR,time[4]/10*16+time[4]%10);                    //時位初始化

          Write1302 (WRITE_YEAR,time[0]/10*16+time[0]%10);                    //年位初始化

Write1302 (WRITE_MONTH,time[1]/10*16+time[1]%10); //月位初始化

Write1302 (WRITE_DATE,time[2]/10*16+time[2]%10); //日位初始化

Write1302 (WRITE_WEEK,time[3]/10*16+time[3]%10); //星期位初始化

Write1302 (WRITE_PROTECT,0x80);                 //允許寫保護

}

//讀取年月日周時分秒

void read_time(void)

{

time[0]=Read1302(READ_YEAR); //取年

time[1]=Read1302(READ_MONTH); //取月

time[2]=Read1302(READ_DATE); //取日

time[3]=Read1302(READ_WEEK); //取周

time[4]=Read1302(READ_HOUR); //取時

time[5]=Read1302(READ_MINUTE); //取分

time[6]=Read1302(READ_SECOND); //取

}

//// 運行 read_nyrsfm()子函數讀取數組time[]顯示即可

說明:

●如果要讀取時間,就調用read_time()子程序,讀取的時鐘數據存入time[]數組;

●如果要設置時間,就調用InitialDS1302()子程序,要設置的時鐘數據預先存入time[]數組。

●InitialDS1302()子程序不能每次開機運行,只需在修改時間時運行即可。

以上電路和程序已經過實踐驗證,可正常運行。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 實時時鐘
    +關注

    關注

    4

    文章

    211

    瀏覽量

    65387
  • 微處理器
    +關注

    關注

    11

    文章

    2149

    瀏覽量

    81672
  • DS1302
    +關注

    關注

    8

    文章

    448

    瀏覽量

    50309
  • 電流充電器
    +關注

    關注

    0

    文章

    7

    瀏覽量

    5989
  • 紐扣電池
    +關注

    關注

    2

    文章

    107

    瀏覽量

    7494
收藏 人收藏

    評論

    相關推薦

    實時時鐘DS1302程序列子

    實時時鐘DS1302程序列子     /*********************************************************************//*
    發表于 07-08 16:26 ?142次下載

    實時時鐘電路DS1302的原理及應用

    實時時鐘電路DS1302的原理及應用 現在流行的串行時鐘電路很多,如DS1302、
    發表于 01-01 00:19 ?5259次閱讀
    實時<b class='flag-5'>時鐘</b><b class='flag-5'>電路</b><b class='flag-5'>DS1302</b>的原理及應用

    ds1302時鐘電路

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

    ds1302時鐘程序詳解,ds1302程序流程圖(C程序)

    ds1302時鐘程序詳解 DS1302 的控制字如圖2所示??刂谱止澋淖罡哂行?位7)必須是邏輯1,如果它為0,則不能把數據寫入DS1302
    發表于 05-17 13:22 ?8.8w次閱讀
    <b class='flag-5'>ds1302</b><b class='flag-5'>時鐘</b><b class='flag-5'>程序</b>詳解,<b class='flag-5'>ds1302</b><b class='flag-5'>程序</b>流程圖(C<b class='flag-5'>程序</b>)

    完整LCD和DS1302時鐘程序

    完整LCD和DS1302時鐘程序,用1602顯示
    發表于 02-23 16:32 ?26次下載

    基于DS1302芯片時鐘設計

    基于DS1302芯片時鐘設計
    發表于 03-01 12:21 ?11次下載

    DS1302芯片的使用,時鐘芯片DS1302功能匯總

    DS1302大家都知道他是時鐘芯片,知道了原理肯定想知道功能和操作方法,這篇文章就是主要來說DS1302芯片的功能以及
    發表于 10-19 10:43 ?9120次閱讀

    DS1302時鐘芯片調試經驗,奉上調試時鐘芯片DS1302程序

     時鐘芯片DS1302目前得到廣泛的應用,但是DS1302的調試還是很有難度的。這篇文章就來說說DS1302
    發表于 10-19 11:12 ?1.1w次閱讀

    Arduino控制DS1302時鐘芯片ds1302引腳圖及功能和應用電路

    本文開始介紹了ds1302引腳圖及功能與DS1302封裝,其次介紹了兩款DS1302應用電路與時序說明,最后介紹了Arduino控制DS1302
    發表于 05-14 14:39 ?5.1w次閱讀
    Arduino控制<b class='flag-5'>DS1302</b><b class='flag-5'>時鐘</b><b class='flag-5'>芯片</b>(<b class='flag-5'>ds1302</b>引腳圖及功能和應用<b class='flag-5'>電路</b>)

    時鐘芯片DS1302的原理及使用

    一.描述DS1302時鐘芯片是由美國DALLAS公司推出的具有涓細電流充電能力的低功耗實時時鐘芯片。它可以對年、月、日、周、時、分、秒進行計
    發表于 01-17 13:03 ?28次下載
    <b class='flag-5'>時鐘</b><b class='flag-5'>芯片</b><b class='flag-5'>DS1302</b>的原理及使用

    DS1302時鐘芯片的使用

    DS1302時鐘芯片的使用帶你寫一個小時鐘DS1302地址字節控制字節邏輯有效位必須是邏輯1,若為0,則數據就寫不進去
    發表于 01-18 09:01 ?3次下載
    <b class='flag-5'>DS1302</b><b class='flag-5'>時鐘</b><b class='flag-5'>芯片</b>的使用

    實驗18:DS1302時鐘

    實驗18:DS1302時鐘程序
    發表于 01-18 09:08 ?28次下載
    實驗18:<b class='flag-5'>DS1302</b><b class='flag-5'>時鐘</b>

    基于DSP的DS1302芯片使用的程序資料

    基于DSP的DS1302芯片使用的程序,可將時鐘顯示在HS12864-15C上
    發表于 03-14 16:09 ?9次下載

    介紹DS1302時鐘芯片電路程序

    DS1302是由美國DALLAS公司推出的具有涓細電流充電能力的低功耗實時時鐘芯片。它可以對年、月、日、周、時、分、秒進行計時,并且具有閏年補償等多種功能。
    的頭像 發表于 06-13 16:16 ?1834次閱讀
    介紹<b class='flag-5'>DS1302</b><b class='flag-5'>時鐘</b><b class='flag-5'>芯片</b>的<b class='flag-5'>電路</b>和<b class='flag-5'>程序</b>

    DS1302時鐘芯片電路原理

    DS1302時鐘芯片內部的時鐘電路原理是基于晶振的振蕩原理。晶振是一種利用晶體的共振特性產生穩定的振蕩信號的元件。在
    的頭像 發表于 11-18 09:40 ?1894次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>