單片機課程設(shè)計報告-日歷_第1頁
已閱讀1頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  單片機原理與應用課程設(shè)計</p><p>  題 目: </p><p>  系 部: </p><p>  專 業(yè): </p><p>  班 級:

2、 </p><p>  學生姓名: 學 號: 指導教師: </p><p>  2013年 12 月 22 日</p><p><b>  目 錄</b></p><p>  1 設(shè)計

3、任務與要求1</p><p>  1. 1 設(shè)計任務1</p><p>  1.2 設(shè)計要求1</p><p><b>  2 設(shè)計方案1</b></p><p>  2.1 設(shè)計思路1</p><p>  2.2 芯片選擇1</p><p>  2.

4、2.1 單片機STC89C521</p><p>  2.2.2 DS1302芯片2</p><p>  2.2.3 LED數(shù)碼管2</p><p>  2.2.4 MAX232功能簡介. . . . . . . . . . . . . . . . . . . . . .4</p><p>  2.2.5 74LS174功能簡

5、介. . . . . . . . . . . . . . . . . . . . . 4</p><p>  3 硬件電路設(shè)計5</p><p>  3.1 電路設(shè)計框圖5</p><p>  3.2 主要單元電路的設(shè)計5</p><p>  3.2.1 單片機主控制模塊的設(shè)計5</p><p>  3.

6、2.2 時鐘電路模塊的設(shè)計6</p><p>  3.2.3 顯示模塊電路................................... 6</p><p>  4 主要參數(shù)計算與分析7</p><p>  4.1 計算與分析7</p><p><b>  5 調(diào)試過程7</b></p&g

7、t;<p>  5.1 硬件調(diào)試7</p><p>  5.1.1 硬件電路故障7</p><p>  5.1.2 硬件調(diào)試方法7</p><p>  5.2 軟件調(diào)試8</p><p>  5.2.1 軟件電路故障8</p><p>  5.2.2 軟件調(diào)試方法8</p&g

8、t;<p><b>  6 結(jié)論9</b></p><p><b>  7 附錄10</b></p><p>  7.1 電子日歷PCB圖10</p><p>  7.2 電子日歷實物圖10</p><p>  7.3 元件清單. . . . . . . . . .

9、. . . . . . . . . . . . . . . . . . . .11</p><p>  7.4 源程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12</p><p><b>  參考文獻24</b></p><p>  1 設(shè)計任務與要求<

10、;/p><p>  1. 1 設(shè)計任務</p><p>  本課題實驗主要采用STC89C52芯片和DS1302芯片與LCD1602液晶顯示屏等芯片來完成一個簡易的電子萬年歷。改萬年歷可以顯示年月日、時分秒,并且年月日與時分秒可以通過手動翻頁顯示。</p><p><b>  1.2 設(shè)計要求</b></p><p> 

11、 設(shè)計一個以單片機為核心的電子萬年歷,可實現(xiàn)功能:</p><p>  顯示年、月、日、時、分和秒功能;</p><p>  具備年、月、日、時、分和秒校準功能;</p><p><b>  2 設(shè)計方案</b></p><p><b>  2.1 設(shè)計思路</b></p><

12、;p>  系統(tǒng)分為主控模塊、時鐘電路模塊、溫度檢測模塊、按鍵掃描模塊、LCD顯示模塊、電源電路、復位電路、晶振電路等模塊。主控模塊采用AT89C51單片機,按鍵模塊用四個按鍵,用于調(diào)整時間,顯示模塊采用LCD1602,時鐘電路模塊采用DS1302時鐘芯片實現(xiàn)對時間、日期的操作。</p><p><b>  2.2 芯片選擇</b></p><p>  2.2.

13、1單片機(AT89C52)</p><p>  (一)AT89C52的介紹</p><p>  AT89C52單片機是在一塊芯片中集成了CPU、RAM、ROM、定時器/計數(shù)器和多種功能的I/O接口電路等一臺計算機所需要的基本功能部件,AT89C52單片機內(nèi)包含下列幾個部件:</p><p>  (1) 一個8位CPU;</p><p> ?。?/p>

14、2)一個片內(nèi)振蕩器及時鐘電路;</p><p> ?。?)4K字節(jié)ROM程序存儲器;</p><p> ?。?)128字節(jié)RAM數(shù)據(jù)存儲器;</p><p> ?。?)兩個16位定時器/計數(shù)器;</p><p> ?。?)可尋址64K外部數(shù)據(jù)存儲器和64K外部程序存儲器空間的控制電路;</p><p>  (7)32條

