目 錄
1 緒 論1
11 智能風扇發(fā)展史1
12 智能風扇的工作原理2
13 本次設(shè)計的主要任務(wù)和內(nèi)容2
2 方案論證3
21 控制核心的選擇3
22 顯示電路的選擇3
23 調(diào)速方式的選擇4
24 溫度傳感器的選擇5
25 超聲波發(fā)生器的選擇5
3 系統(tǒng)主要硬件電路設(shè)計7
31 系統(tǒng)總體設(shè)計7
32 電源電路設(shè)計7
33 單片機最小系統(tǒng)電路設(shè)計8
331 AT89C51單片機簡介8
332 單片機最小系統(tǒng)電路10
34 溫度采集電路設(shè)計11
341 DS18B20溫度傳感器簡介11
342 溫度采集電路13
35 溫度顯示電路設(shè)計14
351 LED數(shù)碼管簡介14
352 溫度顯示電路15
36 驅(qū)蚊電路設(shè)計15
361 TCT40-16T超聲波發(fā)射器簡介15
362 驅(qū)蚊電路16
37 驅(qū)動與調(diào)速電路設(shè)計17
371 達林頓反相器ULN2803簡介17
372 驅(qū)動與調(diào)速電路18
38 獨立按鍵電路設(shè)計18
4 軟件設(shè)計20
41 系統(tǒng)總體軟件設(shè)計流程圖20
42 用Keil C51進行程序編輯21
5 系統(tǒng)調(diào)試與仿真22
51 系統(tǒng)軟件調(diào)試22
52 程序下載22
53 系統(tǒng)仿真22
6 結(jié) 論26
致 謝27
參考文獻28
附 錄29
1 緒 論 在現(xiàn)實生活中,我們要經(jīng)常使用一些降溫設(shè)備。雖然現(xiàn)在不少城市家庭都用空調(diào)設(shè)備作為降溫工具,但在大部分農(nóng)村家庭風扇仍然是作為夏季降溫的主要工具。春夏或者夏秋交替季節(jié),早晚溫差比較大,白天溫度很高,風扇應(yīng)該轉(zhuǎn)動的比較快,這樣才能給人帶來涼爽。到了晚上,氣溫下降的很多,當人們?nèi)胨,風扇的轉(zhuǎn)動速度應(yīng)慢慢減下來,防止感冒。雖然現(xiàn)在的風扇有不同的檔位可以調(diào)節(jié),但都必須人工來換擋,當人們熟睡時就無能為力了。盡管現(xiàn)在普遍采用定時的方式解決這個問題,但定時時間有限,一般最多只有兩個小時,在這兩個小時內(nèi)溫度并不一定就會下降的很多,風扇關(guān)閉后,人們可能就會因為炎熱再次醒來開啟電扇,這樣會使人的睡眠質(zhì)量大大降低。從以上的分析可知,需要設(shè)計出一種很智能化的電風扇來解決。本設(shè)計用單片機作為控制核心,用溫度傳感器采集當前溫度,LED數(shù)碼管顯示實時溫度,并根據(jù)當前檢測到的溫度,輸出不同占空比的PWM脈沖信號,從而風扇實現(xiàn)了不同的轉(zhuǎn)速。 1.1 電風扇的發(fā)展史 電風扇簡稱電扇,香港稱為風扇,日本及韓國稱為扇風機,從發(fā)明到現(xiàn)在已經(jīng)經(jīng)過了一百多年,是炎熱夏季的寵物。電風扇起源于1830年,是叫詹姆斯的一個美國人發(fā)明了一種用發(fā)條來驅(qū)動的,可以固定在天花板上的電風扇。1880年,一個叫舒樂的美國人第一次將葉片直接裝到電動機上,再接上電源,葉片便很快速旋轉(zhuǎn)起來。1882年,一個叫休伊?斯卡茨?霍伊拉的紐約人最早發(fā)明了商品化的電風扇。 中國生產(chǎn)的第一臺風扇起于1916年,直到1925年華生電器制造廠才正式生產(chǎn)電風扇,并很快贏得市場好評。 一開始電風扇不能很好的控制時間,過了一段時間,便出現(xiàn)了一種可以設(shè)置風扇轉(zhuǎn)動時間,及可以根據(jù)設(shè)定的時間來開啟或者關(guān)閉的電風扇,這種風扇在當時相當受好評,也受到廣大人民的喜愛。電風扇的操作方式從一原先的旋鈕,到按鍵,再到現(xiàn)在的觸摸式操作[1]。 1.2 電風扇的工作原理 電風扇的主要功能器件是交流電機,通電后線圈在磁場中因受力而轉(zhuǎn)動,能量的轉(zhuǎn)化形式是這樣的:電能主要是轉(zhuǎn)化為機械能,同時由于電阻問題,電能還有一部分轉(zhuǎn)化成內(nèi)能。電風扇工作時,因為有電流流過電風扇的線圈,而線圈是有電阻的,所以會產(chǎn)生部分熱量向外擴散,因此電風扇的溫度會增高。但人們?yōu)槭裁磿杏X到?jīng)鏊?因為人體的表面在夏天有大量的汗液,當電風扇工作后,室內(nèi)的空氣會隨著電風扇流動,所以就能夠蒸發(fā)人體表面的汗液,由物理學原理蒸發(fā)需要吸熱,故人們會感覺到非常涼爽[2] 。 1.3 本次設(shè)計的主要任務(wù)和內(nèi)容 本設(shè)計是以AT8951單片機為主要控制核心,利用51單片機對溫度傳感器采集到的數(shù)據(jù)進行處理,并且通過各種電子元器件對電風扇各種工作狀態(tài)進行實時控制,從而可以達到用戶的要求。 本次設(shè)計主要完成以下內(nèi)容: (1) 能夠檢測當前溫度并顯示,可根據(jù)預設(shè)溫度自動開啟關(guān)閉,當當前溫度大于預設(shè)溫度,自動開啟,小于預設(shè)溫度自動關(guān)閉。 (2) 預設(shè)溫度可通過按鍵增加或減少。 (3) 可隨著外界溫度的增加風扇可自行調(diào)速,主要分為五個檔位,溫度每升高五度風扇自動增加一檔。 (4) 具有驅(qū)蚊功能。
2 方案論證
2.1 控制核心的選擇 方案一:采用單片機作為主要控制芯片。在本設(shè)計中采用AT89C51單片機,通過軟件編程的方法來實現(xiàn)對溫度的實時采集和控制,在其I/O口輸出相應(yīng)的控制信號。單片機AT89C51工作電壓相對比較低,單片內(nèi)含有4k字節(jié)的ROM和256字節(jié)的RAM,并且價格也相對較便宜。 方案二:采用電壓比較電路作為控制執(zhí)行部件。將采集到的溫度信號轉(zhuǎn)換為電信號并經(jīng)放大電路放大,集成運算放大器組成的比較電路來判斷決定電風扇的轉(zhuǎn)動速度。 對于方案一,用單片機作為控制器件,通過簡單的程序編寫可以將溫度傳感器DS18B20檢測的溫度通過LED數(shù)碼管顯示出來,而且可以通過按鍵掃描程序通過單片機的外部按鍵對預設(shè)的初值進行增加或者減少,同時對于驅(qū)蚊功能采用單片機的軟件編程更易實現(xiàn),成本低,故以單片機AT89C51為控制核心,適合本次設(shè)計。對于AT89C51的具體參數(shù)參見下面“硬件設(shè)計”中的各器件介紹。 對于方案二,采用電壓比較電路作為控制的核心,雖然電路比較簡單、容易實現(xiàn),但不能對預設(shè)溫度的值進行更改,無法滿足不同用戶的需求,故本次設(shè)計不采用。 2.2 顯示電路的選擇 方案一 :采用LCD液晶顯示器顯示。 方案二:采用數(shù)碼管做顯示器件,共陰極接法,動態(tài)方式顯示[3]。 對于方案一,液晶顯示屏顯示的字符非常優(yōu)美,這一優(yōu)點LED數(shù)碼管是無法做到的,但是液晶顯示屏價格太過昂貴,驅(qū)動程序編寫起來也是相當復雜的,本次設(shè)計不采用。 對于方案二,用LED顯示,成本非常低,溫度顯示清晰可見,即使夜間也能看見,顯示程序的編寫也比較容易,因此這種顯示方式得到了廣泛的應(yīng)用。不足的地方是采用該方案可能會產(chǎn)生閃爍現(xiàn)象,因為這種動態(tài)掃描方式五個LED數(shù)碼管是逐個點亮的,但由于人眼有個視覺暫留效應(yīng),為20MS,我們只要設(shè)定合適的掃面周期就可以避免閃爍現(xiàn)象,故這一方案可行。關(guān)于LED的詳細參數(shù)參看下面“硬件設(shè)計”中的各器件介紹。 2.3 調(diào)速方式的選擇 方案一:采用變壓器調(diào)節(jié)方式,運用變壓器原理將市電220V交流電壓通過線圈降壓到不同的值,電風扇電機接到不同電壓值的線圈上就可以來控制直流電機的轉(zhuǎn)速。 方案二:采用單片機的PWM軟件編程方式。PWM中文意思是脈沖寬度調(diào)制,英文意思是Pulse Width Modulation的簡寫形式,它是一種按某種規(guī)律變化的脈沖方波,在PWM驅(qū)動直流電機的調(diào)節(jié)控制系統(tǒng)當中,最常用的是矩形PWM脈沖波信號,也是編寫程序最簡單的。在對直流電機的轉(zhuǎn)速進行控制時,需要根據(jù)當前溫度來輸出不同占空比的PWM脈沖。PWM脈沖的占空比是指高電平的時間在一個周期時間內(nèi)的百分比,若全為低電平,占空比為零,風扇不轉(zhuǎn);若全為高電平,占空比為100%時,轉(zhuǎn)速達到最大 [4]。用單片機輸出PWM脈沖信號時,有如下兩種方法: (1) 利用軟件延時?梢岳脝纹瑱C自帶的定時器編程實現(xiàn)不同占空比的PWM脈沖的輸出,利用中斷程序?qū)纹瑱C輸出的電平進行高低轉(zhuǎn)換,從而實現(xiàn)風扇的調(diào)速,本設(shè)計采用該方法。設(shè)計不同占空比的PWM脈沖的思路是:假設(shè)采用1S的周期方波,以50MS為基準,則20個基準便就是一個1S,那么當其中4個連續(xù)的50MS的高電平脈沖,然后16連續(xù)的50MS低電平脈沖,便得到了占空比為20%的PWM方波信號。 (2) 利用單片機自帶的PWM功能。但本次設(shè)計所用得AT89C51單片機沒有這種功能,只有STC系列的才有,故不可行。 對于方案一,該方案可以對直流風扇進行調(diào)速,但調(diào)節(jié)不是很方便,而且采用變壓器來改變電壓,不能適應(yīng)人性化要求。 對于方案二,采用PWM 脈沖調(diào)制的純軟件的方法來實現(xiàn)對直流電機的實時調(diào)速,具有很大的靈活性,而且可以更充分地發(fā)揮單片機的功能,綜合考慮選用方案二。 2.4 溫度傳感器的選擇 方案一:用熱電偶來作為檢測溫度的元器件,配合適當?shù)耐鈬娐罚瑢z測到的溫度信號送入單片機AT89C51處理。 方案二:用熱敏電阻作為檢測溫度的元器件,經(jīng)過運算放大器放大,由于溫度變化會引起熱敏電阻的電阻值發(fā)生相應(yīng)的變化、便可以得到輸出電壓變化的信號。 方案三:用高精度集成溫度傳感器DS18B20作為檢測溫度的元器件,直接輸出數(shù)字溫度信號給單片機處理[5]。 對于方案一,采用熱電偶作為檢測元器件,其檢測的溫度范圍非常寬,可檢測-50攝氏度到1600攝氏度,但是電路設(shè)計比較復雜,故本設(shè)計不采用該方案。 對于方案二,采用熱敏電阻價格相對便宜、元器件也很容易買到,但熱敏電阻對溫度的變化不是很敏感,在檢測溫度信號的時候,還有可能產(chǎn)生失真和誤差,故本設(shè)計不采用該方案。 對于方案三,由于溫度傳感器DS18B20的集成度很高,大大減少了外接電路,從而檢測誤差也會變小很多,DS18B20檢測溫度的原理與前面兩種方案的原理有著很大的不同。其檢測到的溫度值可以直接送入單片機處理,不用編寫更多的轉(zhuǎn)換程序,簡化了程序的編寫,且只用一根線便可與單片機相連,接口相當簡單,本次設(shè)計采用該方案。關(guān)于DS18B20的詳細參數(shù)參看下面“硬件設(shè)計”中的器件介紹。 2.5 超聲波發(fā)射器的選擇 本設(shè)計的原理是根據(jù)蚊子的生理特性來的,主要靈感來源是現(xiàn)在的智能手機上帶有驅(qū)蚊的軟件。在夏天咬人的一般都是雌蚊,雄蚊幾乎是不咬人的,雌蚊在夏天大部分都是懷卵的且在懷卵期間又不喜歡與雄蚊接近,因此當它們感覺到雄蚊發(fā)出頻率在22KHZ的超聲波信號時,就會自動離開,因此只需控制超聲波發(fā)射器發(fā)射出模擬雄蚊的超聲波就可達到驅(qū)蚊的目的。產(chǎn)生該頻率的超聲波有一下兩種方案: 方案一:可以通過軟件編寫,定時器T1產(chǎn)生頻率在22KHZ的方波信號,并通過并聯(lián)的反相器用來增大驅(qū)動能力,然后接入超聲波發(fā)射器,使超聲波發(fā)射器發(fā)出模擬雄蚊的超聲波,從而驅(qū)逐雌蚊,進而可以避免蚊子的叮咬。 方案二:用NE555構(gòu)成多諧振蕩器產(chǎn)生可調(diào)頻率的方波,從而驅(qū)動超聲波發(fā)射器,使其發(fā)射我們需要的超聲波信號,達到驅(qū)蚊目的[6]。 對于方案一:AT89C51單片機定時器T1工作在方式1,可通過初值的設(shè)置,輸出22KHz的時鐘信號輸出,不用反復中斷,提高了系統(tǒng)的執(zhí)行效率。 超聲波發(fā)射器選擇的是TCT40-16T ,為了增大驅(qū)動能力,單片機P3.5口產(chǎn)生的方波信號經(jīng)過并聯(lián)反相器后加在超聲波發(fā)射器的兩端,這樣超聲波發(fā)射器就可以發(fā)射22KHz的超聲波,本設(shè)計采用該方案。關(guān)于TCT40-16T的詳細參數(shù)參看下面“硬件設(shè)計”中的器件介紹。 對于方案二:由于NE555產(chǎn)生的超聲波頻率調(diào)節(jié)是依靠調(diào)節(jié)滑動變阻器實現(xiàn)的,不好可視化的調(diào)節(jié)頻率,不方便用戶使用。
3 系統(tǒng)主要硬件電路設(shè)計
3.1 系統(tǒng)總體設(shè)計 本次設(shè)計的思路:本次設(shè)計主要利用AT89C51單片機為控制核心,利用溫度傳感器DS18B20采集當前溫度送入單片機處理,單片機根據(jù)當前溫度與預設(shè)溫度的比較決定是否開啟風扇,并通過五段LED數(shù)碼管顯示當前溫度和預設(shè)溫度。當當前溫度高于預設(shè)溫度,風扇開啟,低預設(shè)溫度時風扇關(guān)閉。單片機根據(jù)當前的溫度輸出相應(yīng)占空比的PWM脈沖,并通過ULN2803增大驅(qū)動后,送入12V的直流電機,從而產(chǎn)生不同轉(zhuǎn)速。 本次設(shè)計的系統(tǒng)總框圖如圖3.1所示:  圖3.1系統(tǒng)總體框圖 3.2 電源電路設(shè)計 直流穩(wěn)壓電源作為直流能源的提供者,在電路中起到很關(guān)鍵的作用,因此對電源的要求比較高,尤其是對電源紋波系數(shù)和輸出電流能力的要求上,如果電源沒有達到設(shè)計所需電源的要求,將直接影響系統(tǒng)的正常工作。 常用的轉(zhuǎn)5V電源有線性型穩(wěn)壓芯片和開關(guān)型穩(wěn)壓芯片兩大類。線性型穩(wěn)壓芯片線性度高,紋波小,外圍電路簡單。開關(guān)型穩(wěn)壓電路功耗小,轉(zhuǎn)換率高,但紋波大,受尖峰脈沖干擾嚴重。綜合考慮選用線性型三端穩(wěn)壓芯片LM7805。 本次設(shè)計需要兩個幅度不同的直流電壓5V和12V。其中5V電壓的產(chǎn)生是將市電~220V交流電經(jīng)過降壓器降壓,橋式整流濾波后送入穩(wěn)壓器件LM7805,輸出的電壓可能還含有紋波,在通過470uf帶極性的電容濾除低頻信號,0.1uf不帶極性的電容濾除高頻信號,進而可以得到穩(wěn)定的5V電壓[7]。12V電壓只需將5V電壓經(jīng)過運算放大器放大即可得到,5V和12V電壓產(chǎn)生電路如圖3.2(a)和3.2(b)所示: 
圖3.2(a) 5V電壓產(chǎn)生電路

