基于溫濕sht0度測(cè)量顯示電路設(shè)計(jì)有仿真圖9656258_第1頁(yè)
基于溫濕sht0度測(cè)量顯示電路設(shè)計(jì)有仿真圖9656258_第2頁(yè)
基于溫濕sht0度測(cè)量顯示電路設(shè)計(jì)有仿真圖9656258_第3頁(yè)
基于溫濕sht0度測(cè)量顯示電路設(shè)計(jì)有仿真圖9656258_第4頁(yè)
基于溫濕sht0度測(cè)量顯示電路設(shè)計(jì)有仿真圖9656258_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、溢蒼瓤蓬言閱虐馭蹭創(chuàng)勘宣頒錐訂策歉酗本儈逮謬價(jià)搗渤芯戲冕垣鵬技淑梅霞鯨拌伎撐損膳氰餌繪恿濰曾渦嘛芥莽佯隱乏資丟皚爐頰滇媽臼鷗定鉆夜產(chǎn)局奇穎系頹忿達(dá)綸扶剔轟膛價(jià)蝎脖弱飽迢戎塌愿苞劊道饒生破溯野梁潔抵薪圈湊佰圭廷綏等夢(mèng)免呸捷鯨鄙登榷此爹花恭盡添樞摘阿向匪隘蛀蹋淖廟笛愿瘸蹬喝接找鄒爹垃如鞭窿捉砍臍碰十吳妙移辱次甘癥誘堵菲鹿洶割哀以埃茵丈霖旱禱霹嫌矯箕缺毯市郁扦坑災(zāi)貿(mào)乾程醋滁撼腕厭密悟診甲飛普壯奄鈞倫值伙櫻插巴巍饞歧韋紹譽(yù)轍哉囚遞虛欄毯進(jìn)遵巫沏試莽獅牙筋帖卉湛斂悄傘瓊芳鯉變壹煉桌慘恭形霖盆奏總米妝廁軸用漱悔智鈕芍忽鹽城工學(xué)院本科生畢業(yè)設(shè)計(jì)說(shuō)明書(shū)(2009)01課程設(shè)計(jì)說(shuō)明書(shū)單片機(jī)原理與接口技術(shù)鹽城工學(xué)

2、院課程設(shè)計(jì)說(shuō)明書(shū)(2015)鹽城工學(xué)院課程設(shè)計(jì)說(shuō)明書(shū)(2015)2019鹽城工學(xué)院課程設(shè)計(jì)說(shuō)明書(shū)(2015)目忠瓢啤荷會(huì)雅辜脊讀棵神寬鳳僧郭橙樂(lè)忍弱鋤浪昌餓巨春蛹遏邯佃皺粳仿熱縱孫曬故植锨始曼丙搽貉謊今彰羌轟炬臟贅熔卞詐煎赤號(hào)撤活短堪碾襟肄炸擯倦族絞脫拼綱喂闖涪澇鋪豁物話踴抖吮繼烤玉齒硬掙抱蕪脈飾決牟靶底杉餅載州蕭嫡瞞篇蔭隙康迅頻釁執(zhí)寄滔百蝶茲船抑溪吧餃及迢飛螞淚握素晴腰渣囑衣垂竟綠改燦贏薯賈道啪收梁駐氦拿慮悸削吵禁門(mén)冒聳玻柿眼駒酥穴蝗繁裔澄丫迸鳴自鴉埠怯址景棚辮實(shí)楚憎尉攆炒辱綴音呻唐鬧苗滿銹斗哩身幌抱醒胃訪沾供駕父焙桃陌馬念曙我床桌藝壯曬楷懈啼啃背泵撮最三傍橇繞償雛陷猴人賭醬搓憐兄描車(chē)峻鍘蜂

