久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 22412|回復(fù): 24
收起左側(cè)

基于51單片機(jī)的智能晾衣架設(shè)計(jì)資料(論文+源碼+仿真)

  [復(fù)制鏈接]
ID:263159 發(fā)表于 2018-5-27 16:15 | 顯示全部樓層 |閱讀模式
在Proteus中通過模擬溫濕度,外接溫濕度值,將模擬到的數(shù)據(jù)進(jìn)行采集與A/D轉(zhuǎn)換,顯示到LCD液晶并控制后級(jí)電路進(jìn)行反饋,完成晾衣架的功能。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
智能晾衣架
第三章:硬件單元電路
經(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ù)與引腳分布見下圖:
指令集和
兼容MCS-51產(chǎn)品
FLASH
8個(gè)字節(jié)重復(fù)擦寫
擦寫周期
1000次重復(fù)擦寫
靜態(tài)操作
0HZ –- 24MHZ
編程I/O
32個(gè)可編程I/O
功耗模式
低功耗和掉電模式
中斷源個(gè)數(shù)
8個(gè)中斷控制單元
定時(shí)器個(gè)數(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%)
測(cè)量項(xiàng)目
溫度Temp
濕度Humi
光敏值%
1電機(jī)狀態(tài)
2組電機(jī)狀態(tài)
設(shè)定值
31.0℃
29.0%
16
\
\
實(shí)際值
30.7℃
28.8%
16
回收衣物
向左調(diào)整
誤差
0.3℃
0.2%
0.00
\
\
測(cè)量項(xiàng)目
溫度Temp
濕度Humi
光敏值%
電機(jī)狀態(tài)
電機(jī)狀態(tài)
設(shè)定值
31.0℃
31.0%
22
\
\
實(shí)際值
30.7℃
30.8%
22
回收衣物
向右調(diào)整
誤差
0.3℃
0.2%
0.00
\
\
測(cè)量項(xiàng)目
溫度Temp
濕度Humi
光敏值%
1電機(jī)組狀態(tài)
2組電機(jī)狀態(tài)
設(shè)定值
30.0℃
29.0%
55
\
\
實(shí)際值
28.8℃
28.8%
55
晾曬衣物
向左調(diào)整
誤差
0.2℃
0.2%
0.00
\
\
測(cè)量項(xiàng)目
溫度Temp
濕度Humi
光敏值%
電機(jī)狀態(tài)
電機(jī)狀態(tài)
設(shè)定值
31.0℃
29.0%
60
\
\
實(shí)際值
29.8℃
28.8%
60
回收衣物
向左調(diào)整
誤差
0.2℃
0.2%
0.00
\
\
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ī)源碼:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include <math.h>   
  4. #include <stdio.h>
  5. #include <1602.h>
  6. #include <sht11.h>
  7. #include <24c02.h>
  8.    
  9. #define uchar unsigned char
  10. #define uint  unsigned  int
  11. #define W_cmd 0xa0   //24c02寫指令
  12. #define R_cmd 0xa1
  13. uint  temp,humi;
  14. value humi_val,temp_val;             //定義兩個(gè)共同體,一個(gè)用于濕度,一個(gè)用于溫度
  15. uchar error;                        //用于檢驗(yàn)是否出現(xiàn)錯(cuò)誤
  16. uchar checksum;                              //CRC

  17. uchar TEMP_data[7];                 //用于記錄實(shí)測(cè)的溫度
  18. uchar HUMI_data[6];                 //用于記錄實(shí)測(cè)的濕度
  19. uchar LIGH_data[4];                                //用于記錄實(shí)測(cè)光感度

  20. uchar show_temp[5];                   //顯示設(shè)定的溫度
  21. uchar show_humi[4];                   //顯示設(shè)定的濕度

  22. uchar data temp_humi_cache[4];         //溫濕度設(shè)置緩存
  23. uchar temp_set;                 //保存溫度變量
  24. uchar humi_set;                         //保存濕度變量
  25. uchar presskeynum;                            //按鍵次數(shù)變量
  26. uchar nn;                                    //用于蜂鳴器
  27. uchar code word1[]={"  a product of  "};
  28. uchar code word2[]={"UNITED ELECTRONS"};
  29. uchar code word3[]={" Welcome........"};
  30. sbit k1=P2^0; //選擇按鍵
  31. sbit k2=P2^1; //增加按鍵
  32. sbit k3=P2^2; //減小按鍵
  33. sbit k4=P2^3;// 確認(rèn)按鍵
  34. sbit led1=P1^4;        //溫度過低指示燈
  35. sbit led2=P1^5;        //溫度過高
  36. sbit led3=P1^6;        //濕度低于下限值,報(bào)警,加濕。
  37. sbit led4=P1^7;        //濕度過高,報(bào)警,不調(diào)濕
  38. sbit motor1=P3^4;
  39. sbit motor2=P3^5;
  40. sbit motor3=P3^6;
  41. sbit motor4=P3^7;
  42. sbit P2_6=P2^6;

  43. //********延時(shí)函數(shù)*********
  44. void delay(uint z)  //z為毫秒數(shù)

  45. {
  46.      int a,b;
  47.      for(a=z;a>0;a--)
  48.      for(b=120;b>0;b--);
  49. }
  50. void key()
  51. {
  52.      uchar m;
  53.      if (k1==0) //調(diào)整按鍵檢測(cè)
  54.      {
  55.          delay(5);
  56.          if (k1==0)
  57.          {
  58.              presskeynum++;
  59.              if(presskeynum==3)
  60.              presskeynum=0;
  61.              while(k1==0);         //若一直按下,循環(huán)
  62.              LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  63.          }
  64.      }
  65.      if(presskeynum==1)//溫度設(shè)置
  66.      {
  67.          if(k2==0)    // 加
  68.          {
  69.              delay(300);
  70.              temp_set++;
  71.              if (temp_set>30)
  72.              temp_set=30;
  73.              while(k2==0);       //加上此句必須松按鍵才處理
  74.           }
  75.           if(k3==0)//減
  76.           {
  77.                delay(300);
  78.                 temp_set--;
  79.                 if (temp_set<18)
  80.                 temp_set=18;
  81.                 while(k3==0);       //加上此句必須松按鍵才處理
  82.            }
  83.      
  84.        }
  85.       
  86.          if(presskeynum==2)//濕度設(shè)置
  87.          {
  88.               if(k2==0)// 加
  89.               {
  90.                   delay(300);
  91.                   humi_set++;
  92.                   if (humi_set>99)
  93.                   humi_set=99;
  94.                   while(k2==0);
  95.                 }
  96.                 if(k3==0)//減
  97.                 {
  98.                     delay(300);
  99.                     humi_set--;
  100.                     if (humi_set<1)
  101.                     humi_set=1;
  102. //                                        while(k3==0);                                                        //這句是調(diào)試加入的
  103.                   }
  104.       
  105.            }
  106.      

  107.       
  108.        if(k4==0)// 退出鍵                                                                                        //設(shè)置完初始值以后通過IIC寫入24c02并清屏       
  109.        {
  110.             delay(10);
  111.             if(k4==0)
  112.             {
  113.                 while(k4==0);
  114.                 presskeynum=0;
  115.                 temp_humi_cache[0]=temp_set/10;
  116.                 temp_humi_cache[1]=temp_set%10;
  117.                 temp_humi_cache[2]=humi_set/10;
  118.                 temp_humi_cache[3]=humi_set%10;
  119.       
  120.                 for(m=0;m<4;m++)
  121.                 {  
  122.                      WriteIIC(W_cmd,0x00+m,temp_humi_cache[m]);      //設(shè)定值寫入24c02
  123.                 }
  124.                 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  125.              }
  126.         }
  127. }

  128. //主函數(shù)

  129. void main()
  130. {
  131.          uchar t;
  132.          uchar temp_adc;
  133.          k1=k2=k3=k4=1;
  134.          motor1=motor2=motor3=motor4=0;
  135.          P2_6=0;
  136.      for (t=0;t<4;t++)
  137.      temp_humi_cache[t]=ReadIIC(W_cmd,0x00+t,R_cmd);                        //讀入24c02設(shè)定的值
  138.      temp_set=temp_humi_cache[0]*10+temp_humi_cache[1];                        //設(shè)置溫度
  139.      humi_set=temp_humi_cache[2]*10+temp_humi_cache[3];                        //設(shè)置濕度
  140.      LCD_Initial();                                                                                            //液晶初始化
  141.      GotoXY(0,0);
  142.      Print_slow(word1);
  143.      GotoXY(0,1);
  144.      Print_slow(word2);
  145.      LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  146.      GotoXY(0,0);
  147.      Print_slow(word3);
  148.      LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏          //完成系統(tǒng)初始化           
  149.      while(1)
  150.      {
  151.                      key();
  152.                          P1 = 0xff;                                                                                         //P1口初始化
  153.                          temp_adc = P1;                                                                                //讀取光敏值,8位精度最大256
  154.              if(presskeynum==0)         //測(cè)量溫濕度
  155.              {                                                                  
  156.              s_connectionreset(); //啟動(dòng)連接復(fù)位
  157.              error=0;                                                          //初始化error=0,即沒有錯(cuò)誤
  158.              error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //溫度測(cè)量值返回到temp.val.i
  159.              error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //濕度測(cè)量值返回到humi_val.i
  160.              if(error!=0)
  161.                          s_connectionreset();                                                                    //如果發(fā)生錯(cuò)誤,系統(tǒng)復(fù)位
  162.              else
  163.                  {
  164.                                         humi_val.f=(float)humi_val.i;                   //轉(zhuǎn)換為浮點(diǎn)數(shù)
  165.                                         temp_val.f=(float)temp_val.i;                   //轉(zhuǎn)換為浮點(diǎn)數(shù)
  166.                                         calc_sth10(&humi_val.f,&temp_val.f);            //修正相對(duì)濕度及溫度,誤差彌補(bǔ)
  167.                                         temp=temp_val.f*10;
  168.                                         humi=humi_val.f*10;
  169.                                         GotoXY(0,0);                                    //選擇溫度顯示位置
  170.                                         Print("Temp:      C --- ");                          //5格空格
  171.                                         GotoXY(0,1);                                    //選擇濕度顯示位置
  172.                                         Print("Humi:      %     ");                          //5格空格
  173.                                                                   
  174.                                         GotoXY(5,0);                                    //設(shè)置溫度顯示位置
  175.                                         TEMP_data[0]=temp/1000+'0';                                                //溫度百位
  176.                                         if (TEMP_data[0]==0x30)                                                 //ASCLL = 0
  177.                                         TEMP_data[0]=0x20;                                                            //對(duì)應(yīng)的ASCLL位空格
  178.                                         TEMP_data[1]=temp%1000/100+'0';                        //溫度十位      
  179.                                         if (TEMP_data[1]==0x30 && TEMP_data[0]!=0x30)
  180.                                         TEMP_data[1]=0x20;
  181.                                         TEMP_data[2]=temp%100/10+'0';                   //溫度個(gè)位
  182.                                         TEMP_data[3]=0x2e;                              //小數(shù)點(diǎn)
  183.                                         TEMP_data[4]=temp%10+'0';                       //溫度小數(shù)點(diǎn)后第一位            
  184.                                         TEMP_data[5]=0xdf;                              //顯示溫度符號(hào)℃書上是第248
  185.                                         TEMP_data[6]='\0';                                                                //實(shí)際上0xdf對(duì)應(yīng)的是小圓圈
  186.                                         Print(TEMP_data);                               //輸出溫度
  187.                                                                                                 
  188.                                         GotoXY(5,1);                                    
  189.                                         HUMI_data[0]=humi/1000+'0';                     //濕度百位                           
  190.                                         if (HUMI_data[0]==0x30)
  191.                                         HUMI_data[0]=0x20;
  192.                                         HUMI_data[1]=humi%1000/100+'0';                         //濕度十位      
  193.                                         HUMI_data[2]=humi%100/10+'0';                            //濕度個(gè)位
  194.                                         HUMI_data[3]='.' ;                                       //小數(shù)點(diǎn)
  195.                                         HUMI_data[4]=humi%10+'0';                                //濕度小數(shù)點(diǎn)后第一位   
  196.                                         HUMI_data[5]='\0';
  197.                                         Print(HUMI_data);                                        //輸出濕度

  198.                                         GotoXY(13,1);
  199.                                         LIGH_data[0] = temp_adc%1000/100+'0';
  200. //                                        if(LIGH_data[0] == 0x30)
  201. //                                        LIGH_data[0] = 0x20;
  202.                                         LIGH_data[1] = temp_adc%100/10+'0';
  203.                                         LIGH_data[2] = temp_adc%10+'0';
  204.                                         LIGH_data[3] = '\0';
  205.                                         Print(LIGH_data);  
  206.                                                                                                                                
  207.                                            if ((temp/10)<temp_set)                                           
  208.                                         {
  209.                                                 motor1=1;
  210.                                                 motor2=0;                               
  211.                                         }else if ((temp/10)>=temp_set)
  212.                                         {
  213.                                                 motor2=1;
  214.                                                 motor1=0;
  215.                                        
  216.                                         }
  217.                                         if ((humi/10)<humi_set)
  218.                                         {
  219.                                                 motor3=1;
  220.                                                 motor4=0;
  221.                                         }
  222.                                         else if ((humi/10)>=humi_set)
  223.                                         {       
  224.                                                 motor4=1;
  225.                                                 motor3=0;
  226.                                         }
  227.                                                                                        
  228.                                 }  //else
  229.                         }  //if
  230.                                        
  231.                         if(presskeynum==1)  //設(shè)定溫度時(shí)顯示的內(nèi)容
  232.                         {
  233. ……………………

  234. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

0.png

全部資料51hei下載地址(內(nèi)含仿真與源碼等全套資料
智能晾衣架.docx (1.6 MB, 下載次數(shù): 512)
光敏電阻.zip (36.01 KB, 下載次數(shù): 326)
溫濕采集.zip (158.77 KB, 下載次數(shù): 318)
原件詳解.zip (4.75 MB, 下載次數(shù): 400)


評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:351620 發(fā)表于 2018-6-14 10:58 | 顯示全部樓層
看的不是很明白,有詳細(xì)的嗎?
搞了幾個(gè)小時(shí),最后用Proteus7.5打開終于成功了
51hei.png
回復(fù)

使用道具 舉報(bào)

ID:358206 發(fā)表于 2018-6-25 09:36 | 顯示全部樓層
努力發(fā)原創(chuàng)賺幣下載
回復(fù)

使用道具 舉報(bào)

ID:392792 發(fā)表于 2018-9-6 15:07 | 顯示全部樓層
點(diǎn)了下載,但是沒有下載成功,黑幣也扣掉了,怎么辦....
回復(fù)

使用道具 舉報(bào)

ID:458348 發(fā)表于 2019-1-14 22:44 | 顯示全部樓層
怎么沒看到附件?下載的之word 文檔,在哪個(gè)磁盤?
回復(fù)

使用道具 舉報(bào)

ID:266070 發(fā)表于 2019-4-12 12:20 | 顯示全部樓層
感覺不怎么清楚
回復(fù)

使用道具 舉報(bào)

ID:515998 發(fā)表于 2019-7-13 16:25 | 顯示全部樓層
很實(shí)用
回復(fù)

使用道具 舉報(bào)

ID:419264 發(fā)表于 2019-10-8 13:45 | 顯示全部樓層
老哥,仿真好像不成功啊,LCD只是亮了,沒有顯示任何東西
回復(fù)

使用道具 舉報(bào)

ID:419264 發(fā)表于 2019-10-8 13:47 | 顯示全部樓層
老哥,仿真好像不成功啊,LCD只是亮了,沒有顯示任何東西,能指導(dǎo)一下嗎?謝了
回復(fù)

使用道具 舉報(bào)

ID:332895 發(fā)表于 2019-10-18 22:26 | 顯示全部樓層
下載了一篇文檔,里面極不完整,缺少很多內(nèi)容
回復(fù)

使用道具 舉報(bào)

ID:245429 發(fā)表于 2019-12-2 20:30 | 顯示全部樓層
不完整只有溫度采集和電阻,仿真沒有
回復(fù)

使用道具 舉報(bào)

ID:688785 發(fā)表于 2020-1-30 15:53 | 顯示全部樓層
123456118 發(fā)表于 2018-6-25 09:36
老哥能把文件共享一下么

老哥拿到文件了嗎 我也想要
回復(fù)

使用道具 舉報(bào)

ID:693508 發(fā)表于 2020-2-17 18:58 | 顯示全部樓層
15038608249 發(fā)表于 2019-10-8 13:47
老哥,仿真好像不成功啊,LCD只是亮了,沒有顯示任何東西,能指導(dǎo)一下嗎?謝了

這個(gè)帖子的東西全嗎?
回復(fù)

使用道具 舉報(bào)

ID:693508 發(fā)表于 2020-2-19 19:11 | 顯示全部樓層
15038608249 發(fā)表于 2019-10-8 13:47
老哥,仿真好像不成功啊,LCD只是亮了,沒有顯示任何東西,能指導(dǎo)一下嗎?謝了

老哥,你下的文件里面東西全嗎?能共享一下嗎,最近為文檔的事弄得頭疼
回復(fù)

使用道具 舉報(bào)

ID:552550 發(fā)表于 2020-3-11 22:49 | 顯示全部樓層
Eli_ 發(fā)表于 2019-10-18 22:26
下載了一篇文檔,里面極不完整,缺少很多內(nèi)容

仿真得如何???
回復(fù)

使用道具 舉報(bào)

ID:716583 發(fā)表于 2020-4-13 15:01 | 顯示全部樓層

你好,為什么我的光強(qiáng)一直都是顯示255,光敏檢測(cè)那部分是不是有問題?
回復(fù)

使用道具 舉報(bào)

ID:161248 發(fā)表于 2020-4-26 11:27 | 顯示全部樓層
仿真呢
回復(fù)

使用道具 舉報(bào)

ID:697395 發(fā)表于 2020-5-8 20:21 | 顯示全部樓層
也不知道說的是不是真的
回復(fù)

使用道具 舉報(bào)

ID:937315 發(fā)表于 2021-6-15 08:23 | 顯示全部樓層
17854168230 發(fā)表于 2018-6-14 10:58
看的不是很明白,有詳細(xì)的嗎?
搞了幾個(gè)小時(shí),最后用Proteus7.5打開終于成功了

里面沒有仿真啊
回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2021-6-16 00:21 | 顯示全部樓層

dsn文件就是仿真工程文件, 用Proteus7.5打開即可,不要用別的版本
回復(fù)

使用道具 舉報(bào)

ID:1028005 發(fā)表于 2022-5-23 23:33 | 顯示全部樓層
左下角的AT89C52 芯片的引腳不清楚 可以發(fā)清晰一點(diǎn)的嗎
回復(fù)

使用道具 舉報(bào)

ID:1028005 發(fā)表于 2022-5-24 00:00 | 顯示全部樓層
有人有把這個(gè)智能晾衣架系統(tǒng)運(yùn)行成功嗎
回復(fù)

使用道具 舉報(bào)

ID:1028005 發(fā)表于 2022-5-26 16:00 | 顯示全部樓層
17854168230 發(fā)表于 2018-6-14 10:58
看的不是很明白,有詳細(xì)的嗎?
搞了幾個(gè)小時(shí),最后用Proteus7.5打開終于成功了

有完整一點(diǎn)的嗎左下角芯片的引腳不清楚
回復(fù)

使用道具 舉報(bào)

ID:1028005 發(fā)表于 2022-5-26 16:01 | 顯示全部樓層

可以打開運(yùn)行成功嗎
回復(fù)

使用道具 舉報(bào)

ID:696448 發(fā)表于 2022-9-8 17:01 | 顯示全部樓層
只有我沒看到仿真在哪下載嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜电影福利 | 国产精品亚洲成在人线 | 日韩成年人视频在线 | 91精品国产91久久综合桃花 | 成年人免费网站 | 狠狠操狠狠操 | 一级欧美 | 欧美性久久 | 欧美三区| 国产成人精品久久 | 久视频在线 | av成人在线观看 | 国产在线视频一区 | 成人国产午夜在线观看 | 久久国产亚洲 | 欧美日韩在线观看视频 | 一区不卡在线观看 | 天天欧美 | 天天看天天爽 | 免费午夜视频在线观看 | 黄色免费在线观看 | 国内精品在线视频 | 欧美亚洲视频在线观看 | 欧美男男videos | 在线只有精品 | 免费看国产一级特黄aaaa大片 | 午夜在线视频一区二区三区 | 色永久| 综合一区二区三区 | 国产精品久久久久久久久久软件 | 99久视频| 国产精品视频在线观看 | 中文字幕一区二区三区精彩视频 | 精品欧美二区 | 午夜色婷婷 | 亚洲一区毛片 | 四虎最新视频 | 久久精品成人一区 | 毛片一级片| 国产精品毛片一区二区三区 | 日韩欧美在线视频播放 |