基于51單片機(jī)及DS18B20溫度傳感器的數(shù)字溫度計(jì)設(shè)計(jì)_第1頁(yè)
基于51單片機(jī)及DS18B20溫度傳感器的數(shù)字溫度計(jì)設(shè)計(jì)_第2頁(yè)
基于51單片機(jī)及DS18B20溫度傳感器的數(shù)字溫度計(jì)設(shè)計(jì)_第3頁(yè)
基于51單片機(jī)及DS18B20溫度傳感器的數(shù)字溫度計(jì)設(shè)計(jì)_第4頁(yè)
基于51單片機(jī)及DS18B20溫度傳感器的數(shù)字溫度計(jì)設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 基于51單片機(jī)及DS18B20溫度傳感器的數(shù)字溫度計(jì)設(shè)計(jì) 基于51單片機(jī)及DS18b20溫度傳感器的數(shù)字溫度計(jì)設(shè)計(jì)摘 要本設(shè)計(jì)采用的主控芯片是ATMEL公司的AT89S52單片機(jī),數(shù)字溫度傳感器是DALLAS公司的DS18B20。本設(shè)計(jì)用數(shù)字傳感器DS18B20測(cè)量溫度,測(cè)量精度高,傳感器體積小,使用方便。所以本次設(shè)計(jì)的數(shù)字溫度計(jì)在工業(yè)、農(nóng)業(yè)、日常生活中都有廣泛的應(yīng)用。單片機(jī)技術(shù)已經(jīng)廣泛應(yīng)用社會(huì)生活的各個(gè)領(lǐng)域,已經(jīng)成為一種非常實(shí)用的技術(shù)。51單片機(jī)是最常用的一種單片機(jī),而且在高校中都以51單片機(jī)教材為藍(lán)本,這使得51單片機(jī)成為初學(xué)單片機(jī)技術(shù)人員的首選。本次設(shè)計(jì)采用的AT89S52是一種fla

2、sh型單片機(jī),可以直接在線編程,向單片機(jī)中寫程序變得更加容易。本次設(shè)計(jì)的數(shù)字溫度計(jì)采用的是DS18B20數(shù)字溫度傳感器,DS18B20是一種可組網(wǎng)的高精度數(shù)字式溫度傳感器,由于其具有單總線的獨(dú)特優(yōu)點(diǎn),可以使用戶輕松地組建起傳感器網(wǎng)絡(luò),并可使多點(diǎn)溫度測(cè)量電路變得簡(jiǎn)單、可靠。本設(shè)計(jì)根據(jù)設(shè)計(jì)要求,首先設(shè)計(jì)了硬件電路,然后繪制軟件流程圖及編寫程序。本設(shè)計(jì)屬于一種多功能溫度計(jì),溫度測(cè)量范圍是-55到125。溫度值的分辨率可以被用戶設(shè)定為9-12位,可以設(shè)置上下限報(bào)警溫度,當(dāng)溫度不在設(shè)定的范圍內(nèi)時(shí),就會(huì)啟動(dòng)報(bào)警程序報(bào)警。本設(shè)計(jì)的顯示模塊是用四位一體的數(shù)碼管動(dòng)態(tài)掃描顯示實(shí)現(xiàn)的。在顯示實(shí)時(shí)測(cè)量溫度的模式下還可

3、以通過查詢按鍵查看設(shè)定的上下限報(bào)警溫度。 關(guān)鍵詞:?jiǎn)纹瑱C(jī)、數(shù)字溫度計(jì)、DS18B20、AT89S52目 錄1 概 述- 1 -1.1系統(tǒng)概述- 1 -2 系統(tǒng)總體方案及硬件設(shè)計(jì)- 2 -2.1 系統(tǒng)總體方案- 2 -2.1.1系統(tǒng)總體設(shè)計(jì)框圖- 2 -2.1.2各模塊簡(jiǎn)介- 2 -2.2 系統(tǒng)硬件設(shè)計(jì)- 5 -2.2.1 單片機(jī)電路設(shè)計(jì)- 5 -2.2.2 DS18B20溫度傳感器電路設(shè)計(jì)- 6 -2.2.3 顯示電路設(shè)計(jì)- 6 -2.2.4 按鍵電路設(shè)計(jì)- 7 -2.2.5 報(bào)警電路設(shè)計(jì)- 8 -3 軟件設(shè)計(jì)- 9 -3.1 DS18B20程序設(shè)計(jì)- 9 -3.1.1 DS18B20傳感器操

4、作流程- 9 -3.1.2 DS18B20傳感器的指令表- 9 -3.1.3 DS18B20傳感器的初始化時(shí)序- 10 -3.1.4 DS18B20傳感器的讀寫時(shí)序- 10 -3.1.5 DS18B20獲取溫度程序流程圖- 11 -3.2 顯示程序設(shè)計(jì)- 13 -3.3 按鍵程序設(shè)計(jì)- 13 -4實(shí)物制作及調(diào)試- 14 -5電子綜合設(shè)計(jì)體會(huì)- 15 -參考文獻(xiàn)- 15 -附1 源程序代碼- 17 -附2 系統(tǒng)原理圖- 32 -1 概 述1.1系統(tǒng)概述本系統(tǒng)所設(shè)計(jì)的數(shù)字溫度計(jì)采用的是DS18B20數(shù)字溫度傳感器測(cè)溫,DS18B20直接輸出的就是數(shù)字信號(hào),與傳統(tǒng)的溫度計(jì)相比,具有讀數(shù)方便,測(cè)溫范圍

5、廣,測(cè)溫準(zhǔn)確,上下限報(bào)警功能。其輸出溫度采用LED數(shù)碼管顯示,主要用于對(duì)測(cè)溫比較準(zhǔn)確的場(chǎng)所。該設(shè)計(jì)控制器使用的是51單片機(jī)AT89S52,AT89S52單片機(jī)在工控、測(cè)量、儀器儀表中應(yīng)用還是比較廣泛的。測(cè)溫傳感器使用的是DS18B20,DS18B20是一種可組網(wǎng)的高精度數(shù)字式溫度傳感器,由于其具有單總線的獨(dú)特優(yōu)點(diǎn),可以使用戶輕松地組建起傳感器網(wǎng)絡(luò),并可使多點(diǎn)溫度測(cè)量電路變得簡(jiǎn)單、可靠。顯示是用4位共陰極LED數(shù)碼管實(shí)現(xiàn)溫度顯示,LED數(shù)碼管的優(yōu)點(diǎn)是顯示數(shù)字比較大,查看方便。蜂鳴器用來(lái)實(shí)現(xiàn)當(dāng)測(cè)量溫度超過設(shè)定的上下限時(shí)的報(bào)警功能。 - 32 -2 系統(tǒng)總體方案及硬件設(shè)計(jì)2.1 系統(tǒng)總體方案2.1.

6、1系統(tǒng)總體設(shè)計(jì)框圖由于DS18B20數(shù)字溫度傳感器具有單總線的獨(dú)特優(yōu)點(diǎn),可以使用戶輕松地組建起傳感器網(wǎng)絡(luò),并可使多點(diǎn)溫度測(cè)量電路變得簡(jiǎn)單、可靠,所以在該設(shè)計(jì)中采用DS18B20數(shù)字溫度傳感器測(cè)量溫度。 溫度計(jì)電路設(shè)計(jì)總體設(shè)計(jì)框圖如圖2-1所示,控制器采用單片機(jī)AT89S52,溫度傳感器采用DS18B20,顯示采用4位LED數(shù)碼管,報(bào)警采用蜂鳴器、LED燈實(shí)現(xiàn),鍵盤用來(lái)設(shè)定報(bào)警上下限溫度。圖2-1 溫度計(jì)電路總體設(shè)計(jì)框圖2.1.2各模塊簡(jiǎn)介1.控制模塊AT89S52單片機(jī)是美國(guó)ATMEL公司生產(chǎn)的低功耗,高性能CMOS 8位單片機(jī),片內(nèi)含有8kb的可系統(tǒng)編程的Flash只讀程序存儲(chǔ)器,器件采用A

7、TMEL公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)8051指令系統(tǒng)及引腳。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程的Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。AT89S52具有以下標(biāo)準(zhǔn)功能:8k字節(jié)Flash,256字節(jié)RAM,32 位I/O 口線,看門狗定時(shí)器,2 個(gè)數(shù)據(jù)指針,三個(gè)16 位定時(shí)器/計(jì)數(shù)器,一個(gè)6向量2級(jí)中斷結(jié)構(gòu),全雙工串行口,片內(nèi)晶振及時(shí)鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容

8、被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。2.顯示模塊顯示電路采用4位共陰LED數(shù)碼管,從P0口輸出段碼,P2口的高四位為位選端。用動(dòng)態(tài)掃描的方式進(jìn)行顯示,這樣能有效節(jié)省I/O口。3.溫度傳感器模塊DS18B20溫度傳感器是美國(guó)DALLAS半導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測(cè)溫元件相比,它能直接讀出被測(cè)溫度,并且可根據(jù)實(shí)際要求通過簡(jiǎn)單的編程實(shí)現(xiàn)912位的數(shù)字值讀數(shù)方式。DS18B20的性能特點(diǎn)如下:獨(dú)特的單線接口僅需要一個(gè)端口引腳進(jìn)行通信;多個(gè)DS18B20可以并聯(lián)在惟一的三線上,實(shí)現(xiàn)多點(diǎn)組網(wǎng)功能;無(wú)須外部器件;可通過數(shù)據(jù)線供電,電壓

9、范圍為3.05.5v;零待機(jī)功耗;溫度以9或12位二進(jìn)制數(shù)字表示;用戶可定義報(bào)警設(shè)置;報(bào)警搜索命令識(shí)別并標(biāo)志超過程序限定溫度(溫度報(bào)警條件)的器件;負(fù)電壓特性,電源極性接反時(shí),溫度計(jì)不會(huì)因發(fā)熱而燒毀,但不能正常工作; DS18B20采用3腳TO92封裝或8腳SO或µSOP封裝,其其封裝形式如圖2-2所示。圖2-2 DS18B20的封裝形式DS18B20的64位ROM的結(jié)構(gòu)開始8位是產(chǎn)品類型的編號(hào),接著是每個(gè)器件的惟一的序號(hào),共有48位,最后8位是前面56位的CRC檢驗(yàn)碼,這也是多個(gè)DS18B20可以采用一線進(jìn)行通信的原因。溫度報(bào)警觸發(fā)器TH和TL,可通過軟件寫入戶報(bào)警上下限。DS18

10、B20溫度傳感器的內(nèi)部存儲(chǔ)器還包括一個(gè)高速暫存RAM和一個(gè)非易失性的可電擦除的EEPRAM。高速暫存RAM的結(jié)構(gòu)為8字節(jié)的存儲(chǔ)器,結(jié)構(gòu)如圖2-3所示。圖2-3 DS18B20的高速暫存RAM的結(jié)構(gòu)頭2個(gè)字節(jié)包含測(cè)得的溫度信息,第3和第4字節(jié)TH和TL的拷貝是易失的,每次上電復(fù)位時(shí)被刷新。第5個(gè)字節(jié),為配置寄存器,它的內(nèi)容用于確定溫度值的數(shù)字轉(zhuǎn)換分辨率,DS18B20工作時(shí)寄存器中的分辨率轉(zhuǎn)換為相應(yīng)精度的溫度數(shù)值,該字節(jié)各位的定義如表2-1所示。表2-1:配置寄存器D7 D6 D5 D4 D3 D2 D1 D0TMR1R011111配置寄存器的低5位一直為1,TM是工作模式位,用于設(shè)置DS18B

11、20在工作模式還是在測(cè)試模式,DS18B20出廠時(shí)該位被設(shè)置為0,用戶要去改動(dòng),R1和R0決定溫度轉(zhuǎn)換的精度位數(shù),來(lái)設(shè)置分辨率,“R1R0”為“00”是9位,“01”是10位,“10”是11位,“11”是12位。當(dāng)DS18B20分辨率越高時(shí),所需要的溫度數(shù)據(jù)轉(zhuǎn)換時(shí)間越長(zhǎng)。因此,在實(shí)際應(yīng)用中要將分辨率和轉(zhuǎn)換時(shí)間權(quán)衡考慮。高速暫存RAM的第6、7、8字節(jié)保留未用,表現(xiàn)為全邏輯1。第9字節(jié)讀出前面所有8字節(jié)的CRC碼,可用來(lái)檢驗(yàn)數(shù)據(jù),從而保證通信數(shù)據(jù)的正確性。當(dāng)DS18B20接收到溫度轉(zhuǎn)換命令后,開始啟動(dòng)轉(zhuǎn)換。轉(zhuǎn)換完成后的溫度值就以16位帶符號(hào)擴(kuò)展的二進(jìn)制補(bǔ)碼形式存儲(chǔ)在高速暫存存儲(chǔ)器的第1、2字節(jié)。

12、單片機(jī)可以通過單線接口讀出該數(shù)據(jù),讀數(shù)據(jù)時(shí)低位在先,高位在后,數(shù)據(jù)格式以0.0625LSB形式表示。當(dāng)符號(hào)位s0時(shí),表示測(cè)得的溫度值為正值,可以直接將二進(jìn)制位轉(zhuǎn)換為十進(jìn)制;當(dāng)符號(hào)位s1時(shí),表示測(cè)得的溫度值為負(fù)值,要先將補(bǔ)碼變成原碼,再計(jì)算十進(jìn)制數(shù)值。輸出的二進(jìn)制數(shù)的高5位是符號(hào)位,最后4位是溫度小數(shù)點(diǎn)位,中間7位是溫度整數(shù)位。表2-2是一部分溫度值對(duì)應(yīng)的二進(jìn)制溫度數(shù)據(jù)。表2-2 DS18B20輸出的溫度值溫度值二進(jìn)制輸出十六進(jìn)制輸出+1250000 0111 1101 000007D0h+850000 0101 0101 00000550h+25.06250000 0001 1001 0001

13、0191h+10.1250000 0000 1010 001000A2h+0.50000 0000 0000 10000008h00000 0000 0000 00000000h-0.51111 1111 1111 1000FFF8h-10.1251111 1111 0101 1110FF5Eh-25.06251111 1110 0110 1111FF6Fh-551111 1100 1001 0000FC90hDS18B20完成溫度轉(zhuǎn)換后,就把測(cè)得的溫度值與RAM中的TH、TL字節(jié)內(nèi)容作比較。若TTH或TTL,則將該器件內(nèi)的報(bào)警標(biāo)志位置位,并對(duì)主機(jī)發(fā)出的報(bào)警搜索命令作出響應(yīng)。因此,可用多只DS

14、18B20同時(shí)測(cè)量溫度并進(jìn)行報(bào)警搜索。在64位ROM的最高有效字節(jié)中存儲(chǔ)有循環(huán)冗余檢驗(yàn)碼(CRC)。主機(jī)ROM的前56位來(lái)計(jì)算CRC值,并和存入DS18B20的CRC值作比較,以判斷主機(jī)收到的ROM數(shù)據(jù)是否正確。4.調(diào)節(jié)模塊介紹調(diào)節(jié)模塊是由四個(gè)按鍵接地后直接接單片機(jī)的I/O口完成的。當(dāng)按鍵沒有按下時(shí)單片機(jī)管腳相當(dāng)于懸空,默認(rèn)下為高電平,當(dāng)按鍵按下時(shí)相當(dāng)于把單片機(jī)的管腳直接接地,此時(shí)為低電平。程序設(shè)計(jì)為低電平觸發(fā)。5.報(bào)警模塊介紹報(bào)警模塊是由一個(gè)PNP型的三極管9012驅(qū)動(dòng)的5V蜂鳴器,和一個(gè)加一限流電阻的發(fā)光二極管組成的。報(bào)警時(shí)蜂鳴器間歇性報(bào)警,發(fā)光二極管閃爍。2.2 系統(tǒng)硬件設(shè)計(jì)2.2.1

15、單片機(jī)電路設(shè)計(jì)圖2-4 單片機(jī)最小系統(tǒng)原理圖單片機(jī)最小系統(tǒng)是由晶振電路,上電復(fù)位、按鍵復(fù)位電路,ISP下載接口和電源指示燈組成。原理圖如圖2-4所示。2.2.2 DS18B20溫度傳感器電路設(shè)計(jì)DS18B20溫度傳感器是單總線器件與單片機(jī)的接口電路采用電源供電方。電源供電方式如圖2-7,此時(shí)DS18B20的1腳接地,2腳作為信號(hào)線,3腳接電源。圖2-7 DS18B20電源供電方式當(dāng)DS18B20處于寫存儲(chǔ)器操作和溫度A/D轉(zhuǎn)換操作時(shí),總線上必須有強(qiáng)的上拉,上拉開啟時(shí)間最大為10us。采用寄生電源供電方式時(shí)VDD端接地。由于單線制只有一根線,因此發(fā)送接口必須是三態(tài)的。2.2.3 顯示電路設(shè)計(jì)顯示

16、電路是由四位一體的共陰數(shù)碼管進(jìn)行顯示的,數(shù)碼管由三極管9013驅(qū)動(dòng)。四位一體的共陰數(shù)碼管的管腳分布圖如圖2-5所示。圖2-5 四位一體的共陰數(shù)碼管管腳分布圖顯示電路的總體設(shè)計(jì)如圖2-6所示。圖2-6 顯示電路2.2.4 按鍵電路設(shè)計(jì)按鍵電路是用來(lái)實(shí)現(xiàn)調(diào)節(jié)設(shè)定報(bào)警溫度的上下限和查看上下報(bào)警溫度的功能。電路原理圖如圖2-10所示。圖2-10 按鍵電路原理圖2.2.5 報(bào)警電路設(shè)計(jì)報(bào)警電路是在測(cè)量溫度大于上限或小于下限時(shí)提供報(bào)警功能的電路。該電路是由一個(gè)蜂鳴器和一個(gè)紅色的發(fā)光二極管組成,具體的電路如圖2-9所示。圖2-9 報(bào)警電路原理圖3 軟件設(shè)計(jì)3.1 DS18B20程序設(shè)計(jì)3.1.1 DS18B

17、20傳感器操作流程根據(jù)DS18B20的通訊協(xié)議,主機(jī)(單片機(jī))控制DS18B20完成溫度轉(zhuǎn)換必須經(jīng)過三個(gè)步驟: 每一次讀寫之前都要對(duì)DS18B20進(jìn)行復(fù)位操作 復(fù)位成功后發(fā)送一條ROM指令 最后發(fā)送RAM指令這樣才能對(duì)DS18B20進(jìn)行預(yù)定的操作。復(fù)位要求主CPU將數(shù)據(jù)線下拉500s,然后釋放,當(dāng)DS18B20收到信號(hào)后等待1660s左右,后發(fā)出60240s的存在低脈沖,主CPU收到此信號(hào)表示復(fù)位成功。DS18B20的操作流程如圖3-1所示。如圖3-1 DS18B20的操作流程3.1.2 DS18B20傳感器的指令表DS18B20傳感器的操作指令如表3-1所示。傳感器復(fù)位后向傳感器寫相應(yīng)的命令

18、才能實(shí)現(xiàn)相應(yīng)的功能。表3-1 DS18B20的指令表指 令指令代碼功 能讀ROM0x33讀DS1820溫度傳感器ROM中的編碼(即64位地址)符合 ROM0x55發(fā)出此命令之后,接著發(fā)出 64 位 ROM 編碼,訪問單總線上與該編碼相對(duì)應(yīng)的 DS1820 使之作出響應(yīng),為下一步對(duì)該 DS1820 的讀寫作準(zhǔn)備。搜索 ROM0xF0用于確定掛接在同一總線上 DS1820 的個(gè)數(shù)和識(shí)別 64 位 ROM 地址。為操作各器件作好準(zhǔn)備。跳過 ROM0xCC忽略 64 位 ROM 地址,直接向 DS1820 發(fā)溫度變換命令。適用于單片工作。告警搜索命令0xEC執(zhí)行后只有溫度超過設(shè)定值上限或下限的片子才做

19、出響應(yīng)。溫度變換0x44啟動(dòng)DS1820進(jìn)行溫度轉(zhuǎn)換,12位轉(zhuǎn)換時(shí)最長(zhǎng)為750ms(9位為93.75ms)。結(jié)果存入內(nèi)部9字節(jié)RAM中。讀暫存器0xBE讀內(nèi)部RAM中9字節(jié)的內(nèi)容寫暫存器0x4E發(fā)出向內(nèi)部RAM的3、4字節(jié)寫上、下限溫度數(shù)據(jù)命令,緊跟該命令之后,是傳送兩字節(jié)的數(shù)據(jù)。復(fù)制暫存器0x48將RAM中第3 、4字節(jié)的內(nèi)容復(fù)制到EEPROM中。重調(diào) EEPROM0xB8將EEPROM中內(nèi)容恢復(fù)到RAM中的第3 、4字節(jié)。讀供電方式0xB4讀DS1820的供電模式。寄生供電時(shí)DS1820發(fā)送“ 0 ”,外接電源供電 DS1820發(fā)送“ 1 ”。3.1.3 DS18B20傳感器的初始化時(shí)序D

20、S18B20傳感器為單總線結(jié)構(gòu)器件,在讀寫操作之前,傳感器芯片應(yīng)先進(jìn)性復(fù)位操作也就是初始化操作。DS18B20的初始化時(shí)序如圖3-2所示。首先控制器拉高數(shù)據(jù)總線,接著控制器給數(shù)據(jù)總線一低電平,延時(shí)480s,控制器拉高數(shù)據(jù)總線,等待傳感器給數(shù)據(jù)線一個(gè)60-240s的低電平,接著上拉電阻將數(shù)據(jù)線拉高,這樣才初始化完成。圖3-2 DS18B20初始化時(shí)序3.1.4 DS18B20傳感器的讀寫時(shí)序 1.寫時(shí)序DS18B20傳感器的讀寫操作是在傳感器初始化后進(jìn)行的。每次操作只能讀寫一位。當(dāng)主機(jī)把數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫時(shí)序。有兩種類型的寫時(shí)序:寫“0”時(shí)序,寫“1”時(shí)序。所有的時(shí)序必須有最短60

