DS1302實時時鐘
芯片原理圖:
引腳圖:
需要注意的是,VCC1跟VCC2都外接了電容,只是容量不一樣,同常備用電源VCC2的電容值是VCC1電容值的100倍,這也不難理解,如果斷電,VCC2將能夠提供較長一段時間的電力。
VCC1(主電源)-----------過濾濾波作用
VCC2(備用電源)--------斷電時放電提供電力
X1與X2引腳接上晶振以獲取實時時間
各種不同的引腳有著不一樣的作用,我們在這里只介紹了一些特殊引腳,如有所需,請自行查閱官方數(shù)據(jù)手冊。
DS1302內(nèi)部有8個寄存器,分別掌管著秒,分,時,天,星期,月,年還有一個寫入保護(hù)。
我們將依次介紹,首先看原理圖:
寄存器0:
“Bit7”中的“CH”位表示時鐘開始計時,1表示時鐘停止計時。
“Bit4~Bit6”表示秒的十位
“BIt0~Bit3”表示秒的個位
寄存器1:
“Bit4~Bit6”表示分鐘的十位
“Bit0~Bit3”表示分鐘的個位
寄存器2:
Bit7:
1:代表12小時制,分上午和下午
2:代表24小時制
Bit5:當(dāng)表示為12小時制的時候:
0:表示上午
1:表示下午
Bit4:與BIt5一起用,表示小時的十位
寄存器7:
Bit7:寫保護(hù)位,如果是1,則禁止寫入數(shù)據(jù)。
數(shù)據(jù)在時鐘芯片中存儲形式為”BCD”碼,假如我們要在數(shù)碼管上顯示數(shù)字“59”,那么我們將分別顯示“5”和“9”在不同的數(shù)碼管上,因為數(shù)據(jù)中單片機(jī)內(nèi)部是二進(jìn)制形式,也就是說要么是0要么是1。
我們在計算機(jī)上顯示的數(shù)字其實對應(yīng)的有ASCII碼表值。
時序圖:
上升箭頭指的是DS1302
單字節(jié)寫/讀操作時序圖:
第一個字節(jié):通過寫的方式指明對哪個寄存器進(jìn)行讀寫操作
第二個字節(jié):讀寫的數(shù)據(jù)
寫操作:
單片機(jī)----》數(shù)據(jù)-----》`I/O`口----`DS1302`
1
讀操作:
`DS1302`----》數(shù)據(jù)-----》`I/O`口----單片機(jī)
1
寫操作:
寫操作的時候單片機(jī)向I/O口發(fā)送的數(shù)據(jù)是二進(jìn)制,所以要檢測I/O口的電平狀態(tài),判斷是低還是高
寫操作是在SCLK低電平時單片機(jī)將數(shù)據(jù)放在I/O口上,當(dāng)SCLK上升沿時,DS1302讀取
void DS1302Write(unsigned int reg,unsigned int data)
{
unsigned char detect;
DS1302RST = 1;//只有高電平才能觸發(fā)
for(detect = 0x01;detect!=0;detect<<=1)//寫地址
{
if((detect®)!=0)
{
DS1302DAT = 1;
}
else
{
DS1302DAT = 0;//IO狀態(tài)
}
DS1302CK = 1;
delay();
DS1302CK = 0;
delay();
}
for(detect = 0x01;detect!=0;detect<<1)//寫地址
{
if((detect&data)!=0)
{
DS1302DAT = 1;//IO口狀態(tài)
}
else
{
DS1302DAT = 0;
}
DS1302CK = 1;
dalay();
DS1302CK = 0;
delay();
}
}
讀操作:
讀操作是單片機(jī)對I/O口的狀態(tài)進(jìn)行判斷,是單片機(jī)讀取DS1302發(fā)送到I/O口的二進(jìn)制數(shù)據(jù) 所以要挨個對I/O口的高低進(jìn)行判斷
讀操作是在SCLK高電平時DS1302放數(shù)據(jù)到I/O上,將SCLK置為低電平時,單片機(jī)就可以從I/O口上讀取數(shù)據(jù)
unsigned int DS1302Read(unsigned int addr)//只寫入地址
{
DS1302RST = 1;//打開總開關(guān)
unsigned int detect;
unsigned int dat = 0;
for(detect = 0x01;detect!=0;detect<<=1)//寫地址
{
if((detect&addr)!=0)
{
DS1302DAT = 1;
}
else
{
DS1302DAT = 0;
}
DS1302CK = 1;
delay();
DS1302CK = 0;
delauy();
}
for(detect = 0x01;detect!=0;detect<<=1)
{
if(DS1302DAT!=0)
{
dat|=detect;//
}
DS1302CK = 1;//拉高
delay();
DS1302CK = 0;//拉低完成一位發(fā)送
delay();
}
DS1302RST = 0;//總電平置低完成發(fā)送
return dat;//返回數(shù)據(jù)
}
總結(jié):
單片機(jī)對DS1302的讀寫操作
其實就是單片機(jī)對I/O口狀態(tài)的判斷
然后進(jìn)行第二條總線的拉高和拉低
————————————————
版權(quán)聲明:本文為CSDN博主「Mr.YunLong」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_44486550/article/details/104610124