堅定航行篇a6000開發(fā)板ds1302實現(xiàn)萬年歷_第1頁
堅定航行篇a6000開發(fā)板ds1302實現(xiàn)萬年歷_第2頁
堅定航行篇a6000開發(fā)板ds1302實現(xiàn)萬年歷_第3頁
堅定航行篇a6000開發(fā)板ds1302實現(xiàn)萬年歷_第4頁
堅定航行篇a6000開發(fā)板ds1302實現(xiàn)萬年歷_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、愛普A600051 開發(fā)板堅定航行篇修訂歷史:本手冊屬于愛普電子科技,任何人過我公司同意、或者修改本手冊都將承擔。1日期版本號修訂人修訂內(nèi)容2013.03.081.00(愛普團隊)創(chuàng)建DS1302 實現(xiàn)萬年歷項目說明:用 DS1302 計時,包括年月日,時分秒。且時間是一直運行的。將該時間顯示到數(shù)碼管上。開發(fā)板斷電以后,要保證時間依然在運行。此項目練習的目的:(應掌握如下知識點)學習 DS1302 時鐘學習看時序圖。的操作。(3)學習 C 語言結構體的用法。完整代碼:#include #include DS1302_drv.h #include digitron_drv.h/*初始時間數(shù)組 1

2、3 年 01 月 02 日 11 點 14 分 00 秒*/u8 gSetTime=0 x13,0 x01,0 x02,0 x11,0 x14,0 x00;Struct/定義一個結構體,該結構體的成員都是和時間有關8 Seconds;8 Minutes;8 Hour;8 Date;8 Month; 8 Year;/ 秒/ 分/ 時/ 日/ 月/ 年u u u u ugsTimeCalendar;/*顯示時間*/void DisplayTime(void)DigShowNumber(7,gsTimeCalendar.Hour4,0); DigShowNumber(6,gsTimeCalendar

3、.Hour&0 x0f,1); DigShowNumber(5,gsTimeCalendar.Minutes4,0); DigShowNumber(4,gsTimeCalendar.Minutes&0 x0f,1); DigShowNumber(3,gsTimeCalendar.Seconds4,0); DigShowNumber(2,gsTimeCalendar.Seconds&0 x0f,0);/*顯示日期*/2void DisplayCalendar(void)/*最高 2 位固定顯示 20,因為該年的數(shù)據(jù)是 00-99*/DigShowNumber(8,2,0); DigShowNum

4、ber(7,0,0);只支持 2000-2099 年,所以讀到的DigShowNumber(6,gsTimeCalendar.Year4,0); DigShowNumber(5,gsTimeCalendar.Year&0 x0f,1); DigShowNumber(4,gsTimeCalendar.Month4,0); DigShowNumber(3,gsTimeCalendar.Month&0 x0f,1); DigShowNumber(2,gsTimeCalendar.Date4,0); DigShowNumber(1,gsTimeCalendar.Date&0 x0f,0);/*設置時間

5、和日期*/void SetTimeCalendar(void)WriteDS1302(ADR_W_WP,WP_OFF);器進行寫操作/關閉寫保護功能,允許對各寄存WriteDS1302(ADR_W_YEAR,gSetTime0); WriteDS1302(ADR_W_MONTH,gSetTime1); WriteDS1302(ADR_W_DATE,gSetTime2); WriteDS1302(ADR_W_HOUR,gSetTime4);/年/月/日/時WriteDS1302(ADR_W_MINUTES,gSetTime5); /分 WriteDS1302(ADR_W_SECONDS,gSet

6、Time6); /秒 WriteDS1302(ADR_W_WP,WP_ON); / /啟動寫保護功能,進行寫操作對各寄存器/*時間*/void ReadTime(void)gsTimeCalendar.Seconds = ReadDS1302(ADR_R_SECONDS); gsTimeCalendar.Minutes = ReadDS1302(ADR_R_MINUTES); gsTimeCalendar.Hour = ReadDS1302(ADR_R_HOUR);/秒分時/*日期*/void ReadCalendar(void)gsTimeCalendar.Date= ReadDS1302(

7、ADR_R_DATE); gsTimeCalendar.Month= ReadDS1302(ADR_R_MONTH);/日月年gsTimeCalendar.Year= ReadDS1302(ADR_R_YEAR);3/*主函數(shù)*/void main(void)u16 i;SetTimeCalendar();/初始化時間,設置 DS1302 中的時間和日期為初始值while(1)i = 3000;while(i-)/ i 用于切換年月日和時分秒的顯示ReadTime(); DisplayTime();/時間/顯示時間i = 1500;while(i-)ReadCalendar(); Displa

