版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 畢業(yè)設(shè)計(jì)(論文)</b></p><p> 題目: 基于單片機(jī)的多功能萬年歷</p><p> 專業(yè)名稱 電氣自動(dòng)化</p><p> 班級(jí)學(xué)號(hào) </p><p> 學(xué)生姓名 </p>&
2、lt;p> 指導(dǎo)教師 </p><p> 二O一二年 五 月 </p><p><b> 目 錄</b></p><p> 1 設(shè)計(jì)任務(wù)與要求</p><p> 2 方案設(shè)計(jì)與論證</p><p> 2.1方案一 ………………………………………………
3、…………………3</p><p> 2.2 方案二………………………………………………………………… 4</p><p> 2.3 方案三………………………………………………………………… 4</p><p> 2.4 方案論證……………………………………………………………… 5</p><p> 3 硬件單元電路設(shè)計(jì)與參數(shù)計(jì)算&l
4、t;/p><p> 3.1 主控制系統(tǒng)……………………………………………………………6</p><p> 3.2時(shí)鐘振蕩電路………………………………………………………… 7</p><p> 3.3復(fù)位電路……………………………………………………………… 8</p><p> 3.4 DS1302時(shí)鐘電路……………………………………………
5、…………9</p><p> 3.5按鍵電路………………………………………………………………10</p><p> 3.6 顯示電路………………………………………………………………10</p><p> 3.7蜂鳴器電路…………………………………………………………… 11</p><p> 4 流程圖與各模塊的程序</p>
6、;<p> 4.1 流程圖…………………………………………………………………12</p><p> 4.2 部分子程序……………………………………………………………13</p><p><b> 5 電路仿真調(diào)試</b></p><p> 5.1 總原理圖………………………………………………………………18</p&
7、gt;<p> 5.2 整體電路仿真圖以及仿真結(jié)果分析…………………………………19</p><p> 5.3 調(diào)試……………………………………………………………………20</p><p> 參考文獻(xiàn)…………………………………………………………………21</p><p> 致謝…………………………………………………………………………22<
8、/p><p> 附錄…………………………………………………………………………23</p><p><b> 參考文獻(xiàn)</b></p><p> [1]朱月秀 冷祖祁,單片機(jī)基礎(chǔ)(第3版):北京航航天大學(xué)出版社</p><p> [2] 華成英 童詩白, 模擬電子技術(shù)基礎(chǔ)(第四版):高等教育出版社</p>
9、<p> [3}趙建領(lǐng) 薛園園 ,零基礎(chǔ)學(xué)單片機(jī)C語言程序設(shè)計(jì):機(jī)械工業(yè)出版社</p><p> [4]樓然苗 李光飛. 單片機(jī)課程設(shè)計(jì)指導(dǎo):北京航航天大學(xué)出版社</p><p> [5]李鳳霞. C語言程序設(shè)計(jì)教程(第二版):北京理工大學(xué)出版社</p><p> [6]趙亮 侯國銳. 單片機(jī)C語言編程與實(shí)例:人民郵電出版社</p>
10、<p> [7]張義和 王敏男 許宏昌 余春長 . 例說5單片機(jī)(C語言版):人民郵電出版社</p><p> [8]郭天祥編.新概念51單片機(jī)C語言教程.北京:電子工業(yè)出版社,2009.</p><p> [9]周興華編.手把手教你學(xué)單片機(jī)C程序設(shè)計(jì).北京:北京航空航天大學(xué)出版社,2008.6. </p><p> [10] 譚浩強(qiáng)編.C程序設(shè)
11、計(jì):清華大學(xué)出版社,2008.7.</p><p> 信息工程 系 自動(dòng)化 專業(yè)類 0882021班</p><p> 學(xué)生(簽名): </p><p> 填寫日期: 2012 年 5 月 20日</p><p> 指導(dǎo)教師(簽名): </p
12、><p> 助理指導(dǎo)教師(并指出所負(fù)責(zé)的部分):</p><p> 信息工程 系主任(簽名):</p><p> 附注:任務(wù)書應(yīng)該附在已完成的畢業(yè)設(shè)計(jì)說明書首頁。</p><p> 美國DALLAS公司推出的具有涓細(xì)電流充電能的低功耗實(shí)時(shí)時(shí)鐘電路DS1302。它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),還具有閏年補(bǔ)償?shù)榷喾N功能
13、,而且DS1302的使用壽命長,誤差小。對(duì)于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時(shí)顯示年、月、日、周日、時(shí)、分、秒和溫度等信息,還具有時(shí)間校準(zhǔn)等功能。該電路采用AT89S52單片機(jī)作為核心,功耗小,能在3V的低壓工作,電壓可選用3~5V電壓供電。</p><p> 綜上所述此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優(yōu)點(diǎn),符合電子儀器儀表的發(fā)展趨勢,具有廣闊的市場前景。</p&g
14、t;<p> 本設(shè)計(jì)是基于51系列的單片機(jī)進(jìn)行的電子萬年歷設(shè)計(jì),可以顯示年月日時(shí)分秒及周信息,具有可調(diào)整日期和時(shí)間功能。在設(shè)計(jì)的同時(shí)對(duì)單片機(jī)的理論基礎(chǔ)和外圍擴(kuò)展知識(shí)進(jìn)行了比較全面準(zhǔn)備。在硬件與軟件設(shè)計(jì)時(shí),沒有良好的基礎(chǔ)知識(shí)和實(shí)踐經(jīng)驗(yàn)會(huì)受到很大限制,每項(xiàng)功能實(shí)現(xiàn)時(shí)需要那種硬件,程序該如何編寫,算法如何實(shí)現(xiàn)等,沒有一定的基礎(chǔ)就不可能很好的實(shí)現(xiàn)。</p><p> 關(guān)鍵詞:單片機(jī);實(shí)時(shí)時(shí)鐘;DS130
15、2 AT89C52</p><p> 學(xué)士學(xué)位論文原創(chuàng)性聲明</p><p> 本人聲明,所呈交的論文是本人在導(dǎo)師的指導(dǎo)下獨(dú)立完成的研究成果。除了文中特別加以標(biāo)注引用的內(nèi)容外,本論文不包含法律意義上已屬于他人的任何形式的研究成果,也不包含本人已用于其他學(xué)位申請(qǐng)的論文或成果。對(duì)本文的研究作出重要貢獻(xiàn)的個(gè)人和集體,均已在文中以明確方式表明。本人完全意識(shí)到本聲明的法律后果由本人承擔(dān)。<
16、/p><p> 作者簽名: 日期:2012年5月20日</p><p> 學(xué)位論文版權(quán)使用授權(quán)書</p><p> 本學(xué)位論文作者完全了解學(xué)校有關(guān)保留、使用學(xué)位論文的規(guī)定,同意學(xué)校保留并向國家有關(guān)部門或機(jī)構(gòu)送交論文的復(fù)印件和電子版,允許論文被查閱和借閱。本人授權(quán)南昌航空大學(xué)科技學(xué)院可以將本論文的全部或部分內(nèi)容編入有關(guān)數(shù)據(jù)
17、庫進(jìn)行檢索,可以采用影印、縮印或掃描等復(fù)制手段保存和匯編本學(xué)位論文。</p><p> 作者簽名: 日期:</p><p> 導(dǎo)師簽名: 日期</p><p> 1 設(shè)計(jì)任務(wù)與要求</p><p> 能夠顯示年、月、日、時(shí)、分 秒 。&
18、lt;/p><p> 可以人為校正年、月、日、時(shí)、分、秒。</p><p><b> 具有鬧鐘功能。</b></p><p> 能夠進(jìn)行整點(diǎn)的提醒。</p><p><b> 按鍵顯示溫度。</b></p><p><b> 2、方案設(shè)計(jì)與論證</b&g
19、t;</p><p><b> 2.1方案一</b></p><p> 按照系統(tǒng)設(shè)計(jì)的功能的要求,初步確定系統(tǒng)由主控模塊、時(shí)鐘模塊、顯示模塊各鍵盤接口模塊共4個(gè)模塊組成,電路系統(tǒng)構(gòu)成框圖如圖1所示。主控芯片使用52系列AT89S52單片機(jī),時(shí)鐘芯片使用美國DALLAS公司推出的一款高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘DS1302。采用DS1302作為計(jì)時(shí)芯片,可以做
20、到計(jì)時(shí)準(zhǔn)確。更重要的是,DS1302可以在很小電流的后備電源(2.5V--5.5V電源,在2。5V時(shí)耗電小于300nA)下繼續(xù)計(jì)時(shí),而且DS1302可以編程選擇多種充電電流來對(duì)后備電源進(jìn)行慢速充電,可以 保證后備電源基本功不耗電。顯示模塊采用普通的共陽LED數(shù)碼管,鍵輸入采用查詢法實(shí)現(xiàn)功能調(diào)整。</p><p> 圖1 電子萬年歷電路系統(tǒng)構(gòu)成框圖</p><p><b>
21、2.2方案二</b></p><p> 按照系統(tǒng)設(shè)計(jì)的要求和功能,將系統(tǒng)分為主控模塊、時(shí)鐘電路模塊、按鍵掃描模塊,LCD顯示模塊,電源電路、復(fù)位電路、晶振電路幾個(gè)模塊,系統(tǒng)框圖如圖2所示。主控模塊采用AT89S52單片機(jī),按鍵模塊用四個(gè)按鍵,用于調(diào)整時(shí)間和設(shè)定鬧鐘,顯示模塊采用LCD1602,時(shí)鐘電路模塊采用DS1302實(shí)時(shí)時(shí)鐘實(shí)現(xiàn)對(duì)時(shí)間,日期的操作。</p><p> 圖
22、2 基于AT89C52單片機(jī)的電子萬年歷系統(tǒng)框圖</p><p><b> 2.3方案三</b></p><p> 按照系統(tǒng)設(shè)計(jì)的要求和功能,將系統(tǒng)分為主控制器模塊、顯示模塊、按鍵開關(guān)模塊、蜂鳴器電路模塊。系統(tǒng)框圖如圖3所示,主控制模塊采用AT89S52單片機(jī)為控制中心,顯示模塊采用液晶LCD1602顯示,計(jì)時(shí)使用AT89S52單片機(jī)自帶的定時(shí)器功能,實(shí)現(xiàn)對(duì)時(shí)間、
23、日期的操作,通過按鍵盤開關(guān)實(shí)現(xiàn)對(duì)時(shí)間、日期的調(diào)整。</p><p> 圖3 基于AT89C52單片機(jī)的電子萬年歷總體設(shè)計(jì)框圖</p><p><b> 2.4方案論證</b></p><p> 上面提到的三個(gè)方案中,在電路原理方面大致相同,都能夠達(dá)到設(shè)計(jì)任務(wù)與要求,在方案一款方案三中使用外部的時(shí)鐘芯片DS1302來實(shí)現(xiàn)日期和時(shí)間的操作,方
24、案二中則利用了單片機(jī)自身的定時(shí)器功能;在方案二和方案三在顯示模塊上都使用液晶顯示屏LCD1602作為顯示,方案一則使用LED數(shù)碼管作為顯示,采用LED數(shù)碼管動(dòng)態(tài)掃描,數(shù)碼管的價(jià)格適中,對(duì)于顯示數(shù)字較好,而且使用單片機(jī)的端口也較少;采用LCD1602液晶顯示屏,液晶顯示屏的顯示功能強(qiáng)大,可以顯示大量文字、圖形,清晰可見,價(jià)格相對(duì)LED數(shù)碼管來說要昂貴些,但是基于本設(shè)計(jì)顯示的東西較多,若采用LED數(shù)碼管的話,所需數(shù)碼管較多,價(jià)格也相應(yīng)的會(huì)提
25、高,而且不利于控制,對(duì)于LCD1602,它所使用的端口也不很多,能夠清晰的顯示,比較適合顯示大量的數(shù)字,因此選擇LCD1602作為顯示模塊。DS1302是一款高性能的實(shí)時(shí)時(shí)鐘芯片,以計(jì)時(shí)準(zhǔn)確、接口簡單、使用方便、工作電壓范圍寬和低功耗等優(yōu)點(diǎn),得到廣泛的應(yīng)用,而且在掉電時(shí)能夠在外部紐扣電池的供電下繼續(xù)工作,不會(huì)因?yàn)榈綦姾?,其時(shí)間就要重新設(shè)置,方案二中使用定時(shí)器的功能,當(dāng)在掉電的時(shí)候就會(huì)使時(shí)間和日期回到原來設(shè)定的初</p>&
26、lt;p> 通過對(duì)上述方案的論證分析,本次設(shè)計(jì)選擇方案三,采用AT89C52作為主控制系統(tǒng),DS1302提供時(shí)鐘,LCD1602液晶作為顯示模塊</p><p> 3硬件單元電路設(shè)計(jì)與參數(shù)計(jì)算</p><p><b> 3.1主控制系統(tǒng)</b></p><p> 單片機(jī)中央處理系統(tǒng)的方案設(shè)計(jì),我們選用具有ATMEL公司的AT89C
27、52單片機(jī)作為中央處理器,如圖4所示。該單片機(jī)除了擁有MCS-51系列單片機(jī)的所有優(yōu)點(diǎn)外,內(nèi)部還具有8K的在系統(tǒng)可編程FLASH存儲(chǔ)器,低功耗的空閑和掉電模式,極大的降低了電路的功耗,還包含了定時(shí)器、程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器等硬件,其硬件能符合整個(gè)控制系統(tǒng)的要求,不需要外接其他存儲(chǔ)器芯片和定時(shí)器件,方便地構(gòu)成一個(gè)最小系統(tǒng)。整個(gè)系統(tǒng)結(jié)構(gòu)緊湊,抗干擾能力強(qiáng),性價(jià)比高。是比較合適的方案。</p><p> 圖4 AT8
28、9C52主控制系統(tǒng)</p><p><b> 3.2時(shí)鐘振蕩電路</b></p><p> 時(shí)鐘振蕩電路圖5所示,時(shí)鐘振蕩電路用于產(chǎn)生單片機(jī)正常工作時(shí)所需要的時(shí)鐘信號(hào),電路由兩個(gè)22pF的瓷片電容和一個(gè)12MHz的晶振組成,并接入到單片機(jī)的XTAL1和XTAL2引腳處,使單片機(jī)工作于內(nèi)部振蕩模式。此電路在加電后延遲大約10ms振蕩器起振,在XTAL2引腳產(chǎn)生幅度為
29、3V左右的正弦波時(shí)鐘信號(hào),其振蕩頻率主要由石英晶振的頻率決定。電路中兩個(gè)電容C1、C2的作用使電路快速起振,提高電路的運(yùn)行速度,對(duì)于AT89C52其工作頻率為0至33MHz,在這個(gè)范圍內(nèi)單片機(jī)能夠正常的工作。</p><p> 圖5 AT89S52時(shí)鐘振蕩電路</p><p><b> 3.3復(fù)位電路</b></p><p> 復(fù)位電路由
30、電阻和極性電容組成,如圖6所示,通過高電平使單片機(jī)復(fù)位,在時(shí)鐘電路開始工作后,當(dāng)高電平的時(shí)間超過大約2us時(shí),即可實(shí)現(xiàn)復(fù)位。此復(fù)位電路同時(shí)具備了上電復(fù)位和手動(dòng)復(fù)位的功能,上電復(fù)位發(fā)生在開機(jī)加電時(shí),由系統(tǒng)自動(dòng)完成,手動(dòng)復(fù)位通過一個(gè)按鍵來實(shí)現(xiàn),在程序運(yùn)行時(shí),若遇到死機(jī),死循環(huán)或程序“跑飛”等情況,通過手動(dòng)復(fù)位就可以實(shí)現(xiàn)重新啟動(dòng)的操作。手動(dòng)按鈕復(fù)位需要人為在復(fù)位輸入端RST上加入高電平。一般采用的辦法是在RST端和正電源Vcc之間接一個(gè)按鈕和
31、一個(gè)電阻,如圖所示,當(dāng)人為按下按鈕時(shí),則Vcc 的+5V電平就會(huì)直接加到RST端,由于人的動(dòng)作再快也會(huì)使按鈕保持接通達(dá)數(shù)十毫秒,所以,完全能夠滿足復(fù)位的時(shí)間要求。上電復(fù)位的工作過程是在加電時(shí),復(fù)位電路通過電容加給RST端一個(gè)短暫的高電平信號(hào),此高電平信號(hào)隨著Vcc對(duì)電容的充電過程而逐漸回落,即RST端的高電平持續(xù)時(shí)間取決于電容的充電時(shí)間,由圖可知充電時(shí)間為:T=2.3RC=2.3*10*10-6*5.1*103=0.1173s ,保證系
32、統(tǒng)能夠可靠地復(fù)位。</p><p> 圖6 AT89C52復(fù)位電路</p><p> 3.4、DS1302時(shí)鐘電路</p><p> 時(shí)鐘電路主要由時(shí)鐘芯片DS1302、備用電池、晶振等幾部分組成,如圖7所示。DS1302采用3線串行接口,占用引腳少,內(nèi)部集成了可編程日歷時(shí)鐘,用戶可以根據(jù)需要通過單片機(jī)的控制來自行設(shè)置,支持雙電源供電,可以使用外部主電源和備用
33、電源,備份電源能夠使時(shí)鐘芯片繼續(xù)工作。</p><p> 圖7 DS1302時(shí)鐘電路</p><p><b> 3.5、按鍵電路</b></p><p> 按鍵電路由四個(gè)輕觸開關(guān)組成,如圖8所示。按鍵用來調(diào)整時(shí)間和設(shè)定鬧鐘,其一端直接接到單片機(jī)的端口,另一端接地,當(dāng)按下按鍵時(shí),相應(yīng)的端口變?yōu)榈碗娖?,通過檢測這一低電平就可以判斷是哪個(gè)鍵按下
34、,從而作相應(yīng)的操作。</p><p><b> 圖8 按鍵電路</b></p><p><b> 3.6、顯示電路</b></p><p> 顯示電路采用LCD1602液晶顯示,圖中只畫出了其相應(yīng)的接口,如圖9所示。3腳用于調(diào)節(jié)LCD1602的背光,4、5、6為LCD1602的控制口,用于控制其寫入或是讀出指令,7至
35、14腳為LCD1602的數(shù)據(jù)口,將數(shù)傳送到LCD1602中。</p><p> 圖9 LCD1602接口電路</p><p><b> 3.7、蜂鳴器電路</b></p><p> 蜂鳴器電路由一個(gè)220歐的電阻,三極管8550,及蜂鳴器組成,如圖10所示。通過控制三極管的導(dǎo)通和截止來實(shí)現(xiàn)蜂鳴器的響與不響。</p><
36、p><b> 圖10 蜂鳴器電路</b></p><p><b> 4軟件設(shè)計(jì)與流程圖</b></p><p><b> 4.1序流程圖</b></p><p> 主程序首先初始化定時(shí)器、LCD1602及DS1302,然后就開始查詢按鍵,有鍵按下則開始調(diào)整時(shí)間和設(shè)置鬧鐘,若沒有按下,則執(zhí)
37、行下面的時(shí)間、日期及鬧鐘時(shí)間的顯示,最后依次循環(huán)這些相同的操作,相應(yīng)流程圖如圖11所示:</p><p> 圖11 程序主流程圖</p><p><b> 4.2 部分序</b></p><p> DS1302子程序:</p><p> void DS1302InputByte(unsigned char d)
38、//實(shí)時(shí)時(shí)鐘寫入一字節(jié)(內(nèi)部函數(shù))</p><p><b> { </b></p><p> unsigned char i;</p><p><b> ACC = d;</b></p><p> for(i=8; i>0; i--)</p><p><
39、b> {</b></p><p> DS1302_IO = ACC0; //相當(dāng)于匯編中的 RRC</p><p> DS1302_CLK = 1;</p><p> DS1302_CLK = 0;</p><p> ACC = ACC >> 1; </p><
40、p><b> } </b></p><p><b> }</b></p><p> unsigned char DS1302OutputByte(void) //實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù))</p><p><b> { </b></p><p> unsi
41、gned char i;</p><p> for(i=8; i>0; i--)</p><p><b> {</b></p><p> ACC = ACC >>1; //相當(dāng)于匯編中的 RRC </p><p> ACC7 = DS1302_IO;</p>
42、<p> DS1302_CLK = 1;</p><p> DS1302_CLK = 0;</p><p><b> } </b></p><p> return(ACC); </p><p><b> }</b></p><p> void Write
43、1302(unsigned char ucAddr, unsigned char ucDa)//ucAddr: DS1302地址, ucData: 要寫的數(shù)據(jù)</p><p><b> {</b></p><p> DS1302_RST = 0;</p><p> DS1302_CLK = 0;</p><p>
44、 DS1302_RST = 1;</p><p> DS1302InputByte(ucAddr); // 地址,命令 </p><p> DS1302InputByte(ucDa); // 寫1Byte數(shù)據(jù)</p><p> DS1302_CLK = 1;</p><p> DS1302_RST = 0
45、;</p><p><b> } </b></p><p> unsigned char Read1302(unsigned char ucAddr)//讀取DS1302某地址的數(shù)據(jù)</p><p><b> {</b></p><p> unsigned char ucData;<
46、/p><p> DS1302_RST = 0;</p><p> DS1302_CLK = 0;</p><p> DS1302_RST = 1;</p><p> DS1302InputByte(ucAddr|0x01); // 地址,命令 </p><p> ucData = DS1302Out
47、putByte(); // 讀1Byte數(shù)據(jù)</p><p> DS1302_CLK = 1;</p><p> DS1302_RST = 0;</p><p> return(ucData);</p><p><b> }</b></p><p> void DS130
48、2_GetTime(SYSTEMTIME *Time) //獲取時(shí)鐘芯片的時(shí)鐘數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組</p><p><b> {</b></p><p> unsigned char ReadValue;</p><p> ReadValue = Read1302(DS1302_SECOND);</p><p&g
49、t; Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_MINUTE);</p><p> Time->Minute = ((ReadValue&0x70)>>4)*10 + (Re
50、adValue&0x0F);</p><p> ReadValue = Read1302(DS1302_HOUR);</p><p> Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS13
51、02_DAY);</p><p> Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_WEEK);</p><p> Time->Week = ((ReadValue&0x7
52、0)>>4)*10 + (ReadValue&0x0F);</p><p> ReadValue = Read1302(DS1302_MONTH);</p><p> Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p> R
53、eadValue = Read1302(DS1302_YEAR);</p><p> Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p><b> }</b></p><p> DS18B20子程序</p>&
54、lt;p> void delay_18B20(unsigned int i)</p><p><b> {</b></p><p> while(i--);</p><p><b> }</b></p><p> /**********ds18b20初始化函數(shù)************
55、**********/</p><p> void Init_DS18B20(void) </p><p><b> {</b></p><p> unsigned char x=0;</p><p> DQ = 1; //DQ復(fù)位</p><p> delay_18B
56、20(8); //稍做延時(shí)</p><p> DQ = 0; //單片機(jī)將DQ拉低</p><p> delay_18B20(80); //精確延時(shí) 大于 480us</p><p> DQ = 1; //拉高總線</p><p> delay_18B20(14);</p><
57、p> x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗</p><p> delay_18B20(20);</p><p><b> }</b></p><p> /***********ds18b20讀一個(gè)字節(jié)**************/ </p><p>
58、 unsigned char ReadOneChar(void)</p><p><b> {</b></p><p> uchar i=0;</p><p> uchar dat = 0;</p><p> for (i=8;i>0;i--)</p><p><b>
59、 {</b></p><p> DQ = 0; // 給脈沖信號(hào)</p><p><b> dat>>=1;</b></p><p> DQ = 1; // 給脈沖信號(hào)</p><p><b> if(DQ)</b></p><p> dat
60、|=0x80;</p><p> delay_18B20(4);</p><p><b> }</b></p><p> return(dat);</p><p><b> }</b></p><p> /*************ds18b20寫一個(gè)字節(jié)*****
61、***********/ </p><p> void WriteOneChar(uchar dat)</p><p><b> {</b></p><p> unsigned char i=0;</p><p> for (i=8; i>0; i--)</p><p><b
62、> {</b></p><p><b> DQ = 0;</b></p><p> DQ = dat&0x01;</p><p> delay_18B20(5);</p><p><b> DQ = 1;</b></p><p><b
63、> dat>>=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> /**************讀取ds18b20當(dāng)前溫度************/</p><p> void ReadTemp(voi
64、d)</p><p><b> {</b></p><p> unsigned char a=0;</p><p> unsigned char b=0;</p><p> unsigned char t=0;</p><p> Init_DS18B20();</p>&l
65、t;p> WriteOneChar(0xCC); // 跳過讀序號(hào)列號(hào)的操作</p><p> WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換</p><p> delay_18B20(100); // this message is wery important</p><p> Init_DS18B20();<
66、;/p><p> WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作</p><p> WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度</p><p> delay_18B20(100);</p><p> a=ReadOneChar(); //讀取溫度值低位&l
67、t;/p><p> b=ReadOneChar(); //讀取溫度值高位</p><p> temp_value=b<<4;</p><p> temp_value+=(a&0xf0)>>4; </p><p><b> }</b></p>
68、;<p> void temp_to_str() //溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示</p><p><b> {</b></p><p> TempBuffer[0]=temp_value/10+'0'; //十位</p><p> TempBuffer[1]=temp_value%10+'0&
69、#39;; //個(gè)位</p><p> TempBuffer[2]=0xdf; //溫度符號(hào)</p><p> TempBuffer[3]='C';</p><p> TempBuffer[4]='\0';</p><p><b> }</b></p><
70、p> void Delay1ms(unsigned int count)</p><p><b> {</b></p><p> unsigned int i,j;</p><p> for(i=0;i<count;i++)</p><p> for(j=0;j<120;j++);</p
71、><p><b> }</b></p><p><b> 5 電路仿真調(diào)試</b></p><p><b> 5.1總原理圖</b></p><p> 基于AT89S52單片機(jī)的電子萬年歷硬件電路圖如圖13所示,系統(tǒng)由AT89S52單片機(jī),按鍵掃描電路、顯示電路、時(shí)鐘電路
72、、晶振電路、復(fù)位電路、電源指示電路及蜂鳴器輸出電路。</p><p> 圖13 基于AT89S52的電子萬年歷電路原理圖</p><p> 5.2 整體電路仿真圖以及仿真結(jié)果分析</p><p> 圖15 電子萬年歷仿真圖</p><p><b> 仿真結(jié)果分析</b></p><p>
73、; 仿真正確顯示了時(shí)間,在LCD1602中正確顯示了當(dāng)前日期、時(shí)間并可以顯示鬧鐘時(shí)間,通過按按鍵K2就可以開始設(shè)置時(shí)間,依次按K2次在年、月、日、時(shí)、分之間切換,并且相應(yīng)的調(diào)整的位會(huì)閃爍,按K3用于加1操作,K4用于減1操作。按K3則可以設(shè)置鬧鐘時(shí)間,依次按K2以在時(shí)和分之間切換,按K3,可以增加值,按K4,可以減小值。鬧鐘開啟設(shè)置:先按住K2然后再按K3可以開啟鬧鐘功能,當(dāng)設(shè)置好鬧鐘后并開啟鬧鐘功能后,就可以有鬧鐘功能,按k1可以顯
74、示溫度。要達(dá)到的要求,符合了我們?cè)O(shè)計(jì)的要求。</p><p><b> 5.3 調(diào)試</b></p><p> 在軟件調(diào)試過程中,當(dāng)按下按鍵調(diào)節(jié)時(shí)間和日期后,時(shí)間不能繼續(xù)在加,后來分析了程序才發(fā)現(xiàn),是在設(shè)置好時(shí)間和日期時(shí)我們暫停了時(shí)鐘,在設(shè)置完后沒有啟動(dòng)時(shí)鐘,所以時(shí)間和日期就不能夠繼續(xù)走,在那里停止了,發(fā)現(xiàn)這個(gè)原因后,我在設(shè)置完時(shí)間后就開啟時(shí)鐘,時(shí)間和日期就能夠正
75、確顯示了。</p><p> 上電測試,LCD1602能夠正確顯示時(shí)間和日期,第一次K2鈕,開始設(shè)置秒,再按K4秒減1,按K3秒加1,按二次K2設(shè)置分,按K4分減1 按K3分加1,按三次K2,設(shè)置時(shí),按K4減1,按K3加1,按四次K2設(shè)置星期,按K4減1 ,按K3分加1,按五次K2.設(shè)置天,按K4減1 ,按K3加1,按六次K2,設(shè)置月,按K4減1 ,按K3分加1,按七次K2,設(shè)置年,按K4減1 ,按K3分加1
76、,在對(duì)電路測試后,電路達(dá)到了所需的功能。</p><p> 通過對(duì)電路的多次的反復(fù)測試與分析,可以對(duì)電路的原理及功能更加熟悉,同時(shí)提高了設(shè)計(jì)能力及對(duì)電路的分析能力,同時(shí)在軟件的編程方面得到了更高的提高,對(duì)編程能力得到加強(qiáng),同時(shí)對(duì)所學(xué)的知識(shí)得到了大的提高與鞏固。</p><p><b> 附錄</b></p><p> #include &
77、lt;REG51.H></p><p> #include <intrins.h></p><p> //#include "LCD1602.h"</p><p> //#include "DS1302.h"</p><p> #define uint unsigned int
78、</p><p> #define uchar unsigned char</p><p> sbit DS1302_CLK = P1^7; //實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 </p><p> sbit DS1302_IO = P1^6; //實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 </p><p> s
79、bit DS1302_RST = P1^5; //實(shí)時(shí)時(shí)鐘復(fù)位線引腳</p><p> sbit ACC0 = ACC^0;</p><p> sbit ACC7 = ACC^7;</p><p> char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hi
80、de_year,set_menu,a,flag_1=1; //秒,分,時(shí)到日,月,年位閃的計(jì)數(shù)</p><p> sbit Set =P1^4; //模式切換鍵</p><p> sbit Up = P1^3; //加法按鈕</p><p> sbit Down = P1^2; //減法按鈕</p><
81、p> sbit out = P1^1; //立刻跳出調(diào)整模式按鈕</p><p> sbit DQ = P1^0; //溫度傳送數(shù)據(jù)IO口</p><p> sbit BEEP=P3^2; //蜂鳴器輸出口</p><p> sbit led=P2^0;</p><p> sbit xs=P2
82、^1;</p><p> char done,count,temp,flag,up_flag,down_flag ,flag_led;</p><p> uchar temp_value,j; //溫度值</p><p><b> uint b;</b></p><p> uchar TempBuff
83、er[5],week_value[2],Alarmtime[9],alarm[3],Alarm_time[3];</p><p> unsigned char code SONG[] ={ </p><p><b> //祝你平安</b></p><p> 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0
84、x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,</p><p> 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,</p><p> 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,
85、0x10,0x2b,0x80,0x26,0x20,</p><p> 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10</p><p> 0x26,0x20,</p><p> 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x
86、80,0x26,0x20,0x2b,0x10,0x2b,0x10,</p><p> 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,</p><p> 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0
87、x18,0x20,0x26,0x20,</p><p> 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,</p><p> 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,
88、0x10,</p><p> 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,</p><p> 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,</p>
89、;<p> 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,</p><p> 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,</p><p>
90、0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00 </p><p><b> };</b></p><p> void Time_Init()</p><p><b> {</b></p><p>
91、; TMOD = 0x11;</p><p> IE = 0x8a;</p><p> TH0 = 0xDC;</p><p> TL0 = 0x00;</p><p> TH1 = 0xDC;</p><p> TL1 = 0x00;</p><p><b>
92、 }</b></p><p> void Time0_Int() interrupt 1</p><p><b> {</b></p><p> TH0 = 0xDC;</p><p> TL0 = 0x00;</p><p> a++;//長度加1</p>
93、;<p><b> }</b></p><p> void Time1_Int() interrupt 3</p><p><b> {</b></p><p> TH1 = 0xDC;</p><p> TL1 = 0x00;</p><p> b
94、++;//長度加1</p><p> if(b==255)</p><p><b> { </b></p><p><b> TR1=0; </b></p><p><b> b=0;</b></p><p> flag_led=1;
95、</p><p><b> }</b></p><p><b> }</b></p><p> void Delay_xMs(uint x)</p><p><b> {</b></p><p><b> uint i,j;</
96、b></p><p> for(i=0; i<x; i++)</p><p><b> {</b></p><p> for(j=0; j<3; j++);</p><p><b> }</b></p><p><b> }</b&
97、gt;</p><p> void Play_Song(uchar i)</p><p><b> {</b></p><p> uchar Temp1,Temp2;</p><p> uint Addr;</p><p> a = 0;//中斷計(jì)數(shù)器清0</p>
98、;<p> Addr = i * 217;</p><p> while(flag_1)</p><p><b> {</b></p><p> if(out==0)</p><p><b> {</b></p><p><b> flag
99、_1=0;</b></p><p><b> }</b></p><p> Temp1 = SONG[Addr++];</p><p> if (Temp1 == 0xFF) //休止符</p><p><b> {</b></p><p&g
100、t;<b> TR0 = 0;</b></p><p> Delay_xMs(100);</p><p><b> }</b></p><p> else if (Temp1 == 0x00) //歌曲結(jié)束符</p><p><b> {</b></p&g
101、t;<p><b> return;</b></p><p><b> }</b></p><p><b> else </b></p><p><b> {</b></p><p> Temp2 = SONG[Addr++];&l
102、t;/p><p><b> TR0 = 1;</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> BEEP = ~BEEP;</p><p> Delay_xMs(Temp1);<
103、;/p><p> if(Temp2 ==a)</p><p><b> {</b></p><p><b> a = 0;</b></p><p><b> break;</b></p><p><b> }</b></
104、p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void show_time(); //液晶顯示程序&l
105、t;/p><p> /***********1602液晶顯示部分子程序****************/</p><p> //Port Definitions**********************************************************</p><p> sbit LcdRs= P2^5;</p><
106、p> sbit LcdRw= P2^6;</p><p> sbit LcdEn = P2^7;</p><p> sfr DBPort = 0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口</p><p> //內(nèi)部等待函數(shù)*************************************
107、*************************************</p><p> unsigned char LCD_Wait(void)</p><p><b> {</b></p><p><b> LcdRs=0;</b></p><p> LcdRw=1;_nop_()
108、;</p><p> LcdEn=1;_nop_();</p><p><b> LcdEn=0;</b></p><p> return DBPort;</p><p><b> }</b></p><p> //向LCD寫入命令或數(shù)據(jù)***********
109、*************************************************</p><p> #define LCD_COMMAND0 // Command</p><p> #define LCD_DATA1 // Data</p><p> #define LCD_CLEAR_SCREEN0x01
110、 // 清屏</p><p> #define LCD_HOMING 0x02 // 光標(biāo)返回原點(diǎn)</p><p> void LCD_Write(bit style, unsigned char input)</p><p><b> {</b></p><p><b> Lc
111、dEn=0;</b></p><p> LcdRs=style;</p><p> LcdRw=0;_nop_();</p><p> DBPort=input; _nop_();//注意順序</p><p> LcdEn=1;_nop_();//注意順序</p><p
112、> LcdEn=0;_nop_();</p><p> LCD_Wait();</p><p><b> }</b></p><p> //設(shè)置顯示模式************************************************************</p><p> #def
113、ine LCD_SHOW0x04 //顯示開</p><p> #define LCD_HIDE0x00 //顯示關(guān) </p><p> #define LCD_CURSOR0x02 //顯示光標(biāo)</p><p> #define LCD_NO_CURSOR0x00 //無光標(biāo) </p>
114、<p> #define LCD_FLASH0x01 //光標(biāo)閃動(dòng)</p><p> #define LCD_NO_FLASH0x00 //光標(biāo)不閃動(dòng)</p><p> void LCD_SetDisplay(unsigned char DisplayMode)</p><p><b> {</b><
115、;/p><p> LCD_Write(LCD_COMMAND, 0x08|DisplayMode);</p><p><b> }</b></p><p> //設(shè)置輸入模式************************************************************</p><p> #
116、define LCD_AC_UP0x02</p><p> #define LCD_AC_DOWN0x00 // default</p><p> #define LCD_MOVE0x01 // 畫面可平移</p><p> #define LCD_NO_MOVE0x00 //default</p&g
117、t;<p> void LCD_SetInput(unsigned char InputMode)</p><p><b> {</b></p><p> LCD_Write(LCD_COMMAND, 0x04|InputMode);</p><p><b> }</b></p><
118、;p> //初始化LCD************************************************************</p><p> void LCD_Initial()</p><p><b> {</b></p><p><b> LcdEn=0;</b></p>
119、<p> LCD_Write(LCD_COMMAND,0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣</p><p> LCD_Write(LCD_COMMAND,0x38);</p><p> LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無光標(biāo)</p><p>
120、 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p> LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動(dòng)</p><p><b> }</b></p><p> void LCD_clear()</p>
121、<p><b> {</b></p><p><b> LcdEn=0;</b></p><p> LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p><b> }</b></p><p> //
122、液晶字符輸入的位置************************</p><p> void GotoXY(unsigned char x, unsigned char y)</p><p><b> {</b></p><p><b> if(y==0)</b></p><p> LCD
123、_Write(LCD_COMMAND,0x80|x);</p><p><b> if(y==1)</b></p><p> LCD_Write(LCD_COMMAND,0x80|(x-0x40));</p><p><b> }</b></p><p> //將字符輸出到液晶顯示</
124、p><p> void Print(unsigned char *str)</p><p><b> {</b></p><p> while(*str!='\0')</p><p><b> {</b></p><p> LCD_Write(LCD_D
125、ATA,*str);</p><p><b> str++;</b></p><p><b> }</b></p><p><b> }</b></p><p> /**********************蜂鳴器函數(shù)************************/
126、</p><p> di(unsigned long t)</p><p><b> {</b></p><p> unsigned long c;</p><p> unsigned int n;</p><p> for(c=0;c<t;c++)</p><
127、p><b> {</b></p><p> for(n=0;n<50;n++);//延時(shí)</p><p> BEEP=~BEEP; //取反輸出到喇叭的信號(hào)</p><p><b> }</b></p><p><b> }</b></p
128、><p> /*****************DS1302時(shí)鐘部分子程序************************/</p><p> typedef struct __SYSTEMTIME__</p><p><b> {</b></p><p> unsigned char Second;</p&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 萬年歷設(shè)計(jì)畢業(yè)論文
- 電子萬年歷畢業(yè)論文
- 畢業(yè)論文-基于tft彩屏的多功能萬年歷設(shè)計(jì)
- 萬年歷設(shè)計(jì)制作【畢業(yè)論文】
- 畢業(yè)論文——電子萬年歷設(shè)計(jì)
- 電子萬年歷設(shè)計(jì)-畢業(yè)論文
- 數(shù)字萬年歷設(shè)計(jì)畢業(yè)論文
- 畢業(yè)論文——電子萬年歷設(shè)計(jì)
- 多功能數(shù)字萬年歷課程設(shè)計(jì)
- 多功能電子萬年歷課程設(shè)計(jì)
- 基于proteus多功能電子萬年歷的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 數(shù)字電子萬年歷的畢業(yè)論文
- 電子萬年歷的設(shè)計(jì)畢業(yè)論文
- 單片機(jī)電子萬年歷畢業(yè)論文
- 基于javascript的萬年歷設(shè)計(jì)【畢業(yè)論文】
- 單片機(jī)電子萬年歷畢業(yè)論文
- 萬年歷畢業(yè)論文---基于at89s52單片機(jī)的電子萬年歷設(shè)計(jì)
- c語言課程設(shè)計(jì)--多功能萬年歷
- 單片機(jī)電子萬年歷畢業(yè)論文
- 數(shù)字萬年歷設(shè)計(jì)論文
評(píng)論
0/150
提交評(píng)論