版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 題 目:數(shù)字時鐘及溫度采集系統(tǒng)的設(shè)計</p><p><b> 學(xué) 院:</b></p><p><b> 專 業(yè):</b></p><p><b> 姓 名: </b></p><p> 學(xué) 號: &
2、lt;/p><p> 指導(dǎo)老師: </p><p><b> 設(shè)計時間: </b></p><p><b> 目 錄</b></p><
3、;p> 1總設(shè)計方案- 3 -</p><p> 1.1主控制器選擇方案- 3 -</p><p> 1.2溫度芯片選擇方案- 4 -</p><p> 1.3顯示選擇方案- 5 -</p><p> 1.4數(shù)字時鐘方案- 6 -</p><p> 1.5鍵盤選擇方案- 6 -</p
4、><p> 2硬件設(shè)計- 7 -</p><p> 2.1顯示模塊設(shè)計- 7 -</p><p> 2.2測溫模塊設(shè)計- 7 -</p><p> 2.3矩陣式鍵盤設(shè)計- 7 -</p><p> 3軟件設(shè)計- 8 -</p><p> 3.1主程序流程圖- 8 -</
5、p><p> 3.2測溫流程圖- 8 -</p><p> 3.3時鐘顯示流程圖- 9 -</p><p> 4系統(tǒng)調(diào)試過程- 10 -</p><p> 4.1系統(tǒng)調(diào)試流程- 10 -</p><p> 4.2部分實物測試畫面- 11 -</p><p> 5設(shè)計心得體會-
6、 12 -</p><p> 6總結(jié)- 15 -</p><p> 參考文獻- 17 -</p><p> 附錄一總體電路原理圖- 18 -</p><p> 附錄二程序清單- 19 -</p><p> 附錄三元器件清單- 24 -</p><p> 數(shù)字時鐘及溫度采集系
7、統(tǒng)的設(shè)計</p><p> 摘要:溫度和時鐘作為常用的物理量在我們的日常生活中起著十分重要的作用,所以對數(shù)字時鐘及溫度采集的設(shè)計也十分必要。在此介紹一種智能數(shù)字時鐘及溫度采集系統(tǒng),本設(shè)計采用LCD液晶屏幕顯示系統(tǒng),以STC89C52RC單片機為核心,由鍵盤、定時鬧鈴、日期提醒、溫度顯示等功能模塊組成,該系統(tǒng)可以方便的實現(xiàn)溫度的采集和報警,可以根據(jù)需要任意設(shè)置上下限報警溫度。適合于我們?nèi)粘I詈凸?、農(nóng)業(yè)生產(chǎn)中的溫
8、度測量,也可以當(dāng)做溫度處理模塊潛入其他系統(tǒng)中,作為其他主系統(tǒng)的輔助擴展。DS18B20與AT89C52結(jié)合實現(xiàn)最簡溫度報警系統(tǒng),該系統(tǒng)結(jié)構(gòu)簡單,抗干擾能力強,適合于惡劣環(huán)境下進行現(xiàn)場溫度測量,有廣泛的應(yīng)用前景。</p><p> 關(guān)鍵詞:液晶顯示器LCD DS18b20 4×4鍵盤 單片機</p><p><b> 1總設(shè)計方案</b></p
9、><p> 本系統(tǒng)要求完成對時間顯示及環(huán)境溫度的采集,并進行處理和顯示。因此,首要解決的是采用哪種微控制器以及哪種傳感器來對時間及溫度進行采集處理包括計算,其次是采集到的時間及溫度將通過哪種方式去顯示或通過哪種方式顯示出來讓人一目了然。系統(tǒng)總設(shè)計框圖如下所示:</p><p> 圖1 系統(tǒng)總設(shè)計框圖</p><p> 1.1主控制器選擇方案</p>
10、<p> 目前是單片機產(chǎn)品百花齊放,百家爭鳴的時期。世界上各大芯片制造公司都推出了自己的芯片,例如我們常見的Intel8051系列、Motorola和M68HC系列、Atmel的AT89系列、Microchip公司的PIC系列、Atmel的AT90S系列等。不同型號的單片機功能各異、開發(fā)裝置也不兼容。我們最終選用了STC89C52單片機。STC89C52是高性能CMOS8位單片機,片內(nèi)含8KB的可反復(fù)擦寫的只讀程序存儲器(P
11、EROM)和256B的隨機存取數(shù)據(jù)存儲器(RAM),器件采用高密度、非易失性存儲技術(shù)生產(chǎn),與標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及8051產(chǎn)品引腳兼容,片內(nèi)置通用8位中央處理器(CPU)和FLASH存儲單元,功能強大STC89C52單片機適用于許多較為復(fù)雜控制應(yīng)用場合。盡管STC89C52單片機現(xiàn)在并不是最完善最先進的單片機,但是就其功能及相關(guān)資料在市面上非常豐富,編譯器已經(jīng)比較優(yōu)化,我們對其開發(fā)環(huán)境及開發(fā)語言也相當(dāng)熟悉,因此我們選擇STC89C5
12、2單片機作為主控制器來實現(xiàn)本設(shè)計系統(tǒng)。</p><p> 圖2 STC89C52芯片</p><p> 1.2溫度芯片選擇方案</p><p> 對于常用的中、低溫度范圍的測量,一般可使用熱敏電阻,半導(dǎo)體溫度傳感器等。但利用這些器件構(gòu)成的測溫電路線性度不高,電路組成較復(fù)雜,往往需要使用A/D轉(zhuǎn)換器等,使得系統(tǒng)成本增加,互換性差且不便于調(diào)試維護?,F(xiàn)在很多公司設(shè)計
13、制造了集成電路的溫度傳感器,使得芯片和單片機之間的連接相當(dāng)簡單。在這些集成溫度傳感器中,以美國的DALLAS公司生產(chǎn)的DS18B20的性能較為突出。</p><p> DS18B20的主要特性:</p><p> 單線接口,僅需一根接口線與單片機連接。</p><p> 每個芯片的內(nèi)部存儲器中存儲有該器件唯一的64位序列號。</p><p&
14、gt; 無需外圍元件即可實現(xiàn)溫度測量。</p><p> 可通過數(shù)據(jù)線供電,工作電壓范圍為3.0~5.5V。</p><p> 測溫范圍為-55~+125℃,在-10~+85℃范圍內(nèi)精度為±0.5℃.</p><p> 用戶可以選擇9~12位的分辨率,其中9位分辨率轉(zhuǎn)換時間為93.75ms,12位分辨率轉(zhuǎn)換時間為750ms。</p>
15、<p> 用戶可自行設(shè)定溫度報警的上、下限,其值在斷電后仍可保存,利用報警搜索命令可識別超限報警的器件。</p><p> DS18B20的引腳排列如下圖所示:</p><p> 圖3 DS18B20引腳圖</p><p><b> 1.3顯示選擇方案</b></p><p> 方案一:直接用數(shù)碼管
16、或者7段數(shù)碼管加MAX7219驅(qū)動顯示。MAX7219驅(qū)動7段數(shù)碼管采用低電壓掃描驅(qū)動具有:可以節(jié)約單片機I/O口,耗電少、使用壽命長、成本低、亮度高、故障少、視角大、可視距離遠(yuǎn)等特點;但是顯示單一,只能顯示數(shù)字和幾個字母。就本設(shè)計而言需要顯示很多的操作提示信息和報警信息,數(shù)碼管是難以達到的;且本設(shè)計需要單片機I/O口并不多,就STC89C52的資源來說不需要考慮I/O口資源不足的問題。</p><p> 方案
17、二:LED點陣顯示。LED點陣可以顯示多種字符以及圖形,可視距離遠(yuǎn),可用軟件進行調(diào)制,有很強的兼容性以及可操作性。但是需要占要很多系統(tǒng)資源來對其控制;而就STC89C52單片機的速度或系統(tǒng)資源來說控制LED點陣的效果并不很理想,而且LED點陣結(jié)構(gòu)比較龐大,不利隨身攜帶。</p><p> 方案三:LCD液晶顯示。LCD液晶零輻射、低功耗、散熱小、體積小、圖像還原精確、字符顯示銳利控制簡單等。與數(shù)碼管相比顯得更為
18、專業(yè)、漂亮;液晶顯示屏以其微功耗體積小,顯示內(nèi)容豐富、超薄輕巧、使用方便等諸多優(yōu)點,在通訊、儀器儀表、電子設(shè)備、家用電器等低功耗應(yīng)用系統(tǒng)中得到原來越廣泛的應(yīng)用,使這些電子設(shè)備的人機界面變得越來越形象,目前已廣泛的應(yīng)用于電子表、計算器、IC卡電話機機,液晶電視機、掌上玩具等許多方面。</p><p> 對于本設(shè)計來說只是顯示字符串和電子鐘,溫度的顯示,不需要遠(yuǎn)距離觀察,如果需要遠(yuǎn)距離觀察的話應(yīng)該首選LED點陣顯示
19、。本例結(jié)合需要及實際經(jīng)濟情況綜合考慮使用液晶LCD1602作為時間、溫度及信息顯示。</p><p> 液晶LCD1602如下圖所示:</p><p> 圖4 LCD1602液晶顯示器</p><p><b> 1.4數(shù)字時鐘方案</b></p><p> 數(shù)字時鐘根據(jù)需要可采用以下兩種方案實現(xiàn):</p&g
20、t;<p> 方案一:方案完全用軟件實現(xiàn)數(shù)字時鐘。原理為:在單片機內(nèi)部存儲器設(shè)三個字節(jié)分別存放時鐘的時、分、秒信息。利用定時器與軟件結(jié)合實現(xiàn)1秒定時中斷,每產(chǎn)生一次中斷,存儲器內(nèi)相應(yīng)的秒值加1;若秒值達到60,則將其清零,并將相應(yīng)的分字節(jié)值加1;若分值達到60,則清零分字節(jié),并將時字節(jié)值加1;若時值達到24,則將時字節(jié)清零。該方案具有硬件電路簡單的特點,但當(dāng)單片機不上電,程序?qū)⒉粓?zhí)行。而且由于每次執(zhí)行程序時,定時器都要重
21、新賦初值,所以該時鐘精度不高。</p><p> 方案二:方案采用Dallas公司的專用時鐘芯片DS1302。該芯片內(nèi)部采用石英晶體振蕩器,其芯片精度不大于10ms/年,且具有完備的時鐘鬧鐘功能,因此,可直接對其以用于顯示或設(shè)置,使得軟件編程相對簡單。為保證時鐘在電網(wǎng)電壓不足或突然掉電等突發(fā)情況下仍能正常工作,芯片內(nèi)部包含鋰電池。當(dāng)電網(wǎng)電壓不足或突然掉電時,可使系統(tǒng)自動轉(zhuǎn)換到內(nèi)部鋰電池供電系統(tǒng)。而且即使系統(tǒng)不上
22、電,程序不執(zhí)行時,鋰電池也能保證芯片的正常運行,以備隨時提供正確的時間。</p><p> 數(shù)字時鐘是作為我們的拓展方案進行的,由于時間緊迫,器件選買時間脫節(jié),因此我們選用方案一軟件實現(xiàn)數(shù)字時鐘。</p><p><b> 1.5鍵盤選擇方案</b></p><p> 鍵盤有獨立式和矩陣式。獨立式鍵盤一線一鍵,按鍵識別簡單,但占用較多口線
23、,適用于簡單的鍵盤設(shè)置中。矩陣式鍵盤按鍵識別采用掃描法或線路反轉(zhuǎn)法,編程復(fù)雜,但節(jié)省口資源,適用于復(fù)雜的鍵盤設(shè)置中。</p><p> 本設(shè)計中我們兩種鍵盤都用到了,利用獨立式按鍵進行不同顯示界面的切換;利用矩陣式鍵盤進行時鐘時間設(shè)置,溫度上,下限報警參數(shù)設(shè)置,需用按鍵較多,且為了以后將鍵盤嵌入到其他系統(tǒng)中使用,特將其獨立出來成一個模塊,我們選擇了4×4矩陣式鍵盤來調(diào)節(jié)溫度報警的上、下限,進行時間的設(shè)
24、置。</p><p><b> 2硬件設(shè)計</b></p><p><b> 2.1顯示模塊設(shè)計</b></p><p> 采用LCD1602液晶顯示,其中RS接P1.2;RW接P1.3;E接p1.4;D0~接P0.0~P0.7,具體如圖所示:</p><p> 圖5 LCD液晶顯示模塊&
25、lt;/p><p><b> 2.2測溫模塊設(shè)計</b></p><p> DS18B20采用一線傳輸協(xié)議,可以使用外部電源工作方式也可以采用寄生電源工作方式,本設(shè)計中采用外部電源工作模式,具體電路如圖</p><p><b> 圖6 測溫模塊</b></p><p> 2.3矩陣式鍵盤設(shè)計&l
26、t;/p><p> 設(shè)計采用矩陣式鍵盤進行時鐘設(shè)置,溫度上下限的調(diào)節(jié),如圖所示:</p><p><b> 圖7矩陣式鍵盤</b></p><p><b> 3軟件設(shè)計</b></p><p><b> 3.1主程序流程圖</b></p><p>
27、 通過外部中斷0控制顯示界面的轉(zhuǎn)換,每按一次按鍵產(chǎn)生一次中斷,顯示界面轉(zhuǎn)換一次 。</p><p><b> 圖8 主流程圖</b></p><p><b> 3.2測溫流程圖</b></p><p> 通過單片機讀取ds18b20溫度值并顯示,若超過所設(shè)報警上下限則報警。</p><p>&
28、lt;b> 圖9 測溫流程圖</b></p><p> 3.3時鐘顯示流程圖</p><p> 通過定時器0中斷產(chǎn)生時間基準(zhǔn)1s,并按照一定規(guī)律產(chǎn)生時間。</p><p> 圖10 時鐘顯示流程圖</p><p><b> 4系統(tǒng)調(diào)試過程</b></p><p><
29、;b> 4.1系統(tǒng)調(diào)試流程</b></p><p> 系統(tǒng)調(diào)試流程過程如下圖所示:</p><p> 圖11 系統(tǒng)調(diào)試流程圖</p><p> 4.2部分實物測試畫面</p><p> 圖12 開機畫面顯示</p><p> 圖13 小組成員顯示</p><p>
30、 圖 14 溫度信息顯示</p><p> 圖 15 時鐘顯示</p><p><b> 5設(shè)計心得體會 </b></p><p><b> 設(shè)計心得體會</b></p><p><b> - </b></p><p> 課程設(shè)計是我
31、們專業(yè)課程知識綜合應(yīng)用的實踐訓(xùn)練,是我們邁向社會,從事職業(yè)工作前一個必不可少的過程?!扒Ю镏惺加谧阆隆?,通過這次課程設(shè)計,我深深體會到這句千古名言的真正含義。我今天認(rèn)真的進行課程設(shè)計,學(xué)會腳踏實地邁開這一步,就是為明天能穩(wěn)健地在社會大潮中奔跑打下堅實的基礎(chǔ)。</p><p> 一周的課程設(shè)計很快結(jié)束了,短短的一周時間里,不僅檢驗了我們課堂上所學(xué)的理論知識,也考驗了我們團隊之間的分工合作能力。作為組里唯一的女生
32、,我負(fù)責(zé)撰寫論文,這并不意味著等我的搭檔完成軟硬件工作之后才開始工作。在組隊之后,我們先各抒己見,提出自己覺得合適的課題,最終討論總結(jié)得出一致意見。之后我們分頭找資料,最后統(tǒng)一出設(shè)計雛形。在進行實際軟硬件焊接調(diào)試過程中,我主要幫隊友做一些輔助工作。論文這里的要求的確挺高的,但對自己也是一種挑戰(zhàn)。不過我覺得只有想不到的,沒有做不到的,面對問題,不能逃避。只有一步一步的去發(fā)現(xiàn)去探索才可以解決問題。</p><p>
33、 課程設(shè)計就是要我們在實踐中尋找理論的價值。我這次深刻的體會到了深刻的理解理論知識是實踐成功的根本,細(xì)節(jié)決定成敗。團隊的合作很重要,只要很好的利用團隊合作事情就會事倍功半。在以后的學(xué)習(xí)工作中我會總結(jié)這次的經(jīng)驗努力做到最好。這次的設(shè)計讓我有很大的成就感,雖然有時候也有一整天什么也做不出來的郁悶,但自己學(xué)會一些東西是這么愉快的一件事。通過這次學(xué)習(xí),讓我對各種電路都有了大概的了解。所以說,坐而言不如立而行,對于這些電路還是應(yīng)該自己動手實際操作
34、才會有深刻理解。我真真正正的意識到,在以后的學(xué)習(xí)中,要理論聯(lián)系實際,把我們所學(xué)的理論知識用到實際當(dāng)中,學(xué)習(xí)單機片機更是如此,程序只有在經(jīng)常的寫與讀的過程中才能提高,這就是我在這次課程設(shè)計中的最大收獲。</p><p> 在本次設(shè)計完成之際,我心中滿懷感激之情,在此我代表我們?nèi)M向老師,同學(xué)和身邊所有關(guān)心過我們組的和為我們組提供過幫助的人表示感謝!</p><p><b> 設(shè)
35、計心得體會</b></p><p><b> - </b></p><p> 經(jīng)過這一周課程設(shè)計的實際鍛煉,我對于單片機及一些元器件的認(rèn)識有了極大的提高,同時我在編程方法及技巧方面也得到很大的鍛煉。作為此次課程設(shè)計的軟件主要負(fù)責(zé)人,要想編程及調(diào)試成功,首先要了解并掌握所用到的元器件,此次課程設(shè)計中我們用到了lcd、4*4矩陣鍵盤及ds18b20等,因此
36、在編程之前我好好學(xué)習(xí)了這些方面的知識,同時也熟練了一下單片機方面的知識。在編程調(diào)試過程中我深深體會到分階段、有次序編程調(diào)試以及編程算法和編程思想的重要性,在編程之前首先要確定所要實現(xiàn)的一些基本功能,并針對各功能分別進行編程調(diào)試,然后再一個個將各功能模塊融合調(diào)試,所定義的功能都實現(xiàn)后,然后可以再增加功能并調(diào)試,另外,在每一環(huán)節(jié)的編程調(diào)試中,都首先要在頭腦中形成一個編程算法,即要明確一個功能一步步的實現(xiàn)過程,這樣編程就容易多了,出現(xiàn)問題后,
37、首先對導(dǎo)致問題的原因進行猜測并逐一嘗試排除,最終找出問題的根源并解決,編程調(diào)試過程可能比較繁瑣,有時候一個問題很難找出其原因,不過在每一步的成功之后,都會感到無比的喜悅,同時也激勵了我不斷前進的意志。此次課程設(shè)計讓我感受最深的是團隊合作的重要性,我們組員之間在這次課程設(shè)計中相互配合非</p><p> 最后,感謝老師長期以來的辛勤教誨!</p><p><b> 設(shè)計心得體會
38、 </b></p><p><b> - </b></p><p> 本次課程設(shè)計中,我主要負(fù)責(zé)電路板各模塊的布局及焊接,設(shè)計系統(tǒng)的仿真(proteus軟件)及部分程序的調(diào)試。</p><p> 對我自己而言,初次接觸數(shù)字電子時鐘及溫度采集的課設(shè)是非常感興趣的,因為自己喜歡動手焊接電路板,所以組內(nèi)我負(fù)責(zé)硬件部分。辛苦雖然是不可
39、避免的,但收獲還是令人尤為欣慰。知識固然得到了鞏固和提高,我一直相信在實踐過程中的切身體會將會使我在以后學(xué)習(xí)中更加透徹的理解知識。我不僅對理論有了更深一步的認(rèn)識,而且增強了和外界技術(shù)的溝通,還培養(yǎng)了自學(xué)能力和分析解決問題的能力,更重要的是,培養(yǎng)了克服困難的勇氣和信心。</p><p> 一開始對用到的主要元器件(LCD1602、DS18b20)的結(jié)構(gòu)、原理并不是很了解,通過查閱資料,學(xué)習(xí)電路原理及各部件的組成,
40、了解芯片功能以及各引腳如何接線,最主要的是清楚地知道電路設(shè)計中用到的各元器件的功能作用和型號。學(xué)習(xí)了這些相關(guān)的知識后就是進行電路板的焊接工作了,當(dāng)然不是直接開始動手,而是要對電路板上的各模塊進行布局,這樣在焊接過程中就不會感覺到電路很亂很難看,也不會影響到后面插線等一系列工作。焊接電路過程中并沒有出現(xiàn)什么大的問題,最多就是接線連接錯誤,通過和組員的認(rèn)真討論和認(rèn)真仔細(xì)就不會有這種錯誤了。我清楚的明白了合理的布線對于別的組員看電路板以及之后
41、有錯誤時檢查非常重要。</p><p> Proteus軟件仿真的認(rèn)識,Proteus軟件提供了數(shù)千種元器件和多達30多個元件庫。在Proteus軟件中,理論上同一種儀器可以在一個電路中隨意的調(diào)用。除了現(xiàn)實存在的儀器外,Proteus還可以以圖形的方式實時地顯示線路上變化的信號。虛擬儀器儀表具有理想的參數(shù)指標(biāo),可減少儀器對測量結(jié)果的影響。Proteus提供了比較豐富的測試信號用于電路的測試。這些測試信號包括模擬
42、信號和數(shù)字信號。</p><p> 最后通過組員的編程序修正調(diào)試,數(shù)字電子時鐘及溫度采集系統(tǒng)已經(jīng)完成,達到了設(shè)計要求。</p><p> 本次我們設(shè)計的數(shù)字電子時鐘及溫度采集系統(tǒng)已經(jīng)完成,達到了設(shè)計要求。在這一周實習(xí)的過程中讓我受益匪淺,這是一個理論結(jié)合實踐的過程。雖然在過程中遇到了許多問題,但是都通過查閱資料,和同學(xué)討論得到了解決。在這次實習(xí)中,我自己焊接電路,這是一個對于我們理解理
43、論知識非常有用的過程。在這一系列設(shè)計的過程中通過我們共同的努力,學(xué)習(xí)到了不少知識和經(jīng)驗,感受頗多。通過這一次實踐,增強了我們的動手能力,提高和鞏固了單片機方面的知識,特別是軟件方面。從中增強了我們的團隊合作精神,并讓我們認(rèn)識到把理論應(yīng)用到實踐中去是多么重要。同時,我的人際交流能力得到鍛煉。人非生而知之者!人的學(xué)識總是不能面面俱到的,這就要求我們必須善于借鑒別人的成功經(jīng)驗或失敗教訓(xùn),使自己少走彎路。在以后的時間里面我將會用這種精神去工作。
44、</p><p><b> 6總結(jié)</b></p><p> 本設(shè)計是以溫度采集及時鐘顯示為總目標(biāo),以STC89C52單片機最小應(yīng)用系統(tǒng)為總控制中心,外圍設(shè)計有溫度采集電路,矩陣式鍵盤,LCD顯示器等。</p><p> 本設(shè)計的重點、難點是:</p><p> ?。?)要掌握LCD顯示器、溫度傳感器的原理、結(jié)構(gòu)、
45、應(yīng)用等;</p><p> ?。?)熟悉C語言編程技術(shù),實現(xiàn)單片機對溫度的調(diào)節(jié)控制;</p><p> ?。?)字符串之間的轉(zhuǎn)換及顯示;</p><p> ?。?)整體電路的仿真調(diào)試。</p><p> 本次設(shè)計優(yōu)點:采用的單片機STC89C52 性價比高;DS18B20溫度傳感器轉(zhuǎn)化溫度的方法非常簡潔且精度高、測試范圍較廣。由于時間及精力
46、所限,對溫度控制系統(tǒng)做了整體設(shè)計,具體實現(xiàn)了其中的溫度報警部分設(shè)計,即溫度控制系統(tǒng)的采集、顯示及報警模塊。實物圖如下所示:</p><p><b> 圖16 實物圖 </b></p><p><b> 致謝</b></p><p> 在論文完成之際,我們首先要向劉老師,王老師表示最真摯的謝意。兩位老師不僅工作認(rèn)真,他
47、們嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度令我們受益匪淺,給我們以后的生活學(xué)習(xí)帶來了深遠(yuǎn)的影響。在此衷心的向老師表達我們的感激之情。</p><p> 我們還要特別感謝各位同學(xué)給予了我們無私的幫助,他們幫我們解決了很多設(shè)計中遇到的難題。由于學(xué)識有限,加之時間倉促,文中不免有錯誤和待改進之處,真誠歡迎老師、同學(xué)提出寶貴意見。</p><p><b> 參考文獻:</b></p>
48、<p> [1]柴鈺,單片機原理及應(yīng)用 西安電子科技大學(xué)出版社,2009</p><p> [2]張義和,陳敵北,例說8051[M]北京 人民郵電出版社,2006</p><p> [3]李丹妮,單片機溫度控制系統(tǒng)設(shè)計[J]九江學(xué)院報2005</p><p> [4]謝龍漢,莫衍,Proteus電子電路設(shè)計及仿真 電子工業(yè)出版社,2012<
49、/p><p> [5]劉篤仁,韓保君,傳感器原理及應(yīng)用技術(shù) 西安電子科技大學(xué)出版社,2008</p><p> 附錄一總體電路原理圖</p><p><b> 附錄二程序清單</b></p><p> #include<reg51.h></p><p> #define ucha
50、r unsigned char</p><p> #define uint unsigned int</p><p> sbit speak=P1^0;//蜂鳴器接口定義</p><p> sbit dq=P1^6;//ds18b20數(shù)據(jù)線接口定義</p><p> sbit RS=P1^2;</p><p>
51、 sbit RW=P1^3;</p><p> sbit E=P1^4;</p><p><b> /*函數(shù)定義*/</b></p><p> void delay(uint k);</p><p> void init_watch(void);</p><p> void lcd_i
52、nit(void);</p><p> void showchar(void);</p><p> void lcd_write_command(uchar dat);</p><p> void lcd_write_data(uchar dat);</p><p> void display(uchar *p);</p>
53、<p> void watch_show(void);</p><p> uint read_temp(void);</p><p> void ds18b20_reset(void);</p><p> uchar ds18b20_readdata(void);</p><p> void ds18b20_write
54、data(uchar dat);</p><p> void ds18b20_temp_display(void);</p><p> void key_scan(void);</p><p> uchar code table[]={0x10,0x06,0x09,</p><p> 0x08,0x08,0x09,0x06,0x00}
55、;//字符℃</p><p> uchar tab[]={0x30,0x31,0x32,0x33,0x34,</p><p> 0x35,0x36,0x37,0x38,0x39};//0~9ASCII碼</p><p> /*字符串及變量定義*/</p><p> uchar code str1[]={"currentT:&
56、quot;};</p><p> uchar code str2[]={"TH:"};</p><p> uchar code str3[]={"TL:"};</p><p> uchar code str4[]={"member1:"};</p><p> uchar co
57、de str5[]={"wang yan li!"};</p><p> uchar code str6[]={"member2:"};</p><p> uchar code str7[]={"lan rong!"};</p><p> uchar code str8[]={"member
58、3:"};</p><p> uchar code str9[]={"chen qiu qiu!"};</p><p> uchar code str10[]={" Welcome"};</p><p> uchar code str11[]={"To Dian Kong!"};<
59、;/p><p> uchar hour1,hour2,min1,min2,sec1,</p><p> sec2,t,hour,min,sec,tflag;</p><p> uchar year1,year2,year3,year4,month,</p><p> month1,month2,day,day1,day2;</p&g
60、t;<p> uchar moshi=0;//初始顯示界面定義</p><p> uint year,tvalue,temph=30,templ=15;</p><p> unsigned data disdata[5];</p><p> void delay(uint k)</p><p> { while(k--
61、);}</p><p> /*lcd初始化*/</p><p> void lcd_init(void)</p><p> { lcd_write_command(0x30);</p><p> lcd_write_command(0x30);</p><p> lcd_write_command(0x30)
62、;</p><p> lcd_write_command(0x38);</p><p> lcd_write_command(0x08);</p><p> lcd_write_command(0x01);</p><p> lcd_write_command(0x06);</p><p> lcd_writ
63、e_command(0x0c);</p><p><b> }</b></p><p> /*始終初始化及中斷定義*/</p><p> void init_watch()</p><p> { hour=10;year=2012;month=7;day=5;</p><p> lcd_
64、init();</p><p> TMOD=0x01; //工作方式1 </p><p> TH0=(65536-5000)/256; </p><p> TL0=(65536-5000)%256; </p><p> EA=1; //開總中
65、斷 </p><p> ET0=1; //開定時器中斷0 </p><p> EX0=1; //開外部中斷0</p><p> IT0=1;//外部中斷0下降沿觸發(fā)</p><p> TR0=1;//啟動定時器0 </p><p
66、><b> }</b></p><p> /*顯示溫度界面提示字符*/</p><p> void showchar(void)</p><p> { lcd_init();</p><p> lcd_write_command(0x80);</p><p> display(s
67、tr1);//顯示字符串str1</p><p><b> }</b></p><p> /*lcd寫命令子程序*/</p><p> void lcd_write_command(uchar dat)</p><p><b> { P0=dat;</b></p><p&
68、gt;<b> RS=0;</b></p><p><b> RW=0;</b></p><p><b> E=1;</b></p><p><b> E=0;</b></p><p> delay(100);</p><p&
69、gt;<b> }</b></p><p> /*lcd寫數(shù)據(jù)子程序*/</p><p> void lcd_write_data(uchar dat)</p><p><b> { P0=dat;</b></p><p><b> RS=1;</b></p&g
70、t;<p><b> RW=0;</b></p><p><b> E=1;</b></p><p><b> E=0;</b></p><p> delay(100);</p><p><b> }</b></p>
71、<p> /*lcd顯示時間*/</p><p> void watch_show()</p><p> { year1=year/1000;year2=year/100%10;</p><p> year3=year%100/10;year4=year%10; </p><p> month1=month/10;mo
72、nth2=month%10;</p><p> day1=day/10;day2=day%10;hour1=hour/10; </p><p> hour2=hour%10;min1=min/10;</p><p> min2=min%10; sec1=sec/10;sec2=sec%10;</p><p> lcd_write_c
73、ommand(0x84); </p><p> lcd_write_data(tab[hour1]);//顯示時高位 </p><p> lcd_write_data(tab[hour2]);//顯示時低位 </p><p> lcd_write_data(0x3a); </p><p
74、> lcd_write_data(tab[min1]);//顯示分高位 </p><p> lcd_write_data(tab[min2]);//顯示分低位 </p><p> lcd_write_data(0x3a); </p><p> lcd_write_data(tab[sec1]);//顯示秒高
75、位</p><p> lcd_write_data(tab[sec2]);//顯示秒低位</p><p> lcd_write_command(0xc3);//下四行顯示年</p><p> lcd_write_data(tab[year1]);</p><p> lcd_write_data(tab[year2]);</p&g
76、t;<p> lcd_write_data(tab[year3]);</p><p> lcd_write_data(tab[year4]);</p><p> lcd_write_data('-');//顯示-</p><p> lcd_write_data(tab[month1]);//顯示月高位</p>&l
77、t;p> lcd_write_data(tab[month2]);//顯示月低位</p><p> lcd_write_data('-');</p><p> lcd_write_data(tab[day1]);//顯示日高位</p><p> lcd_write_data(tab[day2]);//顯示日低位</p>&
78、lt;p><b> }</b></p><p> /*顯示字符子程序*/</p><p> void display(uchar *p)</p><p> { while(*p!='\0')</p><p> { lcd_write_data(*p);p++; }</p>&
79、lt;p><b> }</b></p><p> /*ds18b20復(fù)位*/ </p><p> void ds18b20_reset(void)</p><p><b> { dq=0;</b></p><p> delay(100);</p><p&g
80、t;<b> dq=1;</b></p><p> delay(50);</p><p><b> }</b></p><p> /*讀ds8b20數(shù)據(jù)*/</p><p> uchar ds18b20_readdata(void)</p><p> { ucha
81、r i,value;</p><p><b> value=0;</b></p><p> for(i=8;i>0;i--)</p><p><b> { dq=0;</b></p><p> value>>=1;</p><p><b>
82、 dq=1;</b></p><p><b> if(dq)</b></p><p> { value|=0x80;}</p><p><b> delay(5);</b></p><p><b> }</b></p><p>
83、return(value);</p><p><b> }</b></p><p> /*ds18b20寫數(shù)據(jù)*/</p><p> void ds18b20_writedata(uchar dat)</p><p> { uchar i;</p><p> for(i=8;i>0
84、;i--)</p><p><b> { dq=0;</b></p><p> dq=dat&0x01;</p><p><b> delay(5);</b></p><p><b> dq=1;</b></p><p><b>
85、; dat>>=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> /*讀取溫度并轉(zhuǎn)換*/</p><p> uint read_temp(void)</p><p> { uchar
86、 a,b;</p><p> ds18b20_reset();</p><p> ds18b20_writedata(0xcc);</p><p> ds18b20_writedata(0x44);</p><p> delay(100);</p><p> ds18b20_reset();</p>
87、;<p> ds18b20_writedata(0xcc);</p><p> ds18b20_writedata(0xbe);</p><p> delay(100);</p><p> a=ds18b20_readdata();</p><p> b=ds18b20_readdata();</p>&
88、lt;p><b> tvalue=b;</b></p><p> tvalue<<=8;</p><p> tvalue=tvalue|a;</p><p> if(tvalue<=0x0fff)</p><p> tflag=0;//溫度符號位為正</p><p&g
89、t;<b> else</b></p><p> { tvalue=~tvalue+1;tflag=1; }//符號位為負(fù)</p><p> tvalue=tvalue*0.625;</p><p> return(tvalue);</p><p><b> }</b></p>
90、<p><b> /*溫度顯示*/</b></p><p> void ds18b20_temp_display(void)</p><p> { char flagdat,m=0; </p><p> disdata[0]=tvalue/1000+0x30;</p><p> disdata[1
91、]=(tvalue%1000)/100+0x30;</p><p> disdata[2]=(tvalue%100)/10+0x30;</p><p> disdata[3]=tvalue%10+0x30;</p><p> if(tflag==0) flagdat=' ';//溫度為正不顯示</p><p> el
92、se flagdat=0x2d;//溫度為負(fù)則顯示-</p><p> if(disdata[0]==0x30)</p><p> { disdata[0]=0x20;//溫度最高位為0不顯示</p><p> if(disdata[1]==0x30)</p><p> { disdata[1]=0x20; }</p>
93、<p><b> }</b></p><p> lcd_write_command(0x89);</p><p> lcd_write_data(flagdat);//顯示符號位</p><p> lcd_write_data(disdata[0]);//顯示溫度</p><p> lcd_writ
94、e_data(disdata[1]);</p><p> lcd_write_data(disdata[2]);</p><p> lcd_write_data(0x2e);//顯示小數(shù)點</p><p> lcd_write_data(disdata[3]);//顯示溫度小數(shù)位</p><p> lcd_write_command(
95、0x40); for(m=0;m<8;m++) //CGRAM中寫入字符℃ </p><p> { lcd_write_data(table[m]); } </p><p> lcd_write_command(0x8f); </p><p> lcd_write_data(0x00);//顯示字符℃ <
96、;/p><p> lcd_write_command(0xc0);</p><p> display(str2);</p><p> lcd_write_data((temph/10)+0x30);</p><p> lcd_write_data((temph%10)+0x30);</p><p> lcd_wr
97、ite_command(0xc5); </p><p> lcd_write_data(0x00); </p><p> lcd_write_command(0xc9);</p><p> display(str3);</p><p> lcd_write_data((templ/10)+0x30);</p>
98、<p> lcd_write_data((templ%10)+0x30);</p><p> lcd_write_command(0xce); </p><p> lcd_write_data(0x00);</p><p><b> }</b></p><p> /*定時器0中斷產(chǎn)生
99、時間*/</p><p> void timer0() interrupt 1</p><p> {TH0=(65536-50000)/256; </p><p> TL0=(65536-50000)%256;</p><p><b> t++;</b></p>&l
100、t;p> if(t==20) </p><p><b> { t=0;</b></p><p> sec++; </p><p> if(sec==60) </p><p>
101、;<b> { sec=0;</b></p><p><b> min++;</b></p><p> if(min==60)</p><p><b> { min=0;</b></p><p><b> hour++;</b></p>
102、;<p> if(hour==24)</p><p><b> { hour=0;</b></p><p> day++; </p><p> if((month==1||month==3||month==5||</p><p> month=7||month==8||m
103、onth==10||</p><p> month==12)&&day==32)</p><p><b> { day=1;</b></p><p><b> month++;</b></p><p> } </p><p>
104、if((month==4||month==6||month==9||</p><p> month==11)&&day==31)</p><p><b> { day=1;</b></p><p><b> month++;</b></p><p> }
105、</p><p> if(year%4!=0&&month==2&&day==29)</p><p><b> { day=1;</b></p><p><b> month++;</b></p><p> } </p>&l
106、t;p> if(year%4==0&&month==2&&day==30)</p><p><b> { day=1;</b></p><p><b> month++;</b></p><p><b> }</b></p><p>
107、; if(month==13)</p><p> { month=1;</p><p><b> year++;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }<
108、;/b></p><p><b> } </b></p><p><b> }</b></p><p><b> }</b></p><p> /*外部中斷0實現(xiàn)顯示界面的轉(zhuǎn)換*/</p><p> void iint0() inter
109、rupt 0</p><p> { moshi++;//一次中斷則顯示界面轉(zhuǎn)換一次</p><p> if(moshi==6) moshi=0;//共6個顯示界面</p><p><b> } </b></p><p> /*4*4鍵盤掃描*/</p><p> uchar Keyca
110、n(void) </p><p> { uchar rcode, ccode;</p><p> P2=0xF0; </p><p> if((P2&0xF0) != 0xF0) </p><p> { delay(30000);</p><p> if((P2&0xF0) != 0
111、xF0)</p><p> {rcode=0xFE; </p><p> while((rcode&0x10) != 0)</p><p> {P2=rcode; </p><p> if((P2&0xF0) != 0xF0) </p><
112、;p> { ccode = (P2&0xF0)|0x0F;</p><p> do{;}while((P2&0xF0)!=0xF0);</p><p> return ((~rcode) + (~ccode)); </p><p><b> }</b></p><p><b>
113、Else</b></p><p> rcode = (rcode<<1)|0x01; </p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
114、return 0; </p><p><b> }</b></p><p> /*根據(jù)掃描結(jié)果調(diào)整報警上下限、日期及時間*/</p><p> void KeyDispaly(uchar key)</p><p> { switch(key)</p><p> {case 0x11: t
115、emph++; break;//提高報警上限</p><p> case 0x21: temph--; break;//降低報警上限</p><p> case 0x41: templ++; break;//提高報警下限</p><p> case 0x81: templ--; break;//降低報警下限</p><p> case
116、 0x12: sec++; break;//按鍵增加秒</p><p> case 0x22: sec--; break;//按鍵降低秒</p><p> case 0x42: min++; break;//按鍵增加分</p><p> case 0x82: min--; break;//按鍵降低分</p><p> case 0x1
117、4: hour++; break;//按鍵增加時</p><p> case 0x24: hour--; break;//按鍵降低時</p><p> case 0x44: day++; break;//按鍵增加日</p><p> case 0x84: day--; break;//按鍵降低日</p><p> case 0x18:
118、 month++; break;//按鍵增加月</p><p> case 0x28: month--; break;//按鍵降低月</p><p> case 0x48: year++; break;//按鍵增加年</p><p> case 0x88: year--; break;//按鍵降低年</p><p> default:
119、 break;</p><p><b> }</b></p><p><b> }</b></p><p><b> /*主程序*/</b></p><p> void main(void)</p><p> { uchar Key; <
120、/p><p><b> dq=1;</b></p><p> speak=1;//初始蜂鳴器不報警</p><p> init_watch();</p><p><b> while(1)</b></p><p> { if(moshi==0)//顯示界面1</p
121、><p> { lcd_write_command(0x01);</p><p> while(moshi==0)</p><p> { lcd_write_command(0x80);</p><p> display(str10);</p><p> lcd_write_command(0xc1);</
122、p><p> display(str11);</p><p><b> }</b></p><p><b> } </b></p><p> if(moshi==1)//顯示界面2</p><p> { lcd_write_command(0x01);//lcd清屏&l
123、t;/p><p> while(moshi==1)</p><p> { lcd_write_command(0x80);</p><p> display(str4);</p><p> lcd_write_command(0xc2);</p><p> display(str5);</p>&l
124、t;p><b> }</b></p><p><b> }</b></p><p> if(moshi==2)//顯示界面3</p><p> { lcd_write_command(0x01);</p><p> while(moshi==2)</p><p&g
125、t; { lcd_write_command(0x80);</p><p> display(str6);</p><p> lcd_write_command(0xc3);</p><p> display(str7);</p><p><b> }</b></p><p><b
126、> }</b></p><p> if(moshi==3)//顯示界面4</p><p> { lcd_write_command(0x01);</p><p> while(moshi==3)</p><p> { lcd_write_command(0x80);</p><p> di
127、splay(str8);</p><p> lcd_write_command(0xc1);</p><p> display(str9);</p><p><b> }</b></p><p><b> }</b></p><p> if(moshi==4)//顯
128、示界面5</p><p> { lcd_write_command(0x01);</p><p> showchar();</p><p> while(moshi==4)</p><p> { read_temp();//讀溫度</p><p> if(((tvalue/10)%100)>=temph
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設(shè)計---單片機數(shù)字時鐘
- 單片機課程設(shè)計--數(shù)字時鐘
- 單片機數(shù)字時鐘課程設(shè)計
- 單片機課程設(shè)計--數(shù)字時鐘
- 單片機課程設(shè)計(數(shù)字時鐘)
- 單片機課程設(shè)計報告---單片機數(shù)字時鐘
- 單片機課程設(shè)計--基于單片機的數(shù)字時鐘設(shè)計
- 課程設(shè)計-單片機基于單片機的數(shù)字時鐘設(shè)計
- 單片機課程設(shè)計---單片機數(shù)字時鐘.doc
- 單片機課程設(shè)計---數(shù)字時鐘的設(shè)計
- 單片機課程設(shè)計--遠(yuǎn)程溫度采集系統(tǒng)
- 單片機課程設(shè)計數(shù)字時鐘
- 單片機數(shù)字時鐘控制課程設(shè)計
- 數(shù)字時鐘的課程設(shè)計--基于單片機的數(shù)字時鐘
- 單片機課程設(shè)計報告---基于單片機的數(shù)字時鐘設(shè)計
- 單片機數(shù)字時鐘課程設(shè)計報告
- 單片機課程設(shè)計數(shù)字時鐘
- 課程設(shè)計---基于單片機的溫度采集系統(tǒng)設(shè)計
- 單片機課程設(shè)計--基于單片機的溫度數(shù)據(jù)采集系統(tǒng)設(shè)計
- 單片機課程設(shè)計---時鐘系統(tǒng)設(shè)計
評論
0/150
提交評論