欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4284|回復: 3
收起左側

51單片機DS1302的時鐘源代碼(掉電也能準確走時)

[復制鏈接]
ID:260969 發表于 2017-12-13 10:08 | 顯示全部樓層 |閱讀模式
0.png

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

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

硬件部分:(參見郭天祥51實驗板)
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.對DS1302內部的寄存器地址進行宏定義,定義變量以便存儲 年月日 時分秒 星期
2.編寫LCD1602寫命令和寫數據的子程序,編寫顯示年月日子程序,時分秒子程序以及顯示星期的子程序。注意:從DS1302中讀取的數據是兩位BCD碼,要注意轉換。
3.編寫DS1302讀一個字節的子程序以及寫一個字節的子程序,編寫DS1302從對應的地址讀和寫數據的子程序。
4.按鍵分為三個功能鍵,增大鍵以及減小鍵。

部分程序:
/************************************************
*名稱:DS1302WriteByte
*說明:無
*功能:寫入8bit數據
*調用:delayus()
*輸入:dat:要寫入的數據
*輸出:無
*************************************************/
void DS1302WriteByte(uchar dat)
{
    uchar i;
    SCLK=0;//初始時鐘線置為0
    delayus();
    for(i=0;i<8;i++)//開始傳輸8個字節的數據
      {
         SDA=dat&0x01;//取最低位,注意DS1302的數據和地址都是從最低位開始傳輸的
         delayus();
         SCLK=1;//時鐘線拉高,制造上升沿,SDA的數據被傳輸
         delayus();
         SCLK=0;//時鐘線拉低,為下一個上升沿做準備
         dat>>=1;//數據右移一位,準備傳輸下一位數據
      }
}

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

}

/************************************************
*名稱:ucharDS1302Read()
*說明:先寫地址,后讀數據
*功能:從cmd相應地址中讀取一個字節的數據
*調用:DS1302WriteByte(),DS1302ReadByte()
*輸入:cmd:要寫入的控制字節
*輸出:dat:讀取的數據
*************************************************/
uchar DS1302Read(uchar cmd)
{

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

/************************************************
*名稱:DS1302Write
*說明:先寫地址,后寫數據
*功能:向cmd相應地址中寫一個字節的數據
*調用:DS1302WriteByte()
*輸入:cmd:要寫入的控制字,dat:要寫入的數據
*輸出:無

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


回復

使用道具 舉報

ID:291815 發表于 2018-6-14 16:10 | 顯示全部樓層
學習了
回復

使用道具 舉報

ID:469380 發表于 2019-4-16 08:50 | 顯示全部樓層
請問掉電走時體現在程序的哪一部分呢?
回復

使用道具 舉報

ID:276089 發表于 2019-4-17 15:37 | 顯示全部樓層
DS1302準不了的兄弟  想準就得上DS3231
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表