恒溫控制系統(tǒng)設(shè)計(jì)畢業(yè)設(shè)計(jì)論文_第1頁
恒溫控制系統(tǒng)設(shè)計(jì)畢業(yè)設(shè)計(jì)論文_第2頁
恒溫控制系統(tǒng)設(shè)計(jì)畢業(yè)設(shè)計(jì)論文_第3頁
恒溫控制系統(tǒng)設(shè)計(jì)畢業(yè)設(shè)計(jì)論文_第4頁
恒溫控制系統(tǒng)設(shè)計(jì)畢業(yè)設(shè)計(jì)論文_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

PAGEPAGE26畢業(yè)設(shè)計(jì)說明書題目:恒溫控制系統(tǒng)產(chǎn)品設(shè)計(jì)工藝設(shè)計(jì)方案設(shè)計(jì)√類型:學(xué)生姓名:學(xué)號:學(xué)院:電子信息工程學(xué)院專業(yè):應(yīng)用電子技術(shù)班級:學(xué)校指導(dǎo)教師:企業(yè)指導(dǎo)教師:2015年11月25日摘要隨著時代的進(jìn)步和發(fā)展,溫度的測試已經(jīng)影響到我們的生活、工作、科研、各個領(lǐng)域,已經(jīng)成為了一種非常重要的事情,因此設(shè)計(jì)一個溫度測試的系統(tǒng)勢在必行。本文主要介紹了一個基于STC89C52單片機(jī)的數(shù)字溫度報(bào)警器系統(tǒng)。詳細(xì)描述了利用數(shù)字溫度傳感器DS18B20開發(fā)測溫系統(tǒng)的過程,重點(diǎn)對傳感器在單片機(jī)下的硬件連接,軟件編程以及各模塊系統(tǒng)流程進(jìn)行了詳盡分析,對各部分的電路也一一進(jìn)行了介紹,該系統(tǒng)可以方便的實(shí)現(xiàn)溫度的采集和報(bào)警,并可以根據(jù)需要任意上下限報(bào)警溫度,它使用起來相當(dāng)方便,具有精度高、量程寬、靈敏度高、體積小、功耗低等優(yōu)點(diǎn),適合于我們?nèi)粘I詈凸?、農(nóng)業(yè)生產(chǎn)中的溫度測量,也可以當(dāng)做溫度處理模塊潛入其他系統(tǒng)中,作為其他主系統(tǒng)的輔助擴(kuò)展。DS18B20與STC89C52結(jié)合實(shí)現(xiàn)最簡溫度報(bào)警系統(tǒng),該系統(tǒng)結(jié)構(gòu)簡單,抗干擾能力強(qiáng),適合于惡劣環(huán)境下進(jìn)行現(xiàn)場溫度測量,有廣泛的應(yīng)用前景。關(guān)鍵詞:單片機(jī);溫度檢測;STC89C52;DS18B20目錄TOC\o"1-2"\h\z\u1、設(shè)計(jì)要求與方案論證 41.1設(shè)計(jì)要求 41.2系統(tǒng)基本方案選擇和論證 41.3溫度傳感器設(shè)計(jì)方案論證 51.4電路設(shè)計(jì)最終方案決定 62、元器件簡介 62.1單片機(jī)介紹 62.2、DS18B20概述 72.3、數(shù)碼管介紹 73、電路(硬件)設(shè)計(jì) 83.1、設(shè)計(jì)原理 83.2、原理圖 93.3、原件清單 103.4、作品實(shí)物圖 104、程序(軟件)設(shè)計(jì) 115、裝配與調(diào)試 116、總結(jié) 11致謝 13參考文獻(xiàn) 13附:源程序 141設(shè)計(jì)要求與方案論證首先明確設(shè)計(jì)要求,再討論方案,一一攻破設(shè)計(jì)的難點(diǎn)。1.1設(shè)計(jì)要求基本范圍0℃-99℃;精度誤差小于0.1℃;數(shù)碼管直讀顯示;擴(kuò)展功能:可以任意設(shè)定溫度的上下限報(bào)警功能。1.2系統(tǒng)基本方案選擇和論證由于單片機(jī)具有以下的很多優(yōu)點(diǎn),被我們選定為制作該作品的首選芯片單片機(jī)特點(diǎn):(1)高集成度,體積小,高可靠性單片機(jī)將各功能部件集成在一塊晶體芯片上,集成度很高,體積自然也是最小的。芯片本身是按工業(yè)測控環(huán)境要求設(shè)計(jì)的,內(nèi)部布線很短,其抗工業(yè)噪音性能優(yōu)于一般通用的CPU。單片機(jī)程序指令,常數(shù)及表格等固化在ROM中不易破壞,許多信號通道均在一個芯片內(nèi),故可靠性高。(2)控制功能強(qiáng)為了滿足對對象的控制要求,單片機(jī)的指令系統(tǒng)均有極豐富的條件:分支轉(zhuǎn)移能力,I/O口的邏輯操作及位處理能力,非常適用于專門的控制功能。(3)低電壓,低功耗,便于生產(chǎn)便攜式產(chǎn)品為了滿足廣泛使用于便攜式系統(tǒng),許多單片機(jī)內(nèi)的工作電壓僅為1.8V~3.6V,而工作電流僅為數(shù)百微安。(4)易擴(kuò)展片內(nèi)具有計(jì)算機(jī)正常運(yùn)行所必需的部件。芯片外部有許多供擴(kuò)展用的三總線及并行、串行輸入/輸出管腳,很容易構(gòu)成各種規(guī)模的計(jì)算機(jī)應(yīng)用系統(tǒng)。(5)優(yōu)異的性能價格比單片機(jī)的性能極高。為了提高速度和運(yùn)行效率,單片機(jī)已開始使用RISC流水線和DSP等技術(shù)。單片機(jī)的尋址能力也已突破64KB的限制,有的已可達(dá)到1MB和16MB,片內(nèi)的ROM容量可達(dá)62MB,RAM容量則可達(dá)2MB。由于單片機(jī)的廣泛使用,因而銷量極大,各大公司的商業(yè)競爭更使其價格十分低廉,其性能價格比極高。方案一:采用STC89C52芯片作為硬件核心。STC89C52內(nèi)部具有16KBROM存儲空間,512字節(jié)數(shù)據(jù)存儲空間,帶有2K字節(jié)的EEPROM存儲空間,與MCS-51系列單片機(jī)完全兼容,STC89C52可以通過串口下載。方案二:采用AT89S51。AT89S51片內(nèi)具有8K字節(jié)程序存儲空間,256字節(jié)的數(shù)據(jù)存儲空間沒有EEPROM存儲空間,也與MCS-51系列單片機(jī)完全兼容,具有在線編程可擦除技術(shù)。兩種單片機(jī)都完全能夠滿足設(shè)計(jì)需要,STC89C52相對AT89S51價格便宜,且抗干擾能力強(qiáng)。考慮到成本因素,因此選用STC89C52。1.3溫度傳感器設(shè)計(jì)方案論證利用物質(zhì)各種物理性質(zhì)隨溫度變化的規(guī)律把溫度轉(zhuǎn)換為電量的傳感器。這些呈現(xiàn)規(guī)律性變化的物理性質(zhì)主要有體。溫度傳感器是溫度測量儀表的核心部分,品種繁多。按測量方式可分為接觸式和非接觸式兩大類,按照傳感器材料及電子元件特性分為熱電阻和熱電偶兩類?,F(xiàn)代信息技術(shù)的三大基礎(chǔ)是信息采集(即傳感器技術(shù))、信息傳輸(通信技術(shù))和信息處理(計(jì)算機(jī)技術(shù))。溫度傳感器的發(fā)展大致經(jīng)歷了以下三個階段;(1)傳統(tǒng)的分立式溫度傳感器(含敏感元件);(2)模擬集成溫度傳感器/控制器;(3)智能溫度傳感器。國際上新型溫度傳感器正從模擬式向數(shù)字式、由集成化向智能化、網(wǎng)絡(luò)化的方向發(fā)展。在20世紀(jì)90年代中期最早推出的智能溫度傳感器,采用的是8位A/D轉(zhuǎn)換器,其測溫精度較低,分辨力只能達(dá)到1°C。國外已相繼推出多種高精度、高分辨力的智能溫度傳感器,所用的是9~12位A/D轉(zhuǎn)換器,分辨力一般可達(dá)0.5~0.0625°C。由美國DALLAS半導(dǎo)體公司新研制的DS1624型高分辨力智能溫度傳感器,能輸出13位二進(jìn)制數(shù)據(jù),其分辨力高達(dá)0.03125°C,測溫精度為±0.2°C。為了提高多通道智能溫度傳感器的轉(zhuǎn)換速率,也有的芯片采用高速逐次逼近式A/D轉(zhuǎn)換器。目前,智能溫度傳感器的總線技術(shù)也實(shí)現(xiàn)了標(biāo)準(zhǔn)化、規(guī)范化,所采用的總線主要有單線(1-Wire)總線、I2C總線、SMBus總線和spI總線。溫度傳感器作為從機(jī)可通過專用總線接口與主機(jī)進(jìn)行通信。方案一:由于本設(shè)計(jì)是測溫電路,可以使用熱敏電阻之類的器件利用其感溫效應(yīng),在將隨被測溫度變化的電壓或電流采集過來,進(jìn)行A/D轉(zhuǎn)換后,就可以用單片機(jī)進(jìn)行數(shù)據(jù)的處理,在顯示電路上,就可以將被測溫度顯示出來,這種設(shè)計(jì)需要用到A/D轉(zhuǎn)換電路,感溫電路比較麻煩。方案二:進(jìn)而考慮到用溫度傳感器,在單片機(jī)電路設(shè)計(jì)中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進(jìn)行轉(zhuǎn)換,就可以滿足設(shè)計(jì)要求。從以上兩種方案,兩種都完全能夠滿足設(shè)計(jì)需要,很容易看出,采用方案二,電路比較簡單,軟件設(shè)計(jì)也比較簡單,故采用了方案二。1.4電路設(shè)計(jì)最終方案決定綜上各方案所述,對此次作品的方案選定:采用STC89C52單片機(jī)作為主控制系統(tǒng);采用DS18B20為傳感器;采用數(shù)碼管作為顯示器件。2元器件簡介2.1單片機(jī)介紹STC89C52是一種低損耗、高性能、CMOS八位微處理器,片內(nèi)有4k字節(jié)的在線可重復(fù)編程、快速擦除快速寫入程序的存儲器,能重復(fù)寫入/擦除1000次,數(shù)據(jù)保存時間為十年。它與MCA-51系列單片機(jī)在指令系統(tǒng)和引腳上完全兼容,不僅可完全代替MCS-51系列單片機(jī),而且能使系統(tǒng)具有許多MCS-51系列產(chǎn)品沒有的功能。STC89C52可構(gòu)成真正的單片機(jī)最小應(yīng)用系統(tǒng),縮小系統(tǒng)體積,增加系統(tǒng)的可靠性,降低系統(tǒng)的成本。只要程序長度小于4K,四個I/O口全部提供給用戶??捎?V電壓編程,而且擦寫時間僅需10毫秒,僅為8751/87C51的擦除時間的百分之一,與8751/87C51的12V電壓擦寫相比,不易損壞器件,沒有兩種電源的要求,改寫時不拔下芯片,適合許多嵌入式控制領(lǐng)域。工作電壓范圍寬(2.7V~6V),全靜態(tài)工作,工作頻率寬在0Hz~24MHz之間,比8751/87C51等51系列的6MHz~12MHz更具有靈活性,系統(tǒng)能快能慢。STC89C52芯片提供三級程序存儲器加密,提供了方便靈活而可靠的硬加密手段,能完全保證程序或系統(tǒng)不被仿制。P0口是三態(tài)雙向口,通稱數(shù)據(jù)總線口,因?yàn)橹挥性摽谀苤苯佑糜趯ν獠看鎯ζ鞯淖x/寫操作。2.2DS18B20概述DS18B20是Dallas公司繼DS1820后推出的一種改進(jìn)型智能數(shù)字溫度傳感器,與傳統(tǒng)的熱敏電阻相比,只需一根線就能直接讀出被測溫度值,并可根據(jù)實(shí)際需求來編程實(shí)現(xiàn)9~12位數(shù)字值的讀數(shù)方式[3]。DS18B20封裝形式及引腳功能圖2.1DS18B20封裝形式和引腳功能如圖2.1所示,DS18B20的外形如一只三極管,引腳名稱及作用如下:GND:接地端。DQ:數(shù)據(jù)輸入/輸出腳,與TTL電平兼容。VDD:可接電源,也可接地。因?yàn)槊恐籇S18B20都可以設(shè)置成兩種供電方式,即數(shù)據(jù)總線供電方式和外部供電方式。采用數(shù)據(jù)總線供電方式時VDD接地,可以節(jié)省一根傳輸線,但完成數(shù)據(jù)測量的時間較長;采用外部供電方式則VDD接+5V,多用一根導(dǎo)線,但測量速度較快。2.3數(shù)碼管介紹數(shù)碼管是一種半導(dǎo)體發(fā)光器件,其基本單元是發(fā)光二極管。數(shù)碼管按段數(shù)分為七段數(shù)碼管和八段數(shù)碼管,八段數(shù)碼管比七段數(shù)碼管多一個發(fā)光二極管單元(多一個小數(shù)點(diǎn)顯示);按能顯示多少個“8”可分為1位、2位、4位等等數(shù)碼管;按發(fā)光二極管單元連接方式分為共陽極數(shù)碼管和共陰極數(shù)碼管。共陽數(shù)碼管是指將所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數(shù)碼管,共陽數(shù)碼管在應(yīng)用時應(yīng)將公共極COM接到+5V,當(dāng)某一字段發(fā)光二極管的陰極為低電平時,相應(yīng)字段就點(diǎn)亮,當(dāng)某一字段的陰極為高電平時,相應(yīng)字段就不亮。共陰數(shù)碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管,共陰數(shù)碼管在應(yīng)用時應(yīng)將公共極COM接到地線GND上,當(dāng)某一字段發(fā)光二極管的陽極為高電平時,相應(yīng)字段就點(diǎn)亮,當(dāng)某一字段的陽極為低電平時,相應(yīng)字段就不亮。數(shù)碼顯示器是一種由LED發(fā)光二極管組合顯示字符的顯示器件,它使用了8個Led發(fā)光二極管,其中七個用于顯示字符,一個顯示小數(shù)點(diǎn),所以通稱為七段發(fā)光二極管數(shù)碼顯示器。4位一體數(shù)碼管,其內(nèi)部段已連接好,引腳如圖所示(數(shù)碼管的正面朝自己,小數(shù)點(diǎn)在下方)。a、b、c、d、e、f、g、dp為段引腳,S1、S2、S3、S4分別表示四個數(shù)碼管的位。圖2。2四位一體數(shù)碼管3電路(硬件)設(shè)計(jì)STC89C52單片機(jī)數(shù)字溫度傳感器Led閃爍、蜂鳴器報(bào)警數(shù)碼管顯示STC89C52單片機(jī)數(shù)字溫度傳感器Led閃爍、蜂鳴器報(bào)警數(shù)碼管顯示圖3.1方框圖本溫度報(bào)警器以STC89C52單片機(jī)為控制核心,由一數(shù)字溫度傳感器DS18B20測量被控溫度,結(jié)合8段數(shù)碼管組合而成。當(dāng)被測量值超出或者低于預(yù)設(shè)范圍則發(fā)出警報(bào),且精度高,適用于大多數(shù)工業(yè)生產(chǎn)以及教育教學(xué)領(lǐng)域。3.2原理圖圖3.2原理圖及PCB圖 本電路主要由單片機(jī)電路、溫度傳感器電路、蜂鳴器驅(qū)動電路、LED電路組成發(fā)揮其功能。(在設(shè)計(jì)過程解決了在焊接時,盡量避免少走跳線,合理利用單片機(jī)的I/O口)3.3元件清單表3.1元件清單3.4作品實(shí)物圖4程序(軟件)設(shè)計(jì) 5裝配與調(diào)試在裝配前,主要對溫度傳感器DS18B20、數(shù)碼管的引腳進(jìn)行理解再進(jìn)行正確的焊接,調(diào)試中對程序內(nèi)容編寫的理解。出現(xiàn)的問題:數(shù)碼管顯示亂碼解決的結(jié)果:是由于數(shù)碼管的段碼與單片機(jī)的引腳的接法和程序中數(shù)碼管的段碼編碼不同導(dǎo)致的數(shù)碼管顯示亂碼。6總結(jié)本設(shè)計(jì)是以溫度采集及控制過程設(shè)計(jì)為總目標(biāo),以STC89C52單片機(jī)最小應(yīng)用系統(tǒng)為總控制中心,輔助設(shè)計(jì)有溫度采樣電路、A/D轉(zhuǎn)換接口、加熱電路、LED數(shù)碼管動態(tài)串行顯示器等。本設(shè)計(jì)的重點(diǎn)、難點(diǎn)是:(1)要掌握溫度傳感器的原理、結(jié)構(gòu)、應(yīng)用等;(2)考慮從非電量信號到電量信號的電路實(shí)現(xiàn)原理以及與單片機(jī)的接口;(3)熟悉MCS-51編程的技術(shù),實(shí)現(xiàn)單片機(jī)對溫度的調(diào)節(jié)控制;(4)整體電路的仿真調(diào)試。本次設(shè)計(jì)優(yōu)點(diǎn):采用的單片機(jī)STC89C52性價比高;熱敏電阻溫度傳感器轉(zhuǎn)化溫度的方法非常簡潔且精度高、測試范圍較廣。由于時間及精力所限,對溫度控制系統(tǒng)做了整體設(shè)計(jì),具體實(shí)現(xiàn)了其中的溫度報(bào)警部分設(shè)計(jì),即溫度控制系統(tǒng)的采集、顯示及報(bào)警模塊。致謝在論文完成之際,我首先要向張艷陽老師表示最真摯的謝意。張老師老師時常督促我抓緊時間做畢業(yè)設(shè)計(jì),并經(jīng)常討論,給我提出好的建議。張老師不僅工作認(rèn)真,她嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度令我受益匪淺,相信在我以后的生活學(xué)習(xí)帶來深遠(yuǎn)的影響。在此衷心的向張老師表達(dá)我的感激之心。我還要特別感謝各位同學(xué)給予了我無私的幫助,他們幫我解決了很多設(shè)計(jì)中遇到的難題,并幫我測試程序。由于本人學(xué)識有限,加之時間倉促,文中不免有錯誤和待改進(jìn)之處,真誠歡迎各位師長、同學(xué)提出寶貴意見。參考文獻(xiàn)[1]鐘曉偉,宋哲存,基于單片機(jī)的實(shí)驗(yàn)是溫濕度控制系統(tǒng)設(shè)計(jì)[A]林業(yè)機(jī)械與木工設(shè)備[2]葉景,基于單片機(jī)的溫度控制系統(tǒng)的設(shè)計(jì)經(jīng)驗(yàn)與交流,2008[3]楊光友.單片機(jī)微型計(jì)算機(jī)原理及接口技術(shù)[M].北京:中國水利水電出版社,2002[4]李丹妮,單片機(jī)溫度控制系統(tǒng)設(shè)計(jì)[J]九江學(xué)院報(bào)2005[5]ATMLECorporation,8-BitMicrocontrollerAT89C51DATESHEET.0265F-A-12/97[6]胡壽松,自動控制原理[M]北京:科學(xué)出版社,2007[7]劉篤仁,韓保君,傳感器原理及應(yīng)用技術(shù)西安電子科技大學(xué)出版社,2008[8]梅麗鳳,王艷秋,汪毓鐸,張軍,單片機(jī)原理及接口技術(shù)清華大學(xué)出版社2006[9]深圳市計(jì)算機(jī)行業(yè)協(xié)會,2005年全國單片機(jī)與嵌入式系統(tǒng)學(xué)術(shù)交流會,北京航空航天大學(xué)出版社,2005[10]張義和,陳敵北,例說8051[M]北京:人民郵電出版社,2006[11]張開生,郭國法,MCS-51單片機(jī)溫度控制系統(tǒng)的設(shè)計(jì)[J]微型計(jì)算機(jī)信息,2005[12]DallasSemiconductor,ProgrammableResolution1-WIREDigitalThermometerDS18B20DATESHEET.附錄:源程序/***********51單片機(jī)溫控上下限報(bào)警設(shè)計(jì)**********************測量范圍-55℃-+125℃*********************上下限溫度報(bào)警設(shè)定范圍-55℃-+125℃********************************************************/#include<REGX52.H>#defineucharunsignedchar //uchar代替unsignedchar#defineuintunsignedint //uint代替unsignedintuchardisplay[4]={0x00,0x00,0x00,0x00};//定義顯示緩沖區(qū)(初始化為0x00表示顯示0000)ucharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0x89,0xC7}; //共陽數(shù)碼管 0 123456789- H L//引腳定義: #defineSMG_XS P0 //定義數(shù)碼管顯示#defineSpeak P3_7 //定義蜂鳴器接口#defineLED_H P2_0 //上限報(bào)警指示燈#defineLED_L P3_6 //下限報(bào)警指示燈#defineq_kz P2_1 //(千位)數(shù)碼管位選控制(第1個數(shù)碼管)#defineb_kz P2_3 //(白位)數(shù)碼管位選控制(第2個數(shù)碼管)#defines_kz P2_5 //(十位)數(shù)碼管位選控制(第3個數(shù)碼管)#defineg_kz P2_7 //(個位)數(shù)碼管位選控制(第4個數(shù)碼管)#defineIO_18b20 P1_0//定義DS18B20接口#defineKey1 P1_1 //溫度上下限報(bào)警設(shè)置按鍵#defineKey2 P1_6 //上下限溫度加按鍵#defineKey3 P3_2 //上下限溫度減按鍵#defineKey4 P3_5 //實(shí)物/仿真運(yùn)行切換按鍵(上電默認(rèn)為:實(shí)物運(yùn)行參數(shù))floatwendu; //定義真實(shí)的十進(jìn)制溫度變量intbig_wendu; //放大10倍后的十進(jìn)制溫度變量(主要方便溫度顯示精確到小數(shù)點(diǎn)后一位)inthigh=35; //定義上限溫度變量intlow=25; //定義下限溫度變量ucharflag=0; //定義按鍵溫度設(shè)置標(biāo)志位(0:正常顯示溫度1:顯示上限溫度值2:顯示下限溫度值)bitbj_flag; //定義報(bào)警標(biāo)志位(0:下限報(bào)警指示燈閃爍1:上限報(bào)警指示燈閃爍)intnum=0; //定義上下限報(bào)警指示燈閃爍頻率變量uintt=2; //數(shù)碼管動態(tài)掃描基數(shù)為2(t=2為實(shí)物運(yùn)行參數(shù)),另外(t=300為仿真運(yùn)行參數(shù))bitts=0; //定義臨時調(diào)試標(biāo)志位為0(0:實(shí)物運(yùn)行參數(shù)1:仿真運(yùn)行參數(shù))/********************DS18B20部分******************/voiddelay_ms(uintcount) //延時函數(shù)(keil軟件測試此函數(shù)運(yùn)行時間約1ms){ uinti; while(count) { i=125; while(i>0){i--;} //當(dāng)i>0,執(zhí)行i自減1,達(dá)到延時效果 count--; }}voidds18b20_init() //DS18B20初始化(根據(jù)DS18B20初始化時序編寫){ uinti; IO_18b20=0; //先將IO_18b20拉低 i=100; while(i>0){i--;} //延時一段時間803us(延時持續(xù)時間在480-960us之間即可) IO_18b20=1; //再將IO_18b20拉高 i=7; //由于DS18B20需要等待15-60US之后會自動響應(yīng)拉低這個引腳 while(i>0){i--;} //所以這邊需要延時一小段時間(程序中延時59us)等待DS18B20響應(yīng)}bitds18b20_read_bit() //讀一位函數(shù)并返回"dat"(根據(jù)DS18B20讀一位字節(jié)時序編寫){ uinti; bitdat; //定義位變量dat EA=0; //要操作DS18b20時先關(guān)閉定時器中斷(防止定時器中斷對操作DS18b20有影響,導(dǎo)致出錯) IO_18b20=0; //先將IO_18b20拉低***(從IO_18b20拉低到讀取IO_18b20上的數(shù)據(jù)狀態(tài),過程不能超過15us) i++; //小延時一下 ↑ IO_18b20=1; //再將IO_18b20拉高(釋放改引腳) 不能超過15us i++; //小延時一下 EA=1; //再打開定時器中斷 ↓ dat=IO_18b20; //讀到的數(shù)據(jù)送到dat**(從IO_18b20拉低到讀取IO_18b20上的數(shù)據(jù)狀態(tài),過程不能超過15us) i=8; while(i>0){i--;} //延時一下 return(dat); //返回讀出來的數(shù)據(jù)dat}uchards18b20_read_byte() //讀一個字節(jié){ uchari,j,dat; //定義i,j,dat變量 dat=0; //dat初始化為0 for(i=0;i<8;i++) //for循環(huán)傳遞8位數(shù)據(jù)(即一個字節(jié)) { j=ds18b20_read_bit(); //將讀一位函數(shù)并返回"dat",傳送到j(luò) dat=(j<<7)|(dat>>1); //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在dat里 } return(dat);//將一個字節(jié)數(shù)據(jù)返回}voidds18b20_write_byte(uchardat)//寫一個字節(jié){ uinti; ucharj; bittest; //定義臨時位變量test for(j=0;j<8;j++) //for循環(huán)傳遞8位數(shù)據(jù)(即一個字節(jié)) { test=dat&0x01; //將dat的最低位取出來放在test dat=dat>>1; //再將dat向右移一位 if(test) //如果test為1,"寫1部分(根據(jù)DS18B20寫"1"時序編寫)" { EA=0; //要操作DS18b20時先關(guān)閉定時器中斷(防止定時器中斷對操作DS18b20有影響,導(dǎo)致出錯) IO_18b20=0; //先將IO_18b20拉低 i++; //小延時一下,(時序時間要求大于1us) EA=1; //再打開定時器中斷 IO_18b20=1; //再將IO_18b20拉高(釋放總線) i=8; while(i>0){i--;}//延時一下69us(時序時間要求大于60us) } else //否則test為0,"寫0部分(根據(jù)DS18B20寫"0"時序編寫)" { EA=0; //要操作DS18b20時先關(guān)閉定時器中斷(防止定時器中斷對操作DS18b20有影響,導(dǎo)致出錯) IO_18b20=0; //先將IO_18b20拉低 i=8; EA=1; //再打開定時器中斷 while(i>0){i--;}//延時一下69us(時序時間要求大于60us小于120us即可) IO_18b20=1; //再將IO_18b20拉高 i++;i++; //小延時一下 } }}/**********************************************************/voidtemp_change() //發(fā)送溫度轉(zhuǎn)換命令函數(shù){ ds18b20_init(); //初始化DS18B20 delay_ms(1); //延時等待1ms,時間上留有一些余地,因?yàn)镈S18B20器件響應(yīng)后會主動 //拉低60-240us,然后DS18B20自己會主動釋放總線,即主動拉高IO口 ds18b20_write_byte(0xcc);//跳過序列號命令 ds18b20_write_byte(0x44);//發(fā)送溫度轉(zhuǎn)換命令}/******************************************************************/inttemperature() //獲得溫度函數(shù){ inttemp; //定義溫度值變量(整型變量) uchara,b; //定義變量a,b用來存放溫度值的低8位和高8位 ds18b20_init(); //初始化DS18B20 delay_ms(1); //延時等待1ms,時間上留有一些余地,因?yàn)镈S18B20器件響應(yīng)后會主動 //拉低60-240us,然后DS18B20自己會主動釋放總線,即主動拉高IO口 ds18b20_write_byte(0xcc);//跳過序列號命令 ds18b20_write_byte(0xbe);//發(fā)送讀取數(shù)據(jù)命令 a=ds18b20_read_byte();//連續(xù)讀兩個字節(jié)數(shù)據(jù)(a為低8位數(shù)據(jù)) b=ds18b20_read_byte(); //b為高8位數(shù)據(jù) temp=b; //將高8位數(shù)據(jù)送到temp中 temp<<=8; //再將temp左移8位,這樣高8位數(shù)據(jù)就存在temp的高8位上了 temp=temp|a;//兩字節(jié)合成一個整型變量(temp是高8位"按位或"a是低8位) returntemp;//返回溫度值}/****************以上為DS18B20部分****************/voiddelay(uinttime) //數(shù)碼管掃描延時函數(shù){ uinti,j; for(i=time;i>0;i--) for(j=3;j>0;j--);}voiddelay_anjian(uinttime) //按鍵延時去抖函數(shù){ uinti,j; for(i=time;i>0;i--) for(j=110;j>0;j--); }voiddelay_fmq(uinttime) //延時函數(shù)(蜂鳴器){ uinti,j; for(i=time;i>0;i--) for(j=5;j>0;j--);}voidfmq() //蜂鳴器函數(shù)(按鍵提示){ uinti; for(i=0;i<100;i++) { Speak=0; delay_fmq(10); Speak=1; delay_fmq(10); }}voiddisp0() //正常顯示當(dāng)前溫度函數(shù)(顯示緩沖區(qū)內(nèi)容){ if(wendu>0) //如果溫度大于0,為正數(shù) { SMG_XS=table[display[0]]; //顯示溫度數(shù)據(jù)百位值 q_kz=0;b_kz=s_kz=g_kz=1; //允許(千位)數(shù)碼管位(第1個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) q_kz=1; } else //否則溫度小于0,為負(fù)數(shù) { SMG_XS=table[10]; //顯示負(fù)號"-" q_kz=0;b_kz=s_kz=g_kz=1; //允許(千位)數(shù)碼管位(第1個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) q_kz=1; } SMG_XS=table[display[1]]; //顯示溫度數(shù)據(jù)十位值 b_kz=0;q_kz=s_kz=g_kz=1; //允許(百位)數(shù)碼管位(第2個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) b_kz=1; SMG_XS=table[display[2]]&0x7f; //顯示溫度數(shù)據(jù)個位值,并加入小數(shù)點(diǎn) s_kz=0;q_kz=b_kz=g_kz=1; //允許(十位)數(shù)碼管位(第3個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) s_kz=1; SMG_XS=table[display[3]]; //顯示溫度數(shù)據(jù)小數(shù)點(diǎn)后一位 g_kz=0;q_kz=b_kz=s_kz=1; //允許(個位)數(shù)碼管位(第4個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) g_kz=1; } voiddisp1(high) //顯示上限溫度函數(shù) { SMG_XS=table[11]; //顯示"H" q_kz=0;b_kz=s_kz=g_kz=1; //允許(千位)數(shù)碼管位(第1個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) q_kz=1; if(high/100!=0) //如果上限溫度百位不為0(表示上限溫度值超過100) { SMG_XS=table[high/100]; //顯示上限溫度的百位 b_kz=0;q_kz=s_kz=g_kz=1; //允許(百位)數(shù)碼管位(第2個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) b_kz=1; SMG_XS=table[high%100/10]; //顯示上限溫度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允許(十位)數(shù)碼管位(第3個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) s_kz=1; SMG_XS=table[high%10]; //顯示上限溫度的個位 g_kz=0;q_kz=b_kz=s_kz=1; //允許(個位)數(shù)碼管位(第4個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) g_kz=1; } elseif(high>=0) //再如果上限溫度值大于等于0(說明溫度值是正數(shù)) { SMG_XS=table[high/10]; //顯示上限溫度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允許(十位)數(shù)碼管位(第3個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) s_kz=1; SMG_XS=table[high%10]; //顯示上限溫度的個位 g_kz=0;q_kz=b_kz=s_kz=1; //允許(個位)數(shù)碼管位(第4個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) g_kz=1; } else //否則上限溫度值是負(fù)數(shù)(即零下溫度值) { SMG_XS=table[10]; //顯示"-"(因?yàn)槭秦?fù)數(shù),所以要加"-"號) b_kz=0;q_kz=s_kz=g_kz=1; //允許(百位)數(shù)碼管位(第2個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) b_kz=1; high=0-high; //把上限溫度值取正 SMG_XS=table[high/10]; //顯示上限溫度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允許(十位)數(shù)碼管位(第3個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) s_kz=1; SMG_XS=table[high%10]; //顯示上限溫度的個位 g_kz=0;q_kz=b_kz=s_kz=1; //允許(個位)數(shù)碼管位(第4個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) g_kz=1; } }voiddisp2(low) //顯示下限溫度函數(shù){ SMG_XS=table[12]; //顯示"L" q_kz=0;b_kz=s_kz=g_kz=1; //允許(千位)數(shù)碼管位(第1個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) q_kz=1; if(low/100!=0) //如果下限溫度百位不為0(表示上限溫度值超過100) { SMG_XS=table[low/100]; //顯示下限溫度的百位 b_kz=0;q_kz=s_kz=g_kz=1; //允許(百位)數(shù)碼管位(第2個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) b_kz=1; SMG_XS=table[low%100/10]; //顯示下限溫度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允許(十位)數(shù)碼管位(第3個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) s_kz=1; SMG_XS=table[low%10]; //顯示下限溫度的個位 g_kz=0;q_kz=b_kz=s_kz=1; //允許(個位)數(shù)碼管位(第4個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) g_kz=1; } elseif(low>=0) //再如果下限溫度值大于等于0(說明溫度值是正數(shù)) { SMG_XS=table[low/10]; //顯示下限溫度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允許(十位)數(shù)碼管位(第3個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) s_kz=1; SMG_XS=table[low%10]; //顯示下限溫度的個位 g_kz=0;q_kz=b_kz=s_kz=1; //允許(個位)數(shù)碼管位(第4個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) g_kz=1; } else //否則下限溫度值是負(fù)數(shù)(即零下溫度值) { SMG_XS=table[10]; //顯示"-"(因?yàn)槭秦?fù)數(shù),所以要加"-"號) b_kz=0;q_kz=s_kz=g_kz=1; //允許(百位)數(shù)碼管位(第2個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) b_kz=1; low=0-low; //把下限溫度值取正 SMG_XS=table[low/10]; //顯示下限溫度的十位 s_kz=0;q_kz=b_kz=g_kz=1; //允許(十位)數(shù)碼管位(第3個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) s_kz=1; SMG_XS=table[low%10]; //顯示下限溫度的個位 g_kz=0;q_kz=b_kz=s_kz=1; //允許(個位)數(shù)碼管位(第4個數(shù)碼管)點(diǎn)亮 delay(t); //延時一下(消隱) g_kz=1; } }voidSMG_disp() //數(shù)碼管顯示函數(shù) { if(flag==0) //如果flag=0 { disp0(); //正常顯示當(dāng)前溫度函數(shù)(顯示緩沖區(qū)內(nèi)容) } if(flag==1) //如果flag=1 { disp1(high); //顯示上限溫度函數(shù) } if(flag==2) //如果flag=2 { disp2(low); //顯示下限溫度函數(shù) } }voidxitong_init() //系統(tǒng)初始化等待DS18b20徹底轉(zhuǎn)換完成,未完成之前數(shù)碼管顯示""{ EA=1; //開總中斷 TMOD=0x01; //定時器0為方式1 TH0=0xff; //12M晶振定時時間0.25ms0xff06 TL0=0x06; ET0=1; //開定時器0中斷 TR0=0; //先不啟動定時器0 SMG_XS=table[10]; //數(shù)碼管顯示"" q_kz=b_kz=s_kz=g_kz=0; //允許4位數(shù)碼管顯示 temp_change(); //發(fā)送溫度轉(zhuǎn)換命令函數(shù) delay_ms(980); //等待延時980ms>750ms,時間上留有一些余地; //(因?yàn)镈S18b20出廠默認(rèn)最大的溫度轉(zhuǎn)換時間為750ms, //為了防止第一次讀出來的溫度值是錯誤的值(典型錯誤值一般是85℃ //程序中的延時時間需要至少為750ms)*/}voidwendu_data_cl() //溫度數(shù)據(jù)處理{ staticuinti=0; //定義循環(huán)變量 i++; //i自加1(i開始從零開始自加1) if(ts==0) //0:實(shí)物運(yùn)行參數(shù) { if(i==3000){i=0;}//如果i=3000,i清0(使i控制在0-3000之間),i的范圍決定溫度數(shù)據(jù)刷新的快慢 } else //1:仿真運(yùn)行參數(shù) { if(i>=400) {i=0;} } if(i==0) //如果i=0,執(zhí)行溫度轉(zhuǎn)換 { temp_change();//發(fā)送溫度轉(zhuǎn)換命令函數(shù) } if(i==100) //如果i=100,處理DS18B20送過來的數(shù)據(jù),同時加以處理 { //為了顯示精確小數(shù)點(diǎn)后一位的溫度值 wendu=temperature()*0.0625;//得到真實(shí)十進(jìn)制溫度值,因?yàn)镈S18B20 //可以精確到0.0625度,所以讀回?cái)?shù)據(jù)的最低位代表的是0.0625度 if(wendu<=low) //溫度值低于下限溫度 { bj_flag=0; //0:下限報(bào)警指示燈閃爍 TR0=1; //打開TR0 } elseif(wendu>=high)//溫度值高于上限溫度 { bj_flag=1; //1:上限報(bào)警指示燈閃爍 TR0=1; //打開TR0 } else //否則溫度在正常溫度范圍 { TR0=0; //關(guān)閉TR0 LED_H=LED_L=1; //上下限報(bào)警LED都不亮 } big_wendu=wendu*10; //放大十倍,這樣做的目的將小數(shù)點(diǎn)后第一位也轉(zhuǎn)換為可顯示數(shù)字 if(wendu<0) //(如果溫度數(shù)據(jù)是負(fù)數(shù))判斷第一位顯示正數(shù)還是負(fù)數(shù) { big_wendu=0-big_wendu;//再把數(shù)據(jù)轉(zhuǎn)換成正數(shù),方便數(shù)據(jù)顯示 } else //否則溫度數(shù)據(jù)是正數(shù) { display[0]=big_wendu/1000;//顯示溫度數(shù)據(jù)百位值 } big_wendu=big_wendu%1000; display[1]=big_wendu/100; //顯示溫度數(shù)據(jù)十位值 big_wendu=big_wendu%100; display[2]=big_wendu/10; //顯示溫度數(shù)據(jù)個位值 display[3]=big_wendu%10; //顯示溫度數(shù)據(jù)小數(shù)點(diǎn)后一位 } }voidanjian_cl() //按鍵處理函數(shù){ if(Key1==0) //溫度上下限報(bào)警設(shè)置按鍵按下 { delay_anjian(5); //延時去抖 if(Key1==0) //再判斷溫度上下限報(bào)警設(shè)置按鍵是否按下 { flag++; //按鍵溫度設(shè)置標(biāo)志位加1 while(flag==3){flag=0;}//當(dāng)flag=3.flag清0(讓0<=flag<=2) q_kz=b_kz=s_kz=g_kz=1; //關(guān)閉數(shù)碼管顯示 TR0=0; //關(guān)閉TR0(關(guān)閉定時器0) LED_H=LED_L=1; //上下限LED燈關(guān)閉 fmq(); //按鍵提示音 } while(Key1==0); //等待按鍵松開 } if(flag==1) //允許調(diào)整上限溫度值 { if(Key2==0) //上下限溫度加按鍵按下 { delay_anjian(5); //延時去抖 if(Key2==0) //再判斷上下限溫度加按鍵是否按下 { if(high>low) //如果上限溫度>下限溫度 { high++; //上限溫度自加1 while(high==126){high=low+1;}//當(dāng)上限溫度加到126℃時,上限溫度設(shè)定為比下限溫度高1℃ //原因是上限溫度值一定需要比下限溫度值高。 q_kz=b_kz=s_kz=g_kz=1; //關(guān)閉數(shù)碼管顯示 fmq(); //按鍵提示音 } } while(Key2==0); //等待按鍵松開 } if(Key3==0) //上下限溫度減按鍵按下 { delay_anjian(5); //延時去抖 if(Key3==0) //再判斷上下限溫度減按鍵是否按下 { if(high-low>1) //如果上限溫度值減去下限溫度值大于1 { //(這個條件判斷確保上限溫度不能低于下限溫度) high--; //上限溫度自減1 while(high==-56){high=low+1;}//當(dāng)上限溫度自減到-56℃時,上限溫度設(shè)定為比下限溫度高1℃ //原因是上限溫度值一定需要比下限溫度值高。 q_kz=b_kz=s_kz=g_kz=1; //關(guān)閉數(shù)碼管顯示 fmq(); //按鍵提示音 } else //否則上限溫度不能再自減1 { high=high; //上限溫度保持不變 q_kz=b_kz=s_kz=g_kz=1; //關(guān)閉數(shù)碼管顯示 fmq(); //按鍵提示音 } } while(Key3==0); //等待按鍵松開 } } if(flag==2) //允許調(diào)整下限溫度值 { if(Key2==0) //上下限溫度加按鍵按下 { delay_anjian(5); //延時去抖 if

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論