基于51單片機與若干傳感器的智能開關(guān)窗系統(tǒng)-傳感器導(dǎo)論課設(shè)報告_第1頁
基于51單片機與若干傳感器的智能開關(guān)窗系統(tǒng)-傳感器導(dǎo)論課設(shè)報告_第2頁
基于51單片機與若干傳感器的智能開關(guān)窗系統(tǒng)-傳感器導(dǎo)論課設(shè)報告_第3頁
基于51單片機與若干傳感器的智能開關(guān)窗系統(tǒng)-傳感器導(dǎo)論課設(shè)報告_第4頁
基于51單片機與若干傳感器的智能開關(guān)窗系統(tǒng)-傳感器導(dǎo)論課設(shè)報告_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、傳感器實驗導(dǎo)論課程設(shè)計報告基于51單片機與若干傳感器的智能開關(guān)窗系統(tǒng)學(xué)號 . 姓名 . 班級 2011級電子2班 . 華僑大學(xué)電子工程系基于單片機與若干傳感器的智能開關(guān)窗系統(tǒng)引言近年來, 隨著物聯(lián)網(wǎng)技術(shù)的迅速發(fā)展,智能家居成為家庭信息化和社會信息化發(fā)展的重要組成部分,智能家居又稱智能住宅,當家庭智能網(wǎng)關(guān)將家庭中各種各樣的家電設(shè)備通過家庭總線技術(shù)連接在一起時,就構(gòu)成了功能強大、高度智能化的現(xiàn)代智能家居系統(tǒng)。智能家居強調(diào)人的主觀能動性,重視人與居住環(huán)境的協(xié)調(diào),能夠隨心所欲地控制居住環(huán)境。時光飛逝,日夜如梭。智能家居系統(tǒng)在經(jīng)歷了早期混亂的概念紛爭之后,目前已經(jīng)逐漸進入理性時代。如今的智能家居市場已經(jīng)

2、不再是海爾、微軟等專業(yè)家電控制和IT廠家的天下,越來越多的樓宇對講廠商開始涉及并深入到智能家居行業(yè),猛烈地沖擊著樓宇對講市場格局,從而使得市場競爭更加激烈。盡管如此,用戶的需求才是第一位的,所以各廠家的產(chǎn)品研發(fā)主要以市場需求為導(dǎo)向。由于我國房地產(chǎn)行業(yè)的迅速發(fā)展,也帶動了我國門窗幕墻行業(yè)的迅速發(fā)展,隨著消費者生活水平的提高,智能化的產(chǎn)品如雨后春筍,正逐步發(fā)展和壯大。而我們的智能窗戶就是在這樣的環(huán)境下應(yīng)運而生的,因此具有廣闊的市場空間和應(yīng)用前景。第一章 總體設(shè)計方案本次設(shè)計以51單片機作為微控制器,使用DS18B2溫度傳感器、光敏電阻、雨水傳感器采集窗戶內(nèi)外的溫度、光照、是否下雨等信息,進而使用U

3、LN2003達林頓陳列驅(qū)動四相五線步進電機帶動窗戶的打開與關(guān)閉。系統(tǒng)設(shè)計主要分為以下幾個部分:單片機和控制電路、溫度檢測電路、光照檢測電路、雨水檢測電路、電機驅(qū)動電路。整個系統(tǒng)的系統(tǒng)框圖如下:我們本次課程設(shè)計目標是當溫度在20到30度之間、光照充足且無雨的情況下,窗戶關(guān)閉,液晶顯示OFF;三個條件有一個不滿足則窗戶打開,液晶顯示ON。第二章 硬件原理與介紹本人在這次課設(shè)中負責步進電機驅(qū)動及控制模塊的電路設(shè)計與相關(guān)程序的編寫以及LCD1602液晶的程序控制,因此本部分將著重介紹步進電機模塊與LCD1602液晶的相關(guān)硬件原理。一、 28BYJ-48步進電機2.1.1 步進電機的工作原理步進電機是一

