基于51單片機家用電熱水器的設計論文_第1頁
基于51單片機家用電熱水器的設計論文_第2頁
基于51單片機家用電熱水器的設計論文_第3頁
基于51單片機家用電熱水器的設計論文_第4頁
基于51單片機家用電熱水器的設計論文_第5頁
已閱讀5頁,還剩50頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于51單片機的家用電熱水器設計基于51系列單片機的家用電熱水器設計摘要隨著社會的發展和人類科技的進步,各行各業都在使自己的產品智能化、數字化。由于老式熱水器使用燃氣或天然氣燃燒和加熱水,因此手動調節溫度不僅不準確,還需要確定用戶所需的水溫,并且還存在一定的風險。電熱水器是可用于浴室、廁所和廚房的家用電器。隨著人們生活質量的提高,現代家用電熱水器摒棄了以往的做法,采用了更加精準、安全的實施方式。C語言對于單片機編程有很多優點,比如容易移植、語法檢查錯誤少、健壯性好、頭文件類型多、能夠快速方便地使用各種功能。本文以AT89C52單片機為控制器,用C語言編寫程序,設計了一款智能家用電熱水器。采用陣列鍵盤輸入溫度,溫度可精確到0.1攝氏度,采用LED燈顯示,可準確提供用戶所需溫度的溫水。DS18B20用于采集溫度,LED燈用于準確顯示采集到的水溫。當所需溫度高于當前采集水溫時,使用MOC3041芯片觸發加熱,當所需溫度低于當前采集水溫時,停止加熱。智能控制功能基本實現。關鍵詞:單片機;C語言;獲得;智力;家用電熱水器

目錄第1章引言11.1家用電熱水器現狀11.2TX-1CMCU實驗開發板介紹1第2章系統硬件設計22.1系統硬件組成部分22.2系統硬件各部分介紹22.3數碼管顯示32.3.1數碼管介紹32.3.2數碼管4的實現方法2.3.3鎖存器和數碼管顯示方式62.4鍵盤輸入設計72.4.1鍵盤輸入法72.4.2鍵盤輸入抖動和去抖的方法82.5DS18B20溫度采集92.5.1DS18B20技術性能及應用范圍92.5.2DS18B20初始化及讀寫操作102.5.3DS18B20指令及格式122.5.4DS18B20寄生供電方式152.5.5DS18B20改進的寄生供電方式162.5.6DS18B20外接供電方式172.5.7DS18B20寄生供電方式18第3章系統軟件設計203.1鍵盤輸入步驟203.2DS18B20溫度傳感器設計213.3主函數分析253.4顯示功能分析263.5中斷加熱子功能分析33第四章功能介紹及成品圖354.1智能熱水器的功能354.2成品圖35第五章總結與展望38附錄程序41第一章簡介單片機是一種與我們生活息息相關的控制器,它存在于很多地方,如:電子表、掌上游戲機、數碼相機、錄音筆、電視遙控器等。單片機主要由中央處理器、存儲器和輸入/輸出設備組成。它就像一臺小型計算機。它可以執行人編寫的程序,發出各種控制命令。可以實現各種功能。通過單片機,人們的生活將變得更加方便快捷。1.1家用電熱水器現狀我們的家用電熱水器是一種家用電器,可用于浴室、廁所和廚房,根據人們的需要提供溫水。市場上傳統的機械式電熱水器控制精度低、可靠性差,甚至存在一定的隱患。隨著社會的發展和人們生活質量的提高,人們對電熱水器的要求也越來越趨向智能化、數字化。這種老式簡單的電熱水器已經不能滿足人們的需求。而智能家用電熱水器的出現順應了現代智能家電的潮流。它可以為用戶提供方便快捷的數字輸入法,并能準確采集和控制環境中的水溫,并提供給用戶,因此備受關注。1.2TX-1CMCU實驗開發板介紹XT-1C單片機開發板是天翔電子多年綜合開發經驗,在原TX-1B基礎上精心設計開發的多功能51單片機開發平臺。開發板集成了常用的MCU外設資源,串口和USB口兩種調試下載接口,完全兼容ATMEL的51單片機。高可靠性、強抗靜電、強抗干擾等。TX系列單片機開發板可作為各種51單片機的開發板,可以用匯編語言或C語言編程。使用STC的單片機時,直接用產品包附帶的串口線將開發板連接到電腦的串口,按照STC單片機下載操作教程下載程序,下載速度比其他下載快很多工具。本文將使用TX-1C開發板完成數字電熱水器的設計。第二章系統硬件設計2.1系統硬件組成系統設計硬件原理結構如圖2.1所示。該系統基于性價比高的AT89C51單片機,由鍵盤輸入、DS18B20溫度采集、數碼管顯示電路、電源時鐘復位電路、雙向可控硅驅動電路MOC3041、雙向可控硅TLC336A組成的加熱器控制電路。圖2.1系統設計硬件原理結構2.2系統硬件各部分介紹這里AT89C51是主控制器。單片機的P0口接74HC573鎖存器,可以節省單片機的端口,P0口可以多次操作,這樣不僅可以控制單片機的片選數碼管,還可以控制數碼管的位選擇,從而節省了外部接口,擴展了功能。鍵盤的輸入由P3口完成。第4章將詳細介紹如何實現它。時鐘復位電路如圖2.2所示。RET連接單片機的RESET接口,主要完成單片機的復位功能。圖2.2時鐘復位電路溫度采集芯片由DS18B20芯片完成。DS18B20的2號接口接單片機的P2^2口,按照協議傳輸一組兩個字節的溫度數據。第三章將介紹具體的實現方法。加熱模塊如圖2.3所示。MOC3041芯片的2號口接單片機的P2^2口。當需要加熱時,P2^2接口致低電平觸發加熱器工作。圖2.3加熱模塊2.3數碼管顯示2.3.1數碼管介紹單芯片系統中常用的顯示器有:LED(LightEmittingDiode)顯示器、液晶CD(LiquidCrystalDisplay)顯示器、CRT顯示器等LED和LCD顯示器有兩種顯示結構:段顯示(7段、米字形等)和點陣顯示(5×8、8×8點陣等)。使用LED顯示屏時,要注意區分這兩種不同的連接方式。為了顯示數字或字符,必須對數字或字符進行編碼。七段數碼管加一個小數點,共8段。所以為LED顯示屏提供的編碼正好是一個字節。本設計中使用的TX-C1實驗板采用共陰極LED顯示屏,按照電路連接圖顯示的十六進制數字代碼如表2.1所示。表2.1十六進制數的編碼十六進制編碼數碼管顯示值十六進制編碼數碼管顯示值十六進制編碼數碼管顯示值0x3f00x7d60x39C0x0610x0770x5eD0x5b20x7f80x79乙0x4f30x6f90x71F0x6640x77一個0x00無顯示0x6d50x7c乙2.3.2數碼管的實現方法數碼管由P0口控制。有兩點需要注意。第一點是應該打開哪個數碼管,第二點是亮數碼管顯示的數字。因此,數碼管分為位選擇和段選擇。位選擇在程序中用wei表示。單片機為P2^7口,即進行位選擇操作時,P2^7為高電平。這時,八個數碼管上端口的操作決定了哪些數碼管是開啟的。P0操作完成后,P2^7會顯示為低電平,表示位選擇已被鎖定。段選擇在程序中用duan表示。單片機是P2^6口。與位選擇一樣,P2^6在運行時處于高電平。此時數碼管上P0的八個端口的操作決定了燈的數量。數碼管顯示什么數字,P0操作完成后,P2^6會顯示一個低電平,這樣段選擇就被鎖定了。圖2.4,由于單片機只起控制的作用,其輸出電流很小,所以P0端需要接上拉電阻和5V電源,控制5V電源由電壓變化。當它通過時,會給P0^0一個低電平,觸發上拉電阻兩端的電位差,使電流流向a點,使a端對應的LED亮起來。圖2.4單片機與數碼管的硬件連接先選擇位選擇,再選擇段選擇。uchar碼表[]={0x3f、0x06、0x5b、0x4f、0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00,0x08,0x88};可以直接設置數碼管顯示每個數字的十六進制,即應該分配給P0口的十六進制,方便操作。和上面的數組一樣,在使用的時候,只把需要的數組中的一個分配到P0口,這樣數碼管就可以方便直觀的顯示需要的數字。位選擇和片選的選擇過程相當快,顯示的是一排人眼易于識別的十進制數字,是數碼管的動態顯示。2.3.3鎖存器和數碼管顯示方法這里先介紹一下74HC573芯片,它是一個鎖存芯片。連接方法如圖2.5所示。P2^7和P2^6分別控制位選擇和段選擇的L端。例如:當P2^7(程序中的全局變量wei)被賦值為高電平時,74HC573的輸入端口的值會直接送到74HC573芯片的輸出端。當輸入端變化時,輸出端也隨之變化。當P2^7為低電平時,74HC573芯片會記住上次L口為高電平時芯片輸入的8位,并輸出。當輸入改變時,輸出不會改變。這里可以利用鎖存器的特性,讓P2^7起到控制數碼管光的作用,讓P2^6控制數碼管的數碼作用。圖2.574HC573芯片的連接以下數碼管顯示了程序的一部分。P0=0xff; 偉=1; P0=srtemp;//wein開啟后為低電平亮 魏=0; srtemp=_croll_(srtemp,1); P0=0x00; 段=1; P0=表[dis[i]]; 段=0; 延遲(1); 段=1; P0=0x00; 段=0;需要注意的是位選擇(程序中的wei變量),當位選擇為低時,選擇數碼管點亮。很容易造成不需要亮的LED燈管在顯示時稍微亮的問題。這是因為所選擇的位選擇和段選擇都是通過P0賦值的。如果先選擇位選擇的8位值,則不會恢復P0端口。如果變為0x00,會導致段選擇開啟,在段選擇P0口需要的值還沒有被賦值之前,P0口會在此期間將剛剛選擇的8位值賦給段選擇鎖存器一段的時間。,一些不必要的LED燈點亮。在單片機上,LED燈是微亮的,所以這里需要注意的是,每次將P0分配給位選擇之前,要確保P0端口為0x00。2.4鍵盤輸入設計2.4.1鍵盤輸入法本設計采用矩陣鍵盤,如圖2.6所示。圖2.6矩陣鍵盤S10到S19分別代表數字0到9。S20代表確認號碼,按下它可以確認要輸入的號碼的某個數字。左側鍵盤的引腳從上到下為P3^0到P3^7。第一行暫時不用。它將從第二行開始使用。^6,P3^7,它們是線與的關系。因此,可以掃描圖中的第二行、第三行和第四行。掃描第一行時,將P3端口分配為0xfd,即“0”分配給P3^1端口,“1”分配給P3的其他端口。當第二行沒有按鍵按下時,P3^4、P3^5、P3^6、P3^7將為高電平“1”,一旦按鍵按下,由于線路和關系,P3中的一個^4、P3^5、P3^6、P3^7必須為“0”,其中哪個為“0”依次代表按下了S10到S13的哪些鍵。依次掃描三行可以隨時檢測是否有按鍵被按下。2.4.2鍵盤輸入抖動和去抖方法里2.4.1講了如何實現鍵盤的掃描,但是理論和實踐還有一定的差距。當按下鍵盤并檢測到電壓變化時,在此期間實踐中存在一定的時間誤差。經過這段時間誤差后,電壓會達到單片機可以檢測到的范圍,但是單片機可能在這段時間內已經完成了檢測,如圖2.7所示圖2.7抖動示意圖如果不去除抖動,單片機就已經開始檢測到人們按下手指的那一刻。此時電壓還沒有下降到穩定的閉合狀態,所以無法檢測到壓力。同樣,無論是按下還是釋放,都會出現這樣的情況。,不利于運行,所以應該加上去抖操作。圖右側是硬件去抖。除了硬件去抖,也可以使用軟件去抖。在本設計中,采用了軟件去抖的方法。原理是檢測兩次,第一次檢測到低電平時延時一段時間,再檢測一次。如果仍然可以檢測到低電平,則表示按下了某個鍵。.具體程序如下:而(溫度!=0xf0) { 延遲(5); P3=0xfd; 溫度=P3; 溫度=溫度&0xf0; 而(溫度!=0xf0)上面的程序是兩個while循環之間的嵌套。第一個while()語句判斷一個鍵被按下,然后延遲一段時間再做判斷。如果第二次判斷也認為按鍵被按下,則可以確認確實是鍵盤操作的,不是抖動。按下后的具體操作可以寫在后面的while循環中。2.5DS18B20溫度采集2.5.1DS18B20技術性能及應用范圍圖2.8DS18B20外形及引腳圖DS18B20是一款可聯網的數字溫度傳感器芯片。耐磨耐沖擊,體積小,使用方便,包裝形式多樣。適用于各種小空間設備的數字溫度測量和控制。獨特的單線接口方式,DS18B20與微處理器連接時僅需一根端口線即可實現微處理器與DS18B20的雙向通訊。測溫范圍-55℃~+125℃,固有測溫分辨率0.5℃。支持多點組網功能,單根三線可并聯多個DS18B20,最多只能并聯8個。數量過多會導致電源電壓過大低,導致信號傳輸不穩定,實現多點測量。溫度。工作電源為3~5V/DC。使用時無需外部元件,測量結果以9至12位數字格式串行傳輸。不銹鋼保護管直徑Φ6,適用于DN15~25、DN40~DN250各種中型工業管道及狹小空間設備的測溫,標準安裝螺紋M10X1、M12X1.5、G1/2”可選,PVC電纜直接插座或德式球形接線盒插座,方便與其他電氣設備連接。負壓特性:當電源極性接反時,芯片不會因發熱而燒毀,但不能正常工作。DS18B20的結構主要由四部分組成:64位光刻ROM、溫度傳感器、非易失性溫度報警觸發器TH和TL、配置寄存器。DS18B20的外形和引腳排列如圖2.8所示。本產品適用于冷凍庫、糧倉、儲罐、電信機房、電力機房、電纜線槽等溫度測控領域/制冷管道熱測量、中央空調戶用熱能測量和工業測溫及控制、汽車空調、冰箱、冰柜、中低溫干燥箱等。2.5.2DS18B20的初始化和讀寫操作1.DS18B20的初始化(1)首先將數據線設置為高電平“1”;(2)延遲(時間要求不是很嚴格,但盡量短);(3)數據線拉低電平“0”;(4)延遲750微秒(這個時間的時間范圍可以是480到960微秒);(5)數據線拉高電平“1”;(6)延遲等待(如果初始化成功,15到60毫秒內會產生DS18B20返回的低電平“0”。根據這個狀態可以判斷它的存在,但要注意不能等待無限期,否則程序會進入死循環,所以需要進行超時控制);(7)如果CPU在數據線上讀到低電平“0”,則需要延時,延時時間至少是從致的高電平(從步驟(5)的時間開始)到480微秒;(8)再次將數據線拉高至高電平“1”結束。DS18B20的初始化如圖2.9所示。圖2.9DS18B20的初始化2、DS18B20的寫操作(1)數據線先置低電平“0”;(2)延遲確定的時間為15微秒;(3)按從低到高的順序致字節(一次只致一位);(4)延遲時間為45微秒;(5)將數據線拉高;(6)重復(1)到(6)的操作,直到致完所有字節;(7)最后,將數據線拉高。這里需要注意的是(3),1bit在寫數據的時候不時分開傳輸。這里有兩種情況。當需要致“1”時,單片機應給DS18B20芯片的DQ接口分配低電平,約15秒后,延遲約45微秒將DQ釋放為高電平。當需要致“0”時,單片機應給DS18B20芯片的DQ接口分配一個低電平,并持續拉低至少60微秒,然后釋放DQ為高電平,然后延時大約15秒。DS18B20的寫操作時序圖如圖2.10所示。圖2.10DS18B20寫操作時序圖DS18B20的讀操作(1)將數據線拉高至“1”;(2)延遲2微秒;(3)將數據線下拉至“0”;(4)延遲15微秒;(5)將數據線拉至“1”;(6)延遲15微秒;(7)讀取數據線的狀態,得到一個狀態位,進行數據處理;(8)延遲30微秒;這里只需按照上述操作順序存儲狀態位的位即可。DS18B20的讀操作時序圖如圖2.11所示。圖2.11DS18B20讀操作時序圖2.5.3DS18B20的說明和格式DS18B20溫度格式圖如圖2.12所示。圖2.12DS18B20溫度格式這是12位轉換后得到的12位數據,存儲在DS18B20的兩個8位RAM中。二進制中的前5位是符號位。如果實測溫度大于0,這5位為0,只要將實測值乘以0.0625即可得到實際溫度;如果溫度小于0,這5位為1,需要將測量值取反加1再乘以0.0625得到實際溫度。例如,+125°C數字輸出為07D0H,+25.0625°C數字輸出為0191H,-25.0625°C數字輸出為FE6FH,-55°C數字輸出為FC90H。DS18B20溫度傳感器的存儲器DS18B20溫度傳感器的內部存儲器包括一個高速暫存RAM和一個非易失性電可擦除EEPRAM,存儲高溫和低溫觸發器TH、TL和結構寄存器。配置寄存器,該字節每一位的含義如表2.2所示。表2.2配置寄存器結構溫度數據輸出(二進制)數據輸出(十六進制)+125℃000001111101000007D0+85℃00000101010100000550+25.0625℃00000001100100010191+10.125℃000000001010001000A2+0.5℃000000000000100000080℃00000000000000000000-0.5℃1111111111111000FFF8-10.125℃1111111101011110FF5E-25.0625℃1111111001101111FE6F-55℃1111110010010000FC90暫存器存儲器由9個字節組成。其分布如表2.3所示。當發出溫度轉換命令時,轉換后的溫度值以兩字節補碼的形式存入高速暫存存儲器的第0和第1字節。單片機可以通過單線接口讀取數據。閱讀時,低位在前,高位在后。對應溫度計算:當符號位S=0時,直接將二進制位轉換為十進制;S=1時,先將補碼轉換為原碼,再計算十進制值。第9個字節是冗余校驗字節。表2.3DS18B20暫存器寄存器分布寄存器容量字節地址溫度值低位(LSByte)0溫度值高(MSByte)1高溫極限(TH)2低溫極限(TL)3配置寄存器4預訂5預訂6預訂7CRC校驗值8根據DS18B20的通信協議,主機(MCU)通過三個步驟控制DS18B20完成溫度轉換:每次讀寫前復位DS18B20,復位成功后致ROM命令,最后致RAM命令。DS18B20執行預定的操作。復位需要主CPU拉低數據線500微秒,然后釋放。DS18B20收到信號后,等待約16~60微秒,然后發出一個60~240微秒的低電平脈沖。主CPU收到此信號表示復位成功。.ROM指令表如表2.4所示,RAM指令表如表2.5所示。表2.4ROM指令表操作說明合約代碼功能讀ROM33小時讀取DS1820溫度傳感器ROM中的代碼(即64位地址)兼容ROM55H發出該命令后,再發出64位ROM代碼,訪問單總線上代碼對應的DS1820使其響應,為DS1820的下一次讀寫做準備。搜索ROM0FOH用于確定連接到同一總線的DS1820的數量,并識別64位ROM地址。準備操作每個設備。跳過ROM0CCH忽略64位ROM地址,直接向DS1820致溫度轉換命令。適合單片工作。警告搜索命令0ECH執行后,只有溫度超過設定值上限或下限的膠片才會響應。表2.5RAM指令表操作說明合約代碼功能溫度變化44小時啟動DS1820進行溫度轉換,12位轉換最長時間為750ms(9位轉換為93.75ms)。結果存儲在部分9字節RAM中。閱讀暫存器0BEH讀取RAM中的9字節內容寫便箋4EH發出命令,將上下限溫度數據寫入內部RAM的3和4字節,然后發出命令,傳輸2字節數據。復制暫存器48小時將RAM中的第3和第4個字節復制到EEPROM。重置EEPROM0B8H將EEPROM內容恢復到RAM中的第3和第4字節。讀取電源0B4H讀取DS1820的供電模式。當提供寄生電源時,DS1820致“0”,當DS1820由外部電源供電時致“1”。2.5.4DS18B20寄生供電方式DS18B20測溫系統具有測溫系統簡單、測溫精度高、連接方便、占用線路少等優點。下面是DS18B20在幾種不同應用模式下的測溫電路圖:DS18B20的寄生供電方式電路圖如圖2.13所示。在寄生供電模式下,DS18B20從單線信號線吸取能量:當信號線DQ為高電平時,能量儲存在部分電容中。在低電平期間,電容上的能量被消耗,寄生電源(電容)被充電,直到高電平到來。獨特的寄生功率方法具有三個好處:1、遠程測溫無需本地供電;2.無需常規電源即可讀取ROM;3、電路更簡潔,只用1個I/O口測溫。為了使DS18B20進行準確的溫度轉換,I/O線必須在溫度轉換過程中提供足夠的能量。由于每個DS18B20在溫度轉換過程中工作電流達到1mA,當多個溫度傳感器連接到同一個I/O線路上進行多點溫度測量時,僅4.7K上拉電阻無法提供足夠的能量,會導致溫度無法轉換或溫度誤差很大。因此,該電路只適合用在單個溫度傳感器測溫的情況下,不適合用在供電系統中。并且工作電源VCC必須保證為5V。當電源電壓下降時,寄生電源所能汲取的能量也會減少,這會增加溫度誤差。\o"查看圖片"圖2.13DS18B20寄生供電方式2.5.5DS18B20改進的寄生供電方式DS18B20寄生電源上拉供電方式電路圖,改進后的寄生供電方式如圖2.14所示,為了使DS18B20在進行溫度轉換或復制到E2內存時,在動態轉換周期內獲得足夠的電流供應操作時,使用MOSFET將I/O線直接拉到VCC以提供足夠的電流。在發出任何涉及復制到E2存儲器或啟動溫度轉換的命令后,I/O線必須在最多10μS內轉換到強上拉狀態。在強上拉模式下,可以解決供電不通的問題,因此也適用于多點測溫應用。缺點是要多占用一根I/O口線,用于強上拉切換。\o"查看圖片"圖2.14改進的寄生供電方式2.13和圖2.14所示的寄生供電模式下,DS18B20的VDD引腳必須接地。2.5.6DS18B20外接供電方式如圖2.15所示。在外部供電模式下,DS18B20的工作電源由VDD引腳連接。此時I/O線不需要強拉,也不存在供電電流不足的問題。保證了轉換的準確性,同時理論上可以在總線上連接任意數量。DS18B20傳感器構成多點溫度測量系統。注意:在外接供電模式下,DS18B20的GND引腳不能懸空,否則無法進行溫度轉換,讀取溫度始終為85°C。\o"查看圖片"圖2.15外接供電方式單點測溫電路\o"查看圖片"本設計采用外接供電方式,連接方式如圖2.16所示。圖2.16設計中使用的溫度測量電路將DS18B20的I/O口直接連接到單片機的P2^2,這樣就可以在硬件上進行數據交換,從而達到溫度數據傳輸的目的。2.5.7DS18B20寄生供電方式外接供電方式的多點測溫電路圖如圖2.17所示。外接供電模式是DS18B20的最佳工作模式,工作穩定可靠,抗干擾能力強,電路比較簡單,可以開發穩定可靠的多點溫度測量。溫度監控系統。站長建議大家在開發中使用外接供電方式,畢竟寄生供電方式只接一根VCC引線。在外部供電模式下,可以充分利用DS18B20寬電源電壓范圍的優勢。即使電源電壓VCC下降到3V,測溫精度仍然可以得到保證。圖2.17外接電源多點測溫電路圖第三章系統軟件設計3.1鍵盤輸入程序 而(溫度!=0xf0) { 延遲(5); P3=0xfd; 溫度=P3; 溫度=溫度&0xf0; 而(溫度!=0xf0) { 溫度=P3; 開關(溫度) { 案例0xed:num=0; 休息; 案例0xdd:num=1; 休息; 案例0xbd:num=2; 休息; 案例0x7d:num=3; 休息; } 而(溫度!=0xf0) { 溫度=P3; temp=temp&0xf0;//****0000 } }這里用到了_crol_函數,所以要在頭文件中加入#include<intrins.h>,包含去抖動和釋放檢測。經過測試,num通過不同的temp值被賦予了一個對應的值,這樣num就是一個需要輸入的數字。3.2DS18B20溫度傳感器設計連接好電路后,就可以開始設計DS18B20的軟件了。首先對DS18B20進行初始化,以下是初始化過程。無效dsstart(){ 無符號整數i; ds=0;我=100;//下拉800us左右,480us以上滿足協議要求而(i>0)i--;ds=1;//產生上升沿,進入等待響應狀態 我=4; 而(i>0)i--;}然后等待延遲并響應。比如下面的子函數。無效dswait(){ 無符號整數i; 同時(ds);//等待應答信號而(?ds);//檢測到響應脈沖我=4;而(i>0)i--;}讀取數據時使用以下兩個子函數。讀取溫度采集時可以調用。bitreadbit()//讀取位{ 無符號整數i; 位b; ds=0; 我++;//延遲8us左右,保持至少1us符合協議要求 ds=1; 我++; 我++;//延時16us左右,滿足協議要求時延時至少15us b=ds;我=8;而(i>0)i--;//延遲64us左右,滿足讀時隙不小于60us的要求返回b;}ucharreadbyte()//讀取一個字節{ 單位b; uchar日期,a; b=0;日期=0; 而(b<8) { a=readbit(); 日期=(a<<7)|(日期>>1); b++; } 歸期; }下面是寫命令程序。用于控制DS18B20。voidwriter(ucharorder)//寫命令{ uintb; uchara; 位位2; b=0; 對于(a=0;a<8;a++) { bit2=訂單&0x01; 訂單>>=1; if(bit2)//寫入1 { ds=0; b++,b++; ds=1; for(b=0;b<8;b++); } 否則//0 { ds=0; for(b=0;b<8;b++); ds=1; b++;b++; } }}上述程序編寫完成后,準備工作基本完成。現在只需調用這些函數來控制DS18B20以便它可以根據協議將溫度數據傳輸到微控制器。軟件實現方法如下:voidchangetemp()//溫度轉換函數{ dsstart(); dswait(); 延遲(1); writeor(0xcc);//跳過讀取序列號列號的操作 writer(0x44);//開始溫度轉換 延遲(1);}uintgettemp()//獲取溫度{ 浮動tt; 國際溫度; uchargeta,getb; dsstart(); dswait(); 延遲(1); 作家(0xcc); writeor(0xbe);//讀取溫度命令 延遲(2); geta=readbyte();//讀取兩個字節 getb=readbyte(); 溫度=getb; temp<<=8;//左移8位 溫度=溫度|geta; tt=temp*0.0625;//將temp中的數字轉換為實際溫度值 temp=tt*10+(temp>0?0.5:-0.5);//,大十倍,四舍五入 返回(溫度);}上述兩個程序流程為:首先在changetemp()子函數中初始化DS18B20,芯片響應后寫入兩個字節命令。0xcc和0x44的作用是分別跳過讀取序列號和序列號的操作。開始溫度轉換。然后溫度獲取gettemp()子函數就完成了。在gettemp()子函數中,DS18B20也是先初始化,等待響應,寫入指令0xcc跳過讀取序列號的操作,0xbe讀取溫度指令。使用readbyte()讀取兩個字節的數據,將geta和getb分別賦值給兩個字符變量,然后將getb賦值給temp(temp是一個容量為兩個字節的整型變量),這樣temp的低8位因為它是getb中的值。temp<<=8的意思是temp=temp<<8,所以temp的低8位會變成temp的高8位,而C語言規定低8位移位操作后不足的位由0,此時的目的是將geta中的數據賦值給temp的低8位。只需在temp中按位和geta,geta的中間位為1,高位temp的低8位中的0為1,而geta中的位為0,temp中低8位的0為0,因此geta中的值分配給temp的低8位。既然已經獲取了溫度數據,就需要通過軟件計算出具體傳輸數據所代表的溫度值了。如前所述,數據中的1代表0.0625攝氏度。將溫度值乘以0.0625就是所需的溫度。通過將temp乘以0.0625獲得的值分配給tt。temp=tt*10+(temp>0?0.5:-0.5)這句話是先把tt從最高位變成十位小數點后一位的數擴大十倍,變成了三-最高位為百位的數字,后面加上十一個四舍五入的賦值語句,相當于一個if語句。C語言是當任何一個精度高的變量變成一個低精度的變量時,都會損失一定的精度,并且會向下舍入。例如,如果tt是一個正溫度,它變大10倍后,小數點后的數字是1還是1。9、默認都是四舍五入的。如果要對一個正數的tt進行四舍五入,應該先給tt加0.5,然后再賦值給精度較低的temp,這樣就可以有四舍五入的功能了,不過這里沒那么簡單,這個if語句也考慮tt為負值時的操作。如果temp為負值,則tt變大10倍后必須減去0.5,這樣才能在tt為負時完成舍入。3.3主要功能分析先給出main函數:無效的主要(){ TMOD=0x01; TH0=(65536-46000)/256; TL0=(65536-46000)%256; EA=1; ET0=1; TR0=1; zd=0; 數字=21;aaa=0;bbb=0; num1=21;num2=21;num3=21; 而(1) { 單位一個; ucharb; 更改臨時(); a=gettemp(); b=scanff(); numy=gettemp(); 顯示(a,b); }}這里aaa用于控制是否判斷輸入的數字是否為必填數字,bbb用于標記已輸入的三個數字的個數。主函數先賦值使用的全局變量,然后進入大循環,首先進入溫度轉換函數,使DS18B20開始溫度轉換,然后獲取溫度并將二字節值賦值給a,并將輸入賦值溫度到b,然后所有值都由display(a,b)子函數輸出。3.4顯示功能分析下面是display()函數的具體內容。無效顯示(uinta,ucharb){ uchari,temp,srtemp,dis[4]; 單位dda; dda=abs(a); 數=dda/1000; num4=dda%1000/100; num5=dda%100/10; num6=dda%10; dis[0]=數字; dis[1]=num4; dis[2]=num5; dis[3]=num6; dis[2]+=10;//num5個小數點 if((dis[0]==0)&&(dis[1]==0)) dis[1]=20;//如果百位和十位都為0,則不顯示 if(a<0)//負值后加一個小數點 DIS[3]+=10; 別的 {if(dis[0]!=0)//超過100前加小數點 迪斯[1]=迪斯[1]+10; } 溫度=0xfb; for(i=1;i<4;i++) { P0=0xff; 這=1; 溫度=_croll_(溫度,1); P0=溫度; 這=0; P0=0; 段=1; P0=表[dis[i]]; 段=0; 延遲(3); }} 段=1; P0=0x00; 段=0; 如果(aaa==1&&ccc!=21) bb++; 開關(bbb) { 案例0: 這個[1]=b; 數字1=b; 這[2]=num2; 這[3]=num3; 如果(這[2]==21) 這個[2]++; 別的 這[2]+=10; srtemp=0xfe; 對于(i=1;i<4;i++) { P0=0xff; 偉=1; P0=srtemp;//wein開啟后為低電平亮 wei=0;// srtemp=_croll_(srtemp,1); P0=0x00; 段=1; P0=表[dis[i]]; 段=0; 延遲(1); 段=1; P0=0x00; 段=0; } 休息; 情況1: dis[1]=num1; dis[2]=b; 數字2=b; dis[3]=num3; 如果(dis[2]==21) 迪斯[2]++; 別的 DIS[2]+=10; srtemp=0xfe; for(i=1;i<4;i++) { P0=0xff; 偉=1; P0=srtemp;//wein開啟后為低電平亮 wei=0;// srtemp=_croll_(srtemp,1); P0=0x00; 段=1; P0=表[dis[i]]; 段=0; 延遲(1); 段=1; P0=0x00; 段=0; } aaa=0; 休息; 案例2: dis[1]=num1; dis[2]=num2; dis[3]=b; 數字3=b; 如果(dis[2]==21) 迪斯[2]++; 別的 DIS[2]+=10; srtemp=0xfe; for(i=1;i<4;i++) { P0=0xff; 偉=1; P0=srtemp;//wein開啟后為低電平亮 wei=0;// srtemp=_croll_(srtemp,1); P0=0x00; 段=1; P0=表[dis[i]]; 段=0; 延遲(1); 段=1; P0=0x00; 段=0; } aaa=0; 休息; 案例3: dis[1]=num1; dis[2]=num2; dis[3]=num3; 如果(dis[2]==21) 迪斯[2]++; 別的 DIS[2]+=10; srtemp=0xfe; for(i=1;i<4;i++) { P0=0xff; 偉=1; P0=srtemp;//wein開啟后為低電平亮 wei=0;// srtemp=_croll_(srtemp,1); P0=0x00; 段=1; P0=表[dis[i]]; 段=0; 延遲(1); 段=1; P0=0x00; 段=0; } aaa=0;num=21;break; 默認值:bbb=0; 休息; }}首先要明確a是DS18B20芯片得到的溫度,b是需要輸入的溫度,也就是需要的水溫。這里用到了abs(a)和_croll_,所以頭文件中要寫#include<math.h>和#include<intrins.h>,dda是用來防止a為負數時的后續操作。做得不好。取出dda的千、百、十、個,分別存入Numx、num1、num2、num3。dis[4]用于方便for語句的賦值操作。在這里顯示時需要考慮DS18B20采集的數據中的各種情況。第一:超過100度。二:正常的十度或幾十度。第三:只有幾度不超過十度。第四溫度為負值。 if((dis[0]==0)&&(dis[1]==0)) dis[1]=20;//如果百位和十位都為0,則不顯示上面這句話指的是三種情況。 if(a<0)//負值后加一個小數點 DIS[3]+=10; 別的 {if(dis[0]!=0)//超過100前加小數點 迪斯[1]=迪斯[1]+10; }上面這句話是對第一種和第四種情況的描述。第二種情況是正常使用的情況,直接寫dis[1],dis[2],dis[3]就可以了。ccc的作用是防止程序沒有任何輸入直接確認的bug。發生這種情況時,系統不做任何其他響應,并保持此時的輸入狀態,直到用戶輸入一個數字。ccc的功能將被釋放。這里,鍵盤輸入溫度的數碼管顯示是使用switch(bbb)語句完成的。bbb中有0、1、2、3。這四種情況下,當bbb等于0時,沒有輸入,當bbb等于1時,就是輸入所需溫度的十位數。當bbb等于2時,輸入所需溫度的一位數。當bbb等于3時,輸入所需溫度的小數位。沒有超過100度和低于0度的設計。基本上給定的數字到這里就完成了,數碼管顯示的數字是通過數字的值來設置的,這個在第三章已經講過了。這里需要注意的是,aaa每次都必須清零,因為當aaa為1時,輸入子函數ucharscanff()的返回值變成了導致數碼管顯示下劃線的值。aaa為0時,鍵盤可以通過ucharscanff()顯示0-9的任意值給數碼管。這是為了防止在上一個數字輸入完成后,在下一個數字沒有輸入的情況下,顯示下一個數字的數碼管默認不顯示下劃線而是上一個確認的數字。為了防止出現這種情況,可以使用aaa的上述操作。3.5中斷加熱子功能分析這是程序:無效timer0()中斷1{ 詮釋一個; TH0=(65536-46000)/256; TL0=(65536-46000)%256; zd++; 如果(zd==6) { zd=0; a=num1*100+num2*10+num3; if(a>=numy&&num1!=21&&num2!=21&&num3!=21) { 賈爾=1; P1=0xfd; 賈爾=0; } 別的 { 賈爾=1; P1=0xff; 賈爾=0; } }}使用定時器T0,定時器設置為每30ms中斷一次,判斷輸入值與采集值之間的大小。如果前者較大,P2^1將變為低電平,使MOC3041啟動并引起發熱。如果后者大于前者,P2^2仍然很高,不會引起發熱。這樣就達到了溫度控制的目的。第四章功能介紹及成品圖4.1智能熱水器的功能(1)采用高清數碼管實時顯示水溫,范圍0~102℃。(2)水溫可通過鍵盤輕松設置,并可顯示設置溫度。(3)按設定溫度加熱到相應水溫,并具有保溫功能。首先,單片機顯示采集到的溫度值,等待系統輸入溫度。輸入三個數字后,第一個、第二個和第三個數字分別是所需溫度的十位、個位和小數點后一位。輸入完成后,每30ms將輸入溫度與單片機采集的環境溫度進行比較。如果輸入溫度高于或等于采集的溫度,微控制器將觸發MOC3041開始加熱。如果輸入溫度低于采集的溫度,則不會激活。加熱或停止加熱。4.2成品圖片開發板等待輸入,如圖4.1所示。圖4.1等待輸入的開發板輸入完成后,輸入溫度高于開發板測得的環境溫度。單片機的P1^1接口會出現低電平,所以用第二個發光二極管點亮。這里的第二個發光二極管只模擬加熱,沒有加熱功能。在實際電路板中,只需要將P1^1連接到MOC3041的2號接口即可。溫度輸入完成,加熱判斷如圖4.2所示。圖4.2溫度輸入完成,確定鉆頭加熱狀態當環境溫度高于輸入溫度時加熱停止。實物圖如圖4.3所示圖4.3停止加熱狀態第五章總結與展望本文對采用89C51單片機的數字熱水器設計進行了完整的闡述。本文完成的主要工作有:(1)本文闡述了鍵盤輸入電路的基本原理,如何通過硬件和軟件來消除抖動(2)闡述了數碼管的顯示原理,如何動態顯示數字的方法,說明如何方便快捷地調用數組,使數碼管顯示相應的數字。(3)本文闡述了通過種子中斷函數每30ms完成一次加熱檢測的方法(4)本文詳細闡述了溫度采集芯片的詳細參數和操作方法,與單片機的硬件連接,以及如何控制軟件的設計細節。當然,這種設計也有不足之處。設計完成后,單片機有時會死機,但復位后又恢復正常。希望在以后的研究中能找到解決這個問題的辦法。本文的設計已經完成了開發板上的基本功能,對單片機的未來發展具有很好的參考意義。希望隨著科技的進步,數字家電能夠更加完善,更好地造福人類。參考[1]建清,王春生。從零開始學習單片機技術[M].:國防工業,2008。[2]張斌宏,吳慶平,王林。模擬電子技術[M].:科技大學,2008.25-36[3]林申茂.8051單片機深入研究基礎[M].:中國電力,2007。[4]高濤,盧麗娜,院長。C語言程序設計[M].:交通大學,2007.78-82[5]郭天,白燕,董玲.實用C語言程序設計與51單片機典型實例[M].:中國電力,2001。[6]桓玉龍,寧,盧洪武。AT89C51單片機智能家用電熱水器設計[R].:師范大學傳播學院,2005.[7]郭天祥.10天學51單片機[M].:工程大學。,2007[8]徐本,金,陶。GSM遠程溫度控制論文[D].:工程大學郵電與信息工程學院,2009.[9]胡錦.數字電路與邏輯設計[M].:高等教育,2004年12月。[10]左全生,鮑磊,王貴興,應。電路分析教程[M].:電子工業,2007年7月。[11]吳建學.計算機應用基礎[M].:大學,2007。[12]周圍,小飛,石秋。電路分析基礎[M].:人民郵電,2003年7月。至從論文的選題到資料的收集,從稿件的撰寫到反復修改,這期間我經歷了快樂、喧囂、痛苦和彷徨。寫論文的過程中心情是那么復雜。現在,隨著這篇畢業論文的定稿,復雜的心情也煙消云散了,我什至有了一種成就感。我想感受,非常感謝我的導師。她性格隨和熱情,學習嚴謹認真。在閑聊中,她總能像親密朋友一樣鼓勵你。在論文的寫作和措辭上,她總是以“專業標準”嚴格要求你,從選題、定題、反復修改最終論文。,潤色,導師一直以認真負責的態度給予我深刻細致的指導,幫助我開拓研究思路,細心指導,熱情鼓勵。正是因為導師的無私幫助和熱情的鼓勵,我的畢業論文才能順利完成,我的導師。我非常想感受到我在研究期間幫助了我的同學。正是在這種相互幫助、相互關心的友誼下,我才能理清我的論文寫作思路。向對我的論文提出很多寶貴意見和建議的同學們表示衷心的感謝。附錄總體程序代碼#include<reg52.h>#include<intrins.h>#include<math.h>#defineuchar無符號字符#defineuint無符號整數sbit段=P2^6;位wei=P2^7;位ds=P2^2;sbitjiar=P2^5;ucharnum,num1,num2,num3,numx,num4,num5,num6,aaa,bbb,ccc,zd;整數;uchar碼表[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x00,0x08,0x88};//20,21無效延遲(uchari){uintj;當我-){for(j=0;j<100;j++);}}無效dsstart(){ 無符號整數i; ds=0;我=100;//下拉800us左右,480us以上滿足協議要求而(i>0)i--;ds=1;//產生上升沿,進入等待響應狀態 我=4; 而(i>0)i--;}無效dswait(){ 無符號整數i; 同時(ds);//等待應答信號而(?ds);//檢測到響應脈沖我=4;而(i>0)i--;}bitreadbit()//讀取位{ 無符號整數i; 位b; ds=0; 我++;//延遲8us左右,保持至少1us符合協議要求 ds=1; 我++; 我++;//延時16us左右,滿足協議要求時延時至少15us b=ds;我=8;而(i>0)i--;//延遲64us左右,滿足讀時隙不小于60us的要求返回b;}ucharreadbyte()//讀取一個字節{ 單位b; uchar日期,a; b=0;日期=0; 而(b<8) { a=readbit(); date=(a<<7)|(date>>1);//將readbit()的返回值付給date,然后將date向后移動一位,重復8次,只得到一個字節的數據 b++; } 歸期; }voidwriter(ucharorder)//寫命令{ uintb; uchara; 位位2; b=0; 對于(a=0;a<8;a++) { bit2=訂單&0x01; 訂單>>=1; if(bit2)//寫1 { ds=0; b++,b++; ds=1; for(b=0;b<8;b++); } 否則//0 { ds=0; for(b=0;b<8;b++); ds=1; b++;b++; } }}voidchangetemp()//溫度轉換函數{ dsstart(); dswait(); 延遲(1); writeor(0xcc);//跳過讀取序列號列號的操作 writer(0x44);//開始溫度轉換 延遲(1);}uintgettemp()//獲取溫度{ 浮動tt; 國際溫度; uchargeta,getb; dsstart(); dswait(); 延遲(1); 作家(0xcc); writeor(0xbe);//讀取溫度命令 延遲(2); geta=readbyte();//讀取兩個字節 getb=readbyte(); 溫度=getb; temp<<=8;//左移8位 溫度=溫度|geta; tt=temp*0.0625;//將temp中的數字轉換為實際溫度值 temp=tt*10+(temp>0?0.5:-0.5);//,大十倍,四舍五入 返回(溫度);}無效顯示(uinta,ucharb){ uchari,temp,srtemp,dis[4]; 單位dda; dda=abs(a); 數=dda/1000; num4=dda%1000/100; num5=dda%100/10; num6=dda%10; dis[0]=數字; dis[1]=num4; dis[2]=num5; dis[3]=num6; dis[2]+=10;//num5個小數點 if((dis[0]==0)&&(dis[1]==0)) dis[1]=20;//如果百位和十位都為0,則不顯示 if(a<0)//負值后加一個小數點 DIS[3]+=10; 別的 {if(dis[0]!=0)//超過100前加小數點 迪斯[1]=迪斯[1]+10; } 溫度=0xfb; for(i=1;i<4;i++) { P0=0xff; 偉=1; 溫度=_croll_(溫度,1); P0=溫度; 魏=0; P0=0; 段=1; P0=表[dis[i]]; 段=0; 延遲(3); } 段=1; P0=0x00; 段=0; 如果(aaa==1&&ccc!=21) bb++; 開關(bbb) { 案例0: dis[1]=b; 數字1=b; dis[2]=num2; dis[3]=num3; 如果(dis[2]==21) 迪斯[2]++; 別的 DIS[2]+=10; srtemp=0xfe; for(i=1;i<4;i++) { P0=0xff; 偉=1; P0=srtemp;//wein開啟后為低電平亮

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論