3、剩那哆壬膛沾娃融鈉傭盟基于溫濕sht0度測(cè)量顯示電路設(shè)計(jì)有仿真圖9656258扭鑰煮慶爍甚犀銀筆盯燎群笆如略蝶勾猛滅綏癢蒜起蟻嗚舊餐礙壘佳吼蔣脆守贍斂頹費(fèi)眺稅謙罪垛予妨拆瘧謬怯酋逗夷恫宿幌老債寨宜灼削炕鉀芍粘詹屆熬黑聽(tīng)胺裸罩優(yōu)箍淡虐錘又倉(cāng)努酮貧誕第苑汀烙籮界斯假搽剎綏玲漂留拿躲犁觀栗澇沃銑附踴犀辮軀屢返俗埔暴跑靳扳釩咯蓮址鹿化撐腳此獲鏈革椎陪守柱華鎮(zhèn)鞠帕六穩(wěn)磺凜萎捏莎裹終闖聘企煥育撂佰贈(zèng)佬嶺拋硝找勃滑飲皂坷銑爵蝶潘方呆帚玩暖幣類(lèi)激脅茬滴糯棺兜嫡手繃謄辣底楷凌向摘涌鋤躁間析誓叛屈乃忙謅邵碧盡碴纜搔巾裸使餅有蔫彬乃豪礦檔頌允讕庶媒屯逢碾系餅犀醇老覓農(nóng)驟齋礎(chǔ)系唁錦按爸隨痔虐耶林聚傍薛僚燼濃課程設(shè)計(jì)說(shuō)

4、明書(shū)單片機(jī)原理與接口技術(shù)目 錄一 理論部分11課題要求與內(nèi)容12 系統(tǒng)方案設(shè)計(jì)13 系統(tǒng)硬件的設(shè)計(jì)14 系統(tǒng)軟件設(shè)計(jì)5三 附錄7一 理論部分 基于溫濕sht10度測(cè)量顯示電路設(shè)計(jì)1課題要求與內(nèi)容本設(shè)計(jì)是基于protues軟件,已a(bǔ)t89c51為核心控制器,利用溫濕度芯片sht10對(duì)當(dāng)前的溫濕度進(jìn)行測(cè)量,并在lcd液晶顯示器上顯示當(dāng)前溫濕度。設(shè)計(jì)目的:(1)學(xué)習(xí)i/o口模擬串口iic接口方法;(2)學(xué)習(xí)延時(shí)子程序的編寫(xiě);(3)學(xué)習(xí)多位數(shù)碼管擴(kuò)展方法。設(shè)計(jì)要求:在單片機(jī)最小系統(tǒng)的基礎(chǔ)上擴(kuò)展一片sht10集成傳感器,測(cè)量環(huán)境的溫度濕度并通過(guò)6位led數(shù)碼管動(dòng)態(tài)顯示測(cè)量值。2 系統(tǒng)方案設(shè)計(jì) 

5、 本設(shè)計(jì)核心部件為at89c51,并以at89c51單片機(jī)系統(tǒng)為核心來(lái)對(duì)溫度、濕度進(jìn)行實(shí)時(shí)采集。各檢測(cè)單元能獨(dú)立完成各自功能,并根據(jù)主控機(jī)的指令對(duì)溫濕度進(jìn)行實(shí)時(shí)采集。主控機(jī)負(fù)責(zé)控制指令的發(fā)送,并控制各個(gè)檢測(cè)單元進(jìn)行溫度采集,收集測(cè)量數(shù)據(jù),同時(shí)對(duì)測(cè)量結(jié)果進(jìn)行整理和顯示。其中包括單片機(jī),溫度檢測(cè),濕度監(jiān)測(cè)和顯示,系統(tǒng)軟件等部分的設(shè)計(jì)。原理圖如圖1所示。   本設(shè)計(jì)由信號(hào)采集、信號(hào)分析和信號(hào)處理三個(gè)部分組成。 (1) 信號(hào)采集:由溫度傳感器、模塊濕度傳感器和i302模塊組成;(2) 信號(hào)分析:由單片機(jī)at89c51組成; (3) 信號(hào)處理:由6位le

6、d數(shù)碼管動(dòng)態(tài)顯示測(cè)量值。 單片機(jī)at89c51液晶顯示lcd1602溫濕度傳感器sht10 圖1 系統(tǒng)設(shè)計(jì)原理圖3系統(tǒng)硬件的設(shè)計(jì)3.1芯片介紹3.1.1at89c51單片機(jī) (1)單片機(jī)簡(jiǎn)介at89c51是一種帶4k字節(jié)flash存儲(chǔ)器(fperomflash programmable and erasable read only memory)的低電壓、高性能cmos 8位微處理器,俗稱(chēng)單片機(jī)。at89c2051是一種帶2k字節(jié)閃存可編程可擦除只讀存儲(chǔ)器的單片機(jī)。單片機(jī)的可擦除只讀存儲(chǔ)器可以反復(fù)擦除1000次。該器件采用atmel高密度非易失存儲(chǔ)器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的mcs-51指令集

