欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10895|回復: 2
打印 上一主題 下一主題
收起左側

基于單片機的智能風扇設計 帶驅蚊與調速電路+源程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:441411 發表于 2018-12-7 09:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
目   錄

1 緒   論1
11 智能風扇發展史1
12 智能風扇的工作原理2
13 本次設計的主要任務和內容2
2 方案論證3
21 控制核心的選擇3
22 顯示電路的選擇3
23 調速方式的選擇4
24 溫度傳感器的選擇5
25 超聲波發生器的選擇5
3 系統主要硬件電路設計7
31 系統總體設計7
32 電源電路設計7
33 單片機最小系統電路設計8
331 AT89C51單片機簡介8
332 單片機最小系統電路10
34 溫度采集電路設計11
341 DS18B20溫度傳感器簡介11
342 溫度采集電路13
35 溫度顯示電路設計14
351 LED數碼管簡介14
352 溫度顯示電路15
36 驅蚊電路設計15
361 TCT40-16T超聲波發射器簡介15
362 驅蚊電路16
37 驅動與調速電路設計17
371 達林頓反相器ULN2803簡介17
372 驅動與調速電路18
38 獨立按鍵電路設計18
4 軟件設計20
41 系統總體軟件設計流程圖20
42 用Keil C51進行程序編輯21
5 系統調試與仿真22
51 系統軟件調試22
52 程序下載22
53 系統仿真22         
6 結   論26
致   謝27
參考文獻28
附   錄29

1 緒   論

在現實生活中,我們要經常使用一些降溫設備。雖然現在不少城市家庭都用空調設備作為降溫工具,但在大部分農村家庭風扇仍然是作為夏季降溫的主要工具。春夏或者夏秋交替季節,早晚溫差比較大,白天溫度很高,風扇應該轉動的比較快,這樣才能給人帶來涼爽。到了晚上,氣溫下降的很多,當人們入睡后,風扇的轉動速度應慢慢減下來,防止感冒。雖然現在的風扇有不同的檔位可以調節,但都必須人工來換擋,當人們熟睡時就無能為力了。盡管現在普遍采用定時的方式解決這個問題,但定時時間有限,一般最多只有兩個小時,在這兩個小時內溫度并不一定就會下降的很多,風扇關閉后,人們可能就會因為炎熱再次醒來開啟電扇,這樣會使人的睡眠質量大大降低。從以上的分析可知,需要設計出一種很智能化的電風扇來解決。本設計用單片機作為控制核心,用溫度傳感器采集當前溫度,LED數碼管顯示實時溫度,并根據當前檢測到的溫度,輸出不同占空比的PWM脈沖信號,從而風扇實現了不同的轉速。

1.1 電風扇的發展史

  電風扇簡稱電扇,香港稱為風扇,日本及韓國稱為扇風機,從發明到現在已經經過了一百多年,是炎熱夏季的寵物。電風扇起源于1830年,是叫詹姆斯的一個美國人發明了一種用發條來驅動的,可以固定在天花板上的電風扇。1880年,一個叫舒樂的美國人第一次將葉片直接裝到電動機上,再接上電源,葉片便很快速旋轉起來。1882年,一個叫休伊?斯卡茨?霍伊拉的紐約人最早發明了商品化的電風扇。

   中國生產的第一臺風扇起于1916年,直到1925年華生電器制造廠才正式生產電風扇,并很快贏得市場好評。

   一開始電風扇不能很好的控制時間,過了一段時間,便出現了一種可以設置風扇轉動時間,及可以根據設定的時間來開啟或者關閉的電風扇,這種風扇在當時相當受好評,也受到廣大人民的喜愛。電風扇的操作方式從一原先的旋鈕,到按鍵,再到現在的觸摸式操作[1]。

1.2 電風扇的工作原理

電風扇的主要功能器件是交流電機,通電后線圈在磁場中因受力而轉動,能量的轉化形式是這樣的:電能主要是轉化為機械能,同時由于電阻問題,電能還有一部分轉化成內能。電風扇工作時,因為有電流流過電風扇的線圈,而線圈是有電阻的,所以會產生部分熱量向外擴散,因此電風扇的溫度會增高。但人們為什么會感覺到涼爽呢?因為人體的表面在夏天有大量的汗液,當電風扇工作后,室內的空氣會隨著電風扇流動,所以就能夠蒸發人體表面的汗液,由物理學原理蒸發需要吸熱,故人們會感覺到非常涼爽[2] 。

1.3 本次設計的主要任務和內容

    本設計是以AT8951單片機為主要控制核心,利用51單片機對溫度傳感器采集到的數據進行處理,并且通過各種電子元器件對電風扇各種工作狀態進行實時控制,從而可以達到用戶的要求。

