隨著社會的進步,人類文明在不斷提高的同時,卻面臨著一個非常嚴峻的問題:世界上的不可再生能源——煤炭、石油、天然氣的存儲量在以極快的速度減少,在不久的將來,這些寶貴的資源將逐漸從地球上消失。與此同時,使用這些能源給我們周圍的環境帶來了巨大的破壞。藍藻爆發、臭氧空洞、二噁英事件等環境問題在不斷的出現,生態平衡遭到了嚴重的破壞。所以,人類急需發現更多無污染的可再生資源,在這時,太陽能這個無窮無盡的綠色資源得到了人們的青睞。使用它不僅可以解決能源短缺的問題,而且不用擔心它會消耗盡,只要太陽 升起,人們就可以得到儲量豐富的太陽能;另外,太陽能的使用不會產生CO2等有害氣體,絕對不會對環境產生任何的污染,有效地緩解了現存的環境問題。太陽能技術也因此得到了飛速的發展,太陽能汽車、太陽能電池、太陽能熱水器等新型產品不斷出現在市場上,其中,以太陽能熱水器發展的最為廣泛,也得到了大眾的認可。根據不完全統計,太陽能熱水器的銷售量已遠遠超過了其他種類的熱水器。隨著太陽能技術的不斷改革,此款熱水器會有一個更廣闊、更長遠的發展。
太陽能熱水器給人們提供著安全、綠色、節能的熱水,而且造價比較低廉,在技術上也比較成熟,因此受到人們的喜愛。在整個太陽能熱水器系統中,除了熱水器本身之外,還有一個系統也起到了及其重要的作用,即控制器。它是用戶與熱水器之間的交流介質,通過控制器,可以將熱水器的水位水溫信息及時反饋給用戶,而用戶也可以通過控制器對熱水器進行操作,比如,當熱水器的水箱沒水時,用戶可以選擇自動上水功能來加水,當雨雪天氣時,沒有足夠的熱量來滿足水的溫度,用戶就可以啟動輔助加熱功能,通過加熱棒來加熱水,這樣,無論何時用戶都可以使用到熱水。
1.2 現狀分析
太陽能熱水器的銷量一直成增長趨勢,十幾年前,市場的主導還是電加熱型的熱水器,太陽能熱水器寥寥無幾,而如今,幾乎每家每戶都在使用太陽能熱水器,以其廉價、節能、環保的優勢占領了絕大部分市場。隨著人們越來越濃厚的環保意識,對這種綠色的太陽能熱水器的需求會越來越大。但是與之配套的控制器卻一直沒有達到成熟的階段。目前,大多數控制器只具有簡單的檢測、顯示功能,還需要人為的上水,當水溫達不到滿意的溫度時,用戶束手無策。因此,一個多功能的控制器一旦問世,一定會得到人們的喜愛。這種控制器的市場前景非常廣闊。
這種控制器以單片機為核心器件,單片機的價格低廉、工作穩定、設計簡單,非常適合這種控制器的生產,智能化的單片機還能夠根據不同的需求作出相應的調整,滿足了不同用戶的多方面需求。另外,單片機系統耗能較少,能夠最大程度的節約能源,保護設備,增加設備的使用壽命。它適用于各個地方的各種需求,且安裝快捷,使用方便,所以它的市場前景廣闊,是目前市面上其他熱水器種類的升級產品。總之,無論從價格還是技術來說,太陽能熱水器及其控制器都具有很大的優勢。
太陽能熱水器的組成很簡單,包括存儲熱水的保溫水箱、用于吸收太陽光能量并把它轉換為熱量的集熱器、冷水和熱水循環流動的水管,再加上幾個閥門,用來控制水的流向。其結構圖如下所示:

圖2-1太陽能熱水器結構原理圖
太陽能熱水器產生熱水的過程也非常簡單,利用冷熱水密度不同的原理就可以完成水循環,集熱器可以很好的保留太陽光的能量,從而將其轉換為水的熱量,當有水從集熱器中流過時,冷水被加熱為熱水,再流向保溫水箱儲存起來,以供用戶隨時使用,直到水溫達到設定值,循環閥門關閉。水循環過程如下圖所示:

圖2-2太陽能熱水器水循環原理圖
2.2 控制器結構及工作原理控制器的核心器件為SST89E58單片機,下圖中T1代表保溫水箱中的溫度傳感器DS18B20,由它負責實時溫度值的檢測,再發送給單片機進行顯示;T2負責水位的檢測,并完成自動上水功能;F1、F4分別代表冷水閥門和熱水閥門;冷水和熱水分別經F2、F3循環流動,最終存儲在保溫水箱中;電加熱系統負責在雨雪天氣進行加熱,來達到設定溫度;控制器還應有報警功能,當數據超過了正常范圍,報警器啟動,提醒用戶。

