找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11651|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于紅外遙控技術(shù)的智能電風扇

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:200930 發(fā)表于 2017-5-15 14:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

業(yè) 設(shè)計
(申請學士學位)
論文題目基于紅外遙控技術(shù)的智能電風扇
作者姓名       謝志鵬     
所學專業(yè)名稱   自動化
指導(dǎo)教師  鄒國柱
      2017年 4



       生:                    (簽字)
       號:
期:                     
導(dǎo) 師:                    (簽字)
目錄

摘要        1
1 緒論        2
1.1 選題意義        2
1.2 研究現(xiàn)狀        2
1.3 研究內(nèi)容        2
2 系統(tǒng)總體設(shè)計方案        3
2.1設(shè)計思路        3
2.2 系統(tǒng)實現(xiàn)的主要功能        3
3 系統(tǒng)硬件設(shè)計        4
3.1 STC89C52單片機        4
3.1.1 主要特效        4
3.2  STC89C52外圍基本電路設(shè)計        5
3.2.1 電源電路        5
3.2.2 晶振電路        5
3.2.3 復(fù)位電路        6
3.2.4 串口下載回路        6
3.2.5  LED數(shù)碼顯示電路        7
3.2.6 蜂鳴器報警電路        8
3.2.7 按鍵電路        9
3.2.8  DS18B20溫度采集電路        9
3.2.9 紅外收發(fā)控制電路        10
3.2.10 電風扇電極驅(qū)動電路        11
4 系統(tǒng)軟件設(shè)計        11
4.1 軟件程序設(shè)計概述        11
4.2 主流程圖        12
4.3  DS18B20溫度采集和設(shè)置流程圖        13
4.4 電機驅(qū)動流程        13
5 系統(tǒng)的調(diào)試        14
5.1 硬件調(diào)試        14
5.1.1 調(diào)試步驟        14
5.2 系統(tǒng)的軟件調(diào)試         15
5.3 實物功能分析        15
結(jié)論        17
參考文獻        18
附錄        19
附錄1        19
附錄2        20
致謝        39

基于紅外遙控技術(shù)的智能電風扇

摘要:本論文是基于STC89C52單片機為核心,設(shè)計了一種新型智能紅外遙控電風扇控制系統(tǒng)。本系統(tǒng)由紅外發(fā)射接收模塊、液晶顯示模塊、按鍵控制模塊、聲音播報模塊、溫度檢測模塊以及電機控制模塊組成。該系統(tǒng)能夠利用遙控或者按鍵形式實現(xiàn)對電風扇不同檔位的設(shè)置。電風扇的控制是通過遙控實現(xiàn)的,它是基于紅外通信的原理,并且風速高低是利用PWM信號進行調(diào)節(jié)的。在按鍵控制下,系統(tǒng)能夠?qū)崿F(xiàn)聲音提示,液晶顯示單元能夠顯示系統(tǒng)運行的狀態(tài)數(shù)據(jù),充分展示了良好的人機交互界面。本系統(tǒng)實現(xiàn)了電風扇的自動調(diào)速等智能化功能,讓使用者能夠依據(jù)實際使用情況對電風扇的運行方式進行設(shè)置,同時能夠依據(jù)溫度變化進行風速的自動調(diào)整。

1 緒論
1.1 選題意義
電風扇是一種普及程度非常廣泛且年代較長的家用電器,由于空調(diào)的發(fā)展和普及,電風扇越來越不受關(guān)注且市場越來越小。但是電風扇的優(yōu)點仍然是空調(diào)目前所無法替代的。簡單的高中低速已經(jīng)無法滿足人們的生活需求了,操作方便,體積小巧再加上更多智能化人性化的功能相信是如今電風扇的發(fā)展趨勢和出路,由于紅外線遠程遙控的普及以及單片機技術(shù)的發(fā)展,電風扇結(jié)合智能紅外線遠程遙控系統(tǒng)必然會得到優(yōu)秀的產(chǎn)品為人們所喜愛。
1.2 研究現(xiàn)狀
科技日新月異,人們生活節(jié)奏也是越來越快來愈快,同時對生活用品的智能需求也在不斷的提高。無線通信其中之一的產(chǎn)品遙控器的問世,使得各種各樣的遙控設(shè)備一一出現(xiàn),比如各種各樣的空調(diào)、電視、功放、智能冰箱等。這些形形色色的設(shè)備一定程度上給予了人類不斷增長的各種需求。遙控器設(shè)備已經(jīng)出現(xiàn)了六七十年了,而現(xiàn)在普遍使用的紅外遙控則是在上個實際70年代逐漸發(fā)展起來的一種無線遠程智能控制技術(shù),紅外線遙控的原理是通過紅外線來傳輸被控設(shè)備的邏輯信號,以此來實現(xiàn)對被控對象的遠距離操作。具體指的就是由紅外線遙控器的發(fā)射器發(fā)出紅外控制指令信息,之后被控設(shè)備的紅外線接收器件接收到相應(yīng)指令信息后對接收到的相應(yīng)信號進行解碼計算和處理,從而實現(xiàn)紅外線遙控對相應(yīng)設(shè)備的各種各樣用途的遠程操作和控制。紅外線智能遙控優(yōu)點很多,比如它的相對的獨立特性、物理學特性、可見光相似性和一定強度的隱蔽特性。目前,隨著紅外遙控無線技術(shù)的迅速發(fā)展,紅外遙控無線技術(shù)已經(jīng)十分廣泛地應(yīng)用在各種智能電氣設(shè)備上,并且具有不可或缺的最基本的作用,當然本設(shè)計中要研究的紅外遙控智能控制電風扇也是基于于此的。紅外遙控技術(shù)的迅速成熟和十分廣泛應(yīng)用,外加現(xiàn)在的51增強型單片機技術(shù)不斷擴展成熟,也使得電風扇的紅外遙控成為不久將來的發(fā)展大趨勢。實現(xiàn)紅外遙控技術(shù)的方法有很多種,如利用常用的51單片機實現(xiàn)、利用DSP實現(xiàn)等!本設(shè)計則著重考慮使用STC89C52單片機來實現(xiàn)。
1.3 研究內(nèi)容
本課題設(shè)計的是一款基于STC89C52單片機的智能化紅外遙控電風扇。該設(shè)計最突出的特點就是更加人性化。具體功能如下:智能風扇的檔位控制可通過兩種方式實現(xiàn),一是通過功能鍵來實現(xiàn)檔位的設(shè)置,通過設(shè)置風扇座上的三個鍵,來調(diào)節(jié)不同的風速。其次就是通過無線的方式來實現(xiàn)對檔位的設(shè)置,本設(shè)計中采用的是紅外通信的方式實現(xiàn)多檔位風速的設(shè)置,使用者可以用遙控來控制風扇的風速。以往的電風扇仍然以機械旋鈕或者簡單紅外遙控方式為主,無較好的人機界面。本次設(shè)計增加了顯示功能和聲音提示功能,LED數(shù)碼管可以將風扇的各種運行狀態(tài)顯示出來,在風扇的控制過程有提示音,使用戶可以更加舒適、方便地使用?紤]到不同環(huán)境下的各種情況,本設(shè)計增加了自動調(diào)速系統(tǒng),風扇可以根據(jù)室內(nèi)的溫度變速運行,當溫度低于一定溫度時,就自動關(guān)閉,高于該溫度值就會繼續(xù)工作。

