題 目 基于51單片機的智能溫控電扇設計
學生姓名
學 號 院 系 專 業 指導教師
年 月 日
目 錄
1
1 引言 ........................................................... 1
2 方案設計 ....................................................... 2
2.1 系統整體設計 ................................................ 2
2.2 方案論證 .................................................... 2
2.2.1 溫度傳感器的選擇 ....................................... 2
2.2.2 紅外探測的選擇 ......................................... 3
2.2.3 控制核心的選擇 ......................................... 3
2.2.4 顯示器件的選擇 ......................................... 3
2.2.5 調速方式的選擇 ......................................... 4
2.2.6 驅動方式選擇 ........................................... 4
3 硬件設計 ....................................................... 4
3.1系統各器件簡介 .............................................. 5
3.1.1 單線程數字溫度傳感器DS18B20 ........................... 5
3.1.2 AT89S51單片機簡介 ..................................... 5
3.1.3 橋式驅動電路L298N簡介 ................................. 6
3.1.4 LCD1602簡介 ........................................... 7
3.1.5對射式光電開關簡介 ..................................... 7
3.2 各部分電路設計 .............................................. 8
3.2.1 開關復位與晶振電路 ..................................... 8
3.2.2 獨立控制鍵盤電路 ....................................... 8
3.2.3 LCD顯示電路 ........................................... 9
3.2.4 紅外探測電路 ........................................... 9 2
3.2.5 溫度采集電路 .......................................... 103.2.6 風扇驅動電路
.......................................... 10
4 軟件設計 ...................................................... 11
4.1 主程序流程圖 ............................................... 11
4.2 液晶顯示子程序 ............................................. 13
4.3 DS18B20溫度傳感器子程序 ................................... 14
4.3.1 溫度讀取程序 .......................................... 14
4.3.2 溫度處理程序 .......................................... 174.4 鍵盤掃描子程序
............................................. 18
4.5 溫度比較處理子程序 ......................................... 19
4.6 電機控制程序(包含紅外探測) ............................... 21
4.7 軟件設計中的問題與分析 ..................................... 23
4.7.1 LCD顯示程序的問題 .................................... 23
4.7.2 DS18B20的顯示程序問題 ................................ 23
5 硬件調試 ...................................................... 235.1 按鍵電路的調試
............................................. 24
5.2 溫度傳感器電路的調試 ....................................... 24
5.3 電機電路的調試 ............................................. 24
5.4 紅外感應電路的調試 ......................................... 24
5.5 硬件調試遇到的問題 ......................................... 24
6 結論 .......................................................... 24
參考文獻: ...................................................... 26 3
4
基于51單片機的智能溫控電扇設計摘要:風扇是人們日常生活中必不可缺的工具,尤其是在夏天,作為一種使用頻率很高的電器,備受人們喜愛。本文將以AT89S51為主控芯片,輔以DS18B20溫度傳感器,結合紅外探測裝置,來實現一種智能溫控電扇的設計。此風扇通過液晶顯示器來顯示溫度和風速,配備2個溫度設定按鍵,由DS18B20讀取外界溫度,紅外探頭探測是否有人,通過設定的溫度配合程序來調節風速,最后通過L298N來驅動電機。經過調試,風扇可以按照溫度智能變速,無人自動關閉,實現了智能溫
控的目標。
關鍵詞:DS18B20;AT89S51;紅外探頭;液晶顯示器1602;L298N
1 引言
電扇是人們日常生活中常用的降溫工具,從開始的吊扇到現在的USB風扇,無處不見電扇的蹤跡。雖然如今空調已經走進千家萬戶,但是電扇的低位還是無可取代,作為一種節能環保,并且廉價簡單的降溫工具,電扇還在很多人家發揮著自己獨特的作用。順應時代潮流,各種多功能的風扇逐漸在取代傳統風扇。單片機作為一種智能化程度高,控制精度高,操作簡單,廉價易得,抗干擾能力強等特點,越來越多的應用于智能化產品之中。
市場上智能風扇產品相繼問世,制作方法也多種多樣,功能也逐漸完善,普遍都具有了手動變速和定時關閉等功能,相對而言,具備人性化,智能化的風扇還是很少,使用也并不廣泛,而且在電子工藝高度發展的今天,智能化的步伐也越來越快,尤其是中國這個高速發展的國家,電扇的智能化也該向前邁進一個步伐。在中國市場上風扇還是有一定的市場份額的,幾乎每個家庭都有風扇,具備價格便宜,擺放輕便,體積靈巧等特點,使得風扇在中小城市以及鄉村將來一段時間內仍然會占有市場的大部分份額,為提高風扇的市場競爭力,使之在技術含量上有所提高,滿足智能化的要求,智能風扇很具競爭力。大學四年即將結束,為了檢驗自己的學習情況,我決定使用之前所學習到的硬件只是結合相關的軟件基礎來制作一個基于單片機的智能溫控風扇。
基于對人性化與智能化相結合的考慮,同時基于對價格的考慮,本設計決定制作一個基于51單片機的智能溫控風扇,該風扇具有隨溫度自動調節風速的功能,并且在無人時可以自動關閉,而且可以根據每個人的不同情況來設定基準溫度,從而實現了人性化與智能化的雙重目標。
1
2 方案設計
2.1 系統整體設計本設計的整體思路是:利用溫度傳感器DS18B20來檢測環境溫度,并直
接輸出數字溫度給51單片機進行處理,并將實時溫度、設置溫度、風速顯示在液晶1602上。設置溫度輔以2個可調按鍵,一個提高設置溫度,一個降低設置溫度,設置溫度只能是整數型式,檢測到的環境溫度可以精確到小數點后一位。本系統還配備一個紅外探頭,探測出風范圍內是否有人,若無人則自動關閉風扇。同時采用單片機模擬PWM脈寬調制方式來改變直流電扇電機的轉速。系統整體結構框圖1所示:
圖1 整體系統結構圖
2.2 方案論證本設計要求實現在溫度變化的情況下風扇直流電機轉速隨之改變,并且
能夠在無人的情況和溫度低于設定溫度的時候自行停止,需要比較高的溫度分辨率和穩定的探測工具以及可靠的電機控制部件。
2.2.1 溫度傳感器的選擇
在本設計中,溫度傳感器的方案有以下兩種:
方案一:采用熱敏電阻。熱敏電阻的特性就是阻值可以隨溫度的變化而變化,采用熱敏電阻作為檢測溫度的核心部件,然后通過放大電路放大信號,經過AD0809數模轉換講放大的微弱電壓變化信號轉化了數字信號輸入單片機處理。方案二:單總線數字溫度計DS18B20。作為一款優秀的數字集成溫度
傳感器,DS18B20可以直接檢測并輸出數字信號給單片機進行處理。
對于方案一,如若采用熱敏電阻作為溫度檢測元件,則價格方面比較便宜,元件易得,但是熱敏電阻的缺點顯而易見,對于溫度細微變化反應不敏感,而且在后續的放大和轉換電路中還會造成失真和誤差,
[圖片]
2并且熱敏電阻的變化曲線非線性,每個熱敏電阻都不同,還需要單獨測試描繪出曲線,雖然可以通過軟件來實現
誤差的修正,但是這會使得電路的復雜性增加,并且在人體所在實際環境中難以檢測到小的溫度變化。所以這個方案在本設計中難以勝任。
對于方案二,DS18B20測量范圍從-55℃到+125℃,增量值為0.5℃,人體所處的環境溫度包括其中,分辨率較高,所獲取的溫度誤差小,并且對溫度變化反應靈敏。DS18B20最具優勢的是其溫度值在器件內部直接轉化成數字信號輸出,簡化了系統設計,又由于該溫度傳感器采用了單總線技術,使得其接口與單片機接口變得非常簡潔,抗干擾能力也得到了提高,所以本系統采用這個方案。
2.2.2 紅外探測的選擇
方案一:熱釋電紅外探測模塊。作為一款應用很廣的紅外探測模塊,具有靈敏度高,可靠性高,低電壓工作模式等特點,被廣泛的應用與各種場合中。但是與本設計卻有一個沖突,該模塊使用環境應盡量避免流動的風,流動的風也會對感應器造成干擾。所以方案一不適用。
方案二:對射式光電開關。對射式光電開關是一款有紅外線發射管跟紅外線接收管配對使用的光電開關。對射式光電開關在電路中起到了通過光來傳播電路,當有物體阻擋著紅外線發射管跟接受管時,電路會停止工作。使用這個特性,我們就能判斷是否有人,外界干擾就沒有了,非常適合這個系統,所以就采用這種方案。2.2.3 控制核心的選擇
本設計采用AT89S51單片機作為控制核心,通過軟件編程的方法進行溫度的實時檢測與判斷,并在I/O口上輸出控制信號,控制電機工作。AT89S51具有較大的存儲空間,工作電壓低,性能高,片內含4K字節的只讀程序存儲器ROM和128字節的隨即數據存儲器RAM,兼容標準MCS-51指令系統,價格便宜,與本系統的設計相符合。
2.2.4 顯示器件的選擇
方案一:LED共陰極數碼顯示管。
方案二:LCD液晶顯示屏1602。對于方案一,成本相對低廉,功耗也低,在黑暗空間也可以看的清楚,可
視距離較遠,同時顯示溫度的程序也相對而言簡單,所以這種顯示方式也得到了廣泛應用。但是它采用的顯示方式是動態掃描,各個LED逐個點亮,會產生閃爍,在這個溫度實時變化的環境中閃爍可能太快,數據可能不能很好的展示出來,故此方案不采用。
對于方案二,液晶顯示屏顯示字符清晰,自帶背光,還能顯示符號,并且不會不斷閃爍,顯示性能一流,并且考慮到此設計不只是要顯示溫度,還要顯示電機和紅外的狀態,所以從設計完善的角度來考慮,選擇此方案更有優勢。
3
2.2.5 調速方式的選擇方案一:采用數模轉化芯片DAC
0832來控制,有單片機根據當前環境溫度輸出數值到DAC0832中,再由DAC0832產生相應的模擬信號控制晶閘管的導通腳,從而采用無級調速電路實現電扇電機轉速的調節。方案二:采用單片機軟件模擬PWM調速的方法。PWM是一種按照一定的規律改變脈沖序列的脈沖寬度,以調節輸出量和波形的一種調節方式,在PWM驅動控制的調節系統中,最常用的是矩形波PWM信號,在控制時調節PWM波的占空比。占空比是指高電平在一個周期時間內的百分比。在控制電機的轉速時,占空比越大,轉速就越快,若全為高電平時占空比為100%,此時轉速達到最大。用單片機的I/O口輸出PWM信號時,有如下三種方
法:
(1)利用軟件延時。當高電平延時時間到時,對I/O口電平取反,使其變成低電平,再延時一定時間,反之在低電平延時到時,對I/O口電平取反,如此循環即可得到PWM信號。本設計就是采用了這種方法。
(2)利用定時器。控制方法與(1)相同,只是在該方法中利用單片機的定時器來進行高低電平的轉變,而不是利用軟件的延時。應用此方法時編程相對復雜,故不予以采用。
(3)利用單片機自帶的PWM控制器。STC系列單片機自帶PWM控制器,但本系統使用的AT89系列單片機沒有此功能,所以不能使用。
對于方案一,該方案能實現對直流電機的無級調速,速度變化靈敏,但是D/A轉換芯片價格較高,性價比不高,不采用。
對于方案二,相對于其他方案來說,采用軟件模擬PWM實現調速的過程,具有個高的性價比與靈活性,充分的發揮了單片機自身的性能,對本系統的實現又提供了一條有效的途徑。所以綜合考慮還是選擇方案二的第一種。
2.2.6 驅動方式選擇
方案一:達林頓反向驅動器ULN2803。
方案二:電橋驅動電路L298N。對于方案一,作為一款反向驅動
器,ULN2803應用廣泛,驅動效果也很好,與TTL信號兼容性很好,但是在后續的硬件電路中表現不佳,風扇轉速改變不明顯,而且在最高檔出現斷檔的情況,風扇不轉,在修改硬件電路,修改程序后依舊效果不佳,驅動力明顯不足,故方案一中途停用。
對于方案二,由于之前已經有使用過,對L298N這個橋式驅動模塊的應用上手快速,驅動能力也比ULN2803好很多,驅動風扇5檔變速的實際效果明顯,故采用方案二。
3 硬件設計系統主要器件包括溫度傳感器DS18B20、AT89S51單片機、液晶顯示屏LCD1602、橋式驅動模塊L298N、
4
對射式光電開關開關和風扇。輔助元件包括電容電阻、晶振、電源、按鍵、變壓器等。
3.1系統各器件簡介
3.1.1 單線程數字溫度傳感器DS18B20此溫度傳感器是美國DALLAS半導體公司繼DS1820之后推出的一種改進型智能溫度傳感器DS18B20。作為新一帶數字檢測元件,DS1820是世界上第一片支持 "一線總線"接口的溫度傳感器,在其內部使用了在板(ON-BOARD)專利技術。全部傳感元件及轉換電路集成在形如一只三極管的集成電路內。一線總線獨特而且經濟
的特點,使用戶可輕松地組建傳感器網絡,為測量系統的構建引入全新概念。現在,新一代的DS18B20體積更小、更經濟、更靈活。使你可以充分發揮“一線總線”的優點。DS18B20可以程序設定9~12位的分辨率,精度為±0.5°C。可選更小的封裝方式,更寬的電壓適用范圍。分辨率設定,及用戶設定的報警溫度存儲在EEPROM中,掉電后依然保存。測溫范圍為-55~125℃,最大分辨率可達0.0625℃。DS18B20減少了外部的硬件電路,直接輸出數字信號,具有低成本和易使用的特點。圖2 溫度傳感器DS18B20
3.1.2 AT89S51單片機簡介AT89S51是一個低功耗,高性能COMS 8位單片機,片內含4Kbytes
ISP的反復可讀寫1000次的Flash只讀程序儲存器,器件采用ATMEL公司的高密度、非易失性存儲技術制造,兼容標準MCS-51指令系統及80C51引腳結構,芯片內集成了8位中央處理器和IPS Flash存儲單元,AT89S51在眾多嵌入式系統中得到了廣泛的應用。
AT89S51具有完整的輸入輸出和控制端口、以及內部程序存儲空間。與我們通常意義上的微機原理類似,可以通過外接A/D,D/A轉換電路及運放芯片實現對傳感器傳送信息的采集,且能夠提供以點陣或LCD液晶及外接按鍵實現人機交互,能對內部眾多I/O端口連接步進電機對外圍設備進行精確操控,具有強大的工控能力。
AT89S51系列單片機編寫程序簡單。其語法結構與我們常用的計算機C語言基本相同,不同之處在于增加了控制具體引腳工作的語句和命令,相對于計算機C語言,單片機C語言更簡練和明確,可以控制每個引腳的輸入輸出狀態。其主要語句集中在例如:“ifelse”、“while”、“for”等循環與判斷語句上,相比計算機C語言更簡單。
使用AT89S51系列單片機編程,可以在沒有實物單片機的情況下在普通電腦上進行程序編寫甚至是調 5試工作。一般工作中使用Keil公司開發的51單片機編程軟件進行編程,它采用目前流行的開發環境,集編輯,
編譯和仿真于一體。在該軟件上用戶可以編寫匯編語言或C語言源程序,并利用該軟件生成單片機能運行的程序。AT89S51價格便宜,適合對大批量的計量儀器進行規模化改造,其單片售價不超過5元。
[圖片]
圖3 AT89S51引腳圖 DIP封裝
3.1.3 橋式驅動電路L298N簡介
本系統要用單片機控制風扇直流電機,需要加驅動電路,為直流電機提供足夠大的驅動電流,并能在模擬PWM波的情況下實現風扇轉速的改變。在本系統驅動電路中,選用橋式驅動電路L298N來驅動風扇直流電機。L298N在使用時接口簡單,操作方便,可為電機提供穩定的驅動電流,可以同時驅動兩臺直流電機,可以在模擬PWM波的情況下很好的輸出信號,實現風扇轉速的平滑改變。L298N是專用驅動集成電路,屬于H橋集成電路,與L293D的差別是其輸出電流增大,功率增強。其輸出電
流為2A,最高電流4A,最高工作電壓50V,可以驅動感性負載,如大功率直流電機,(二相、三相、四相)步進電機,伺服電機,電磁閥等,特別是其輸入端可以與單片機直接相聯,從而很方便地受單片機控制。當驅動直流電機時,可以直接控制兩路電機,并可以實現電機正轉與反轉,實現此功能只需改變輸入端的邏輯電平。
模塊接口說明:
+5V:芯片電壓+5V。
VCC:電機電壓,最大可接50V。
GND:共地接法。
EN1、EN2:高電平有效,EN1、EN2分別為 IN1和IN2、IN3和IN4的使能端。IN1~IN4:輸入端,輸入端電平和輸出端電平是對應的。
[圖片]
圖4 L298N模塊
6
3.1.4 LCD1602簡介字符型液晶顯示模塊是一種專門用于顯示字母、數字、符號等點陣式
LCD,目前常用16*1,16*2,20*2和40*2行等的模塊。一般1602字符型液晶顯示器實物如圖:
[圖片]
圖5 LCD1602
LCD1602主要技術參數:
顯示容量:16×2個字符
芯片工作電壓:4.5—5.5V
工作電流:2.0mA(5.0V)
模塊最佳工作電壓:5.0V
字符尺寸:2.95×4.35(W×H)mm
第1腳:VSS為地電源。
第2腳:VDD接5V正電源。
第3腳:VL為液晶顯示器對比度調整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產生“鬼影”,使用時可以通過一個10K的電位器調整對比度。
第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電
平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數據。
第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。
第7~14腳:D0~D7為8位雙向數據線。
第15腳:背光源正極。
第16腳:背光源負極。
3.1.5對射式光電開關簡介
[圖片]
圖6 對射式光電開關
光電開關E18的技術參數:
7
1、輸出電流 DC/SCR/繼電器 Control output:100mA/5V供電
2、消耗電流DC<25mA
3、響應時間 <2ms
4、指向角:≤15°,有效距離3-50CM可調
5、檢測物體:透明或不透明體
6、工作環境溫度:-25℃~+55℃
7、標準檢測物體:太陽光10000LX以下 白熾燈3000LX以下
8、外殼材料:塑料
電氣特性:
U:5VDC
I:100mA
Sn:3-50CM
3.2 各部分電路設計
3.2.1 開關復位與晶振電路
單片機系統中,有兩個非常重要的電路,一個是開關復位電路,用來對單片機本身和其外部擴展I/O接口電路進行復位,還有一個是晶振電路,用于產生諧振,使單片機得以工作。電路圖如圖7
[圖片]
所示:
圖7 晶振電路與復位電路
單片機的XTAL1和XTAL2用來外界石英晶體和微調電容,連接單片機內OSC的定時反饋電路。如圖所示,當按下按鍵開關是,系統復位一次。其中電容C1、C2為20pF,C3為10uF,電阻R1為10k,晶振為12MHz。
3.2.2 獨立控制鍵盤電路
本設計還有兩個獨立按鍵,分別連接單片機的P3.2口和P3.3口,如圖8所示:
8
圖8 按鍵電路
獨立按鍵S1和S2一端與單片機相連,另一端接地,當按下時,P3口讀取低電平有效。系統上電進入工作后,掃描按鍵子程序,此時可以設定溫度。其中S1為加按鍵,S2為減按鍵,每按下一次后,都會使對應的預設值加一或者減一。
3.2.3 LCD顯示電路
本設計采用的是LCD1602A作為顯示模塊,它與單片機的連接如圖9所示。其中第一行顯示溫度與紅外探測結果,溫度顯示到小數點后2位。第二行顯示設定溫度與風扇的風力等級。
[圖片]
圖9 LCD連接電路
3.2.4 紅外探測電路紅外光電開關一共有三個接口,一個接+5V,一個接地,還有一端與單片機相連,輸出高電平或者低電平信號,
在電路中直接用按鍵開關代替了,就是按鍵電路中的開關S3。
[圖片]
9
3.2.5 溫度采集電路DS18B20數字溫度傳感器通過其內部計數時鐘周期來的作用,實現了特有的溫度測量功能。低溫系數振蕩器輸出的時鐘信號通過由高溫度系數振蕩器產生的門周期而被計數,計數器
預先置有與-55℃相對應的一個基權值。如果計數器計數到0時,高溫度系數振蕩周期還未結束,則表示測量的溫度值高于-55℃,被預置在-55℃的溫度寄存器中的值就增加1℃,然后這個過程不斷重復,直到高溫度系數振蕩周期結束為止。此時溫度寄存器中的值即為被測溫度值,這個值以16位二進制形式存放在存儲器中,通過主機發送存儲器讀命令可讀出此溫度值,讀取時低位在前,高位在后,依次進行。由于溫度振蕩器的拋物線特性的影響,其內用斜率累加器進行補償。DS18B20由于直接可以輸出數字信號,所以可以直接輸出給單片機,但是需要在輸出口上接一個上拉電阻來確保工作,連接圖如圖10所示:
[圖片]
圖10 DS18B20連接電路
3.2.6 風扇驅動電路
本設計采用單片機模擬PWM波的方式通過I/O口輸出TTL信號,再通過一個電機驅動模塊L298N來驅動12V直流無刷電機工作,從而實現電扇轉速的調節。紅外探測控制電機開關,鍵盤改變設置的溫度,然后和預設的溫度進行比較,通過軟件判斷后由單片機的P3.4口輸出脈沖信號,經由L298N驅動風
扇直流電機電路,實現電機的啟動和轉速的改變。當環境溫度改變時,電機的轉速會按照設定的程序相對進行改變,溫度升高轉速變快,溫度降低,轉速變慢,溫度過低時自動停止,無人狀態下也會自動停止。當有人出現后,并且溫度高于預設溫度,電機重新開始工作。如圖12所示:
[圖片]
圖11 L298N驅動電路
10
圖12 直流電機連接電路
4 軟件設計
軟件編寫有C語言和匯編語言兩種,這兩種語言我都有所了解,兩種語言各有特點。
C語言具有編寫簡單,容易上手的特點,而且看起來條理清晰,便于修改,能夠快速準確的找到錯誤并進行改正。相對于匯編語言,作為一種低級的機器語言,讀程序相對繁瑣,但程序寫好后意思明了,效率也要高于C語言編寫的程序,具有很好的開發功能。
結合自身實際,我還是選擇了C語言,容易上手,可以更好的調試與編譯程序。
4.1 主程序流程圖
[圖片]
圖13 主程序流程圖 主程序如下:
11
[圖片]
void main(void) {
uint ltemp; dianji=0;
int1=0; int2=0; init();
read_temp(); // delay(1000);
while(1)
{ delay(2);
ltemp=read_temp();write_com(0x80+2);
write_data(0x30+ltemp%10000/1000); write_data(0x30+ltemp%1000/100); write_data(0x2e); write_data(0x30+ltemp%100/10); write_data(0x30+ltemp%10); write_data(0xdf);
keyscan();
delay(2);
write_com(0x80+0x40+4);
write_data(0x30+set%100/10); write_data(0x30+set%10); write_data(0xdf);
deal(ltemp/100);
dianjik();
write_com(0x80+0x40+15);
write_data(0x30+h);
write_com(0x80+15);
write_data(0x30+r); }
//初始化 //初始化溫度 //初始化電機
//初始化液晶顯示屏
讀取測溫子程序,讀取溫度數值 //延時 //循環開始
//溫度賦值
//將溫度顯示到液晶屏
//讀取鍵盤子程序
//將設定溫度顯示到液晶屏
//運行溫度判斷子程序
//運行電機控制子程序 //將風扇轉速顯示到液晶屏
//將紅外探測結果顯示到液晶屏12
}
4.2 液晶顯示子程序
液晶LCD1602的子程序要按照說明上的時序圖來完成。要想讓LCD顯示的話,首先要對LCD進行初始化。在完成LCD的初始化后,還需要定義字符的位置,并且定義寫數據的函數。其第一行的地址是40H~4FH,第二行的地址是從80H~8FH,然后才能根據要顯示字符的ASCⅡ碼對該字
符進行顯示。
其流程圖14所示:
[圖片]
圖14 液晶顯示程序流程圖
子程序如下:
//*******初始化函數***************
void init(void)
{ uint i;
E=0;
RW=0;
RS=0;
delay(10); //延時10ms
write_com(0x01); //清屏
delay(5);
write_com(0x38); //設顯示模式
delay(5);
write_com(0x0c); //開顯示不顯光標 光標不閃
delay(5);
write_com(0x06); //地址自動加一 光標自動加一
delay(5);
write_com(0x80);
for(i=0;i<16;i++)
write_data(table2[i]);
write_com(0x80+0x40);
for(i=0;i<16;i++)
write_data(table1[i]);
13
}
//********寫指令函數************
void write_com(uchar command)
{
}
//********寫數據函數*************
void write_data(uchar dat)
{
}RS=1; P0=dat; delay(5); E=1; //允許 //數據 RS=0; RW=0; P0=command; delay(5); E=1; //允許 //指令 //寫入 delay(10); E=0; delay(10); E=0;
4.3 DS18B20溫度傳感器子程序
4.3.1 溫度讀取程序
DS18B20溫度讀取程序負責把DS18B20測得的外界數據經過AD轉化為數字,然后將數據存入寄存器中,供溫度處理程序進行下一步操作。
其流程圖15所示:
14圖15 DS18B20程序流程圖 子
程序如下:
//**********延時函數**************
void delayus(uint z)
{
}
//**********將DS18B20傳感器初始化,讀取應答信號*************
uchar clean_ds18b20()
{
uchar k; //儲存DS18B20是否存在的標志,k=0,表示存在;k=1,表 uchar i; for(i=0;i<z;i++); 示不存在
dq=1; //先將數據線拉高 //延時 //再將數據線從高拉低,要求保持480~960us //略微延時,以向DS18B20發出一持續480~960us的低電delayus(5); dq=0; delayus(30);
平復位脈沖
脈沖)
dq=1; //釋放數據線(將數據線拉高) //延時(釋放總線后需等待15~60us讓DS18B20輸出存在delayus(3); k=dq; //讓單片機檢測是否輸出了存在脈沖(dq=0表示存在) //延時足夠長時間,等待存在脈沖輸出完畢
[圖片]
15 delayus(25);
}
return k; //返回檢測成功標志//**********從DS18B20讀取一
個字節數據*************
uchar read_ds18b20_date()
{
for(i=0;i<8;i++) { dq=1;
_nop_(); //先將數據線拉高 //等待一個機器周期 //讀8位 uchar value,i; //儲存讀出的一個字節數據
時序
作準備} } dq=0; //單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀value>>=1; dq=1; //將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平 if(dq) //如
果讀到的數據是1,則將1存入value value|=0x80; delayus(6); if(!dq) //如果讀到的數據是0,則將0存入value value|=0x00; delayus(6); return value; //返回讀出的十進制數據
//***********向DS18B20寫入一個字節數據*************
void write_ds18b20_date(uchar date)
{
uchar num; for(num=0;num<8;num++) { dq=1; //先將數據線拉高 16_nop_(); //等待一個機器周期 dq=0; //將數據線從高拉低時
即啟動寫時序 //利用與運算取出要寫的某位二進制數據,并將其送到數據dq=date&0x01;
線上等待DS18B20采樣
}
4.3.2 溫度處理程序
溫度處理程序將上一把操作中讀取的溫度值進行轉換,將二進制數轉化為十進制數,然后輸出數字,直接交給顯示程序顯示。
其流程圖16所示:圖16 溫度處理子程序流程圖 } date>>=1; delayus(4); dq=1; //4us //釋放數據線 delayus(4); //稍作延時,給硬件一點反應時間 其子
程序如下:
//**************做好讀溫度的準備**************
uint read_temp()
{
[圖片]17
uint g,d,m;
uint c;
m=1;
m=clean_ds18b20(); //初始化完成m=0
while(m); //等待初始化完成
write_ds18b20_date(0xcc); //跳過rom
write_ds18b20_date(0x44); //啟動溫度測量
delayus(100);
m=clean_ds18b20();
while(m); //等待轉化完成
write_ds18b20_date(0xcc); //跳過rom
write_ds18b20_date(0xbe); //讀數據命令
d=read_ds18b20_date(); //讀低8位數據
g=read_ds18b20_date(); //讀高3位數據
g<<=4;
g=g+(d>>4); //整數部分
g=g*100;
d=(d&0x0f)*0.0625*100;
c=g+d;
return c;
}
4.4 鍵盤掃描子程序
本設計配備兩個輸入按鍵,分別可以對設定溫度進行加減,此子程序用來檢測按鍵輸入。流程圖17所示:
圖17 鍵盤掃描流程圖
[圖片]
18
子程序如下:
//****************鍵盤輸入********************
void keyscan(void)
{
} if(key1==0) { } if(key2==0) //延時判斷key2是否按下 //判斷key2是否按下 //延時判斷key1是否按下 //判斷key1是否按下 delay(10); if(key1==0) { } set++; //設定溫度加1 if(key1==100) set=18; while(!key1); { } delay(10); if(key2==0) { } set--; if(set==0) set=18; //設定溫度減1 while(!key2);
4.5 溫度比較處理子程序溫控風扇設定5個檔位,根據溫度
的變化來變化風扇的轉速。輸出的型式采用高地電平的交替變換,檔位越高,輸出高電平的次數越多,相應的輸出低點平的次數變少,反之,檔位越低,輸出的高電平次數越少,相應的輸出的高電平的次數變多。低于設定溫度時,風扇不轉,大于最大擋位時滿負荷運轉。
流程如圖18所示:
19
圖18 溫度比較處理流程圖
子程序如下:
//*************溫度處理函數****************void deal(uint temp) //溫
度處理
{
if(temp<=set)
{ //溫度低于設置值
h=0;
l=5;
}
else if((temp>set)&&(temp<=(set+1))) //溫度低于設定值+1
{
h=1;
l=4;
}
else if((temp>(set+1))&&(temp<=(set+3))) //溫度高于設定值+1,小于設定值+3
[圖片]20
} { } else if((temp>(set+3))&&(temp<=(set+5))) { } else if((temp>(set+5))&&(temp<=(set+7))) { } else if(temp>(set+7)) { h=5; l=0; } //溫度高于設定值+7 h=4; l=1; //溫度值高于設定值+5,小于設定值+7 h=3; l=2; //溫度高于設定值+3,小于設定值+5 h=2; l=3;
4.6 電機控制程序(包含紅外探測)本設計最終驅動電機的子程序,包含了紅外檢測。首先進行紅外檢測判斷,若沒有人,電機不轉,若有人,承接上函數設定的檔位,模擬PWM波輸
出,一次輸出5個電平,1檔就輸出一個高電平,四個低電平,2檔輸出兩個高電平,三個低電平,依次類推。
流程圖如圖
[圖片]
圖19 紅外探測電機輸出流程圖
21
子程序如下:
//*************電機模擬PWM控制程序*********************
void dianjik()
{
uchar q;
{
for(q=0;q<l&red==0;q++)
{
dianji=0;
int1=0;
int2=0;
r=1;
delay(100); }
for(q=0;q<h&&red==0;q++)
{
dianji=1;
int1=1;
int2=0;
r=1;
delay(100);
}
for(q=0;q<l&red==1;q++)
{
dianji=0;
int1=0;
int2=0;
r=0;delay(10);
}
for(q=0;q<h&&red==1;q++)
{
dianji=1;
int1=0;
int2=0;
r=0;
//紅外感應有人,輸出設定的低電平次數 //紅外感應有人,輸出設定的高電平次數//紅外感應沒人,不輸出 //紅外感應沒人,不輸出 22
}
} } delay(10);
4.7 軟件設計中的問題與分析
4.7.1 LCD顯示程序的問題
由于LCD要顯示的數據有四個,溫度、檔位、紅外探測、設定溫度,所以如何合理的安排輸出順序很重要,合理的輸出順序才能對應外部正確的表現。每個數據在輸出后都要有一定的延時,這樣才能清楚的顯示在LCD屏幕上。由于本程序是基于溫度的,所以第一個輸出的就是溫度值;然后本程序要執行的是溫度的比較,所以第二個輸出的必然是設定溫度,設定溫度還要同時讀取鍵盤程序,實時跟隨鍵盤輸入的改變而改變;第三個輸出的就是比較溫度后的設定風速了,顯示的風速就是檔位數;最后輸出的就是紅外探測的結果,以0和1來表示,1為有人,處于工作狀態,0為無人,處于待機狀態。剛開始調試程序的時候,數值沒在LCD上顯示,后來發現是主函數忘記了調用子函數,使得數據沒有輸入,后來經過修改和調整,終于在LCD上正常顯示出來了。合理的程序使得程序顯示狀態井然有序。
4.7.2 DS18B20的顯示程序問題在本設計中,DS18B20的顯示是最核心的數據,所有其他數據都與之相對應改變,電機的轉速也與之相關,但是在程序調試過程中,發現了一個問題,每次給單片機上電之后,總有那么不到一秒鐘的時間,溫度顯示的值是85℃,不斷電的情況下復位沒有出現這種情況,只有每次啟動的時候出現。
當顯示85后,其他的數據也隨之變為對應值,風扇也有一個短暫的轉動,這對于這個設計來說無疑是一個很致命的缺陷。開始查找原因,從DS18B20的數據手冊中發現,每次上電后,DS18B20的暫存器中存儲的數據就是85,在讀取數據后,內部的AD要使用750ms的時間來進行數據的轉換然后重新寫入新的數據,所以在這段時間中,顯示的數值就是85了,看來這是硬件上不可避免的過程,但是硬件上不能改變的話,我可以使用軟件的方法來進行變動,我最后采取的方法是在循環程序開始之前,先讀取一次DS18B20的數值,然后給與一個1s的延時,使得AD轉換完成,然后在開始循環,這樣,這個問題終于得以解決了。
5 硬件調試
硬件電路的調試相對來說比較簡單。調試的功能包括按鍵電路,DS18B20,電機電路和紅外傳感電路。 23
5.1 按鍵電路的調試
按鍵電路實現的功能是在按鍵按下后能執行設定溫度的改變,這項采用實物調試,按鍵按下之后,溫度隨之改變。
5.2 溫度傳感器電路的調試
溫度傳感器DS18B20的調試在實物上進行,當用手指去加熱溫度傳感器DS18B20的時候,LCD示數開始隨溫度的上升而改變,變化明顯而且刷新頻率適中,可以清晰的看到所顯示的溫度。
5.3 電機電路的調試
電機電路進行調試,不斷的將設定溫度降低,觀察電機轉速的變化。電機隨設定溫度與實際溫度差值的改變而改變,轉速變化較為平滑,達到了預期的效果。
5.4 紅外感應電路的調試
紅外感應電路直接測試,在前方無人時,系統處于待機狀態,電機不轉動。當前方有人時,電機開始轉動(在溫度高于預設溫度的時候)。
5.5 硬件調試遇到的問題本次設計中遇到的最困難的問題就是出在了電機的驅動上,剛開始的設計使用的達林頓ULN2803反向驅動器來驅動電機,可是在軟件無誤,硬件
連接無誤的情況下,電機轉動表現出來的是變速效果不明顯,最高檔時停轉現象的發生。再不斷的修改軟件和硬件電路無果的情況下,放棄了這個驅動,改用橋式驅動電路L298N,所有的問題迎刃而解,反向驅動的驅動力不連續,而且驅動力在小電流的輸入輸出時不足,使得電機驅動產生了非常不理想的效果。
6 結論
此次的設計遇到的每個問題對我來說都是一個很大的挑戰,在老師的幫助和自己的探索中,我完成了“基于51單片機的智能溫控電扇設計”,設計了硬件電路,獨立完成了軟件編寫。在設計中,實現了預期的功能,成
功設計出了LCD顯示模塊、DS18B20測溫模塊、溫控變速模塊,紅外探測模塊,以及進行了系統的仿真,從實踐中鞏固了所學的知識,并且在探索中學習到了新的知識。
通過這次設計,我又對單片機的知識有了一定的拓展,對處理問題的能力有了一定的提高,這次設計中的電機驅動就是一個很好的挑戰,雖然一開始走了彎路,沒有能夠很好的處理好這個變速的問題,但是 24
經過一番的反復實踐,終于獲得了一種最好的電路,很好的完成了這個設計。
這次的設計對我而言不僅僅是一個畢業設計,更是對我大學四年學習的一個檢驗,給了我一次實踐的機會,運用自己的所學來完成這個設計。從設計中,我學習到了很多東西,提高了自己獨立學習和思考能力,不管對于硬件電路還是軟件設計,都有了很多自己的體會和認識,懂得了如何在實際中靈活運用所學的知識,是一次難得的鍛煉機會,為我以后無論是學習還是工作打下了堅實的基礎。
25
參考文獻: [1] 李學龍.使用單片機控制的智能遙控電風扇控制器[J].電子電路制作.2003.9:13—15.
[2] 郭天祥.新概念51單片機C語言教程[M].北京:電子工業出版社.2009.342—344.
[3] 藍厚榮.單片機的PWM控制技術[J].工業控制計算機.2010.23(3):97—98.
[4] 胡漢才.單片機原理及其接口技術[M](第2版).北京:清華大學出版社.2004.49—77.
[5] 胡全.51單片機的數碼管動態顯示技術[J] .信息技術.2009.13:25—26.
[6] 李鋼,趙彥峰.1-Wire總線數字溫度傳感器DSI8B20原理及應用[J].現代電子技術.2005.28(21):
77—79.
[7] 馬云峰.單片機與數字溫度傳感器DS18B20的接口設計[J].計算機測量與控制.2007.10(4):
278—280.
[8] 王會明,侯加林.智能電風扇控制器的研制[J].電子與自動化.1998.5(4):25—26.
[9] 譚浩強.C程序設計[M](第三版).北京:清華大學出版社.2005.37—65.
[10] 孫號.Proteus軟件在設計電子電路中的應用[J].儀表技術.2009.8:74—75.
[11] 樓俊軍.基于Proteus和Keil的單片機演奏樂曲的實現[J].科技信息.2010.23:50.
[12] 王文海,周歡喜.用Proteus實現51單片機的動態仿真調試[J].IT技術.2006,20:10—11.
[13] 丁建軍,陳定方,周國柱.基于AT89C51的智能電風扇控制系統[J].湖北工學院學報.2003,18(2):
60—63.
[14] 王會明,侯加林.智能電風扇控制器的研制[J].電子與自動化.1998,5(4):25—26.
[15] 劉進山.基于MCS-51電風扇智能調速器的設計[J].廣州:電子質量.2004,10(10):71.
|