在Proteus中通過模擬溫濕度,外接溫濕度值,將模擬到的數(shù)據(jù)進(jìn)行采集與A/D轉(zhuǎn)換,顯示到LCD液晶并控制后級(jí)電路進(jìn)行反饋,完成晾衣架的功能。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
智能晾衣架 第三章:硬件單元電路經(jīng)過上述分析明確了本次設(shè)計(jì)的主要目標(biāo),為了實(shí)現(xiàn)晾衣自身能夠完成對(duì)外界數(shù)據(jù)的采集與分析,集成控制環(huán)節(jié)我們采用了ATMEL公司生產(chǎn)的AT89C52單片機(jī),與市面上的其他嵌入式控制單元相比較在體積與功耗方面都相當(dāng)出色。此次設(shè)計(jì)主要突破在于設(shè)計(jì)合理的控制電路單元,同時(shí)結(jié)合采用的主控編寫高質(zhì)量的源碼并使系統(tǒng)在實(shí)際與應(yīng)用中能夠發(fā)揮出色的穩(wěn)定性和參考價(jià)值。本次將圍繞主控單元設(shè)計(jì)合理的電路,結(jié)合SHT11溫濕度采集單元、感光原件單元、LCD顯示單元、模式控制單元使晾衣架能夠得到外界的實(shí)時(shí)數(shù)據(jù)并作出相應(yīng)的調(diào)整。在設(shè)定合適的溫濕度及感光度的條件下能夠自動(dòng)控制電機(jī)驅(qū)動(dòng)滑桿實(shí)現(xiàn)自動(dòng)量曬與回收衣物,結(jié)合光線角度進(jìn)行上下左右調(diào)整。主要框架如下圖所示:
3.1主控單元設(shè)計(jì) 為了使智能晾衣架在使用時(shí)滿足嵌入式系統(tǒng)功耗、抗干擾、適用空間等要求,設(shè)計(jì)之初除了上述因素也考慮到成本因素。通過比較我們選擇了51系列中的AT89C52芯片作為主控制單元。無論是功耗還是處理速度上都有著不錯(cuò)的表現(xiàn),與CONTEX-M3系列單片機(jī)相比較處理上稍微慢點(diǎn),但本次設(shè)計(jì)對(duì)分時(shí)處理的要求不是特別高,同時(shí)52系列具有簡(jiǎn)單高效的指令集和,大大減少設(shè)計(jì)難度,結(jié)合SHT11與ADC0804精準(zhǔn)的完成數(shù)采集與電機(jī)控制。 我們常見的主控封裝形式有40腳的DIP直插的也有PQFP類型的貼片封裝,在proteus中仿真的時(shí)候選擇DIP類型,方便自主設(shè)計(jì)與搭建外圍電路單元。從產(chǎn)品角度和制版工藝上面來講貼片能夠節(jié)省空間。這次采用的主控制芯片是8位CMOS工藝的單片機(jī),內(nèi)部有八位CPU和FlASH,在工控領(lǐng)域有著廣泛的用途,脫機(jī)運(yùn)行性能穩(wěn)定,相比較51有著更大的存儲(chǔ)和定時(shí)器資源,其主要內(nèi)部參數(shù)與引腳分布見下圖: | | | | | | | | | | | | | | | 3個(gè)16位定時(shí)/計(jì)數(shù)器 |
表:3.1.1主要參數(shù) 圖:3.1.2雙列直插型 圖:3.1.3 PLCC貼片型 由上圖可以直接看到引腳標(biāo)識(shí)與編號(hào),左下角的GND與右上角的VCC需要外接合適的工作電壓,一般采用5V工作電壓。兩側(cè)的P0-P3 I/O口是可編程輸入輸出管腳,一組有四個(gè),一共32個(gè),可以看到I/O資源挺豐富且適合驅(qū)動(dòng)多種外設(shè)。最小控制單元自工作的時(shí)候需要外部晶振提供合適的工作頻率同時(shí)為了防止程序跑飛或者陷入死循環(huán)還要提供合理的復(fù)位單元。通俗點(diǎn)好比人要正常工作的需要心臟提供合適的脈搏跳動(dòng),這里我們選的是11.529MHZ的外部無源晶振,在外圍接上兩個(gè)22PF的非極性濾波電容連接到18、19管腳,為最小系統(tǒng)提供合適的工作頻率。復(fù)位環(huán)節(jié)通過分壓電阻與按鍵開關(guān)為9管腳提供復(fù)位信號(hào),10uf的極性電容較減少按動(dòng)過程中的抖動(dòng)信號(hào),發(fā)送有效地高電平信號(hào)可以讓單片機(jī)重新加載程序,從頭開始跑。此次仿真過程中由于I/O分配的原因采用了兩片主控,另外需要注意的是P3口除了通用的管腳功能外,還有拓展的第二功能,配置其引腳功能能夠?qū)崿F(xiàn)定時(shí)/計(jì)數(shù)功能以及外部中斷資源,在實(shí)際設(shè)計(jì)過程中有著非常多的用途。下面是最小控制單元的原理圖以及P3管腳工能分布圖:, 圖:3.1.3最小系統(tǒng) 圖:3.1.4 P3口復(fù)用 3.2LCD液晶顯示 主控單元在上電之后會(huì)對(duì)液晶屏幕進(jìn)行初始化,直觀的顯示出各項(xiàng)參數(shù),結(jié)合獨(dú)立按鍵顯示控制模式,給用戶提供良好的人機(jī)交互。常見的顯示屏幕有很多尺寸,市面上的電容、電阻屏也數(shù)不勝數(shù),這里我們選用戶LCD1602作為液晶顯示,同樣的考慮到功耗與顯示區(qū)間等因素。1602有著八個(gè)數(shù)據(jù)端口,體積很小亮度飽和能夠直觀簡(jiǎn)單的顯示ASCII碼與字符,與單片機(jī)的接口連接簡(jiǎn)單,控制屏幕上的液晶分子顯示出字符,不同的電壓控制不同區(qū)域 上下兩行能夠分別顯示16個(gè)字符,不具備漢字現(xiàn)實(shí)的能力,這點(diǎn)上不如12864,但完成設(shè)計(jì)的時(shí)候能夠帶來更穩(wěn)定的顯示,較強(qiáng)的抗干擾能力。實(shí)際硬件分為有無背光源,帶背光的厚度稍微大點(diǎn),會(huì)有更好的顯示效果且調(diào)節(jié)背光源之間的滑變能夠顯示效果。常用的有16個(gè)管腳,分為電源區(qū)、指令控制區(qū)、數(shù)據(jù)區(qū)、背光區(qū)。實(shí)際外觀尺寸見下圖: 圖:3.2.1 LDC液晶尺寸圖 可以看到上圖中有兩行顯示區(qū)域,左上角有1-16個(gè)外圍引腳可以用,用來驅(qū)動(dòng)屏幕顯示想要的數(shù)據(jù)與字符,先簡(jiǎn)單說下管腳分布和功能:1管腳與2管腳用來接工作電源;3管腳通過VCC與分壓電阻控制屏幕的對(duì)比度且會(huì)隨著電壓的變化而增加減少,對(duì)比度過高會(huì)出現(xiàn)陰影不清晰等現(xiàn)象,因此需要條調(diào)節(jié)合適的對(duì)比度以滿足正常顯示,可以外接10K電阻進(jìn)行調(diào)整;4管腳RS控制端用來告訴模塊當(dāng)前是發(fā)送/讀寫數(shù)據(jù)還是指令,在實(shí)際現(xiàn)實(shí)過程中參與控制時(shí)序,高的電平信號(hào)控制數(shù)據(jù)控制寄存器、低電平信號(hào)控制指令寄存器;5管腳為W/R讀寫控制端,與4管腳結(jié)合起來可以實(shí)現(xiàn)數(shù)據(jù)/命令&讀/寫功能;6管腳作為EN使能控制端用來控制液晶的工作狀態(tài);7管腳到14管腳為數(shù)據(jù)線,用來讀寫數(shù)據(jù);15與16管腳控制背光,根據(jù)實(shí)際情況考慮是否需要接入電路中。 對(duì)控制端口有一定的了解后,還需要掌握讀寫時(shí)序圖從而根據(jù)時(shí)序去設(shè)計(jì)軟件驅(qū)動(dòng),這里以寫數(shù)據(jù)時(shí)序圖為例子說下原理過程: 圖3.2.2 寫數(shù)據(jù)時(shí)序 上圖中RS決定當(dāng)前是要啟用命令寄存器還是數(shù)據(jù)寄存器,寫數(shù)據(jù)的過程中RS要保持高電平信號(hào),寫命令的過程要保持低電平信號(hào)。當(dāng)往液晶上寫字符的時(shí)候,首先要將RS拉低,R/W保持低電頻信號(hào),隨后有個(gè)上升沿將RS拉成高電位,也就是上圖RS對(duì)應(yīng)的第二條信號(hào)線。圖中tsp_x、tR、tHD_x等間距在設(shè)計(jì)過程中都可以采用延時(shí)實(shí)現(xiàn)時(shí)序同步。我們可以看到valid data是有效地?cái)?shù)據(jù)段,只有當(dāng)RS = 1、R/W = 0、DB0-DB7發(fā)送數(shù)據(jù)、EN使能等狀態(tài)都滿足的時(shí)候才能實(shí)現(xiàn)數(shù)據(jù)從I/O寫入到液晶。這種時(shí)序圖在液晶操作與與不同工控領(lǐng)域的傳感器數(shù)據(jù)采集中經(jīng)常會(huì)用到,因此軟件設(shè)計(jì)過程中要嚴(yán)格遵守時(shí)序從而獲得準(zhǔn)確有效地?cái)?shù)據(jù)值。關(guān)于讀寫命令及讀寫數(shù)據(jù)的操作時(shí)序就不一一說明了,在下表中根據(jù)邏輯時(shí)序已經(jīng)歸出控制區(qū)域I/O的工作狀態(tài),方便開發(fā)使用。 讀狀態(tài) | 輸入 | RS=L,R/W=H,E=H | 輸出 | D0—D7=狀態(tài)字 | 寫指令 | 輸入 | RS=L,R/W=L,D0—D7=指令碼,E=高脈沖 | 輸出 | 無 | 讀數(shù)據(jù) | 輸入 | RS=H,R/W=H,E=H | 輸出 | D0—D7=數(shù)據(jù) | 寫數(shù)據(jù) | 輸入 | RS=H,R/W=L,D0—D7=數(shù)據(jù),E=高脈沖 | 輸出 | 無 |
表:3.2.3 控制時(shí)序 上面也有提到16個(gè)顯示區(qū)域,它們也是有對(duì)應(yīng)的基帶地址,要在固定的地址上顯示字符就需要發(fā)送對(duì)應(yīng)的地址指令,第一行地址起始地址為0x00,第二行起始地址為0x40,后續(xù)的地址參考圖3.2.3。設(shè)計(jì)時(shí)如果沒有用到屏幕滾動(dòng)的話可以不考慮虛擬地址。也就是說從0x10以后到0x27以及0x50到0x67需要開啟其滾動(dòng)顯示才能顯示出該地址空間上的數(shù)據(jù)。 關(guān)于常見的操作指令可以參考手冊(cè)中的指令集部分, 圖3.2.3地址映射 3.3SHT11溫濕度 對(duì)于外界環(huán)境的一些非線性參數(shù),需要使用傳感器將時(shí)變環(huán)境參數(shù)轉(zhuǎn)換成時(shí)變模擬信號(hào),經(jīng)過預(yù)處理后由單片機(jī)把模擬信號(hào)轉(zhuǎn)化成能夠識(shí)別的數(shù)字信號(hào)。對(duì)于外界環(huán)境的溫濕度參數(shù)獲常用到的測(cè)量原件有DHT_x系列與SHT_x系列等測(cè)量原件。DHT11在控制領(lǐng)域有著廣泛的應(yīng)用,此外對(duì)于高精度的測(cè)量?jī)x器儀表設(shè)備中SHT11也有著廣泛的應(yīng)用。這兩款芯片本質(zhì)上的區(qū)別在于內(nèi)部采樣部分,DHT11的核心部件采用的是濕敏電阻原件,準(zhǔn)確度與穩(wěn)定性相對(duì)來講比較差;SHT11內(nèi)部采用的濕敏電容元器件,抗擾能力強(qiáng),準(zhǔn)確度高,當(dāng)然成本上會(huì)比DHT11高點(diǎn),這里設(shè)計(jì)的時(shí)候我們選用SHT11電容性原件進(jìn)行采樣與分析處理。另外一點(diǎn)SHT11的接口上與DHT11也有些許差異,同門內(nèi)部通信需要遵守各自的協(xié)議。詳細(xì)的管腳圖及與控制元件的接線見圖3.3.1。 圖:3.3.1 SHT11使用原理圖 上述原件預(yù)留了四個(gè)I/O接口,實(shí)際上該芯片有8個(gè)管腳且NC全部都接空,除了電源接口提供0-5V的工作電壓之外還有串行數(shù)據(jù)通信接口SCK與DATA。我們采樣的數(shù)據(jù)就需要通過IIC協(xié)議傳送到8位單片機(jī)上,為了避免傳送過程中帶來的干擾需要在VDD與GND之間加上去耦濾波電容。 在采集數(shù)據(jù)周期內(nèi)同樣要遵守采樣時(shí)序電路,前面已經(jīng)以1602寫數(shù)據(jù)為例說明。此外需要知道在啟動(dòng)傳感器后如何發(fā)送指令集選擇自己要得到數(shù)據(jù),啟動(dòng)傳輸時(shí)序緩釋通過SCK、DATA數(shù)據(jù)端口控制。SCK由高電頻到低電頻再到高電平的反轉(zhuǎn)過程中農(nóng)DATA同時(shí)出現(xiàn)高變低再變高的過程,下圖為啟動(dòng)時(shí)序圖:圖:3.3.2SHT11啟動(dòng)時(shí)序 常用的獲取參數(shù)的指令有:溫度測(cè)量0x03、濕度測(cè)量0x50、讀狀態(tài)寄存器0x07、寫狀態(tài)寄存器0x06、軟復(fù)位0x1E等。當(dāng)我們要完成溫濕度是測(cè)量的時(shí)候,需要發(fā)布測(cè)試命令0x05標(biāo)識(shí)RH當(dāng)前濕度值,0x03表示當(dāng)前溫度值。當(dāng)指令發(fā)送完成以后會(huì)有20ms~320ms的等待時(shí)間,分別對(duì)應(yīng)不同位數(shù)的的采樣單元,常見的有8位12位和14位,位數(shù)越大精度越高同時(shí)處理時(shí)間也要變長(zhǎng),等待數(shù)據(jù)測(cè)量完成以后會(huì)有“數(shù)據(jù)妥備”信號(hào),緊接著進(jìn)行2個(gè)字節(jié)的測(cè)量數(shù)據(jù)和一個(gè)字節(jié)的CRC校驗(yàn)確定數(shù)據(jù)沒有發(fā)生錯(cuò)誤以后才能夠?qū)⑦@組數(shù)據(jù)打包發(fā)送;在收到CRC的校驗(yàn)完成以后,表明通訊完成,如果不進(jìn)行CRC-8校驗(yàn)的能在測(cè)量到LSB之后保持高電位的ACK能夠終止通訊且SHT1x會(huì)自動(dòng)進(jìn)入到睡眠模式。詳細(xì)的查看完整的測(cè)量時(shí)序見圖3.3.3。圖:3.3.3 SHT11采樣時(shí)序 3.4感光采樣單元 晾衣架的設(shè)計(jì)要符合日常使用習(xí)慣,實(shí)現(xiàn)室外環(huán)境,溫濕度的監(jiān)控與感光值得檢測(cè),這部分的用到LDR光敏電阻,常見的樓房中樓道的聲控光控?zé)糁芯陀泄饷綦娮瑁R姷墓饷綦娮钑?huì)隨著光照的增強(qiáng)電阻值會(huì)變小。為了直觀的看到光敏值變化我們可以通過ADC0804模數(shù)轉(zhuǎn)換芯片將動(dòng)態(tài)變化的電位差轉(zhuǎn)換成直觀的數(shù)字信號(hào),需要了解到的是0804的采樣電壓是0-5V,8位的分辨率映射到256,根據(jù)0-5V的采樣電勢(shì)差映射到0-256區(qū)間,換算成百分比顯示出來。關(guān)于ADC0804的管腳說明這里不再贅述,詳細(xì)參考使用手冊(cè)。圖3.4.1是光敏電阻與三極管構(gòu)成的光感度檢測(cè)電路,圖3.4.2是ADC0804引腳說明。 圖:3.4.1 感光度測(cè)試電路 圖:3.4.2 ADC0804引腳分布 3.5獨(dú)立按鍵單元設(shè)置了獨(dú)立按鍵用于控制顯示模式和增益控制方式,系統(tǒng)按鍵事件的觸發(fā)條件可以是外部觸發(fā),也可以軟件去抖動(dòng)檢測(cè)IO高低電平變化。這里為了節(jié)省資源開銷,采用按鍵去抖動(dòng),監(jiān)測(cè)電平反轉(zhuǎn)情況確定按鍵是否被按下。按鍵部分的原理圖如下: 圖一 按鍵電路 圖二 按鍵抖動(dòng) 硬件部分的結(jié)構(gòu)通過外接3.3正電壓,流經(jīng)10K上拉電阻后接開關(guān)接回GND。電路很簡(jiǎn)單,上拉電阻正常情況下往IO口輸入的電平為高電平,默認(rèn)拉高電位。按鍵按下的時(shí)候會(huì)有按鍵抖動(dòng)隨后電位編程低電平,按鍵松開的過程亦如此,隨后回復(fù)高電平。機(jī)械按鍵的接觸點(diǎn)抖動(dòng)會(huì)對(duì)IO口監(jiān)測(cè)電頻帶來干擾,通過軟件延時(shí)去抖動(dòng)可以合理的判斷案件的工作狀態(tài)。實(shí)際抖動(dòng)過程狀態(tài)見下上面圖二。按鍵再按下的時(shí)候會(huì)有連續(xù)按下模式和單次按下模式,這里通過軟件按位取反設(shè)置連續(xù)模式還是單次模式,具體實(shí)現(xiàn)方法見附件代碼。 設(shè)計(jì)中要求具備初始值設(shè)定,對(duì)于溫濕度的上下限有合適的設(shè)置范圍,檢測(cè)當(dāng)前的溫濕度實(shí)時(shí)變化與EEPROM中預(yù)存值進(jìn)行比較,從而驅(qū)動(dòng)電機(jī)進(jìn)行角度與高低調(diào)整。按鍵一方面參與了模式控制另一方面人機(jī)交互提供了良好的體驗(yàn),結(jié)合EEPROM將數(shù)據(jù)保存下來,避免了掉電之后的數(shù)據(jù)丟失。由于單片機(jī)I/O帶負(fù)載能有限,所以要驅(qū)動(dòng)電機(jī)轉(zhuǎn)動(dòng)還用到了繼電器控制電路。下圖是電機(jī)驅(qū)動(dòng)控制電路: 圖:3.5.1 電機(jī)驅(qū)動(dòng)單元 第四章:系統(tǒng)軟件流程4.1設(shè)計(jì)流程軟件結(jié)構(gòu)這塊主要采用STM32的內(nèi)部資源,因其內(nèi)置的ADC/DAC的功能很方便,不用再去單獨(dú)設(shè)計(jì)模數(shù)和數(shù)模轉(zhuǎn)換電路。DAC主要功能是驅(qū)動(dòng)增益控制部分,結(jié)合按鍵模式可以設(shè)置出自動(dòng)增益控制或者手動(dòng)增益控制。同時(shí)將控制的結(jié)果反饋輸出到液晶屏幕上,可以很直觀的看到信號(hào)的各種數(shù)據(jù),ADC的反饋可以實(shí)現(xiàn)系統(tǒng)的閉環(huán)增益控制,對(duì)輸出的信號(hào)有直觀的了解與認(rèn)識(shí)。按鍵與液晶結(jié)合可以在顯示模式上有多種選擇,此外系統(tǒng)內(nèi)部的一些定時(shí)器,中斷的等內(nèi)部資源也發(fā)揮了很大的作用。在任務(wù)調(diào)度上起到了隔離保護(hù)的作用,整體采用低功耗、高效處理的工作模式,使系統(tǒng)更加穩(wěn)定且自帶反饋功能。下面是軟件流程結(jié)構(gòu):
4.2系統(tǒng)原理 經(jīng)過上述硬件單元以及軟件流程設(shè)計(jì),整個(gè)流程中用到了單片機(jī),SHT11溫濕度采集及ADC0804模數(shù)轉(zhuǎn)光感值,通過讀寫24C02記錄與裝載值,實(shí)時(shí)數(shù)據(jù)與設(shè)定值進(jìn)行匹配,整個(gè)系統(tǒng)具有實(shí)時(shí)反饋,在proteus7中進(jìn)行了仿真部分仿真原理圖如下: 圖中通過兩片52單片機(jī)的原因是由于1602、單機(jī)控制、SHT11、獨(dú)立按鍵等外設(shè)占用了太多I/O,由于需要給ADC0804提供正常的工作時(shí)序,所以這里直接選擇了兩片52單片機(jī),實(shí)際上可以通過74HC573等鎖存芯片進(jìn)行I/O分配與拓展,相比較而言效果會(huì)好點(diǎn),這里采用兩片也能夠很好地滿足設(shè)計(jì)要求。 第五章:數(shù)據(jù)測(cè)量分析5.1實(shí)驗(yàn)測(cè)試數(shù)據(jù) 本次測(cè)試過程用到了SHT11與LDR光敏電阻,由于仿真的緣故需要在仿真過程中設(shè)置外界環(huán)境因素,人為的模擬溫濕度與光感度。溫濕度根據(jù)SHT11自身的%RH進(jìn)行溫濕度切換,增加按鍵模擬當(dāng)前數(shù)值。光敏電阻為了直觀的看到數(shù)據(jù)變化通過電壓變觀察電阻兩端的電位差變化,比較SHT11本身設(shè)定值與電壓表示數(shù)值,與LCD1602顯示數(shù)據(jù)對(duì)比,觀測(cè)數(shù)據(jù)偏差分析出現(xiàn)誤差原因。詳細(xì)測(cè)試數(shù)據(jù)見表5.1.1 測(cè)試條件:提前設(shè)定溫濕度上下限并保存(溫度:30℃ 濕度:30%) 5.2結(jié)果誤差分析、 通過上表測(cè)量數(shù)據(jù)發(fā)現(xiàn)模擬過程中的溫濕度實(shí)測(cè)值與模擬設(shè)定值有0.2-0.3的實(shí)際誤差,經(jīng)分查閱手冊(cè)發(fā)現(xiàn)SHT11在測(cè)量過程中會(huì)有±3%的測(cè)量誤差,出現(xiàn)上訴情況屬于正常現(xiàn)象,當(dāng)然為更加直觀看到數(shù)據(jù),可以在軟件里面增加誤差值,在顯示到液晶之前對(duì)數(shù)據(jù)提前進(jìn)行預(yù)處理,減去相對(duì)誤差值從而讓結(jié)果顯示出來更加精確。解決方案辦法在軟件中進(jìn)行了處理,見下圖: 
單片機(jī)源碼:
- #include<reg52.h>
- #include <intrins.h>
- #include <math.h>
- #include <stdio.h>
- #include <1602.h>
- #include <sht11.h>
- #include <24c02.h>
-
- #define uchar unsigned char
- #define uint unsigned int
- #define W_cmd 0xa0 //24c02寫指令
- #define R_cmd 0xa1
- uint temp,humi;
- value humi_val,temp_val; //定義兩個(gè)共同體,一個(gè)用于濕度,一個(gè)用于溫度
- uchar error; //用于檢驗(yàn)是否出現(xiàn)錯(cuò)誤
- uchar checksum; //CRC
- uchar TEMP_data[7]; //用于記錄實(shí)測(cè)的溫度
- uchar HUMI_data[6]; //用于記錄實(shí)測(cè)的濕度
- uchar LIGH_data[4]; //用于記錄實(shí)測(cè)光感度
- uchar show_temp[5]; //顯示設(shè)定的溫度
- uchar show_humi[4]; //顯示設(shè)定的濕度
- uchar data temp_humi_cache[4]; //溫濕度設(shè)置緩存
- uchar temp_set; //保存溫度變量
- uchar humi_set; //保存濕度變量
- uchar presskeynum; //按鍵次數(shù)變量
- uchar nn; //用于蜂鳴器
- uchar code word1[]={" a product of "};
- uchar code word2[]={"UNITED ELECTRONS"};
- uchar code word3[]={" Welcome........"};
- sbit k1=P2^0; //選擇按鍵
- sbit k2=P2^1; //增加按鍵
- sbit k3=P2^2; //減小按鍵
- sbit k4=P2^3;// 確認(rèn)按鍵
- sbit led1=P1^4; //溫度過低指示燈
- sbit led2=P1^5; //溫度過高
- sbit led3=P1^6; //濕度低于下限值,報(bào)警,加濕。
- sbit led4=P1^7; //濕度過高,報(bào)警,不調(diào)濕
- sbit motor1=P3^4;
- sbit motor2=P3^5;
- sbit motor3=P3^6;
- sbit motor4=P3^7;
- sbit P2_6=P2^6;
- //********延時(shí)函數(shù)*********
- void delay(uint z) //z為毫秒數(shù)
- {
- int a,b;
- for(a=z;a>0;a--)
- for(b=120;b>0;b--);
- }
- void key()
- {
- uchar m;
- if (k1==0) //調(diào)整按鍵檢測(cè)
- {
- delay(5);
- if (k1==0)
- {
- presskeynum++;
- if(presskeynum==3)
- presskeynum=0;
- while(k1==0); //若一直按下,循環(huán)
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- }
- }
- if(presskeynum==1)//溫度設(shè)置
- {
- if(k2==0) // 加
- {
- delay(300);
- temp_set++;
- if (temp_set>30)
- temp_set=30;
- while(k2==0); //加上此句必須松按鍵才處理
- }
- if(k3==0)//減
- {
- delay(300);
- temp_set--;
- if (temp_set<18)
- temp_set=18;
- while(k3==0); //加上此句必須松按鍵才處理
- }
-
- }
-
- if(presskeynum==2)//濕度設(shè)置
- {
- if(k2==0)// 加
- {
- delay(300);
- humi_set++;
- if (humi_set>99)
- humi_set=99;
- while(k2==0);
- }
- if(k3==0)//減
- {
- delay(300);
- humi_set--;
- if (humi_set<1)
- humi_set=1;
- // while(k3==0); //這句是調(diào)試加入的
- }
-
- }
-
-
- if(k4==0)// 退出鍵 //設(shè)置完初始值以后通過IIC寫入24c02并清屏
- {
- delay(10);
- if(k4==0)
- {
- while(k4==0);
- presskeynum=0;
- temp_humi_cache[0]=temp_set/10;
- temp_humi_cache[1]=temp_set%10;
- temp_humi_cache[2]=humi_set/10;
- temp_humi_cache[3]=humi_set%10;
-
- for(m=0;m<4;m++)
- {
- WriteIIC(W_cmd,0x00+m,temp_humi_cache[m]); //設(shè)定值寫入24c02
- }
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- }
- }
- }
- //主函數(shù)
- void main()
- {
- uchar t;
- uchar temp_adc;
- k1=k2=k3=k4=1;
- motor1=motor2=motor3=motor4=0;
- P2_6=0;
- for (t=0;t<4;t++)
- temp_humi_cache[t]=ReadIIC(W_cmd,0x00+t,R_cmd); //讀入24c02設(shè)定的值
- temp_set=temp_humi_cache[0]*10+temp_humi_cache[1]; //設(shè)置溫度
- humi_set=temp_humi_cache[2]*10+temp_humi_cache[3]; //設(shè)置濕度
- LCD_Initial(); //液晶初始化
- GotoXY(0,0);
- Print_slow(word1);
- GotoXY(0,1);
- Print_slow(word2);
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- GotoXY(0,0);
- Print_slow(word3);
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 //完成系統(tǒng)初始化
- while(1)
- {
- key();
- P1 = 0xff; //P1口初始化
- temp_adc = P1; //讀取光敏值,8位精度最大256
- if(presskeynum==0) //測(cè)量溫濕度
- {
- s_connectionreset(); //啟動(dòng)連接復(fù)位
- error=0; //初始化error=0,即沒有錯(cuò)誤
- error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //溫度測(cè)量值返回到temp.val.i
- error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //濕度測(cè)量值返回到humi_val.i
- if(error!=0)
- s_connectionreset(); //如果發(fā)生錯(cuò)誤,系統(tǒng)復(fù)位
- else
- {
- humi_val.f=(float)humi_val.i; //轉(zhuǎn)換為浮點(diǎn)數(shù)
- temp_val.f=(float)temp_val.i; //轉(zhuǎn)換為浮點(diǎn)數(shù)
- calc_sth10(&humi_val.f,&temp_val.f); //修正相對(duì)濕度及溫度,誤差彌補(bǔ)
- temp=temp_val.f*10;
- humi=humi_val.f*10;
- GotoXY(0,0); //選擇溫度顯示位置
- Print("Temp: C --- "); //5格空格
- GotoXY(0,1); //選擇濕度顯示位置
- Print("Humi: % "); //5格空格
-
- GotoXY(5,0); //設(shè)置溫度顯示位置
- TEMP_data[0]=temp/1000+'0'; //溫度百位
- if (TEMP_data[0]==0x30) //ASCLL = 0
- TEMP_data[0]=0x20; //對(duì)應(yīng)的ASCLL位空格
- TEMP_data[1]=temp%1000/100+'0'; //溫度十位
- if (TEMP_data[1]==0x30 && TEMP_data[0]!=0x30)
- TEMP_data[1]=0x20;
- TEMP_data[2]=temp%100/10+'0'; //溫度個(gè)位
- TEMP_data[3]=0x2e; //小數(shù)點(diǎn)
- TEMP_data[4]=temp%10+'0'; //溫度小數(shù)點(diǎn)后第一位
- TEMP_data[5]=0xdf; //顯示溫度符號(hào)℃書上是第248
- TEMP_data[6]='\0'; //實(shí)際上0xdf對(duì)應(yīng)的是小圓圈
- Print(TEMP_data); //輸出溫度
-
- GotoXY(5,1);
- HUMI_data[0]=humi/1000+'0'; //濕度百位
- if (HUMI_data[0]==0x30)
- HUMI_data[0]=0x20;
- HUMI_data[1]=humi%1000/100+'0'; //濕度十位
- HUMI_data[2]=humi%100/10+'0'; //濕度個(gè)位
- HUMI_data[3]='.' ; //小數(shù)點(diǎn)
- HUMI_data[4]=humi%10+'0'; //濕度小數(shù)點(diǎn)后第一位
- HUMI_data[5]='\0';
- Print(HUMI_data); //輸出濕度
- GotoXY(13,1);
- LIGH_data[0] = temp_adc%1000/100+'0';
- // if(LIGH_data[0] == 0x30)
- // LIGH_data[0] = 0x20;
- LIGH_data[1] = temp_adc%100/10+'0';
- LIGH_data[2] = temp_adc%10+'0';
- LIGH_data[3] = '\0';
- Print(LIGH_data);
-
- if ((temp/10)<temp_set)
- {
- motor1=1;
- motor2=0;
- }else if ((temp/10)>=temp_set)
- {
- motor2=1;
- motor1=0;
-
- }
- if ((humi/10)<humi_set)
- {
- motor3=1;
- motor4=0;
- }
- else if ((humi/10)>=humi_set)
- {
- motor4=1;
- motor3=0;
- }
-
- } //else
- } //if
-
- if(presskeynum==1) //設(shè)定溫度時(shí)顯示的內(nèi)容
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址(內(nèi)含仿真與源碼等全套資料):
智能晾衣架.docx
(1.6 MB, 下載次數(shù): 512)
2018-5-27 16:08 上傳
點(diǎn)擊文件名下載附件
設(shè)計(jì)文檔
光敏電阻.zip
(36.01 KB, 下載次數(shù): 326)
2018-5-27 16:09 上傳
點(diǎn)擊文件名下載附件
光敏模擬
溫濕采集.zip
(158.77 KB, 下載次數(shù): 318)
2018-5-27 16:09 上傳
點(diǎn)擊文件名下載附件
溫濕度模擬
原件詳解.zip
(4.75 MB, 下載次數(shù): 400)
2018-5-27 16:10 上傳
點(diǎn)擊文件名下載附件
單元電路元件詳解
|