圖2-3控制系統結構簡圖
工作原理:
白天集熱器工作時,打開閥門F2、F3,冷水從水箱流向集熱器,經過加熱后的熱水經F3流向保溫水箱。溫度傳感器T1實時檢測水溫,當溫度達到設定值時,關閉閥門F2,F3。用戶使用水時,打開閥門F4。沒有水時,打開閥門F1上水。當陽光不足的陰雨天氣時,水溫達不到設定值,可以啟動輔助加熱系統。
控制器通過顯示電路能夠及時的反映出熱水器的實時狀態,包括水的溫度、水箱中剩余的水量,它的輔助加熱系統使人們在陰雨天氣也能夠使用到熱水,報警功能能夠督促人們去改變熱水器的狀態,使之處于正常的工作范圍。總之,控制器為人們使用太陽能熱水器帶來了方便。對本課題進行分析之后,擬出了三個方案,如下所示:
方案一:以FPGA為基礎設計系統
本方案以VHDL語言和EDA技術為基礎,設計了一款太陽能熱水器控制器,該系統的實現基于FPGA,控制器的硬件電路和軟件程序相結合,完成了對水箱中的水溫、水位等信息的采集和顯示。
方案二:以CPLD為基礎設計系統
本方案以芯片EPMl270作為核心器件,將控制器的外接電路檢測得到的水溫水位信息進行處理和分析,并從LCD液晶顯示屏上展示給用戶,有效地解決了使用太陽能熱水器過程中遇到的問題。
方案三:以單片機SST89E58為基礎設計太陽能熱水器控制系統
本方案以SST89E58作為中心環節,它與80C51完全兼容,選擇DS18B20為溫度傳感器、8155作為接口芯片,再加上鍵盤、顯示電路,實現了對太能熱水器的水溫水位的檢測和控制。控制器還有一套輔助加熱的從系統,以繼電器作為啟動從系統的開關。
通過對以上三個方案的優缺點的分析,從實際的可行度,個人的知識掌握情況以及節約成本考慮,本設計選用第三種方案。
本設計的核心器件為SST89E58單片機,由它控制所有的功能完成運行,溫度的檢測需要用到溫度傳感器,這里選用DS18B20,水位的檢測需要用到水位傳感器,為了方便實驗,本設計中用四個按鍵來模擬不同的水位,不同的按鍵按下會得到相應的水位信息,顯示用到數碼管,并由芯片8155作為接口電路,還需要由蜂鳴器和LED組成的報警電路來實現聲光報警,輔助加熱系統必須要用到繼電器,以此來控制開關。根據以上設計,得到控制系統方框圖如下:

圖3-1 控制系統方框圖
3.2 單片機及其外圍電路
基于單片機設計的電路簡單,I/O口擴展方便,因此可以外接多個電路,完全滿足了控制器的需求,對單片機的編程也可使用匯編和C語言,編程方便;此外,單片機價格低廉、工作穩定、耗能較少,非常適合實驗使用。
3.2.1 單片機簡介單片機是一個集成在芯片上的計算機,SST89E58與80C51完全兼容,編程方便,程序被保存在ROM中,因此具有掉電保存功能,單片機擁有大量的I/O口和外擴I/O口,可以基于單片機設計很多電路,它的總線結構負責片內所有部件的通信,提高了工作過程中的可靠程度。片內有256個數據存儲空間,絕對能夠滿足控制器的需求。在本設計中只使用到了單片機的某些引腳,例如外接石英晶體和電容的X1、X2等,單片機引腳圖如下所示:

圖3-2 單片機引腳排列圖
部分引腳功能介紹:
表3-1 芯片引腳介紹 
時鐘電路提供了系統所需要的時鐘信號,控制著單片機的工作節奏。其電路圖如下所示,圖中X1為石英晶體振蕩器,C1、C2是兩個值為30pF的反饋電容,它們構成的外部電路從XTAL1 、XTAL2端輸入,與片內的反相器相結合,產生震蕩脈沖,再經過分頻電路,得到需要的時鐘信號,以供單片機使用。本設計中晶振的頻率為11.0592MHz。

圖3-3 晶振電路
3.2.3 手動復位電路
單片機的復位電路用于產生復位信號,并從RST端輸入,當單片機檢測到RST端有超過2個周期的高電平后,系統進行復位,本設計采用手動復位,如圖3-4所示,當按下圖中的按鍵時,RST電平變高,單片機復位。