本次設計主要完成以下內容:

(1) 能夠檢測當前溫度并顯示,可根據預設溫度自動開啟關閉,當當前溫度大于預設溫度,自動開啟,小于預設溫度自動關閉。

    (2) 預設溫度可通過按鍵增加或減少。

    (3) 可隨著外界溫度的增加風扇可自行調速,主要分為五個檔位,溫度每升高五度風扇自動增加一檔。

    (4) 具有驅蚊功能。


2 方案論證

2.1 控制核心的選擇

方案一:采用單片機作為主要控制芯片。在本設計中采用AT89C51單片機,通過軟件編程的方法來實現對溫度的實時采集和控制,在其I/O口輸出相應的控制信號。單片機AT89C51工作電壓相對比較低,單片內含有4k字節的ROM和256字節的RAM,并且價格也相對較便宜。

方案二:采用電壓比較電路作為控制執行部件。將采集到的溫度信號轉換為電信號并經放大電路放大,集成運算放大器組成的比較電路來判斷決定電風扇的轉動速度。

對于方案一,用單片機作為控制器件,通過簡單的程序編寫可以將溫度傳感器DS18B20檢測的溫度通過LED數碼管顯示出來,而且可以通過按鍵掃描程序通過單片機的外部按鍵對預設的初值進行增加或者減少,同時對于驅蚊功能采用單片機的軟件編程更易實現,成本低,故以單片機AT89C51為控制核心,適合本次設計。對于AT89C51的具體參數參見下面“硬件設計”中的各器件介紹。

對于方案二,采用電壓比較電路作為控制的核心,雖然電路比較簡單、容易實現,但不能對預設溫度的值進行更改,無法滿足不同用戶的需求,故本次設計不采用。

2.2 顯示電路的選擇

方案一 :采用LCD液晶顯示器顯示。

方案二:采用數碼管做顯示器件,共陰極接法,動態方式顯示[3]。

對于方案一,液晶顯示屏顯示的字符非常優美,這一優點LED數碼管是無法做到的,但是液晶顯示屏價格太過昂貴,驅動程序編寫起來也是相當復雜的,本次設計不采用。

對于方案二,用LED顯示,成本非常低,溫度顯示清晰可見,即使夜間也能看見,顯示程序的編寫也比較容易,因此這種顯示方式得到了廣泛的應用。不足的地方是采用該方案可能會產生閃爍現象,因為這種動態掃描方式五個LED數碼管是逐個點亮的,但由于人眼有個視覺暫留效應,為20MS,我們只要設定合適的掃面周期就可以避免閃爍現象,故這一方案可行。關于LED的詳細參數參看下面“硬件設計”中的各器件介紹。

2.3 調速方式的選擇

方案一:采用變壓器調節方式,運用變壓器原理將市電220V交流電壓通過線圈降壓到不同的值,電風扇電機接到不同電壓值的線圈上就可以來控制直流電機的轉速。

方案二:采用單片機的PWM軟件編程方式。PWM中文意思是脈沖寬度調制,英文意思是Pulse Width Modulation的簡寫形式,它是一種按某種規律變化的脈沖方波,在PWM驅動直流電機的調節控制系統當中,最常用的是矩形PWM脈沖波信號,也是編寫程序最簡單的。在對直流電機的轉速進行控制時,需要根據當前溫度來輸出不同占空比的PWM脈沖。PWM脈沖的占空比是指高電平的時間在一個周期時間內的百分比,若全為低電平,占空比為零,風扇不轉;若全為高電平,占空比為100%時,轉速達到最大 [4]。用單片機輸出PWM脈沖信號時,有如下兩種方法:

(1) 利用軟件延時。可以利用單片機自帶的定時器編程實現不同占空比的PWM脈沖的輸出,利用中斷程序對單片機輸出的電平進行高低轉換,從而實現風扇的調速,本設計采用該方法。設計不同占空比的PWM脈沖的思路是:假設采用1S的周期方波,以50MS為基準,則20個基準便就是一個1S,那么當其中4個連續的50MS的高電平脈沖,然后16連續的50MS低電平脈沖,便得到了占空比為20%的PWM方波信號。

(2) 利用單片機自帶的PWM功能。但本次設計所用得AT89C51單片機沒有這種功能,只有STC系列的才有,故不可行。

對于方案一,該方案可以對直流風扇進行調速,但調節不是很方便,而且采用變壓器來改變電壓,不能適應人性化要求。

對于方案二,采用PWM 脈沖調制的純軟件的方法來實現對直流電機的實時調速,具有很大的靈活性,而且可以更充分地發揮單片機的功能,綜合考慮選用方案二。

2.4 溫度傳感器的選擇