15、可編程的I/O線(四個8位并行I/O端口);</p><p>  (8)一個可編程全雙工串行口;</p><p> ?。?)具有五個中斷源、兩個優(yōu)先級嵌套中斷結(jié)構(gòu)。</p><p> ?。ǘ?AT89C52單片機的部分管腳說明:</p><p>  AT89C52單片機采用40條引腳雙列直插式器件,引腳除5V( 40腳)和電源地( 20腳

16、)外,其功能分為時鐘電路、控制信號、輸入/輸出三大部分:</p><p>  STC89C52引腳圖 STC89C52實物圖</p><p> ?。ㄈ┝硗饨榻B一下輸入輸出引腳(本系統(tǒng)只用到P0、P1、P2口):</p><p>  (1) P0端口[P0.0-P0.7] 是一個8位漏極開路型雙向I/O端口,端口置1(對端口寫1

17、)時作高阻抗輸入端。作為輸出口時能驅(qū)動8個TTL。</p><p>  對內(nèi)部Flash程序存儲器編程時,接收指令字節(jié);校驗程序時輸出指令字節(jié),要求外接上拉電阻。在訪問外部程序和外部數(shù)據(jù)存儲器時,P0口是分時轉(zhuǎn)換的地址(低8位)/數(shù)據(jù)總線,訪問期間內(nèi)部的上拉電阻起作用。</p><p>  (2) P1端口[P1.0-P1.7]是一個帶有內(nèi)部上拉電阻的8位雙向I/0端口。輸出時可驅(qū)動4個T

18、TL。端口置1時,內(nèi)部上拉電阻將端口拉到高電平,作輸入用。</p><p>  對內(nèi)部Flash程序存儲器編程時,接收低8位地址信息。</p><p>  (3) P2端口[P2.0-P2.7]是一個帶有內(nèi)部上拉電阻的8位雙向I/0端口。輸出時可驅(qū)動4個TTL。端口置1時,內(nèi)部上拉電阻將端口拉到高電平,作輸入用。對內(nèi)部Flash程序存儲器編程時,接收高8位地址和控制信息。</p>

19、;<p>  在訪問外部程序和16位外部數(shù)據(jù)存儲器時,P2口送出高8位地址。而在訪問8位地址的外部數(shù)據(jù)存儲器時其引腳上的內(nèi)容在此期間不會改變</p><p>  2.2.2 DS1302芯片</p><p>  DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.

20、5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。</p><p>  圖2.2.2 DS1302引腳功能圖</p><p>  DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2大于Vcc1+0.2V時,Vcc

21、2給DS1302供電。當Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復位/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)傳送的方法。當RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終

22、止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細說明。SCLK為時鐘輸入端。</p><p>  2.2.3 LED數(shù)碼管</p><p>  本課程設(shè)計采用共陽極數(shù)碼管</p><p>  2.2.4 MAX232

23、</p><p>  第一部分是電荷泵電路:由1、2、3、4、5、6腳和4只電容構(gòu)成。功能是產(chǎn)生+12v和-12v兩個電源,提供給RS-232串口電平的需要。</p><p>  第二部分是數(shù)據(jù)轉(zhuǎn)換通道。由7、8、9、10、11、12、13、14腳構(gòu)成兩個數(shù)據(jù)通道。其中13腳(R1IN)、12腳(R1OUT)、11腳(T1IN)、14腳(T1OUT)為第一數(shù)據(jù)通道。8腳(R2IN)、9腳(

24、R2OUT)、10腳(T2IN)、7腳(T2OUT)為第二數(shù)據(jù)通道。</p><p>  TTL/CMOS數(shù)據(jù)從11引腳(T1IN)、10引腳(T2IN)輸入轉(zhuǎn)換成RS-232數(shù)據(jù)從14腳(T1OUT)、7腳(T2OUT)送到電腦DB9插頭;DB9插頭的RS-232數(shù)據(jù)從13引腳(R1IN)、8引腳(R2IN)輸入轉(zhuǎn)換成TTL/CMOS數(shù)據(jù)后從12引腳(R1OUT)、9引腳(R2OUT)輸出。</p>

25、<p>  第三部分是供電:15腳GND、16腳VCC(+5v)。</p><p>  2.2.5 74LS174</p><p>  74LS164 為 8 位移位寄存器,其主要電特性的典型值如下:54/74164  185mW     54/74LS164 80

26、mW </p><p>  當清除端(CLEAR)為低電平時,輸出端(QA-QH)均為低電平。串行數(shù)據(jù)輸入端(A,B)可控制數(shù)據(jù)。當 A、B任意一個為低電平,則禁止新數(shù)據(jù)輸入,在時鐘端(CLOCK)脈沖上升沿作用下Q0為低電平。當A、B有一個為高電平,則另一個就允許輸入數(shù)據(jù),并在CLOCK上升沿作用下決定Q0的狀態(tài)。引腳: </p><p>  CLOCK&#

27、160;:時鐘輸入端 </p><p>  CLEAR: 同步清除輸入端(低電平有效)  </p><p>  A,B :串行數(shù)據(jù)輸入端 </p><p>  QA-QH: 輸出端</p><p><b>  3 硬件電路設(shè)計</b></p&g

