找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4193|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)DS1302的時(shí)鐘源代碼(掉電也能準(zhǔn)確走時(shí))

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:260969 發(fā)表于 2017-12-13 10:08 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式


全部資料51hei下載地址:
DS1302.rar (57.12 KB, 下載次數(shù): 69)

裝上紐扣電池,即使掉電也能準(zhǔn)確走時(shí)
DS1302  51MCU  LCD1602顯示時(shí)鐘
年  月  日  星期
時(shí)  分  秒

硬件部分:(參見(jiàn)郭天祥51實(shí)驗(yàn)板)
LCD1602
D0至D7接51MCU的P0口;

DS1302
RST接P1.1
SCLK接P1.2
SDA接P1.3

按鍵(按鍵一端連接上拉電阻,另一端接地)
S1接 P3.0
S2接 P3.1
S3接 P3.2

軟件部分:
1.對(duì)DS1302內(nèi)部的寄存器地址進(jìn)行宏定義,定義變量以便存儲(chǔ) 年月日 時(shí)分秒 星期
2.編寫(xiě)LCD1602寫(xiě)命令和寫(xiě)數(shù)據(jù)的子程序,編寫(xiě)顯示年月日子程序,時(shí)分秒子程序以及顯示星期的子程序。注意:從DS1302中讀取的數(shù)據(jù)是兩位BCD碼,要注意轉(zhuǎn)換。
3.編寫(xiě)DS1302讀一個(gè)字節(jié)的子程序以及寫(xiě)一個(gè)字節(jié)的子程序,編寫(xiě)DS1302從對(duì)應(yīng)的地址讀和寫(xiě)數(shù)據(jù)的子程序。
4.按鍵分為三個(gè)功能鍵,增大鍵以及減小鍵。

部分程序:
/************************************************
*名稱(chēng):DS1302WriteByte
*說(shuō)明:無(wú)
*功能:寫(xiě)入8bit數(shù)據(jù)
*調(diào)用:delayus()
*輸入:dat:要寫(xiě)入的數(shù)據(jù)
*輸出:無(wú)
*************************************************/
void DS1302WriteByte(uchar dat)
{
    uchar i;
    SCLK=0;//初始時(shí)鐘線置為0
    delayus();
    for(i=0;i<8;i++)//開(kāi)始傳輸8個(gè)字節(jié)的數(shù)據(jù)
      {
         SDA=dat&0x01;//取最低位,注意DS1302的數(shù)據(jù)和地址都是從最低位開(kāi)始傳輸?shù)?br />          delayus();
         SCLK=1;//時(shí)鐘線拉高,制造上升沿,SDA的數(shù)據(jù)被傳輸
         delayus();
         SCLK=0;//時(shí)鐘線拉低,為下一個(gè)上升沿做準(zhǔn)備
         dat>>=1;//數(shù)據(jù)右移一位,準(zhǔn)備傳輸下一位數(shù)據(jù)
      }
}

/************************************************
*名稱(chēng):DS1302ReadByte()
*說(shuō)明:無(wú)
*功能:讀取8bit的數(shù)據(jù)
*調(diào)用:delayus()
*輸入:無(wú)
*輸出:dat:讀取的數(shù)據(jù)
*************************************************/
uchar DS1302ReadByte()
{
   uchar i,dat;
   delayus();
   for(i=0;i<8;i++)
    {
       dat>>=1;//要返回的數(shù)據(jù)右移一位
       if(SDA==1)//當(dāng)數(shù)據(jù)線為高時(shí),證明該位數(shù)據(jù)為1
         dat|=0x80;//要傳輸數(shù)據(jù)的當(dāng)前值置為1,若不是,則為0
       SCLK=1;//拉高時(shí)鐘線
       delayus();
       SCLK=0;//制造下降沿
       delayus();
     }
       return dat;//返回讀取出的數(shù)據(jù)

}

/************************************************
*名稱(chēng):ucharDS1302Read()
*說(shuō)明:先寫(xiě)地址,后讀數(shù)據(jù)
*功能:從cmd相應(yīng)地址中讀取一個(gè)字節(jié)的數(shù)據(jù)
*調(diào)用:DS1302WriteByte(),DS1302ReadByte()
*輸入:cmd:要寫(xiě)入的控制字節(jié)
*輸出:dat:讀取的數(shù)據(jù)
*************************************************/
uchar DS1302Read(uchar cmd)
{

   uchar dat;
   RST=0;//初始CE線置為0
   SCLK=0;//初始時(shí)鐘線置為0
   RST=1;//初始CE置為1,傳輸開(kāi)始
   DS1302WriteByte(cmd);//傳輸命令字,要讀取的時(shí)間/日歷地址   
   dat=DS1302ReadByte();//讀取要得到的時(shí)間/日期
   SCLK=1;//時(shí)鐘線拉高
   RST=0;//讀取結(jié)束,CE置為0,結(jié)束數(shù)據(jù)的傳輸
   return dat;//返回得到的時(shí)間/日期
}

/************************************************
*名稱(chēng):DS1302Write
*說(shuō)明:先寫(xiě)地址,后寫(xiě)數(shù)據(jù)
*功能:向cmd相應(yīng)地址中寫(xiě)一個(gè)字節(jié)的數(shù)據(jù)
*調(diào)用:DS1302WriteByte()
*輸入:cmd:要寫(xiě)入的控制字,dat:要寫(xiě)入的數(shù)據(jù)
*輸出:無(wú)

*************************************************/
void DS1302Write(uchar cmd,uchar dat)
{
   RST=0;//初始CE線置為0
   SCLK=0;//初始時(shí)鐘線置為0
   RST=1;//初始CE置為1,傳輸開(kāi)始
   DS1302WriteByte(cmd);//傳輸命令字,要寫(xiě)入的時(shí)間/日歷地址
   DS1302WriteByte(dat);//寫(xiě)入要修改的時(shí)間/日期
   SCLK=1;//時(shí)鐘線拉高
   RST=0;//讀取結(jié)束,CE置為0,結(jié)束數(shù)據(jù)的傳輸
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:291815 發(fā)表于 2018-6-14 16:10 | 只看該作者
學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

板凳
ID:469380 發(fā)表于 2019-4-16 08:50 | 只看該作者
請(qǐng)問(wèn)掉電走時(shí)體現(xiàn)在程序的哪一部分呢?
回復(fù)

使用道具 舉報(bào)

地板
ID:276089 發(fā)表于 2019-4-17 15:37 | 只看該作者
DS1302準(zhǔn)不了的兄弟  想準(zhǔn)就得上DS3231
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表