DS1302實(shí)時(shí)時(shí)鐘
芯片原理圖:

引腳圖:

需要注意的是,VCC1跟VCC2都外接了電容,只是容量不一樣,同常備用電源VCC2的電容值是VCC1電容值的100倍,這也不難理解,如果斷電,VCC2將能夠提供較長(zhǎng)一段時(shí)間的電力。
VCC1(主電源)-----------過濾濾波作用
VCC2(備用電源)--------斷電時(shí)放電提供電力
X1與X2引腳接上晶振以獲取實(shí)時(shí)時(shí)間

各種不同的引腳有著不一樣的作用,我們?cè)谶@里只介紹了一些特殊引腳,如有所需,請(qǐng)自行查閱官方數(shù)據(jù)手冊(cè)。
DS1302內(nèi)部有8個(gè)寄存器,分別掌管著秒,分,時(shí),天,星期,月,年還有一個(gè)寫入保護(hù)。
我們將依次介紹,首先看原理圖:


寄存器0:

“Bit7”中的“CH”位表示時(shí)鐘開始計(jì)時(shí),1表示時(shí)鐘停止計(jì)時(shí)。
“Bit4~Bit6”表示秒的十位
“BIt0~Bit3”表示秒的個(gè)位
寄存器1:

“Bit4~Bit6”表示分鐘的十位
“Bit0~Bit3”表示分鐘的個(gè)位
寄存器2:

Bit7:
1:代表12小時(shí)制,分上午和下午
2:代表24小時(shí)制
Bit5:當(dāng)表示為12小時(shí)制的時(shí)候:
0:表示上午
1:表示下午
Bit4:與BIt5一起用,表示小時(shí)的十位
寄存器7:

Bit7:寫保護(hù)位,如果是1,則禁止寫入數(shù)據(jù)。
數(shù)據(jù)在時(shí)鐘芯片中存儲(chǔ)形式為”BCD”碼,假如我們要在數(shù)碼管上顯示數(shù)字“59”,那么我們將分別顯示“5”和“9”在不同的數(shù)碼管上,因?yàn)閿?shù)據(jù)中單片機(jī)內(nèi)部是二進(jìn)制形式,也就是說(shuō)要么是0要么是1。

我們?cè)谟?jì)算機(jī)上顯示的數(shù)字其實(shí)對(duì)應(yīng)的有ASCII碼表值。

時(shí)序圖:



上升箭頭指的是DS1302
單字節(jié)寫/讀操作時(shí)序圖:
第一個(gè)字節(jié):通過寫的方式指明對(duì)哪個(gè)寄存器進(jìn)行讀寫操作
第二個(gè)字節(jié):讀寫的數(shù)據(jù)
寫操作:
單片機(jī)----》數(shù)據(jù)-----》`I/O`口----`DS1302`
1
讀操作:
`DS1302`----》數(shù)據(jù)-----》`I/O`口----單片機(jī)
1
寫操作:
寫操作的時(shí)候單片機(jī)向I/O口發(fā)送的數(shù)據(jù)是二進(jìn)制,所以要檢測(cè)I/O口的電平狀態(tài),判斷是低還是高
寫操作是在SCLK低電平時(shí)單片機(jī)將數(shù)據(jù)放在I/O口上,當(dāng)SCLK上升沿時(shí),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ī)對(duì)I/O口的狀態(tài)進(jìn)行判斷,是單片機(jī)讀取DS1302發(fā)送到I/O口的二進(jìn)制數(shù)據(jù) 所以要挨個(gè)對(duì)I/O口的高低進(jìn)行判斷
讀操作是在SCLK高電平時(shí)DS1302放數(shù)據(jù)到I/O上,將SCLK置為低電平時(shí),單片機(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;//返回?cái)?shù)據(jù)
}
總結(jié):
單片機(jī)對(duì)DS1302的讀寫操作
其實(shí)就是單片機(jī)對(duì)I/O口狀態(tài)的判斷
然后進(jìn)行第二條總線的拉高和拉低
————————————————
版權(quán)聲明:本文為CSDN博主「Mr.YunLong」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_44486550/article/details/104610124