4、種將電脈沖轉(zhuǎn)化為角位移的執(zhí)行機構(gòu)。通俗一點講:當步進驅(qū)動器接收到一個脈沖信號,它就驅(qū)動步進電機按設(shè)定的方向轉(zhuǎn)動一個固定的角度(及步進角)??梢酝ㄟ^控制脈沖個來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈沖頻率來控制電機轉(zhuǎn)動的速度和加速度,從而達到調(diào)速的目的。本次設(shè)計是采用步進電機28BYJ48型四相八拍電機,電壓為DC5VDC12V。當對步進電機施加一系列連續(xù)不斷的控制脈沖時,它可以連續(xù)不斷地轉(zhuǎn)動。每一個脈沖信號對應(yīng)步進電機的某一相或兩相繞組的通電狀態(tài)改變一次,也就對應(yīng)轉(zhuǎn)子轉(zhuǎn)過一定的角度(一個步距角)。當通電狀態(tài)的改變完成一個循環(huán)時,轉(zhuǎn)子轉(zhuǎn)過一個齒距。四相步進電機可以在不同的通電方

5、式下運行,常見的通電方式有單(單相繞組通電)四拍(A-B-C-D-A。),雙(雙相繞組通電)四拍(AB-BC-CD-DA-AB-。),八拍(A-AB-B-BC-C-CD-D-DA-A。)。四相步進電機原理圖其相序分配表如下:2.1.2 步進電機24BYJ48的相關(guān)電氣參數(shù)1.額定電壓:12VDC(另有電壓:5V、6V、24V)2.相數(shù):43.減速比:1/64(另有減速比:1/16、1/32)4.步距角:5.625°/645.驅(qū)動方式:4相8拍6.直流電阻:200±7%(25)(按客戶要求而定:80、130歐姆)7.空載牽入頻率:600Hz8.空載牽出頻率:1000Hz9.牽

6、入轉(zhuǎn)矩:34.3mN.m(120Hz)10.自定位轉(zhuǎn)矩:34.3mN.m11.絕緣電阻:10M(500V)12.絕緣介電強度:600VAC/1mA/1S13.絕緣等級:A14.溫升:50K(120Hz)15.噪音:40dB(120Hz)16.重量:大約40g17.未注公差按:GB1804-m18.轉(zhuǎn)向:CCW2.1.3 步進電機的基本術(shù)語2.1.3.1 相數(shù)產(chǎn)生不同對極N、S磁場的激磁線圈對數(shù),常用m表示。2.1.3.2 拍數(shù)完成一個磁場周期性變化所需脈沖數(shù)或?qū)щ姞顟B(tài)用n表示,或指電機轉(zhuǎn)過一個齒距角所需脈沖數(shù),比如說本次設(shè)計中使用的24BYJ48有單(單相繞組通電)四拍(A-B-C-D-A。)

7、,雙(雙相繞組通電)四拍(AB-BC-CD-DA-AB-。),八拍(A-AB-B-BC-C-CD-D-DA-A。)2.1.3.3 步距角對應(yīng)一個脈沖信號,電機轉(zhuǎn)子轉(zhuǎn)過的角位移用表示。=360度(轉(zhuǎn)子齒數(shù)J*運行拍數(shù)),以常規(guī)二相,轉(zhuǎn)子齒為50齒電機為例。四拍運行時步距角為=360度/(50*4)=1.8度(俗稱整步),八拍運行時步距角為=360度/(50*8)=0.9度(俗稱半步)。2.1.3.4 信號分配四相步進電機按照其通電方式的不同,可以分為單四拍,雙四拍和雙八拍三種工作方式。單四拍與雙四拍的步距角相等,均為11.25度,而八拍的步距角則是單四拍與雙四拍的一半,5.625度。單(單相繞組

8、通電)四拍(A-B-C-D-A。),雙(雙相繞組通電)四拍(AB-BC-CD-DA-AB-。),八拍 (A-AB-B-BC-C-CD-D-DA-A。)。這里選取的是單雙八拍的工作方式。由于步進電機的驅(qū)動電流較大,單片機不能直接驅(qū)動,一般都是使用ULN2003達林頓陣列驅(qū)動,當然,使用下拉電阻或三極管也是可以驅(qū)動的,只不過效果不是那么好,產(chǎn)生的扭力比較小。 二、 ULN2003達林頓陳列芯片步進電機的驅(qū)動采用ULN2003芯片。ULN2003 是高耐壓、大電流達林頓陳列, 由七個硅 NPN 達林頓管組成。 ULN2003 的每一對達林頓都串聯(lián)一個 2.7K 的基極電阻 , 在 5V 的工作電壓下

