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