8、yCalendar();/日期/顯示日期根據(jù)“愛普學法:整框圖出步驟實踐中學理論,理解深刻且透徹?!毕葋碚驁D(產(chǎn)品設計的時候稱為硬件架構):需要先看看這個項目和哪些硬件以及工具有關。項目中要求用 DS1302 計一個時間,包括年月日時分秒,然后把這個時間顯示出來。但是考慮到顯示全部數(shù)據(jù)只靠 8 位數(shù)碼管是不夠的,所以把年月日和時分秒來回切換顯示。至于開發(fā)板斷電以后,時間繼續(xù)運行是硬件設計所決定的。4123單 片 機 S T C 8 9 C5 21數(shù) 碼 管時 鐘 模 塊23圖 1理解的思路應該是:往 DS1302 里寫一個時間,DS1302 會從這個時間點開始自動計時,實時把時間讀出來,放到

9、數(shù)碼管上顯示,就做出一個萬年歷了。至于怎么顯示不是本項目的重點,這和時鐘無關,的關鍵就是正確的讀出時間。的步驟就是:第一步,看懂 DS1302 的工作時序;第二步,往 DS1302中寫入一個有效時間;第三步,從 DS1302 中讀出時間;第四步,將讀出的時間用數(shù)碼管顯示出來。很明顯,這個項目的重點三步。5第一步:看懂 DS1302 的工作時序首先需要看一下開發(fā)板電路原理圖的硬件連接方式:備 用 電 池晶 振圖 26本項目用到的 DS1302 時鐘共有 8 個引腳。簡單的看一下。1 腳 8 腳都是接電源,必然需要供電,但是為什么這個要兩個腳供電呢?這點在揚帆起航篇中也介紹過了。因為時鐘是個 1

10、秒鐘就會改變一次的特殊的數(shù)據(jù),如果因為某種情況斷電了,將不再計時,下次再上電的時候必然是一個錯誤的時間。這里另一個電源腳就是接備用電源的,開發(fā)板上接的是一個 3V 的紐扣電池。那么該是如何很好的處理這兩個電源的呢?在手冊中已經(jīng)給出了。VCC2 是主電源,VCC1 是備用電源。當 VCC2VCC1+0.2V,用 VCC2 供電,當 VCC2VCC1,用 VCC1 供電。還有一個 VCC1VCC2VCC1+0.2V 這個區(qū)間手冊沒有介紹,這個臨界區(qū)就說不清是哪個電源供電了,所以設計電路的時候一定要避開這個臨界區(qū)。2,3 腳根據(jù)手冊的說明,接上 32.768KHZ 晶振。單片機工作需要晶振,有晶振才

11、能產(chǎn)生時鐘周期,才可以執(zhí)行代碼,單片機正常工作。同樣的,時鐘的本質(zhì)是計時,它產(chǎn)生的時間也需要基準,這個基準就是來源于晶振。所以想要時鐘計時準的話,一定要選誤差小的晶振。單片機和 DS1302 時鐘通訊需要 3 跟數(shù)據(jù)線,分別是 CLK,RST,IO。用 3 根線就能完成年月日時分秒這么多數(shù)據(jù)的傳輸,還是很神奇的吧。單片機和DS1302 之間的數(shù)據(jù)傳輸要遵守 DS1302 制定的規(guī)則,專業(yè)的講就是時序。下面就來看看時序。7圖 3要按照這個來寫程序通信才會成功,這是一個寫數(shù)據(jù)的時序,看它千萬不要暈,慢慢來分析。每根數(shù)據(jù)線就只有兩種情況或者低電平,它們都是隨著時間而改變的。寫數(shù)據(jù)是通過 I/O 這條

12、線,看到的 I/O 線上有兩種圖形,一個是白色的,一個是帶陰影的。白色的時間段表示可以寫數(shù)據(jù),而帶陰影的表明不可寫。仔細觀察時序圖,在 SCLK 上升沿的時刻(從低電平),I/O 進入數(shù)據(jù)可寫狀態(tài),而 SCLK 下降沿的時刻(從到到低電平),I/O 進入數(shù)據(jù)不可寫狀態(tài)。所有的寫數(shù)據(jù)操作都是在 CE(CE 就是 RST)為的時刻進行的。前面的紅色字體說明了寫數(shù)據(jù)的一個過程。這個過程對時間也是有要求的,可以看到時序圖中有很多的 t 表示時間。這個時間的具體值手冊中也有介紹。圖 48這些時間有的做了最小的限定,有的做了最大的限定。本采用 5V 供電,所以看時間只要看 VCC=5V 的即可。在之前課程