9、它能與 TTL 和 CMOS 電路直接相連, 可以直接處理原先需要標準邏輯緩沖器來處理的數(shù)據(jù)。 ULN2003 工作電壓高, 工作電流大, 灌電流可達 500mA , 并且能夠在關(guān)態(tài)時承受 50V 的電壓, 輸出還可以在高負載電流并行運行。采用DIP-16或者SOP-16塑料封裝。其引腳及內(nèi)部原理圖如下:本設(shè)計中實驗1、2、3、4腳做輸入端,16、15、14、13做相對應(yīng)的輸出端,起到放大的作用,以驅(qū)動電機。ULN2003的典型應(yīng)用電路如下圖:三、LCD1602液晶1602液晶也叫1602字符型液晶 它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊 它有若干個5X7或者5X11等點陣字符

10、位組成,每個點陣字符位都可以顯示一個字符。目前市面上字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780寫的控制程序可以很方便地應(yīng)用于市面上大部分的字符型液晶。其各引腳功能見下圖:其典型接口電路如下圖:其基本操作時序為: 讀狀態(tài)           輸入:RS=L,RW=H,E=H               

11、;      輸出:DB0DB7=狀態(tài)字 寫指令           輸入:RS=L,RW=L,E=下降沿脈沖,DB0DB7=指令碼 輸出:無 讀數(shù)據(jù)           輸入:RS=H,RW=H,E=H            &

12、#160;                    輸出:DB0DB7=數(shù)據(jù) 寫數(shù)據(jù)           輸入:RS=H,RW=L,E=下降沿脈沖,DB0DB7=數(shù)據(jù) 輸出:無第三章 各模塊硬件設(shè)計本人在這次課設(shè)中負責步進電機驅(qū)動及控制模塊的電路設(shè)計與相關(guān)程序的編寫以及LCD1602液晶的程序控制,因此本部分將

13、介紹步進電機模塊與LCD1602液晶的電路設(shè)計。一、步進電機驅(qū)動及接口電路本電路模塊用于單片機對步進電機的控制及使用ULN2003芯片對步進電機進行驅(qū)動。原理圖如下:由于所選24BYJ48步進電機為四相步進電機,故只需4個單片機IO口控制,此處使用單片機的IO口P1.0-P1.3,使用ULN2003的引腳1-4做輸入,16-13引腳做輸出口。二、按鍵電路(用于擴展功能)本次設(shè)計為了便于今后功能擴展使用了8個按鍵。原理圖如下:這次課設(shè)中我們使用了兩個按鍵,分別用于控制電機點動正轉(zhuǎn)、點動反轉(zhuǎn)。三、1602液晶接口電路1602液晶接口電路原理圖如下:本電路用于連接1602液晶,P2.0P2.2分別接