2 系統(tǒng)總體設(shè)計方案
2.1設(shè)計思路
基于宏晶公司生產(chǎn)的STC89C52系列單片機為控制核心的紅外智能遙控電風扇系統(tǒng)最主要的功能是實現(xiàn)電風扇風速的調(diào)節(jié)控制,基于宏晶公司生產(chǎn)的STC89C52系列單片機為控制核心的紅外智能遙控電風扇系統(tǒng)上電運行后,如果調(diào)到自動模式,系統(tǒng)會先判斷根據(jù)DS18B20溫度傳感器采集到的實際溫度值是否低于溫度低限值,如果低于溫度低限值,風扇停止轉(zhuǎn)動;如果當前環(huán)境溫度值處在溫度低限值和溫度高限值之間,風速低速轉(zhuǎn)動;如果當前環(huán)境溫度值高于溫度高限值,風速高速轉(zhuǎn)動。如果選擇的是手動模式,則整個風扇的轉(zhuǎn)速則有三檔風速可供選擇。風扇電機驅(qū)動則都是依靠PWM信號來進行控制,同時整個風速自動和手動模式選擇、溫度高限值和低限值的設(shè)置和手動模式下風扇風速的選擇都可以選擇本地按鍵方式或者紅外遙控方式進行設(shè)置,且當采集到的環(huán)境溫度高于溫度的設(shè)置高限值,蜂鳴器就會發(fā)出報警信號。設(shè)計出這樣的系統(tǒng)同時也具有低功耗、節(jié)約能源等特點,也最大化的方便了用戶使用。綜上所述此系統(tǒng)主要包括單片機核心控制器、單片機電源電路、單片機晶振電路、單片機復(fù)位電路、單片機串口通信電路、DS18B20溫度采集電路、紅外收發(fā)控制部分、按鍵電路、蜂鳴器輸出電路、LED數(shù)碼管顯示電路、電風扇電機驅(qū)動電路等。其基本系統(tǒng)框圖如下所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsCFEF.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD000.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD001.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD002.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD003.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD004.tmp.png溫
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD014.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD015.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD016.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD017.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD018.tmp.png


2-1基本系統(tǒng)框圖
2.2 系統(tǒng)實現(xiàn)的主要功能
1)通過DS18B20溫度傳感器采集溫度并在LED數(shù)碼管上予以顯示;
2)通過按鍵或者紅外遙控器可以對溫度上下限值進行設(shè)置;
3)亦可通過按鍵或者紅外遙控器可以對系統(tǒng)工作模式進行選擇;
4)通過蜂鳴器輸出報警信號;
5)通過PWM信號對電風扇電機進行有效控制。
3 系統(tǒng)硬件設(shè)計
3.1 STC89C52單片機
STC89C52RC控制器是一個叫STC的公司制造的一種功耗低、性能好的CMOS8位微控制器, 8K字節(jié)的系統(tǒng)可以使用Flash存儲器。STC89C52應(yīng)用的是典型的MCS-51內(nèi)核,不過通過了很多的改善讓芯片擁有了傳統(tǒng)51單片機沒有的的功能和特性。單芯片上,擁有靈活的8 位數(shù)的CPU 和在系統(tǒng)可編程Flash,讓STC89C52給很多的嵌入式控制系統(tǒng)給予了靈活程度高,效果好的解決方案。
具有以下標準功能: 8k字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗定時器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,總共有3個16 位數(shù)的定時器和計數(shù)器,一個7向量的4級中斷結(jié)構(gòu)(同時容納典型51的5向量2級中斷結(jié)構(gòu)),還有4個外部中斷,全雙工串行口。同時 STC89C52 還可以降低到0Hz 的靜態(tài)邏輯操作,有2種軟件被支持可以選擇的模式是節(jié)電的模式。在空閑的模式時,CPU 是不在運行的,不過RAM、定時器/計數(shù)器、串口、中斷依然在運行。在選擇掉電保護這種模式時,RAM內(nèi)容被保存,振蕩器被固定住了,單片機說有的運行被截止,一直到下一個中斷或硬件層面的恢復(fù)。最高運作頻率35MHz,6T/12T可選。
3.1.1 主要特效
1)8K字節(jié)程序存儲空間;
2)512字節(jié)數(shù)據(jù)存儲空間;
3)內(nèi)帶4K字節(jié)EEPROM存儲空間;
4)可直接使用串口下載。
PDIP封裝,其封裝圖如下圖所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD029.tmp.jpg
3-1STC89C52RC引腳圖
3.2  STC89C52外圍基本電路設(shè)計
3.2.1 電源電路
電源電路也就是給耗電器件提供電力的電源部分的電路設(shè)計,應(yīng)用的的電路特點以及方式。經(jīng)常碰到的電源電路有交流和直流電源電路等等。該STC89C52系列單片機電源采用直流5V供電,供電電源可采用USB供電或者外部電池盒供電,設(shè)計的電路如下圖所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD02A.tmp.jpg
3-2電源電路圖
3.2.2 晶振電路
單片機的系統(tǒng)里晶振是不可或缺的,晶體震蕩器是它的全稱,晶振的作用在單片機里非常大,他通過與內(nèi)部電路的配合,時鐘頻率在單片機系統(tǒng)里由此產(chǎn)生,在這個基礎(chǔ)之上,單片機的所有指令得以運轉(zhuǎn),晶振的提供的時鐘頻率越高,要想單片機的運轉(zhuǎn)速度快,那么晶振給予的時鐘頻率就有夠高。
晶振通過一類晶體,這種晶體能使機械能和電能互相轉(zhuǎn)化,并且在共振的狀態(tài)下運行,由此保持穩(wěn)定,精準的單頻振蕩。在一般的情況下,一般的晶振頻率可以達到百分之五十的絕對精度。高級的精度更高。還有的晶振能通過外加電壓調(diào)整頻率,不過要在一定的范圍內(nèi),名字就叫壓控振蕩器。
晶振的能力是給系統(tǒng)基礎(chǔ)的時鐘訊號。一個晶振一般情況下被一個系統(tǒng)共同使用,這樣各部分的同步能有所保障。但是有的通訊系統(tǒng)的射頻和基頻是被不同的晶振提供的時鐘信號的,電子調(diào)頻是用來保持同步的方式。鎖相環(huán)電路一般情況下與晶振結(jié)合應(yīng)用,系統(tǒng)需要的時鐘頻率由此提供。要是差異的子系統(tǒng)要用到不同頻率的時鐘信號,能讓與同一個晶振相配合的不同鎖相環(huán)來供應(yīng)。
本系統(tǒng)中晶振電路設(shè)計如下:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD03B.tmp.jpg
3-3晶振電路圖
3.2.3 復(fù)位電路
復(fù)位電路,能讓電路回到到一開始的情況。猶如計算器的清零功能,方便回歸到起始狀況,重新進行其他操作。但是與之不一樣的是,復(fù)位電路開啟的方式不太一樣。一種是在電路一通電就立即復(fù)位;二是在必要時可以由手動操作;還有就是在系統(tǒng)需要的時候進行。大多數(shù)的復(fù)位電路一般較為容易,很多電阻電容相結(jié)合就能做到,復(fù)雜一點的能就是用程序和三極管以及其他的器件來運行。
為了能讓微機系統(tǒng)的電路不亂可靠的運行,復(fù)位電路是必不可少的一方面,復(fù)位電路首先就是要能夠上電復(fù)位。普通的微機電路在一般情況下運行用電電壓是5V±5%,也就是4.75~5.25V。因為微機電路是一種時序電路,不亂的時鐘信號是必不可少的,所有打開電源的時候,只能在VCC低于5.25V高于4.75V并且晶體振蕩器也在正常運行的時候,微機電路才能正常運行,復(fù)位信號也撤銷了。
當今,單片機的復(fù)位電路一般有四種:
1)微分型復(fù)位電路;
2)積分型復(fù)位電路;
3)比較器型復(fù)位電路;
4)看門狗型復(fù)位電路。
單片機系統(tǒng)的復(fù)位方式有:手動按鈕復(fù)位和上電復(fù)位。
    本系統(tǒng)設(shè)計的復(fù)位電路如下所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD03C.tmp.jpg