21、s的持續(xù)期,在各個(gè)寫周期之間必須有最短1s的恢復(fù)期。在數(shù)據(jù)總線由高電平變?yōu)榈碗娖街?,DS18B20在15s至60s的時(shí)間間隙對(duì)總線采樣,如果為“1”則向DS18B20寫“1”, 如果為“0”則向DS18B20寫“0”。如圖3-2的上半部分。對(duì)于主機(jī)產(chǎn)生寫“1”時(shí)序時(shí),數(shù)據(jù)線必須先被拉至低電平,然后被釋放,使數(shù)據(jù)線在寫時(shí)序開始之后15s內(nèi)拉至高電平。對(duì)于主機(jī)產(chǎn)生寫“1”時(shí)序時(shí),數(shù)據(jù)線必須先被拉至低電平,且至少保持低電平60s。2.讀時(shí)序在數(shù)據(jù)總線由高電平變?yōu)榈碗娖街?,?shù)據(jù)線至少應(yīng)保持低電平1s,來(lái)自DS18B20的輸出的數(shù)據(jù)在下降沿15s后有效,所以在數(shù)據(jù)線保持低電平1s之后,主機(jī)將數(shù)據(jù)線拉

22、高,等待來(lái)自DS18B20的數(shù)據(jù)變化,在下降沿15s之后便可開始讀取DS18B20的輸出數(shù)據(jù)。整個(gè)讀時(shí)序必須有最短60s的持續(xù)期。如圖3-2的下半部分。讀時(shí)序結(jié)束后數(shù)據(jù)線由上拉電阻拉至高電平。圖3-3 DS18B20傳感器的讀寫時(shí)序3.1.5 DS18B20獲取溫度程序流程圖DS18B20的讀字節(jié),寫字節(jié),獲取溫度的程序流程圖如圖3-3所示。圖3-4 DS18B20程序流程圖3.2 顯示程序設(shè)計(jì)顯示電路是由四位一體的數(shù)碼管來(lái)實(shí)現(xiàn)的。由于單片機(jī)的I/O口有限,所以數(shù)碼管采用動(dòng)態(tài)掃描的方式來(lái)進(jìn)行顯示。程序流程圖如圖3-4所示。圖3-5 顯示程序流程圖3.3 按鍵程序設(shè)計(jì)按鍵是用來(lái)設(shè)定上下限報(bào)警溫度

23、的。具體的程序流程圖如圖3-5所示。圖3-6 按鍵程序流程圖4實(shí)物制作及調(diào)試制作好的實(shí)物如圖4-1所示。圖4-1 數(shù)字溫度計(jì)實(shí)物正面圖在做實(shí)物時(shí)出現(xiàn)了不少問題。比如本來(lái)是采用NPN型9013驅(qū)動(dòng)蜂鳴器,但是在實(shí)際調(diào)試中蜂鳴器驅(qū)動(dòng)不了,經(jīng)多次試驗(yàn),在三極管的基極電阻與單片機(jī)的接口處接一個(gè)1、2k的上拉電阻就能驅(qū)動(dòng)了。但考慮到單片機(jī)的I/O口默認(rèn)狀態(tài)時(shí)為高電平,這樣一上電蜂鳴器就會(huì)響,所以將NPN型9013換成了PNP型的9012三極管,效果還不錯(cuò)。5電子綜合設(shè)計(jì)體會(huì)經(jīng)過將近一個(gè)月的設(shè)計(jì)、焊接、編程、調(diào)試,我們終于完成了數(shù)字溫度計(jì)的設(shè)計(jì),基本能夠達(dá)到設(shè)計(jì)要求,而且還設(shè)計(jì)了一些其他功能,比可以開啟或

24、消除按鍵音功能,開機(jī)動(dòng)畫功能,查看報(bào)警上下限溫度功能。此次的設(shè)計(jì)使我從中學(xué)到了一些很重要的東西,那就是如何從理論到實(shí)踐的轉(zhuǎn)化,怎樣將我們所學(xué)到的知識(shí)運(yùn)用到實(shí)踐中去。在大學(xué)課堂的學(xué)習(xí)只是給我們灌輸專業(yè)知識(shí),而我們應(yīng)把所學(xué)的知識(shí)應(yīng)用到我們現(xiàn)實(shí)的生活中去。這次的設(shè)計(jì)不僅使我們將課堂上學(xué)到的理論知識(shí)與實(shí)際應(yīng)用結(jié)合了起來(lái),而且使我們對(duì)電子電路、電子元器件、印制電路板等方面的知識(shí)有了更進(jìn)一步的認(rèn)識(shí),同時(shí)在軟件編程、焊板調(diào)試、相關(guān)調(diào)試儀器的使用等方面得到較全面的鍛煉和提高,為今后能夠獨(dú)立進(jìn)行某些單片機(jī)應(yīng)用系統(tǒng)的開發(fā)設(shè)計(jì)工作打下一定的基礎(chǔ)。此次單片機(jī)設(shè)計(jì)也為我們以后進(jìn)行更復(fù)雜的單片機(jī)系統(tǒng)設(shè)計(jì)提供了寶貴的經(jīng)驗(yàn)。

25、在本次設(shè)計(jì)的過程中,我們遇到不少的問題,剛開始焊好的板子下不進(jìn)去程序,經(jīng)過一再仔細(xì)的檢查,才發(fā)現(xiàn)是在下載口處出了問題,由于焊盤口比較小,排針插不進(jìn)去,最后使了很大力氣才插進(jìn)去,插進(jìn)去后才發(fā)現(xiàn)壞了,結(jié)果在去排針的時(shí)候把焊盤給去下來(lái)了,最后只能在旁邊將下載口引了出來(lái)。還有就是文章中提到的蜂鳴器驅(qū)動(dòng)問題等等。經(jīng)過此次的硬件制作與調(diào)試,鍛煉了我們的動(dòng)手實(shí)踐能了。本次設(shè)計(jì)的另一個(gè)重點(diǎn)就是軟件程序的設(shè)計(jì),其中需要有很巧妙的程序算法,雖然以前寫過幾次程序,但我覺的寫好一個(gè)程序并不是一件簡(jiǎn)單的事,有好多的東西,只有我們?nèi)ピ囍隽?,才能真正的掌握,只學(xué)習(xí)理論,有些東西是很難理解的,更談不上掌握。通過此次的綜合設(shè)

26、計(jì),我們初步掌握了單片機(jī)系統(tǒng)設(shè)計(jì)的基本原理。充分認(rèn)識(shí)到理論學(xué)習(xí)與實(shí)踐相結(jié)合的重要性,對(duì)于書本上的很多知識(shí),不但要學(xué)會(huì),更重要的是會(huì)運(yùn)用到實(shí)踐中去。在以后的學(xué)習(xí)中,我們會(huì)更加注重實(shí)踐方面的鍛煉,多提高自己的動(dòng)手實(shí)踐能力。參考文獻(xiàn)1 譚浩強(qiáng).C程序設(shè)計(jì)(第三版).北京:清華大學(xué)出版社,2005.7 2 余發(fā)山,王福忠.單片機(jī)原理與應(yīng)用技術(shù).徐州:中國(guó)礦業(yè)大學(xué)出版社,2008.6 3 求是科技.單片機(jī)典型模塊設(shè)計(jì)實(shí)例導(dǎo)航.北京:人民郵電出版社,2005.5 4 求是科技.8051系列單片機(jī)C程序設(shè)計(jì)完全手冊(cè).北京:人民郵電出版社,2006.4 5 于永,戴佳,劉波.51單片機(jī)C語(yǔ)言常用模塊與綜合系統(tǒng)

27、設(shè)計(jì)實(shí)例精講(第2版).北京:電子工業(yè)出版社,2008.10 附1 源程序代碼/* 程序名; 基于DS18B20的測(cè)溫系統(tǒng)* 功 能: 實(shí)時(shí)測(cè)量溫度,超過上下限報(bào)警,報(bào)警溫度可手動(dòng)調(diào)整。K1是用來(lái)* 進(jìn)入上下限調(diào)節(jié)模式的,當(dāng)按一下K1進(jìn)入上限調(diào)節(jié)模式,再按一下進(jìn)入下限* 調(diào)節(jié)模式。在正常模式下,按一下K2進(jìn)入查看上限溫度模式,顯示1s左右自動(dòng)* 退出;按一下K3進(jìn)入查看下限溫度模式,顯示1s左右自動(dòng)退出;按一下K4消除* 按鍵音,再按一下啟動(dòng)按鍵音。在調(diào)節(jié)上下限溫度模式下,K2是實(shí)現(xiàn)加1功能,* K1是實(shí)現(xiàn)減1功能,K3是用來(lái)設(shè)定上下限溫度正負(fù)的。 * 編程者:zicreate* 編程時(shí)間:2

28、009/10/2 */#include<AT89X52.h> /將AT89X52.h頭文件包含到主程序#include<intrins.h> /將intrins.h頭文件包含到主程序(調(diào)用其中的_nop_()空操作函數(shù)延時(shí))#define uint unsigned int /變量類型宏定義,用uint表示無(wú)符號(hào)整形(16位)#define uchar unsigned char /變量類型宏定義,用uchar表示無(wú)符號(hào)字符型(8位)uchar max=0x00,min=0x00; /max是上限報(bào)警溫度,min是下限報(bào)警溫度bit s=0; /s是調(diào)整上下限溫度時(shí)溫度

29、閃爍的標(biāo)志位,s=0不顯示200ms,s=1顯示1s左右bit s1=0; /s1標(biāo)志位用于上下限查看時(shí)的顯示void display1(uint z); /聲明display1()函數(shù)#include"ds18b20.h" /將ds18b20.h頭文件包含到主程序#include"keyscan.h" /將keyscan.h頭文件包含到主程序#include"display.h" /將display.h頭文件包含到主程序/*主函數(shù)*/void main() beer=1; /關(guān)閉蜂鳴器 led=1; /關(guān)閉LED燈 timer1_i

30、nit(0); /初始化定時(shí)器1(未啟動(dòng)定時(shí)器1) get_temperature(1); /首次啟動(dòng)DS18B20獲取溫度(DS18B20上點(diǎn)后自動(dòng)將EEPROM中的上下限溫度復(fù)制到TH和TL寄存器) while(1) /主循環(huán) keyscan(); /按鍵掃面函數(shù) get_temperature(0); /獲取溫度函數(shù) keyscan(); /按鍵掃面函數(shù) display(temp,temp_d*0.625);/顯示函數(shù) alarm(); /報(bào)警函數(shù) keyscan(); /按鍵掃面函數(shù) /* 程序名; _ds18b20_h_* 功 能: DS18B20的c51編程頭文件 * 編程者:zi

31、create* 編程時(shí)間:2009/10/2 * 說(shuō) 明:用到的全局變量是:無(wú)符號(hào)字符型變量temp(測(cè)得的溫度整數(shù)部分),temp_d * (測(cè)得的溫度小數(shù)部分),標(biāo)志位f(測(cè)量溫度的標(biāo)志位0表示“正溫度”1表* 示“負(fù)溫度”),標(biāo)志位f_max(上限溫度的標(biāo)志位0表示“正溫度”、1表* 示“負(fù)溫度”),標(biāo)志位f_min(下限溫度的標(biāo)志位0表示“正溫度”、1表* 示“負(fù)溫度”),標(biāo)志位w(報(bào)警標(biāo)志位1啟動(dòng)報(bào)警0關(guān)閉報(bào)警)。 */#ifndef _ds18b20_h_/定義頭文件#define _ds18b20_h_#define uint unsigned int /變量類型宏定義,用uin