14、RS、RW、EN,P0口接數(shù)據(jù)指令輸入口,10K歐可調(diào)電阻用于調(diào)節(jié)液晶的對比度第四章 程序設(shè)計本人在這次課設(shè)中負責步進電機驅(qū)動及控制模塊的電路設(shè)計與相關(guān)程序的編寫以及LCD1602液晶的程序控制,因此本部分將介紹步進電機的編程控制方法與LCD1602液晶的編程控制。主程序開關(guān)是否 否是一、總體程序流程圖讀取溫度并顯示窗戶開關(guān)狀態(tài)判斷是否有雨、陰天、超限判斷是否有雨、陰天、超限開窗不操作關(guān)窗我們的主程序設(shè)計目標是當溫度在20到30度之間、光照充足且無雨的情況下,窗戶關(guān)閉,液晶顯示OFF;三個條件有一個不滿足則窗戶打開,液晶顯示ON。二、步進電機的編程控制方法控制步進電機的關(guān)鍵是利用控制脈沖的快慢

15、、順序、個數(shù)來調(diào)節(jié)電機轉(zhuǎn)速、正反轉(zhuǎn)、轉(zhuǎn)動角度等狀態(tài)。步進電機28BYJ48型四相八拍電機,電壓為DC5VDC12V。當對步進電機施加一系列連續(xù)不斷的控制脈沖時,它可以連續(xù)不斷地轉(zhuǎn)動。每一個脈沖信 號對應(yīng)步進電機的某一相或兩相繞組的通電狀態(tài)改變一次,也就對應(yīng)轉(zhuǎn)子轉(zhuǎn)過一定的角度(一個步距角)。當通電狀態(tài)的改變完成一個循環(huán)時,轉(zhuǎn)子轉(zhuǎn)過一個齒距。 四相步進電機可以在不同的通電方式下運行,常見的通電方式有單(單相繞組通電)四拍(A-B-C-D-A。),雙(雙相繞組通電)四拍(AB-BC- CD-DA-AB-。),八拍(A-AB-B-BC-C-CD-D-DA-A。)。這里我們采用的通電方式是四相單雙八拍,

16、各相電平與十六進制相序?qū)?yīng)如下表所示: 橙  黃 粉藍十六制(P1口)  1 0 0 0 0xf8 1 1 0 0 0xfc 0 1 0 0 0xf4 0 1 1 0 0xf6 0 0 1 0 0xf2 0 0 1 1 0xf3 0

17、0;0 0 1 0xf1 1 0 0 1 0xf9所以可以定義旋轉(zhuǎn)相序uchar code FFW8=0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9; /正轉(zhuǎn)相序編碼表uchar code REV8=0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1;/反轉(zhuǎn)相序編碼表下面這段程序是我們程序中的步進電機控制部分,它可以實現(xiàn)控制電機的正轉(zhuǎn)或反轉(zhuǎn)45度,以此代表窗戶打開或關(guān)閉。if(z1flag=0)/電機反轉(zhuǎn),窗戶打開for(;num2>0;num2-)

18、if(v<8) P1 = REVv;v+; if(v=8) v=0;delaynms(15);num2=512; /轉(zhuǎn)45度z1flag=1;state=0; if(z2flag=0)/電機正轉(zhuǎn),窗戶關(guān)上for(;num2>0;num2-)if(v<8) P1 = FFWv;v+; if(v=8) v=0; delaynms(15); num2=512; /轉(zhuǎn)45度 state=1;z2flag=1;電機轉(zhuǎn)一圈即360度需要64*64=4096個脈沖,所以要想電機轉(zhuǎn)45度,需要4096/8=512個脈沖,這里用num2=512來控制電機轉(zhuǎn)45度。三、 LCD1602液晶的編程

19、控制顯示流程圖如圖3.4所示,流程圖分析如下:首先對1602顯示屏進行初始化(初始化大約持續(xù)10ms),然后檢查忙信號,若BF=0,則獲得顯示RAM地址,寫入相應(yīng)的數(shù)據(jù)顯示。若BF=1,則代表模塊正在進行內(nèi)部操作,不接受任何外部指令和數(shù)據(jù),直到BF=0為止。LCD顯示程序流程圖LCD1602基本操作時序為: 讀狀態(tài)           輸入:RS=L,RW=H,E=H           

20、;          輸出:DB0DB7=狀態(tài)字 寫指令           輸入:RS=L,RW=L,E=下降沿脈沖,DB0DB7=指令碼 輸出:無 讀數(shù)據(jù)           輸入:RS=H,RW=H,E=H        &

21、#160;                        輸出:DB0DB7=數(shù)據(jù) 寫數(shù)據(jù)           輸入:RS=H,RW=L,E=下降沿脈沖,DB0DB7=數(shù)據(jù) 輸出:無第五章 心得體會為其近半個學(xué)期的傳感器課程設(shè)計結(jié)束了,在這期間我收獲了很多,感到很有意義

22、。這次課設(shè)我主要負責的是步進電機模塊的電路設(shè)計及軟件編程,另外我還學(xué)習(xí)了LCD1602液晶顯示的編程控制方法。早在大二自學(xué)單片機時我就注意到步進電機這種器件,但當時只是略作了解,沒有學(xué)習(xí)它的原理與編程控制,這次借課程設(shè)計的機會,我得以對步進電機進行了較為深入的了解和學(xué)習(xí)。在課設(shè)的前期我通過查閱了許多資料,學(xué)習(xí)了步進電機的工作原理。之后我開始考慮整體硬件電路的設(shè)計,顯示、驅(qū)動電路的設(shè)計,最終選擇使用28BYJ48型步進電機、ULN2003驅(qū)動芯片、1602液晶顯示。在這之后我開始考慮要實現(xiàn)的電機功能,在完成了原理圖與PCB圖繪制、電路元件焊接后,我開始著手進行程序設(shè)計。我與我們組負責傳感器和單片

23、機電路部分的同學(xué)反復(fù)討論,對程序不斷修改、調(diào)試,最終,完成了預(yù)想的目標。我認為智能開關(guān)窗系統(tǒng)這個課題,既包含多種傳感器能夠充分地檢驗我們這學(xué)期傳感器課程的學(xué)習(xí)成果,又十分具有應(yīng)用價值。通過這次課設(shè)我得以學(xué)習(xí)到了步進電機的工作原理與編程控制方法,以及光敏、雨水、溫度等幾種傳感器的使用方法。另外,在這次課設(shè)過程中涉及的LCD1602控制等內(nèi)容也對我很有幫助。通過本次課設(shè)我對51單片機的編程控制、定時器中斷等知識也得到了充分的復(fù)習(xí)鞏固??傊?,這次課設(shè)讓我受益匪淺,感謝楊老師一學(xué)期來傳感器課程的悉心教導(dǎo),這對我們的課設(shè)得以順利完成很有幫助。附件一、 電路原理圖最小系統(tǒng)與步進電機模塊光敏電阻模塊二、 電

24、路PCB圖三、 電路實物圖總體電路(所有器件):步進電機板:四、 源程序#include<reg51.h> /包含單片機寄存器的頭文件#include<intrins.h> /包含_nop_()函數(shù)定義的頭文件#define uchar unsigned char#define uint unsigned intuchar code digit10="0123456789" /定義字符數(shù)組顯示數(shù)字uchar code Str="state:" /說明顯示的是溫度uchar code Error="Error!Check!

25、" /說明沒有檢測到DS18B20uchar code Temp="Temp: " /說明顯示的是溫度uchar code Cent="Cent" /溫度單位uchar code winon="ON " uchar code winoff="OFF" uchar code FFW8=0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9; /正轉(zhuǎn)相序編碼表uchar code REV8=0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1;/反轉(zhuǎn)相序編碼表