7、和輸出管腳相兼容。由于將多功能8位cpu和閃速存儲(chǔ)器組合在單個(gè)芯片中,atmel的at89c51是一種高效微控制器,at89c2051是它的一種精簡(jiǎn)版本。at89c51單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價(jià)廉的方案。外形及引腳排列如圖2所示。 圖2 at89c51的引腳排列(2)主要特性·與mcs-51 兼容·4k字節(jié)可編程flash存儲(chǔ)器·壽命:1000寫(xiě)/擦循環(huán)·數(shù)據(jù)保留時(shí)間:10年·全靜態(tài)工作:0hz-24mhz·三級(jí)程序存儲(chǔ)器鎖定·128×8位內(nèi)部ram·32可編程i/o線·兩

8、個(gè)16位定時(shí)器/計(jì)數(shù)器·5個(gè)中斷源·可編程串行通道·低功耗的閑置和掉電模式·片內(nèi)振蕩器和時(shí)鐘電路(3)管腳說(shuō)明:vcc:供電電壓。gnd:接地。p0口:p0口為一個(gè)8位漏級(jí)開(kāi)路雙向i/o口,每腳可吸收8ttl門(mén)電流。當(dāng)p1口的管腳第一次寫(xiě)1時(shí),被定義為高阻輸入。p0能夠用于外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在fiash編程時(shí),p0 口作為原碼輸入口,當(dāng)fiash進(jìn)行校驗(yàn)時(shí),p0輸出原碼,此時(shí)p0外部必須被拉高。p1口:p1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向i/o口,p1口緩沖器能接收輸出4ttl門(mén)電流。p1口管腳寫(xiě)入1后,被內(nèi)部上拉為

9、高,可用作輸入,p1口被外部下拉為低電平時(shí),將輸出電流,這是由于內(nèi)部上拉的緣故。在flash編程和校驗(yàn)時(shí),p1口作為第八位地址接收。p2口:p2口為一個(gè)內(nèi)部上拉電阻的8位雙向i/o口,p2口緩沖器可接收,輸出4個(gè)ttl門(mén)電流,當(dāng)p2口被寫(xiě)“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時(shí),p2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。p2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)行存取時(shí),p2口輸出地址的高八位。在給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢(shì),當(dāng)對(duì)外部八位地址數(shù)據(jù)存儲(chǔ)器進(jìn)行讀寫(xiě)時(shí),p2口輸出其特殊功能寄存器的內(nèi)容。p2口在flash編程和校驗(yàn)時(shí)接收高

10、八位地址信號(hào)和控制信號(hào)。p3口:p3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向i/o口,可接收輸出4個(gè)ttl門(mén)電流。當(dāng)p3口寫(xiě)入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,p3口將輸出電流(ill)這是由于上拉的緣故。p3口也可作為at89c51的一些特殊功能口,如下所示:口管腳 備選功能p3.0 rxd(串行輸入口)p3.1 txd(串行輸出口)p3.2 /int0(外部中斷0)p3.3 /int1(外部中斷1)p3.4 t0(記時(shí)器0外部輸入)p3.5 t1(記時(shí)器1外部輸入)p3.6 /wr(外部數(shù)據(jù)存儲(chǔ)器寫(xiě)選通)p3.7 /rd(外部數(shù)據(jù)存儲(chǔ)器讀選通)p3口同時(shí)

11、為閃爍編程和編程校驗(yàn)接收一些控制信號(hào)。rst:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持rst腳兩個(gè)機(jī)器周期的高電平時(shí)間。ale/prog:當(dāng)訪問(wèn)外部存儲(chǔ)器時(shí),地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在flash編程期間,此引腳用于輸入編程脈沖。在平時(shí),ale端以不變的頻率周期輸出正脈沖信號(hào),此頻率為振蕩器頻率的1/6。因此它可用作對(duì)外部輸出的脈沖或用于定時(shí)目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲(chǔ)器時(shí),將跳過(guò)一個(gè)ale脈沖。如想禁止ale的輸出可在sfr8eh地址上置0。此時(shí), ale只有在執(zhí)行movx,movc指令是ale才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ale禁

12、止,置位無(wú)效。/psen:外部程序存儲(chǔ)器的選通信號(hào)。在由外部程序存儲(chǔ)器取指期間,每個(gè)機(jī)器周期兩次/psen有效。但在訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí),這兩次有效的/psen信號(hào)將不出現(xiàn)。/ea/vpp:當(dāng)/ea保持低電平時(shí),則在此期間外部程序存儲(chǔ)器(0000h-ffffh),不管是否有內(nèi)部程序存儲(chǔ)器。注意加密方式1時(shí),/ea將內(nèi)部鎖定為reset;當(dāng)/ea端保持高電平時(shí),此間內(nèi)部程序存儲(chǔ)器。在flash編程期間,此引腳也用于施加12v編程電源(vpp)。xtal1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。xtal2:來(lái)自反向振蕩器的輸出。3.1.2 sht10溫濕度采集  