3-4復(fù)位電路圖
3.2.4 串口下載回路
STC89C52系列單片機可以直接通過串口或者使用USB轉(zhuǎn)TTL即可下載程序,優(yōu)點是省去購買通用編程器,單片機在用戶系統(tǒng)上就能下載或者燒錄用戶程序,并且還不要把單片機卸下來,直接就能把程序代碼燒錄進單片機里面。從 RxD/P3.0 檢驗到合理的下載指令流就下載用戶程序,如果檢驗不到就自動復(fù)位到用戶的程序區(qū)。設(shè)計的電路圖如下所示:

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD03D.tmp.jpg
3-5串口下載電路圖
下載軟件則使用宏晶公司研發(fā)的STC-ISP軟件,軟件截圖如下所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD03E.tmp.jpg
3-7STC-ISP軟件界面
3.2.5  LED數(shù)碼顯示電路
LED數(shù)碼顯示電路用來顯示當前環(huán)境實時溫度值,當進入設(shè)置界面時,則用來顯示設(shè)置的溫度高限值和低限值以及手動模式下的三檔風速。該設(shè)計中的LED數(shù)碼管顯示電路使用的是4位8段共陽極數(shù)碼管,各位數(shù)碼管分別使用三極管9012進行信號放大,其中段選信號的A、B、C、D、E、F、G、DP分別使用P1.2、P1.0、P1.4、P1.6、P1.7、P1.1、P1.3、P1.5,位選信號分別使用P3.4、P3.5、P3.6、P3.7口。設(shè)計的電路圖如下所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD04E.tmp.jpg
3-8 LED數(shù)碼管顯示電路
3.2.6 蜂鳴器報警電路
蜂鳴器簡單來說就是電子訊響器,結(jié)構(gòu)是一體化的,供電方式是直流電壓的供電方式,通常能在于各種生活中常見的電子物件中找到作發(fā)聲器件比如電視機洗衣機等等。蜂鳴器有兩種類型,電磁式蜂鳴器和壓電式蜂鳴器。
本設(shè)計中采用有緣蜂鳴器,采用三極管9012進行驅(qū)動放大,供電電源為直流5V,其設(shè)計電路如下所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD04F.tmp.jpg
3-9蜂鳴器報警電路圖
3.2.7 按鍵電路
按鍵在我們的生活中也非常常見,是一種控制用的元件,一般都是用來通斷‘控制電路’(一般電流都很。,然后使得電動機等等各種各樣的設(shè)備根據(jù)人的命令運行的器件?煞譃槌i_按鍵、常閉按鍵、常開常閉按鍵和動作點擊按鍵等。按鍵這種器件在很多地方都能得到運用,比如車床的停機與起動、反轉(zhuǎn)與正轉(zhuǎn)等;塔吊的停止,啟動,還有下降,上升,以及速度的各種控制等等時代的進步,社會的發(fā)展,創(chuàng)新水平的提升,按鍵一直都是大量產(chǎn)品的最基本人機接口工具,外形的也變的美觀個性化。本設(shè)計中采用的4腳常開直徑為6mm的按鍵,使用P2.0、P2.1、P2.2三個IO口,第一個按鍵用來切換模式,第二個按鍵和第三個按鍵用來設(shè)置溫度上下限時增加或減少,其設(shè)計的電路圖如下所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD050.tmp.jpg
3-10按鍵電路圖
3.2.8  DS18B20溫度采集電路
DS18B20是普遍的溫度傳感器,小巧輕便,價格便宜,抗干擾能力極強,精度也很高!它的輸入輸出時序和測溫方法和DS18B20差不多,不過由此得到的溫度數(shù)值有幾位會被分辨率影響,而且溫度轉(zhuǎn)變的時間也減小了很多。
DS18B20數(shù)字溫度傳感器在安裝的時候也很容易,做好后能在很多地方用到,比如不銹鋼封裝式,磁鐵吸附式等等等等型號很多,有LTM8874,LTM8877等。主要根據(jù)應(yīng)用場合的不同而改變其外觀。裝好的DS18B20能被應(yīng)用在高爐水循環(huán)測溫,機房測溫,鍋爐測溫,農(nóng)業(yè)大棚測溫,彈藥庫測溫等各種各樣的溫度差異不是非常大的地方。小巧輕便,非常耐用,用起來也很容易,封裝的方式也很多,適用于各種各樣的非常復(fù)雜的場合的空間設(shè)備數(shù)字測溫和控制場合。
DS18B20的控制方法如下所示:
1)溫度轉(zhuǎn)換 44H 啟動DS18B20進行溫度轉(zhuǎn)換
2)讀暫存器 BEH 讀暫存器9字節(jié)二進制數(shù)字
3)寫暫存器 4EH 將數(shù)據(jù)寫入暫存器的TH、TL字節(jié)
4)復(fù)制暫存器 48H 把暫存器的TH、TL字節(jié)寫到E2PROM中
5)重新調(diào)E2PROM B8H 把E2PROM中的TH、TL字節(jié)寫到暫存器TH、TL字節(jié)
6)讀電源供電方式 B4H 啟動DS18B20發(fā)送電源供電方式的信號給主CPU
設(shè)計的電路中使用P2.4口,電路設(shè)計如下:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD061.tmp.jpg
3-11溫度采集電路圖
3.2.9 紅外收發(fā)控制電路
紅外線編碼是傳導(dǎo)信號還有日常使用的電器遠程控制的典型的一種控制操作方法,它實際上就是一種脈寬調(diào)制的串行通訊。常用的家用遠程控制一般用的紅外編碼電路是μPD6121G型7461型和HT622型。本設(shè)計就是通過這些電路相應(yīng)的編碼格式太探討如何運用單片機來讓它解碼的,其中用到了單片機的捕獲中斷功能。
紅外信號的發(fā)送方面大部分是通過讓待發(fā)送的信號轉(zhuǎn)變成一種脈沖,之后控制紅外發(fā)光管發(fā)送信號。收到信號的方面就是實現(xiàn)紅外的放大、接受然后解調(diào),再變回同步發(fā)射格式相同(但高、低電位剛好相反的脈沖信號。這些操作一般都是通過接收頭來實現(xiàn),這種接收頭是一體化的。一般放出TTL兼容電平。之后經(jīng)由解碼使脈沖信號變成數(shù)據(jù),然后就使得數(shù)據(jù)的傳送。如圖所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD062.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD063.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD064.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD065.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD066.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD076.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD077.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD078.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD079.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD07A.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD07B.tmp.png

3-12紅外收發(fā)系統(tǒng)框圖
本設(shè)計中使用的IO口為P3.2口,設(shè)計的電路如下所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD07C.tmp.jpg
3-13紅外收發(fā)控制電路圖
3.2.10 電風扇電極驅(qū)動電路
使用三極管9012進行信號放大,所用IO口P2.3用來輸出PWM信號,根據(jù)信號最后控制電風扇完成各個檔位風速的運行。設(shè)計的電路如下所示:

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD07D.tmp.jpg
3-14電風扇電機驅(qū)動電路圖
4 系統(tǒng)軟件設(shè)計
4.1 軟件程序設(shè)計概述
在單片機系統(tǒng)程序的設(shè)計開發(fā)中,單片機是整個系統(tǒng)的核心部分,各個部分模塊化的程序就是整個系統(tǒng)的組成成份。軟件編寫的好不好,運用的語句有沒有簡單明了會影響單片機的運行效果。在每一個模塊化的運行程序里面一定要用簡潔少的語句做盡量多的任務(wù),不要使語句表達出有問題的意思,如此這般就能讓整個系統(tǒng)更好的運轉(zhuǎn),讓單片機工作能力很大的提升。現(xiàn)在就對這次的畢業(yè)設(shè)計的軟件方面作些闡述。
4.2 主流程圖
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD08E.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD08F.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD090.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD091.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD092.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD093.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD094.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0A5.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0A6.tmp.png        是
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0A7.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0A8.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0A9.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0AA.tmp.png        是
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0AB.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0AC.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0AD.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0AE.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0BE.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0BF.tmp.png        是
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C0.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C1.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C2.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C3.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C4.tmp.png
4-1主流程框圖








4.3  DS18B20溫度采集和設(shè)置流程圖
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C5.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0C6.tmp.png

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0D7.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0D8.tmp.png

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0D9.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0DA.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0DB.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0DC.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0DD.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0DE.tmp.png


file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0DF.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0E0.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F1.tmp.png                   異常
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F2.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F3.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F4.tmp.png        正常
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F5.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F6.tmp.png

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F7.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F8.tmp.png
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0F9.tmp.png


file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD0FA.tmp.png

4-2 DS18B20溫度采集和設(shè)置流程圖


4.4 電機驅(qū)動流程
邏輯判斷十分簡單,當前溫度低于溫度下限值時,風速停止運轉(zhuǎn);當前溫度值處于溫度低限值和溫度高限值之間時,風扇低速運轉(zhuǎn);當前溫度值高于溫度高限值時,風速高速運轉(zhuǎn),其設(shè)計的電機驅(qū)動程序如下所示:
void fengshan_kz()
{
        if(temperature >= t_high)          //風扇全開
        {        
                TR1 = 0;
                pwm = 0;
        }
        else if((temperature < t_high)        && (temperature >= t_low))                   //風扇緩慢
        {
                f_pwm_l = 60;         
                TR1 = 1;
        }
        else if(temperature < t_low)         //關(guān)閉風扇
        {
                TR1 = 0;
                pwm = 1;
        }                        
}
5 系統(tǒng)的調(diào)試
電路板的焊接安裝以及調(diào)試在整個硬件制作里面是非常重要的,其是從理論上向?qū)嶋H邁步的關(guān)鍵,也是把理論變?yōu)閷嶋H所必不可少的。對于初步的電路板的制作主要是兩種方法:焊接或者面包板焊接。面包板焊接相對要更加的簡易一些,方便替換一些器件,并且能多次使用。這次設(shè)計主要要用到的設(shè)備有:信號發(fā)生器、萬用表、示波器等。
5.1 硬件調(diào)試
5.1.1 調(diào)試步驟
1)不加電源的檢查
首先對應(yīng)電路圖,電路的連線有沒有錯誤的地方,有沒有多余接線、錯誤接線、應(yīng)該接卻沒有接線的情況等。用萬用表檢查接線的優(yōu)良程度,各個器件的連接有沒有問題。通過細心的檢查,發(fā)現(xiàn)并且解決了很多的問題,避免了很多的麻煩。
2)靜態(tài)檢測與調(diào)試
將信號源斷開,把正確的電源接入電路,將萬用表調(diào)到電壓檔,來監(jiān)測電源電壓,看是否有異,F(xiàn)象,如:手摸元器件發(fā)燙、異常氣味、電源短路、冒煙等,如果發(fā)現(xiàn)有異常狀況,應(yīng)立即切斷電源,然后排除故障。如果電路在測試后無上述異常情況,然后測量關(guān)鍵處的直流電壓,如:放大電路輸入、輸出端直流電壓、靜態(tài)工作點等,看是否在正常工作狀態(tài)下,如果有個別電路不符,經(jīng)過調(diào)整電路元器件參數(shù)、更換元器件,使電路最終工作在合適的工作狀態(tài)。 對于放大電路我們還用示波器觀察是否有自激發(fā)生。結(jié)果一切正常。
3)動態(tài)檢測與調(diào)試
動態(tài)調(diào)試是在靜態(tài)調(diào)試的基礎(chǔ)上進行的,調(diào)試的方法地在電路的輸入端加上所需的信號源,并循著信號的注射逐級檢測各有關(guān)點的波形、參數(shù)和性能指標是滿足設(shè)計要求,如必要,要對電路參數(shù)作進一步調(diào)整。發(fā)現(xiàn)問題,要設(shè)法找出原因,排除故障,繼續(xù)進行。我們所設(shè)計的遙控器電路是采用碼分制遙控方式,我們用示波器對發(fā)射電路輸出端及接收電路輸入端的信號波型的進行了檢查,發(fā)現(xiàn)當按下不同的開關(guān)按鈕時所顯示的波型是不同的。這說明了此電路是工作在正常狀態(tài)的。
5.2 系統(tǒng)的軟件調(diào)試
在完成系統(tǒng)硬件的檢查后主要是對軟件進行調(diào)試,對遙控器的調(diào)試主要是用示波器觀察能否在遙控接收器中輸出相應(yīng)的波形,調(diào)整發(fā)射電阻的大小可以改變紅外線發(fā)射的作用距離。其性能指標調(diào)試后系統(tǒng)性能指標測試如下:最大遙控距離:10m 發(fā)射接收角:水平最大90度 硬件電路制作完成并調(diào)試好后,便可將程序編譯好下載到單片機試運行。
5.3 實物功能分析
如圖所示,按下電源鍵后,智能電風扇啟動,如下圖為初始化界面,數(shù)碼管顯示當前環(huán)境溫度,且為自動調(diào)速模式。當溫度低于最小值是風扇不轉(zhuǎn),當溫度高于最小值且低于最大值時風扇低速轉(zhuǎn)速運轉(zhuǎn),當溫度高于最大值時高速運轉(zhuǎn)。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD10A.tmp.jpg
5-1智能溫控模式工作圖
按下設(shè)置鍵,電風扇處于最大值的設(shè)定界面如圖,此時可以用加減鍵設(shè)定最大溫度設(shè)定值。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD10B.tmp.jpg




















5-2最大溫度值設(shè)置圖
再次按下設(shè)置鍵,電風扇處于最小值的設(shè)定界面如圖,此時可以用加減鍵設(shè)定最小溫度設(shè)定值。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD10C.tmp.jpg








5-3最小溫度值設(shè)置圖
再次按下設(shè)置鍵,電風扇切換為手動擋時,界面如下,此時可以通過加減鍵選擇三個風速的檔位。



file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD11D.tmp.jpg









5-4手動擋工作圖
以上所有的功能選擇或設(shè)置都可以用按鍵或者紅外遙控器完成。

結(jié)論

本文章主要設(shè)計了一種智能的紅外線遙控電風扇,整個系統(tǒng)通過紅外線接收發(fā)射模塊、電機控制模塊、溫度檢測模塊、按鍵操作控制模塊、還有液晶屏幕顯示模塊組成。整個電風扇系統(tǒng)是通過STC12系列單片機形成了用三個按鍵操控多種工作模式的切換以及風速的切換,三個按鍵分別為增加鍵,功能鍵和減小鍵,能夠由需要配置電風扇的工作模式。而且,在設(shè)置的時候,在電風扇基礎(chǔ)功能的前提下,還配置了聲音提醒等功能。本文還描述了用紅外線遠程操控檔位,如此這般就能夠?qū)崿F(xiàn)舒適地用遙控器來操控風扇的啟動與停止了,操作使用非常方便。電風扇的操控是經(jīng)由遙控器實現(xiàn)的,它的基礎(chǔ)是紅外線通信的原理,且風速的大小也是通過PWM信號來調(diào)節(jié)控制的。電風扇還有良好的顯示界面,電風扇和人的交互方面也非常好。本設(shè)計通過對智能電風扇的簡單的功能增加,例如風速自動控制等,讓電風扇更加的齊全可靠,使用更加舒適。




