版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 摘 要</b></p><p> 在當代繁忙的工作與生活中,時間與我們每一個人都有非常親密的關(guān)系,每個人都收到時間的影響,為了更好的利用我們自己的時間,我們必須對時間有一個度量,因此產(chǎn)生了鐘表。隨著社會、科技的發(fā)展,人類得知時間,從觀太陽、擺鐘到現(xiàn)在電子鐘,不斷研究、創(chuàng)新。為了在觀測時間的同時能夠了解其他與人類密切相關(guān)的信息,比如溫度、星期、日期等,電子萬年歷
2、誕生了,它集時間、日期、星期和于一身,具有讀取方便、顯示直觀、功能多樣、電路簡潔等諸多優(yōu)點,符合電子儀器儀表的發(fā)展趨勢,具有廣闊的市場前景。隨著人們生活水平的提高和生活節(jié)奏的加快,對時間的要求越來越高,精準數(shù)字計時的消費需求也是越來越多。</p><p> 該電子萬年歷主要采用AT89S52單片機作為主控核心,由DS1302時鐘芯片提供時鐘、LCD動態(tài)掃描顯示屏顯示,AT89S52單片機具有功耗小,片內(nèi)ROM全
3、都采用FlashROM:能以3V的超低電壓工作,同時也與MCS-51系列單片機完全兼容,該芯片內(nèi)部存儲器為8KB ROM存儲空間,同時具有89C51的功能,且具有在線編程可擦除技術(shù),當在對電路進行調(diào)試時,由于程序的錯誤修改或程序的新增功能需要燒入程序時,不需要對芯片進行多次插拔,所以不會對芯片造成損壞。DS1302時鐘芯片是美國DALLAS公司推出的具有涓流電流充電功能的低功耗實時時鐘芯片,它可以對年、月、日等進行計時,還有閏年補償?shù)裙?/p>
4、能,而且使用壽命長,誤差小,數(shù)字顯示是采用的LCD液晶顯示,可以同時顯示各種需要的信息。此外,該電子萬年歷還具有時間校準等功能。</p><p><b> 目 錄</b></p><p><b> 目 錄2</b></p><p><b> 1 緒 論3</b></p>&
5、lt;p> 1.1 選題背景3</p><p> 1.2 選題目的3</p><p> 1.3 設(shè)計意義3</p><p> 2 設(shè)計要求與方案論證4</p><p> 2.1 設(shè)計要求4</p><p> 2.2 系統(tǒng)基本方案選擇和論證4</p><p> 2
6、.2.1 單片機芯片的選擇和方案論證4</p><p> 2.2.2 顯示模塊選擇方案和論證5</p><p> 2.2.3 時鐘芯片的選擇方案和論證5</p><p> 2.2.4 溫度傳感器的選擇方案與論證5</p><p> 2.3 最終方案確定5</p><p> 3 系統(tǒng)的硬件設(shè)計與實現(xiàn)
7、6</p><p> 3.1 系統(tǒng)硬件概述6</p><p> 3.1.1 系統(tǒng)設(shè)計框圖6</p><p> 3.1.2 系統(tǒng)硬件需求介紹6</p><p> 3.2 系統(tǒng)硬件各模塊作用7</p><p> 3.2.1 控制系統(tǒng)的設(shè)計7</p><p> 3.2.2時鐘電路
8、模塊的設(shè)計7</p><p> 3.2.3 溫度采集模塊設(shè)計9</p><p> 3.2.4 鬧鐘(蜂鳴器電路模塊)10</p><p> 3.2.5 按鍵部分11</p><p> 3.2.6 液晶顯示模塊概述11</p><p> 4.1系統(tǒng)硬件概述12</p><p>
9、; 4.2程序流程框圖12</p><p> 5.1軟件測試14</p><p> 5.2測試結(jié)論14</p><p> 6 設(shè)計總結(jié)與心得體會15</p><p><b> 7參考文摘16</b></p><p><b> 8附錄17</b><
10、/p><p><b> 1.源程序17</b></p><p> 2.系統(tǒng)電路圖27</p><p><b> 1 緒 論</b></p><p><b> 1.1 選題背景</b></p><p> 在社會迅速發(fā)展的今天,單片機的的運用已經(jīng)滲
11、透到我們生活的每個角落,也似乎很難找到哪個領(lǐng)域沒有單片機的足跡。智能儀表、醫(yī)療器械,導彈的導航裝置,智能監(jiān)控、通訊與數(shù)據(jù)傳輸,工業(yè)自動化過程的實時控制和數(shù)據(jù)處理,廣泛使用的各種智能 IC 卡,汽車的安全保障系統(tǒng),動控制領(lǐng)域的機器人,數(shù)碼像機、電視機、全自動洗衣機的控制,電話機以及程控玩具、電子寵物等等,這些都離不開單片機。</p><p> 所以,單片機的學習、開發(fā)與應用將對于現(xiàn)代社會的發(fā)展,經(jīng)濟的繁榮,和提高
12、滿足人類日益增長的物質(zhì)文化需求有著至關(guān)重要的作用。也成就了一批又一智能化控制的工程師和科學家??萍荚桨l(fā)達,智能化的東西就越多。學習單片機是社會發(fā)展的必然需求,也是我們現(xiàn)代高級技工所必須要掌握的技能。</p><p><b> 1.2 選題目的</b></p><p> 隨著人們生活水平的提高和生活節(jié)奏的加快,對時間的要求越來越高,精準數(shù)字計時的消費需求也是越來越
13、多。</p><p> 二十一世紀的今天,最具代表性的計時產(chǎn)品就是電子萬年歷,它是近代世界鐘表界的第三次革命。第一次是擺和擺輪游絲的發(fā)明,相對穩(wěn)定的機械振蕩頻率使鐘表的走時差從分級縮小到秒級,代表性的產(chǎn)品就是帶有擺和擺輪游絲的機械表或鐘。第二次革命是石英晶體振蕩器的應用,發(fā)明了走時精度更高的石英電子鐘表,使鐘表的走時月差從分級縮小到了秒級。第三次革命就是單片機數(shù)碼計時技術(shù)的應用(電子萬年歷),使計時產(chǎn)品的走時日
14、差從分級縮小到了百萬分之一秒,從原有傳統(tǒng)指針計時的方式發(fā)展為人們?nèi)粘8鼮槭煜さ囊构鈹?shù)字顯示式,直觀明了,并增加了全自動日期、星期、溫度以及其他日常附屬信息的顯示功能,他更符合消費者的生活需求,因此,電子萬年歷的出現(xiàn)帶來了鐘表計時業(yè)跨越性的進步。</p><p><b> 1.3 設(shè)計意義</b></p><p> ?。?)在學習了《模擬數(shù)字技術(shù)和數(shù)字電子技術(shù)》和《單
15、片機原理》課程后,為了加深對理論知識的理解,學習理論知識在實際中的運用,培養(yǎng)動手能力和解決實際問題的經(jīng)驗并接觸專用時鐘芯片DS1302,并會用DS1302芯片開發(fā)時鐘模塊,應用到其他系統(tǒng)中去。熟悉protues 和 kiel軟件調(diào)試程序和仿真。</p><p> ?。?)通過實驗提高對單片機的認識。</p><p> ?。?)通過實驗提高焊接、布局、電路檢查能力。</p>
16、<p> ?。?)通過實驗提高軟件調(diào)試能力。</p><p> ?。?)進一步熟悉和掌握單片機的結(jié)構(gòu)及工作原理。</p><p> ?。?)通過課程設(shè)計,掌握以單片機核心的電路設(shè)計的基本方法和技術(shù),了解表關(guān)電路參數(shù)的計算方法。</p><p> ?。?)通過實際程序設(shè)計和調(diào)試,逐步掌握模塊化程序設(shè)計方法和調(diào)試技術(shù)。</p><p>
17、 (8)通過完成一個包括電路設(shè)計和程序開發(fā)的完整過程,使學生了解開發(fā)一單片機應用系統(tǒng)的全過程,為今后從事相應的工作打下堅實的基礎(chǔ)。</p><p> 2 設(shè)計要求與方案論證</p><p><b> 2.1 設(shè)計要求</b></p><p> ?。?)具有年、月、日、星期、時、分、秒等功能。</p><p> (
18、2)具有溫度顯示功能和溫度報警功能。</p><p> (3)具備年、月、日、星期、時、分、秒校準功能。</p><p> 2.2 系統(tǒng)基本方案選擇和論證</p><p> 2.2.1 單片機芯片的選擇和方案論證</p><p> 方案一:采用89C51芯片作為硬件核心,內(nèi)部具有4KB ROM存儲空間,能于3V的超低電壓工作,而且與M
19、CS-51系列單片機完全兼容,但是運用于電路設(shè)計中時由于不具備ISP在線編程技術(shù),當在對電路進行調(diào)試時,由于程序的錯誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r,對芯片的多次查吧會對芯片造成一定的損壞。</p><p> 方案二: 采用AT89C52片內(nèi)ROM全都采用FlashROM:能以3V的超低電壓工作,同時也與MCS-51系列單片機完全兼容,該芯片內(nèi)部存儲器為8KB ROM存儲空間,同時具有89C51的功能,且
20、具有在線編程可擦除技術(shù),當在對電路進行調(diào)試時,由于程序的錯誤修改或程序的新增功能需要燒入程序時,不需要對芯片進行多次插拔,所以不會對芯片造成損壞。</p><p> 綜上所述,所以采用AT89C52作為主控系統(tǒng)。</p><p> 2.2.2 顯示模塊選擇方案和論證</p><p> 方案一:采用LED數(shù)碼管動態(tài)掃描,LED數(shù)碼管價格適中,對于顯示數(shù)字最合適,
21、而且采用動態(tài)掃描法與單片機相連接時,占用的單片機口線少,但所需要的數(shù)碼管數(shù)量太多,焊接困難極易出錯,所以不采用LED數(shù)碼管作為顯示。</p><p> 方案二:采用點陣式數(shù)碼管顯示,點陣式數(shù)碼管是由八行八列的發(fā)光二極管組成,對于顯示文字比較合適,如果用在顯示數(shù)字顯得太浪費,且價格也相對較高,所以也不用此種作為顯示。</p><p> 方案三:采用LCD液晶顯示屏,液晶顯示屏的顯示功能強
22、大,可顯示大量文字,圖形,顯示多樣,清晰可見。</p><p> 綜上所述,我們應該選取LCD液晶顯示屏。</p><p> 2.2.3 時鐘芯片的選擇方案和論證</p><p> 方案一:直接采用單片機定時計數(shù)器提供秒信號,使用程序?qū)崿F(xiàn)年、月、日、星期、時、分、秒技術(shù),采用此種方案雖然減小芯片的使用,節(jié)約成本,但是,實現(xiàn)的時間誤差較大,所以不采用此方案。&l
23、t;/p><p> 方案二:采用DS1302時鐘芯片實現(xiàn)時鐘,DS1302芯片是一種高性能的時鐘芯片,可自動對秒、分、時、日、周、月、年以及閏年補償?shù)哪赀M行計數(shù),而且精度高,位的RAM作為數(shù)據(jù)暫存區(qū),工作電壓2.5V-5.5V范圍內(nèi),2.5V時耗電小于300Ma。</p><p> 綜上所述,我們采用DS1302時鐘芯片實現(xiàn)時鐘。</p><p> 2.2.4 溫
24、度傳感器的選擇方案與論證</p><p> 方案一:使用熱敏電阻作為傳感器,用熱敏電阻與一個相應阻值電阻相串聯(lián)分壓,利用熱敏電阻阻值隨溫度變化而變化的特性,采集這兩個電阻變化的分壓值,并進行A/D轉(zhuǎn)換。。此設(shè)計方案需用A/D轉(zhuǎn)換電路,增加硬件成本而且熱敏電阻的感溫特性曲線并不是嚴格線性的,會產(chǎn)生較大的測量誤差。</p><p> 方案二:采用數(shù)字式溫度傳感器DS18B20,此類傳感器為
25、數(shù)字式傳感器而且僅需要一條數(shù)據(jù)線進行數(shù)據(jù)傳輸,易于與單片機連接,可以去除A/D模塊,降低硬件成本,簡化系統(tǒng)電路。另外,數(shù)字式溫度傳感器還具有測量精度高、測量范圍廣等優(yōu)點。</p><p> 綜上所述,我們采用數(shù)字式溫度傳感器DS18B20。</p><p> 2.3 最終方案確定</p><p> 核心控制體:AT89C52單片機</p><
26、;p> 實時時鐘芯片:DS1302</p><p> 數(shù)字式溫度傳感器:DS18B20</p><p><b> LCD液晶顯示屏</b></p><p> 總共設(shè)有四個按鍵,為節(jié)約資源考慮,每個按鍵都有多種功能。每個按鍵分別標號為A,B,C,D.第一次按下B,C,D都沒有反應,首先按下A鍵可選擇指針位置,B,C鍵為加減鍵,D鍵為
27、鬧鐘設(shè)置鍵。B同時又是鬧鐘報警消除鍵。操作簡單,按鍵靈活。</p><p> 3 系統(tǒng)的硬件設(shè)計與實現(xiàn)</p><p> 3.1 系統(tǒng)硬件概述</p><p> 本電路是由AT89S52單片機作為控制核心,具有在線編程功能,低功耗,能在3V超低壓工作;時鐘電路由DS1302提供,它是一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、時、分、秒等進
28、行計時,具有閏年補償功能,工作電壓為2.5V-5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個用于臨時存放數(shù)據(jù)的RAM寄存器。可產(chǎn)生年、月、日、時、分、秒等,具有使用壽命長,精度高和低功耗等特點,同時具有掉電自動保存功能;溫度的采集由DS18B20構(gòu)成,顯示部分為LCD液晶顯示屏,能夠?qū)崿F(xiàn)字符與數(shù)字同時顯示的功能。</p><p> 3.
29、1.1 系統(tǒng)設(shè)計框圖</p><p> 圖2 系統(tǒng)組成框圖圖</p><p> 3.1.2 系統(tǒng)硬件需求介紹</p><p> AT89C52單片機一片,DS1302實時時鐘芯片一個,DS18B20數(shù)字式溫度傳感器一個,+5V無源蜂鳴器二個,12MHZ晶振一個,多個按鍵和開關(guān),常用電容電阻,連接線,三極管,二極管若干,滑動變阻器一個,USB母口一個。</
30、p><p> 3.2 系統(tǒng)硬件各模塊作用</p><p> 3.2.1 控制系統(tǒng)的設(shè)計</p><p><b> 圖3 主控制系統(tǒng)</b></p><p> 圖3為單片機最小電路,其中晶振頻率可以根據(jù)自己需要進行選擇,范圍在0-24MHZ,常用12MHZ。復位電路得電容一般用10UF,但并不唯一,只要RC所得時間大于
31、兩個機器周期即可。還有其P0內(nèi)部無上拉電阻,所以在執(zhí)行輸出功能時,外部必須接上拉電阻(一般10K即可)。</p><p> P0口有兩個作用,一個接上DS1302的AD0-AD7(雙向地址/數(shù)據(jù)復用總線),控制著DS1302的8位并行數(shù)據(jù)的地址和數(shù)據(jù)的傳輸,另接上液晶的DB0-DB7(數(shù)據(jù)總線)控制著向液晶發(fā)送8位并行數(shù)據(jù)。P1.7接上DS1302的單數(shù)據(jù)線,發(fā)送并接受數(shù)據(jù),地址的操作。P3.0到P3.3作為獨
32、立按鍵口。P2.4口為液晶的數(shù)據(jù)/命令選擇端,1為數(shù)據(jù),二為命令,P2.5口控制液晶讀/寫選擇端,1為讀命令,0為寫操作,P2.6口控制液晶使能信號。對DS1302:P2.0口控制DS1302的片選信號的輸入(CS),P2.1口控制地址選通輸入(AS),P2.2口為讀寫輸入(R/W),P2.3控制著數(shù)據(jù)選通或讀輸入(DS)。P3.2(外部中斷0)接reset管腳,當鬧鐘時間到時便由此觸發(fā)外部中斷0,進入到外部中斷0程序中。P1.0和P1
33、.1口分別控制著蜂鳴器的報警,當溫度、時間到達限定值時會發(fā)出高低電平脈沖,以至發(fā)出報警聲音。</p><p> 3.2.2時鐘電路模塊的設(shè)計</p><p> 圖4示出DS1302的引腳排列,其中VCC1為后備電源,VCC2為主電源,在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行,DS1302由VCC1或VCC2兩者中的較大者供電,當VCC2大于VCC1+0.2V時,VCC2給DS130
34、2供電,當VCC2小于VCC1時候VCC1供電。X1和X2是振蕩源,外接32.768KHz晶振,RST是復位片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段,當RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作,如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)?/p>
35、高阻態(tài),上電運行時,在VCC大于等于2.5V之前,RST必須保持低電平,中有在SCLK為低電平時,才能將RST置為高電平,I/O為串行數(shù)據(jù)輸入端,SCLK始終是輸入端。</p><p> 時鐘電路芯片DS1302引腳圖如圖4所示:</p><p> 圖4 DS1302的引腳圖 </p><p><b> 工作原理如下:</b></
36、p><p> (1) 時鐘芯片DS1302的工作原理:</p><p> DS1302在每次進行讀、寫程序前都必須初始化,先把SCLK端置 “0”,接著把RST端置“1”,最后才給予SCLK脈沖;讀/寫時序如下圖4所示。圖5為DS1302的控制字,此控制字的位7必須置1,若為0則不能把對DS1302進行讀寫數(shù)據(jù)。對于位6,若對程序進行讀/寫時RAM=1,對時間進行讀/寫時,CK=0。位1至
37、位5指操作單元的地址。位0是讀/寫操作位,進行讀操作時,該位為1;該位為0則表示進行的是寫操作??刂谱止?jié)總是從最低位開始輸入/輸出的。表6為DS1302的日歷、時間寄存器內(nèi)容:“CH”是時鐘暫停標志位,當該位為1時,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);當該位為0時,時鐘開始運行。“WP”</p><p> 是寫保護位,在任何的對時鐘和RAM的寫操作之前,WP必須為0。當“WP”為1時,寫保護位防止對任一
38、寄存器的寫操作。</p><p> (2) DS1302的控制字節(jié)</p><p> DS1302的控制字如表1所示??刂谱止?jié)的高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進行寫操作,為1表示進行讀操作,控制字節(jié)總是從最低位開始輸出<
39、;/p><p> 表1 DS1302的控制字格式</p><p> RAM RD</p><p> 1 A4 A3 A2 A1 A0 </p><p> / CK
40、 /WR</p><p> (3) 數(shù)據(jù)輸入輸出(I/O)</p><p> 在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7。如圖5所示:</p><p>
41、; 圖5 DS1302讀/寫時序圖</p><p> (4) DS1302的寄存器</p><p> DS1302有12個寄存器,其中有7個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式,其日歷、時間寄存器及其控制字見表2。</p><p> 表2 DS1302的日歷、時間寄存器</p><p> 此外,DS1302 還有年份
42、寄存器、控制寄存器、充電寄存器、時鐘突發(fā)寄存器及與RAM相關(guān)的寄存器等。時鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。 DS1302與RAM相關(guān)的寄存器分為兩類:一類是單個RAM單元,共31個,每個單元組態(tài)為一個8位的字節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的31個字節(jié),命令控制字為FEH(寫)、FFH(讀)。 </p&g
43、t;<p> 3.2.3 溫度采集模塊設(shè)計</p><p> 如圖6所示。采用數(shù)字式溫度傳感器DS18B20,它是數(shù)字式溫度傳感器,具有測量精度高,電路連接簡單特點,此類傳感器僅需要一條數(shù)據(jù)線進行數(shù)據(jù)傳輸,使用P0.7與DS18B20的I/O口連接加一個上拉電阻,Vcc接電源,Vss接地。</p><p> 當系統(tǒng)在正常顯示狀態(tài)下需要進行調(diào)整時,按一下切換鍵進入按鍵處理
44、中斷程序,并且此時默認的是調(diào)整年,在液晶顯示器上顯示N,此時按加或減按鈕可以進行加減調(diào)整,若再按一下切換鍵,則跳到月上顯示Y,同樣可以調(diào)整加減,同樣的道理,進入日(R)、時(S)、分(F)、秒(M)的調(diào)整,最后再按一下切換鍵時退出中斷程序,星期系統(tǒng)自動的調(diào)整過來。</p><p> 圖6 溫度傳感器部分</p><p> 3.2.4 鬧鐘(蜂鳴器電路模塊)</p><
45、;p> 鬧鐘模塊的接線如圖7所示,蜂鳴器用CS9013三極管驅(qū)動,蜂鳴器用5V的無源蜂鳴器,并接一個發(fā)光二極管作為指示燈,同時在發(fā)光二極管前串接個限流電阻,數(shù)據(jù)端口分別接P1.0,P1.1(由單片機的P1.0,P1.1直接輸出驅(qū)動)。</p><p><b> 圖7 蜂鳴器部分</b></p><p> 3.2.5 按鍵部分</p><
46、p> 按鍵部分如圖8所示,本設(shè)計總的用了四個按扭開關(guān)作為鍵盤,其中一個是鬧鐘復位鍵,另三個中的其中兩個是調(diào)整時間增加、減少的鍵,第三個是切換年、月、日及時、分的顯示狀態(tài)并在所切換的顯示狀態(tài)下配合加減兩個鍵調(diào)整時間。</p><p><b> 圖8 按鍵部分</b></p><p> 3.2.6 液晶顯示模塊概述</p><p>
47、液晶顯示模塊如圖9所示,字符型液晶顯示模塊是一種專門用于顯示字母、數(shù)字、符號等點陣式LCD,本設(shè)計采用16列*2行的字符型LCD1602帶背光的液晶顯示屏。</p><p><b> 圖9 液晶顯示部分</b></p><p><b> 4系統(tǒng)的軟件實現(xiàn)</b></p><p><b> 4.1系統(tǒng)硬件概述
48、</b></p><p> 軟件設(shè)計是本設(shè)計的關(guān)鍵,軟件程序編寫的好壞直接影響著系統(tǒng)運行情況的良好。因本程序涉及的模塊較多,所以程序編寫也采用模塊化設(shè)計,C語言具有編寫靈活、移植方便、便于模塊化設(shè)計的特點,所以本系統(tǒng)的軟件采用C51編寫。</p><p><b> 4.2程序流程框圖</b></p><p><b>
49、 圖6 主程序流程圖</b></p><p> 圖7 時間調(diào)整程序流程圖</p><p><b> 5系統(tǒng)測試</b></p><p><b> 5.1軟件測試</b></p><p> 電子成年歷是多功能的數(shù)字型,可以看當前日期和時間,還有溫度的儀器。電子成年歷功能很多,所以對
50、于它的程序也較為復雜,所以在編寫程序和調(diào)試時出現(xiàn)了相對較多的問題。最后經(jīng)過多次的模塊子程序的修改,一步一步的完成,最終解決了軟件。在軟件的調(diào)試過程中主要遇到的問題如下:</p><p> 加入溫度的程序后,進行修改時間、日期時相應的LCD1602相應位沒有按要求閃動。</p><p> 解決:由于DS18B20是串行通信數(shù)據(jù),只用一個口線傳輸,在處理采集的模擬信號時需要一定的時間,當把
51、萬年歷的程序相接入時,會對延時有很大的影響。所以在調(diào)用溫度子程序時,先關(guān)閉定時器中斷允許,在溫度子程序反回時再打開定時器中斷允許。最終解決了此問題。</p><p><b> 5.2測試結(jié)論</b></p><p> 經(jīng)過測試,本文設(shè)計的電子萬年歷具備顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優(yōu)點,符合電子計時器的發(fā)展趨勢。經(jīng)過多次的反復測試與分析,可以對電路的
52、原理及功能更加熟悉,同時提高了設(shè)計能力與及對電路的分析能力.同時在軟件的編程方面得到更到的提高,對編程能力得到加強.同時對所學的知識得到很大的提高與鞏固。</p><p> 6 設(shè)計總結(jié)與心得體會</p><p> 本系統(tǒng)以AT89C51為核心部件,使用串行時鐘芯片DS1302,實現(xiàn)時間和鬧鐘的功能設(shè)置。通過鍵盤和液晶顯示屏可方便地校對時鐘和設(shè)置鬧鐘時間,本系統(tǒng)基本完成了實用電子鐘的功
53、能,盡量做到了硬件電路簡單穩(wěn)定,減少電磁干擾和其他環(huán)境干擾。在該系統(tǒng)設(shè)計,調(diào)試完成之后,對最后的成功進行分析,同時結(jié)合在調(diào)試過程中出現(xiàn)的錯誤進行綜合分析,總結(jié)在實際系統(tǒng)設(shè)計和調(diào)試過程中的寶貴經(jīng)驗。</p><p> 在系統(tǒng)硬件設(shè)計之前,要結(jié)合當前系統(tǒng)的發(fā)展趨勢和現(xiàn)狀對系統(tǒng)功能進行定位,使系統(tǒng)在實際應用中具有競爭力。該系統(tǒng)最大的特點就是界面友好,走時準確,和現(xiàn)在使用LED顯示數(shù)據(jù)的萬年歷相比,體積更小,可以作為轎
54、車車載顯示裝置,系統(tǒng)采用液晶顯示器,可以使系統(tǒng)應用到更加現(xiàn)代化的地方系統(tǒng)具有溫度檢測功能,可以作為工業(yè)溫度檢測裝置,系統(tǒng)的按鍵輸入功能,可以讀取決策,我們可以通過按鍵發(fā)送指令,控制工業(yè)現(xiàn)場機器的動作,實現(xiàn)遠程控制。</p><p> 可見,該系統(tǒng)本身不僅具有很大的靈活性,友好的界面,方便的可擴展性,同時,在其基礎(chǔ)上的系統(tǒng)市場需求也很客觀,工業(yè)控制的很多場合對時間要求比較嚴格,在實際系統(tǒng)中,系統(tǒng)各裝置按照預定的時
55、間動作,本系統(tǒng)可以很好的滿足這些系統(tǒng)的要求。</p><p> 通過本次課程設(shè)計讓我很好的理解了電子萬年歷的組成部分和工作原理,也更加的激發(fā)了我學習單片機的興趣,使我明白了只有自己親自動手才能真正地深刻理解并掌握課本上的理論知識,把理論付諸于實踐才能牢牢的把課本上的知識變成自己的。本次課程設(shè)計也使我認識到了認真、仔細的態(tài)度在現(xiàn)在的學習和以后的工作中是多么的重要,“細節(jié)決定成敗”,因此,從現(xiàn)在開始就要逐步培養(yǎng)自己
56、的認真負責的心態(tài),并養(yǎng)成注重細節(jié)的良好習慣。</p><p><b> 7參考文摘 </b></p><p> [1] 馮博琴,吳寧主編.微機原理與接口技術(shù)[M].第2版.北京:清華大學出版社,2007</p><p> [2] 康華光主編.模擬電子技術(shù)基礎(chǔ).第5版[M].武漢:高等教育出版社,2005</p><p&
57、gt; [3] 李群芳,張士軍,黃建主編.單片微型計算機[M].第3版.北京:電子工業(yè)出版社,2008</p><p> [4] 馬忠梅主編.單片機C語言應用程序設(shè)計[M].北京:北京航空航天大學出版社,1997</p><p> [5] 公茂法,馬寶甫,孫晨等.單片機人機接口實例集[M].北京:北京航空航天大學出版社,1997</p><p> [6] 胡
58、漢才編.單片機原理及其接口技術(shù)[M].清華大學出版社,2001.</p><p> [7] 馬淑華,高原.電子設(shè)計自動化[M].北京:北京郵電大學出版社,2006:95-131.</p><p> [9]單片機數(shù)據(jù)通信技術(shù)從入門到精通[M].西安:西安電子科技大學出版社,2002:75-90</p><p><b> 8附錄</b><
59、;/p><p><b> 1.源程序</b></p><p> #include <reg52.H> //調(diào)用外函數(shù)//</p><p> #include <ctype.h></p><p> #include <string.h></p><p&
60、gt; #include <stdlib.h></p><p> #include <stdio.h></p><p> #include <math.h></p><p> #include<intrins.h> //包含_nop_()函數(shù)定義的頭文件</p><p> #defi
61、ne uchar unsigned char</p><p> #define uint unsigned int</p><p> uchar LCD_DSY_BUF1[16]={0};</p><p> uchar LCD_DSY_BUF2[16]={0};</p><p> uchar LCD_DSY_BUF3[16],
62、LCD_DSY_BUF4[16];</p><p> //uchar DS18B20_ERROR=0;//傳感器狀態(tài)標志</p><p> //char Current_Temp_Display_Buffer[6]={" "};//當前溫度顯示緩存</p><p> uchar Display_Digit[]={0,0,0,0};//各溫度
63、待顯示的數(shù)位</p><p> #define RAM 0xC0 //片內(nèi)RAM地址</p><p> //DS1302引腳定義</p><p> sbit RST=P1^5;</p><p> sbit IO=P1^7; </p><p> sbit SCLK=P1^6; <
64、/p><p> sbit p2_3=P2^3;</p><p> sbit p2_4=P2^4 ; </p><p> sbit p2_5=P2^5 ;</p><p> sbit p2_6=P2^6;</p><p> sbit ALARM_OPEN=P0^7;
65、</p><p> sbit p0_0=P0^0;</p><p><b> //按鍵定義</b></p><p> #define KEY_SET() p2_3==0</p><p> #define KEY_UP() p2_4==0</p><p> #define KEY_D
66、OWN() p2_5==0</p><p> #define BUZZER_0() p2_6==0</p><p> #define DI_1() p0_0=1;</p><p> #define DI_0() p0_0=0;</p><p> //DS1302端口數(shù)據(jù)讀寫(方向)</p>
67、<p> #define DATA_IO_RD() IO=1</p><p> //DS1302控制引腳操作定義</p><p> #define WR_IO_0() IO=0</p><p> #define WR_IO_1() IO=1 </p><p> #define SCLK_1() SCLK=1</p
68、><p> #define SCLK_0() SCLK=0</p><p> #define RST_1() RST=1</p><p> #define RST_0() RST=0</p><p> //LCD數(shù)據(jù)端口定義</p><p> #define LCD_Data P3 </p
69、><p> sbit BF=P3^7;</p><p> sbit RS=P1^4;</p><p> sbit RW=P1^3;</p><p> sbit EN=P1^2;</p><p> //LCD控制引腳操作定義 </p><p> #define RS_
70、1()RS=1</p><p> #define RS_0()RS=0</p><p> #define RW_1()RW=1</p><p> #define RW_0()RW=0</p><p> #define EN_1()EN=1</p><p> #define EN_0()EN=0&l
71、t;/p><p> //0,1,2,3,4,5,6分別對應周日,周一至周六</p><p> //uchar *WEEK[] = {"MON","TUS","WEN","THU","FRI","SAT","SUN"};</p><p
72、> //所讀取/設(shè)置的日期時間秒,分,時,日,月,周,年</p><p> uchar DateTime[]={35,10,8,30,5,3,12}; </p><p> uchar AlarmClock[]={10,8}; </p><p> sbit DS=P1^0; //define interface</p>
73、<p> uint temp; // variable of temperature</p><p> uchar flag1; // sign of the result positive or negative</p><p> void delay(uint count) //delay</p>
74、<p> { uint i;</p><p> while(count)</p><p><b> { i=200;</b></p><p> while(i>0)</p><p><b> i--;</b></p><p><b>
75、 count--;</b></p><p><b> }</b></p><p><b> }</b></p><p> void Init_Com(void)</p><p> { TMOD = 0x20;</p><p> PCON = 0x0
76、0;</p><p> SCON = 0x50;</p><p> TH1 = 0xFd;</p><p> TL1 = 0xFd;</p><p><b> TR1 = 1;</b></p><p><b> }</b></p><p>
77、 void DS_Reset(void) //DS18B20初始化</p><p> { uint i;</p><p><b> DS=0;</b></p><p><b> i=103;</b></p><p> while(i>0)i--;</p>&
78、lt;p><b> DS=1;</b></p><p><b> i=4;</b></p><p> while(i>0)i--;</p><p><b> }</b></p><p> bit Tmp_R_bit(void) //讀一位<
79、;/p><p><b> {</b></p><p><b> uint i;</b></p><p><b> bit dat;</b></p><p> DS=0;i++; </p><p> DS=1;i++;i++;<
80、;/p><p><b> dat=DS;</b></p><p> i=8;while(i>0)i--;</p><p> return (dat);</p><p><b> }</b></p><p> uchar Tmp_read(void) //讀一字
81、節(jié)</p><p> { uchar i,j,dat;</p><p><b> dat=0;</b></p><p> for(i=1;i<=8;i++)</p><p> {j=Tmp_readbit();</p><p> dat=(j<<7)|(dat>&
82、gt;1); //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在DAT里</p><p> }return(dat);</p><p><b> }</b></p><p> void Tmp_W_byte(uchar dat) //寫一字節(jié)</p><p><b> {</b><
83、;/p><p><b> uint i;</b></p><p><b> uchar j;</b></p><p> bit testb;</p><p> for(j=1;j<=8;j++)</p><p> { testb=dat&0x01;<
84、/p><p> dat=dat>>1;</p><p> if(testb) //write 1</p><p><b> { DS=0;</b></p><p><b> i++;i++;</b></p><p><b> DS=1;&l
85、t;/b></p><p> i=8;while(i>0)i--;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> DS=0; &
86、lt;/p><p> i=8;while(i>0)i--;</p><p><b> DS=1;</b></p><p><b> i++;i++;</b></p><p><b> }</b></p><p><b> }<
87、/b></p><p><b> }</b></p><p> void Tmp_change(void) //</p><p><b> {</b></p><p> dsreset();</p><p><b> delay(1);</b
88、></p><p> Tmp_W_byte(0xcc); // address all drivers on bus</p><p> Tmp_W_byte(0x44); // initiates a single temperature conversion</p><p><b> }</b></p><
89、;p> void tmp() //溫度轉(zhuǎn)換</p><p><b> {</b></p><p> uchar a,b;</p><p> const uchar df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//溫度小數(shù)對照表</p><
90、p> uchar CurrentT=0; /當前讀取溫度的整數(shù)部分</p><p> uchar ng=0;</p><p> DS_Reset();</p><p><b> delay(1);</b></p><p> Tmp_W_byte(0xcc);</p><p> T
91、mp_W_byte(0xbe);</p><p> a=Tmp_read();</p><p> b=Tmp_read();</p><p> Display_Digit[0]=df_Table[a&0x0f];//查表法得到溫度小數(shù)部分</p><p> CurrentT=(a>>4)|(b<<4);
92、//獲取溫度整數(shù)部分</p><p> Display_Digit[3]= CurrentT/100; //將整數(shù)部分分解為3位待顯示數(shù)字</p><p> Display_Digit[2]= CurrentT%100/10;</p><p> Display_Digit[1]= CurrentT%10;</p><p><b&
93、gt; }</b></p><p> Void Read_ROM() </p><p><b> {</b></p><p> uchar sn1,sn2;</p><p> dsreset();</p><p><b> delay(1);&l
94、t;/b></p><p> Tmp_W_byte(0x33);</p><p> sn1=Tmp_read(); sn2=Tmp_read();</p><p><b> }</b></p><p> void delay10ms() </p><p><
95、b> {</b></p><p> uchar a,b;</p><p> for(a=10;a>0;a--);for(b=60;b>0;b--);</p><p><b> }</b></p><p> void delay_ms(uint t)/*延時ms*/
96、 </p><p><b> {</b></p><p><b> uint i,j;</b></p><p> while(t--)</p><p> for(i=0;i<100;i++)</p><p> for(j=0;j<33;j++);<
97、;/p><p><b> }</b></p><p> void delay_5us(uint t)/*延時us*/</p><p><b> {</b></p><p> while(t--)</p><p><b> _nop_();</b>&
98、lt;/p><p><b> } </b></p><p> void Write_Byte_TO_DS1302(uchar dat) /* 向DS1302寫入一字節(jié)*/</p><p> { uchar i;</p><p> for(i=0; i<8; i++)</p><p>
99、 { IO=(bit)(dat&0x01);</p><p><b> SCLK_0();</b></p><p> _nop_();_nop_();_nop_(); </p><p> SCLK_1(); </p><p><b> dat>>=1;&
100、lt;/b></p><p><b> }</b></p><p><b> }</b></p><p> uchar Get_Byte_FROM_DS1302() /*從DS1302讀出一字節(jié)*/ </p><p><b> { </b></p>
101、<p> uchar i,dat = 0x00;</p><p> for(i=0; i<8; i++)</p><p> { dat>>=1;</p><p> DATA_IO_RD();</p><p> SCLK_1();_nop_();</p><p><b&g
102、t; SCLK_0();</b></p><p><b> if(IO)</b></p><p> dat|= 0x80;</p><p><b> }</b></p><p> return dat /16 *10 +dat%16 ;</p><p&g
103、t;<b> }</b></p><p> void Write_Data(uchar addr, uchar dat)/*從DS1302指定位置寫數(shù)據(jù)*/ </p><p> { uchar temp;</p><p> temp = (((dat/10)<<4)|(dat%10));</p><
104、p><b> RST_0();</b></p><p><b> SCLK_0();</b></p><p> _nop_(); _nop_(); _nop_();</p><p><b> RST_1();</b></p><p> Write_Byte_
105、TO_DS1302(addr);</p><p> Write_Byte_TO_DS1302(temp);</p><p><b> RST_0();</b></p><p><b> }</b></p><p> uchar Read_Data(uchar addr)/*從dS1302指定
106、位置讀數(shù)據(jù)*/</p><p> { uchar dat;</p><p><b> RST_0();</b></p><p><b> SCLK_0();</b></p><p> _nop_(); _nop_(); _nop_();</p><p><
107、;b> RST_1();</b></p><p> Write_Byte_TO_DS1302(addr);</p><p> DATA_IO_RD();</p><p> dat = Get_Byte_FROM_DS1302();</p><p><b> RST_0();</b></p
108、><p> return dat;</p><p><b> }</b></p><p> void GetDateTime() /*讀取當前日期*/</p><p><b> {</b></p><p> uchar i,addr = 0x81;</p>
109、<p> for(i =0; i<7; i++)//依次讀取秒,分,時,日,月,周,年</p><p><b> {</b></p><p> DateTime[i] =Read_Data( addr); //_nop_();_nop_();_nop_();</p><p> addr += 2;</p
110、><p><b> }</b></p><p><b> }</b></p><p> void SetDateTime() /*設(shè)置日期時間*/</p><p><b> {</b></p><p><b> uchar i;<
111、/b></p><p> Write_Data(0x8E,0x00); //解除寫保護,地址0x8E,0x00解除,0x80保護</p><p> for(i =1; i<7; i++)//依次讀取秒,分,時,日,月,周,年</p><p><b> {</b></p><p> Wri
112、te_Data((0x80 + 2*i),DateTime[i]);</p><p><b> }</b></p><p> Write_Data(0x8E,0x80);</p><p><b> } </b></p><p> void SetDateTime1() </p>
113、<p> { uchar i;</p><p> Write_Data(0x8E,0x00); //解除寫保護,地址0x8E,0x00解除,0x80保護</p><p> for(i =0; i<7; i++)//依次讀取秒,分,時,日,月,周,年</p><p><b> {</b></p&g
114、t;<p> Write_Data((0x80 + 2*i),DateTime[i]);</p><p><b> }</b></p><p> Write_Data(0x8E,0x80);</p><p><b> }</b></p><p> void Write_RAM
115、_Clock()/* 向RAM中寫數(shù)據(jù)(可以寫入用戶定義的鬧鐘數(shù)據(jù))*/</p><p> { uchar i;</p><p> Write_Data(0x8E,0x00); //解除寫保護,地址0x8E,0x00解除,0x80保護</p><p> for( i=0; i<2; i++)</p><p> Writ
116、e_Data( RAM+2*i, AlarmClock[i]);</p><p> Write_Data(0x8E,0x80);</p><p><b> }</b></p><p> void Read_RAM_Clock()/* 向RAM中讀數(shù)據(jù) */</p><p><b> {</b>
117、;</p><p><b> uchar i;</b></p><p> for( i=0; i<2; i++) //讀取RAM地址 1,3~31</p><p> AlarmClock[i] = Read_Data( RAM+1+2*i);</p><p><b> } </b>
118、;</p><p> uchar Clock_On() /*鬧鐘開始*/</p><p><b> {</b></p><p> if ((DateTime[2]== AlarmClock[1])&& ( DateTime[1]== AlarmClock[0] ) )//比較時</p><p>
119、 return 1;</p><p> else return 0;</p><p><b> }</b></p><p> uchar Clock_Close() //超過5分鐘,鬧鐘自動關(guān)閉</p><p><b> {</b></p><p> if(
120、AlarmClock[0]> 54)</p><p><b> {</b></p><p> if((DateTime[1]+60 -AlarmClock[0])>1)return 1;</p><p> else return 0;</p><p><b> }else </b>
121、;</p><p><b> {</b></p><p> if( (DateTime[1]- AlarmClock[0]) >1)</p><p> return 1;</p><p> else return 0;</p><p><b> }</b&g
122、t;</p><p><b> }</b></p><p> uchar LCD_BUSY_WAIT()/*LCD忙等待*/</p><p><b> {</b></p><p> uchar reslt;</p><p><b> RS_0();<
123、;/b></p><p> RW_1(); //狀態(tài)/命令寄存器</p><p><b> EN_1();</b></p><p> delay_5us(5);</p><p><b> reslt=BF;</b></p><p><b> EN
124、_0();</b></p><p> return reslt; </p><p><b> }</b></p><p> void Write_LCD_Command(uchar cmd)/* 寫LCD命令寄存器*/</p><p><b> { </b></p>
125、;<p> while(LCD_BUSY_WAIT());</p><p> RS_0();RW_0(); </p><p> LCD_Data = cmd;</p><p> delay_5us(1);</p><p><b> EN_1();</b></p><p>
126、 delay_5us(5);</p><p><b> EN_0();</b></p><p><b> }</b></p><p> void Write_LCD_Data(uchar dat)/*寫LCD數(shù)據(jù)寄存器*/</p><p><b> {</b></
127、p><p> while(LCD_BUSY_WAIT());</p><p> RS_1();RW_0();</p><p> delay_5us(1);</p><p> LCD_Data = dat;</p><p><b> EN_1();</b></p><p&g
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子萬年歷課程設(shè)計 (2)
- 課程設(shè)計報告--電子萬年歷
- proteus課程設(shè)計--電子萬年歷
- 電子萬年歷課程設(shè)計報告
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- 萬年歷課程設(shè)計
- c語音電子萬年歷課程設(shè)計
- 多功能電子萬年歷課程設(shè)計
- java萬年歷課程設(shè)計
- 萬年歷課程設(shè)計報告
- 數(shù)字萬年歷課程設(shè)計
- java課程設(shè)計--萬年歷
- 萬年歷課程設(shè)計論文
- 課程設(shè)計-萬年歷系統(tǒng)
- 萬年歷課程設(shè)計報告
評論
0/150
提交評論