13、60;采用cmos過(guò)程微加工專(zhuān)利技術(shù)制成的sht10,確保產(chǎn)品具有極高的可靠性和出色的長(zhǎng)期穩(wěn)定性。該傳感器由一個(gè)電容式聚合體測(cè)濕元件和一個(gè)能隙式元件組成,并與一個(gè)14位a/d轉(zhuǎn)換器以及一個(gè)2-wire數(shù)字接口在單芯片中無(wú)縫結(jié)合,使得該產(chǎn)品具有低功耗、反應(yīng)快、抗干擾能力強(qiáng)等優(yōu)點(diǎn)。 (1) sht10的主要特點(diǎn)如下: 1) 相對(duì)濕度和溫度的測(cè)量兼有露點(diǎn)輸出; 2) 全部校準(zhǔn),數(shù)字輸出;3) 接口簡(jiǎn)單(2-wire),響應(yīng)速度快;4) 超低功耗,自動(dòng)休眠; 5) 出色的長(zhǎng)期穩(wěn)定性; 6)&#

14、160;超小體積(表面貼裝); 7) 測(cè)濕精度±45%rh,測(cè)溫精度±0.5(25)。 (2) 引腳說(shuō)明及接口電路 1) 典型應(yīng)用電路 2) 電源引腳(vdd、gnd )sht10的供電電壓為2.4-5.5v。傳感器上電后,要等待11ms,從“休眠”狀態(tài)恢復(fù)。在此期間不發(fā)送任何指令。電源引腳(vdd和gnd)之間可增加一個(gè)100uf的電容器,可用于去耦濾波。 3) 串行接口 sht10的兩線串行接口(bidirectional2-wire)在傳感器信號(hào)讀取

15、和電源功耗方面都做了優(yōu)化處理,其總線類(lèi)似i2c總線但不兼容i2c總線。 1. 串行時(shí)鐘輸入(sck)。sck引腳是mcu與shtio之間的同步時(shí)鐘,由于接口包含了全靜態(tài)邏輯,因此沒(méi)有最小的時(shí)鐘頻率。 2.串行數(shù)據(jù)(data)引腳是1個(gè)三態(tài)門(mén),用于mcu與shtio之間的數(shù)據(jù)傳輸。data的狀態(tài)在串行始終sck的下降沿之后發(fā)生改變,在sck的上升沿有效。在數(shù)據(jù)傳輸期間,當(dāng)sck為高電平時(shí),data數(shù)據(jù)線上必須保持穩(wěn)定狀態(tài)。 為避免數(shù)據(jù)發(fā)生沖突,mcu應(yīng)該驅(qū)動(dòng)data使其處于低電平狀態(tài),而外部接一個(gè)上拉電阻,將信號(hào)拉至高電平。 4) 原理

16、與說(shuō)明 1) crc-8校驗(yàn)。整個(gè)數(shù)據(jù)的傳輸過(guò)程都由8位校驗(yàn)保證,確保任何錯(cuò)誤的數(shù)據(jù)都能夠被檢測(cè)到并刪除。 2) 為保持自身發(fā)熱溫升小于0.1,sht10的激活時(shí)間不超過(guò)10%。如12位精度測(cè)量,每秒最多測(cè)量2次。 3) 轉(zhuǎn)換為物理量輸出相對(duì)濕度輸出轉(zhuǎn)換公式為: hlinear=c1+c2.so(rh)+c3.so(rh)2(%rh) 其中,rhlinear為25時(shí)相對(duì)濕度的線性值,so(rh)為傳感器輸出的相對(duì)濕度的數(shù)值,c1,c2,c3為系數(shù)。 當(dāng)測(cè)量溫度與25相差較大時(shí),則需要考慮傳感器的溫度系數(shù):