26、uchar z1flag=1; uchar z2flag=1;uchar state=1; /窗戶開uchartempl=20;uchartemph=30;/uint num1=2;uint num2=512;sbit yu = P35;sbit light=P36;/*以下是對液晶模塊的操作程序*/sbit RS=P20; /寄存器選擇位,將RS位定義為P2.0引腳sbit RW=P21; /讀寫選擇位,將RW位定義為P2.1引腳sbit E=P22; /使能信號位,將E位定義為P2.2引腳sbit BF=P07; /忙碌標志位,將BF位定義為P0.7引腳/*函數(shù)功能:延時1ms(3j+2)

27、*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒*/void delay1ms() unsigned char i,j; for(i=0;i<4;i+) for(j=0;j<33;j+) ; /*函數(shù)功能:延時若干毫秒入口參數(shù):n*/ void delaynms(unsigned char n) unsigned char i;for(i=0;i<n;i+) delay1ms(); /*函數(shù)功能:判斷液晶模塊的忙碌狀態(tài)返回值:result。result=1,忙碌;result=0,不忙*/bit lcd_busy(void) bit res

28、ult;RS=0; /根據(jù)規(guī)定,RS為低電平,RW為高電平時,可以讀狀態(tài) RW=1; E=1; /E=1,才允許讀寫 _nop_(); /空操作 _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應(yīng)時間 result=BF; /將忙碌標志電平賦給result E=0; /將E恢復(fù)低電平 return result; /*函數(shù)功能:將模式設(shè)置指令或顯示地址寫入液晶模塊入口參數(shù):dictate*/void lcd_wcmd (unsigned char dictate) while(lcd_busy()=1); /如果忙就等待 RS=0; /根據(jù)規(guī)定,RS和R/W

29、同時為低電平時,可以寫入指令 RW=0; E=0; /E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖, / 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0" _nop_(); _nop_(); /空操作兩個機器周期,給硬件反應(yīng)時間 P0=dictate; /將數(shù)據(jù)送入P0口,即寫入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應(yīng)時間 E=1; /E置高電平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應(yīng)時間 E=0; /當E由高電平跳變成低電平時,液晶模

30、塊開始執(zhí)行命令 /*函數(shù)功能:指定字符顯示的實際地址入口參數(shù):x*/ void lcd_pos(unsigned char x) lcd_wcmd(x|0x80); /顯示位置的確定方法規(guī)定為"80H+地址碼x" /*函數(shù)功能:將數(shù)據(jù)(字符的標準ASCII碼)寫入液晶模塊入口參數(shù):y(為字符常量)*/ void lcd_wdat(unsigned char y) while(lcd_busy()=1); RS=1; /RS為高電平,RW為低電平時,可以寫入數(shù)據(jù) RW=0; E=0; /E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖, / 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先

31、置"0" P0=y; /將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應(yīng)時間 E=1; /E置高電平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應(yīng)時間 E=0; /當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令 /*函數(shù)功能:對LCD的顯示模式進行初始化設(shè)置*/void lcd_init(void) delaynms(15); /延時15ms,首次寫指令時應(yīng)給LCD一段較長的反應(yīng)時間 lcd_wcmd(0x38); /

32、顯示模式設(shè)置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口delaynms(5); /延時5ms,給硬件一點反應(yīng)時間 lcd_wcmd(0x38);delaynms(5); /延時5ms,給硬件一點反應(yīng)時間lcd_wcmd(0x38); /連續(xù)三次,確保初始化成功delaynms(5); /延時5ms,給硬件一點反應(yīng)時間lcd_wcmd(0x0c); /顯示模式設(shè)置:顯示開,無光標,光標不閃爍delaynms(5); /延時5ms,給硬件一點反應(yīng)時間lcd_wcmd(0x06); /顯示模式設(shè)置:光標右移,字符不移delaynms(5); /延時5ms,給硬件一點反應(yīng)時間lcd_

