摘 要:本文詳細介紹時鐘芯片DS1302底層程序編寫方法,DS1302時序圖運用注意事項。程序代碼已優(yōu)化,作為子程序及函數(shù)可供直接調用。
關鍵詞:時序圖;上升沿;下降沿;寄存器
中圖分類號:TP273.5 文獻標識碼:A 文章編號:1674-7712 (2014) 16-0000-01
DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口一CPU進行同步通信,并可以采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與31天時可以自動調整,且具有閏年補償功能。
一、DS1302時序圖介紹
地址字節(jié)和數(shù)據(jù)字節(jié)的讀取時上升沿有效,而且是由LSB開始讀入。以上是DS1302一個字節(jié)寫入時序圖。第一個字節(jié)是地址字節(jié),第二個字節(jié)是數(shù)據(jù)字節(jié)。RST信號必須拉高,否則數(shù)據(jù)的輸入是效的。換一句話說,RST信號控制數(shù)據(jù)、時間信號輸入的開始和結束。地址字節(jié)和數(shù)據(jù)字節(jié)的讀取時上升沿有效,而且是由LSB開始讀入。
總之,數(shù)據(jù)輸入到DS1302:在通過8個SCLK輸入一個寫命令字后,在下8個上升沿數(shù)據(jù)被輸入到DS1302,數(shù)據(jù)位從LSB開始。注:先在IO上放置數(shù)據(jù),然后產(chǎn)生一個一升沿,多余的SCLK將被忽略。
數(shù)據(jù)從DS1302輸出:在通過8個SCLK輸入一個寫命令字后,在下8個上升沿數(shù)據(jù)從DS1302輸出,數(shù)據(jù)位從LSB開始。注意:第1個被輸出的數(shù)據(jù)位是在寫完命令字的最后一位的第1個下降沿被輸出,多余的SCLK的效果是重復發(fā)送數(shù)據(jù),不產(chǎn)生其它影響。
突發(fā)模式(多字節(jié)操作):多字節(jié)突發(fā)讀取/寫入可用于時鐘,同樣可用于RAM的讀,在命令控制中的位6中指,位5到位1=邏輯1,時鐘的9到31號寄存器沒有數(shù)據(jù)存儲能,RAM的31號也沒有(0-30),突發(fā)模式從地址0的第0位開始數(shù)據(jù),在寫時鐘寄存器時(共8個),必須按照寄存器的順序依次寫,在寫RAM數(shù)據(jù)時,不需要同時寫所有31個寄存器。
二、DS1302底層子程序
#include
#define uchar unsigned char
#define uint unsigned int
sbit sclk=P3^5;//時鐘
sbit io=P3^6;//數(shù)據(jù)
sbit rst = P3^7;//DS1302復位
uchar ds1302_write_add[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//DS1032寫寄存器地址
uchar ds1302_read_add[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //DS1302讀寄存器地址
uchar set[]={50,45,11,15,9,3,14}; //初始化設置秒、分、時、日、月、周、年
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
void write_1302byt(uchar add)//單字節(jié)寫
{
uchar i;
ACC=add; //將要寫入的地址附給加法寄存器ACC
for(i=8;i>0;i--)
{
io=ACC0;//數(shù)據(jù)是從最低位開始傳輸?shù)?/p>
sclk=0; //為制造上升沿脈沖做準備
sclk=1;//形成上升沿脈沖
ACC>>=1;//數(shù)據(jù)右移一位,為下次傳輸做準備
}
}
void write_1302(uchar add,uchar dat)//雙字節(jié)寫
{
rst=0;
sclk=0;
rst=1;
write_1302byt(add); //寫完地址馬上寫數(shù)據(jù)
write_1302byt(dat);
rst=0;
io=0;
}
uchar read_1302byt()//單字節(jié)讀
{
uchar i;
for(i=8;i>0;i--)
{
ACC7=io; //讀出io口數(shù)據(jù)
sclk=1; //為產(chǎn)生下降沿做準備
sclk=0; //形成下降沿
ACC>>=1;//數(shù)據(jù)是從最低位讀取的,移位形成完整數(shù)據(jù)
}
return ACC; //返回讀出的數(shù)據(jù)
}
uchar read_1302(uchar add)
{
uchar vlaue;
rst=0;
sclk=0;
rst=1;
write_1302byt(add); //先寫地址
vlaue=read_1302byt();//再讀出數(shù)據(jù)
rst=0;
io=0; //釋放出io口,這一步非常重要
return vlaue;
}
void init_1302() //初始化DS1302,對時
{
uchar i;
for(i=0;i<7;i++)
{
set[i]=set[i]/10*16+set[i]%10;//轉換成BCD碼
}
write_1302(0x8e,0x00);//開寫保護
for(i=0;i<7;i++)
{
write_1302(ds1302_write_add[i],set[i]);//設置時間
}
write_1302(0x8e,0x80);//關寫保護
}
程序已經(jīng)調試成功,若要更改設置時間,只需修改uchar set[]數(shù)組中的時間;把uchar set[]數(shù)組中所需的數(shù)據(jù)進行處理,可以在不同的顯示設備上顯示出實時時鐘數(shù)據(jù),滿足不同項目的需要。
參考文獻:
[1]雷林均.單片機控制裝置安裝與調試[M].北京:電子工業(yè)出版社,2011.
[2]李文華.單片機應用技術[M].北京:人民郵電出版社,2011.
[3]谷秀榮.單片機原理與應用[M].北京:北京交通大學出版社,2009.
[4]陳海松.單片機應用技能項目化教程[M].北京:電子工業(yè)出版社,2012.
[作者簡介]曾曉春(1968-),男,貴州惠水人,中國農(nóng)業(yè)大學畢業(yè),副教授,主要從事單片機技術應用、變頻器技術應用、電機技術應用研究。