圖3-4 手動復位電路
3.3 顯示電路控制器的顯示電路可以顯示水箱中水的剩余量以及水的溫度,使人們及時的了解熱水器的工作狀態,采用數碼管與8155的結合來顯示,這樣便有效的節省了大量的I/O端口,功耗低,應用非常廣泛,且設計方便,硬件電路也較為簡單。
3.3.1 數碼管簡介為了對采集到的水溫和水位的進行顯示,要用到4個數碼管。其中2個用來顯示水位的高低,另外2個用來顯示實時的水溫。
發光二極管的縮寫字母是LED,它是能夠將電信號轉換為光信號的發光器件。數碼管就是由多個LED按照數字8的形狀排列而成的。本設計中使用的是8段數碼管,其發光二極管的排列形狀如圖3-5(a)。

圖3-5 8段LED顯示器
在使用過程中,為了給發光二極管提供電壓使其發光,會把8個二極管的一端相連,給予高電平或是接地,連接方式有以下2種:
?共陽極。此方法給8個發光二極管的陽極端提供高電平,如圖3-5(b)所示,另一端提供低電平的二極管會被點亮,否則滅。
?共陰極。此方法將8個發光二極管的陰極端接地,如圖3-5(c)所示,另一端提供高電平的二極管會被點亮,否則滅。
本設計中用到的是共陰極接法,所以給陽極引腳加上高電平二極管就會發光。
3.3.2 8155簡介
本設計中用8155作4位數碼管的接口芯片。如圖3-6所示,其中PA口為位碼輸出口,PA4~PA7為輸出位控線,由于8155的高電平輸出電流很小,數碼管會很暗,所以在每個數碼管的位控線上要加入一個三極管來放大電流。PB口控制段碼的輸出值。

圖3-6 顯示電路
使用8155作數碼管的接口芯片時,8155只能輸出顯示的段碼,而不能夠控制輸出的內容,動態控制的實現要依靠軟件程序。在程序設計的時候,需要設置一個顯示緩沖區,將要顯示的數值存放到這個區域,本設計中用到4個數碼管,因此設置了4個單元,地址為30H~33H。在每一個數碼管被點亮之后,應加一段延時程序,以保證該數碼管有足夠的顯示亮度。
3.4溫度檢測電路溫度檢測電路可以實時的反映出當前的水溫,選擇DS18B20主要由于其硬件電路簡單,只需一條數據線與單片機相連即可,成本較低,誤差小,非常適用于熱水器溫度的檢測。
3.4.1 溫度傳感器DS18B20簡介DS18B20的主要特征如下表所示:
表3-2 DS18B20的主要特征

DS18B20芯片封裝結構:

圖3-7 DS18B20芯片封裝
DS18B20引腳功能:
·引腳1:GND 電壓地 ·引腳2:DQ 單數據總線 ·引腳3:VDD 電源電壓
DS18B20的工作原理:
DS18B20一個芯片即可完成溫度的檢測和數字數據的輸出, 增強了其抗干擾能力。它的一個工作周期可分為溫度檢測和數據處理這兩個部分。18B20共有三種存儲器,它們分別是:ROM 、RAM 和EEPROM。
控制器對18B20操作流程:
在DS18B20工作之前,先要進行一段時間的復位。復位結束后,單片機給出高電平,以便接收一個存在脈沖。至此,單片機和18B20達成了基本的通信協議,接下來將完成兩者間的數據通信。之后控制器發送ROM指令,一共有5條指令,由5個工作周期完成,當單片機只外接一個DS18B20時,可以跳過ROM指令,在本設計中就跳過了ROM指令。接下來控制器發送存儲器操作指令,該指令包括寫RAM數據、讀RAM數據、將RAM數據復制到EEPROM、溫度轉換、將EEPROM中的報警值復制到RAM、工作方式切換。當存儲器操作指令結束后,將執行溫度轉換指令或讀數據指令。
若要讀出實時的水溫數據則需要執行兩個工作周期,第一個周期為復位、跳過ROM指令、執行溫度轉換存儲器操作指令、等待500uS溫度轉換時間。接下來執行第二個周期,為復位、跳過ROM指令、執行讀RAM的存儲器操作指令、讀數據。至此,DS18B20的工作完成,之后單片機便可以對數據做相應的處理。
3.4.2 溫度檢測電路設計
單片機和溫度傳感器的電路圖:

圖3-8 溫度檢測電路
如上圖所示,DS18B20的數據端口與單片機的P1.0相連,硬件電路非常簡單,溫度數據經過處理后會送到數碼管顯示。
3.5 水位檢測電路及自動上水3.5.1 水位檢測電路設計
蓄水箱的水位也是控制器需要檢測的一個重要數據,最好是采用連續液位傳感器,這樣測得的數據可以準確的反映出蓄水箱的真實水位,但是為了簡化實驗,本設計采用分段式液位傳感器,并用四個按鍵來代替水位。由于單片機實驗板上獨立按鍵個數有限,這里采用矩陣鍵盤中的部分按鍵來設計電路。KEY1按下代表水位為0%,KEY5按下代表水位為30%,KEY9按下代表水位為60%,KEY13按下代表水位為90%。鍵盤上有行線和列線之分,本矩陣電路有4條列線4條行線。在行線和列線的交點處放置了一個按鍵,由于行線和列線分別連接著按鍵的不同端,當按鈕沒有被按下時,行線和列線是不相通的。當有按鍵按下時,對應的行線變為低電平。這樣就能采集到是哪個鍵按下。矩陣鍵盤原理圖如下:

圖3-9 矩陣鍵盤電路
將圖中P2.0~P2.4連接到單片機后,在軟件編程時,只需將P2.4清0,水位檢測電路就完成了,當按鍵1按下時,數碼管會顯示00,當按鍵5按下時,數碼管會顯示30,當按鍵9按下時,數碼管會顯示60,當按鍵13按下時,數碼管會顯示90。
3.5.2 自動上水設計
當蓄水箱沒水時,希望通過一個按鍵的控制來實現自動上水。在實際應用中,應用一個按鍵來控制電磁閥的開閉,以調整水位的多少,而在實驗中,電磁閥的開閉難以實現,只能通過數碼管顯示水位來假設水位的上升。在軟件設計時,需要用到外部中斷1,并由INT1引腳引入中斷請求。當芯片檢測到有中斷信號時,進入中斷程序,數碼管自動顯示為“00→30→60→90”,然后退出中斷,返回到主程序,自動上水功能至此完成。
3.6 溫度設定及報警電路
溫度的設定是利用單片機的計數中斷功能,按鍵按下,進入相應的中斷,溫度值相應改變。聲光報警電路利用LED燈和蜂鳴器的組合,成本低廉,設計方便,電路簡單。
3.6.1 溫度設定在太陽能熱水器控制器使用過程中,用戶會根據自身需求設定一個溫度值,當處于加熱狀態時,達到這個溫度就會停止加熱,溫度不再上升。溫度設定需要用到2個定時器中斷,分別用來完成溫度的加1和溫度的減1。這樣用戶就可以根據實際需求來設定0~99中的任意一個數。
將4個定時器TL0、TH0、TL1、TH1的初始值設置為FFH,這樣,當有按鍵按下時,相當于從T0或T1中輸入了脈沖,對應的定時器的值加1,進入中斷服務程序,完成中斷工作后,返回到主程序。在軟件設計時,只需將定時器方式選擇寄存器(TMOD)中的C/
設置為1即表示在計數工作方式,計數脈沖由2個按鍵負責提供。那么當采集到一個按鍵按下時就會進入相應的中斷,對溫度值進行加減。
3.6.2 報警電路設計
當水溫、水位過高或過低時,系統應該發出警告信號來提醒用戶,考慮到自然水本身溫度只有幾度,如果設置低溫報警,那么一上水系統就會報警,這是不希望出現的狀況,所以本設計只設置一個高溫報警值,這個值可以由用戶隨意設定。水位報警值分別為沒水時的00%和溢水時的90%。在控制器的工作過程中,單片機會不斷的將實時水溫和水位與報警設定值進行比較,一旦到達這個值,報警燈會啟動,蜂鳴器響,當實時數據下降到正常范圍內,報警燈會滅掉,蜂鳴器不響。此部分電路設計非常簡單,只需由P1.1和P1.2引腳分別控制一個蜂鳴器和1個LED燈,當需要報警時,將對應的引腳設置成需要的值即可。報警電路圖如下所示:

圖3-10 報警電路圖
輔助加熱由繼電器來控制,繼電器是一種很好的控制開關,價格低,控制方便,配合一個LED燈來模擬加熱過程,使電路簡單易行。
當天氣晴朗時,陽光很充足,熱水器水箱中的水能夠被加熱到滿意溫度,但是當雨雪天氣,集熱器吸收的能量無法使溫度達到設定值,所以控制器還需要一套輔助加熱系統,當水溫滿足不了用戶的需求時,可以通過按鍵開啟加熱系統,水箱中的加熱棒便開始發熱工作,當水被加熱到設定值時,加熱系統自動關閉。
本設計中使用的繼電器的型號是SRD-05VDC-SL-C。電磁繼電器一般由銜鐵、線圈、鐵芯、觸點簧片等幾部分組成。當給繼電器兩端加上一個電壓時,電磁效應就此產生,開關打到常開觸點。當線圈斷電后,電磁的吸力也隨之消失,開關打到常閉觸點。
輔助加熱的電路圖如下所示:
在仿真時,由于軟件中沒有SRD-05VDC-SL-C型號的繼電器,所以用G2R-14-AC120型號的繼電器代替,兩者的工作原理相似。