方案一:用熱電偶來作為檢測溫度的元器件,配合適當的外圍電路,將檢測到的溫度信號送入單片機AT89C51處理。

方案二:用熱敏電阻作為檢測溫度的元器件,經過運算放大器放大,由于溫度變化會引起熱敏電阻的電阻值發生相應的變化、便可以得到輸出電壓變化的信號。

方案三:用高精度集成溫度傳感器DS18B20作為檢測溫度的元器件,直接輸出數字溫度信號給單片機處理[5]。

對于方案一,采用熱電偶作為檢測元器件,其檢測的溫度范圍非常寬,可檢測-50攝氏度到1600攝氏度,但是電路設計比較復雜,故本設計不采用該方案。

對于方案二,采用熱敏電阻價格相對便宜、元器件也很容易買到,但熱敏電阻對溫度的變化不是很敏感,在檢測溫度信號的時候,還有可能產生失真和誤差,故本設計不采用該方案。

對于方案三,由于溫度傳感器DS18B20的集成度很高,大大減少了外接電路,從而檢測誤差也會變小很多,DS18B20檢測溫度的原理與前面兩種方案的原理有著很大的不同。其檢測到的溫度值可以直接送入單片機處理,不用編寫更多的轉換程序,簡化了程序的編寫,且只用一根線便可與單片機相連,接口相當簡單,本次設計采用該方案。關于DS18B20的詳細參數參看下面“硬件設計”中的器件介紹。

2.5 超聲波發射器的選擇

本設計的原理是根據蚊子的生理特性來的,主要靈感來源是現在的智能手機上帶有驅蚊的軟件。在夏天咬人的一般都是雌蚊,雄蚊幾乎是不咬人的,雌蚊在夏天大部分都是懷卵的且在懷卵期間又不喜歡與雄蚊接近,因此當它們感覺到雄蚊發出頻率在22KHZ的超聲波信號時,就會自動離開,因此只需控制超聲波發射器發射出模擬雄蚊的超聲波就可達到驅蚊的目的。產生該頻率的超聲波有一下兩種方案:

方案一:可以通過軟件編寫,定時器T1產生頻率在22KHZ的方波信號,并通過并聯的反相器用來增大驅動能力,然后接入超聲波發射器,使超聲波發射器發出模擬雄蚊的超聲波,從而驅逐雌蚊,進而可以避免蚊子的叮咬。

方案二:用NE555構成多諧振蕩器產生可調頻率的方波,從而驅動超聲波發射器,使其發射我們需要的超聲波信號,達到驅蚊目的[6]。

對于方案一:AT89C51單片機定時器T1工作在方式1,可通過初值的設置,輸出22KHz的時鐘信號輸出,不用反復中斷,提高了系統的執行效率。

超聲波發射器選擇的是TCT40-16T ,為了增大驅動能力,單片機P3.5口產生的方波信號經過并聯反相器后加在超聲波發射器的兩端,這樣超聲波發射器就可以發射22KHz的超聲波,本設計采用該方案。關于TCT40-16T的詳細參數參看下面“硬件設計”中的器件介紹。

對于方案二:由于NE555產生的超聲波頻率調節是依靠調節滑動變阻器實現的,不好可視化的調節頻率,不方便用戶使用。


3 系統主要硬件電路設計

3.1 系統總體設計

本次設計的思路:本次設計主要利用AT89C51單片機為控制核心,利用溫度傳感器DS18B20采集當前溫度送入單片機處理,單片機根據當前溫度與預設溫度的比較決定是否開啟風扇,并通過五段LED數碼管顯示當前溫度和預設溫度。當當前溫度高于預設溫度,風扇開啟,低預設溫度時風扇關閉。單片機根據當前的溫度輸出相應占空比的PWM脈沖,并通過ULN2803增大驅動后,送入12V的直流電機,從而產生不同轉速。

本次設計的系統總框圖如圖3.1所示:

                    圖3.1系統總體框圖

3.2 電源電路設計

直流穩壓電源作為直流能源的提供者,在電路中起到很關鍵的作用,因此對電源的要求比較高,尤其是對電源紋波系數和輸出電流能力的要求上,如果電源沒有達到設計所需電源的要求,將直接影響系統的正常工作。

常用的轉5V電源有線性型穩壓芯片和開關型穩壓芯片兩大類。線性型穩壓芯片線性度高,紋波小,外圍電路簡單。開關型穩壓電路功耗小,轉換率高,但紋波大,受尖峰脈沖干擾嚴重。綜合考慮選用線性型三端穩壓芯片LM7805。