28、t;<p>  3.1 電路設(shè)計框圖</p><p>  圖3.1 電路設(shè)計框圖</p><p>  3.2 主要單元電路設(shè)計</p><p>  單元電路的設(shè)計包括主控制系統(tǒng)、時鐘電路模塊、顯示模塊、復位電路和穩(wěn)壓電路的設(shè)計。</p><p>  3.2.1 單片機主控制模塊的設(shè)計</p><p>

29、;  單片機的最小系統(tǒng)如下圖所示,18引腳和19引腳接時鐘電路,XTAL1接外部晶振和30PF電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,XTAL2接外部晶振和30PF電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出.第9引腳為復位輸入端,接上電容,電阻及開關(guān)后夠上電復位電路,20引腳為接地端,40引腳為電源端。</p><p>  圖3.2.1 主控制系統(tǒng)</p><p>  3.2.2

30、 時鐘電路模塊的設(shè)計</p><p>  如圖所示DS1302的引腳排列,其中Vcc1為后備電源,Vcc2為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768KHz晶振。RST是復位/片選線,通過把RST

31、輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。I/O為串行數(shù)據(jù)輸入端(雙向)。SCLK始終是輸入端。</p><p>  圖3.2.2 DS1302的引腳圖</p><p>  3.2.3 顯示模塊電路</p><p>  顯示電路采用3位共陽極LED數(shù)碼管。內(nèi)部的三個數(shù)碼管共用a~dp這8根數(shù)據(jù)線,共有12個引腳,引腳排列依然是從左下角的那個腳(1腳)開始,以逆時針方向

32、依次為1~12腳。數(shù)碼顯示管需要74LS164來驅(qū)動。</p><p>  圖3.2.3 數(shù)碼管與74LS164驅(qū)動電路 </p><p>  4 主要參數(shù)計算與分析</p><p>  4.1 計算與分析</p><p>  本設(shè)計完成了設(shè)計任務的所有要求。單片機采用STC89C52,編譯環(huán)境為keil,程序使用C語音進行編寫。電路設(shè)

33、計使用proteus仿真軟件進行仿真調(diào)試,在Altium Designer上設(shè)計原理圖并繪制PCB圖。設(shè)計硬件制作比較順利。接著,主要是程序的調(diào)試。程序調(diào)試的難點在于設(shè)計的功能模塊過多,程序結(jié)構(gòu)比較復雜,使得調(diào)試起來比較費時間。完成設(shè)計任務的要求1:顯示年月日、時分秒。2:具有可調(diào)整日期和時間功能。</p><p><b>  5 調(diào)試過程</b></p><p>

34、<b>  5.1 硬件調(diào)試</b></p><p>  單片機應用系統(tǒng)的硬件和軟件調(diào)試是交叉相互進行的,但通常是先排除樣機中明顯的硬件故障,尤其是電源故障,才能安全地和仿真器相連,進行綜合調(diào)試。</p><p>  5.1.1 硬件電路故障</p><p> ?。?)錯線、開路、短路</p><p>  解決方法:

35、在畫原理圖時仔細檢查、校正即可解決。</p><p><b> ?。?)元器件損壞</b></p><p>  解決方法:在設(shè)計過程中要明確各元器件的工作條件,嚴格按照元器件正常工況下進行操作,損壞的元器件要及時更換,以免損壞其他元件或影響電路功能的實現(xiàn)。</p><p><b> ?。?)電源故障</b></p&g

36、t;<p>  解決方法:電源必須單獨調(diào)試好以后才能加到系統(tǒng)的各個部件中。當所有部分在該電源作用下都能正常工作,就選用該電源。</p><p>  5.1.2 硬件調(diào)試方法</p><p>  本設(shè)計調(diào)試過程中所用的調(diào)試方法是靜態(tài)測試:</p><p>  在樣機加電之前,首先用萬用表等工具,根據(jù)硬件電器原理圖和裝配圖仔細檢查樣機線路的正確性,并核對

37、元器件的型號、規(guī)格和安裝是否符合要求。第二步是加電后檢查各個插件上引腳的電位,仔細測量各點電位是否正常,尤其應注意單片機插座上的各點電位,若出現(xiàn)較高電壓值,聯(lián)機時將會損壞仿真器。第三步是在不加電情況下,除單片機以外,插上所有的元器件,最后用仿真適配器將樣機的單片機插座和仿真器的仿真接口相連,為聯(lián)機調(diào)試做準備。</p><p><b>  5.2 軟件調(diào)試</b></p>&l

38、t;p>  5.2.1 軟件電路故障</p><p>  設(shè)計軟件部分可能出現(xiàn)這種錯誤的現(xiàn)象:</p><p>  (1)當以斷點或連續(xù)方式運行時,目標系統(tǒng)沒有按規(guī)定的功能進行操作或什么結(jié)果也沒有,這是由于程序轉(zhuǎn)移到意外之處或在某處死循環(huán)所造成的。</p><p>  解決方法:在采用實時多任務操作系統(tǒng)時,錯誤可能在操作系統(tǒng)中,沒有完成正確的任務調(diào)度操作,也