33、wcmd(0x01); /清屏幕指令,將以前的顯示內(nèi)容清除delaynms(5); /延時5ms,給硬件一點反應(yīng)時間 /*以下是DS18B20的操作程序 */ sbit DQ=P33;unsigned char time; /設(shè)置全局變量,專門用于嚴格延時/*函數(shù)功能:將DS18B20傳感器初始化,讀取應(yīng)答信號出口參數(shù):flag */bit Init_DS18B20(void) bit flag; /儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在 DQ = 1; /先將數(shù)據(jù)線拉高 for(time=0;time<2;time+) /略微延時約6微秒 ;

34、 DQ = 0; /再將數(shù)據(jù)線從高拉低,要求保持480960us for(time=0;time<200;time+) /略微延時約600微秒 ; /以向DS18B20發(fā)出一持續(xù)480960us的低電平復(fù)位脈沖 DQ = 1; /釋放數(shù)據(jù)線(將數(shù)據(jù)線拉高) for(time=0;time<10;time+) ; /延時約30us(釋放總線后需等待1560us讓DS18B20輸出存在脈沖) flag=DQ; /讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) for(time=0;time<200;time+) /延時足夠長時間,等待存在脈沖輸出完畢 ; return (fl

35、ag); /返回檢測成功標志/*函數(shù)功能:從DS18B20讀取一個字節(jié)數(shù)據(jù)出口參數(shù):dat*/ unsigned char ReadOneChar(void) unsigned char i=0;unsigned char dat; /儲存讀出的一個字節(jié)數(shù)據(jù)for (i=0;i<8;i+) DQ =1; / 先將數(shù)據(jù)線拉高 _nop_(); /等待一個機器周期 DQ = 0; /單片機從DS18B20讀書據(jù)時,將數(shù)據(jù)線從高拉低即啟動讀時序dat>>=1; _nop_(); /等待一個機器周期 DQ = 1; /將數(shù)據(jù)線"人為"拉高,為單片機檢測DS18B2

36、0的輸出電平作準備 for(time=0;time<2;time+) ; /延時約6us,使主機在15us內(nèi)采樣 if(DQ=1) dat|=0x80; /如果讀到的數(shù)據(jù)是1,則將1存入datelsedat|=0x00;/如果讀到的數(shù)據(jù)是0,則將0存入dat /將單片機檢測到的電平信號DQ存入ri for(time=0;time<8;time+) ; /延時3us,兩個讀時序之間必須有大于1us的恢復(fù)期 return(dat); /返回讀出的十進制數(shù)據(jù)/*函數(shù)功能:向DS18B20寫入一個字節(jié)數(shù)據(jù)入口參數(shù):dat*/ void WriteOneChar(unsigned char

37、dat)unsigned char i=0;for (i=0; i<8; i+) DQ =1; / 先將數(shù)據(jù)線拉高 _nop_(); /等待一個機器周期 DQ=0; /將數(shù)據(jù)線從高拉低時即啟動寫時序 DQ=dat&0x01; /利用與運算取出要寫的某位二進制數(shù)據(jù), /并將其送到數(shù)據(jù)線上等待DS18B20采樣 for(time=0;time<10;time+) ;/延時約30us,DS18B20在拉低后的約1560us期間從數(shù)據(jù)線上采樣 DQ=1; /釋放數(shù)據(jù)線 for(time=0;time<1;time+) ;/延時3us,兩個寫時序間至少需要1us的恢復(fù)期 dat

38、>>=1; /將dat中的各二進制位數(shù)據(jù)右移1位 for(time=0;time<4;time+) ; /稍作延時,給硬件一點反應(yīng)時間/return(dat);/*以下是與溫度有關(guān)的顯示設(shè)置 */ /*函數(shù)功能:顯示沒有檢測到DS18B20*/ void display_error(void) unsigned char i; lcd_pos(0x00); /寫顯示地址,將在第1行第1列開始顯示 i = 0; /從第一個字符開始顯示while(Errori != '0') /只要沒有寫到結(jié)束標志,就繼續(xù)寫lcd_wdat(Errori); /將字符常量寫入LC