參考文獻

[1]陳靜, 史雪飛. “模擬電子技術(shù)”課程中若干關(guān)鍵問題的探討[J]. 電氣電子教學學報,2014, 36(1):59-60.
[2]張毅剛 王少軍 付寧. 單片機原理及接口技術(shù)[M]. 人民郵電出版社, 2015.
[3]波形發(fā)生器.歷屆全國大學生電子競賽SPCE061A實現(xiàn)方案.北京北陽電子技術(shù)有限公司,2014
[4]吳凌鸝. 微機備用電源自動投入裝置現(xiàn)場運行分析[J]. 中國電子商務(wù),2014(22):269-270.
[5] Vajpayee P. An ultra-high gain low power two stage CMOS op-amp based on inverse aspect ratio self cascode structures[J]. Analog Integrated Circuits & Signal Processing, 2014, 81(2):349-359.
[6]Marchisio M A. In silico, design and in vivo, implementation of yeast gene Boolean gates[J]. Journal of Biological Engineering, 2014, 8(1):6-6.  
[7]劉慧勇 .楊虹,基于STM32的智能電風扇設(shè)計[M].2014
[8]佚名. 電子線路設(shè)計·實驗·測試[M]. 電子工業(yè)出版社, 2014.
[9]王爽.英飛凌XE166/XC2000單片機開發(fā)與應(yīng)用實例[M].電子工業(yè)出版社,2014.6.  
[10]陸超逸 石杰元 基于MSP430和Android溫控距控智能電風扇設(shè)計.電子世界.2016.10.
[11]唐曉珊.管瓊.李運彪.王歡 電風扇自動溫控裝置設(shè)計.電子設(shè)計工程.2016.12
[12]蔣小軍.基于單片機的智能溫控風扇.科技展望.2016.13
[13王文江.]基于物聯(lián)網(wǎng)技術(shù)的教室智能用電系統(tǒng)設(shè)計與實現(xiàn).中國科技信息.2016.2.