39、可能在高優(yōu)先級任務程序中,該任務不釋放處理器,使CPU在該任務中死循環(huán)。通過對錯誤程序的修改使其實現(xiàn)預期的功能。</p><p><b> ?。?)結(jié)果不正確</b></p><p>  對于本設(shè)計而言,由于采用的是單片機C51語言,在檢查程序時,需要按模塊一步步查詢、修改,直到所有模塊都能正常工作,則顯示結(jié)果會達到預期值。</p><p> 

40、 5.2.2 軟件調(diào)試方法</p><p>  軟件調(diào)試所使用的方法有:計算程序的調(diào)試方法、I/O處理程序的調(diào)試法、綜合調(diào)試法等。</p><p> ?。?)計算程序的調(diào)試方法</p><p>  根據(jù)計算程序的功能,事先準備好一組測試數(shù)據(jù)。調(diào)試時,用仿真器的寫命令,將數(shù)據(jù)寫入計算程序的參數(shù)緩沖單元,然后從計算程序開始運行到結(jié)束,運行的結(jié)果和正確數(shù)據(jù)比較,如果對有

41、的測試數(shù)據(jù)進行測試,都沒有發(fā)生錯誤,則該計算程序調(diào)試成功;如果發(fā)現(xiàn)結(jié)果不正確,改用單步運行方式,即可檢查出錯誤所在。</p><p> ?。?)I/O處理程序的調(diào)試</p><p>  對于A/D轉(zhuǎn)換一類的I/O處理程序是實時處理程序,因此一般用全速斷點運行方式或連續(xù)運行方式進行調(diào)試。</p><p><b> ?。?)綜合調(diào)試</b><

42、/p><p>  綜合調(diào)試一般采用全速斷點運行方式,這個階段的主要工作是排除系統(tǒng)中遺留的錯誤以便提高系統(tǒng)的動態(tài)性能和精度。在綜合調(diào)試的最后階段,應在目標系統(tǒng)的晶振頻率內(nèi)工作,使系統(tǒng)全速運行目標程序,實現(xiàn)了預定功能技術(shù)指標后,便可將軟件固化,然后在運行固化的目標程序,成功后目標系統(tǒng)便可脫機運行。一般情況下,這樣一個應用系統(tǒng)就算研制成功。</p><p><b>  6 結(jié)論</

43、b></p><p>  本次基于單片機STC89C52等器件制作一個電子萬年歷。用單片機進行數(shù)據(jù)控制、處理,送到顯示器顯示,硬件結(jié)構(gòu)簡單,所用元件較少,大大降低了制作成本。軟件采用C語言實現(xiàn),程序簡單可讀寫性強,效率高。與傳統(tǒng)的電路相比,具有方便操作、處理速度快、穩(wěn)定性高、性價比高的優(yōu)點,具有一定的使用價值。</p><p>  剛開始接到課程設(shè)計任務,認為挺簡單的,然而真正開始動

44、手制作時才知道并不是那么簡單,我和同組的組員了無頭緒,在不斷查閱資料,相互討論,以及請教指導老師之后,有了突破性進展;緊接著,我們的設(shè)計有了細致的分工,分工的同時大家經(jīng)常一起探討設(shè)計過程中出現(xiàn)的種種問題,并將不懂的請教老師解答,最終在大家不懈努力下,課程設(shè)計成功完成。</p><p>  實習的結(jié)果是我們不再是約束在理論上,而是鍛煉了我們的動手能力和分析、解決問題的能力,積累經(jīng)驗,培養(yǎng)按部就班,一絲不茍的工作和對

45、所學知識的綜合應用能力,了解了很多課本上學不到的知識,設(shè)計中有好多問題都是因為理論知識不扎實,概念的模糊,使我們明白要把所學到的理論轉(zhuǎn)化為實踐需要一段努力學習的過程;在做一個設(shè)計的過程中,一定要注意理論和實踐同步進行,光有理論知識還是遠遠不夠的,要用實踐去檢驗理論,用理論指導實踐。</p><p>  這樣的實踐環(huán)節(jié)在我的學生生涯是很難得的,也為我們以后步入社會開始工作打下了一定的基礎(chǔ),最后我也要感謝組里的同學們

46、,只有在他們團結(jié)協(xié)作下,本次課程設(shè)計才可以順利進行并實現(xiàn)所有功能,同時我也明白了團結(jié)協(xié)作的重要性。由于本人水平有限,在技術(shù)指標和論文寫作中可能存在一些缺陷,懇請各位老師批評指教。</p><p><b>  7 附錄</b></p><p>  7.1 電子日歷PCB圖</p><p>  7.2 電子日歷實物圖</p>

47、<p><b>  7.3 元件清單</b></p><p>  圖7.3.3 單片機課程設(shè)計器件清單</p><p>  ? 7.4 源程序</p><p>  #include<reg52.h></p><p>  #include<intrins.h></p>

