0.png (11.22 KB, 下載次數: 79)
下載附件
2017-12-13 12:28 上傳
全部資料51hei下載地址:
DS1302.rar
(57.12 KB, 下載次數: 69)
2017-12-13 10:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
裝上紐扣電池,即使掉電也能準確走時
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,結束數據的傳輸
}
|