做標(biāo)簽網(wǎng)站杭州百度優(yōu)化
本文是關(guān)于DS1302時(shí)鐘芯片的相關(guān)介紹。
文章目錄
- 一、 DS1302時(shí)鐘芯片介紹
- 二、DS1302的使用
- 2.1、DS1302的控制寄存器
- 2.2、DS1302的日歷/時(shí)鐘寄存器
- 2.3、片內(nèi)RAM
- 2.4、DS1302的讀寫時(shí)序
- 三、SPI總線介紹
- 四、DS1302使用示例
一、 DS1302時(shí)鐘芯片介紹
DS1302是DALLAS公司推出的涓流充電時(shí)鐘芯片,內(nèi)部含有一個(gè)實(shí)時(shí)時(shí)鐘/日歷和31字節(jié)靜態(tài)RAM,通過(guò)簡(jiǎn)單的串行接口與單片機(jī)進(jìn)行通信。該芯片是3線SPI接口。
實(shí)時(shí)時(shí)鐘/日歷電路提供秒、分、時(shí)、日、周、月、年的信息,每月的天數(shù)和閏年的天數(shù)可以自動(dòng)調(diào)整。
時(shí)鐘操作通過(guò)AM/PM只是決定采用24或12小時(shí)格式。
DS1302與單片機(jī)之間能簡(jiǎn)單地采用同步串行的方式進(jìn)行通信,僅需要用到三根通信線:
① RES復(fù)位;② I/O數(shù)據(jù)線;③ SCLK串行時(shí)鐘。
時(shí)鐘/RAM的讀/寫數(shù)據(jù)以一個(gè)字節(jié)或多達(dá)31個(gè)字節(jié)的字符組方式通信。
DS1302工作時(shí)功耗很低,保持?jǐn)?shù)據(jù)個(gè)時(shí)鐘信息時(shí)功率小于1mW。
DS1302的雙電源管腳用于主電源和備份電源供應(yīng),Vcc1為可編程涓流充電電源,附加七個(gè)字節(jié)存儲(chǔ)器。它廣泛應(yīng)用與電話、傳真、便攜式儀器以及電池供電的儀器儀表等產(chǎn)品領(lǐng)域下面。
DS1302主要的性能指標(biāo):
- 實(shí)時(shí)時(shí)鐘具有能計(jì)算2100年之前的秒、分、時(shí)、日、周、月、年的能力,還有閏年調(diào)整能力。
- 31個(gè)8位暫存數(shù)據(jù)存儲(chǔ)RAM。
- 串行I/O口方式使得管腳數(shù)量最少。
- 寬范圍工作電壓3.0~5.5V。
- 工作在2.0V時(shí),電流小于300nA。
- 讀/寫時(shí)鐘或RAM數(shù)據(jù)時(shí)有兩種傳送方式:單字節(jié)傳送和多字節(jié)傳送方式。
- 8腳DIP封裝或可選的8腳SOIC封裝根據(jù)表面裝配。
- 簡(jiǎn)單3線接口。
- 與TTL兼容Vcc=5V。
- 可選工業(yè)級(jí)溫度范圍-40~+85。
- 具有涓流充電能力。
- 采用主電源和備份電源雙電源供應(yīng),備份電源可用電池或大容量電容實(shí)現(xiàn)。
DS1302芯片管腳如下:
芯片管腳功能:
管腳名稱 | 管腳標(biāo)號(hào) | 說(shuō)明 |
---|---|---|
Vcc2 | 1 | 備用電源引腳,接入電池?cái)嚯姇r(shí)提供1302電源 |
X1、X2 | 2、3 | 外部晶振引腳,通常需要外接32.768K晶振 |
GND | 4 | 電源地 |
CE | 5 | 使能引腳,也是復(fù)位引腳RST,低電平有效,操作時(shí)置為高電平 |
I/O | 6 | 串行數(shù)據(jù)引腳,數(shù)據(jù)輸出或輸入都使用該引腳,具有三態(tài)功能 |
SCLK | 7 | 串行時(shí)鐘引腳 |
Vcc1 | 8 | 工作電源引腳 |
二、DS1302的使用
操作DS1302的大致過(guò)程,就是將各種數(shù)據(jù)寫入DS1302的寄存器,來(lái)設(shè)置它當(dāng)前的時(shí)間的格式;然后使DS1302開始運(yùn)作,DS1302時(shí)鐘會(huì)按照設(shè)置情況運(yùn)轉(zhuǎn),再用單片機(jī)將其寄存器內(nèi)的數(shù)據(jù)讀出;最后用液晶顯示,就是常說(shuō)的簡(jiǎn)易電子時(shí)鐘。
簡(jiǎn)單來(lái)說(shuō)DS1302的操作分2步,顯示部分屬于液晶顯示的內(nèi)容,不屬于DS1302本身的內(nèi)容。
首先了解下寄存器,DS1302有一個(gè)控制寄存器、12個(gè)日歷/時(shí)鐘寄存器和31個(gè)RAM。
2.1、DS1302的控制寄存器
控制寄存器用于存放DS1302的控制命令字,DS1302的RST引腳回到高電平后寫入的第一個(gè)字節(jié)為控制命令,它用于對(duì)DS1302讀寫過(guò)程進(jìn)行控制,格式如下:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
1 | RAM /CK | A4 | A3 | A2 | A1 | A0 | RD /WR |
- 第7位固定是1。
- 第6位,1表示片內(nèi)RAM;0表示日歷、時(shí)鐘寄存器選擇位。
- 第5到1位,地址位,用于選擇進(jìn)行讀寫的日歷、時(shí)鐘寄存器或片內(nèi)RAM。
- 第0位,1表示RD,即下一步的操作是讀;0表示W(wǎng)R,即下一步的操作是寫。
第5到1位取值代表的RAM或寄存器如下表所示。根據(jù)下表可以知道,如果要讀秒寄存器,命令為1000 0001,如果要寫秒寄存器命令為1000 0000。
寄存器名稱 | D7 1 | D6 RAM/CK | D5 A4 | D4 A3 | D3 A2 | D2 A1 | D1 A0 | D0 RD/WR | 寄存器值 |
---|---|---|---|---|---|---|---|---|---|
秒寄存器 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0或1 | 80H/81H |
分寄存器 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0或1 | 82H/83H |
時(shí)寄存器 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0或1 | 84H/85H |
日寄存器 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0或1 | 86H/87H |
月寄存器 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0或1 | 88H/89H |
星期寄存器 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0或1 | 8AH/8BH |
年寄存器 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0或1 | 8CH/8DH |
寫保護(hù)寄存器 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0或1 | 8EH/8FH |
慢充電寄存器 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0或1 | 90H/91H |
時(shí)鐘突發(fā)模式 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0或1 | BEH/BFH |
RAM0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0或1 | C0H/C1H |
… | 1 | 1 | … | … | … | … | … | 0或1 | … |
RAM30 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0或1 | FCH/FDH |
RAM突發(fā)模式 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0或1 | FEH/FFH |
2.2、DS1302的日歷/時(shí)鐘寄存器
DS1302共有12個(gè)寄存器,其中7個(gè)與日歷、時(shí)鐘有關(guān),存放的數(shù)據(jù)為BCD碼形式,格式如下:
寄存器名稱 | 取值范圍 | D7 | D6~D4 | D3~D0 |
---|---|---|---|---|
秒寄存器 | 00~59 | CH | 秒的十位 | 秒的個(gè)位 |
分寄存器 | 00~59 | 0 | 分的十位 | 分的個(gè)位 |
時(shí)寄存器 | 01 ~ 12或00 ~ 23 | 12或24 | D6-D5-D4 0-A/P-HR | 時(shí)的個(gè)位 |
日寄存器 | 01~31 | 0 | D6-D5D4 0-日的十位 | 日的個(gè)位 |
月寄存器 | 01~12 | 0 | D6-D5-D4 0-0-1或0 | 月的個(gè)位 |
周寄存器 | 01~07 | 0 | D6-D5-D4 0-0-0 | 星期幾 |
年寄存器 | 01~99 | 年的十位 | 年的十位 | 年的個(gè)位 |
寫保護(hù)寄存器 | WP | 0-0-0 | 0-0-0-0 | |
慢充電寄存器 | TCS | TCS-TCS-TCS | DS-DS-RS-RS | |
時(shí)鐘突發(fā)寄存器 |
寄存器說(shuō)明:
-
秒寄存器:低四位為SEC,高的次三位為10SEC。CH位為時(shí)鐘暫停位,當(dāng)CH=1時(shí),時(shí)鐘暫停,CH=0時(shí),時(shí)鐘開始啟動(dòng)。
-
時(shí)寄存器:最高位為12/24小時(shí)的格式選擇位,1表示12小時(shí)格式,0表示24小時(shí)格式;
- 當(dāng)設(shè)置為12小時(shí)顯示格式時(shí),D5的高電平表示上午AM,D5低電平表示下午PM;
- 當(dāng)設(shè)置為24小時(shí)格式時(shí),D5、D4表示小時(shí)的十位。
-
寫保護(hù)寄存器:最高位WP為1時(shí),DS1302只讀不寫,一般在往DS1302寫數(shù)據(jù)之前確保WP為0。
-
慢充電寄存器:TCS位為控制慢充電的選擇,當(dāng)為1010時(shí)才能使慢充電工作。
-
DS為二極管選擇位。DS=01表示選擇一個(gè)二極管,DS=10表示選擇二個(gè)二極管,DS=11或00表示充電器被禁止,與TCS無(wú)關(guān)。
-
RS用于選擇連接在Vcc2和Vcc1之間的電阻,RS=00,充電器被禁止,與TCS無(wú)關(guān),電阻選擇如下:
-
RS位 電阻器 阻值 00 無(wú) 無(wú) 01 R1 2K 10 R2 4K 11 R3 8K
-
從DS1302中讀取出來(lái)的時(shí)鐘數(shù)據(jù)均為BCD碼格式,需要轉(zhuǎn)換為習(xí)慣的十進(jìn)制。
BCD碼是通過(guò)4位二進(jìn)制碼來(lái)表示1位十進(jìn)制中的0~9這10個(gè)數(shù)碼。
二進(jìn)制碼轉(zhuǎn)換為BCD碼的方式為:4位二進(jìn)制碼大于1001時(shí),加6。比如BCD碼00001100的二進(jìn)制碼為:00001100+6=0010010。
如下所示:
十進(jìn)制碼 二進(jìn)制碼 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001
2.3、片內(nèi)RAM
DS1302片內(nèi)有31個(gè)RAM單元,對(duì)片內(nèi)RAM的操作方式有兩種:單字節(jié)方式和多字節(jié)方式。
當(dāng)控制命令字位C0H~FDH時(shí)為單字節(jié)讀寫方式,命令字中的D5 ~ D1用于選擇對(duì)應(yīng)的RAM單元。
當(dāng)控制命令字為FEH、FFH時(shí)為多字節(jié)操作,表中的RAM突發(fā)模式,多字節(jié)操作可一次把所有的RAM單元內(nèi)容進(jìn)行讀寫。FEH為寫操作,FFH為讀操作。
2.4、DS1302的讀寫時(shí)序
在控制指令字輸入后的下一個(gè)SCLK時(shí)鐘的上升沿時(shí),數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位開始。在緊跟8位的控制指令字后的下一個(gè)SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時(shí)從低位到高位。時(shí)序圖如下。
- DS1302通過(guò)SPI串行總線跟單片機(jī)通信,當(dāng)進(jìn)行一次讀寫操作時(shí)最少得讀寫兩個(gè)字節(jié),第一個(gè)字節(jié)是控制字節(jié),就是一個(gè)命令,告訴DS1302是讀還是寫操作,是對(duì)RAM還是CLOCK寄存器操作。第二個(gè)字節(jié)是要讀或要寫的數(shù)據(jù)。
- 單字節(jié)讀寫,只有在SCLK為低電平時(shí),才能將CE置為高電平。所以在進(jìn)行操作之前需要先將SCLK置低電平,然后將CE置為高電平,接著開始在IO上放入要傳送的電平信號(hào)。然后跳變SCLK。數(shù)據(jù)在SCLK上升沿時(shí),DS1302讀寫數(shù)據(jù),在SCLK下降沿時(shí),DS1302放置數(shù)據(jù)到IO上。
上圖是DS1302的三個(gè)時(shí)序:復(fù)位時(shí)序、單字節(jié)寫時(shí)序、單字節(jié)讀時(shí)序。
CE(RST):復(fù)位時(shí)序,在RST引腳產(chǎn)生一個(gè)正脈沖,在整個(gè)讀寫期間,RST保持高電平,一次字節(jié)讀寫完畢后,把RST返回低電平準(zhǔn)備下次讀寫周期。
單字節(jié)讀時(shí)序:讀之前要先對(duì)寄存器寫命令,從最低位開始寫;可以看到,寫數(shù)據(jù)時(shí)在SCLK的上升沿實(shí)現(xiàn),讀數(shù)據(jù)在SCLK的下降沿實(shí)現(xiàn)。在單字節(jié)讀時(shí)序中,寫命令的第八個(gè)上升沿結(jié)束后緊接著的第八個(gè)下降沿就將要讀寄存器的第一位數(shù)據(jù)讀到數(shù)據(jù)線上了。讀出來(lái)的數(shù)據(jù)也是最低位開始。
單字節(jié)寫時(shí)序:兩個(gè)字節(jié)的數(shù)據(jù)配合16個(gè)上升沿將數(shù)據(jù)寫入即可。
需要注意的是:
- 在操作DS1302之前需要關(guān)閉寫保護(hù)。
- 用延時(shí)來(lái)降低單片機(jī)的速度以配合器件時(shí)序。
- DS1302讀出來(lái)的數(shù)據(jù)是BCD碼形式,要轉(zhuǎn)換成常用的10進(jìn)制。
- 讀取字節(jié)之前,將IO設(shè)置為輸入口,讀取完之后,將IO改回輸出口。
- 寫程序時(shí),建議開辟數(shù)組集放置DS1302的一系列數(shù)據(jù),方便擴(kuò)展鍵盤輸入。
三、SPI總線介紹
SPI,Serial Peripheral Interface,串行外圍接口。SPI接口主要應(yīng)用在EEPROM、FLASH、實(shí)時(shí)時(shí)鐘、AD轉(zhuǎn)換器、數(shù)字信號(hào)處理器和數(shù)字信號(hào)解碼器之間。
SPI接口是在CPU和外圍低速器件之間進(jìn)行同步串行數(shù)據(jù)傳輸,在主器件的移位脈沖下,數(shù)據(jù)按位傳輸,高位在前,低位在后,為全雙工通信,數(shù)據(jù)傳輸速度總體來(lái)說(shuō)比I2C總線要快,可達(dá)幾Mbps。
SPI接口以主從方式工作,這種方式下通常有一個(gè)主器件和一個(gè)或多個(gè)從器件,其接口包括以下四種信號(hào):
- MOSI——主器件數(shù)據(jù)輸出,從器件數(shù)據(jù)輸入;
- MISO——主器件數(shù)據(jù)輸入,從器件數(shù)據(jù)輸出;
- SCLK——時(shí)鐘信號(hào),由主器件產(chǎn)生;
- /CE——從器件使能信號(hào),由主器件控制;
SPI接口內(nèi)部硬件如下:
SPI沒有指定的流控制,沒有應(yīng)答機(jī)制確認(rèn)是否接收到數(shù)據(jù)。
四、DS1302使用示例
本示例實(shí)現(xiàn)的功能是:系統(tǒng)運(yùn)行時(shí),數(shù)碼管上顯示電子時(shí)鐘,格式為"xx-xx-xx"。
使用到的資源有數(shù)碼管以及DS1302時(shí)鐘芯片,DS1302時(shí)鐘模塊設(shè)計(jì)如下,DS1302芯片的控制管腳接至單片機(jī)的P3.4~P3.6口上,在芯片的X1、X2管腳處外接了一個(gè)32.768KHz晶振,為時(shí)鐘運(yùn)行提供一個(gè)穩(wěn)定的時(shí)鐘頻率。
軟件實(shí)現(xiàn),按照上面介紹的時(shí)序編寫DS1302的讀、寫時(shí)序代碼,如下:
sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;// DS1302讀時(shí)、分、秒等寄存器的地址命令,依次是秒分時(shí)日月周年
uchar code READ_RTC_ADDR[]={0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
// DS1302寫時(shí)、分秒等寄存器的地址命令,依次是秒分時(shí)日月周年
uchar code WRITE_RTC_ADDR[]={0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};// 時(shí)鐘初始化2023-12-26星期二12點(diǎn)0分0秒,存儲(chǔ)順序按照秒分時(shí)日月周年,
// 存儲(chǔ)格式使用BCD嗎
uchar TIME[7]={0, 0, 0x12, 0x26, 0x12, 0x02, 0x23};// 向DS1302發(fā)送命令,向地址addr寫入數(shù)據(jù)dat
void DS1302Write(uchar addr, uchar dat)
{uchar i;RST=0; // RST拉低_nop_(); // 延時(shí)SCLK=0; // 拉低SCLK,SCLK為低時(shí)才可拉高RST_nop_(); // 延時(shí)RST=1; // RST拉高,整個(gè)讀寫期間保持RST高電平_nop_(); // 延時(shí)for(i=0;i<8;i++) // 從低位開始傳送八位地址addr{DSIO=addr&0x01;addr>>=1;SCLK=1; // 上升沿向DS1302寫數(shù)據(jù)_nop_();SCLK=0; // SCLK拉低為下一位傳送做準(zhǔn)備_nop_();}for(i=0;i<8;i++) // 從低位開始傳送八位數(shù)據(jù)dat{DSIO=dat&0x01;dat>>=1;SCLK=1; // 上升沿向DS1302寫數(shù)據(jù)_nop_();SCLK=0; // SCLK拉低為下一位傳送做準(zhǔn)備_nop_();}// 數(shù)據(jù)傳送結(jié)束,將RST拉低,為下一次傳送做準(zhǔn)備RST=0;_nop_();
}// 從DS1302中讀取地址addr的數(shù)據(jù)dat
uchar DS1302Read(uchar addr)
{uchar i;uchar dat, bi;RST=0; // RST拉低_nop_(); // 延時(shí)SCLK=0; // 拉低SCLK,SCLK為低時(shí)才可拉高RST_nop_(); // 延時(shí)RST=1; // RST拉高,整個(gè)讀寫期間保持RST高電平_nop_(); // 延時(shí)for(i=0;i<8;i++) // 從低位開始傳送八位地址addr{DSIO=addr&0x01;addr>>=1;SCLK=1; // 上升沿向DS1302寫數(shù)據(jù)_nop_();SCLK=0; // SCLK拉低為下一位傳送做準(zhǔn)備_nop_();}_nop_();for(i=0;i<8;i++) // 從低位開始讀取八位數(shù)據(jù)dat{bi=DSIO;dat=(dat>>1)|(bi<<7);SCLK=1; // 上升沿向DS1302寫數(shù)據(jù)_nop_();SCLK=0; // SCLK拉低為下一位傳送做準(zhǔn)備_nop_();}// 數(shù)據(jù)傳送結(jié)束,將RST拉低,為下一次傳送做準(zhǔn)備RST=0;_nop_();// DS1302復(fù)位穩(wěn)定時(shí)間SCLK=1;_nop_();DSIO=0;_nop_();DSIO=1;_nop_();return dat;
}
在讀取之前需要對(duì)DS1302初始化,寫入設(shè)置的時(shí)間,然后可以讀取時(shí)間,代碼如下:
// DS1302初始化
// 1. 在對(duì)DS1302操作之前需要關(guān)閉寫保護(hù),0x8e寫0x00
// 2. 寫入設(shè)置的時(shí)間
// 3. 打開寫保護(hù)功能
void DS1302Init()
{uchar i;DS1302Write(0x8E, 0x00); // 關(guān)閉寫保護(hù)for(i=0;i<sizeof(WRITE_RTC_ADDR);i++) // 設(shè)置時(shí)間{DS1302Write(WRITE_RTC_ADDR[i], TIME[i]);}DS1302Write(0x8E, 0x80); // 打開寫保護(hù)}// 從DS1302中讀取時(shí)間信息
void DS1302ReadTime()
{uchar i;for(i=0;i<sizeof(READ_RTC_ADDR);i++){TIME[i] = DS1302Read(READ_RTC_ADDR[i]);}
}
主程序中,數(shù)據(jù)處理函數(shù)中讀取時(shí)間,并將時(shí)間處理后賦值給顯示數(shù)據(jù)的數(shù)組,如下
void DataPros()
{DS1302ReadTime(); // 首先讀取時(shí)間信息display[0]=smg[TIME[2]/16]; // 時(shí)display[1]=smg[TIME[2]&0x0f];display[2]=0x40; // - 號(hào)display[3]=smg[TIME[1]/16]; // 分display[4]=smg[TIME[1]&0x0f]; display[5]=0x40; // - 號(hào)display[6]=smg[TIME[0]/16]; // 秒display[7]=smg[TIME[0]&0x0f];
}
數(shù)碼管顯示函數(shù)與溫度傳感器使用示例中類似。主函數(shù)如下:
void main()
{DS1302Init(); // 初始化,第一次初始化后可以注釋掉while(1){DataPros();DigDisplay();}
}
第一次初始化仿真結(jié)果:
當(dāng)注釋調(diào)初始化函數(shù)時(shí),會(huì)顯示當(dāng)前時(shí)間,如下: