標(biāo)題: 我的單片機(jī)DS18B20智能溫度表設(shè)計(jì) [打印本頁(yè)]

作者: loseyu    時(shí)間: 2018-10-14 10:09
標(biāo)題: 我的單片機(jī)DS18B20智能溫度表設(shè)計(jì)

本論文的主要內(nèi)容是詳細(xì)敘述使用AT89C51型號(hào)單片機(jī)來(lái)進(jìn)行智能數(shù)字溫度計(jì)設(shè)計(jì)的思路與相關(guān)知識(shí)的理解。詳細(xì)描述了利用數(shù)字溫度傳感器DS18B20開(kāi)發(fā)測(cè)溫系統(tǒng)的過(guò)程,重點(diǎn)對(duì)傳感器在單片機(jī)下的硬件連接,軟件編程以及各模塊系統(tǒng)流程進(jìn)行了詳盡分析,對(duì)各部分的電路也一一進(jìn)行了介紹,該系統(tǒng)可以方便的實(shí)現(xiàn)溫度的采集和報(bào)警,并可以根據(jù)需要任意上下限報(bào)警溫度,它使用起來(lái)相當(dāng)方便,具有精度高、量程寬、靈敏度高、體積小、功耗低等優(yōu)點(diǎn),適合于我們?nèi)粘I詈凸、農(nóng)業(yè)生產(chǎn)中的溫度測(cè)量,也可以當(dāng)做溫度處理模塊潛入其他系統(tǒng)中,作為其他主系統(tǒng)的輔助擴(kuò)展。


在現(xiàn)在這樣的信息化時(shí)代,信息技術(shù)隨處可見(jiàn),可以說(shuō)是離不開(kāi)我們的生活了,以后我們的生活就是在茶余飯后最多的話題就是我家的機(jī)器人性能怎么樣,我家的智能遙控電視怎么樣,我家的智能空調(diào)怎么了之類的話,本課題設(shè)計(jì)的智能數(shù)字溫度計(jì)也將是以后我們生活中離不開(kāi)的必需品。

在現(xiàn)在這樣的信息化時(shí)代,智能化才是我們追求的更高點(diǎn),智能機(jī)器人,智能電視,智能、智能…什么都是智能的,當(dāng)然也包括本課題設(shè)計(jì)的智能溫度計(jì),傳統(tǒng)的溫度計(jì)都有很多的缺陷,比如說(shuō)水銀溫度計(jì),他利用的就是最原始的熱脹冷縮原理,這種溫度計(jì)的最大的缺點(diǎn)就是誤差太大,而且讀數(shù)也不方便等等各方面的缺點(diǎn),與傳統(tǒng)的這些相比,本課題中的智能數(shù)字溫度計(jì)就先進(jìn)了很多,本設(shè)計(jì)使用起來(lái)相當(dāng)方便,具有精度高、量程寬、靈敏度高、體積小、功耗低等優(yōu)點(diǎn),適合于我們?nèi)粘I詈凸ぁ⑥r(nóng)業(yè)生產(chǎn)中的溫度測(cè)量,也可以當(dāng)做溫度處理模塊潛入其他系統(tǒng)中,作為其他主系統(tǒng)的輔助擴(kuò)展。DS18B20與STC89C51結(jié)合實(shí)現(xiàn)最簡(jiǎn)溫度報(bào)警系統(tǒng),該系統(tǒng)結(jié)構(gòu)簡(jiǎn)單,抗干擾能力強(qiáng),適合于惡劣環(huán)境下進(jìn)行現(xiàn)場(chǎng)溫度測(cè)量,有廣泛的應(yīng)用前景。

1.1設(shè)計(jì)目的

《傳感器與測(cè)試技術(shù)》設(shè)計(jì)是機(jī)械設(shè)計(jì)制造及其自動(dòng)化專業(yè)和機(jī)械電子工程專業(yè)的一個(gè)重要實(shí)踐性教學(xué)環(huán)節(jié)。該設(shè)計(jì)是在學(xué)完《傳感器與檢測(cè)技術(shù)》之后進(jìn)行,通過(guò)綜合應(yīng)用所學(xué)傳感器知識(shí),將內(nèi)容和前修有機(jī)結(jié)合形成系統(tǒng),完成傳感器應(yīng)用系統(tǒng)設(shè)計(jì)。

通過(guò)設(shè)計(jì)使我們能熟練查閱文獻(xiàn)資料,鞏固和加深對(duì)常用傳感器的結(jié)構(gòu)、原理、特性的認(rèn)識(shí)和基本知識(shí)的理解,提高綜合運(yùn)用所學(xué)知識(shí)的能力。通過(guò)實(shí)際電路方案的分析比較論證,設(shè)計(jì)計(jì)算,元件選擇,掌握傳感器電路的分析方法和工程設(shè)計(jì)方法,達(dá)到提高學(xué)生分析問(wèn)題和電路設(shè)計(jì)能力的教學(xué)目標(biāo),培養(yǎng)我們綜合應(yīng)用知識(shí)的能力,從而掌握智能檢測(cè)(或儀表)系統(tǒng)設(shè)計(jì)的基本思想和方法,為后續(xù)的學(xué)習(xí)和工作奠定了基礎(chǔ)。