圖3-11 輔助加熱電路圖
輔助加熱功能由外部中斷0實現,當采集到按鍵按下時,進入中斷。當輔助加熱時,單片機的P2.6口輸出的是高電平,三極管導通,開關打到常開狀態,發光二極管被點亮,當不需要輔助加熱時,P2.6口輸出的是低電平,三極管未導通,開關在常閉狀態,發光二極管不亮。圖中的D1為一個續流二極管,當線圈突然斷電后,電流不會立刻消失,剩余的能量會損壞線圈,為了防止這種現象發生,用一個二極管構成一個回路,使能量慢慢釋放完,保護了線圈,增加了它的壽命。
當蓄水箱中沒水時,是嚴禁啟動輔助加熱的,否則加熱器會燒壞。在軟件設計的時候,當進入輔助加熱中斷后,應先判斷是否有水,即33H中的值是否為0,當為0時,跳出中斷,不對P2.6的狀態做任何改變,當不為0時,P2.6輸出高電平,即開啟輔助加熱系統。
控制器的功能比較多,代碼也有幾百行,為了方便修改和設計,這里采用模塊化結構,包括主程序、溫度檢測子程序、水位檢測子程序、報警子程序、顯示子程序以及4個中斷程序:輔助加熱子程序、自動上水子程序和溫度設定子程序。由主程序調用不同的子程序來實現控制器的所有功能。
在編寫系統初始化程序時需要注意以下幾點:
?設置4個單元的顯示緩沖區30H~33H,數碼管顯示的數字存放在這里。
?在50H、51H中存放溫度設定的初始值。
?程序會使用到中斷,所以在初始化時必須對與中斷相關的寄存器進行一些設置。
主程序流程圖如下所示:

圖4-1 主程序流程圖
將采集到的溫度值轉換成數字數據后送到單片機進行處理,得到一個3位數的值,由于實際生活中顯示的溫度只需要2位就可以滿足,這里放棄了百位值的顯示,處理后的數據送到33H、32H保存并通過數碼管顯示。
4.3 水位檢測子程序
4個按鍵的一端分別接到P2口的4個引腳,當按鍵按下時,對應的引腳電平變低。判斷出哪個按鍵按下后數碼管會顯示出對應的值。流程圖如下所示:

圖4-2 水位檢測流程圖
4.4 報警子程序
將檢測到的水溫、水位與報警值進行比較,當超出范圍時,報警燈亮,當又回到正常范圍內時,報警燈暗。報警子程序流程圖如下所示:

圖4-3 報警流程圖
4.5 顯示子程序
當采集到水溫水位的數據后,被保存在30H~33H中,然后調用顯示子程序,在每個時間點被點亮的數碼管只有一個,但是時間間隔太短,人眼無法分辨出,所以平時看到的都是4個數碼管同時亮著。
4.6 輔助加熱子程序
輔助加熱功能由外部中斷0實現,當采集到按鍵按下時,進入中斷。進入中斷后首先判斷是否有水,沒水就退出,不需要加熱;如果有水,開啟加熱,當加熱到設定值后,停止加熱。輔助加熱流程圖如下:

圖4-4 輔助加熱流程圖
4.7 自動上水子程序
自動上水功能需要用到外部中斷1,當檢測到相應按鍵按下時,進入中斷,然后控制數碼管從00到30到60到90的顯示,完成后退出中斷。
4.8 溫度設定子程序
溫度設定需要用到2個定時器中斷,定時器中斷0用來完成溫度加1度,定時器中1用來完成溫度減1度。當進入溫度加1中斷后,判斷當前值的個位是否為9,若為9,則十位加1,個位清0;若不為9,則INC 50H即可。調用顯示后返回主程序。當進入溫度減1中斷后,判斷當前值的個位是否為0,若為0,則十位減1,個位變為9;若不為0,則DEC 50H即可。調用顯示后返回主程序。
程序編譯的目的是為了檢測編寫的程序是否成功,或找出其中錯誤,以便更好的改善,保證能夠正確的實現系統的軟件功能。本設計用的開發工具是KeilC,并使用匯編語言進行編程,程序編譯后的結果如下圖所示:

圖5-1 編譯后的結果
程序編譯正確之后,即可用仿真電路圖進行調試。仿真電路圖如下所示,由于矩陣鍵盤的效果與獨立按鍵的效果一樣,為了方便仿真,在此仿真時用獨立按鍵代替矩陣鍵盤,并用80C51代替SST89E58進行仿真:

圖5-2 仿真電路圖
點擊開始按鈕,程序開始運行,以下選取幾種仿真結果:
數碼管顯示應為3022,如下所示:

圖5-3 仿真結果顯示
(2)當按鍵3按下時,代表水位為60%,改變DS18B20的值,使之為40。數碼管顯示應為6040,如下所示:

圖5-4 仿真結果顯示
(3)當按鍵4按下時,代表水位為90%,達到報警值,此時不管溫度值為多少,系統都會報警,蜂鳴器會響,LED燈D1亮,如下所示:

圖5-5 仿真結果顯示

圖5-6 仿真結果顯示




圖5-7 仿真結果顯示
(6)當按鍵7按下時,溫度的設定值加1,由25變為26,如下所示:
→→
圖5-8 仿真結果顯示
→→
圖5-9 仿真結果顯示
硬件實物圖如下所示:

圖5-10 硬件實物圖
提供外部電源后硬件便開始工作,這里選取幾種結果演示:

圖5-11硬件結果顯示
(2)當KEY5按下時,代表水位為60%,此時水溫為30,則數碼管顯示結果為:

圖5-12硬件結果顯示
(3)當KEY1按下時,代表水位為90%,此時達到報警值,不管水溫為多少,系統都會報警,蜂鳴器響,LED燈被點亮,結果如下所示:

圖5-13硬件結果顯示
→
圖5-14 硬件結果顯示
→
圖5-15 硬件結果顯示
5.3 調試過程中遇到的問題
通過設計之前所學的知識都得到了廣泛的應用,加深了理論與實際的聯系。提高了本人的動手能力,自己的創新意識也得到了培養,使自己對單片機的了解更加的全面了。一開始接觸這個課題的時候,完全沒有思路,雖然很熟悉太陽能熱水器,控制器的功能也理解,但要自己動手用軟件和硬件來實現,卻無從下手。從網上找了很多資料,也借鑒了其他人設計的控制器,在一番深入的了解之后終于得到了一個初步的設計思路,并在之后的代碼編寫和硬件焊接過程中,不斷的完善,最終完成了本次設計。
在這次設計中,接觸到了溫度傳感器,這款芯片是本人從來沒有使用過的,雖然它與單片機的連接非常簡單,但是硬件的簡化導致了軟件的開銷,所以在軟件編程時,溫度檢測這一模塊的代碼困擾了本人很久,查了很多資料,對傳感器的工作原理也了解了很多,可是編寫的代碼始終不能運行,經過了三周左右的努力,終于發現了代碼中的錯誤,原因是因為沒有給復位足夠的時間導致18B20不能工作,修改后成功的將溫度檢測模塊編寫完成。設計中另外一個難點是溫度設定中斷代碼的編寫,在一開始的設計思路中,進入中斷后沒有PUSH、POP的內容,在中斷子程序中修改溫度后回到主程序時發生了沖突,意識到這一點后修改了代碼,完成了中斷子程序的編寫。至于其他模塊的代碼編寫比較簡單,過程中并未遇到什么挫折。
硬件電路的焊接也不是非常順利,設計初的報警電路是由LED燈和蜂鳴器組成的,但是在下程序的過程中不小心把蜂鳴器弄壞了,所以在耽擱了一周之后才完成。本次硬件電路是基于之前課程設計中用過的單片機實驗板,因此布局布線比較簡單,這為硬件的搭建省了很多事,也為此次設計提供了很多方便。
三個多月的時間很快就過去了,在這段時間里,本人各方面的能力都得到了提升,總之,這次設計讓本人學到了很多。
經過幾個月的努力,本人的設計已經完成。回想這幾個月的學習,從開題到論文的順利完成,得到了老師和同學們的很多幫助。
首先要感謝本人的指導老師,在設計的過程中,從選題,設計方案,論文修改直至成稿一直給予了很多的指導和幫助,同時也提供了相關的參考資料,為本人解答疑惑,提供了很多關鍵性的建議。她嚴謹細致,一絲不茍的作風一直是本人學習、工作中的榜樣,他循循善誘的教導和不拘一格的思路給本人無盡的啟迪。
還有本人的室友和很多同學也給了很多的幫助,他們給予鼓勵與意見,讓本人度過了這段艱辛的時期。特別要感謝寢室的同學們,一直以來都在鼓勵本人,在做仿真時一直都在幫助本人,如果沒有她們的熱心幫忙,此次設計的完成將變得非常困難。
對于這次設計中給予本人幫助的老師和同學致以感謝!
附錄
附錄1:程序
GE_BIT EQU 40H
SHI_BIT EQU 41H
DI_8BIT EQU 43H
GAO_8BIT EQU 44H
DQ EQU P1.0 ;溫度傳感器I/O口
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP HEAT ;輔助加熱
ORG 000BH
LJMP PLUS ;溫度加1
ORG 0013H
LJMP RISE ;自動加水
ORG 001BH
LJMP MINUS ;溫度減1
ORG 0020H
MAIN:MOV SP,#60H
MOV 30H,#0 ;30H-33H顯示緩沖區
MOV 31H,#0
MOV 32H,#0
MOV 33H,#0
MOV 50H,#5 ;存放溫度設定值
MOV 51H,#2
MOV DPTR,#07100H ;選中8155
MOV A,#3H
MOVX @DPTR,A
MOV IP,#0FH ;中斷優先級
MOV TCON,#05H ;外部中斷脈沖觸發有效
MOV IE,#8FH ;中斷總允許,允許定時器和外部中斷
MOV TMOD,#55H ;接通外部技術引腳T0T1
MOV TH0,#0FFH
MOV TL0,#0FFH
MOV TH1,#0FFH
MOV TL1,#0FFH
SETB TR0 ;啟動定時器
SETB TR1
CLR P2.4
CLR P2.6
TURN:
LCALL WATER
LCALL ZHUANHUAN ;調用讀溫度子程序
LCALL DISPLAY
LCALL WARN ;水溫水位報警
AJMP TURN
WATER: ;水位按鍵判斷
JNB P2.3 ,LOOP5
JNB P2.2,LOOP4
JNB P2.1,LOOP3
JNB P2.0,LOOP2
LCALL DISP
RET
LOOP2:MOV 32H,#0
MOV 33H,#0
LCALL DISP
RET
LOOP3:MOV 32H,#0
MOV 33H,#3
LCALL DISP
RET
LOOP4:MOV 32H,#0
MOV 33H,#6
LCALL DISP
RET
LOOP5:MOV 32H,#0
MOV 33H,#9
LCALL DISP
RET
WARN:MOV A,51H ;水溫報警
SWAP A
ORL A,50H
MOV 52H,A ;50H和51H 合并
MOV A,31H
SWAP A ;30H和51H合并
ORL A,30H
CJNE A,52H,PD ;檢測到的溫度與設定溫度比較
CLR P2.6
CLR P1.2
SETB P1.1
LJMP EXIT
PD:JC BBB ;溫度<設定值則 跳到BBB
CLR P2.6
CLR P1.2
SETB P1.1
SJMP EXIT
BBB:LCALL WARNING
EXIT:RET
WARNING:MOV A,#0 ;水位報警
CJNE A,33H,PD1 ;沒水時報警
CLR P1.2
SETB P1.1
AJMP OUT1
PD1:MOV A,#9
CJNE A,33H,BB ;水滿時報警
CLR P1.2
SETB P1.1
AJMP OUT1
BB:SETB P1.2
CLR P1.1
OUT1:RET
/*4個中斷*/
PLUS: ;溫度加1中斷
PUSH 30H
PUSH 31H
MOV TH0,#0FFH
MOV TL0,#0FFH
MOV A,50H
CJNE A,#9,CC
MOV 50H,#0
INC 51H
AJMP CC1
CC:INC 50H
CC1:
MOV 30H,50H
MOV 31H,51H
MOV R1,#07FH
CFU:LCALL DISP1 ;將設定值顯示一段時間
DJNZ R1,CFU
POP 30H
POP 31H
RETI
MINUS: ;溫度減1中斷
PUSH 30H
PUSH 31H
MOV TH1,#0FFH
MOV TL1,#0FFH
MOV A,50H
CJNE A,#0,CC2
MOV 50H,#9
DEC 51H
AJMP CC3
CC2:DEC 50H
CC3:
MOV 30H,50H
MOV 31H,51H
MOV R1,#07FH
CFU1:LCALL DISP1
DJNZ R1,CFU1
POP 30H
POP 31H
RETI
HEAT: ;輔助加熱中斷
MOV A,33H
JZ OUT ;沒水時不能打開繼電器,JZ累加器判0轉移
SETB P2.6
OUT:RETI
RISE: MOV 32H,#0 ;自動上水
MOV 33H,#0
MOV R1,#0FFH
CFU2:LCALL DISP
DJNZ R1,CFU2
MOV 33H,#3
MOV R1,#0FFH
CFU3:LCALL DISP
DJNZ R1,CFU3
MOV 33H,#6
MOV R1,#0FFH
CFU4:LCALL DISP
DJNZ R1,CFU4
MOV 33H,#9
MOV R1,#0FFH
CFU5:LCALL DISP
DJNZ R1,CFU5
RETI
/***顯示程序***/
DISP:
MOV A,#40H ;水位顯示子程序
MOV DPTR,#07101H
MOVX @DPTR,A
MOV A,32H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#07102H
MOVX @DPTR,A
LCALL DELAY00
MOV A,#80H
MOV DPTR,#07101H
MOVX @DPTR,A
MOV A,33H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#07102H
MOVX @DPTR,A
LCALL DELAY
RET
DISP1:
MOV A,#10H ;溫度顯示子程序
MOV DPTR,#07101H
MOVX @DPTR,A
MOV A,30H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#07102H
MOVX @DPTR,A
LCALL DELAY00
MOV A,#20H
MOV DPTR,#07101H
MOVX @DPTR,A
MOV A,31H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#07102H
MOVX @DPTR,A
LCALL DELAY
RET
/*---------------------延時子程序-------------------- */
DELAY: MOV R5,#0FH
DELAY4: MOV R4,#0FH
DELAY5: DJNZ R4,DELAY5
DJNZ R5,DELAY4
RET
DELAY00:MOV R6,#0AH
DELAY8: MOV R7,#0AFH
DELAY9: DJNZ R7,DELAY9
DJNZ R6,DELAY8
RET
;這是DS18B20復位初始化子程序
INIT_1820:
SETB DQ
NOP
CLR DQ ;主機發出延時537微秒的復位低脈沖
MOV R1,#3
DU_1:
MOV R0,#107
DJNZ R0,$
DJNZ R1,DU_1
SETB DQ ;然后拉高數據線
NOP
NOP
NOP
MOV R0,#25H
DU_2:JNB DQ,DU_3 ;等待DS18B20回應
DJNZ R0,DU_2
LJMP DU_4 ;延時
DU_3:SETB F0 ;置標志位,表示DS1820存在
LJMP DU_5
DU_4:CLR F0 ;清標志位
LJMP DU_7
DU_5:MOV R0,#117
DU_6:DJNZ R0,DU_6
DU_7:SETB DQ
RET
;-------------------------------------------------
;寫DS18B20的子程序
WRITE_1820:MOV R2,#8
CLR C
WR1:CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;-------------------------------------------------
;讀DS18B20的子程序,
READ_1820:MOV R4,#2
MOV R1,#DI_8BIT ;低位存入DI_8BIT,高位存入GAO_8BIT
RE0:MOV R2,#8
RE1:CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#9
RE2:DJNZ R3,RE2
MOV C,DQ
MOV R3,#23
RE3:DJNZ R3,RE3
RRC A
DJNZ R2,RE1
MOV @R1,A
INC R1
DJNZ R4,RE0
RET
;-------------------------------------------------
;讀出后轉換的溫度值
ZHUANHUAN:
LCALL INIT_1820 ;先復位DS18B20
JB F0,ZH1
RET
ZH1:MOV A,#0CCH
LCALL WRITE_1820
MOV A,#44H
LCALL WRITE_1820
LCALL DISPLAY ;等待AD轉換結束,12位的話750微秒
LCALL INIT_1820
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;發出讀溫度命令
LCALL WRITE_1820
LCALL READ_1820
;CHULI
MOV A,GAO_8BIT
MOV A,DI_8BIT
MOV B,#16
DIV AB
MOV 35H,A ;將DI_8BIT的高四位右移四位,存入35H中(溫度值)
MOV A,B ;將TEMPER_L的低四位X10/16得小數后一位數.
MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV 36H,A ;將小數后一位數.存入36H中
MOV A,GAO_8BIT ;TEMPER_H中存放高8位數,權重16
MOV B,#16
MUL AB
ADD A,35H ;35H中存入溫度值的整數部分
MOV B,#10
DIV AB
MOV GE_BIT,B ;個位存入40H中
MOV B,#10 ;
DIV AB ;
MOV SHI_BIT,B ;十位存入41H中
RET
;-------------------------------------------------
DISPLAY:
MOV A,SHI_BIT //顯示溫度十位
MOV 31H,A
MOV A,GE_BIT //顯示溫度個位
MOV 30H,A
LCALL DISP1
RET
/*************** 段碼緩沖區 **********************************/
TABLE: DB 0fcH,60H,0daH,0f2H,66H,0b6H,0beH,0e0H,0feH,0f6H
End

單片機的太陽能熱水器控制器的設計論文.doc
(16.57 MB, 下載次數: 158)
| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |