衡阳派盒市场营销有限公司

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

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

3天內不再提示

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

冬至子 ? 來源:永珂在線 ? 作者:沙鷗520 ? 2023-06-13 16:16 ? 次閱讀

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)

{

//初始化為13年04月24日周3 23時27分56秒 注意,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()子程序不能每次開機運行,只需在修改時間時運行即可。

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

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

    關注

    2

    文章

    253

    瀏覽量

    39971
  • DS1302
    +關注

    關注

    8

    文章

    449

    瀏覽量

    50807
  • ACC
    ACC
    +關注

    關注

    1

    文章

    57

    瀏覽量

    22807
  • 紐扣電池
    +關注

    關注

    2

    文章

    112

    瀏覽量

    7683
收藏 人收藏

    評論

    相關推薦

    實時時鐘DS1302程序列子

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

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

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

    ds1302時鐘電路

    ds1302時鐘電路
    發表于 05-17 13:17 ?8008次閱讀
    <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 ?12次下載

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

    時鐘小編相信大家見怪不怪了,那么時鐘芯片大家知道是什么嗎?今天我們就來談談最常用時鐘芯片ds1302
    發表于 10-18 16:19 ?4.5w次閱讀

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

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

    ds1302時鐘芯片初始化,自動決定DS1302是否需要初始化程序

    ds1302芯片時鐘芯片大家都在問到底需要不需要初始化?這篇文章將會給大家一個程序,可以自動決定DS1302是否需要初始化。
    發表于 10-19 19:19 ?8638次閱讀

    51單片機DS1302實時時鐘驅動程序

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

    DS1302時鐘芯片與液晶1602的程序免費下載

    本文檔的主要內容詳細介紹的是DS1302時鐘芯片與液晶1602的程序免費下載。
    發表于 11-05 17:06 ?34次下載
    <b class='flag-5'>DS1302</b><b class='flag-5'>時鐘</b><b class='flag-5'>芯片</b>與液晶1602的<b class='flag-5'>程序</b>免費下載

    DS1302時鐘芯片的詳細資料和使用詳細說明

    本文檔的主要內容詳細介紹的是DS1302時鐘芯片的詳細資料和使用簡介包括了:DS1302簡介,DS130
    發表于 12-17 08:00 ?0次下載
    <b class='flag-5'>DS1302</b><b class='flag-5'>時鐘</b><b class='flag-5'>芯片</b>的詳細資料和使用詳細說明

    實驗18:DS1302時鐘

    實驗18:DS1302時鐘程序
    發表于 01-18 09:08 ?29次下載
    實驗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時鐘芯片內部的時鐘電路原理是基于晶振的振蕩原理。晶振是一種利用晶體的共振特性產生穩定的振蕩信號的元件。在
    的頭像 發表于 11-18 09:40 ?3027次閱讀
    网上百家乐娱乐平台| 至尊百家乐官网娱乐场开户注册| 百家乐官网塑料扑克牌盒| 百家乐官网变牌桌| 巴黎人百家乐官网的玩法技巧和规则 | 博彩e天上人间| 百家乐官网怎样做弊| 百家乐官网是否能赢| 民宅24方位| 真人百家乐赌博技巧| 百家乐可以作假吗| 大发888下载大发888游戏平台| 新葡京娱乐场| 永仁县| 百家乐官网怎么看大小| 澳门百家乐海洋阿强| 大发888网页登陆| 长沙市| 爱婴百家乐官网的玩法技巧和规则| 百家乐博彩资讯论坛| 百家乐真人游戏| 真钱网络棋牌游戏| 连环百家乐官网怎么玩| 百家乐小型抽水泵| 网上棋牌游戏赚钱| 百家乐官网游戏机博彩正网| 中骏百家乐官网的玩法技巧和规则| 在线百家乐合作| 现金百家乐游戏| 蓝盾百家乐官网具体玩法技巧 | 百家乐官网唯一能长期赢钱的方法| 百家乐娱乐平台官网网| 名仕百家乐的玩法技巧和规则| 百家乐赌场| 百家乐官网规则以及玩法| 全讯网新2代理| 网上百家乐官网赌博犯法吗| 澳门百家乐赌客| 合肥太阳城莱迪广场| 百家乐官网信誉平台开户| 百家乐视频台球游戏|