本次設計需要兩個幅度不同的直流電壓5V和12V。其中5V電壓的產生是將市電~220V交流電經過降壓器降壓,橋式整流濾波后送入穩壓器件LM7805,輸出的電壓可能還含有紋波,在通過470uf帶極性的電容濾除低頻信號,0.1uf不帶極性的電容濾除高頻信號,進而可以得到穩定的5V電壓[7]。12V電壓只需將5V電壓經過運算放大器放大即可得到,5V和12V電壓產生電路如圖3.2(a)和3.2(b)所示:

3.2(a) 5V電壓產生電路


3.2(b) 12V電壓產生電路

3.3 單片機最小系統電路設計

3.3.1 AT89C51簡介

AT89C51是美國ATMEL公司生產的低電壓單片機,其含有4K字節的ROM和256字節的RAM,兼容MCS-51指令。其中央處理器是8位的,且含有Flash存儲單元,功能非常強大。

AT89C51單片機具有以下標準的功能:一個8位CPU頻率范圍1.2-12MHZ,4K字節Flash閃存,256字節內部數據存儲器RAM,4個8位并行I/O口,一個全雙工串行口,2個16位定時/計數器,5個中斷源的中斷控制系統,片內自帶振蕩器和時鐘電路。

AT89C51單片機管腳圖如3.3所示:

                  


3.3AT89C51單片機

各管腳功能如下[8]:

VCC:40引腳接5V供電電壓。

GND:20引腳接地。

XTAL1:19引腳為單片機提供外部時鐘信號,外接石英晶體和微調電容。

XTAL2:18引腳為單片機提供外部時鐘信號,外接石英晶體和微調電容。

P0口:P0.7~P0.0,這組引腳共8條,其中P0.7為最高位,P0.0為最低位。是漏極開路的8位準雙向I/O口,有兩種功能。第一:做通用I/O口,無片外內存時,P0口可做通用I/O接口使用。第二:做地址/數據口,在訪問外部內存時,用作地址總線的低8位和數據總線。

P1口:P1.7~P1.0,其中P1.7為最高位,P1.0為最低位,僅用作I/O口。

P2口:P2.7~P2.0,其中P2.7為最高位,P2.0為最低位。P2口是帶內部上拉電阻的8位準雙向I/O接口,具有兩種功能。第一:做通用I/O口,無片外內存時,P2口可用作通用I/O口。第二:做地址口,在訪問外部內存時,用作地址總線的高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定時計數器的脈沖輸入;P3.5T1定時計數器的脈沖輸入;P3.6WR片外RAM寫信號;P3.4RD片外RAM讀信號。

RST:9引腳復位輸入,高電平有效。

    :29引腳外部程序內存讀信號。當訪問外部程序內存時,此腳定時輸出脈沖作為讀片外程序內存的選通信號,通常接EPROM的OE端。端在每個機器周期中兩次有效,但當訪問外部RAM時,兩次負脈沖不出現。可驅動8個LS型TTL。

ALE/:30引腳地址鎖存允許/編程線,當訪問片外存儲器時,在P0.7~P0.0引腳線上輸出片外存儲器低8位地址的同時還在ALE/線上輸出一個高電位脈沖,其下降沿用于把這個片外存儲器低8位地址鎖存到外部專用地址鎖存器。

/VPP:31引腳內外部程序內存選擇輸入端。=1,CPU訪問片外ROM,并執行其指令。當PC>0FFFH時,自動轉向片外ROM。=0,不論片內是否含有內存,只執行片外ROM的指令。

3.3.2 單片機最小系統電路

單片機工作時需要時鐘信號,時鐘信號通常可由外部方式或者單片機的內部方式提供。本次設計采用內部時鐘方式,利用單片機內部自帶的反相放大器,XTAL2為放大器的輸出端,XTAL1為放大器的輸入端,這兩個引腳外接石英晶體振蕩器和微電容,構成可以自激的振蕩器。本設計在XTAL1和XTAL2外接了一個12MHZ的晶振,30pf的電容[9]。

復位是使單片機回復到初使的狀態,就跟計算機的重啟差不多,并從初始狀態從新工作。單片機是高電平復位,一般有兩種方式:按鍵復位和上電復位,兩種復位方式均可。本次設計采用按鍵復位,當按下按鍵開關S1時,系統復位一次,電阻R2、R3為10k。其時鐘電路與復位電路如圖3.4所示:














3.4最小系統電路

3.4 溫度采集電路設計

3.4.1 DS18B20簡介

DS18B20內部結構主要有四個部分:64位的只讀程序存儲器ROM、溫度傳感器、非揮發的報警觸發器TH和TL、配置寄存器。總共有三個管腳,包含DQ,GND,VDD。其中DQ為數字信號端,GND為電源地,VDD為電源輸入端。

DS18B20的主要性能特點如下:

(1) 僅可用一個端口便可以通信;

(2) 無須外部器件;