附錄
附錄1
系統(tǒng)總電路圖:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD11E.tmp.jpg













附錄2
完整的程序:
#include <reg52.h>                 //調(diào)用單片機頭文件
#define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
#define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535

//數(shù)碼管段選定義      0     1    2    3    4    5        6         7          8           9        
uchar code smg_du[]={0x28,0xee,0x32,0xa7,0xe4,0xa1,0x51,0xea,0x80,0xa0,
                                           0x60,0x25,0x39,0x26,0x31,0x71,0xff};         //斷碼
//數(shù)碼管位選定義
uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};
uchar dis_smg[8] = {0x28,0xee,0x32,0xa2,0xe4,0x92,0x82,0xf8};        
uchar smg_i = 3;    //顯示數(shù)碼管的個位數(shù)
sbit dq   = P2^4;        //18b20 IO口的定義
sbit beep = P3^3;  

bit flag_lj_en;                 //按鍵連加使能
bit flag_lj_3_en;         //按鍵連3次連加后使能  加的數(shù)就越大了
uchar key_time,key_value;      //用做連加的中間變量
bit key_500ms  ;
sbit pwm = P2^3;  
uchar f_pwm_l ;          //越小越暗

uint temperature ;  //
bit flag_300ms ;
uchar menu_1;       //菜單設(shè)計的變量
uint t_high = 300,t_low = 100;           //溫度上下限報警值

//數(shù)碼管位選定義
sbit smg_we1 = P3^7;            //數(shù)碼管位選定義
sbit smg_we2 = P3^6;
sbit smg_we3 = P3^5;
sbit smg_we4 = P3^4;

uchar danwei;

/***********************1ms延時函數(shù)*****************************/
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}

/***********************小延時函數(shù)*****************************/
void delay_uint(uint q)
{
        while(q--);
}

/***********************數(shù)碼位選函數(shù)*****************************/
void smg_we_switch(uchar i)
{
        switch(i)
        {
                case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
                case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 0; break;
                case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
                case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
        }        
}


/***********100us的延時函數(shù)***12M晶振**************/
void delay_100us(uchar z)
{                                //12M
   uchar x,y;
   for(x=0;x<z;x++)
     for(y=0;y<20;y++);
}

uchar flag_moshi;

sbit hw_P32=P3^2;           //紅外遙控IO口的定義
bit flag_jiema_en = 0; //紅外解碼成功標志位
uchar hw_table[4];           //紅外解碼數(shù)據(jù)緩沖區(qū)

/***********************數(shù)碼顯示函數(shù)*****************************/
void display()
{
        static uchar i;   
        i++;
        if(i >= smg_i)
                i = 0;        
        P1 = 0xff;                         //消隱
        smg_we_switch(i);                 //位選
        P1 = dis_smg;                 //段選               

}


/***********************18b20初始化函數(shù)*****************************/
void init_18b20()
{
        bit q;
        dq = 1;                                //把總線拿高
        delay_uint(1);            //15us
        dq = 0;                                //給復(fù)位脈沖
        delay_uint(80);                //750us
        dq = 1;                                //把總線拿高 等待
        delay_uint(10);                //110us
        q = dq;                                //讀取18b20初始化信號
        delay_uint(20);                //200us
        dq = 1;                                //把總線拿高 釋放總線
}

/*************寫18b20內(nèi)的數(shù)據(jù)***************/
void write_18b20(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {                                         //寫數(shù)據(jù)是低位開始
                dq = 0;                         //把總線拿低寫時間隙開始
                dq = dat & 0x01; //向18b20總線寫數(shù)據(jù)了
                delay_uint(5);         // 60us
                dq = 1;                         //釋放總線
                dat >>= 1;
        }        
}

/*************讀取18b20內(nèi)的數(shù)據(jù)***************/
uchar read_18b20()
{
        uchar i,value;
        for(i=0;i<8;i++)
        {
                dq = 0;                         //把總線拿低讀時間隙開始
                value >>= 1;         //讀數(shù)據(jù)是低位開始
                dq = 1;                         //釋放總線
                if(dq == 1)                 //開始讀寫數(shù)據(jù)
                        value |= 0x80;
                delay_uint(5);         //60us        讀一個時間隙最少要保持60us的時間
        }
        return value;                 //返回數(shù)據(jù)
}

/*************讀取溫度的值 讀出來的是小數(shù)***************/
uint read_temp()
{
        uint value;
        uchar low;                           //在讀取溫度的時候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會影響到18b20的時序
        init_18b20();                   //初始化18b20
        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0x44);           //啟動一次溫度轉(zhuǎn)換命令
        delay_uint(50);                   //500us

        init_18b20();                   //初始化18b20

        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0xbe);           //發(fā)出讀取暫存器命令

        low = read_18b20();           //讀溫度低字節(jié)
        value = read_18b20();  //讀溫度高字節(jié)

        value <<= 8;                   //把溫度的高位左移8位
        value |= low;                   //把讀出的溫度低位放到value的低八位中
        value *= 0.625;               //轉(zhuǎn)換到溫度值 小數(shù)
        return value;                   //返回讀出的溫度 帶小數(shù)
}

/*************定時器0初始化程序***************/
void time_init()         
{
        EA   = 1;                   //開總中斷
        TMOD = 0X11;          //定時器0、定時器1工作方式1
        ET0  = 1;                  //開定時器0中斷
        TR0  = 1;                  //允許定時器0定時

        ET1  = 1;                  //開定時器0中斷
}

/********************獨立按鍵程序*****************/
uchar key_can;         //按鍵值

