找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13576|回復: 11
收起左側

10分鐘理解DS1302時鐘模塊

  [復制鏈接]
ID:304634 發(fā)表于 2018-4-19 18:43 | 顯示全部樓層 |閱讀模式
1. 思路分析


講解DS1302模塊之前先來看看我們平時使用的電子表或者手機。主要涉及兩個方面,如下圖所示。第一個就是查看時間和日期,比如2014年11月15日09時00分50秒星期六,等等。另外一個方面就是設置或者調整時間/日期信息。


圖1.png

圖1 時鐘信息示意圖


同樣的道理,對于DS1302模塊,我們也是從這兩個方面來類比分析的。第一個,查看日期時間,既然是“查看”也就是從DS1302“獲取”信息,那么與‘讀’ DS1302相關。第二個,設置日期時間,既然是“設置”也就是向DS1302“輸入”信息,那么就是與 ‘寫’ DS1302相關了,或者說修改它的相關信息。好了,分析到這里,根據(jù)以前講過的內容,你應該可以猜到它的大概設計模樣了。既然是‘讀’和‘寫’ DS1302,那么緊跟著的問題就是,怎么讀,從哪里‘讀‘,怎么“寫”,往哪里“寫”?前面講過,對于機器只有0和1,那么很明顯需要把年月日時間等轉成用0和1來表示。根據(jù)前面的經驗通常以一個字節(jié)為單位,F(xiàn)在我們把年月日時分秒星期拆成幾個部分。比如‘秒’,我們就用一個字節(jié)來表示,‘分’也用一個字節(jié)來表示,依此類推,這樣‘秒-分-時-日-月-年’一共需要6個字節(jié),另外加一個‘星期’,一共7個字節(jié)來表示,同時給它們排序。比如地址0的字節(jié)表示‘秒’,地址1的字節(jié)表示’分‘,等等。如下表1所示,注意這個表格只是我們自己的猜測。


表格猜測.png

表1 時鐘信息存儲分布猜測


這樣就好理解了,當我們需要設置時間和日期時,就是往這7個字節(jié)寫入信息,當需要查看時間和日期時,就是去讀取這7個字節(jié)內容即可。如果理解了這個,那么對DS1302的整個分析思路也就清晰了,下面我們就按照這個思路看看具體的操作步驟。


2. 操作步驟分析


這里以"寫"為例,簡單描述這個過程,"讀"的過程與"寫"類似。


(1) 如何確定地址

既然是寫,首先要告訴1302寫到哪一個地址,思考過程與LCD1602類似,那么就給DS1302發(fā)送一個地址命令(CMD)。前面說過,機器之間的溝通通常是以字節(jié)也就是8位為基本單元的,那么就用"0000 0000"來表示1302地址0的字節(jié),用"0000 0001"來表示1302地址1的字節(jié),依此類推。前面做了個猜想,DS1302一共才7個字節(jié)(表格1所示),用8個bit來確定,太浪費了。那么就改進一下,如何改進呢?我們用這個地址命令CMD的bit1~bit5來確定這7個字節(jié),比如當bit1~bit5取00000的時候就表示DS1302地址0的字節(jié),取00001的時候就表示DS1302地址1的字節(jié),依此類推。那么地址命令CMD的bit0,bit6和bit7如何處理?這個bit7也就是最高位固定為1,bit6用來設置選擇CK(時鐘)還是RAM。那么還剩下最后一位bit0如何處理?

(2) 如何確定"寫"還是"讀"

通過上面的分析已經知道了單片機如何告訴1302"寫"的地址。注意,這里只是確定了"地址",DS1302仍然不知道你對這個地址是要"讀"還是"寫"。這樣地址命令CMD的最低位還沒有處理,剛好拿來用作"寫"和"讀"的確定。比如當CMD的bit0取0的時候就表示"寫", 取1的時候就表示"讀"。這樣CMD里面既有地址信息,又有命令信息,所以叫做地址命令字節(jié)。

現(xiàn)在我們來舉個例子,假如往表格1中的地址0寫入數(shù)據(jù)(實際上就是設置秒鐘),那么CMD的bit1~bit5就取00000,最低位bit0確定"讀"還是"寫",很明顯也取"0"。最高位bit7固定為1。剩下bit6用來選擇寫RAM還是CK,我們要寫時鐘相關的信息,很明顯取0,這樣CMD就是1000 0000(0x80). 如果你要"讀"地址0的數(shù)據(jù)(實際上就是查看秒鐘)呢?只需要把CMD的bit0修改為1就可以了。那么CMD就為1000 0001(0x81).