圖3.2(b) 12V電壓產(chǎn)生電路 3.3 單片機最小系統(tǒng)電路設(shè)計 3.3.1 AT89C51簡介 AT89C51是美國ATMEL公司生產(chǎn)的低電壓單片機,其含有4K字節(jié)的ROM和256字節(jié)的RAM,兼容MCS-51指令。其中央處理器是8位的,且含有Flash存儲單元,功能非常強大。 AT89C51單片機具有以下標準的功能:一個8位CPU頻率范圍1.2-12MHZ,4K字節(jié)Flash閃存,256字節(jié)內(nèi)部數(shù)據(jù)存儲器RAM,4個8位并行I/O口,一個全雙工串行口,2個16位定時/計數(shù)器,5個中斷源的中斷控制系統(tǒng),片內(nèi)自帶振蕩器和時鐘電路。 AT89C51單片機管腳圖如3.3所示: 
圖3.3AT89C51單片機
各管腳功能如下[8]: VCC:40引腳接5V供電電壓。 GND:20引腳接地。 XTAL1:19引腳為單片機提供外部時鐘信號,外接石英晶體和微調(diào)電容。 XTAL2:18引腳為單片機提供外部時鐘信號,外接石英晶體和微調(diào)電容。 P0口:P0.7~P0.0,這組引腳共8條,其中P0.7為最高位,P0.0為最低位。是漏極開路的8位準雙向I/O口,有兩種功能。第一:做通用I/O口,無片外內(nèi)存時,P0口可做通用I/O接口使用。第二:做地址/數(shù)據(jù)口,在訪問外部內(nèi)存時,用作地址總線的低8位和數(shù)據(jù)總線。 P1口:P1.7~P1.0,其中P1.7為最高位,P1.0為最低位,僅用作I/O口。 P2口:P2.7~P2.0,其中P2.7為最高位,P2.0為最低位。P2口是帶內(nèi)部上拉電阻的8位準雙向I/O接口,具有兩種功能。第一:做通用I/O口,無片外內(nèi)存時,P2口可用作通用I/O口。第二:做地址口,在訪問外部內(nèi)存時,用作地址總線的高8位。 P3 口:P3.7~P3.0,其中P3.7為最高位,P3.0為最低位。P3口是雙功能口。具有兩種功能。第一:用作通用I/O口。第二功能:P3.0RXD串行口輸入;P3.1TXD串行口輸出;P3.2INTO外部中斷0輸入;P3.3INT1外部中斷1輸入;P3.4T0定時計數(shù)器的脈沖輸入;P3.5T1定時計數(shù)器的脈沖輸入;P3.6WR片外RAM寫信號;P3.4RD片外RAM讀信號。 RST:9引腳復位輸入,高電平有效。 :29引腳外部程序內(nèi)存讀信號。當訪問外部程序內(nèi)存時,此腳定時輸出脈沖作為讀片外程序內(nèi)存的選通信號,通常接EPROM的OE端。 端在每個機器周期中兩次有效,但當訪問外部RAM時,兩次 負脈沖不出現(xiàn)。 可驅(qū)動8個LS型TTL。 ALE/ :30引腳地址鎖存允許/編程線,當訪問片外存儲器時,在P0.7~P0.0引腳線上輸出片外存儲器低8位地址的同時還在ALE/ 線上輸出一個高電位脈沖,其下降沿用于把這個片外存儲器低8位地址鎖存到外部專用地址鎖存器。 /VPP:31引腳內(nèi)外部程序內(nèi)存選擇輸入端。 =1,CPU訪問片外ROM,并執(zhí)行其指令。當PC>0FFFH時,自動轉(zhuǎn)向片外ROM。 =0,不論片內(nèi)是否含有內(nèi)存,只執(zhí)行片外ROM的指令。
3.3.2 單片機最小系統(tǒng)電路 單片機工作時需要時鐘信號,時鐘信號通?捎赏獠糠绞交蛘邌纹瑱C的內(nèi)部方式提供。本次設(shè)計采用內(nèi)部時鐘方式,利用單片機內(nèi)部自帶的反相放大器,XTAL2為放大器的輸出端,XTAL1為放大器的輸入端,這兩個引腳外接石英晶體振蕩器和微電容,構(gòu)成可以自激的振蕩器。本設(shè)計在XTAL1和XTAL2外接了一個12MHZ的晶振,30pf的電容[9]。 復位是使單片機回復到初使的狀態(tài),就跟計算機的重啟差不多,并從初始狀態(tài)從新工作。單片機是高電平復位,一般有兩種方式:按鍵復位和上電復位,兩種復位方式均可。本次設(shè)計采用按鍵復位,當按下按鍵開關(guān)S1時,系統(tǒng)復位一次,電阻R2、R3為10k。其時鐘電路與復位電路如圖3.4所示:

圖3.4最小系統(tǒng)電路 3.4 溫度采集電路設(shè)計 3.4.1 DS18B20簡介 DS18B20內(nèi)部結(jié)構(gòu)主要有四個部分:64位的只讀程序存儲器ROM、溫度傳感器、非揮發(fā)的報警觸發(fā)器TH和TL、配置寄存器。總共有三個管腳,包含DQ,GND,VDD。其中DQ為數(shù)字信號端,GND為電源地,VDD為電源輸入端。 DS18B20的主要性能特點如下: (1) 僅可用一個端口便可以通信; (2) 無須外部器件; (3) DS18B20支持多點組網(wǎng)功能; (4) 適應(yīng)電壓范圍廣,電壓范圍為3.0~5.5V; (5) 待機功耗為零; (6) 溫度以9位或12位數(shù)字; (7) 具有報警命令識別功能; (8) 具有負電壓特性,電源接反時,芯片不會燒壞; DS18B20的管腳圖及部分溫度值與DS18B20輸出的數(shù)字量對照表見圖 3.5和表3-1所示:

圖3.5 DS18B20溫度傳感器
表3-1 部分溫度值與DS18B20輸出的數(shù)字量對照
溫度值/℃ 數(shù)字輸出(二進制) 數(shù)字輸出(十六進制) | +125 0000 0111 1101 0000 07D0H +85 0000 0101 0101 0000 0550H +25.625 0000 0001 1001 0001 0191H +10.125 0000 0000 1010 0010 00A2H +0.5 0000 0000 0000 1000 0008H 0 0000 0000 0000 0000 0000H -0.5 1111 1111 1111 1000 FFF8H -10.125 1111 1111 0110 1110 FF5EH -25.625 1111 1111 0110 1111 FF6FH -55 1111 1100 1001 0000 FC90H |
3.4.3 溫度采集電路 DS18B20數(shù)字溫度傳感器檢測現(xiàn)場溫度,將檢測到的溫度值送入AT89C51單片機的P1.0口,經(jīng)過單片機處理后顯示此時溫度值,并與設(shè)定溫度值做比較,輸出相應(yīng)占空比的PWM脈沖信號。電路如圖3.6所示: 
圖3.6 溫度采集電路 3.5 溫度顯示電路設(shè)計 3.5.1 LED數(shù)碼管簡介 本設(shè)計選用五個LED數(shù)碼管來進行溫度顯示。LED又稱為數(shù)碼管,主要是由8個發(fā)光二極管構(gòu)的。LED數(shù)碼管按結(jié)構(gòu)可以分為共陰極和共陽極兩種結(jié)構(gòu),如圖3.7所示:共陰極把8個發(fā)光二極管陰極連接在一起,共陽極把8個發(fā)光二極管陽極連接在一起。通過編程的方式使單片機的引腳輸出不同的高低電平,便可以得到相應(yīng)的數(shù)字,這種數(shù)碼管的顯示方式就被稱做段選碼[10]。
 
 
圖3.7 七段LED數(shù)碼管
表3-2 七段LED數(shù)碼管的段選碼
假如一個數(shù)碼管采用共陰極接法接入單片機中,想要顯示數(shù)字“5”須使a、c﹑d﹑f﹑g這5個二極管同時發(fā)光 (即這5個二極管接入高電平),而其他二極管不發(fā)光。只要P0口輸入01101101(6dH)即可。字形與段選碼的對照見表3-2。 3.5.2 溫度顯示電路 本次設(shè)計主要顯示當前溫度值和預設(shè)溫度值,其中前三個LED數(shù)碼管顯示當前溫度值,可顯示0到99.9不同的溫度,后兩個LED數(shù)碼管顯示之前預設(shè)定的溫度值。數(shù)碼管顯示采用共陰極接法,其中a,b,c,d,e,f,g,dp分別與P0.0到P0.7相連,作為段選信號,又因為P0口輸出的是低電平,所以在P0口接了10K的上拉電阻,P2.0到P2.5分別接到1,2,3,4,5,6引腳作為位選信號。顯示電路如圖3.8所示: 
圖3.8 溫度顯示電路 3.6 驅(qū)蚊電路設(shè)計 3.6.1 TCT40-16T超聲波發(fā)射器簡介 TCT40-16T是一種較小的超聲波發(fā)射器,它能發(fā)射出不同頻率的超聲波,適用于家用電器及其他電子設(shè)備的超聲波遙控裝置。其器件外觀如圖3.9所示:
圖3.9 超聲波發(fā)射器TCT40-16T 3.6.2 驅(qū)蚊電路 P3.5是單片機定時器T1的時鐘輸出端口,我們可以利用定時器T1輸出頻率為22KHZ的方波信號,并通過并聯(lián)反相器增大驅(qū)動后送入超聲波發(fā)射器TCT40-16T來模擬雄蚊發(fā)出的超聲波,進而達到驅(qū)蚊目的[11]。驅(qū)蚊電路如圖3.10所示:

圖3.10 驅(qū)蚊電路
3.7 驅(qū)動與調(diào)速電路設(shè)計 3.7.1 達林頓反相器ULN2803簡介 因為直流電機工作時需要較大的電流,而單片機I/O口輸出的電流都在幾十毫安級別,無法滿足直流電機的工作電流,所以必須要外加驅(qū)動電路。在本設(shè)計驅(qū)動電路中,選用達林頓反向驅(qū)動器ULN2803來驅(qū)動直流風扇電機。ULN2803在使用時接口非常簡單,并且操作很容易,可為電機提供幾百毫安的驅(qū)動電流,它實際上是一個集成芯片,單塊芯片可同時驅(qū)動8個直流電機。 ULN2803實際上是16個NPN晶體管組成,總共含有18個引腳。 ULN2803的管腳圖如下圖3.11所示:
圖3.11 ULN2803管腳圖
各引腳簡介如下: 1-8引腳:8個輸入端口; 9引腳:接地端; 10引腳:為COM端,一般懸空或接電源,但與負載的電源共同接在一起,驅(qū)動效果更好,本次設(shè)計接12電源。ULN2803可以輸出最大電流可達500毫安,最大電壓可達50V。本系統(tǒng)選用的電機為12V直流無刷電機,所需電流為300毫安左右,因此可用ULN2803來驅(qū)動。 11-18引腳:8個輸出端口; 3.7.2 驅(qū)動與調(diào)速電路 本次設(shè)計利用PWM脈沖寬度調(diào)制技術(shù)對直流電機進行實時調(diào)速,風扇分為五檔,預設(shè)溫度t0為25度,溫度每增高5度,風扇增加一檔。當當前溫度低于預設(shè)溫度時,輸出占空比為0的PWM脈沖,風扇不轉(zhuǎn)。當當前溫度大于預設(shè)溫度時,風扇轉(zhuǎn)動,并且可以根據(jù)當前溫度輸出相應(yīng)占空比的PWM脈沖,進而實現(xiàn)了對風扇的自動調(diào)速。 驅(qū)動與調(diào)速電路如下圖3.12所示:直流風扇電機與ULN2803的COM端供接12V電源,直流電機另一端接ULN2803的4C,單片機的P3.4口接4B,通過單片機的P3.4口輸出不同占空比的PWM脈沖信號,便可以對直流電機進行調(diào)速,系統(tǒng)選用的電機為12V直流無刷電機。 圖3.12驅(qū)動與調(diào)速電路 3.8 獨立按鍵電路設(shè)計 本次設(shè)計需要兩個獨立按鍵S2和S3,主要是用來對預設(shè)溫度初值進行調(diào)整。當S2每按下一次,預設(shè)初值自動加一,S3每按下一次預設(shè)溫度初值自動減一。加減采用中斷方式實現(xiàn),將S2與P3.2相連,S3與P3.3相連。當有鍵按下立刻執(zhí)行中斷程序,低電平有效。獨立按鍵電路如下圖3.13所示:
圖3.13 獨立按鍵電路
4 軟件設(shè)計
4.1 系統(tǒng)總體軟件設(shè)計流程圖 初始化程序后,傳感器采集溫度送入單片機,通過LED顯示。當有鍵按下時處理按鍵,無鍵按下,根據(jù)溫度得到不同的轉(zhuǎn)速,如圖4.1所示: 
圖4.1 軟件總體設(shè)計流程圖 4.2 用Keil C51進行程序編寫 Keil C51 軟件目的主要在于解決嵌入式軟件開發(fā)商面臨的問題,當有新項目的時候,只需要從設(shè)備數(shù)據(jù)庫選擇使用的設(shè)備,uVision IDE 將設(shè)置好所有的編譯器,鏈接器和存儲器選項[12]。Keil C51是美國Keil Software公司開發(fā)的51系列并且兼容單片機C語言的嵌入式開發(fā)軟件,與單片機匯編語言相比,C語言的靈活性更強一點,程序編寫相比于匯編也更簡單,很容易學習和使用,且編寫的函數(shù)模塊可移植性強[13]。一般創(chuàng)建一個Keil C51應(yīng)用程序需要按照下面的步驟: (1) 創(chuàng)建一個工程項目文件; (2) 為工程項目選擇目標器件; (3) 為工程項目設(shè)置軟硬件調(diào)試環(huán)境; (4) 創(chuàng)建源程序項目文件; (5) 保存創(chuàng)建的源程序項目文件; (6) 把源程序文件添加到項目中; Keil C51使用界面如圖4.2:

圖4.2Keil C51使用界面
5 系統(tǒng)調(diào)試與仿真
5.1 系統(tǒng)軟件調(diào)試 源程序通過編譯,只能說明源程序的語法沒有問題,但不能保證程序的邏輯功能和需要的邏輯功能一致,所以還必須對程序進行調(diào)試。程序調(diào)試時可以采用單步執(zhí)行或者連續(xù)執(zhí)行,連續(xù)執(zhí)行速度快,但當出錯時不易查出錯誤的地方。單步執(zhí)行簡單方便,可以檢查每條指令的正確性,但比較繁瑣,消耗大量時間。因此可先連續(xù)調(diào)試,對有問題的地方在單步調(diào)試[14]。 5.2 程序下載 程序調(diào)試好以后,就可以下載了,將經(jīng)過編譯后生成的.HEX文件下載到單片機上,下載在單片機上的程序?qū)⒃诔绦虼鎯ζ鲀Υ嫫饋,即使掉電后仍然保存,不會因此而丟失。本次設(shè)計的總程序清單見附錄2。 5.3 系統(tǒng)仿真 本次設(shè)計采用protues軟件進行仿真,Proteus軟件是英國Labcenter electronics 公司出版的EDA工具軟件。它不僅具有其它EDA工具軟件仿真功能,還能仿真單片機及外圍器件。它是目前最好的仿真單片機及外圍器件的工具。Proteus是世界上著名的EDA工具,從原理圖布圖、代碼調(diào)試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計,真正實現(xiàn)了從概念到產(chǎn)品的完整設(shè)計[15]。Proteus ISIS的工作界面是一種標準的Windows界面,其中包含標題欄、主菜單、標準工具欄、繪圖工具欄、狀態(tài)欄、對象選擇按鈕、預覽對象方位控制按鈕、仿真進程控制按鈕、預覽窗口、對象選擇窗口、圖形編輯窗口。
(1) 本次設(shè)計的預設(shè)溫度值為25度,當當前溫度大于設(shè)定溫度時直流電機開始轉(zhuǎn)動。當當前溫度為26度時直流電機轉(zhuǎn)動情況如圖5.1所示:
圖5.1 當前溫度為26度的轉(zhuǎn)速情況
(2) 當當前溫度值升高至31度時,其電機轉(zhuǎn)速如圖5.2所示:顯然轉(zhuǎn)速較溫度為26的時候有了明顯的增加,表明單片機對電機的轉(zhuǎn)速控制功能能夠正常實現(xiàn)。    圖5.2 當前溫度為31度的轉(zhuǎn)速情況
(3) 當我們通過獨立按鍵S2將預設(shè)溫度增加到29大于當前溫度26時,輸出占空比為零的脈沖,直流電機將停止轉(zhuǎn)動,如圖5.3所示:    
圖5.3 當前溫度小于設(shè)定溫度的轉(zhuǎn)速情況
6 結(jié) 論
本次設(shè)計以單片機AT89C51為主控芯片,硬件主要包含電源電路、單片機最小系統(tǒng)電路、溫度采集電路、溫度顯示電路、獨立按鍵電路、驅(qū)蚊電路、驅(qū)動與調(diào)速電路。用DS18B20溫度傳感器采集當前溫度送入單片機處理,LED數(shù)碼管能正常顯示當前溫度和設(shè)定溫度,并能根據(jù)當前溫度和設(shè)定溫度的差值調(diào)節(jié)風扇轉(zhuǎn)速,在一定范圍內(nèi)實現(xiàn)了對風扇的實時調(diào)速。獨立按鍵部分也能正常使用,可以調(diào)節(jié)預設(shè)溫度t0的值。同時超聲波發(fā)射器也能正常工作,達到了驅(qū)蚊目的。 本次設(shè)計對于現(xiàn)實生活具有積極的作用,可以用來作為降溫工具,環(huán)保且智能,能夠給人帶來很多方便,同時驅(qū)蚊的功能在夏季還是很有必要。
附錄一 電路總圖
單片機源程序如下: - #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ=P1^0;
- sbit key2=P3^2;
- sbit key3=P3^3;
- sbit P3_4=P3^4;
- sbitP3_5=P3^5;
- float ff;
- uint y3;
- uchar shi,ge,xiaoshu,yushe=25;
- uchar code dispcode[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71}; //段碼
- uchar code tablel[]={
- 0xbf,0x86,0xdb,0xcf,
- 0xe6,0xed,0xfd,
- 0x87,0xff,0xef}; //帶小數(shù)點的段碼
- uchar dispbitcode[]={ //位選
- 0xfe,0xfd,0xfb,0xf7,
- 0xef,0xdf,0xbf,0x7f};
- uchar dispbuf[8]={0,0,0,0,0,0,0,0};
- void Delay(uint num)// 延時函數(shù)
- {
- while( --num );
- }
- void digitalshow(uchar a4,uchar a3,uchar a2,uchar a1,uchar a0)
- {
- dispbuf[0]=a0;
- dispbuf[1]=a1;
- dispbuf[2]=a2;
- dispbuf[3]=a3;
- dispbuf[4]=a4;
-
- P2=0xff;
- P0=dispcode[dispbuf[0]];
- P2=dispbitcode[5];
- Delay(1);
-
- P2=0xff;
- P0=dispcode[dispbuf[1]];
- P2=dispbitcode[4];
- Delay(1);
-
- P2=0xff;
- P0=dispcode[dispbuf[2]];
- P2=dispbitcode[2];
- Delay(1);
-
- P2=0xff;
- P0=tablel[dispbuf[3]];
- P2=dispbitcode[1];
- Delay(1);
-
- P2=0xff;
- P0=dispcode[dispbuf[4]];
- P2=dispbitcode[0];
- Delay(1);
- }
- void dmsec(uint count)
- {
- uint i; // 1ms延時
- while(count--)
- {
- for(i=0;i<125;i++){}
- }
- }
-
- void tmreset(void)
- {
- DQ=0;
- Delay(90); // 精確延時 大于 480us
- DQ=1;
- Delay(4); // 90,4 可以小范圍變化
- }
-
- void tmpre(void)
- {
- while(DQ);
- while(~DQ);
- Delay(4);
- }
-
- bit tmrbit(void)
- {
- uint i;
- bit dat;
- DQ=0;
- i++; // i++;大概1us
- DQ=1;
- i++;
- i++;
- dat=DQ;
- Delay(8);
- return(dat);
- }
-
- uchar tmrbyte(void) //讀一個比特
- {
- uchar i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)
- {
- j=tmrbit();
- dat=(j<<7)|(dat>>1);
- }
- return(dat);
- }
-
- void tmwbyte(uchar dat) //寫一個比特
- {
- uint i;
- uchar j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1; // 從低位開始
- if(testb) // Write 1
- {
- DQ=0; // 先拉低
- i++;
- i++; // >1us
- DQ=1;
- Delay(4);
- }
- else // Write 0
- {
- DQ=0;
- Delay(4);
- DQ=1;
- i++;
- i++; // 再拉高
- }
- }
- }
- void tmstart(void) //ds1820開始轉(zhuǎn)換
- {
- dmsec(1);
- tmreset();
- tmpre();
- dmsec(1);
- tmwbyte(0xcc); // skip rom
- tmwbyte(0x44); // 轉(zhuǎn)換
- }
- uchar tmrtemp(void) //讀取溫度
- {
- uchar a,b;
- tmreset();
- tmpre();
- dmsec(1);
- tmwbyte(0xcc); // skip rom
- tmwbyte(0xbe); // 轉(zhuǎn)換
- a=tmrbyte(); // LSB低8位
- b=tmrbyte(); // MSB高8位
- y3=b;
- y3<<=8;
- y3=y3|a;
- ff=y3*0.0625;
- y3=ff*10+0.5;
- return(y3);
- }
- void keyscan(void)
- {
- if(key2==0)
- {
- dmsec(5);
- if(key2==0)
- {
- yushe++;
- if(yushe==100)
- yushe=25;
- }
- while(!key2);
- }
- else if(key3==0)
- {
- dmsec(5);
- if(key3==0)
- {
- yushe--;
- if(yushe==0)
- yushe=25;
- }
- while(!key3);
- }
- }
- void time0_int(void) interrupt 1 //定時器T0產(chǎn)生不同占空比的PWM
- { uint tmp;
- static unsigned char j;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- j=j+1;
- if(tmp<=yushe)
- {
- P3_4=0;
- j=0; //占空比00%
- }
- else if((tmp>yushe)&&(tmp<=(yushe+5)))
- {
- if(j==4)
- P3_4=0;
- else if(j==20)
- P3_4=1;
- j=0;
- } //占空比為20%
- else if((tmp>(yushe+5))&&(tmp<=(yushe+10)))
- {
- if(j==8)
- P3_4=0;
- else if(j==20)
- P3_4=1;
- j=0;
- } //占空比為40%
- else if((tmp>(yushe+10))&&(tmp<=(yushe+15)))
- {
- if(j==12)
- P3_4=0;
- else if(j==20)
- P3_4=1;
- j=0;
- } //占空比為60%
- else if((tmp>(yushe+15))&&(tmp<=(yushe+20)))
- {
- if(j==16)
- P3_4=0;
- else if(j==20)
- P3_4=1;
- j=0;
- } //占空比為80%
- else if(tmp>(yushe+20))
- P3_4=1;
- j=0; //占空比100%
- }
- void time1_int(void) interrupt 1 //定時器T1產(chǎn)生頻率為22KHz的驅(qū)蚊超聲波
- {
- P_3.5=!P3_5;
- TH0=(65536-2500)/256;
- TL0=(65536-2500)%256;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
|