void key()         //獨立按鍵程序
{
        static uchar key_new;
        key_can = 20;                   //按鍵值還原
        P2 |= 0x07;
        if((P2 & 0x07) != 0x07)                //按鍵按下
        {
                if(key_500ms == 1)        //連加
                {
                        key_500ms = 0;
                        key_new = 1;
                }
                delay_1ms(1);                     //按鍵消抖動
                if(((P2 & 0x07) != 0x07) && (key_new == 1))
                {                                                //確認是按鍵按下
                        key_new = 0;
                        switch(P2 & 0x07)
                        {
                                case 0x06: key_can = 1; break;           //得到k2鍵值
                                case 0x05: key_can = 2; break;           //得到k3鍵值
                                case 0x01: key_can = 3; break;           //得到k4鍵值
                        }
                        flag_lj_en = 1;         //連加使能
                }                        
        }
        else
        {
                if(key_new == 0)
                {
                        key_new = 1;
                        flag_lj_en = 0;                //關(guān)閉連加使能
                        flag_lj_3_en = 0;        //關(guān)閉3秒后使能
                        key_value = 0;                //清零
                        key_500ms = 0;
                }
        }        
}

/****************按鍵處理數(shù)碼管顯示函數(shù)***************/
void key_with()
{

        if(key_can == 1)          //設(shè)置鍵
        {
                f_pwm_l = 30;
                menu_1 ++;
                flag_moshi = 0;   //自動模式
                if(menu_1 >= 4)
                {
                        menu_1 = 0;
                        smg_i = 3;                  //數(shù)碼管顯示3位
                }
        }
        if(menu_1 == 1)                        //設(shè)置高溫報警
        {
                smg_i = 4;                  //數(shù)碼管顯示4位
                if(key_can == 2)
                {
                        if(flag_lj_3_en == 0)
                                t_high ++ ;                //按鍵按下未松開自動加三次        
                        else
                                t_high += 10;        //按鍵按下未松開自動加三次之后每次自動加10
                        if(t_high > 990)
                                t_high = 990;
                }
                if(key_can == 3)
                {
                        if(flag_lj_3_en == 0)
                                t_high -- ;                //按鍵按下未松開自動減三次        
                        else
                                t_high -= 10;        //按鍵按下未松開自動減三次之后每次自動減10
                        if(t_high <= t_low)
                                t_high = t_low + 1;
                }
                dis_smg[0] = smg_du[t_high % 10];                   //取小數(shù)顯示
                dis_smg[1] = smg_du[t_high / 10 % 10] & 0xdf;  //取個位顯示
                dis_smg[2] = smg_du[t_high / 100 % 10] ;           //取十位顯示
                dis_smg[3] = 0x64;         //H
        }        
        if(menu_1 == 2)                        //設(shè)置低溫報警
        {
                smg_i = 4;                  //數(shù)碼管顯示4位
                if(key_can == 2)
                {
                        if(flag_lj_3_en == 0)
                                t_low ++ ;                        //按鍵按下未松開自動加三次        
                        else
                                t_low += 10;                //按鍵按下未松開自動加三次之后每次自動加10
                        if(t_low >= t_high)
                                t_low = t_high - 1;
                }
                if(key_can == 3)
                {
                        if(flag_lj_3_en == 0)
                                t_low -- ;                        //按鍵按下未松開自動減三次        
                        else
                                t_low -= 10;                //按鍵按下未松開自動加三次之后每次自動加10
                        if(t_low <= 10)
                                t_low = 10;
                }
                dis_smg[0] = smg_du[t_low % 10];                   //取小數(shù)顯示
                dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf;   //取個位顯示
                dis_smg[2] = smg_du[t_low / 100 % 10] ;               //取十位顯示
                dis_smg[3] = 0x3D;          //L
        }               
        if(menu_1 == 3)               
        {
                flag_moshi = 1;   //手動模式
                smg_i = 4;                  //數(shù)碼管顯示4位
                if(key_can == 2)          //加檔
                {
                        danwei ++;
                        if(danwei >= 4)
                                danwei = 0;        
                }
                if(key_can == 3)         //減檔
                {
                        if(danwei == 0)
                                danwei = 4;
                        danwei --;                                 
                }
                if(danwei == 0)                //風扇停止
                {
                        TR1 = 0;
                        pwm = 1;
                }
                if(danwei == 1)                //1檔
                {
                        TR1 = 1;
                        f_pwm_l = 69;         
                }
                if(danwei == 2)                //2檔
                {
                        TR1 = 1;
                        f_pwm_l = 30;         
                }
                if(danwei == 3)                //3檔
                {
                        TR1 = 0;
                        pwm = 0;
                }

                dis_smg[0] = smg_du[temperature / 10 % 10];                   //取小數(shù)顯示
                dis_smg[1] = smg_du[temperature / 100 % 10];   //取個位顯示
                dis_smg[2] = 0xf7;
                dis_smg[3] = smg_du[danwei];
        }        
}  

/****************風扇控制函數(shù)***************/
void fengshan_kz()
{
        if(temperature >= t_high)          //風扇全開
        {        
                TR1 = 0;
                pwm = 0;
        }
        else if((temperature < t_high)        && (temperature >= t_low))                   //風扇緩慢
        {
                f_pwm_l = 60;         
                TR1 = 1;
        }
        else if(temperature < t_low)         //關(guān)閉風扇
        {
                TR1 = 0;
                pwm = 1;
        }                        
}

/***********外部中斷0初始化程序****************/
void init_int0()          //外部中斷0初始化程序
{
        EX0=1;                          //允許外部中斷0中斷
        EA=1;                           //開總中斷
        IT0 = 1;                   //外部中斷0負跳變中斷
}

/***********紅外遙控程序**************/
void hongwai_dis()
{
        if(flag_jiema_en == 1)
        {               
                flag_jiema_en = 0;
                beep = 0 ;
                delay_1ms(100);
                beep = 1;
                if(hw_table[2] == 0x47)         //設(shè)置鍵
                {
                        key_can = 1;                                    
                }
                if(hw_table[2] == 0x40)         //加鍵
                {
                        key_can = 2;                                    
                }
                if(hw_table[2] == 0x19)         //減鍵
                {
                        key_can = 3;                                    
                }
                if(hw_table[2] == 0x16)                //0
                {
                        TR1 = 0;
                        pwm = 1;
                        danwei = 0;               
                }
                if(hw_table[2] == 0x0c)                //1檔
                {
                        TR1 = 1;
                        f_pwm_l = 69;         
                        danwei = 1;
                }
                if(hw_table[2] == 0x18)                //2檔
                {
                        TR1 = 1;
                        f_pwm_l = 30;         
                        danwei = 2;
                }
                if(hw_table[2] == 0x5e)                //3檔
                {
                        TR1 = 0;
                        pwm = 0;
                        danwei = 3;
                }

                hw_table[2] = 0;                  //把數(shù)據(jù)清零

        }
}