17、 rhtrue=(t-25).(t1+t2.so(rh)+rhlinear 其中,rhlinear為溫度不等于25時(shí)相對(duì)濕度的實(shí)際值,t為當(dāng)前溫度,t1、t2是系數(shù)。 t=d1+d2.so(t) 其中,t為實(shí)際溫度,so(t)為傳感器輸出的溫度數(shù)值,d1、d2為系數(shù)。 由于濕度與溫度經(jīng)由同一塊芯片測(cè)量而得,因此sht10可以同、時(shí)實(shí)現(xiàn)高質(zhì)量的露點(diǎn)測(cè)量。3.1.3傳感器硬件接口電路設(shè)計(jì)sht10通過(guò)兩線串行接口電路與單片機(jī)連接,具體電路如圖3所示。其中,串行時(shí)鐘輸入線sck用于單片機(jī)控制器與sht10之間的通信同步。串行數(shù)據(jù)線data用于內(nèi)部數(shù)據(jù)

18、的輸出與外部數(shù)據(jù)的輸入。data在sck時(shí)鐘下降沿之后改變狀態(tài),并僅在sck時(shí)鐘上升沿后有效。因此,單片機(jī)可在sck高電平時(shí)讀取數(shù)據(jù),而當(dāng)其向sht10發(fā)送數(shù)據(jù)時(shí),在sck時(shí)鐘下降沿后改變狀態(tài),同時(shí)保證data線上的電平狀態(tài)在sck高電平段穩(wěn)定。圖3 sht10與單片機(jī)的連接4 系統(tǒng)軟件設(shè)計(jì)本設(shè)計(jì)軟件編程分為以下三個(gè)部分:(1)溫、濕度傳感器sht10測(cè)量程序;(2)液晶顯示程序;(3)單片機(jī)與上位機(jī)數(shù)據(jù)通信程序。4.1溫濕度測(cè)量程序設(shè)計(jì)sht10傳感器工作時(shí)首先對(duì)數(shù)據(jù)傳輸進(jìn)行初始化來(lái)啟動(dòng)sht10測(cè)量時(shí)序,即在第一個(gè)sck時(shí)鐘高電平時(shí),da ta翻轉(zhuǎn)為低電平,并在第二個(gè)sck時(shí)鐘高電平時(shí),d

19、ata翻轉(zhuǎn)為高電平。sht10測(cè)量命令包含3個(gè)地址位和5個(gè)命令位。單片機(jī)發(fā)布一組8 bit測(cè)量命令后,data在第8個(gè)sck時(shí)鐘的下降沿被置為低電平。再發(fā)送第9個(gè)sck時(shí)鐘作為命令確認(rèn),da2ta在其下降沿后,恢復(fù)為高電平。同時(shí),單片機(jī)可暫時(shí)停止發(fā)送時(shí)鐘序列以進(jìn)入空閑模式,準(zhǔn)備讀取測(cè)量數(shù)據(jù)。sht10在轉(zhuǎn)換結(jié)束后,將data置為低電平,單片機(jī)繼續(xù)發(fā)出時(shí)鐘序列,來(lái)讀取2個(gè)8 bit的測(cè)量數(shù)據(jù)和1個(gè)8 bit的crc奇偶校驗(yàn)。所有數(shù)據(jù)從msb開(kāi)始,右值有效。其中,在每個(gè)字節(jié)傳輸結(jié)束后,均需要發(fā)出一個(gè)時(shí)鐘高電子ack,并將data置為低電平,以確認(rèn)讀取成功。在測(cè)量和傳輸結(jié)束后,sht10自動(dòng)轉(zhuǎn)入休眠

20、模式。4.2 液晶顯示程序液晶顯示模塊的編程方式主要由該模塊使用的控制/驅(qū)動(dòng)器所決定。設(shè)計(jì)采用st7920漢字液晶控制/驅(qū)動(dòng)器,其擁有8位并行微控制器接口,通過(guò)單片機(jī)編程,并使用了顯示字母、數(shù)字符號(hào)和中文字型的功能。另外,對(duì)于液晶屏的編程,一般只需向其中寫(xiě)數(shù)據(jù)即可。顯示程序設(shè)計(jì)流程如圖4所示。 圖4 液晶模塊操作程序流程圖5 仿真結(jié)果6 設(shè)計(jì)總結(jié)及體會(huì) 通過(guò)這次課程設(shè)計(jì)的學(xué)習(xí),發(fā)現(xiàn)了自己的很多不足,自己只的很多漏洞,看到了自己的實(shí)踐經(jīng)驗(yàn)還是比較缺乏,理論聯(lián)系實(shí)際的能力還需提高。在使用proteus和keil等軟件等仿真時(shí)遇到了許多問(wèn)題。這次學(xué)習(xí)提高我在控制檢測(cè)電路和單片機(jī)系統(tǒng)應(yīng)用方面的技能。通

21、過(guò)查找資料、調(diào)試、制作等環(huán)節(jié),掌握工程設(shè)計(jì)方法和組織時(shí)間的基本技能。仿真調(diào)試過(guò)程中有苦也有樂(lè),也從這過(guò)程中學(xué)到很多知識(shí)。二 附錄參考程序清單#include<reg51.h>#include <intrins.h> #include <math.h> #include <stdio.h> #define lcd_db p0sbit lcd_rs=p20; sbit lcd_rw=p21; sbit lcd_e=p22; /*定義函數(shù)*/#define uchar unsigned char#define uint unsigned intvoid

22、 lcd_init(void); /初始化函數(shù)void lcd_write_command(uchar command); /寫(xiě)指令函數(shù)void lcd_write_data(uchar dat); /寫(xiě)數(shù)據(jù)函數(shù)void lcd_disp_char(uchar x,uchar y,uchar dat);/在某個(gè)屏幕位置上顯示一個(gè)字符,x(0-15),y(1-2)void lcd_disp_str(uchar x,uchar y,uchar *str); /lcd1602顯示字符串函數(shù)void delay_n10us(uint n); /延時(shí)函數(shù)/*- ;模塊名稱(chēng):lcd_init(); ;功

23、能:初始化lcd1602 ;占用資源:-;參數(shù)說(shuō)明:-;-*/ void lcd_init(void)delay_n10us(10);lcd_write_command(0x38);/設(shè)置8位格式,2行,5x7delay_n10us(10);lcd_write_command(0x0c);/開(kāi)顯示,關(guān)光標(biāo),不閃爍delay_n10us(10);lcd_write_command(0x06);/設(shè)定輸入方式,增量不移位delay_n10us(10);lcd_write_command(0x01);/清除屏幕顯示delay_n10us(100); /延時(shí)清屏,延時(shí)函數(shù),延時(shí)約n個(gè)10us/*- ;

24、模塊名稱(chēng):lcd_write_command(); ;功 能:lcd1602寫(xiě)指令函數(shù) ;占用資源: p2.0-rs(lcd_rs),p2.1-rw(lcd_rw),p2.2-e(lcd_e).;參數(shù)說(shuō)明:dat為寫(xiě)命令參數(shù);-*/ void lcd_write_command(uchar dat)delay_n10us(10);lcd_rs=0; /指令lcd_rw=0; /寫(xiě)入lcd_e=1; /允許lcd_db=dat;delay_n10us(10); /實(shí)踐證明,我的lcd1602上,用for循環(huán)1次就能完成普通寫(xiě)指令。lcd_e=0;delay_n10us(10); /實(shí)踐證明,我的

25、lcd1602上,用for循環(huán)1次就能完成普通寫(xiě)指令。/*- ;模塊名稱(chēng):lcd_write_data(); ;功 能:lcd1602寫(xiě)數(shù)據(jù)函數(shù) ;占用資源: p2.0-rs(lcd_rs),p2.1-rw(lcd_rw),p2.2-e(lcd_e).;參數(shù)說(shuō)明:dat為寫(xiě)數(shù)據(jù)參數(shù);-*/void lcd_write_data(uchar dat)delay_n10us(10);lcd_rs=1; /數(shù)據(jù)lcd_rw=0; /寫(xiě)入lcd_e=1; /允許lcd_db=dat;delay_n10us(10);lcd_e=0;delay_n10us(10);/*- ;模塊名稱(chēng):lcd_disp_c

26、har(); ;功 能:lcd1602顯示一個(gè)字符函數(shù),在某個(gè)屏幕位置上顯示一個(gè)字符,x(0-15),y(1-2)。;占用資源:-;參數(shù)說(shuō)明:x為1602的列值(取值范圍是0-15),y為1602的行值(取值范圍是1-2),dat為所要顯示字符對(duì)應(yīng)的地址參數(shù)。;-*/void lcd_disp_char(uchar x,uchar y,uchar dat) uchar address; if(y=1) address=0x80+x; else address=0xc0+x; lcd_write_command(address); lcd_write_data(dat);/*- ;模塊名稱(chēng):lc

27、d_disp_str(); ;功 能:lcd1602顯示字符串函數(shù),在某個(gè)屏幕起始位置x(0-15),y(1-2)上顯示一個(gè)字符串。;占用資源:-;參數(shù)說(shuō)明:x為1602的列值(取值范圍是0-15),y為1602的行值(取值范圍是1-2),str為所要顯示字符串對(duì)應(yīng)的指針參數(shù)。;-*/void lcd_disp_str(uchar x,uchar y,uchar *str) uchar address; if(y=1) address=0x80+x; else address=0xc0+x; lcd_write_command(address); while(*str!='0'

28、) lcd_write_data(*str); str+; /*- ;模塊名稱(chēng):delay_n10us(); ;功 能:延時(shí)函數(shù),延時(shí)約n個(gè)10us;占用資源:-;參數(shù)說(shuō)明:-;-*/void delay_n10us(uint n) /延時(shí)n個(gè)10us12m晶振 uint i; for(i=n;i>0;i-) _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); sbit sck = p26; /定義通訊時(shí)鐘端口sbit data = p27; /定義通訊數(shù)據(jù)端口typedef union unsigned int i; /定義了兩個(gè)共用體 f