13、中介紹過了,如果單片機接的是 12M 晶振,單片機執(zhí)行一條指令的時間為 1us。而可以看到,DS1302所有的操作時間 MIN 下最大為 1us。也就是說,這些時間只要達到 1us,DS1302就認為合格了,是有效的時間。單片機接 12M 晶振下,在寫這個程序就無需延時了,利用每條語句本身執(zhí)行所要花去的時間(至少 1us),即可滿足時序要求的時間。但是如果單片機接入比 12M 大的晶振,部分語句后面就需要加上延時函數(shù)了。否則是不滿足時序的。寫一下寫數(shù)據(jù)的時序:void TransmitByte(u8 TByte)/TByte 為需要寫入的數(shù)據(jù)u8 i;for(i=0;i= 1;/CLK 變成

14、1,完成上升沿對照著時序圖看這個程序,應該可以看懂的。如果搞定寫的過程,讀的過程就很輕松了。9讀操作時序圖:圖 5u8 ReceiveByte(void)u8 i,RecByte;for(i=0;i= 1;)/從 I/O 數(shù)據(jù)線上讀數(shù)據(jù)RecByte |= 0 x80;/讀到,寫入 1elseRecByte &= 0 x80;/讀到低電平,寫入 0DS1302_CLK = 1;/CLK 完成一個上升沿return(RecByte);/返回讀到的數(shù)據(jù)至此,搞清了 DS1302 的時序,下面的工作就相對輕松了。第二步:往 DS1302 中寫入一個有效數(shù)據(jù)圖 610寫數(shù)據(jù)的過程就寫入兩個字節(jié),第一個

15、是要寄存器地址,第二個是寫入的數(shù)據(jù)。需要的年月日時分秒這些參數(shù),都放在 DS1302 中的各個“房間”里,要先指定這個“房間”,再往里面寫數(shù)據(jù)。void WriteDS1302(uDS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;8 Adr, u8 WByte) /往r 地址中寫入數(shù)據(jù) WByte/RST 開始為低電平/CLK 開始也為低電平/RST 在/先寫地址,才可以進行通訊。TransmitByte(Adr);TransmitByte(WByte);/往剛剛的地址中寫入數(shù)據(jù)DS1302_RST = 0;/寫完一次數(shù)據(jù),RST 拉低。手冊上給出了各個

16、地址對應的數(shù)據(jù):圖 7寫年月日,時分秒,對應的地址分別是 0 x8c,0 x88,0 x86,0 x84,0 x82,0 x80。那就往里面寫一個數(shù)據(jù)。WriteDS1302(0 x8c,gSetTime0); WriteDS1302(0 x88,gSetTime1); WriteDS1302(0 x86,gSetTime2); WriteDS1302(0 x84,gSetTime3); WriteDS1302(0 x82,gSetTime4); WriteDS1302(0 x80,gSetTime5);/年/月/日/時/分/秒這里還有一個要注意的,WP,就是 0 x8e 對應的數(shù)據(jù),WP 是

17、寫保護。考慮到時間不是一個需要經(jīng)常修改的參數(shù),一般校準一次,就不需要再校準了,所以防止程序中意外修改時間參數(shù),就加上了這個 WP 參數(shù),在需要寫時間的時候打開 WP,寫完時間以后,再關上 WP,這樣時間就無法被修改了,這么做是從安全角度考慮的。WriteDS1302(0 x8e,0 x00);/關閉寫保護功能,允許對各寄存器進行寫操作11/*然后寫入時間*/WriteDS1302(0 x8e,0 x80);/啟動寫保護功能,對各寄存器進行寫操作第三步:從 DS1302 中讀出時間圖 8讀數(shù)據(jù)和寫數(shù)據(jù)一樣,同樣是 2 個字節(jié),一個地址,一個數(shù)據(jù)。u8 ReadDS1302(u8 Adr)unsi

18、gned char RByte; DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;TransmitByte(Adr); RByte = ReceiveByte(); DS1302_RST = 0;return(RByte);/先寫地址/從之前的地址中讀數(shù)據(jù)然后根據(jù)這個函數(shù)和圖 7 的地址,讀出需要的年月日。void ReadTime(void)gsTimeCalendar.Seconds = ReadDS1302(0 x81); gsTimeCalendar.Minutes = ReadDS1302(0 x83); gsTimeCalendar.Hou

19、r = ReadDS1302(0 x85);void ReadCalendar(void)gsTimeCalendar.Date = ReadDS1302(0 x87); gsTimeCalendar.Month = ReadDS1302(0 x89); gsTimeCalendar.Year = ReadDS1302(0 x8d);/秒分時/日月年到這里,就讀出了需要的 6 個參數(shù)了,下面就是把它放到數(shù)碼管上12顯示,這個不再是本節(jié)探討的內(nèi)容。這里再介紹一個知識點,結構體。結構體是 C 語言中很常用的一個方法,簡單來講,在本節(jié)中,一共需要6 個參數(shù),年月日,時分秒??梢杂靡粋€數(shù)組或者用 6 個 unsigned char 來定義它們,但是這樣會顯得比較凌亂

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論