(3) DS18B20支持多點組網功能;

(4) 適應電壓范圍廣,電壓范圍為3.0~5.5V;

(5) 待機功耗為零;

(6) 溫度以9位或12位數字;

(7) 具有報警命令識別功能;

(8) 具有負電壓特性,電源接反時,芯片不會燒壞;

DS18B20的管腳圖及部分溫度值與DS18B20輸出的數字量對照表見圖

3.5和表3-1所示:




3.5 DS18B20溫度傳感器






3-1 部分溫度值與DS18B20輸出的數字量對照

溫度值/℃              數字輸出(二進制)         數字輸出(十六進制)
    +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數字溫度傳感器檢測現場溫度,將檢測到的溫度值送入AT89C51單片機的P1.0口,經過單片機處理后顯示此時溫度值,并與設定溫度值做比較,輸出相應占空比的PWM脈沖信號。電路如圖3.6所示:








3.6 溫度采集電路

3.5 溫度顯示電路設計

3.5.1 LED數碼管簡介

本設計選用五個LED數碼管來進行溫度顯示。LED又稱為數碼管,主要是由8個發光二極管構的。LED數碼管按結構可以分為共陰極和共陽極兩種結構,如圖3.7所示:共陰極把8個發光二極管陰極連接在一起,共陽極把8個發光二極管陽極連接在一起。通過編程的方式使單片機的引腳輸出不同的高低電平,便可以得到相應的數字,這種數碼管的顯示方式就被稱做段選碼[10]。







  

3.7 七段LED數碼管


3-2 七段LED數碼管的段選碼

顯示字符
共陰極段碼
共陽極段碼
顯示字符
共陰極段碼
共陽極段碼
0
3fH
C0H
8
7fH
80H
1
06H
F9H
9
6fH
90H
2
5bH
A4H
A
77H
88H
3
4fH
B0H
B
7fH
83H
4
66H
99H
C
39H
C6H
5
6dH
92H
D
3fH
A1H
6
7dH
82H
E
79H
86H
7
07H
F8H
F
71H
8EH


假如一個數碼管采用共陰極接法接入單片機中,想要顯示數字“5”須使a、c﹑d﹑f﹑g這5個二極管同時發光 (即這5個二極管接入高電平),而其他二極管不發光。只要P0口輸入01101101(6dH)即可。字形與段選碼的對照見表3-2。

3.5.2 溫度顯示電路

本次設計主要顯示當前溫度值和預設溫度值,其中前三個LED數碼管顯示當前溫度值,可顯示0到99.9不同的溫度,后兩個LED數碼管顯示之前預設定的溫度值。數碼管顯示采用共陰極接法,其中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 驅蚊電路設計

3.6.1 TCT40-16T超聲波發射器簡介

TCT40-16T是一種較小的超聲波發射器,它能發射出不同頻率的超聲波,適用于家用電器及其他電子設備的超聲波遙控裝置。其器件外觀如圖3.9所示:











              3.9 超聲波發射器TCT40-16T

3.6.2 驅蚊電路

P3.5是單片機定時器T1的時鐘輸出端口,我們可以利用定時器T1輸出頻率為22KHZ的方波信號,并通過并聯反相器增大驅動后送入超聲波發射器TCT40-16T來模擬雄蚊發出的超聲波,進而達到驅蚊目的[11]。驅蚊電路如圖3.10所示:










圖3.10 驅蚊電路

3.7 驅動與調速電路設計

3.7.1 達林頓反相器ULN2803簡介

因為直流電機工作時需要較大的電流,而單片機I/O口輸出的電流都在幾十毫安級別,無法滿足直流電機的工作電流,所以必須要外加驅動電路。在本設計驅動電路中,選用達林頓反向驅動器ULN2803來驅動直流風扇電機。ULN2803在使用時接口非常簡單,并且操作很容易,可為電機提供幾百毫安的驅動電流,它實際上是一個集成芯片,單塊芯片可同時驅動8個直流電機。

ULN2803實際上是16個NPN晶體管組成,總共含有18個引腳。 ULN2803的管腳圖如下圖3.11所示:




                                  圖3.11 ULN2803管腳圖

各引腳簡介如下:      

1-8引腳:8個輸入端口;

9引腳:接地端;

10引腳:為COM端,一般懸空或接電源,但與負載的電源共同接在一起,驅動效果更好,本次設計接12電源。ULN2803可以輸出最大電流可達500毫安,最大電壓可達50V。本系統選用的電機為12V直流無刷電機,所需電流為300毫安左右,因此可用ULN2803來驅動。

11-18引腳:8個輸出端口;

3.7.2 驅動與調速電路