48、<p>  #define uchar unsigned char </p><p>  #define uint unsigned int</p><p>  #define th0 0xf1</p><p>  #define tl0 0xff</p><p>  sbit simuseri_CLK=P2^5;

49、 //用P2^5模擬串口時鐘</p><p>  sbit simuseri_DATA=P2^4; //用P2^4模擬串口數(shù)據(jù)</p><p>  sbit SEG5=P0^0; </p><p>  sbit SEG4=P0^1; </p><p>  sbit SEG3=P0^2; </p>

50、<p>  sbit SEG2=P2^6; </p><p>  sbit SEG1=P2^7; </p><p>  sbit SEG0=P0^7; </p><p>  sbit a0=ACC^0;</p><p>  sbit ss=P1^0;//開始鍵</p><p>  sbit sec=P1^1

51、;//秒加&1302暫停</p><p>  sbit min=P1^2;//分加</p><p>  sbit hr=P1^3;//時加</p><p>  unsigned char temp;</p><p>  unsigned char a=0,flag=0,flag2=0;</p><p>  //

52、code unsigned char dis_code[]={~0xe7,~0xa0,~0x97,~0xb5,~0xf0,~0x75,~0x77,~0xa1,~0xf7,~0xf5}; </p><p>  //共陰數(shù)碼管 0-9 '-' '熄滅‘表</p><p>  unsigned char dis_code[]={0x18,0x5F,0x68 ,0x4A

53、,0x0F,0x8A,0x88,0x5E, 0x08,0x0A};</p><p>  unsigned char l_tmpdisplay[8];</p><p>  uchar second,minute,hour,day,mon,year; </p><p>  uchar ReadValue; </p><p>  sbit

54、DATA=P0^4; //時鐘1302數(shù)據(jù)接口</p><p>  sbit RST=P0^3; //1302復位線</p><p>  sbit SCLK=P0^5; //1302的時鐘線</p><p>  void delay(uint z)//短延時</p><p><b>  {</b><

55、/p><p><b>  uint x,y;</b></p><p>  for(x=z;x>0;x--)</p><p>  for(y=30;y>0;y--);</p><p><b>  }</b></p><p>  void delay1(uint z)//

56、長延時</p><p><b>  {</b></p><p>  for(;z>0;z--);</p><p><b>  }</b></p><p>  //------------------------------------------------------------------

57、----------</p><p>  // 函數(shù)名稱:out_simuseri </p><p>  // 輸入?yún)?shù):data_buf</p><p>  // 輸出參數(shù):無</p><p>  // 功能說明:8位同步移位寄存器,將data_buf的數(shù)據(jù)逐位輸出到simuseri_DATA</p><p>

58、;  //----------------------------------------------------------------------------</p><p>  void out_simuseri(uchar data_buf) //</p><p><b>  { </b></p><p><b>  ucha

59、r i;</b></p><p><b>  i=8;</b></p><p>  ACC=data_buf;</p><p><b>  do</b></p><p><b>  { </b></p><p>  simuseri_CLK

60、=0; </p><p>  simuseri_DATA=a0;</p><p>  simuseri_CLK=1;</p><p>  ACC=ACC>>1;</p><p><b>  }</b></p><p>  while(--i!=0);</p><p&

61、gt;<b>  }</b></p><p>  void SegDisplay()//顯示子程序</p><p><b>  {</b></p><p>  out_simuseri(dis_code[l_tmpdisplay[0]]); </p><p><b>  SEG

62、0=0;</b></p><p><b>  delay(2);</b></p><p><b>  SEG0=1;</b></p><p>  out_simuseri(dis_code[l_tmpdisplay[1]]); </p><p><b>  SEG1=0;&

63、lt;/b></p><p><b>  delay(2);</b></p><p><b>  SEG1=1;</b></p><p>  out_simuseri(dis_code[l_tmpdisplay[2]]&0xf7);</p><p><b>  SEG2=0;

64、</b></p><p><b>  delay(2);</b></p><p><b>  SEG2=1;</b></p><p>  out_simuseri(dis_code[l_tmpdisplay[3]]); </p><p><b>  SEG3=0;</b&

65、gt;</p><p><b>  delay(2);</b></p><p><b>  SEG3= 1;</b></p><p>  out_simuseri(dis_code[l_tmpdisplay[4]]&0xf7); </p><p><b>  SEG4=0;<

66、/b></p><p><b>  delay(2);</b></p><p><b>  SEG4=1;</b></p><p>  out_simuseri(dis_code[l_tmpdisplay[5]]); </p><p><b>  SEG5=0;</b>&

67、lt;/p><p><b>  delay(2);</b></p><p><b>  SEG5=1;</b></p><p><b>  }</b></p><p>  void Write1302(uchar dat) //寫1302子程序,一次寫入一個字節(jié)</p>