32、t表示無(wú)符號(hào)整形(16位)#define uchar unsigned char /變量類型宏定義,用uchar表示無(wú)符號(hào)字符型(8位)sbit DQ= P23; /可位尋址變量定義,用DQ表示P2.3口sbit beer=P10; /用beer表示P1.0sbit led=P11; /用led表示P1.1uchar temp=0; /測(cè)量溫度的整數(shù)部分uchar temp_d=0; /測(cè)量溫度的小數(shù)部bit f=0; /測(cè)量溫度的標(biāo)志位,0表示“正溫度”1表示“負(fù)溫度”)bit f_max=0; /上限溫度的標(biāo)志位0表示“正溫度”1表示“負(fù)溫度”)bit f_min=0; /下限溫度的標(biāo)志位

33、0表示“正溫度”、1表示“負(fù)溫度”)bit w=0;/報(bào)警標(biāo)志位1啟動(dòng)報(bào)警0關(guān)閉報(bào)警)/*延時(shí)子函數(shù)*/void ds18b20_delayus(uint t) /延時(shí)幾s while(t-);void ds18b20_delayms(uint t) /延時(shí)1ms左右 uint i,j; for(i=t;i>0;i-) for(j=120;j>0;j-);/*ds18b20初始化函數(shù)*/void ds18b20_init() / DS18B20初始化 DQ=1; /拉高數(shù)據(jù)線DQ=0; /控制器向DS18B20發(fā)低電平脈沖ds18b20_delayus(30); /延時(shí)480s左右

34、DQ=1; /控制器拉高總線,while(DQ); /等待DS18B20拉低總線ds18b20_delayus(20); /延時(shí),等待上拉電阻拉高總線DQ=1; /拉高數(shù)據(jù)線,準(zhǔn)備數(shù)據(jù)傳輸;/*ds18b20字節(jié)讀函數(shù)*/uchar ds18b20_read() /DS18B20 字節(jié)讀取uchar i;/定義一個(gè)局部變量i(局部變量只在本函數(shù)中有效)uchar d = 0; /定義一個(gè)局部變量dDQ = 1; /準(zhǔn)備讀;for(i=8;i>0;i-) /一位一位的讀,循環(huán)8次 d >>= 1; /d左移一位,低位先發(fā);DQ = 0;_nop_();_nop_();_nop_

35、();DQ = 1; /必須寫1,否則讀出來(lái)的將是不預(yù)期的數(shù)據(jù);if(DQ) /在12us處讀取數(shù)據(jù),送給d的最高位d |= 0x80;ds18b20_delayus(10); return d; /返回讀取的值/*ds18b20字節(jié)寫函數(shù)*/void ds18b20_write(uchar d) / ds18b20字節(jié)寫 uchar i; for(i=8;i>0;i-) /一位一位的寫 DQ=0; _nop_(); _nop_();_nop_(); DQ=d&0x01;/寫數(shù)據(jù) ds18b20_delayus(5); DQ=1;d >>= 1; /*獲取溫度函數(shù)*/

36、 void get_temperature(bit f)uchar a=0,b=0,c=0,d=0; uint i;ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc);/向DS18B20發(fā)跳過讀ROM命令ds18b20_write(0x44);/寫啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換命令,轉(zhuǎn)換結(jié)果存入內(nèi)部RAMif(f=1) /首次啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換需要500ms,若轉(zhuǎn)換時(shí)間不夠就出錯(cuò),讀出的是85度的錯(cuò)誤值。 display1(1);/用開機(jī)動(dòng)畫耗時(shí)elseds18b20_delayms(1);ds18b20_init(); /DS18B20初

37、始化ds18b20_write(0xcc); /向DS18B20發(fā)跳過讀ROM命令ds18b20_write(0xbe);/寫讀內(nèi)部RAM中9字節(jié)的內(nèi)容命令a=ds18b20_read();/讀內(nèi)部RAM (LSB)b=ds18b20_read();/讀內(nèi)部RAM (MSB)if(f=1)/局部位變量f=1時(shí)讀上下線報(bào)警溫度 max=ds18b20_read(); /讀內(nèi)部RAM (TH) min=ds18b20_read(); /讀內(nèi)部RAM (Tl)if(max&0x80)=0x80) /若讀取的上限溫度的最高位(符號(hào)位)為1表明是負(fù)溫度f(wàn)_max=1;max=(max-0x80)

38、; /將上限溫度符號(hào)標(biāo)志位置1表示負(fù)溫度,將上限溫度裝換成無(wú)符號(hào)數(shù)。 if(min&0x80)=0x80)/若讀取的下限溫度的最高位(符號(hào)位)為1表明是負(fù)溫度f(wàn)_min=1;min=(min-0x80);/將下限溫度符號(hào)標(biāo)志位置1表示負(fù)溫度,將下限溫度裝換成無(wú)符號(hào)數(shù)。i=b;i>>=4;if (i=0) f=0; /i為0,表示讀取的溫度是正溫度,設(shè)立正溫度標(biāo)記 temp=(a>>4)|(b<<4);/整數(shù)部分 a=(a&0x0f); temp_d=a;/小數(shù)部分else f=1; /i為1,表示讀取的溫度是負(fù)溫度,設(shè)立負(fù)溫度標(biāo)記 a=a+1

39、;/負(fù)數(shù)的小數(shù)部分取反加1 b=b;/負(fù)數(shù)的整數(shù)部分取反 temp=(a>>4)|(b<<4);/整數(shù)部分 a=(a&0x0f);/小數(shù)部分 temp_d=a; /*存儲(chǔ)極限溫度函數(shù)*/ void store_t() if(f_max=1) /若上限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號(hào)數(shù)(最高1是負(fù),0是正)max=max+0x80;if(f_min=1) /若下限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號(hào)數(shù)min=min+0x80; ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc); /向DS18B20發(fā)跳過讀ROM命令ds18b

