本 科 生 畢 業 設計 (申請學士學位) 論文題目基于紅外遙控技術的智能電風扇 作者姓名 謝志鵬 所學專業名稱 自動化 指導教師 鄒國柱 2017年 4 月
學 生: (簽字) 學 號: 答 辯 日 期: 年 月 日 指 導 教 師: (簽字) 目錄
摘要 1 1 緒論 2 1.1 選題意義 2 1.2 研究現狀 2 1.3 研究內容 2 2 系統總體設計方案 3 2.1設計思路 3 2.2 系統實現的主要功能 3 3 系統硬件設計 4 3.1 STC89C52單片機 4 3.1.1 主要特效 4 3.2 STC89C52外圍基本電路設計 5 3.2.1 電源電路 5 3.2.2 晶振電路 5 3.2.3 復位電路 6 3.2.4 串口下載回路 6 3.2.5 LED數碼顯示電路 7 3.2.6 蜂鳴器報警電路 8 3.2.7 按鍵電路 9 3.2.8 DS18B20溫度采集電路 9 3.2.9 紅外收發控制電路 10 3.2.10 電風扇電極驅動電路 11 4 系統軟件設計 11 4.1 軟件程序設計概述 11 4.2 主流程圖 12 4.3 DS18B20溫度采集和設置流程圖 13 4.4 電機驅動流程 13 5 系統的調試 14 5.1 硬件調試 14 5.1.1 調試步驟 14 5.2 系統的軟件調試 15 5.3 實物功能分析 15 結論 17 參考文獻 18 附錄 19 附錄1 19 附錄2 20 致謝 39
基于紅外遙控技術的智能電風扇
摘要:本論文是基于STC89C52單片機為核心,設計了一種新型智能紅外遙控電風扇控制系統。本系統由紅外發射接收模塊、液晶顯示模塊、按鍵控制模塊、聲音播報模塊、溫度檢測模塊以及電機控制模塊組成。該系統能夠利用遙控或者按鍵形式實現對電風扇不同檔位的設置。電風扇的控制是通過遙控實現的,它是基于紅外通信的原理,并且風速高低是利用PWM信號進行調節的。在按鍵控制下,系統能夠實現聲音提示,液晶顯示單元能夠顯示系統運行的狀態數據,充分展示了良好的人機交互界面。本系統實現了電風扇的自動調速等智能化功能,讓使用者能夠依據實際使用情況對電風扇的運行方式進行設置,同時能夠依據溫度變化進行風速的自動調整。
1 緒論 1.1 選題意義 電風扇是一種普及程度非常廣泛且年代較長的家用電器,由于空調的發展和普及,電風扇越來越不受關注且市場越來越小。但是電風扇的優點仍然是空調目前所無法替代的。簡單的高中低速已經無法滿足人們的生活需求了,操作方便,體積小巧再加上更多智能化人性化的功能相信是如今電風扇的發展趨勢和出路,由于紅外線遠程遙控的普及以及單片機技術的發展,電風扇結合智能紅外線遠程遙控系統必然會得到優秀的產品為人們所喜愛。 1.2 研究現狀 科技日新月異,人們生活節奏也是越來越快來愈快,同時對生活用品的智能需求也在不斷的提高。無線通信其中之一的產品遙控器的問世,使得各種各樣的遙控設備一一出現,比如各種各樣的空調、電視、功放、智能冰箱等。這些形形色色的設備一定程度上給予了人類不斷增長的各種需求。遙控器設備已經出現了六七十年了,而現在普遍使用的紅外遙控則是在上個實際70年代逐漸發展起來的一種無線遠程智能控制技術,紅外線遙控的原理是通過紅外線來傳輸被控設備的邏輯信號,以此來實現對被控對象的遠距離操作。具體指的就是由紅外線遙控器的發射器發出紅外控制指令信息,之后被控設備的紅外線接收器件接收到相應指令信息后對接收到的相應信號進行解碼計算和處理,從而實現紅外線遙控對相應設備的各種各樣用途的遠程操作和控制。紅外線智能遙控優點很多,比如它的相對的獨立特性、物理學特性、可見光相似性和一定強度的隱蔽特性。目前,隨著紅外遙控無線技術的迅速發展,紅外遙控無線技術已經十分廣泛地應用在各種智能電氣設備上,并且具有不可或缺的最基本的作用,當然本設計中要研究的紅外遙控智能控制電風扇也是基于于此的。紅外遙控技術的迅速成熟和十分廣泛應用,外加現在的51增強型單片機技術不斷擴展成熟,也使得電風扇的紅外遙控成為不久將來的發展大趨勢。實現紅外遙控技術的方法有很多種,如利用常用的51單片機實現、利用DSP實現等!本設計則著重考慮使用STC89C52單片機來實現。 1.3 研究內容 本課題設計的是一款基于STC89C52單片機的智能化紅外遙控電風扇。該設計最突出的特點就是更加人性化。具體功能如下:智能風扇的檔位控制可通過兩種方式實現,一是通過功能鍵來實現檔位的設置,通過設置風扇座上的三個鍵,來調節不同的風速。其次就是通過無線的方式來實現對檔位的設置,本設計中采用的是紅外通信的方式實現多檔位風速的設置,使用者可以用遙控來控制風扇的風速。以往的電風扇仍然以機械旋鈕或者簡單紅外遙控方式為主,無較好的人機界面。本次設計增加了顯示功能和聲音提示功能,LED數碼管可以將風扇的各種運行狀態顯示出來,在風扇的控制過程有提示音,使用戶可以更加舒適、方便地使用。考慮到不同環境下的各種情況,本設計增加了自動調速系統,風扇可以根據室內的溫度變速運行,當溫度低于一定溫度時,就自動關閉,高于該溫度值就會繼續工作。
2 系統總體設計方案 2.1設計思路 基于宏晶公司生產的STC89C52系列單片機為控制核心的紅外智能遙控電風扇系統最主要的功能是實現電風扇風速的調節控制,基于宏晶公司生產的STC89C52系列單片機為控制核心的紅外智能遙控電風扇系統上電運行后,如果調到自動模式,系統會先判斷根據DS18B20溫度傳感器采集到的實際溫度值是否低于溫度低限值,如果低于溫度低限值,風扇停止轉動;如果當前環境溫度值處在溫度低限值和溫度高限值之間,風速低速轉動;如果當前環境溫度值高于溫度高限值,風速高速轉動。如果選擇的是手動模式,則整個風扇的轉速則有三檔風速可供選擇。風扇電機驅動則都是依靠PWM信號來進行控制,同時整個風速自動和手動模式選擇、溫度高限值和低限值的設置和手動模式下風扇風速的選擇都可以選擇本地按鍵方式或者紅外遙控方式進行設置,且當采集到的環境溫度高于溫度的設置高限值,蜂鳴器就會發出報警信號。設計出這樣的系統同時也具有低功耗、節約能源等特點,也最大化的方便了用戶使用。綜上所述此系統主要包括單片機核心控制器、單片機電源電路、單片機晶振電路、單片機復位電路、單片機串口通信電路、DS18B20溫度采集電路、紅外收發控制部分、按鍵電路、蜂鳴器輸出電路、LED數碼管顯示電路、電風扇電機驅動電路等。其基本系統框圖如下所示: 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基本系統框圖 2.2 系統實現的主要功能 (1)通過DS18B20溫度傳感器采集溫度并在LED數碼管上予以顯示; (2)通過按鍵或者紅外遙控器可以對溫度上下限值進行設置; (3)亦可通過按鍵或者紅外遙控器可以對系統工作模式進行選擇; (4)通過蜂鳴器輸出報警信號; (5)通過PWM信號對電風扇電機進行有效控制。 3 系統硬件設計 3.1 STC89C52單片機 STC89C52RC控制器是一個叫STC的公司制造的一種功耗低、性能好的CMOS8位微控制器, 8K字節的系統可以使用Flash存儲器。STC89C52應用的是典型的MCS-51內核,不過通過了很多的改善讓芯片擁有了傳統51單片機沒有的的功能和特性。單芯片上,擁有靈活的8 位數的CPU 和在系統可編程Flash,讓STC89C52給很多的嵌入式控制系統給予了靈活程度高,效果好的解決方案。 具有以下標準功能: 8k字節Flash,512字節RAM, 32 位I/O 口線,看門狗定時器,內置4KB EEPROM,MAX810復位電路,總共有3個16 位數的定時器和計數器,一個7向量的4級中斷結構(同時容納典型51的5向量2級中斷結構),還有4個外部中斷,全雙工串行口。同時 STC89C52 還可以降低到0Hz 的靜態邏輯操作,有2種軟件被支持可以選擇的模式是節電的模式。在空閑的模式時,CPU 是不在運行的,不過RAM、定時器/計數器、串口、中斷依然在運行。在選擇掉電保護這種模式時,RAM內容被保存,振蕩器被固定住了,單片機說有的運行被截止,一直到下一個中斷或硬件層面的恢復。最高運作頻率35MHz,6T/12T可選。 3.1.1 主要特效 (1)8K字節程序存儲空間; (2)512字節數據存儲空間; (3)內帶4K字節EEPROM存儲空間; (4)可直接使用串口下載。 PDIP封裝,其封裝圖如下圖所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD029.tmp.jpg 圖 3-1STC89C52RC引腳圖 3.2 STC89C52外圍基本電路設計 3.2.1 電源電路 電源電路也就是給耗電器件提供電力的電源部分的電路設計,應用的的電路特點以及方式。經常碰到的電源電路有交流和直流電源電路等等。該STC89C52系列單片機電源采用直流5V供電,供電電源可采用USB供電或者外部電池盒供電,設計的電路如下圖所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD02A.tmp.jpg 圖3-2電源電路圖 3.2.2 晶振電路 單片機的系統里晶振是不可或缺的,晶體震蕩器是它的全稱,晶振的作用在單片機里非常大,他通過與內部電路的配合,時鐘頻率在單片機系統里由此產生,在這個基礎之上,單片機的所有指令得以運轉,晶振的提供的時鐘頻率越高,要想單片機的運轉速度快,那么晶振給予的時鐘頻率就有夠高。 晶振通過一類晶體,這種晶體能使機械能和電能互相轉化,并且在共振的狀態下運行,由此保持穩定,精準的單頻振蕩。在一般的情況下,一般的晶振頻率可以達到百分之五十的絕對精度。高級的精度更高。還有的晶振能通過外加電壓調整頻率,不過要在一定的范圍內,名字就叫壓控振蕩器。 晶振的能力是給系統基礎的時鐘訊號。一個晶振一般情況下被一個系統共同使用,這樣各部分的同步能有所保障。但是有的通訊系統的射頻和基頻是被不同的晶振提供的時鐘信號的,電子調頻是用來保持同步的方式。鎖相環電路一般情況下與晶振結合應用,系統需要的時鐘頻率由此提供。要是差異的子系統要用到不同頻率的時鐘信號,能讓與同一個晶振相配合的不同鎖相環來供應。 本系統中晶振電路設計如下: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD03B.tmp.jpg 圖3-3晶振電路圖 3.2.3 復位電路 復位電路,能讓電路回到到一開始的情況。猶如計算器的清零功能,方便回歸到起始狀況,重新進行其他操作。但是與之不一樣的是,復位電路開啟的方式不太一樣。一種是在電路一通電就立即復位;二是在必要時可以由手動操作;還有就是在系統需要的時候進行。大多數的復位電路一般較為容易,很多電阻電容相結合就能做到,復雜一點的能就是用程序和三極管以及其他的器件來運行。 為了能讓微機系統的電路不亂可靠的運行,復位電路是必不可少的一方面,復位電路首先就是要能夠上電復位。普通的微機電路在一般情況下運行用電電壓是5V±5%,也就是4.75~5.25V。因為微機電路是一種時序電路,不亂的時鐘信號是必不可少的,所有打開電源的時候,只能在VCC低于5.25V高于4.75V并且晶體振蕩器也在正常運行的時候,微機電路才能正常運行,復位信號也撤銷了。 當今,單片機的復位電路一般有四種: (1)微分型復位電路; (2)積分型復位電路; (3)比較器型復位電路; (4)看門狗型復位電路。 單片機系統的復位方式有:手動按鈕復位和上電復位。 本系統設計的復位電路如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD03C.tmp.jpg 圖3-4復位電路圖 3.2.4 串口下載回路 STC89C52系列單片機可以直接通過串口或者使用USB轉TTL即可下載程序,優點是省去購買通用編程器,單片機在用戶系統上就能下載或者燒錄用戶程序,并且還不要把單片機卸下來,直接就能把程序代碼燒錄進單片機里面。從 RxD/P3.0 檢驗到合理的下載指令流就下載用戶程序,如果檢驗不到就自動復位到用戶的程序區。設計的電路圖如下所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD03D.tmp.jpg 圖3-5串口下載電路圖 下載軟件則使用宏晶公司研發的STC-ISP軟件,軟件截圖如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD03E.tmp.jpg 圖3-7STC-ISP軟件界面 3.2.5 LED數碼顯示電路 LED數碼顯示電路用來顯示當前環境實時溫度值,當進入設置界面時,則用來顯示設置的溫度高限值和低限值以及手動模式下的三檔風速。該設計中的LED數碼管顯示電路使用的是4位8段共陽極數碼管,各位數碼管分別使用三極管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口。設計的電路圖如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD04E.tmp.jpg 圖3-8 LED數碼管顯示電路 3.2.6 蜂鳴器報警電路 蜂鳴器簡單來說就是電子訊響器,結構是一體化的,供電方式是直流電壓的供電方式,通常能在于各種生活中常見的電子物件中找到作發聲器件比如電視機洗衣機等等。蜂鳴器有兩種類型,電磁式蜂鳴器和壓電式蜂鳴器。 本設計中采用有緣蜂鳴器,采用三極管9012進行驅動放大,供電電源為直流5V,其設計電路如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD04F.tmp.jpg 圖3-9蜂鳴器報警電路圖 3.2.7 按鍵電路 按鍵在我們的生活中也非常常見,是一種控制用的元件,一般都是用來通斷‘控制電路’(一般電流都很。缓笫沟秒妱訖C等等各種各樣的設備根據人的命令運行的器件。可分為常開按鍵、常閉按鍵、常開常閉按鍵和動作點擊按鍵等。按鍵這種器件在很多地方都能得到運用,比如車床的停機與起動、反轉與正轉等;塔吊的停止,啟動,還有下降,上升,以及速度的各種控制等等時代的進步,社會的發展,創新水平的提升,按鍵一直都是大量產品的最基本人機接口工具,外形的也變的美觀個性化。本設計中采用的4腳常開直徑為6mm的按鍵,使用P2.0、P2.1、P2.2三個IO口,第一個按鍵用來切換模式,第二個按鍵和第三個按鍵用來設置溫度上下限時增加或減少,其設計的電路圖如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD050.tmp.jpg 圖3-10按鍵電路圖 3.2.8 DS18B20溫度采集電路 DS18B20是普遍的溫度傳感器,小巧輕便,價格便宜,抗干擾能力極強,精度也很高!它的輸入輸出時序和測溫方法和DS18B20差不多,不過由此得到的溫度數值有幾位會被分辨率影響,而且溫度轉變的時間也減小了很多。 DS18B20數字溫度傳感器在安裝的時候也很容易,做好后能在很多地方用到,比如不銹鋼封裝式,磁鐵吸附式等等等等型號很多,有LTM8874,LTM8877等。主要根據應用場合的不同而改變其外觀。裝好的DS18B20能被應用在高爐水循環測溫,機房測溫,鍋爐測溫,農業大棚測溫,彈藥庫測溫等各種各樣的溫度差異不是非常大的地方。小巧輕便,非常耐用,用起來也很容易,封裝的方式也很多,適用于各種各樣的非常復雜的場合的空間設備數字測溫和控制場合。 DS18B20的控制方法如下所示: (1)溫度轉換 44H 啟動DS18B20進行溫度轉換 (2)讀暫存器 BEH 讀暫存器9字節二進制數字 (3)寫暫存器 4EH 將數據寫入暫存器的TH、TL字節 (4)復制暫存器 48H 把暫存器的TH、TL字節寫到E2PROM中 (5)重新調E2PROM B8H 把E2PROM中的TH、TL字節寫到暫存器TH、TL字節 (6)讀電源供電方式 B4H 啟動DS18B20發送電源供電方式的信號給主CPU 設計的電路中使用P2.4口,電路設計如下: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD061.tmp.jpg 圖3-11溫度采集電路圖 3.2.9 紅外收發控制電路 紅外線編碼是傳導信號還有日常使用的電器遠程控制的典型的一種控制操作方法,它實際上就是一種脈寬調制的串行通訊。常用的家用遠程控制一般用的紅外編碼電路是μPD6121G型7461型和HT622型。本設計就是通過這些電路相應的編碼格式太探討如何運用單片機來讓它解碼的,其中用到了單片機的捕獲中斷功能。 紅外信號的發送方面大部分是通過讓待發送的信號轉變成一種脈沖,之后控制紅外發光管發送信號。收到信號的方面就是實現紅外的放大、接受然后解調,再變回同步發射格式相同(但高、低電位剛好相反的脈沖信號。這些操作一般都是通過接收頭來實現,這種接收頭是一體化的。一般放出TTL兼容電平。之后經由解碼使脈沖信號變成數據,然后就使得數據的傳送。如圖所示: 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紅外收發系統框圖 本設計中使用的IO口為P3.2口,設計的電路如下所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD07C.tmp.jpg 圖3-13紅外收發控制電路圖 3.2.10 電風扇電極驅動電路 使用三極管9012進行信號放大,所用IO口P2.3用來輸出PWM信號,根據信號最后控制電風扇完成各個檔位風速的運行。設計的電路如下所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD07D.tmp.jpg 圖3-14電風扇電機驅動電路圖 4 系統軟件設計 4.1 軟件程序設計概述 在單片機系統程序的設計開發中,單片機是整個系統的核心部分,各個部分模塊化的程序就是整個系統的組成成份。軟件編寫的好不好,運用的語句有沒有簡單明了會影響單片機的運行效果。在每一個模塊化的運行程序里面一定要用簡潔少的語句做盡量多的任務,不要使語句表達出有問題的意思,如此這般就能讓整個系統更好的運轉,讓單片機工作能力很大的提升,F在就對這次的畢業設計的軟件方面作些闡述。 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溫度采集和設置流程圖 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溫度采集和設置流程圖
4.4 電機驅動流程 邏輯判斷十分簡單,當前溫度低于溫度下限值時,風速停止運轉;當前溫度值處于溫度低限值和溫度高限值之間時,風扇低速運轉;當前溫度值高于溫度高限值時,風速高速運轉,其設計的電機驅動程序如下所示: 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) //關閉風扇 { TR1 = 0; pwm = 1; } } 5 系統的調試 電路板的焊接安裝以及調試在整個硬件制作里面是非常重要的,其是從理論上向實際邁步的關鍵,也是把理論變為實際所必不可少的。對于初步的電路板的制作主要是兩種方法:焊接或者面包板焊接。面包板焊接相對要更加的簡易一些,方便替換一些器件,并且能多次使用。這次設計主要要用到的設備有:信號發生器、萬用表、示波器等。 5.1 硬件調試 5.1.1 調試步驟 (1)不加電源的檢查 首先對應電路圖,電路的連線有沒有錯誤的地方,有沒有多余接線、錯誤接線、應該接卻沒有接線的情況等。用萬用表檢查接線的優良程度,各個器件的連接有沒有問題。通過細心的檢查,發現并且解決了很多的問題,避免了很多的麻煩。 (2)靜態檢測與調試 將信號源斷開,把正確的電源接入電路,將萬用表調到電壓檔,來監測電源電壓,看是否有異,F象,如:手摸元器件發燙、異常氣味、電源短路、冒煙等,如果發現有異常狀況,應立即切斷電源,然后排除故障。如果電路在測試后無上述異常情況,然后測量關鍵處的直流電壓,如:放大電路輸入、輸出端直流電壓、靜態工作點等,看是否在正常工作狀態下,如果有個別電路不符,經過調整電路元器件參數、更換元器件,使電路最終工作在合適的工作狀態。 對于放大電路我們還用示波器觀察是否有自激發生。結果一切正常。 (3)動態檢測與調試 動態調試是在靜態調試的基礎上進行的,調試的方法地在電路的輸入端加上所需的信號源,并循著信號的注射逐級檢測各有關點的波形、參數和性能指標是滿足設計要求,如必要,要對電路參數作進一步調整。發現問題,要設法找出原因,排除故障,繼續進行。我們所設計的遙控器電路是采用碼分制遙控方式,我們用示波器對發射電路輸出端及接收電路輸入端的信號波型的進行了檢查,發現當按下不同的開關按鈕時所顯示的波型是不同的。這說明了此電路是工作在正常狀態的。 5.2 系統的軟件調試 在完成系統硬件的檢查后主要是對軟件進行調試,對遙控器的調試主要是用示波器觀察能否在遙控接收器中輸出相應的波形,調整發射電阻的大小可以改變紅外線發射的作用距離。其性能指標調試后系統性能指標測試如下:最大遙控距離:10m 發射接收角:水平最大90度 硬件電路制作完成并調試好后,便可將程序編譯好下載到單片機試運行。 5.3 實物功能分析 如圖所示,按下電源鍵后,智能電風扇啟動,如下圖為初始化界面,數碼管顯示當前環境溫度,且為自動調速模式。當溫度低于最小值是風扇不轉,當溫度高于最小值且低于最大值時風扇低速轉速運轉,當溫度高于最大值時高速運轉。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD10A.tmp.jpg 圖5-1智能溫控模式工作圖 按下設置鍵,電風扇處于最大值的設定界面如圖,此時可以用加減鍵設定最大溫度設定值。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD10B.tmp.jpg
圖5-2最大溫度值設置圖 再次按下設置鍵,電風扇處于最小值的設定界面如圖,此時可以用加減鍵設定最小溫度設定值。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD10C.tmp.jpg
5-3最小溫度值設置圖 再次按下設置鍵,電風扇切換為手動擋時,界面如下,此時可以通過加減鍵選擇三個風速的檔位。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD11D.tmp.jpg
圖5-4手動擋工作圖 以上所有的功能選擇或設置都可以用按鍵或者紅外遙控器完成。
結論
本文章主要設計了一種智能的紅外線遙控電風扇,整個系統通過紅外線接收發射模塊、電機控制模塊、溫度檢測模塊、按鍵操作控制模塊、還有液晶屏幕顯示模塊組成。整個電風扇系統是通過STC12系列單片機形成了用三個按鍵操控多種工作模式的切換以及風速的切換,三個按鍵分別為增加鍵,功能鍵和減小鍵,能夠由需要配置電風扇的工作模式。而且,在設置的時候,在電風扇基礎功能的前提下,還配置了聲音提醒等功能。本文還描述了用紅外線遠程操控檔位,如此這般就能夠實現舒適地用遙控器來操控風扇的啟動與停止了,操作使用非常方便。電風扇的操控是經由遙控器實現的,它的基礎是紅外線通信的原理,且風速的大小也是通過PWM信號來調節控制的。電風扇還有良好的顯示界面,電風扇和人的交互方面也非常好。本設計通過對智能電風扇的簡單的功能增加,例如風速自動控制等,讓電風扇更加的齊全可靠,使用更加舒適。
參考文獻
[1]陳靜, 史雪飛. “模擬電子技術”課程中若干關鍵問題的探討[J]. 電氣電子教學學報,2014, 36(1):59-60. [2]張毅剛 王少軍 付寧. 單片機原理及接口技術[M]. 人民郵電出版社, 2015. [3]波形發生器.歷屆全國大學生電子競賽SPCE061A實現方案.北京北陽電子技術有限公司,2014 [4]吳凌鸝. 微機備用電源自動投入裝置現場運行分析[J]. 中國電子商務,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的智能電風扇設計[M].2014 [8]佚名. 電子線路設計·實驗·測試[M]. 電子工業出版社, 2014. [9]王爽.英飛凌XE166/XC2000單片機開發與應用實例[M].電子工業出版社,2014.6. [10]陸超逸 石杰元 基于MSP430和Android溫控距控智能電風扇設計.電子世界.2016.10. [11]唐曉珊.管瓊.李運彪.王歡 電風扇自動溫控裝置設計.電子設計工程.2016.12 [12]蔣小軍.基于單片機的智能溫控風扇.科技展望.2016.13 [13王文江.]基于物聯網技術的教室智能用電系統設計與實現.中國科技信息.2016.2.
附錄 附錄1 系統總電路圖: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsD11E.tmp.jpg
附錄2 完整的程序: #include <reg52.h> //調用單片機頭文件 #define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255 #define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
//數碼管段選定義 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}; //斷碼 //數碼管位選定義 uchar code smg_we[]={0xef,0xdf,0xbf,0x7f}; uchar dis_smg[8] = {0x28,0xee,0x32,0xa2,0xe4,0x92,0x82,0xf8}; uchar smg_i = 3; //顯示數碼管的個位數 sbit dq = P2^4; //18b20 IO口的定義 sbit beep = P3^3;
bit flag_lj_en; //按鍵連加使能 bit flag_lj_3_en; //按鍵連3次連加后使能 加的數就越大了 uchar key_time,key_value; //用做連加的中間變量 bit key_500ms ; sbit pwm = P2^3; uchar f_pwm_l ; //越小越暗
uint temperature ; // bit flag_300ms ; uchar menu_1; //菜單設計的變量 uint t_high = 300,t_low = 100; //溫度上下限報警值
//數碼管位選定義 sbit smg_we1 = P3^7; //數碼管位選定義 sbit smg_we2 = P3^6; sbit smg_we3 = P3^5; sbit smg_we4 = P3^4;
uchar danwei;
/***********************1ms延時函數*****************************/ void delay_1ms(uint q) { uint i,j; for(i=0;i<q;i++) for(j=0;j<120;j++); }
/***********************小延時函數*****************************/ void delay_uint(uint q) { while(q--); }
/***********************數碼位選函數*****************************/ 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的延時函數***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]; //紅外解碼數據緩沖區
/***********************數碼顯示函數*****************************/ void display() { static uchar i; i++; if(i >= smg_i) i = 0; P1 = 0xff; //消隱 smg_we_switch(i); //位選 P1 = dis_smg; //段選
}
/***********************18b20初始化函數*****************************/ void init_18b20() { bit q; dq = 1; //把總線拿高 delay_uint(1); //15us dq = 0; //給復位脈沖 delay_uint(80); //750us dq = 1; //把總線拿高 等待 delay_uint(10); //110us q = dq; //讀取18b20初始化信號 delay_uint(20); //200us dq = 1; //把總線拿高 釋放總線 }
/*************寫18b20內的數據***************/ void write_18b20(uchar dat) { uchar i; for(i=0;i<8;i++) { //寫數據是低位開始 dq = 0; //把總線拿低寫時間隙開始 dq = dat & 0x01; //向18b20總線寫數據了 delay_uint(5); // 60us dq = 1; //釋放總線 dat >>= 1; } }
/*************讀取18b20內的數據***************/ uchar read_18b20() { uchar i,value; for(i=0;i<8;i++) { dq = 0; //把總線拿低讀時間隙開始 value >>= 1; //讀數據是低位開始 dq = 1; //釋放總線 if(dq == 1) //開始讀寫數據 value |= 0x80; delay_uint(5); //60us 讀一個時間隙最少要保持60us的時間 } return value; //返回數據 }
/*************讀取溫度的值 讀出來的是小數***************/ uint read_temp() { uint value; uchar low; //在讀取溫度的時候如果中斷的太頻繁了,就應該把中斷給關了,否則會影響到18b20的時序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳過64位ROM write_18b20(0x44); //啟動一次溫度轉換命令 delay_uint(50); //500us
init_18b20(); //初始化18b20
write_18b20(0xcc); //跳過64位ROM write_18b20(0xbe); //發出讀取暫存器命令
low = read_18b20(); //讀溫度低字節 value = read_18b20(); //讀溫度高字節
value <<= 8; //把溫度的高位左移8位 value |= low; //把讀出的溫度低位放到value的低八位中 value *= 0.625; //轉換到溫度值 小數 return value; //返回讀出的溫度 帶小數 }
/*************定時器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; //關閉連加使能 flag_lj_3_en = 0; //關閉3秒后使能 key_value = 0; //清零 key_500ms = 0; } } }
/****************按鍵處理數碼管顯示函數***************/ void key_with() {
if(key_can == 1) //設置鍵 { f_pwm_l = 30; menu_1 ++; flag_moshi = 0; //自動模式 if(menu_1 >= 4) { menu_1 = 0; smg_i = 3; //數碼管顯示3位 } } if(menu_1 == 1) //設置高溫報警 { smg_i = 4; //數碼管顯示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]; //取小數顯示 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) //設置低溫報警 { smg_i = 4; //數碼管顯示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]; //取小數顯示 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; //數碼管顯示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]; //取小數顯示 dis_smg[1] = smg_du[temperature / 100 % 10]; //取個位顯示 dis_smg[2] = 0xf7; dis_smg[3] = smg_du[danwei]; } }
/****************風扇控制函數***************/ 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) //關閉風扇 { 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) //設置鍵 { 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; //把數據清零
} }
/****************主函數***************/ void main() { uchar value; time_init(); f_pwm_l = 50; init_int0(); //外部中斷0初始化程序 while(1) { key(); //按鍵程序 hongwai_dis(); //紅外遙控程序 if(key_can < 10) { key_with(); //設置報警溫度 } 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]; //取溫度的小數顯示 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]; //取小數顯示 dis_smg[1] = smg_du[temperature / 100 % 10]; //取個位顯示 dis_smg[2] = 0xf7; dis_smg[3] = smg_du[danwei]; } } if(flag_moshi == 0) fengshan_kz(); //風扇控制函數
} }
/*****************紅外解碼程序********************/ void int0() interrupt 0 { unsigned char i,j; delay_100us(40); //防止干擾 if(hw_P32 == 0) { //引導碼9+4.5=13.5ms while(hw_P32 == 0); //等待9ms的低電平過完 delay_100us(27); //2.7ms if(hw_P32 == 1) //引碼結束 { delay_100us(20); //2.7ms+2.0ms=4.7ms 說明4.5ms的高電平已經過完 引導碼已經結束 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) //數據0的時間=0.56+0.565=1.125ms { //數據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過完后 數據線已經是低電平了 } } flag_jiema_en = 1; //紅外解碼成功 } } }
/*************定時器0中斷服務程序***************/ void time0_int() interrupt 1 { static uchar value; //定時2ms中斷一次 TH0 = 0xf8; TL0 = 0x30; //2ms display(); //數碼管顯示函數 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 調節***********************/ void Timer1() interrupt 3 //調用定時器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; } } }
致謝
在寫作本畢業設計的期間,遇到了非常多的沒有預料到的各種問題,不過在鄒國柱老師的不厭其煩的指導和監督下,并且經由我個人的勤奮努力下,做出了這篇畢業設計。這篇論文的完成不僅僅是我自己個人的,還有很多幫助我的人,我要感謝他們。假如得不到指導老師的指引,假如得不到父母和同學們的解惑和提示,這篇畢業設計根本沒有辦法做出來。我要對我的指導老師師致深深的鞠躬,感謝老師在這段時間的幫助和引領!由于這次畢業設計,我使用和學習了非常多的知識和工具,而且經過查看一定的資料文獻,學到了大量的課本上不能得到的的知識和能力,從里面取得了很大的收獲。還要感謝的就是我即將要離開的母校,就是因為有了母校給我提供的條件和環境,我才會有機會鍛煉和展示的平臺;最后要感謝的就是身邊的同學們,是你們在我遇到問題百思不得其解的時候在我身邊幫助我一起攻克難題。
|