久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8269|回復: 2
收起左側

基于單片機的電熱地暖控制系統設計論文

[復制鏈接]
ID:304102 發表于 2018-4-8 23:24 | 顯示全部樓層 |閱讀模式
本科設計(論文)
題  目:基于單片機的電熱地暖控制系統設計
院  系:     自動化工程學院   
專業年級:測控技術與儀器 2017屆   
學生姓名:*** 學號:######  
指導教師:徐進

【摘要】

本文以電熱地暖系統的具體原理和工作特點,分析了實際應用場合使用過程中所可能遇到的情景和問題,提出了一種電熱地暖溫度的自動控制系統。在研究該課題的過程中,通過查閱資料了解了電熱地暖系統的硬件構成和原理,以及對應的軟件。本設計以STC89C52單片機作為數據處理及控制核心,采用DS18B20作為溫度傳感器。本設計采用四路DS18B20進行測溫,系統能夠采集電熱地暖不同部分的平均溫度,從而使地板的整體溫度的控制更加精確。可以通過LCD液晶顯示屏實時顯示當前溫度,可以對溫度設定值進行改變,系統將根據地熱當前的溫度值與設定值進行比較進行智能加熱,使房屋溫度維持在人體舒適的范圍之內,從而到節約電力能源的目的。本設計可應用于單房間的地熱分區控制,也可應用于雙房間的地熱聯合控制。本次設計采用模塊化設計,文中闡述了以STC89C52為中央處理器的加熱控制處理功能、溫度采集功能以及溫度顯示功能等各個功能模塊的實現方法。


Abstract

This topic is mainly aimed at the study of the automatic temperature control of the electric floor heating systems. After the research and the study on the principle and the features of the electric floor heating systems, consider bout the scene that the system worked, an automatic electric floor heating control systemis proposed. Study hard while on the subject of automatic electric floor heating control system of hardware and corresponding software. This design uses STC89C52 single-chip computer as the processing and control core, DS18B20 as the temperature sensor. This design uses four-way DS18B20 to detect thetemperature. The system can collect the average temperature of different parts of the heating, so that the control of the temperature can be more accurate. Thecurrent temperature can be displayed through the LCD liquid crystal display, and the temperature settings can be changed. The system will heat the floorintelligently by the setting temperature, so that the housing temperature maintained within the scope of human comfort, thus to achieve the purpose of energy saving. The design can be applied to single room geothermal partition control, can also be applied to the double room of the geothermal joint control. This research mainly uses modular design. This paper expounds the STC89C52 as the central processor for heating control processing functions, temperature acquisition functions, temperature display functions and other functional modules method.

目錄

1章 課題研究的背景

2章 系統分析與設計

2.1 系統整體分析

2.2設計內容與實現的功能

3章 系統硬件設計

3.1系統硬件構成

3.2系統主要電路

3.2.1單片機控制電路

3.2.2 地板溫度采集電路

3.2.3  溫度實時顯示電路

3.2.4 溫度越限/故障報警電路

3.2.5 設置按鍵電路

3.2.6 地板加熱電路

4章 系統軟件設計

4.1 系統主程序設計

4.2 系統子程序設計

4.2.1 LCD顯示模塊程序

4.2.2 按鍵功能程序

4.2.3 溫度檢測程序

4.2.4 溫度數據處理程序

4.2.5 溫度越限/故障報警程序

5章 系統調試與仿真

5.1 仿真軟件

5.2 測試過程

5.3 測試結果

6章 結論與展望

致謝

參考文獻

附錄

附錄一 :系統硬件仿真電路及原理圖如下

附錄二 :源程序如下



第1章 課題研究的背景

從遠古的篝火取暖到現在的集中供暖和空調取暖,人類的取暖方式隨著科技的進步而不斷地演變創新。雖然在科技發達的現在取暖的方式多種多樣,但是如何在不同的應用場合下選擇最為環保經濟的取暖方式也就成為了我們需要探討的問題。

我國地域遼闊,南北跨越緯度近50度,這也就造成了我國南北氣候的極大差別。在我國北方,由于冬季漫長并且氣溫寒冷所以采取了集中供熱的取暖方式。而在南方如上海、重慶和湖南一類的地方,被稱為夏熱冬冷地區。夏熱冬冷地區的氣候特征主要表現為夏季高溫酷熱,冬季寒冷潮濕。雖然這類地區的冬季十分短暫,并且空氣溫度也并不是很低,但是給人的感覺卻是寒氣透骨的。這是因為我們對溫度的實際感知由空氣溫度來決定的,而是取決于體感溫度。而體感溫度是由空氣溫度與濕度同時所決定的,所以在潮濕的夏熱冬冷地區的冬季取暖也是很有必要的。南方的冬季需要采暖的總體時間并不長,然且并不連續。因此初期投入很大并且供暖時間連續的集中供暖并不適用于南方。此時獨立采暖就成為了最佳的選擇,一是彌補了無市政熱力管網的先天條件,二是用戶可以隨時根據情況決定是否進行取暖。

目前我國南方的居民在冬天一般采用空調取暖的方式。冷暖空調的主要原理是通過熱交換進行室溫的加熱或者降低,在一般情況下空調室內機都位于較高的位置,因此在制熱的過程中,由于熱空氣比冷空氣密度小的緣故,在整個房間很長的時間都會處于一個上部空氣悶熱而下部分房間的溫度卻依然很低,這就會給人們一種頭部熱而下半身卻依然感覺寒冷的不適感,在保溫不佳的房間內這中情況則更為嚴重。長時間待在這種狀態的房間內就會使人感到頭暈和呼吸困難。

因此近些年來越來越多的人們也開始采用電地暖的取暖方式。相較于空調通過熱交換加熱室內溫度,地暖是通過低溫輻射的原理加熱房間的溫度。熱源處于房間下部緩慢地使房間空氣的溫度逐步升高,因此整個房間會使人有一種頭涼腳暖的舒適感受。目前應用較廣的電熱地暖分為水地暖和電地暖,本文提出的設計的研究對象為以發熱電纜為發熱元件的電地暖,因此下文的介紹和研究將圍繞電地暖進行展開。電地暖一般是將發熱上限為65度的發熱電纜在房屋裝修時埋藏在鋪設地面的水泥混凝土之中,然后再在混凝土層次之上進行地板的鋪設,整個系統的加熱控制使用控制器進控制,以輻射供暖的方式加熱地面以達到加熱室內空氣溫度的目標。