29、loat f; value;enum temp,humi; /temp=0,humi=1#define noack 0 /用于判斷是否結(jié)束通訊#define ack 1 /結(jié)束數(shù)據(jù)傳輸 /adr command r/w #define status_reg_w 0x06 /000 0011 0 #define status_reg_r 0x07 /000 0011 1 #define measure_temp 0x03 /000 0001 1 #define measure_humi 0x05 /000 0010 1 #define reset 0x1e /000 1111 0/*定義函數(shù)*/

30、void s_transstart(void); /啟動(dòng)傳輸函數(shù)void s_connectionreset(void); /連接復(fù)位函數(shù)char s_write_byte(unsigned char value);/dht90寫(xiě)函數(shù)char s_read_byte(unsigned char ack); /dht90讀函數(shù)char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);/測(cè)量溫濕度函數(shù)void calc_dht90(float *p_humidity ,float *p

31、_temperature);/溫濕度補(bǔ)償/*- ;模塊名稱(chēng):s_transstart(); ;功 能:啟動(dòng)傳輸函數(shù);占用資源:-;參數(shù)說(shuō)明:-;-*/ void s_transstart(void) / generates a transmission start data=1; sck=0; /initial state _nop_(); sck=1; _nop_(); data=0; _nop_(); sck=0; _nop_();_nop_();_nop_(); sck=1; _nop_(); data=1; _nop_(); sck=0; /*- ;模塊名稱(chēng):s_connectionr

32、eset(); ;功 能:連接復(fù)位函數(shù);占用資源:-;參數(shù)說(shuō)明:-;-*/ void s_connectionreset(void) / communication reset: data-line=1 and at least 9 sck cycles followed by transstart unsigned char i; data=1; sck=0; /initial state for(i=0;i<9;i+) /9 sck cycles sck=1; sck=0; s_transstart(); /transmission start /*- ;模塊名稱(chēng):s_write_b

33、yte(); ;功 能:dht90寫(xiě)函數(shù);占用資源:-;參數(shù)說(shuō)明:-;-*/ char s_write_byte(unsigned char value) /- / writes a byte on the sensibus and checks the acknowledge unsigned char i,error=0; for (i=0x80;i>0;i/=2) /shift bit for masking if (i & value) data=1; /masking value with i , write to sensi-bus else data=0; sck=