68、;<p><b>  {</b></p><p><b>  uchar i; </b></p><p>  SCLK=0; //拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準備</p><p>  delay1(2); //稍微等待,使硬件做好準備</p><p

69、>  for(i=0;i<8;i++) //連續(xù)寫8個二進制位數(shù)據(jù)</p><p><b>  {</b></p><p>  DATA=dat&0x01; //取出dat的第0位數(shù)據(jù)寫入1302</p><p>  delay(2); //稍微等待,使硬件做好準備</p><

70、p>  SCLK=1; //上升沿寫入數(shù)據(jù)</p><p>  delay1(2); //稍微等待,使硬件做好準備</p><p>  SCLK=0; //重新拉低SCLK,形成脈沖</p><p>  dat>>=1; //將dat的各數(shù)據(jù)位右移1位,準備寫入下一個數(shù)據(jù)位<

71、/p><p><b>  }</b></p><p><b>  }</b></p><p>  void WriteSet1302(uchar Cmd,uchar dat) //1302命令字和數(shù)據(jù)寫入程序。</p><p><b>  {</b></p><

72、p>  RST=0; //禁止數(shù)據(jù)傳遞</p><p>  SCLK=0; //確保寫數(shù)居前SCLK被拉低</p><p>  RST=1; //啟動數(shù)據(jù)傳輸</p><p>  delay1(2); //稍微等待,使硬件做好準備</p><p>  Write1302(

73、Cmd); //寫入命令字</p><p>  Write1302(dat); //寫數(shù)據(jù)</p><p>  SCLK=1; //將時鐘電平置于已知狀態(tài)</p><p>  RST=0; //禁止數(shù)據(jù)傳遞</p><p><b>  }</b></p><p

74、>  uchar Read1302(void) // 從1302的DATA線讀取數(shù)據(jù),并返回讀取的數(shù)據(jù)值</p><p><b>  {</b></p><p>  uchar i,dat;</p><p>  delay(2); //稍微等待,使硬件做好準備</p><p>  for(i=0;i

75、<8;i++) //連續(xù)讀8個二進制位數(shù)據(jù)</p><p><b>  {</b></p><p>  dat>>=1; //將dat的各數(shù)據(jù)位右移1位,因為先讀出的是字節(jié)的最低位</p><p>  if(DATA==1) //如果讀出的數(shù)據(jù)是1</p><p>  dat|=0

76、x80; //將1取出,寫在dat的最高位</p><p>  SCLK=1; //將SCLK置于高電平,為下降沿讀出</p><p>  delay1(2); //稍微等待</p><p>  SCLK=0; //拉低SCLK,形成脈沖下降沿</p><p>  delay1(2); //稍微等待</

77、p><p><b>  } </b></p><p>  return dat; //將讀出的數(shù)據(jù)返回</p><p><b>  }</b></p><p>  uchar ReadSet1302(uchar Cmd)//1302讀取數(shù)據(jù)子程序,先寫入讀命令字,然后再讀數(shù)據(jù),并返回讀