雖然說地暖在舒適度上有著很大的優勢,但是使用發熱電纜作為加熱熱源的電熱地暖對電力的消耗還是很大的。近些年來隨著人類經濟的不斷發展,全球的能源問題也越發明顯。因此針對于電熱地暖設計出一種節電智能,并且能夠自動地完成室內溫度調節的控制器有著很重要的意義。


第2章 系統分析與設計

2.1 系統整體分析

本設計所研究的電熱地暖控制系統的設計,主要的問題就是提出一個可靠穩定的系統,能夠地板準確加熱到目標溫度,并將此溫度維持在一個最佳的范圍之內。此外還要具有對系統故障警報與采取提前措施的功能。

目前市面上已有的電熱地暖的控制方案一般采用單溫度傳感器進行地面溫度的測量,通過測量值和預設值的對比,再控制鋪設在地面下的單回路加熱線纜進行加熱。這種方法雖然已經實現了加熱溫度的自動控制,并且簡單有效,但是依然還有一些不足。第一點是僅采用了單溫度傳感器進行溫度的測量,相對于整個房間僅僅一只溫度傳感器很難完整地體現房間地面的整體溫度情況,測量到的溫度的誤差進一步便會導致整個系統對溫度的控制的不準確。第二點是沒有完善的故障報警和處理環節,當加熱電纜發生故障時有可能會發生系統無法加熱或者加熱無法停止的情況,進而導致系統失效或者引發安全問題。第三點是由于房間的布局,房屋靠近窗戶的部位溫度會更低一些,而由于家具的擺設也會導致地板的某些地方散熱不佳,進而導致整個地板的溫度不均勻,使用戶不能得到最佳的產品體驗。因此設計出一種可以更加精確地采集并控制地板溫度、能夠對幾種常見的故障報警并進行預處理和均勻控制地板溫度的電熱地暖系統便變得具有意義。

    首先是決定電熱地暖的預設溫度值。經過查閱資料后我了解到當地板的溫度為25°C到28°C時人體感覺最為舒適,而在這個溫度范圍內選擇地板溫度為28°C時對房間的加熱效果最好,因此我選擇28°C作為系統的預設溫度值。同時用戶也可以根據自己的需要進行溫度設定。

為了解決地板溫度不均勻的問題我將傳統的單回路加熱電纜分為內圈和外圈兩個回路,分別承擔房間外側和內側的加熱任務。兩個加熱回路分別使用兩顆溫度傳感器于選定的位置進行溫度測量,之后將兩只傳感器測得的溫度取均值作為該回路的溫度,提高了測溫的可靠性與精確度。

只有當地板溫度低于設定值3°C時系統進行加熱,當達到設定溫度值時系統自動斷開加熱電纜從而達到節能的目的。

    對于系統故障的方面我設置了故障指示燈和聲音報警的功能,當溫度過低或者過高時進行報警提示用戶排除故障,當溫度過高時系統也將自動斷開加熱電纜防止意外的發生。

2.2設計內容與實現的功能

本課題設計以單片機為核心,制作了一套雙回路的電熱地暖的控制系統,并且使用proteus軟件建立了一個相對應的仿真控制系統。本設計的主要設計構成包含了控制部分、顯示部分和采集部分三大模塊。在設計上選取了業界常用的ds18b20溫度傳感器作為地板溫度的采集元件,總共使用了4顆感溫元件來提高測溫的總體性和準確性。每兩顆溫度傳感器組成一組分別檢測兩個加熱回路不同位置的溫度,然后將采集到的每部分溫度傳送給處理核心STC89C52來進行求均值處理;使用繼電器分別控制兩回路加熱電纜是否進行加熱,進而使地板的溫度維持在期望的范圍之內。

本文中系統設計最終實現功能如下:

(1)溫度初始設定值為28°C,可以通過鍵盤改變期望值,并且對溫度期望值進行顯示。兩個加熱回路的實時溫度可以即時顯示。

(2)在電熱地暖加熱系統剛剛啟動之后,進入預加熱與檢測過程。系統會自動檢測外界的溫度,如果外界溫度低于設定的溫度期望值,系統將會接通繼電器將地板溫度加熱至期望值,然后進入恒溫保持模式;如果外界的溫度高于設定的溫度期望值,系統將不進行加熱,直接進入恒溫保持模式。

(3)預加熱與檢測過程結束后系統將進入恒溫保持模式,將地板溫度維持在期望值附近。兩個加熱回路分別由對應的繼電器進行獨立控制。假設回路1測得的平均溫度為T1,回路2測得的溫度為T2,具體的控制邏輯如下所示:

·當T1比設定值低3°C時接通繼電器1進行加熱;

·當T1達到設定值時斷開繼電器1;

·當T1比設定低大于5°C時接通繼電器1并進行聲光報警;

·當T1比設定高大于5°C時斷開繼電器1并進行聲光報警;

·回路2 的控制邏輯同上。


第3章 系統硬件設計

3.1系統硬件構成

STC89C52單片機承擔了本電熱地暖控制系統的數據處理及控制核心的角色。整個系統控制的目標便是控制地板的溫度。系統電路框圖如圖3-1所示。整個系統包含四大模塊,分別為單片機控制模塊、溫度測量模塊、顯示模塊和模塊。

系統中由兩路溫度采集模塊實時檢測兩個加熱回路的溫度,可以由按鍵改變加熱溫度的期望值,由LCD模塊進行當前溫度和設定溫度的輸出顯示。當溫度低于期望值時電磁繼電器閉合由加熱電纜進行加熱,溫度達到期望值則停止加熱。當溫度超過警報值時報警部分中的二極管亮起,同時激活蜂鳴器進行警示,提示故障的排查,越過上限的報警時繼電器便會切斷加熱電纜電路以保證安全。

3.2系統主要電路3.2.1單片機控制電路

STC89C52作為本系統的控制和數據處理中心,圖3-2表示的是單片機的最小系統單元。

STC89C52的具體性能與參數:作為8位8051微處理器的后續升級衍生產品,它的封裝工藝為PDIP方式,使用了CMOS的集成電路工藝,外部引腳與ATC89C52完全相同,具有4組共32個通用I/O端口,RAM集成在芯片內部,具有512字節的容量,給予應用程序的空間有8k字節,定時器/計數器一共有三個,均為16位,它的編程代碼完美兼容于傳統的8051{15}。