1.2設(shè)計(jì)的任務(wù)和要求

針對(duì)某特定場(chǎng)合(如存儲(chǔ)倉(cāng))在常壓下對(duì)溫度的要求,選用合適的測(cè)試方法設(shè)計(jì)溫度智能儀表,要求具有存儲(chǔ)、顯示和報(bào)警功能,且溫度檢測(cè)精度為0.2℃。

要求:

1.理解在常壓下對(duì)溫度測(cè)量的基本原理和方法,分析建立設(shè)計(jì)需要的參數(shù)范圍。

2.根據(jù)溫度檢測(cè)要求,設(shè)計(jì)滿足給定任務(wù)要求的智能溫度表總體方案。

3.選擇合適的傳感器、信號(hào)處理電路、執(zhí)行器,進(jìn)行詳細(xì)設(shè)計(jì)。對(duì)測(cè)試模塊、顯示模塊、報(bào)警模塊等進(jìn)行設(shè)計(jì)和系統(tǒng)集成。

4.說(shuō)明所設(shè)計(jì)的溫度一體化智能儀表工作原理和工作過(guò)程。

5.對(duì)設(shè)計(jì)結(jié)果進(jìn)行必要的分析。

1.3設(shè)計(jì)的意義

我們已經(jīng)進(jìn)入了信息化的時(shí)代,智能化才是我們追求的更高點(diǎn)。傳統(tǒng)的溫度計(jì)都有很多的缺陷,比如說(shuō)水銀溫度計(jì),他利用的就是最原始的熱脹冷縮原理,這種溫度計(jì)的最大的缺點(diǎn)就是誤差太大,而且讀數(shù)也不方便等等各方面的缺點(diǎn),與傳統(tǒng)的這些相比,本設(shè)計(jì)較好地克服了這些缺點(diǎn),本設(shè)計(jì)中的智能數(shù)字溫度計(jì)選用AT89C51型號(hào)的單片機(jī)作為主要的控制程序,具有存儲(chǔ)、顯示和報(bào)警功能,且具有較高的溫度檢測(cè)精度。

1.4國(guó)內(nèi)外現(xiàn)狀及水平

國(guó)外對(duì)溫度控制技術(shù)研究較早,始于20世紀(jì)70年代。先是采用模擬式的組合儀表,采集現(xiàn)場(chǎng)信息并進(jìn)行指示、記錄和控制。80年代末出現(xiàn)了分布式控制系統(tǒng)。目前正開(kāi)發(fā)和研制計(jì)算機(jī)數(shù)據(jù)采集控制系統(tǒng)的多因子綜合控制系統(tǒng),F(xiàn)在世界各國(guó)的溫度測(cè)控技術(shù)發(fā)展很快,一些國(guó)家在實(shí)現(xiàn)自動(dòng)化的基礎(chǔ)上正向著完全自動(dòng)化、無(wú)人化的方向發(fā)展。

我國(guó)對(duì)于溫度測(cè)控技術(shù)的研究較晚,始于20世紀(jì)80年代。我國(guó)工程技術(shù)人員在吸收發(fā)達(dá)國(guó)家溫度測(cè)控技術(shù)的基礎(chǔ)上,才掌握了溫度室內(nèi)微機(jī)控制技術(shù),該技術(shù)僅限于對(duì)溫度的單項(xiàng)環(huán)境因子的控制。我國(guó)溫度測(cè)控設(shè)施計(jì)算機(jī)應(yīng)用,在總體上正從消化吸收、簡(jiǎn)單應(yīng)用階段向?qū)嵱没、綜合性應(yīng)用階段過(guò)渡和發(fā)展。在技術(shù)上,以單片機(jī)控制的單參數(shù)單回路系統(tǒng)居多,尚無(wú)真正意義上的多參數(shù)綜合控制系統(tǒng),與發(fā)達(dá)國(guó)家相比,存在較大差距。我國(guó)溫度測(cè)量控制現(xiàn)狀還遠(yuǎn)遠(yuǎn)沒(méi)有達(dá)到工廠化的程度,生產(chǎn)實(shí)際中仍然有許多問(wèn)題困擾著我們,存在著裝備配套能力差,產(chǎn)業(yè)化程度低,環(huán)境控制水平落后,軟硬件資源不能共享和可靠性差等缺點(diǎn)。



2.1方案設(shè)計(jì)與論證
2.1.1方案一

由于本設(shè)計(jì)是測(cè)溫電路,可以使用熱敏電阻之類的器件利用其感溫效應(yīng),在將隨被測(cè)溫度變化的電壓或電流采集過(guò)來(lái),進(jìn)行A/D轉(zhuǎn)換后,就可以用單片機(jī)進(jìn)行數(shù)據(jù)的處理,在顯示電路上,就可以將被測(cè)溫度顯示出來(lái),這種設(shè)計(jì)需要用到A/D轉(zhuǎn)換電路,感溫電路比較麻煩;

圖2-1-1利用熱敏電阻測(cè)溫度的框圖
2.1.2方案二