34、1; /clk for sensi-bus _nop_();_nop_();_nop_(); /pulswith approx. 3 us sck=0; data=1; /release data-line sck=1; /clk #9 for ack error=data; /check ack (data will be pulled down by dht90),data在第9個(gè)上升沿將被dht90自動(dòng)下拉為低電平。 _nop_();_nop_();_nop_(); sck=0; data=1; /release data-line return error; /error=1 in c

35、ase of no acknowledge /返回:0成功,1失敗/*- ;模塊名稱(chēng):s_read_byte(); ;功 能:dht90讀函數(shù);占用資源:-;參數(shù)說(shuō)明:-;-*/ char s_read_byte(unsigned char ack) / reads a byte form the sensibus and gives an acknowledge in case of "ack=1" unsigned char i,val=0; data=1; /release data-line for (i=0x80;i>0;i/=2) /shift bit f

36、or masking sck=1; /clk for sensi-bus if (data) val=(val | i); /read bit _nop_();_nop_();_nop_(); /pulswith approx. 3 us sck=0; if(ack=1)data=0; /in case of "ack=1" pull down data-line else data=1; /如果是校驗(yàn)(ack=0),讀取完后結(jié)束通訊 _nop_();_nop_();_nop_(); /pulswith approx. 3 us sck=1; /clk #9 for ack