圖3-2 單片機最小系統單元

   單片機控制部分在整個電路中扮演著重要的角色,而單片機最小系統單元包含了單片機控制部分正常運作所必須的基本要素。時鐘電路通過晶體振蕩器振蕩為單片機產生時鐘,選用頻率為12Mhz的晶體振蕩器,這個時候單片機的運行速度即12Mhz/s,這時機器周期為1微秒,計算起來更加便捷并且此時的系統工作穩定。復位電路由電容電阻和一個開關構成,能夠在系統上電時給予RST引腳一定時間的高電平,進而將單片機自動復位,預先燒錄好的程序將從頭開始執行,也可以通過閉合開關使程序復位重新載入運行。P0.0~P0.7接口在本系統中作為I/O接口與LCD顯示屏相連接,因此必須加入上拉電阻。表3-1列舉了本設計中單片機接口對應的連接和分配。

表3-1 單片機接口分配

單片機 I/O 端口

外部電路引腳

外部電路引腳說明

     p0.0~p0.7

D0~D7

LCD1602的數據接口

    p1.0~p1.3

       DQ1~DQ4

四路溫度傳感器的數據引腳

      p1.4~p1.5

兩路加熱回路的報警LED

      p1.6~p1.7

控制加熱回路開關的繼電器

        p2.0

      蜂鳴器報警電路

        p2.6

         RS

  LCD1602數據命令選擇端

        p2.7

         E

    LCD1602讀寫選擇端

        p3.3

         設置鍵

        p3.4

       溫度增加鍵

        p3.5

       溫度減少鍵

        p3.6

         確定鍵

3.2.2 地板溫度采集電路

地板溫度采集電路如圖3-3所示。本次設計采用雙回路加熱電纜加熱,因此使用四路溫度傳感器置于每個回路的對稱最遠端進行溫度測量,之后取平均值作為當前加熱回路的溫度值,提高了測溫的可靠性與精確度。系統中將溫度傳感器安裝于地板下方測量溫度,填埋在混凝土下方的發熱電纜溫度在50°C~60°C之間,熱量傳至上方地板時維持在21°C~28°C之間。根據應用場合,估計所測溫度的范圍為0°C~30°C,在此條件之上考慮到成本因素選用DS18B20作為溫度采集元件。每只DS18B20單獨占用一根I/O端口。

圖3-3 地板溫度采集電路

DS18B20溫度傳感器廣泛應用于測溫范圍為-55°C~125°C的測量與控制系統中,通過編程可實現分辨率9~12位的高精度測溫。它具有獨特的單總線通信方式和小巧的體積使之可以應用于各種復雜的工作環境之中。該傳感器對于供電的要求不高,在3.0V~5.5V的電壓下均可正常工作,亦可采用在數據線直接取電的寄生電源方式工作。DS18B20內部由64位的光刻ROM 、溫度傳感器、非揮發的溫度報警觸發器TH、TL與配置寄存器構成。圖3-4為DS18B20的內部結構組成示意圖。表3-2為DS18B20的端口定義{16}。

圖3-4 DS18B20的內部結構組成


表3-2 DS18B20端口定義

端口

   DQ

    GND

  VDD

定義

信號輸入/輸出

      接地端

電源輸入

加熱電纜與溫度傳感器的簡單安裝示意圖如圖3-4所示。其中兩根黑色粗線分別代表兩個加熱回路,線纜的具體鋪設應依據現場決定,這里僅作簡單示意。白色和灰色區域為兩個加熱區域的范圍表示,黑色圓形代表溫度傳感器ds18b20的安裝位置。合理地布置加熱區域和溫度傳感器便可以得到良好的加熱控制與熱量分布。如果將兩個加熱回路單獨使用,本系統也可以應用于兩個房間的獨立加熱。

圖3-5 加熱電纜與溫度傳感器安裝示意圖


3.2.3  溫度實時顯示電路

為了能夠直觀實時地顯示兩個加熱回路的溫度值,就需要一個顯示電路來提供可視化的數值顯示。考慮到本次設計中涉及到兩個監測溫度值和一個溫度設定值的顯示,顯示的內容較多,所以沒有選擇數碼管的顯示方案,最終選擇了LCD1602作為顯示電路的核心元件。它的外部端口如圖3-6所示。其端口釋義如表3-3所示。

LCD1602液晶顯示模塊是根據液晶的物理特性制成的,通過給與對應點陣電壓便能控制該點的顯示,此液晶通過HD44780液晶芯片控制顯示屏上的點陣進行顯示。液晶控制器、液晶驅動器和液晶顯示元件共同實現了LCD1602的基本功能。LCD1602具有兩行顯示區域,每行包含16個字符的顯示位置。顯示的字符由點陣組成,有5×7或5×11兩種點陣的組成方法。點陣可以輕松地對符號數字和英文字母進行表達。作為通用的點陣顯示控制器,HD44780內部預置了192個常用的點陣字符與圖形,通過字符代碼和字模我們便能查找和調用所需的點陣字符。該控制器內部具有指令寄存器和數據寄存器兩個8位寄存器,它們的英文表示分別為IR和DR。LCD1602的第四根引腳RS端就是用來選擇是使用IR還是DR的,從而決定是使用數據寄存器還是命令寄存器。

圖3-6 LCD1602外部端口

表3-3 LCD1602端口釋義

端口

端口功能

DB0-DB7

數據通訊端

VSS

地端

VCC

電源正向電壓輸入

BLA

顯示背光正極

BLK

顯示背光負極

V0

通過輸入的電壓可以調整顯示的對比度效果

E

使能端口

RS

選擇使用IR還是DR寄存器,高電平選中DR,低電平為IR

R/W

讀寫控制端

在本次設計中LCD1602的電路連接如圖3-7所示。顯示元件的通訊接口與單片機的P0相連接。而P0口作為輸入輸出接口使用時,內部為漏極開路型,所以要連接一個上拉電阻來得到高電平。外接的滑動變阻器可以改變電壓使液晶的對比度變化。在本次設計中液晶上方第一行分別顯示兩個加熱回路的實時溫度值,第二行顯示加熱溫度的期望值。

圖3-7 LCD1602電路連接示意圖

3.2.4 溫度越限/故障報警電路

本系統中增加了聲光報警電路。在系統使用過程中,當發熱電纜或者其他元件故障時有可能引起兩種情況。一是電纜的加熱不受控制,加熱的溫度不斷升高,這種情況下將有可能使用戶感到不適甚至引發火災事故;二是加熱電纜自身發生斷路或者老化,整個系統無法加熱或者加熱的效果達不到預期,這就會直接影響到加熱的最終效果。于是我設置了能夠辨別兩個加熱回路的故障LED顯示,在發生故障時蜂鳴器也會同時響起,提醒用戶及時排查故障,使系統處于一個良好的工作狀態。

當溫度傳感器測得一個加熱回路的溫度低于預設值5度時可以認為加熱電纜老化需要更換,此時對應的報警LED亮起同時蜂鳴器發出聲音提示用戶進行檢查;當測得加熱回路的溫度高于預設值5度時,對應的報警LED亮起,蜂鳴器發出聲音,同時單片機控制的繼電器會自動斷開對應的加熱回路以防止事故的發生。

蜂鳴器控制方便,集成度高,應用于我們生活中的方方面面。我們常用的電腦、打印機、定時器中都能找到它的身影。為了防止兩顆報警LED燒毀所以分別串聯了兩只150歐姆的電阻減小通過的電流。單片機I/O口的驅動能力難以滿足蜂鳴器的工作要求,因此在三極管的基極連接了一個上拉電阻來驅動蜂鳴器。溫度越限/故障報警電路的連接如圖3-8所示,當溫度超過設定的報警范圍時,單片機的引腳發出低電平使PNP三極管導通,蜂鳴器響起報警。

圖3-8 溫度越限/故障報警電路

3.2.5 設置按鍵電路

本系統中溫度期望值的設定功能由外設的四個按鍵達成,如圖3-9所示。四個按鍵分別與單片機的P3.3~P3.6相連。按下設置鍵可以進入地板溫度的設置界面,按下溫度加/減按鍵可以修改地板加熱溫度的期望值,按下確定鍵可以保存修改的設置或退出設置界面。實現了用戶自己根據需求進行溫度更改,人機交互的功能。

圖3-9 設置按鍵電路

3.2.6 地板加熱電路

在整個設計中地板加熱電路承擔了發熱源的角色。如圖3-10所示,地板加熱電路由220V市電接口、大電流繼電器、PNP型三極管、電阻、二極管發熱電纜和發光二極管組成。考慮到整個加熱電路的負載我選擇使用CLD-D24型號的繼電器。因為proteus仿真軟件中沒有發熱電纜相對應的元件,并且為了更直觀的展示這里我用了發光二極管代替。對應的220V市電用電池組代替展示。發光二極管用來檢測驅動電路中的電流,有電流通過時LED發光,沒有電流通過時LED不發光。于是地板加熱中的發熱電纜就被LED發光二極管所代替。當系統中溫度采集電路監測到的地板溫度低于預先設置好的溫度下限值3°C時,單片機對應引腳發出低電平使PNP三極管導通發光,繼電器CLD-D24的磁感應線圈充磁,產生磁力,磁力吸引觸點與閉路觸點接觸,發熱電纜開始加熱。當實時采集到的地板溫度達到或者高于預先設置好的溫度時,單片機不輸出信號,PNP三極管不導通。LED發光二極管不發光,繼電器CLD-D24磁感應線圈中沒有磁力產生,觸點在開關上的應力的作用下恢復到斷路的位置,發熱電纜停止對地板的加熱。安裝在PNP三極管基極端的發光二極管就起到了系統加熱指示燈的作用。當加熱電纜進行加熱時加熱指示燈亮;當加熱電纜停止加熱時加熱指示燈不亮,可以讓人們更為直觀地得知系統的運行情況。在這里發光二極管連接在PNP三極管和5V供電端之間,并串聯了限流電阻,通過的電流較小在三極管的承受范圍之內,而且相對于繼電器三極管的價格便宜,并且該三極管是繼電器控制電路中必不可少的,使用三極管來控制指示發光二極管起到了一石二鳥的效果。控制發熱電纜是否進行加熱的電流很大,超出了三極管能夠承受的范圍,所以需要采用繼電器作為開關,能夠承受較高的電流。

圖3-10 地板加熱電路

第4章 系統軟件設計4.1 系統主程序設計

本文中軟件設計的主要內容由三個單元組成:地板溫度采集模塊、LCD1620液晶顯示模塊與數據處理模塊組成。

主要的內容如下所示:系統接通電源后自動復位,進行初始化,程序從開頭開始運行,在歡迎界面跳過后,系統會自動讀取預先設置好的溫度值T0,讀取四路溫度傳感器測得的溫度之后自動求均值計算出每一個加熱回路的溫度值T1、T2。首先進入系統的預加熱階段,將T1、T2與預設溫度值與T0進行比較,當某回路測得溫度值低于預設值T0時,閉合繼電器對該回路進行加熱,直到溫度達到預設值后停止加熱進入下一個工作模式(預加熱階段因為剛剛通電外界溫度可能低于最低的報警溫度,因此設定了預加熱階段,在此階段系統不會報警)。系統的第二個階段是恒溫控制階段。在這個階段內首先讀取采集的地板溫度,當溫度低于設定值3度時閉合繼電器對相應的回路進行加熱,直到達到預設值即停止加熱。當采集到的溫度高于或低于預設值超出5度時系統自動點亮對應回路的報警LED,同時接通蜂鳴器電路進行聲音報警。

    系統的主程序流程圖如圖4-1所示。



圖4-1 系統主程序流程圖

4.2 系統子程序設計4.2.1 LCD顯示模塊程序

LCD顯示模塊主要承擔了顯示兩個加熱回路實時溫度和溫度設定值的顯示的任務。兩個加熱回路的實時溫度T1、T2是由對應位置的四路ds18b20測溫元件測得的溫度兩兩為一組,再由單片機求均值得來的,最后在LCD1620的第一行進行顯示。溫度設定值則由設定按鍵S1、S2、S3和S4來進行設定。LCD液晶的顯示程序如下所示。

lcd1602_adr(0x02);

    if(wendua1>=0)

     {

                 lcd1602_writenumber('+');

                 lcd1602_writenumber(0x30+wendua1%1000/100);

                 lcd1602_writenumber(0x30+wendua1%100/10);

                 lcd1602_writenumber(0x30+wendua1%10);

                 lcd1602_writenumber(0xdf);

     }

   if(wendua1<0)

     {

                 lcd1602_writenumber('-');

                 lcd1602_writenumber(0x30+(0-wendua1)%1000/100);

                 lcd1602_writenumber(0x30+(0-wendua1)%100/10);

                 lcd1602_writenumber(0x30+(0-wendua1)%10);

                 lcd1602_writenumber(0xdf);

     }

    這里的程序段是LCD液晶用來顯示第一個加熱回路的溫度T1的程序。它可以將單片機計算好的兩只DS18B20溫度的均值做出轉換并顯示在液晶屏上指定的位置,當送來的溫度為負值時將會顯示出帶負號的溫度值。第二個加熱回路的溫度T2和設定值T0的程序段與此相似,只是顯示的位置做出了變化,這里就不再贅述。對于DS18B20溫度數據的處理程序將在后面對應的部分進行說明。

4.2.2 按鍵功能程序

    按鍵模塊承擔了改變溫度設定值的輸入渠道的任務。按鍵控制的程序如下所示。

void key()

{

    if(key1==0){moshi=1;if(moshi==0)moshi=1;beerc();while(key1==0);}

if(moshi==1)

{

if(key2==0){if(wendux<100)wendux=wendux+1;while(key2==0);}

if(key3==0){if(wendux>(-50))  wendux=wendux-1;while(key3==0);}

              }

if(key4==0){moshi=0;while(key4==0);}

按鍵控制程序中分別定義了四顆按鍵構成了設定溫度值的邏輯。Key1作為設定鍵,Key2作為溫度加鍵,Key3作為溫度減鍵,Key4作為確定鍵。首先我定義了系統的兩個工作模式,以moshi作為控制參數,當moshi=0時為溫度顯示模式,當moshi=1時進入溫度設置模式。當按下設定鍵后蜂鳴器會發出滴的響聲提醒用戶進入了設定模式,同時設定溫度后面也會顯示符號在視覺上提醒用戶已進入設定模式。進入溫度設定模式后按下溫度加鍵可以增加溫度設定值,按下溫度減鍵可以減小溫度設定值。當按下確定鍵后系統將退出溫度設置模式返回溫度顯示模式。

4.2.3 溫度檢測程序

溫度檢測的硬件模塊由DS18B20構成。下面是對應傳感器的模塊程序。

//傳感器的數據線
sbit DQ=P1^0;
uchar z1;
//延時函數
void delay3(unsigned int i)
{
while(i--);
}
//初始化                                 
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;    //DQ復位
delay3(8);  //稍做延時
DQ = 0;    //單片機將DQ拉低
delay3(80); //精確延時 大于 480us
DQ = 1;    //拉高總線
delay3(10);
x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay3(5);
}
//讀一個字節
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay3(5);
}
return(dat);
}
//寫一個字節
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay3(5);
DQ = 1;
dat>>=1;
}
delay3(5);
}
//讀取溫度
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
delay3(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等
a=ReadOneChar();   //低位
b=ReadOneChar();   //高位
b<<=8;
t=a+b;
return(t);
}   
//數據處理
void   readds18()
{
unsigned  int  y=0;
unsigned  long x=0;
y=ReadTemperature();
if(!(y&0xf000))
{
z1=0;
x=y;
x=x*625/10000;
wendu1=x;
}
if(y&0xf000)
{
z1=1;
y=-y;
x=y;
x=x*625/10000;
wendu1=0-x;
}
}

4.2.4 溫度數據處理程序

在4.2.1小節中介紹了LCD液晶將單片機處理后的溫度數據顯示出來的程序模塊。下面的程序段就是單片機對四路溫度值處理的過程。

  if(x==0)              {readds18(); wendu1=wendu1; }
  if(x==1)              {readds182();wendu2=wendu2; wendua1=(wendu1+wendu2)/2;}
  if(x==2)              {readds183();wendu3=wendu3; }
  if(x==3)              {readds184();wendu4=wendu4; wendua2=(wendu3+wendu4)/2;}
  x=(x+1)%4;

此段程序依次讀取四個溫度傳感器所采集到的溫度,然后使用了兩個循環分別求得每一組溫度傳感器測得溫度的均值,再次進行處理后將平均溫度送至LCD液晶模塊作為兩個回路的實時溫度進行顯示。溫度求均值的這一步驟使整個系統對溫度的測量更為準確,進而提升了對溫度的控制品質,地板的溫度更加精確。

4.2.5 溫度越限/故障報警程序

如下所示的程序段為溫度超限/故障報警程序。

if(moshi==0)

{
if(wendua1<=(wendux-3)){r1=0;bz1=1;}else {r1=1;bz1=0;}
if((wendua1<=(wendux-5))||(wendua1>=(wendux+5)))led1=0;else led1=1;

    if(wendua2<=(wendux-3)){r2=0;bz2=1;}else {r2=1;bz2=0;}
if((wendua2<=(wendux-5))||(wendua2>=(wendux+5)))led2=0;else led2=1;
if(  (wendua1<=(wendux-5))||(wendua1>=(wendux+5)) ||(wendua2<=(wendux-5))||(wendua2>=(wendux+5)) ){beerc();}
}
  if(moshi==1)
{
    led1=1;
    led2=1;
    r1=1;
    r2=1;
  }

其中l1為第一個加熱回路的報警LED,r1為第一個加熱回路的加熱電纜,bz為系統的報警蜂鳴器。l2、r2屬于第二個加熱回路,其功能與上文所述第一個加熱回路中的定義相同。當系統處于預熱階段時報警程序不起作用。報警程序僅在系統處于恒溫模式下有效。該程序的主要功能是將計算得到的兩路溫度均值與設定值進行比較,進而采取對應的動作。兩個測溫回路的報警功能彼此獨立。以第一個加熱回路為例,當T1<=T0-3時,r1接通對第一個加熱回路進行加熱;當T1<=T0-5或者T1>=T0+5時判定系統為故障,此時l1亮起,bz響起進行報警,當T1>=T0+5時也會斷開r1以防止溫度過高,進而發生危險。


第5章 系統調試與仿真5.1 仿真軟件

本次仿真使用Proteus7軟件對系統的硬件電路進行搭建與仿真過程,使用Keil uVision4軟件對設計所需的程序進行編寫與測試,最終生成hex文件供單片機執行。

5.2 測試過程

1.將編寫的系統程序在Keil uVision4中進行測試,能否正常編譯

2.在Proteus7軟件中仿真過程中LCD液晶屏是否能夠正常顯示實時的兩路溫度平均值T1、T2以及設定值T0。

3.通過按鍵是否能夠設置加熱溫度的設定值。

4.通過手動改變溫度傳感器的溫度,觀察LCD液晶屏是否能夠實時顯示T1、T2的溫度值。

5.測試在系統剛剛開機進入預加熱模式后改變溫度傳感器溫度,測試自動加熱功能和跳出功能能否實現。

6.手動模擬操控完成預加熱模式,在系統進入恒溫模式后改變溫度傳感器溫度,測試上下限報警功能和自動加熱功能能否實現。

5.3 測試結果

本設計的目標主要是要實現雙路平均溫度的測量與顯示、雙路加熱回路的溫度自動控制、溫度越限故障報警的功能。經測試編寫的系統程序成功通過Keil uVision4軟件的編譯。

系統開機后自動進入預熱模式。觀察LCD顯示器可以發現T1、T2和T0均正常顯示。手動操作溫度傳感器模擬南方地區在冬季的室內溫度情況,此時T1=T2=17°C,低于恒溫模式的最低報警溫度值,可以看到系統沒有報警,繼電器閉合加熱電纜R1、R2自動開始預加熱過程。在proteus中的仿真結果如圖5-1所示。接下來模擬當地板溫度已經達到設定值的情況,這種情況有可能發生在用戶在使用一段時間系統后再次打開的情況。此時系統開機后自動跳過預熱模式進入恒溫加熱模式,并且沒有進行加熱,測試成功。


圖5-1 預加熱過程

手動操作溫度傳感器使T1、T2達到設定值,系統進入恒溫加熱模式。此時首先將溫度手動降低,使T1=20°C,模擬加熱電纜故障不能正常加熱的狀態,可以看到故障指示燈LED1亮起,同時蜂鳴器發出報警,測試成功。如圖5-2所示。

圖5-2 恒溫模式觸發下限報警

在恒溫加熱模式下,手動調節溫度,模擬系統或者電纜故障導致溫度越過上限的情況。使T2=35°C,可以看到第二條加熱回路在超過上限的同時被切斷,故障指示燈LED2亮起,同時蜂鳴器發出報警,測試成功。如圖5-3所示。

圖5-3 恒溫模式觸發上限報警

第6章 結論與展望

本次設計使用單片機作為核心控制元件,使用C語言進行編程,完成了課題各方面的控制要求。本電熱地暖的控制系統使用四路傳感器對室內溫度進行采集,采用STC89C52單片機作為核心對采集的數據進行處理,控制外圍電路的自動開閉,進而實現室內溫度的智能控制。系統具有的報警功能能夠使用戶及時得知系統的故障所在,及時進行維護,避免事故的發生。系統的整個設計從用戶的易用性與智能化進行考量,多點測溫的設計更好地反映了室內不同位置的溫度,采用了分區域測量溫度的方法,使整個溫度的控制過程更加精確,進而給用戶帶來更好的體驗。

因為本系統為初步仿真,在實際應用于采暖方案時要充分考慮房間的構造和用戶對采暖的要求,對設計進行適當的調整與增強。加熱電纜的鋪設要根據情況選擇合適的鋪設方式。根據房間的大小和布局增加溫度傳感器的數量和加熱區域的數量,實現一個更為精密的溫度控制過程。當然本系統在簡易調整后也可以直接應用于多房間單控制器的溫度控制,整合的控制面板不僅降低了系統成本,也方便了用戶的使用。

在系統的設計過程中,我首先對電熱地暖工程進行了一個初步的調查,了解了加熱的原理和具體的安裝模式。根據這些我模擬出了一個應用的具體環境,采用了思考在整個溫度控制環節中所有可能遇到的問題,最后提出解決的方法的設計思路。

51型單片機作為單片機家族中最為經典的一款在各大教材中被廣泛介紹,學習它是每個單片機初學者的必經之路。在設計整個系統的過程中,開始的時候我走了不少彎路,因為急于求成,設計出的程序與期望的功能產生了很大的出入。在分析錯誤的過程中我逐漸地冷靜了下來,發現有很多知識并沒有完全理解。于是我借閱了單片機開發的教程從頭一步步地進行了系統的復習,理解了很多過去忽略的知識點。特別是剛開始我對程序的書寫比較凌亂,這直接導致了多次程序編譯的失敗。在系統的學習之后我靜下心來根據系統的結構從頭重新編寫了程序,解決了之前的問題。在智能化家居已經成為熱點的今天我設計的這個系統可能顯得微不足道,但是通過本次畢業設計我深深體驗到了單片機開發過程中的樂趣,理解到嚴謹的態度對一個設計的重要性。通過本次設計我體驗了一個產品開發的流程,掌握了51單片機的基本設計方法,也對設計過程中所涉及到的外圍電路的功能與設計有了深刻的了解,積累了重要的經驗。

致謝

經過大四學年的努力,至此我的畢業設計終于完成了。我的指導導師徐進老師在設計的過程之中給予了我重要的幫助。每當我遇到設計中的問題時徐老師都會不留余力地來和我探討解決思路。當我們向徐老師尋求幫助時他往往引領我們去剖析問題,教給了我們思考的方法,然后提供一個解決思路讓我們能夠自由地發揮。每次和徐老師請教之后我都能獲得新的啟發與思考。和徐老師一同探討的過程中我不僅學到了重要的知識,更培養了良好的思考方式。徐老師嚴謹的思考方式,求真務實的態度深深地影響了我,同時也教會了我為人處世的道理。在我的設計過程中遇到了許許多多的問題,在徐老師的悉心指導下我逐一解決了這些問題,熟練掌握了設計中各方面的知識。通過本次設計,我認為我最大的收獲就是面對問題時我們要踏踏實實地去面對,認真的態度才能決定一切。

同時我也要感謝在程序編寫過程中幫助過我的同學。感謝四年來所有指導過我的任課老師,每位老師都十分用心地教會了我專業方面的知識,教會了我如何學習,教會了我如何做人。

參考文獻

[1]蘭羽,萬可順.基于AT89C51的無線溫度采集系統設計[J].國外電子測量技術,2013,06
[2]程世田,李娟,于艷,郭亭亭.基于單片機與工控軟件的多點測溫系統研發[J].共有人儀表與自動化裝置,2014,01
[3]周甦旸.基于單片機的溫度采集系統的研究分析[J].信息通信,2014,04
[4]胡同花,周維龍.溫室大棚多點溫度采集系統的設計與實現[J].電子設計工程,2014,13
[5]胡軍.基于無線傳輸多點溫度采集系統的設計探討[J].通信電源技術,2014,04
[6]張克.一種基于單片機的高精度無線溫度采集系統[j].工業加熱,201,03
[7]楊丹丹,楊風,馬慧卿.基于單片機的溫度采集系統設計[J].山西電子技術,2014.03
[8]張銳,沈大偉,馬鐵華,呂鵬飛.基于單片機多回路溫度采集系統設計[J].電子世界,2014,09
[9]楊振東.多點遠程溫度采集系統[J].黑龍江科技信息,2014,03
[10]顧涵,吳曉婷,李天福,張俊龍.基于51單片機的小型溫度采集系統設計[J].科技傳播,2013,10
[11] Zhang H F,Zhao A L,Hou J. Design of fumigation temperature control system based on single-chip microcontroller. Physics Procedia,2011,11: 246-250
[12] Marty Hall,Larry Brown著,趙學良譯. Servlet與JSP核心編程(第2版)[M]. 北
京:清華大學出版社,2004.
[13] 張萌,和湘,姜斌.《單片機應用系統開發綜合實例》.清華大學出版社,2007.7
[14] 孫育才,王榮興,孫華芳.《ATMEL新型AT89S52系列單片機及其應用》.清華大學出版
社,2005.1
[15] 程啟明,黃云峰,徐進,趙永熹. 基于匯編與C語言的單片機原理及應用[M]. 北京:
中國水利水電出版社,2012.10.
[16] DS18B20中文手冊


附錄附錄一 :系統硬件仿真電路及原理圖如下


附錄二 :源程序如下
  1. /*********************主程序***********************/
  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #include <math.h>
  5. #define uchar   unsigned char
  6. #define uint    unsigned int
  7. uchar code zifux[] ="0123456789abcdef";
  8. uchar code zifu0[]="T1: 000^ T2: 000^";
  9. uchar code zifu1[]="   SET: 000^     ";
  10. #include "1602.H"
  11. int  wendua1=0;            
  12. int  wendua2=0;            
  13. int  wendu1=0;
  14. int  wendu2=0;
  15. int  wendu3=0;
  16. int  wendu4=0;
  17. #include "ds18.h"
  18. #include "ds182.h"
  19. #include "ds183.h"
  20. #include "ds184.h"
  21. sbit key1=P3^3;
  22. sbit key2=P3^4;
  23. sbit key3=P3^5;
  24. sbit key4=P3^6;            
  25. sbit key5=P3^7;            
  26. sbit led1=P1^4;
  27. sbit led2=P1^5;            
  28. sbit led3=P1^6;
  29. sbit led4=P1^7;            
  30. uchar bz1=0;
  31. uchar bz2=0;
  32. uchar bz3=0;
  33. uchar bz4=0;
  34. uint  moshi=0;            
  35. uchar x=0;
  36. int  wendux=28;  
  37. sbit  beer=P2^0;            
  38. void beerc()
  39. {
  40.   beer=0;_delay_ms(70);beer=1;_delay_ms(50);
  41. }
  42. void dis()
  43. {
  44.   if(x==0)              {readds18(); wendu1=wendu1; }
  45.   if(x==1)              {readds182();wendu2=wendu2; wendua1=(wendu1+wendu2)/2;}
  46.   if(x==2)              {readds183();wendu3=wendu3; }
  47.   if(x==3)              {readds184();wendu4=wendu4; wendua2=(wendu3+wendu4)/2;}
  48.   x=(x+1)%4;
  49.     lcd1602_adr(0x02);
  50.     if(wendua1>=0)
  51.      {
  52.                  lcd1602_writenumber('+');
  53.                  lcd1602_writenumber(0x30+wendua1%1000/100);
  54.                  lcd1602_writenumber(0x30+wendua1%100/10);
  55.                  lcd1602_writenumber(0x30+wendua1%10);
  56.                  lcd1602_writenumber(0xdf);
  57.      }
  58.    if(wendua1<0)
  59.      {
  60.                  lcd1602_writenumber('-');
  61.                  lcd1602_writenumber(0x30+(0-wendua1)%1000/100);
  62.                  lcd1602_writenumber(0x30+(0-wendua1)%100/10);
  63.                  lcd1602_writenumber(0x30+(0-wendua1)%10);
  64.                  lcd1602_writenumber(0xdf);
  65.      }
  66.     lcd1602_adr(0x0b);
  67.     if(wendua2>=0)
  68.      {
  69.                  lcd1602_writenumber('+');
  70.                  lcd1602_writenumber(0x30+wendua2%1000/100);
  71.                  lcd1602_writenumber(0x30+wendua2%100/10);
  72.                  lcd1602_writenumber(0x30+wendua2%10);
  73.                  lcd1602_writenumber(0xdf);
  74.      }

  75.    if(wendua2<0)

  76.      {

  77.                  lcd1602_writenumber('-');

  78.                  lcd1602_writenumber(0x30+(0-wendua2)%1000/100);

  79.                  lcd1602_writenumber(0x30+(0-wendua2)%100/10);

  80.                  lcd1602_writenumber(0x30+(0-wendua2)%10);

  81.                  lcd1602_writenumber(0xdf);

  82.      }

  83.     lcd1602_adr(0x46);

  84.     if(wendux>=0)

  85.      {

  86.                  lcd1602_writenumber('+');

  87.                  lcd1602_writenumber(0x30+wendux%1000/100);

  88.                  lcd1602_writenumber(0x30+wendux%100/10);

  89.                  lcd1602_writenumber(0x30+wendux%10);

  90.                  lcd1602_writenumber(0xdf);

  91.      }

  92.    if(wendux<0)

  93.      {

  94.                  lcd1602_writenumber(0x30+(0-wendux)%1000/100);

  95.                  lcd1602_writenumber(0x30+(0-wendux)%100/10);

  96.                  lcd1602_writenumber(0x30+(0-wendux)%10);

  97.                  lcd1602_writenumber(0xdf);

  98.      }

  99.     if(moshi==0) lcd1602_writenumber(' ');

  100.     if(moshi==1) lcd1602_writenumber('<');

  101. }

  102. void ct()

  103. {

  104.   //------------------------

  105.   if(moshi==0)

  106.   {

  107.     if(wendua1<=(wendux-3)){led3=0;bz1=1;}else {led3=1;bz1=0;}

  108.     if((wendua1<=(wendux-5))||(wendua1>=(wendux+5)))led1=0;else led1=1;

  109.     if(wendua2<=(wendux-3)){led4=0;bz2=1;}else {led4=1;bz2=0;}

  110.     if((wendua2<=(wendux-5))||(wendua2>=(wendux+5)))led2=0;else led2=1;

  111.     if(  (wendua1<=(wendux-5))||(wendua1>=(wendux+5)) ||(wendua2<=(wendux-5))||(wendua2>=(wendux+5)) ){beerc();}



  112.   }

  113.   //------------------------

  114.   if(moshi==1)

  115.   {

  116.     led1=1;

  117.     led2=1;

  118.     led3=1;

  119.     led4=1;

  120.   }

  121. }

  122. void key()

  123. {

  124.     if(key1==0){moshi=1;if(moshi==0)moshi=1;beerc();while(key1==0);}

  125.               if(moshi==1)

  126.               {

  127.      if(key2==0){if(wendux<100)wendux=wendux+1;while(key2==0);}

  128.      if(key3==0){if(wendux>(-50))  wendux=wendux-1;while(key3==0);}

  129.               }

  130.     if(key4==0){moshi=0;while(key4==0);}

  131. }

  132. void main()

  133. {

  134.     lcd1602_init();

  135.     LCD1602_string(1,1,zifu0);

  136.     LCD1602_string(1,1,zifu0);

  137.     LCD1602_string(2,1,zifu1);

  138.               readds18();readds182();readds183();readds184();_delay_ms(500);

  139.               readds18();readds182();readds183();readds184();_delay_ms(500);

  140.               readds18();readds182();readds183();readds184();_delay_ms(200);

  141.               readds18();readds182();readds183();readds184();_delay_ms(200);

  142.               readds18();readds182();readds183();readds184();_delay_ms(200);

  143.               readds18();readds182();readds183();readds184();_delay_ms(200);

  144.               readds18();readds182();readds183();readds184();_delay_ms(200);



  145.               wendua1=(wendu1+wendu2)/2;

  146.               wendua2=(wendu3+wendu4)/2;

  147.               dis();

  148.               if(wendua1<=(wendux))led3=0;

  149.               if(wendua2<=(wendux))led4=0;

  150.               while((wendua1<=(wendux))||(wendua2<=(wendux)))

  151.               {

  152.               dis();               

  153.               if(wendua1<=(wendux))led3=0;  else               led3=1;

  154.               if(wendua2<=(wendux))led4=0; else               led4=1;

  155.               }

  156.               while (1)

  157.               {

  158.               dis();

  159.               ct();            

  160.               key();

  161.               }

  162. }

  163. /*********************液晶顯示***********************/

  164. sbit  RS=P2^6;            

  165. sbit  E=P2^7;  

  166. #define e1   E=1

  167. #define rs1  RS=1

  168. #define e0   E=0  

  169. #define rs0  RS=0

  170. #define PP P0            

  171. void _delay_ms(uint i)

  172. {

  173.   uchar j;

  174.   for(;i>0;i--)

  175.   {

  176.    for(j=0;j<120;j++);

  177.   }

  178. }

  179. void _delay_us(uchar t)

  180. {

  181.    while(t>0)t--;

  182. }

  183. void  lcd1602_writecrtl(uchar  dat)

  184. {

  185.   _delay_us(5);

  186.   PP=dat;

  187.   e1;

  188.   _delay_us(5);

  189.   e0;

  190. }

  191. void  lcd1602_writenumber(uchar dat)

  192. {

  193.   rs1;

  194.   _delay_us(5);

  195.   PP=dat;

  196.   e1;

  197.   _delay_us(5);

  198.   e0;

  199. }

  200. void  lcd1602_init()

  201. {

  202.   lcd1602_writecrtl(0x38);

  203.   lcd1602_writecrtl(0x06);

  204.   lcd1602_writecrtl(0x0c);

  205.   lcd1602_writecrtl(0x01);

  206. }

  207. void  lcd1602_adr(uchar dat)

  208. {

  209.   lcd1602_writecrtl(0x80 | dat);

  210. }

  211. void LCD1602_string(uchar hang,uchar lie,uchar const *p)

  212. {

  213.               uchar a;

  214.               if(hang == 1) a = 0x00;            

  215.               if(hang == 2) a = 0x40;            

  216.               a = a + lie - 1;

  217.               lcd1602_adr(a);            

  218.               while(1)

  219.               {

  220.                             if(*p == '\0') break;

  221.                             lcd1602_writenumber(*p);

  222.                             p++;

  223.               }

  224. }

  225. /*********************DS18B20***********************/

  226. /***共四路DS18B20,程序僅數據線不同,故此處僅展示一路程序***/

  227. sbit DQ=P1^0;

  228. uchar z1;

  229. void delay3(unsigned int i)

  230. {

  231. while(i--);

  232. }                                 

  233. void Init_DS18B20(void)

  234. {

  235. unsigned char x=0;

  236. DQ = 1;   

  237. delay3(8);

  238. DQ = 0;   

  239. delay3(80);

  240. DQ = 1;  

  241. delay3(10);

  242. x=DQ;      

  243. delay3(5);

  244. }

  245. unsigned char ReadOneChar(void)

  246. {

  247. unsigned char i=0;

  248. unsigned char dat = 0;

  249. for (i=8;i>0;i--)

  250. {

  251.   DQ = 0;

  252.   dat>>=1;

  253.   DQ = 1;

  254.   if(DQ)

  255.    dat|=0x80;

  256.   delay3(5);

  257. }

  258. return(dat);

  259. }

  260. void WriteOneChar(unsigned char dat)

  261. {

  262. unsigned char i=0;

  263. for (i=8; i>0; i--)

  264. {

  265.   DQ = 0;

  266.   DQ = dat&0x01;

  267.   delay3(5);

  268.   DQ = 1;

  269.   dat>>=1;

  270. }

  271. delay3(5);

  272. }

  273. unsigned int ReadTemperature(void)

  274. {

  275.               unsigned char a=0;

  276.               unsigned int b=0;

  277.               unsigned int t=0;

  278.               Init_DS18B20();

  279.               WriteOneChar(0xCC);

  280.               WriteOneChar(0x44);

  281.               delay3(10);

  282.               Init_DS18B20();

  283.               WriteOneChar(0xCC);
  284. ……………………

  285. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整的Word格式文檔51黑下載地址:
論文.docx (554.35 KB, 下載次數: 62)


回復

使用道具 舉報

ID:738823 發表于 2020-4-29 10:58 | 顯示全部樓層
你這個不全啊   沒有頭文件
回復

使用道具 舉報

ID:738823 發表于 2020-4-29 11:03 | 顯示全部樓層
可不可以把全部的程序放出來啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本不卡一区 | 中文字幕高清免费日韩视频在线 | 国产成人综合av | 日韩福利视频 | 亚洲一二三区av | 日本一区二区视频 | 久草在线 | 日日干夜夜操天天操 | 一区二区三区av | 91视频电影 | 韩日一区二区 | 午夜寂寞影院在线观看 | 国产黄色免费网站 | av网站免费在线观看 | 欧美一区二区在线观看 | 黄色一级毛片免费看 | 亚洲91精品| 国产精品久久国产精品久久 | 在线视频一区二区 | 亚洲一二三区不卡 | 欧美激情网站 | 国产亚洲精品一区二区三区 | www一级片 | 中文字幕一区二区三区四区 | 亚洲性在线| 婷婷成人在线 | 特级丰满少妇一级aaaa爱毛片 | 亚洲区一区二区 | 日韩欧美在线视频播放 | 亚洲人人舔人人 | 欧美片网站免费 | 一区日韩 | 91最新入口| 日韩区| 国产精品欧美精品 | 欧美色综合一区二区三区 | 色播99| 欧美啪啪| 国产色网站 | 日本不卡一区 | 亚洲一区二区免费视频 |