/****************主函數(shù)***************/
void main()
{
        uchar value;
        time_init();                            f_pwm_l = 50;
        init_int0();          //外部中斷0初始化程序
        while(1)
        {        
                key();                                        //按鍵程序
                hongwai_dis();          //紅外遙控程序
                if(key_can < 10)
                {
                        key_with();                        //設(shè)置報警溫度        
                }
                if(flag_300ms == 1)            //300ms 處理一次溫度程序
                {           
                        flag_300ms = 0;        
                        temperature = read_temp();        //先讀出溫度的值
                        if(temperature >= t_high)
                        {
                                value ++;
                                if(value >= 2)
                                        beep = ~beep;        //報警
                        }
                        else
                        {
                                beep = 1;
                                value = 0;
                        }
                        if(menu_1 == 0)
                        {        
                                smg_i = 3;
                                dis_smg[0] = smg_du[temperature % 10];         //取溫度的小數(shù)顯示
                                dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取溫度的個位顯示
                                dis_smg[2] = smg_du[temperature / 100 % 10] ;           //取溫度的十位顯示
                        }
                        if(menu_1 == 3)
                        {
                                dis_smg[0] = smg_du[temperature / 10 % 10];                   //取小數(shù)顯示
                                dis_smg[1] = smg_du[temperature / 100 % 10];   //取個位顯示
                                dis_smg[2] = 0xf7;
                                dis_smg[3] = smg_du[danwei];
                        }
                }
                if(flag_moshi == 0)
                        fengshan_kz();        //風扇控制函數(shù)

        }
}

/*****************紅外解碼程序********************/
void int0() interrupt 0
{
        unsigned char i,j;
        delay_100us(40);     //防止干擾
        if(hw_P32 == 0)
        {                                     //引導(dǎo)碼9+4.5=13.5ms
                while(hw_P32 == 0); //等待9ms的低電平過完
                delay_100us(27);  //2.7ms        
                if(hw_P32 == 1)          //引碼結(jié)束
                {         
                        delay_100us(20);  //2.7ms+2.0ms=4.7ms  說明4.5ms的高電平已經(jīng)過完 引導(dǎo)碼已經(jīng)結(jié)束
                        for(i=0;i<4;i++)
                                for(j=0;j<8;j++)
                                {
                                        while(hw_P32 == 0);   //等待過完0.56ms
                                        delay_100us(9);
                                        if(hw_P32 == 0)                //數(shù)據(jù)0的時間=0.56+0.565=1.125ms
                                        {                                        //數(shù)據(jù)1的時間=0.56+1.685=2.245ms
                                                hw_table >>= 1;    //低位在前
                                        }
                                        else
                                        {        
                                                delay_100us(10);   //0.9+1.0=1.9ms 延時讓1.685高電平的時間過完
                                                hw_table >>= 1;    //低位在前
                                                hw_table |= 0x80;  //1.9ms過完后 數(shù)據(jù)線已經(jīng)是低電平了
                                        }
                                }
                                flag_jiema_en = 1;          //紅外解碼成功               
                }
        }
}

/*************定時器0中斷服務(wù)程序***************/
void time0_int() interrupt 1
{        
        static uchar value;                         //定時2ms中斷一次
        TH0 = 0xf8;
        TL0 = 0x30;     //2ms
        display();                //數(shù)碼管顯示函數(shù)
        value++;         
        if(value >= 150)
        {
                value = 0;         
                flag_300ms = 1;
        }
        if(flag_lj_en == 1)           //按下按鍵使能
        {
                key_time ++;
                if(key_time >= 250) //500ms
                {
                        key_time = 0;
                        key_500ms = 1; //500ms
                        key_value ++;
                        if(key_value > 3)
                        {
                                key_value = 10;
                                flag_lj_3_en = 1; //3次后1.5秒連加大些
                        }                                                
                }
        }
}


/*******************定時器1用做單片機模擬PWM 調(diào)節(jié)***********************/
void Timer1() interrupt 3  //調(diào)用定時器1
{
        static uchar value_l;
        TH1=0xbe;    //    定時10ms中斷一次
        TL1=0x0c;         //500us
        if(pwm==1)
        {
                value_l+=1;
                if(value_l > f_pwm_l)   //高電平
                {
                        value_l=0;
                    if(f_pwm_l != 0)   
                                pwm=0;         
                }
        }
        else                                
        {
                value_l+=1;
                if(value_l  > 100 - f_pwm_l)                                 
       {
                        value_l=0;
                        pwm=1;
                }
    }
}






致謝

在寫作本畢業(yè)設(shè)計的期間,遇到了非常多的沒有預(yù)料到的各種問題,不過在鄒國柱老師的不厭其煩的指導(dǎo)和監(jiān)督下,并且經(jīng)由我個人的勤奮努力下,做出了這篇畢業(yè)設(shè)計。這篇論文的完成不僅僅是我自己個人的,還有很多幫助我的人,我要感謝他們。假如得不到指導(dǎo)老師的指引,假如得不到父母和同學們的解惑和提示,這篇畢業(yè)設(shè)計根本沒有辦法做出來。我要對我的指導(dǎo)老師師致深深的鞠躬,感謝老師在這段時間的幫助和引領(lǐng)!由于這次畢業(yè)設(shè)計,我使用和學習了非常多的知識和工具,而且經(jīng)過查看一定的資料文獻,學到了大量的課本上不能得到的的知識和能力,從里面取得了很大的收獲。還要感謝的就是我即將要離開的母校,就是因為有了母校給我提供的條件和環(huán)境,我才會有機會鍛煉和展示的平臺;最后要感謝的就是身邊的同學們,是你們在我遇到問題百思不得其解的時候在我身邊幫助我一起攻克難題。

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

使用道具 舉報

沙發(fā)
ID:129825 發(fā)表于 2017-7-20 17:27 | 只看該作者
能 發(fā)個電子文檔么 發(fā)個原理圖嘛
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表