39、Di+; /指向下一個字符delaynms(100); /延時100ms較長時間,以看清關(guān)于顯示的說明while(1) /進入死循環(huán),等待查明原因 ;/*函數(shù)功能:顯示說明信息*/ void display_explain(void) unsigned char i; lcd_pos(0x00); /寫顯示地址,將在第1行第1列開始顯示 i = 0; /從第一個字符開始顯示while(Stri != '0') /只要沒有寫到結(jié)束標志,就繼續(xù)寫lcd_wdat(Stri); /將字符常量寫入LCDi+; /指向下一個字符delaynms(100); /延時100ms較長時間,以看

40、清關(guān)于顯示的說明/*函數(shù)功能:顯示溫度符號*/ void display_symbol(void) unsigned char i; lcd_pos(0x40); /寫顯示地址,將在第2行第1列開始顯示 i = 0; /從第一個字符開始顯示while(Tempi != '0') /只要沒有寫到結(jié)束標志,就繼續(xù)寫lcd_wdat(Tempi); /將字符常量寫入LCDi+; /指向下一個字符delaynms(50); /延時1ms給硬件一點反應(yīng)時間/*函數(shù)功能:顯示溫度的小數(shù)點*/ void display_dot(void) lcd_pos(0x49); /寫顯示地址,將在第2

41、行第10列開始顯示 lcd_wdat('.'); /將小數(shù)點的字符常量寫入LCD delaynms(50); /延時1ms給硬件一點反應(yīng)時間/*函數(shù)功能:顯示溫度的單位(Cent)*/ void display_cent(void) unsigned char i; lcd_pos(0x4c); /寫顯示地址,將在第2行第13列開始顯示 i = 0; /從第一個字符開始顯示 while(Centi != '0') /只要沒有寫到結(jié)束標志,就繼續(xù)寫lcd_wdat(Centi); /將字符常量寫入LCDi+; /指向下一個字符delaynms(50); /延時1m

42、s給硬件一點反應(yīng)時間/*函數(shù)功能:顯示溫度的整數(shù)部分入口參數(shù):x*/ void display_temp1(unsigned char x) unsigned char j,k,l; /j,k,l分別儲存溫度的百位、十位和個位j=x/100; /取百位k=(x%100)/10; /取十位l=x%10; /取個位 lcd_pos(0x46); /寫顯示地址,將在第2行第7列開始顯示lcd_wdat(digitj); /將百位數(shù)字的字符常量寫入LCDlcd_wdat(digitk); /將十位數(shù)字的字符常量寫入LCDlcd_wdat(digitl); /將個位數(shù)字的字符常量寫入LCDdelaynm

43、s(50); /延時1ms給硬件一點反應(yīng)時間 /*函數(shù)功能:顯示溫度的小數(shù)數(shù)部分入口參數(shù):x*/ void display_temp2(unsigned char x) lcd_pos(0x4a); /寫顯示地址,將在第2行第11列開始顯示lcd_wdat(digitx); /將小數(shù)部分的第一位數(shù)字字符常量寫入LCDdelaynms(50); /延時1ms給硬件一點反應(yīng)時間/*函數(shù)功能:做好讀溫度的準備*/ void ReadyReadTemp(void) Init_DS18B20(); /將DS18B20初始化WriteOneChar(0xCC); / 跳過讀序號列號的操作WriteOneChar(0x44); / 啟動溫度轉(zhuǎn)換 for(time=0;time<100;time+) ; /溫度轉(zhuǎn)換需要一點時間Init_DS18B20(); /將DS18B20初始化WriteOneChar(0xCC); /跳過讀序號列號的操作WriteOneChar(0xBE); /讀取溫度寄存器,前兩個分別是溫度的低位和高位/*函數(shù)功能:顯示窗戶信息*/ void d

溫馨提示

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

評論

0/150

提交評論