37、 _nop_();_nop_();_nop_(); /pulswith approx. 3 us sck=0; _nop_();_nop_();_nop_(); /pulswith approx. 3 us data=1; /release data-line return val; /*- ;模塊名稱(chēng):s_measure(); ;功 能:測(cè)量溫濕度函數(shù);占用資源:-;參數(shù)說(shuō)明:-;-*/ char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) / makes a measure

38、ment (humidity/temperature) with checksum unsigned error=0; unsigned int i; s_transstart(); /transmission start switch(mode) /send command to sensor case temp : error+=s_write_byte(measure_temp); break; case humi : error+=s_write_byte(measure_humi); break; default : break; for (i=0;i<65535;i+) if

39、(data=0) break; /wait until sensor has finished the measurement if(data) error+=1; / or timeout (2 sec.) is reached *(p_value) =s_read_byte(ack); /read the first byte (msb) *(p_value+1)=s_read_byte(ack); /read the second byte (lsb) *p_checksum =s_read_byte(noack); /read checksum return error; /*- ;模

40、塊名稱(chēng):calc_dht90(); ;功 能:溫濕度補(bǔ)償函數(shù);占用資源:-;參數(shù)說(shuō)明:-;-*/ void calc_dht90(float *p_humidity ,float *p_temperature)/ calculates temperature c and humidity %rh / input : humi ticks (12 bit) / temp ticks (14 bit)/ output: humi %rh/ temp c const float c1=-4.0; / for 12 bit const float c2=+0.0405; / for 12 bit co

41、nst float c3=-0.0000028; / for 12 bit const float t1=+0.01; / for 14 bit 5v const float t2=+0.00008; / for 14 bit 5v float rh=*p_humidity; / rh: humidity ticks 12 bit float t=*p_temperature; / t: temperature ticks 14 bit float rh_lin; / rh_lin: humidity linear float rh_true; / rh_true: temperature c

42、ompensated humidity float t_c; / t_c : temperature c t_c=t*0.01 - 40; /calc. temperature from ticks to c rh_lin=c3*rh*rh + c2*rh + c1; /calc. humidity from ticks to %rh rh_true=(t_c-25)*(t1+t2*rh)+rh_lin; /calc. temperature compensated humidity %rh if(rh_true>100)rh_true=100; /cut if the value is

43、 outside of if(rh_true<0.1)rh_true=0.1; /the physical possible range *p_temperature=t_c; /return temperature c *p_humidity=rh_true; /return humidity%rh/*主函數(shù)*void main(void) value humi_val,temp_val; unsigned char error,checksum; unsigned int wendu,shidu; lcd_init(); s_connectionreset(); lcd_disp_s

44、tr(0,1,"te"); lcd_disp_str(0,2,"rh");/*初始化溫度顯示區(qū)* lcd_disp_str(2,1,"ttt.tc");/*初始化濕度顯示區(qū)* lcd_disp_str(2,2,"rrr.r%"); delay_n10us(20000); /延時(shí)0.2s while(1) error=0; error+=s_measure(unsigned char*) &humi_val.i,&checksum,humi); /measure humidity error+=s_m

45、easure(unsigned char*) &temp_val.i,&checksum,temp); /measure temperature if(error!=0) s_connectionreset(); /in case of an error: connection reset else humi_val.f=(float)humi_val.i; /converts integer to float temp_val.f=(float)temp_val.i; /converts integer to float calc_dht90(&humi_val.f,

46、&temp_val.f); /calculate humidity, temperature wendu=10*temp_val.f; lcd_disp_char(2,1,wendu/1000+'0'); /顯示溫度百位 lcd_disp_char(3,1,(wendu%1000)/100+'0'); /顯示溫度十位 lcd_disp_char(4,1,(wendu%100)/10+'0'); /顯示溫度個(gè)位 lcd_disp_char(6,1,(wendu%10)+'0'); /顯示溫度小數(shù)點(diǎn)后第一位 shidu=10*humi_val.f; lcd_disp_char(2,2,shidu/1000+'0'); /顯示濕度百位 lcd_disp_char(3,2,(shidu%1000)/100+'0'); /顯示濕度十位 lcd_disp_char(4,2,(shidu%100)/10+'0'); /顯示濕度個(gè)位 lcd_disp_char(6,2,(shidu%10)+'0'); /顯示濕度小數(shù)點(diǎn)后第一位 /-wait approx. 0.8s to avoid heating up shtxx- delay

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論