40、20_write(0x4e);/向DS18B20發(fā)寫字節(jié)至?xí)捍嫫?和3(TH和TL)命令ds18b20_write(max); /向暫存器TH(上限溫度暫存器)寫溫度ds18b20_write(min); /向暫存器TL(下限溫度暫存器)寫溫度ds18b20_write(0xff); /向配置寄存器寫命令,進(jìn)行溫度值分辨率設(shè)置ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc); /向DS18B20發(fā)跳過讀ROM命令ds18b20_write(0x48); /向DS18B20發(fā)將RAM中2、3字節(jié)的內(nèi)容寫入EEPROM /DS18B20上電后會(huì)自動(dòng)將EE

41、PROM中的上下限溫度拷貝到TH、TL暫存器/*溫度超限報(bào)警函數(shù)*/ void alarm() /若上限值是正值 if(f_max=0) if(f_min=0) /若下限值是正值 if(f=0) /若測(cè)量值是正值 if(temp+temp_d*0.0625)<=min|(temp+temp_d*0.0625)>=max) w=1;TR1=1; /當(dāng)測(cè)量值小于最小值或大于最大值時(shí)報(bào)警 if(temp+temp_d*0.0625)<max&&(temp+temp_d*0.0625)>min) w=0; /當(dāng)測(cè)量值大于最小值且小于最大值時(shí)不報(bào)警 if(f=1)

42、w=1;TR1=1; /若測(cè)量值是負(fù)值時(shí)報(bào)警 if(f_min=1) /若下限值是負(fù)值 if(f=0) /若測(cè)量值是正值 if(temp+temp_d*0.0625)>=max)/當(dāng)測(cè)量值大于最大值時(shí)報(bào)警 w=1;TR1=1; if(temp+temp_d*0.0625)<max )/當(dāng)測(cè)量值小于最大值時(shí)不報(bào)警 w=0; if(f=1) /若測(cè)量值是負(fù)值 if(temp+temp_d*0.0625)>=min)/當(dāng)測(cè)量值大于最小值時(shí)報(bào)警 w=1;TR1=1; if(temp+temp_d*0.0625)<min)/當(dāng)測(cè)量值小于最小值時(shí)不報(bào)警 w=0; if(f_max=

43、1) /若下限值是負(fù)值 if(f_min=1) /若下限值是負(fù)值 if(f=1) /若測(cè)量值是負(fù)值 if(temp+temp_d*0.0625)<=max|(temp+temp_d*0.0625)>=min) w=1;TR1=1; /當(dāng)測(cè)量值小于最大值或大于最小值時(shí)報(bào)警 if(temp+temp_d*0.0625)<min&&(temp+temp_d*0.0625)>max) w=0; /當(dāng)測(cè)量值小于最小值且大于最大值時(shí)不報(bào)警 if(f=0)w=1;TR1=1; /若測(cè)量值是正值時(shí)報(bào)警 #endif/* 程序名; _keyscan_H_ * 功 能: d

44、s18b20鍵盤頭文件,通過鍵盤設(shè)定設(shè)定上下限報(bào)警溫度* 編程者:zicreate* 編程時(shí)間:2009/10/2 */#ifndef _keyscan_H_/定義頭文件#define _keyscan_H_sbit key1=P22; /可位尋址變量定義,用key1表示P2.2口sbit key2=P21; /用key2表示P2.1口sbit key3=P20;/用key3表示P2.0口sbit key4=P33;/用key4表示P3.3口uchar i=0; /定義全局變量i用于不同功能模式的選擇,0正常模式,1上限調(diào)節(jié)模式,2下限調(diào)節(jié)模式uchar a=0;/定義全局變量a用于不同模式下

45、數(shù)碼管顯示的選擇bit k4=0;/K4按鍵雙功能選擇位,k4=0時(shí)K4按鍵選擇消按鍵音的功能,k4=1時(shí)K4按鍵選擇正負(fù)溫度設(shè)定功能bit v=0;/K2、K3按鍵雙功能選擇位,v=0時(shí)選擇上下限查看功能,v=1時(shí)選擇上下限溫度加減功能bit v1=0;/v1=1時(shí)定時(shí)1250ms時(shí)間到自動(dòng)關(guān)閉報(bào)警上下限查看功能bit v2=0; /消按鍵音功能調(diào)整位,為0時(shí)開按鍵音,為1時(shí)關(guān)按鍵音/*讀鍵盤延時(shí)子函數(shù)*/void keyscan_delay(uint z)/延時(shí)1ms左右 uint i,j; for(i=z;i>0;i-)for(j=120;j>0;j-);/*溫度調(diào)節(jié)函數(shù)*/

46、int temp_change(int count,bit f)/上下限溫度調(diào)整 if(key2=0)/判斷K2是否按下if(v2=0)beer=0;/v2=0開按鍵音,否則消按鍵音keyscan_delay(10);/延時(shí)10msif(key2=0)/再次判斷K2是否按下(實(shí)現(xiàn)按按鍵時(shí)消抖) beer=1;/K2按下關(guān)按鍵音 if(f=0)/若溫度為正 count+;/每按一下K2溫度上調(diào)1 if(a=1)if(count>125) count=125;/當(dāng)溫度值大于125時(shí)不上調(diào) if(a=2)if(count>125) count=125; if(f!=0)/若溫度為負(fù) count+;/每按一下K2溫度下調(diào)1 if(a=1)if(count>55) count=55;/當(dāng)溫度值小于-55時(shí)不再下調(diào) if(a=2)if(count>55) count=55; while(key2=0);keyscan_delay(10); /K2松開按鍵時(shí)消抖if(key3=0) if(v2=0)beer=0; keyscan_delay(10);if(key3=0) /K3按按鍵時(shí)消抖 beer

溫馨提示

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

評(píng)論

0/150

提交評(píng)論