本次設計利用PWM脈沖寬度調制技術對直流電機進行實時調速,風扇分為五檔,預設溫度t0為25度,溫度每增高5度,風扇增加一檔。當當前溫度低于預設溫度時,輸出占空比為0的PWM脈沖,風扇不轉。當當前溫度大于預設溫度時,風扇轉動,并且可以根據當前溫度輸出相應占空比的PWM脈沖,進而實現了對風扇的自動調速。

驅動與調速電路如下圖3.12所示:直流風扇電機與ULN2803的COM端供接12V電源,直流電機另一端接ULN2803的4C,單片機的P3.4口接4B,通過單片機的P3.4口輸出不同占空比的PWM脈沖信號,便可以對直流電機進行調速,系統選用的電機為12V直流無刷電機。

         
                               圖3.12驅動與調速電路

3.8 獨立按鍵電路設計

本次設計需要兩個獨立按鍵S2和S3,主要是用來對預設溫度初值進行調整。當S2每按下一次,預設初值自動加一,S3每按下一次預設溫度初值自動減一。加減采用中斷方式實現,將S2與P3.2相連,S3與P3.3相連。當有鍵按下立刻執行中斷程序,低電平有效。獨立按鍵電路如下圖3.13所示:

                              

















圖3.13 獨立按鍵電路


4 軟件設計

4.1 系統總體軟件設計流程圖

初始化程序后,傳感器采集溫度送入單片機,通過LED顯示。當有鍵按下時處理按鍵,無鍵按下,根據溫度得到不同的轉速,如圖4.1所示:

4.1 軟件總體設計流程圖

4.2 用Keil C51進行程序編寫

Keil C51 軟件目的主要在于解決嵌入式軟件開發商面臨的問題,當有新項目的時候,只需要從設備數據庫選擇使用的設備,uVision IDE 將設置好所有的編譯器,鏈接器和存儲器選項[12]。Keil C51是美國Keil Software公司開發的51系列并且兼容單片機C語言的嵌入式開發軟件,與單片機匯編語言相比,C語言的靈活性更強一點,程序編寫相比于匯編也更簡單,很容易學習和使用,且編寫的函數模塊可移植性強[13]。一般創建一個Keil C51應用程序需要按照下面的步驟:

   (1) 創建一個工程項目文件;

  (2) 為工程項目選擇目標器件;

   (3) 為工程項目設置軟硬件調試環境;

  (4) 創建源程序項目文件;

   (5) 保存創建的源程序項目文件;

  (6) 把源程序文件添加到項目中;

Keil C51使用界面如圖4.2:


                     
4.2Keil C51使用界面


5 系統調試與仿真

5.1 系統軟件調試

源程序通過編譯,只能說明源程序的語法沒有問題,但不能保證程序的邏輯功能和需要的邏輯功能一致,所以還必須對程序進行調試。程序調試時可以采用單步執行或者連續執行,連續執行速度快,但當出錯時不易查出錯誤的地方。單步執行簡單方便,可以檢查每條指令的正確性,但比較繁瑣,消耗大量時間。因此可先連續調試,對有問題的地方在單步調試[14]。

5.2 程序下載

程序調試好以后,就可以下載了,將經過編譯后生成的.HEX文件下載到單片機上,下載在單片機上的程序將在程序存儲器儲存起來,即使掉電后仍然保存,不會因此而丟失。本次設計的總程序清單見附錄2。

5.3 系統仿真

本次設計采用protues軟件進行仿真,Proteus軟件是英國Labcenter electronics 公司出版的EDA工具軟件。它不僅具有其它EDA工具軟件仿真功能,還能仿真單片機及外圍器件。它是目前最好的仿真單片機及外圍器件的工具。Proteus是世界上著名的EDA工具,從原理圖布圖、代碼調試到單片機與外圍電路協同仿真,一鍵切換到PCB設計,真正實現了從概念到產品的完整設計[15]。Proteus  ISIS的工作界面是一種標準的Windows界面,其中包含標題欄、主菜單、標準工具欄、繪圖工具欄、狀態欄、對象選擇按鈕、預覽對象方位控制按鈕、仿真進程控制按鈕、預覽窗口、對象選擇窗口、圖形編輯窗口。



(1) 本次設計的預設溫度值為25度,當當前溫度大于設定溫度時直流電機開始轉動。當當前溫度為26度時直流電機轉動情況如圖5.1所示:








                         圖5.1 當前溫度為26度的轉速情況




(2) 當當前溫度值升高至31度時,其電機轉速如圖5.2所示:顯然轉速較溫度為26的時候有了明顯的增加,表明單片機對電機的轉速控制功能能夠正常實現。

5.2 當前溫度為31度的轉速情況


(3) 當我們通過獨立按鍵S2將預設溫度增加到29大于當前溫度26時,輸出占空比為零的脈沖,直流電機將停止轉動,如圖5.3所示:

5.3 當前溫度小于設定溫度的轉速情


6 結   論

本次設計以單片機AT89C51為主控芯片,硬件主要包含電源電路、單片機最小系統電路、溫度采集電路、溫度顯示電路、獨立按鍵電路、驅蚊電路、驅動與調速電路。用DS18B20溫度傳感器采集當前溫度送入單片機處理,LED數碼管能正常顯示當前溫度和設定溫度,并能根據當前溫度和設定溫度的差值調節風扇轉速,在一定范圍內實現了對風扇的實時調速。獨立按鍵部分也能正常使用,可以調節預設溫度t0的值。同時超聲波發射器也能正常工作,達到了驅蚊目的。

本次設計對于現實生活具有積極的作用,可以用來作為降溫工具,環保且智能,能夠給人帶來很多方便,同時驅蚊的功能在夏季還是很有必要。



附錄一 電路總圖

單片機源程序如下:
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit DQ=P1^0;
  5. sbit key2=P3^2;
  6. sbit key3=P3^3;
  7. sbit P3_4=P3^4;
  8. sbitP3_5=P3^5;
  9. float ff;
  10. uint y3;
  11. uchar shi,ge,xiaoshu,yushe=25;
  12. uchar code dispcode[]={  
  13. 0x3f,0x06,0x5b,0x4f,
  14. 0x66,0x6d,0x7d,0x07,
  15. 0x7f,0x6f,0x77,0x7c,
  16. 0x39,0x5e,0x79,0x71};  //段碼
  17. uchar code tablel[]={
  18. 0xbf,0x86,0xdb,0xcf,
  19. 0xe6,0xed,0xfd,
  20. 0x87,0xff,0xef}; //帶小數點的段碼
  21. uchar dispbitcode[]={    //位選
  22. 0xfe,0xfd,0xfb,0xf7,
  23. 0xef,0xdf,0xbf,0x7f};  
  24. uchar dispbuf[8]={0,0,0,0,0,0,0,0};
  25. void Delay(uint num)// 延時函數
  26. {
  27.               while( --num );
  28. }
  29. void digitalshow(uchar a4,uchar a3,uchar a2,uchar a1,uchar a0)
  30. {
  31.               dispbuf[0]=a0;
  32.               dispbuf[1]=a1;
  33.               dispbuf[2]=a2;
  34.               dispbuf[3]=a3;
  35.               dispbuf[4]=a4;
  36.             
  37.               P2=0xff;
  38.               P0=dispcode[dispbuf[0]];
  39.               P2=dispbitcode[5];
  40.               Delay(1);

  41.               P2=0xff;
  42.               P0=dispcode[dispbuf[1]];
  43.               P2=dispbitcode[4];
  44.               Delay(1);

  45.               P2=0xff;
  46.               P0=dispcode[dispbuf[2]];
  47.               P2=dispbitcode[2];
  48.               Delay(1);

  49.               P2=0xff;
  50.               P0=tablel[dispbuf[3]];
  51.               P2=dispbitcode[1];
  52.               Delay(1);

  53.               P2=0xff;
  54.               P0=dispcode[dispbuf[4]];
  55.               P2=dispbitcode[0];
  56.               Delay(1);
  57. }
  58. void dmsec(uint count)
  59. {   
  60.               uint i;                                          // 1ms延時
  61.               while(count--)
  62.               {
  63.                             for(i=0;i<125;i++){}
  64.               }
  65. }

  66. void tmreset(void)
  67. {                 
  68.               DQ=0;
  69.               Delay(90);                                          // 精確延時 大于 480us
  70.               DQ=1;
  71.               Delay(4);                                          // 90,4 可以小范圍變化
  72. }

  73. void tmpre(void)
  74. {                  
  75.               while(DQ);
  76.               while(~DQ);
  77.               Delay(4);
  78. }

  79. bit tmrbit(void)
  80. {                  
  81.               uint i;
  82.               bit dat;
  83.               DQ=0;
  84.               i++;                                          // i++;大概1us
  85.               DQ=1;
  86.               i++;
  87.               i++;               
  88.               dat=DQ;
  89.               Delay(8);           
  90.               return(dat);
  91. }

  92. uchar tmrbyte(void)  //讀一個比特
  93. {        
  94.               uchar i,j,dat;
  95.               dat=0;
  96.               for(i=1;i<=8;i++)
  97.               {
  98.                             j=tmrbit();
  99.                             dat=(j<<7)|(dat>>1);
  100.               }
  101.               return(dat);
  102. }

  103. void tmwbyte(uchar dat)  //寫一個比特
  104. {            
  105.               uint i;
  106.               uchar j;
  107.               bit testb;
  108.               for(j=1;j<=8;j++)
  109.               {
  110.                             testb=dat&0x01;
  111.                             dat=dat>>1;                            // 從低位開始
  112.                             if(testb)       // Write 1
  113.                             {
  114.                                           DQ=0;                             // 先拉低
  115.                                           i++;
  116.                                           i++;                            // >1us                        
  117.                                           DQ=1;
  118.                                           Delay(4);           
  119.                             }
  120.                             else            // Write 0
  121.                             {
  122.                                           DQ=0;
  123.                                           Delay(4);                        
  124.                                           DQ=1;
  125.                                           i++;
  126.                                           i++;                             // 再拉高                        
  127.                             }
  128.               }
  129. }
  130. void tmstart(void)    //ds1820開始轉換
  131. {  
  132.               dmsec(1);            
  133.     tmreset();
  134.     tmpre();
  135.     dmsec(1);
  136.     tmwbyte(0xcc);                             // skip rom            
  137.     tmwbyte(0x44);                             // 轉換
  138. }
  139. uchar tmrtemp(void)     //讀取溫度
  140. {                 
  141.               uchar a,b;
  142.               tmreset();
  143.               tmpre();
  144.               dmsec(1);
  145.               tmwbyte(0xcc);                             // skip rom
  146.               tmwbyte(0xbe);                                          // 轉換
  147.               a=tmrbyte();                             // LSB低8位
  148.               b=tmrbyte();                            // MSB高8位
  149.               y3=b;
  150.               y3<<=8;
  151.               y3=y3|a;
  152.               ff=y3*0.0625;
  153.               y3=ff*10+0.5;
  154.               return(y3);
  155. }
  156. void keyscan(void)
  157. {
  158.               if(key2==0)
  159.               {
  160.                             dmsec(5);
  161.                             if(key2==0)
  162.                             {
  163.                                           yushe++;
  164.                                           if(yushe==100)
  165.                                                         yushe=25;            
  166.                             }
  167.                             while(!key2);
  168.               }
  169.               else if(key3==0)
  170.               {
  171.                             dmsec(5);
  172.                             if(key3==0)
  173.                             {
  174.                                           yushe--;
  175.                                           if(yushe==0)
  176.                                                         yushe=25;            
  177.                             }
  178.                             while(!key3);            
  179.               }
  180. }
  181. void time0_int(void) interrupt 1            //定時器T0產生不同占空比的PWM
  182. {  uint tmp;
  183.    static unsigned char j;
  184.    TH0=(65536-50000)/256;
  185.    TL0=(65536-50000)%256;
  186.    j=j+1;
  187.    if(tmp<=yushe)
  188.      {
  189.        P3_4=0;
  190.        j=0;                              //占空比00%
  191.      }
  192.    else if((tmp>yushe)&&(tmp<=(yushe+5)))
  193.        {
  194.             if(j==4)
  195.               P3_4=0;
  196.             else if(j==20)
  197.               P3_4=1;
  198.               j=0;
  199.         }                             //占空比為20%
  200.     else if((tmp>(yushe+5))&&(tmp<=(yushe+10)))
  201.        {
  202.             if(j==8)
  203.               P3_4=0;
  204.            else if(j==20)
  205.               P3_4=1;
  206.               j=0;
  207.         }                            //占空比為40%
  208.     else if((tmp>(yushe+10))&&(tmp<=(yushe+15)))
  209.        {
  210.               if(j==12)
  211.                 P3_4=0;
  212.               else if(j==20)
  213.                 P3_4=1;
  214.                 j=0;
  215.         }                         //占空比為60%
  216.     else if((tmp>(yushe+15))&&(tmp<=(yushe+20)))
  217.        {
  218.               if(j==16)
  219.                 P3_4=0;
  220.              else if(j==20)
  221.                 P3_4=1;
  222.                 j=0;
  223.         }                         //占空比為80%
  224.      else if(tmp>(yushe+20))
  225.             P3_4=1;
  226.              j=0;                       //占空比100%
  227. }
  228. void time1_int(void) interrupt 1     //定時器T1產生頻率為22KHz的驅蚊超聲波
  229. {
  230.    P_3.5=!P3_5;
  231.    TH0=(65536-2500)/256;
  232.    TL0=(65536-2500)%256;
  233. ……………………

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

所有資料51hei提供下載:
基于單片機的智能風扇設計.doc (1.66 MB, 下載次數: 128)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1071489 發表于 2023-4-14 14:29 來自觸屏版 | 只看該作者
您好,有源程序和仿真嗎
回復

使用道具 舉報

板凳
ID:1064915 發表于 2023-4-15 08:56 | 只看該作者
完整的一篇文檔
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表