采用AT89S52作為系統(tǒng)處理器對(duì)采集的溫度信號(hào)進(jìn)行處理,溫度的范圍是0~100度。溫度傳感器TC1047首先將溫度信號(hào)轉(zhuǎn)化成電壓信號(hào),再經(jīng)過(guò)信號(hào)處理,最后送到TLC5510進(jìn)行A/D轉(zhuǎn)換,最后將結(jié)果通過(guò)數(shù)碼管顯示出來(lái)[1];

圖2-1-2 利用溫度傳感器TC1047采集溫度的框圖
2.1.3方案三

采用數(shù)字溫度傳感器DS18B20采集溫度,溫度測(cè)量范圍為-55~125℃,通過(guò)AT89S52處理信號(hào),不需要進(jìn)行A/D轉(zhuǎn)換,其自身可將模擬信號(hào)轉(zhuǎn)化成數(shù)字信號(hào),然后再通過(guò)數(shù)碼管輸出結(jié)果。

圖2-1-3采用數(shù)字溫度傳感器DS18B20采集溫度

方案一雖經(jīng)濟(jì)但由于要用到A/D轉(zhuǎn)換,所以電路比較復(fù)雜,不利于硬件連線,所以不采用此方案;方案二測(cè)量溫度精度高、能耗低,電路比方案一簡(jiǎn)單,但成本價(jià)太高,所以不采用此方案;方案三中溫度測(cè)量精度更高,無(wú)需進(jìn)行A/D轉(zhuǎn)換,且DS18B20芯片的管腳簡(jiǎn)單,無(wú)需外圍硬件設(shè)備即可進(jìn)行溫度測(cè)量,與單片機(jī)交換信息僅需一根I/O口線,占用微處理器的端口較少,可以節(jié)省大量的引線和邏輯電路,完全符合本設(shè)計(jì)的要求,因此采用此方案。

2.2工作原理

本設(shè)計(jì)選用AT89C51作為整個(gè)控制系統(tǒng)的核心部分,通過(guò)DS18B20采集溫度,通過(guò)三個(gè)按鍵:模式切換鍵、加鍵和減鍵。模式切換鍵可以切換正常顯示,上限溫度設(shè)定狀態(tài),下限溫度設(shè)定狀態(tài),當(dāng)實(shí)測(cè)溫度高于設(shè)定的上限值,蜂鳴器報(bào)警和LED紅燈閃爍報(bào)警,當(dāng)實(shí)測(cè)溫度高于設(shè)定的下限值,蜂鳴器報(bào)警和LED黃燈閃爍報(bào)警,系統(tǒng)可以方便的實(shí)現(xiàn)溫度的采集和報(bào)警,并可以根據(jù)需要任意上下限報(bào)警溫度,它使用起來(lái)相當(dāng)方便,具有精度高、量程寬、靈敏度高、體積小、功耗低等優(yōu)點(diǎn),適合于我們?nèi)粘I詈凸ぁ⑥r(nóng)業(yè)生產(chǎn)中的溫度測(cè)量,也可以當(dāng)做溫度處理模塊潛入其他系統(tǒng)中,作為其他主系統(tǒng)的輔助擴(kuò)展。


3.1單片機(jī)的選型簡(jiǎn)介

CPU是整個(gè)控制部分的核心。在考慮經(jīng)濟(jì)性和滿足需求的前提下,本設(shè)計(jì)選用AT89C51作為整個(gè)控制系統(tǒng)的核心部分,它的內(nèi)部含有可以進(jìn)行系統(tǒng)的編程的存儲(chǔ)器。Flash存儲(chǔ)器功能比較強(qiáng)大,在對(duì)它進(jìn)行編程時(shí)不僅可以在線操作,也可以使用一般的方法進(jìn)行操作。編好的程序主要存儲(chǔ)在芯片中,它的功能比較強(qiáng)大。所以,選用AT89C51作為本設(shè)計(jì)的控制中心。器件管腳圖如圖3-1:


圖3-1  AT89C51管腳圖

AT89C51簡(jiǎn)介:單片機(jī)的可擦除只讀存儲(chǔ)器可以反復(fù)擦除1000次。該器件采用ATMEL高密度非易失存儲(chǔ)器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃速存儲(chǔ)器組合在單個(gè)芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C051是它的一種精簡(jiǎn)版本。AT89C51單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價(jià)廉的方案。外形及引腳排列如圖所示。

3.2最小系統(tǒng)模塊
在這次設(shè)計(jì)中,根據(jù)課題的需要采用的是ATMEL公司51系列單片機(jī)AT89C51芯片作為控制芯片。在實(shí)際運(yùn)用中如果只用單片機(jī)芯片是沒(méi)有辦法達(dá)到所設(shè)計(jì)的目的,還要有相配套的電路,這樣才能組成一個(gè)完整的控制系統(tǒng)達(dá)到設(shè)計(jì)的要求。在本次設(shè)計(jì)中主要采用AT89C51芯片和相配套的電路來(lái)組成所需要的模塊進(jìn)行研究,模塊中一些具體的參數(shù)主要是選用P3口作1602的命令數(shù)據(jù)控制、時(shí)鐘、讀寫控制、和使能控制接口,P2口作按鍵掃描接口,P2.3作DS18B20的總線接口。P2.5,P2.7作報(bào)警控制接口。其電路連接圖3-2如下:

圖3-2 數(shù)據(jù)處理及控制模塊
3.3溫度傳感器設(shè)計(jì)
3.3.1溫度傳感器簡(jiǎn)介

DS18B20可以設(shè)定9~12位的分辨率,其精確度比較高。為了滿足實(shí)際的工作需要也可以采用比較小的封閉方式和相對(duì)較寬的電壓。設(shè)定的分辨率及報(bào)警溫度存儲(chǔ)在EPROM中,掉電后不會(huì)丟失。

溫度傳感器DS18B20引腳如圖3-3所示

圖3-3  DS18B20TO-92封裝溫度傳感器

引腳功能說(shuō)明:

VDD :可選電源腳,電源電壓范圍3~5.5V。

DQ :數(shù)據(jù)輸入/輸出腳。漏極開(kāi)路,常態(tài)下高電平。

GND :為接地電源腳。

DS18B20的組成部分主要包括:光刻64位ROM、溫度傳感器、非揮發(fā)的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器這四部分,它們?cè)谄鋬?nèi)部按照一定得結(jié)構(gòu)進(jìn)行排列!

光刻64位ROM它的序列號(hào)排列是有一定規(guī)律的,一般情況下排在首位的是8位不同類型的產(chǎn)品標(biāo)簽,之后是DS18B20的序列48位序列號(hào),排在最后的是前面所有序列號(hào)的校驗(yàn)碼,我們通過(guò)總結(jié)可以知道64光刻ROM的作用是保證每個(gè)DS18B20都不一樣,這樣就可以滿足總線連接多個(gè)DS18B20的要求。

DS18B20溫度傳感器主要包括的高速內(nèi)存非常容易丟失,內(nèi)存RAM主要有八個(gè)字節(jié)組成,這八個(gè)字節(jié)所包含的內(nèi)容有很大的區(qū)別。其中第一個(gè)字節(jié)是是低八位,第二個(gè)字節(jié)是高八位,第三個(gè)和第四個(gè)字節(jié)是最高和最低位的的非易失性復(fù)制,第五個(gè)字節(jié)是結(jié)構(gòu)寄存器的非易失性復(fù)制,第三,第四,第五個(gè)字節(jié)在每次上電復(fù)位時(shí)刷新內(nèi)容。六,七,八個(gè)字節(jié)用于內(nèi)部計(jì)算。第九個(gè)字節(jié)是冗余測(cè)試。E2RAM的主要作用是為了儲(chǔ)存高溫與低溫觸發(fā)TH、TL!

通過(guò)DS18B20的通信協(xié)議,我們知道主機(jī)在對(duì)其進(jìn)行控制時(shí)溫度實(shí)現(xiàn)轉(zhuǎn)換主要由三個(gè)步驟構(gòu)成。分別是每次讀寫DS18B20時(shí)都要進(jìn)行重新設(shè)置,完成設(shè)置之后需要發(fā)送一個(gè)指令,只有把相應(yīng)的指令發(fā)送之后才能對(duì)其進(jìn)行相關(guān)的操作。CPU在收到重新設(shè)置的要求之后需要先下拉后釋放,經(jīng)歷一定的時(shí)間之后就可以完成對(duì)信號(hào)的復(fù)位。

3.3.2 溫度傳感器與單片機(jī)的連接 溫度傳感器在和單機(jī)片進(jìn)行連接時(shí)所使用的接口型號(hào)是P2.0,這種接口在單機(jī)片中屬于高位地址線。P2端口是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O,另外它在輸出緩沖時(shí)可以帶動(dòng)4個(gè)邏輯門電路。P2端口的工作不受外界干擾,即使在對(duì)程序進(jìn)行編寫和檢查時(shí),它也能夠正常工作。圖3-4所示就是DSl8820組成情況。

圖3-4  DS18B20和單片機(jī)的接口連接
3.4LCD顯示模塊

在這種模塊內(nèi)部存放的字符是有不同的字符組成的,這些字符主要包括:英文字母、常用的數(shù)學(xué)符號(hào)和阿拉伯?dāng)?shù)字,不同的字符所具有的代碼也不一樣。就拿英文字母來(lái)說(shuō)大寫的A所代表的是41h,如果使用顯示器進(jìn)行發(fā)送時(shí),模塊上顯示的是41h,但是在液晶顯示器上看到的卻是字母A。 

1602液晶模塊的控制器主要有11條指令,數(shù)量眾多的控制指令可以更好地完成對(duì)程序的控制,滿足其工作需要!

采用的LCD1602液晶模塊是標(biāo)準(zhǔn)16針插座,接口電路如圖3.6所示

圖3.6  顯示電路的連接圖
3.5系統(tǒng)硬件的總體框圖
系統(tǒng)硬件的總體框圖如圖3.7所示

圖3.7  系統(tǒng)硬件的總體框圖
第四章 軟件設(shè)計(jì)
4.1 軟件介紹
4.1.1
編程軟件

Keil軟件:?jiǎn)纹瑱C(jī)開(kāi)發(fā)中離不開(kāi)軟件,我們寫的匯編語(yǔ)言源程序要變?yōu)镃PU可以執(zhí)行的機(jī)器碼有兩種方法,一種是手工匯編,另一種是機(jī)器匯編,目前已極少使用手工匯編的方法了。機(jī)器匯編是通過(guò)匯編軟件將源程序變?yōu)闄C(jī)器碼,用于MCS-51單片機(jī)的匯編軟件有早期的A51,隨著單片機(jī)開(kāi)發(fā)技術(shù)的不斷發(fā)展,從普遍使用匯編語(yǔ)言到逐漸使用高級(jí)語(yǔ)言開(kāi)發(fā),單片機(jī)的開(kāi)發(fā)軟件也在不斷發(fā)展,Keil軟件是目前最流行開(kāi)發(fā)MCS-51系列單片機(jī)的軟件,這從近年來(lái)各仿真機(jī)廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開(kāi)發(fā)方案,通過(guò)一個(gè)集成開(kāi)發(fā)環(huán)境(uVision)將這些部份組合在一起。

4.1.2 繪圖軟件Proteus軟件是英國(guó)Lab Center Electronics公司出版的EDA工具軟件(該軟件中國(guó)總代理為廣州風(fēng)標(biāo)電子技術(shù)有限公司)。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機(jī)及外圍器件。它是目前比較好的仿真單片機(jī)及外圍器件的工具。雖然目前國(guó)內(nèi)推廣剛起步,但已受到單片機(jī)愛(ài)好者、從事單片機(jī)教學(xué)的教師、致力于單片機(jī)開(kāi)發(fā)應(yīng)用的科技工作者的青睞。Proteus可提供的仿真元器件資源:仿真數(shù)字和模擬、交流和直流等數(shù)千種元器件,有30多個(gè)元件庫(kù)。.Proteus可提供的仿真儀表資源 :示波器、邏輯分析儀、虛擬終端、SPI調(diào)試器、I2C調(diào)試器、信號(hào)發(fā)生器、模式發(fā)生器、交直流電壓表、交直流電流表。理論上同一種儀器可以在一個(gè)電路中隨意的調(diào)用。除了現(xiàn)實(shí)存在的儀器外,Proteus還提供了一個(gè)圖形顯示功能,可以將線路上變化的信號(hào),以圖形的方式實(shí)時(shí)地顯示出來(lái),其作用與示波器相似,但功能更多。這些虛擬儀器儀表具有理想的參數(shù)指標(biāo),例如極高的輸入阻抗、極低的輸出阻抗。這些都盡可能減少了儀器對(duì)測(cè)量結(jié)果的影響。Proteus可提供的調(diào)試手段 Proteus提供了比較豐富的測(cè)試信號(hào)用于電路的測(cè)試。這些測(cè)試信號(hào)包括模擬信號(hào)和數(shù)字信號(hào)。
4.2程序設(shè)計(jì)DS18B20讀取溫度的流程圖如下圖4-1
圖4-1DS18B20讀取溫度的流程圖

溫度數(shù)據(jù)處理流程圖如下4-5:

圖4-2  溫度數(shù)據(jù)處理流程圖

第五章 調(diào)試5.1開(kāi)機(jī)溫度測(cè)試
運(yùn)行程序,數(shù)碼管顯示設(shè)定溫度值。
圖5.1開(kāi)機(jī)溫度測(cè)試

5.2設(shè)置溫度測(cè)試
三個(gè)按鍵:模式切換鍵、加鍵和減鍵。模式切換鍵可以切換正常顯示,上限溫度設(shè)定狀態(tài),下限溫度設(shè)定狀態(tài)。通過(guò)加鍵和減鍵設(shè)定溫度,通過(guò)切換鍵可以切換成正常狀態(tài)。

圖5.2設(shè)置溫度測(cè)試

5.3 報(bào)警測(cè)試當(dāng)實(shí)測(cè)溫度高于設(shè)定的上限值,蜂鳴器報(bào)警和LED燈閃爍報(bào)警,如圖5.3所示。當(dāng)實(shí)測(cè)溫度高于設(shè)定的限值,蜂鳴器報(bào)警和LED燈閃爍報(bào)警,如圖5.4所示

圖5.3上限報(bào)警調(diào)試


圖5.4設(shè)置溫度測(cè)試

結(jié) 論

本文的主要內(nèi)容是對(duì)單機(jī)片的組成要素進(jìn)行了詳細(xì)的介紹,重點(diǎn)知識(shí)主要包括AT89C51型號(hào)單片機(jī)與DS18B20型號(hào)數(shù)字溫度傳感器的主要結(jié)構(gòu)和作用,數(shù)字溫度計(jì)主要由DS18B20與AT89C51單片機(jī)、LCD1602構(gòu)成,有超溫報(bào)警功能。