78、取的數(shù)據(jù)</p><p><b>  {</b></p><p>  uchar dat;</p><p>  RST=0; //拉低RST</p><p>  SCLK=0; //確保寫數(shù)居前SCLK被拉低</p><p>  RST

79、=1; //啟動數(shù)據(jù)傳輸</p><p>  Write1302(Cmd); //寫入命令字,Cmd是命令字,用于設(shè)置讀取的數(shù)據(jù)地址,和數(shù)據(jù)類型</p><p>  dat=Read1302(); //讀出數(shù)據(jù)</p><p>  SCLK=1; //將時鐘電平置于已知狀態(tài)</p

80、><p>  RST=0; //禁止數(shù)據(jù)傳遞</p><p>  return dat; //將讀出的數(shù)據(jù)返回</p><p><b>  }</b></p><p>  /*void Init_DS1302(void) //寫入1302的初始值子程序,如果使用備用電池,該子程

81、序可以不用。</p><p><b>  { </b></p><p>  WriteSet1302(0x8E,0x00); //根據(jù)寫狀態(tài)寄存器命令字,寫入不保護指令 </p><p>  WriteSet1302(0x80,((0/10)<<4|(0%10))); //根據(jù)寫秒寄存器命令字,寫

82、入秒的初始值</p><p>  WriteSet1302(0x82,((35/10)<<4|(35%10))); //根據(jù)寫分寄存器命令字,寫入分的初始值</p><p>  WriteSet1302(0x84,((0/10)<<4|(0%10))); //根據(jù)寫小時寄存器命令字,寫入小時的初始值</p><p>  //根據(jù)寫狀態(tài)寄存

83、器命令字,寫入不保護指令 </p><p>  WriteSet1302(0x86,((21/10)<<4|(21%10))); //根據(jù)寫秒寄存器命令字,寫入秒的初始值</p><p>  WriteSet1302(0x88,((12/10)<<4|(12%10))); //根據(jù)寫分寄存器命令字,寫入分的初始值</p><p>  

84、WriteSet1302(0x8c,((13/10)<<4|(13%10)));</p><p>  WriteSet1302(0x8E,0x80); //根據(jù)寫狀態(tài)寄存器命令字,寫入不保護指令 </p><p><b>  } */</b></p><p>  unsigned char bcd_h

85、ex_sec(unsigned char temp)</p><p><b>  {</b></p><p>  return ((temp&0x70)>>4)*10+(temp&0x0f);</p><p><b>  }</b></p><p>  unsigned

86、char hex_bcd_sec(unsigned char temp)</p><p><b>  {</b></p><p>  return (((temp/10)<<4)|(temp%10));</p><p><b>  }</b></p><p>  unsigned cha

87、r bcd_hex_min(unsigned char temp)</p><p><b>  {</b></p><p>  return ((temp&0x70)>>4)*10+(temp&0x0f);</p><p><b>  }</b></p><p>  un

88、signed char hex_bcd_min(unsigned char temp)</p><p><b>  {</b></p><p>  return (((temp/10)<<4)|(temp%10));</p><p><b>  }</b></p><p>  unsig

89、ned char bcd_hex_hr(unsigned char temp)</p><p><b>  {</b></p><p>  return ((temp&0x30)>>4)*10+(temp&0x0f);</p><p><b>  }</b></p><p&g

90、t;  unsigned char hex_bcd_hr(unsigned char temp)</p><p><b>  {</b></p><p>  return (((temp/10)<<4)|(temp%10));</p><p><b>  }</b></p><p>  

91、void INTT0()</p><p><b>  {</b></p><p>  TMOD|=0x01;//定時器設(shè)置 16位</p><p><b>  TH0=th0;</b></p><p><b>  TL0=tl0;</b></p><p>

92、;<b>  ET0=1;</b></p><p><b>  TR0=1;</b></p><p><b>  EA=1;</b></p><p><b>  }</b></p><p>  void init1()</p><p&g

93、t;<b>  {</b></p><p>  if(sec==0)</p><p>  { delay(2);</p><p>  if(sec==0)</p><p><b>  { </b></p><p>  while(!sec);</p><p

94、><b>  TR0=0;</b></p><p>  temp=bcd_hex_sec(ReadSet1302(0x81))+1;</p><p>  if(temp==60) temp=0;</p><p>  WriteSet1302(0x80,hex_bcd_sec(temp)|0x80);</p><p>

95、;<b>  TR0=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(min==0)</p><p>  { delay(2);</p><p>  if(min==0)</p

96、><p><b>  { </b></p><p>  while(!min); TR0=0;</p><p>  temp=bcd_hex_min(ReadSet1302(0x83))+1;</p><p>  if(temp==60) temp=0;</p><p>  WriteSet1302(

97、0x82,hex_bcd_min(temp));</p><p><b>  TR0=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(hr==0)</b></p>

98、<p>  { delay(2);</p><p><b>  if(hr==0)</b></p><p><b>  { </b></p><p>  while(!hr);</p><p><b>  TR0=0; </b></p><p&g

99、t;  temp=bcd_hex_hr(ReadSet1302(0x85))+1;</p><p>  if(temp==24) temp=0;</p><p>  WriteSet1302(0x84,hex_bcd_hr(temp));</p><p><b>  temp=0;</b></p><p><b&g

100、t;  TR0=1;</b></p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b></p><p>  void init2()</p><p><b>  {&

101、lt;/b></p><p>  if(sec==0)</p><p>  { delay(2);</p><p>  if(sec==0)</p><p><b>  { </b></p><p>  while(!sec);</p><p><b>  

102、TR0=0;</b></p><p>  temp=bcd_hex_sec(ReadSet1302(0x87))+1;</p><p>  if(temp==32) temp=1;</p><p>  WriteSet1302(0x86,hex_bcd_sec(temp)|0x80);</p><p><b>  TR0

103、=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(min==0)</p><p>  { delay(2);</p><p>  if(min==0)</p><p>

104、<b>  {</b></p><p>  while(!min); TR0=0;</p><p>  temp=bcd_hex_min(ReadSet1302(0x89))+1;</p><p>  if(temp==13) temp=1;</p><p>  WriteSet1302(0x88,hex_bcd_min

105、(temp));</p><p><b>  TR0=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(hr==0)</b></p><p>  { de

106、lay(2);</p><p><b>  if(hr==0)</b></p><p><b>  { </b></p><p>  while(!hr);</p><p><b>  TR0=0; </b></p><p>  temp=bcd_hex

107、_hr(ReadSet1302(0x8d))+1;</p><p>  if(temp==23) temp=0;</p><p>  WriteSet1302(0x8c,hex_bcd_hr(temp));</p><p><b>  temp=0;</b></p><p><b>  TR0=1;</b

108、></p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p&

109、gt;<p>  uchar miao,second;</p><p>  //Init_DS1302(); //將1302初始化,如果1302使用備用電池,這條指令可以不用。</p><p>  //否則每次程序啟動重寫1302,造成備用電池存儲的時間,無法使用。</p><p><b>  INTT0();</b></

110、p><p>  miao=ReadSet1302(0x81);</p><p>  second=miao;</p><p>  WriteSet1302(0x80,second&0x7f);</p><p><b>  while(1)</b></p><p><b>  {

111、</b></p><p>  /*if(ss==0)</p><p>  { delay(2);</p><p><b>  if(ss==0)</b></p><p><b>  { </b></p><p>  while(!ss);TR0=0;</p

112、><p>  WriteSet1302(0x80,0x7f&ReadSet1302(0x81));</p><p><b>  TR0=1;</b></p><p><b>  }</b></p><p><b>  }*/</b></p><p>

113、  /*if(sec==0)</p><p>  { delay(2);</p><p>  if(sec==0)</p><p><b>  { </b></p><p>  while(!sec);</p><p><b>  TR0=0;</b></p>

114、<p>  temp=bcd_hex_sec(ReadSet1302(0x81))+1;</p><p>  if(temp==60) temp=0;</p><p>  WriteSet1302(0x80,hex_bcd_sec(temp)|0x80);</p><p><b>  TR0=1;</b></p><

115、;p><b>  }</b></p><p><b>  }</b></p><p>  if(min==0)</p><p>  { delay(2);</p><p>  if(min==0)</p><p><b>  { </b></

116、p><p>  while(!min); TR0=0;</p><p>  temp=bcd_hex_min(ReadSet1302(0x83))+1;</p><p>  if(temp==60) temp=0;</p><p>  WriteSet1302(0x82,hex_bcd_min(temp));</p><p&g

117、t;<b>  TR0=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(hr==0)</b></p><p>  { delay(2);</p><p>

118、;<b>  if(hr==0)</b></p><p><b>  { </b></p><p>  while(!hr);</p><p><b>  TR0=0; </b></p><p>  temp=bcd_hex_hr(ReadSet1302(0x85))+1;&l

119、t;/p><p>  if(temp==24) temp=0;</p><p>  WriteSet1302(0x84,hex_bcd_hr(temp));</p><p><b>  temp=0;</b></p><p><b>  TR0=1;</b></p><p>&l

120、t;b>  }</b></p><p><b>  } */ </b></p><p><b>  if(ss==0)</b></p><p><b>  {</b></p><p>  delay(20);</p><p><b

121、>  if(ss==0)</b></p><p><b>  {</b></p><p><b>  a++;</b></p><p><b>  if(ss==0)</b></p><p>  { delay(2);</p><p>

122、<b>  if(ss==0)</b></p><p><b>  { </b></p><p>  while(!ss);TR0=0;</p><p>  WriteSet1302(0x80,0x7f&ReadSet1302(0x81));</p><p><b>  TR0=1

123、;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  while(!ss);</p><p>  delay(20);</p>&

124、lt;p>  while(!ss);</p><p><b>  }</b></p><p>  if(flag==1)</p><p><b>  {</b></p><p><b>  init1();</b></p><p><b>

125、;  flag=0;</b></p><p><b>  }</b></p><p>  else if(flag2==1)</p><p><b>  {</b></p><p><b>  init2();</b></p><p><

126、;b>  flag2=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void saomiao() interrupt 1</p><

127、;p><b>  {</b></p><p>  if(a%2==1)</p><p><b>  {</b></p><p><b>  TR0=0;</b></p><p><b>  TH0=th0;</b></p><p&

128、gt;<b>  TL0=tl0;</b></p><p>  ReadValue = ReadSet1302(0x81); </p><p>  second=ReadValue&0x7f;</p><p>  ReadValue = ReadSet1302(0x83); </p><p>  minut

129、e=ReadValue&0x7f; </p><p>  ReadValue = ReadSet1302(0x85); </p><p>  hour=ReadValue&0x3f; </p><p>  l_tmpdisplay[0]=second&0x0f;</p><p>  l_tmpdisplay[1]=s

130、econd/16;</p><p>  l_tmpdisplay[2]=minute&0x0f; </p><p>  l_tmpdisplay[3]=minute/16;</p><p>  l_tmpdisplay[4]=hour&0x0f;</p><p>  l_tmpdisplay[5]=hour/16

131、;</p><p>  SegDisplay();</p><p><b>  flag=1;</b></p><p><b>  TR0=1;</b></p><p><b>  }</b></p><p><b>  else </b

132、></p><p><b>  {</b></p><p><b>  TR0=0;</b></p><p><b>  TH0=th0;</b></p><p><b>  TL0=tl0;</b></p><p>  Re

133、adValue = ReadSet1302(0x87); </p><p>  day=ReadValue&0x7f;</p><p>  ReadValue = ReadSet1302(0x89); </p><p>  mon=ReadValue&0x7f; </p><p>  ReadValue = ReadSe

134、t1302(0x8d); </p><p>  year=ReadValue&0x3f; </p><p>  l_tmpdisplay[0]=day&0x0f;</p><p>  l_tmpdisplay[1]=day/16;</p><p>  l_tmpdisplay[2]=mon&0x0f; &

溫馨提示

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

評論

0/150

提交評論