(3) 確定寫入的數(shù)據(jù)


"讀"還是"寫"確定了,地址也確定了,之后再發(fā)送一個字節(jié)的數(shù)據(jù),這個數(shù)據(jù)與秒鐘是如何對應的,就去翻一翻芯片手冊了,這個比較好理解。

3. 突發(fā)模式(Burst Mode)分析


以上操作過程如果正確,就能顯示和設置時間了。但是這里面實際上還有個BUG,舉個例子來說明一下。假如你要記錄一個人跑步的圖像,第一次觀察到他的左腿在前,第二次觀察到他的右腿在前,如果你把這兩次信息結合起來一定會得出錯誤的結論,就是兩條腿都在前面,這不是"跑"這是"跳"。 錯誤的原因是"跑"是一個動態(tài)的過程。同樣的道理,假設現(xiàn)在時間為00分59秒,你先讀"秒",記錄為59秒,然后讀"分"。注意這也是一個動態(tài)的過程,此時00分可能變成01分了,這樣你讀到就是01分,然后把這兩次讀的結果結合起來就是01分59秒。很明顯是不對的,那么如何處理呢?對于"跑",處理過程很簡單,"拍照"就行了,拍完照片然后去觀察照片就不會出錯了,因為照片是"靜止"的。對于DS1302也用同樣"拍照"的處理方法,把"時"分"""秒"等信息"照"下來,然后去讀這張"靜止"的照片就不會出錯了。拍照是一個比較平民化的詞匯,為了體現(xiàn)這個行業(yè)的專業(yè)性,換一個比較難懂的詞匯顯得更高深,叫Burst Mode-突發(fā)模式,實際上就是拍照或者說我們平時用的截屏。


綜合來看,不論是LCD1602,OLED 還是DS18B20,如果仔細去分析的話,它們還是有很多內在共同點的。


上一篇:


10分鐘理解LCD1602液晶顯示模塊
10分鐘理解LCD1602如何顯示自定義字符
10分鐘理解OLED顯示模塊
10分鐘理解DS18B20數(shù)字溫度計模塊


所有參考代碼工具視頻下載百度網盤鏈接:


百度云盤鏈接地址-51HEI分享.rar (180 Bytes, 下載次數(shù): 107)



評分

參與人數(shù) 2黑幣 +15 收起 理由
dingqinhong + 5 很給力!
zkele + 10 贊一個!謝謝分享

查看全部評分

回復

使用道具 舉報

ID:183763 發(fā)表于 2018-4-24 20:16 | 顯示全部樓層
學習了,精彩的文章
回復

使用道具 舉報

ID:64913 發(fā)表于 2018-4-27 00:16 | 顯示全部樓層
人才,我得好好學習學習。
回復

使用道具 舉報

ID:395964 發(fā)表于 2018-9-11 09:41 來自觸屏版 | 顯示全部樓層
感謝樓主分享
回復

使用道具 舉報

ID:388099 發(fā)表于 2018-9-11 13:43 | 顯示全部樓層
鏈接失效了。
回復

使用道具 舉報

ID:378310 發(fā)表于 2018-9-11 14:44 | 顯示全部樓層
大家都好厲害呀。
回復

使用道具 舉報

ID:110903 發(fā)表于 2018-9-11 15:37 | 顯示全部樓層
精彩的文章,值得一看
回復

使用道具 舉報

ID:91165 發(fā)表于 2018-9-18 11:07 | 顯示全部樓層
下載了分享的連接不能用啊,黑幣浪費了
回復

使用道具 舉報

ID:599561 發(fā)表于 2021-2-26 00:53 | 顯示全部樓層
精彩的文章,好厲害呀值得一看
回復

使用道具 舉報

ID:670025 發(fā)表于 2021-3-31 10:17 | 顯示全部樓層
很有用的答案,對DS1302時鐘模塊解釋的很到位,很清晰。
回復

使用道具 舉報

ID:670025 發(fā)表于 2021-3-31 10:18 | 顯示全部樓層
很有用的答案,對DS1302時鐘模塊的解釋很到位,很清晰。
回復

使用道具 舉報

ID:900518 發(fā)表于 2021-4-17 10:29 | 顯示全部樓層
文章很詳細啊  謝謝了  好好學習
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表