通過(guò)本次設(shè)計(jì)使我們小組在專業(yè)知識(shí)方面有了很大的提高,同時(shí)也使我們認(rèn)識(shí)到自身的不足之處。單機(jī)片設(shè)計(jì)的主要內(nèi)容是硬件設(shè)施的挑選、電路的設(shè)計(jì)和程序的完成,硬件的選擇有點(diǎn)麻煩,但是硬件是其他部分的關(guān)鍵,硬件選好了后面的部分就輕松的多,還有電路的設(shè)計(jì),怎么樣設(shè)計(jì)才能達(dá)到最佳的效果,還有程序的完成,這是一連串的過(guò)程,需要不斷地思考,測(cè)試完善,這次設(shè)計(jì)也是我們對(duì)所學(xué)知識(shí)的一次綜合應(yīng)用,在發(fā)現(xiàn)問(wèn)題,解決問(wèn)題的這一過(guò)程中使我們受益匪淺。只有善于思考,不斷地改進(jìn),以一個(gè)科學(xué)嚴(yán)謹(jǐn)認(rèn)真的態(tài)度去對(duì)待,才能有所成果,C51單片機(jī)是現(xiàn)在最基礎(chǔ)最簡(jiǎn)單的單片機(jī),本設(shè)計(jì)結(jié)構(gòu)簡(jiǎn)單,應(yīng)用性較強(qiáng),能夠較好地實(shí)現(xiàn)相應(yīng)的功能。以后我們會(huì)更加深入地學(xué)習(xí)與單片機(jī)、電子電路、C語(yǔ)言的相關(guān)知識(shí),對(duì)相關(guān)的理論進(jìn)行思考和摸索,更好地掌握這些知識(shí)。


  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. uchar smg_dm[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x63,0x39,0x00}; //共陰數(shù)碼管0-9 O C 全滅              段碼表
  5. uchar smg_dm1[]={0xbf,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,}; //0. 1. 2.----9.段碼表
  6. uchar smg_wm[]={0Xef,0Xdf,0xbf,0x7f};      //位選

  7. uchar Display_buffer[4]={0,0,0,0};                //數(shù)碼管顯示緩存

  8. sbit LED=P3^7;  //高溫度報(bào)警指示燈
  9. sbit LED1=P3^5;  //低溫度報(bào)警指示燈
  10. sbit BEEP=P3^6;  //蜂鳴器

  11. sbit key1=P2^0;
  12. sbit key2=P2^1;
  13. sbit key3=P2^2;
  14. sbit DQ=P2^3;  //DS18B20 總線 精度1

  15. uint temp1; //上限溫度
  16. uint temp2; //下限溫度
  17. uchar keynum;
  18. uchar flagkey=0;
  19. uchar flag=0;
  20. uint num;
  21. uint temp;              //數(shù)碼管溫度顯示變量
  22. void keyscan();              //按鍵掃描程序
  23. void smg_display_ds18b20();//數(shù)碼管溫度顯示函數(shù)
  24. void display();                                //溫度顯示
  25. void display1();                            //按鍵設(shè)置溫度顯示
  26. void delay_ms(uint z);  //ms延時(shí)子程序
  27. void delay_us(uint t);              //延時(shí)子程序
  28. void init_ds18b20(void); //              ds18b20初始化
  29. void write_byte(uchar dat);                //寫字節(jié)
  30. uchar read_byte(void);                    //讀字節(jié)
  31. uint readtemperature(void);  //讀數(shù)據(jù)

  32. void keyscan()
  33. {
  34.               if(key1==0)
  35.               {
  36.               delay_ms(10);
  37.               if(key1==0)
  38.               {
  39.                             keynum++;
  40.                             keynum=keynum%3;
  41.                             switch(keynum)
  42.                             {
  43.                                           case 0:flagkey=0;break;
  44.                                           case 1:flagkey=1;break;            
  45.                                           case 2:flagkey=2;break;
  46.                             }
  47.               }
  48.               while(!key1);
  49.               }
  50.               if(flagkey==1)                 //設(shè)置上限
  51.               {
  52.                             if(key2==0)
  53.                             {
  54.                                           delay_ms(10);
  55.                                           if(key2==0)
  56.                                           {
  57.                                           //flag1=1;
  58.                                           #if 1
  59.                                           temp1=temp1+10;
  60.                                                         if(temp1==100)
  61.                                                         {
  62.                                                                       temp1=0;
  63.                                                         }

  64.                                          
  65.                                           #endif
  66.                                           }
  67.                                           while(!key2);            
  68.                             }
  69.                             if(key3==0)
  70.                                           {
  71.                                                         delay_ms(10);
  72.                                                         if(key3==0)
  73.                                                         {
  74.                                                         // flag1=2;
  75.                                                         #if 1
  76.                                                         temp1=temp1-10;
  77.                                                                       if(temp1==0)
  78.                                                                       {
  79.                                                                                     temp1=100;
  80.                                                                       }

  81.                                                         #endif
  82.                                                         }
  83.                                                         while(!key3);            
  84.                                           }
  85.               //              display1();
  86.               }
  87.                             if(flagkey==2)              //設(shè)置下限
  88.                             {
  89.                                           if(key2==0)
  90.                             {
  91.                                           delay_ms(10);
  92.                                           if(key2==0)
  93.                                           {
  94.                                           //flag1=1;
  95.                                           #if 1

  96.                                           temp2=temp2+10;
  97.                                                         if(temp2==100)
  98.                                                         {
  99.                                                                       temp2=0;
  100.                                                         }
  101.                                          
  102.                                           #endif
  103.                                           }
  104.                                           while(!key2);            
  105.                             }
  106.                             if(key3==0)
  107.                                           {
  108.                                                         delay_ms(10);
  109.                                                         if(key3==0)
  110.                                                         {
  111.                                                         // flag1=2;
  112.                                                         #if 1
  113.                                                         temp2=temp2-10;
  114.                                                                       if(temp2==0)
  115.                                                                       {
  116.                                                                                     temp2=100;
  117.                                                                       }
  118.                                                         #endif
  119.                                                         }
  120.                                                         while(!key3);            
  121.                                           }
  122.                             }
  123.                             display1();

  124. }


  125. void main()//主程序
  126. {
  127.     TMOD=0X01;
  128.               TH0=(65536-50000)/256;
  129.               TL0=(65536-50000)%256;
  130.     EA=1;
  131.     ET0=1;
  132.               TR0=1;
  133.               temp1=345;              //上限溫度
  134.               temp2=305;              //下限溫度
  135.               while(1)
  136.                             {            
  137.                               keyscan();
  138.                             // if(flagkey==1)
  139.                             // {
  140.                                             if(temp>=temp1&&flagkey==0)  //250是實(shí)際的數(shù)值   //flagkey==0 設(shè)置狀態(tài)蜂鳴器和LED都不起作用
  141.                                              {
  142.                                                           // LED=0;
  143.                                                            if(flag==1)
  144.                                                            {
  145.                                                                                        BEEP=0;//  開(kāi)始報(bào)警
  146.                                                                                     LED=0;
  147.                                                                                     LED1=1;
  148.                                                                                     flag=0;              // 退出if語(yǔ)句
  149.                                                            }
  150.                                                            else
  151.                                                            {
  152.                                                                                        BEEP=1;              //關(guān)閉報(bào)警 實(shí)現(xiàn)以0.5S的時(shí)間間隔來(lái)報(bào)警 時(shí)間和自己設(shè)定
  153.                                                                                     LED=1;
  154.                                                                                     LED1=1;
  155.                                                            }               
  156.                                              }
  157.                                              else if(temp<=temp2&&flagkey==0)
  158.                                              {
  159.                                                            //  LED=0;
  160.                                                            if(flag==1)
  161.                                                            {
  162.                                                                                        BEEP=0;//  開(kāi)始報(bào)警
  163.                                                                                     LED1=0;
  164.                                                                                     LED=1;
  165.                                                                                     flag=0;              // 退出if語(yǔ)句
  166.                                                            }
  167.                                                            else
  168.                                                            {
  169.                                                                                        BEEP=1;              //關(guān)閉報(bào)警 實(shí)現(xiàn)以0.5S的時(shí)間間隔來(lái)報(bào)警 時(shí)間和自己設(shè)定
  170.                                                                                     LED1=1;
  171.                                                                                     LED=1;
  172.                                                            }
  173.                                              }
  174.                                              else
  175.                                              {
  176.                                                            LED=1;
  177.                                                            LED1=1;
  178.                                                            BEEP=1;
  179.                                              }
  180.                             //  }
  181.                            

  182.                                if(flagkey==0) //上電 顯示DS18B20測(cè)出的溫度 有按鍵按下退出這個(gè)顯示
  183.                                {
  184.                                             display();                            //溫度顯示
  185.                                }
  186.                             }
  187. }

  188. void time0() interrupt 1
  189. {
  190.       TH0=(65536-50000)/256;
  191.                 TL0=(65536-50000)%256;
  192.                 num++;            
  193.       if(num==10) //0.5S到
  194.                 {
  195.                   num=0;
  196.                             flag=1;              //進(jìn)去蜂鳴器報(bào)警
  197.                 }
  198. }

  199. void display1()                //設(shè)置數(shù)碼管顯示
  200. {
  201.               #if 1
  202.               uchar i;
  203.               //Display_buffer[0]=12;  //也可以硬件不接
  204.               if(flagkey==1)
  205.               {
  206.               Display_buffer[0]=temp1/1000;
  207.               Display_buffer[1]=temp1%1000/100;
  208.               Display_buffer[2]=temp1%1000%100/10;
  209.               Display_buffer[3]=temp1%10;              //251 結(jié)果余1
  210.               }
  211.               if(flagkey==2)
  212.               {
  213.               Display_buffer[0]=temp2/1000;
  214.               Display_buffer[1]=temp2%1000/100;
  215.               Display_buffer[2]=temp2%1000%100/10;
  216.               Display_buffer[3]=temp2%10;              //251 結(jié)果余1
  217.               }
  218.               for(i=0;i<=3;i++)
  219.                             {            
  220.                               if(i==2)
  221.                               {
  222.                                                           P2=smg_wm[i];//選位碼
  223.                                                         P1=smg_dm1[Display_buffer[i]];//選段碼
  224.                                                         delay_ms(5);
  225.                                                         P1=0X00;//消影
  226.                               }
  227.                               else
  228.                               {            
  229.                                                         P2=smg_wm[i];//選位碼
  230.                                                         P1=smg_dm[Display_buffer[i]];//選段碼
  231.                                                         delay_ms(5);
  232.                                           P1=0X00;//消影
  233.                             }
  234.                   }
  235.               #endif
  236. }



  237. void display()  //
  238. {
  239.               temp=readtemperature();              //讀出溫度值
  240.               smg_display_ds18b20();               //數(shù)碼管上顯示            
  241. }
  242.                                          
  243. void smg_display_ds18b20()              //DS18B20的采樣回來(lái)的數(shù)值 數(shù)碼管顯示的延時(shí)是1ms,延時(shí)時(shí)間長(zhǎng)一點(diǎn)的顯示會(huì)不正常
  244. {
  245.   #if 1
  246.               uchar i;
  247.               //Display_buffer[0]=12;  //也可以硬件不接
  248.               Display_buffer[0]=temp/1000;
  249.               Display_buffer[1]=temp%1000/100;
  250.               Display_buffer[2]=temp%1000%100/10;
  251.               Display_buffer[3]=temp%10;              //251 結(jié)果余1
  252.               for(i=0;i<=3;i++)
  253.                             {            
  254.                               if(i==2)
  255.                               {
  256.                                                           P2=smg_wm[i];//選位碼
  257.                                                         P1=smg_dm1[Display_buffer[i]];//選段碼
  258.                                                         delay_ms(5);
  259.                                                         P1=0X00;//消影
  260.                               }
  261.                               else
  262.                               {            
  263.                                                         P2=smg_wm[i];//選位碼
  264.                                                         P1=smg_dm[Display_buffer[i]];//選段碼
  265.                                                         delay_ms(5);
  266.                                               P1=0X00;//消影
  267.                             }
  268.                   }
  269.               #endif
  270. }

  271. ///////////////////////延時(shí)////////////////////////////////////
  272. void delay_ms(uint z)  //延時(shí)子程序
  273. {
  274.    uint x,y;
  275.    for(x=z;x>0;x--)
  276.                  for(y=110;y>0;y--);
  277. }

  278. void delay_us(uint t)
  279. {
  280.               while(t--);
  281. }



  282. /////////////////////DS18B20部分 根據(jù)18B20規(guī)格書(shū)的時(shí)序來(lái)進(jìn)行讀寫操作//////////////////////////
  283. void init_ds18b20(void)   //根據(jù)18B20時(shí)序?qū)?br />
  284. {
  285.   uchar n;
  286.   DQ=1;
  287.   delay_us(8);
  288.   DQ=0;
  289.   delay_us(80);
  290.   DQ=1;
  291.   delay_us(8);
  292.   n=DQ;
  293.   delay_us(14);
  294. }
  295. ///////////////////////////////
  296. void write_byte(uchar dat)               //寫字節(jié)
  297. {
  298.               uchar i;
  299.               for(i=0;i<8;i++)
  300.               {
  301.                             DQ=0;  
  302.                             DQ=dat&0x01;
  303.                             delay_us(8);  
  304.                             DQ=1;
  305.                             dat>>=1;
  306.               }
  307.               delay_us(8);
  308. }
  309. //////////////////////////////////
  310. uchar read_byte(void)               //讀字節(jié)
  311. {
  312.               uchar i,value;
  313.               for(i=0;i<8;i++)
  314.               {
  315.                             DQ=0;
  316.                             value>>=1;
  317.                             DQ=1;
  318.                             if(DQ)  
  319.                             value|=0x80;  
  320.                             delay_us(4);
  321.               }
  322.               return value;
  323. }
  324. ////////////////////////////
  325. uint readtemperature(void)   //讀溫度                            //uchar 只有255
  326. {
  327.     uchar a,b;
  328.               uint val;
  329.               float f_val;
  330.               init_ds18b20();
  331.               write_byte(0xcc); //跳過(guò)ROM
  332.               write_byte(0x44); // 啟動(dòng)溫度測(cè)量
  333.               delay_us(300); //適當(dāng)延時(shí)
  334.               init_ds18b20();  //
  335.               write_byte(0xcc);
  336.               write_byte(0xbe);  //讀取溫度寄存器
  337.               a=read_byte();                             //連續(xù)讀兩個(gè)字節(jié)數(shù)據(jù)。讀低8位
  338.               b=read_byte();                             //讀高8位
  339. ///////////////////////////////////////////////////

  340. ///////////////////////////////////////////////////
  341.               #if 1 //精度為0.1
  342.     …………
  343. …………
  344. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

附錄二 原理圖


以上的Word格式文檔51黑下載地址:

基于單片機(jī)的智能溫度表設(shè)計(jì).docx (530.87 KB, 下載次數(shù): 71)



作者: hrdd    時(shí)間: 2019-12-31 12:05
真是太感謝這樣的分享了  ,希望能下載一下
作者: 2450768115    時(shí)間: 2020-1-7 02:25
你好,程序有匯編語(yǔ)言版本的嘛
作者: 1515893553    時(shí)間: 2020-12-25 10:37
怎么實(shí)現(xiàn)不了
作者: zxx135245    時(shí)間: 2020-12-27 10:56
可以呀,這個(gè)太牛了,要是樓主能傳個(gè)仿真給我們學(xué)習(xí)一下就更好了




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1