版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 電子畢業(yè)設(shè)計(jì)</b></p><p><b> 數(shù)</b></p><p><b> 字</b></p><p><b> 溫</b></p><p><b> 度</b></p>
2、<p><b> 計(jì)</b></p><p> 題目: 數(shù)顯溫度計(jì)</p><p> 學(xué)院: 電子信息學(xué)院</p><p><b> 班級(jí): </b></p><p><b> 學(xué)號(hào): </b></p><p>&
3、lt;b> 姓名: </b></p><p><b> 指導(dǎo)老師: </b></p><p><b> 日期:</b></p><p> 數(shù)字溫度計(jì)設(shè)計(jì)任務(wù)書</p><p><b> 課程設(shè)計(jì)目的</b></p><p&g
4、t; 加強(qiáng)學(xué)生理論聯(lián)系實(shí)際的能力,提高學(xué)生的動(dòng)手能力;</p><p> 學(xué)會(huì)基本電子元器件的識(shí)別和檢測(cè);</p><p> 學(xué)會(huì)應(yīng)用EDA軟件Proteus進(jìn)行電路的設(shè)計(jì)和仿真;</p><p> 基本掌握單片機(jī)的基本原理,并能將其應(yīng)用于系統(tǒng)的設(shè)計(jì)。</p><p> 通過實(shí)訓(xùn),提高學(xué)生的學(xué)習(xí)興趣,激發(fā)自主學(xué)習(xí)能力,培養(yǎng)創(chuàng)新意識(shí)。
5、</p><p><b> 設(shè)計(jì)任務(wù)</b></p><p> 先焊制一個(gè)單片機(jī)最小系統(tǒng),并以制作的單片機(jī)最小系統(tǒng)為核心,設(shè)計(jì)并制作一個(gè)數(shù)字式溫度計(jì)應(yīng)用系統(tǒng)。</p><p> 設(shè)計(jì)要求具有以下功能:</p><p> 采用DS18B20作為溫度傳感器進(jìn)行溫度檢測(cè);</p><p> 對(duì)
6、采集溫度進(jìn)行顯示(顯示溫度分辨率0.1℃);</p><p> 采集溫度數(shù)值應(yīng)采用數(shù)字濾波措施,保證顯示數(shù)據(jù)穩(wěn)定;</p><p> 顯示數(shù)據(jù),無數(shù)據(jù)位必須消隱。</p><p><b> 目錄</b></p><p> 數(shù)字溫度計(jì)設(shè)計(jì)任務(wù)書 ……………………………………………… 2</p><
7、;p><b> 設(shè)計(jì)思路</b></p><p> 設(shè)計(jì)原理 ………………………………………………………………… 4</p><p> 系統(tǒng)方案及總體設(shè)計(jì)框圖 ……………………………………………… 4</p><p> 數(shù)字溫度計(jì)應(yīng)用系統(tǒng)的硬件設(shè)計(jì)</p><p> 單片機(jī)小系統(tǒng)基本組成及硬件圖 <
8、/p><p> 外圍電路工作原理及系統(tǒng)硬件圖 </p><p><b> 主要芯片及其功能 </b></p><p><b> 系統(tǒng)軟件程序的設(shè)計(jì)</b></p><p><b> 軟件流程框圖 </b></p><p><b> 系統(tǒng)調(diào)
9、試</b></p><p><b> 仿真器介紹 </b></p><p><b> 調(diào)試結(jié)果及其分析</b></p><p> 系統(tǒng)設(shè)計(jì)電路的特點(diǎn)和方案的優(yōu)缺點(diǎn) </p><p><b> 課程設(shè)計(jì)心得體會(huì)</b></p><p>
10、<b> 參考文獻(xiàn)</b></p><p> 附錄 程序清單及注釋</p><p><b> 設(shè)計(jì)思路:</b></p><p> 設(shè)計(jì)方案及其總體設(shè)計(jì)框圖</p><p> 溫度計(jì)設(shè)計(jì)系統(tǒng)流程圖</p><p> 二、數(shù)字溫度計(jì)應(yīng)用系統(tǒng)的硬件設(shè)計(jì)</p&
11、gt;<p> 1、單片機(jī)小系統(tǒng)的基本組成及其選擇</p><p><b> ?。?)單片機(jī)</b></p><p><b> 單片機(jī)選型參考</b></p><p> ?、?AT89S51、AT89S52 :具備ISP下載功能 ,可以使用USBASP程序下載線或者并口下載 </p><
12、;p> ?、?STC89C51、STC89C52:使用串口線+MAX232燒寫程序。</p><p> ?、跘T89C51、AT89C52 :可以在最小系統(tǒng)板上使用,但需要另外用編程器燒寫程序 </p><p> 本次課程設(shè)計(jì)選用AT89S52型號(hào)單片機(jī)進(jìn)行操作。</p><p> AT89S52引腳圖 </p&
13、gt;<p> 此外,AT89S52設(shè)計(jì)和配置了振蕩頻率可為0Hz并可通過軟件設(shè)置省電模式??臻e模式下,CPU暫停工作,而RAM定時(shí)計(jì)數(shù)器,串行口,外中斷 系統(tǒng)可繼續(xù)工作,掉電模式凍結(jié)振蕩器而保存RAM的數(shù)據(jù),停止芯片其它功能直至外中斷激活或硬件復(fù)位。同時(shí)該芯片還具有PDIP、TQFP和PLCC等三 種封裝形式,以適應(yīng)不同產(chǎn)品的需求。</p><p><b> 電源</b>
14、</p><p> ?、匐娫催m配器供電:DC座(三個(gè)管腳)</p><p><b> ?、趗sb供電:</b></p><p><b> 3、時(shí)鐘</b></p><p><b> 4、I/O口&接口</b></p><p> ?、?所有I/
15、O用排針引出</p><p> ?、?串行通信口:P3.0,p3.1</p><p> ?、?ISP:p1.6,p1.7</p><p> 2、外圍電路工作原理及系統(tǒng)硬件圖</p><p> 3、主要芯片及其功能</p><p><b> ①AT89S52</b></p>&l
16、t;p> ?。?)AT89S52各引腳及I/O口介紹</p><p> P0口也可用做訪問片外數(shù)據(jù)存儲(chǔ)器和程序存儲(chǔ)器時(shí)的低8位地址/數(shù)據(jù)總線的復(fù)用口。這種情況下,P0口內(nèi)含上拉電阻。</p><p> 在Flash編程時(shí),P0口輸入代碼數(shù)據(jù);在Flash校驗(yàn)時(shí),P0口輸出代碼數(shù)據(jù)。在進(jìn)行編程校驗(yàn)時(shí),需外接10KΩ的上拉電阻。</p><p> ●P1口—
17、—8位、雙向I/O口,內(nèi)含上拉電阻。</p><p> P1口為用戶使用的通用I/O口,每個(gè)引腳可驅(qū)動(dòng)4個(gè)TTL負(fù)載。當(dāng)用做輸入時(shí),每個(gè)端口首先置1。</p><p> P1.0和P1.1引腳也用做定時(shí)器2的外部計(jì)數(shù)輸入(P1.0/T2)和觸發(fā)器輸入(P1.1/T2DX)。</p><p> 在編程和校驗(yàn)期間,P1口可輸入低字節(jié)地址。</p>&
18、lt;p> ● P2口——8位、雙向I/O口,內(nèi)部具有上拉電阻。</p><p> P2口可用做通用I/O,可以驅(qū)動(dòng)4個(gè)TTL負(fù)載。對(duì)P2口各位寫入1,可作為輸入。每個(gè)引腳由外部負(fù)載拉為低電平時(shí),經(jīng)由內(nèi)部上拉電阻向外輸出電流。</p><p> 在訪問16位地址的外部程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器時(shí),P2口提供高8位地址。用MOVX @DPTR類指令訪問外部數(shù)據(jù)存儲(chǔ)器時(shí),P2口為高8位
19、地址(即PCH);用MOVX @R0和MOVX @R1類指令訪問外部數(shù)據(jù)存儲(chǔ)器時(shí),P2口上的內(nèi)容是SFR P2的內(nèi)容。</p><p> 在編程和校驗(yàn)時(shí),P2口接收地址線的高位和一些控制信號(hào)。</p><p> P3口——8位、雙向I/O口,內(nèi)部含有上拉電阻。</p><p> ● P3口可用做通用I/O口,可驅(qū)動(dòng)4個(gè)TTL負(fù)載。當(dāng)用做輸入熟,要先將P3口各位
20、置如外部負(fù)載將P3口拉低,則經(jīng)過上拉電阻向外輸出電流。</p><p> 在編程和校驗(yàn)時(shí),P3口接收某些控制信號(hào)。</p><p> ● ——地址鎖存允許/編程脈沖輸入。</p><p> ● ——外部程序存儲(chǔ)器讀選通,低電平有效。</p><p> ● ——片外程序存儲(chǔ)器訪問允許。</p><p>
21、● XTAL1和XTAL2——XTAL1是片內(nèi)振蕩器反相放大器和時(shí)鐘發(fā)生器的輸入端,XTAL2是片內(nèi)振蕩器反相放大器的輸出端。</p><p> ?。?)AT89S52實(shí)物與仿真的區(qū)別</p><p><b> ?、贒S18B20</b></p><p> DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳感器
22、,與傳統(tǒng)的熱敏電阻等測(cè)溫元件相比,它能直接讀出被測(cè)溫度,并且可根據(jù)實(shí)際要求通過簡單的編程實(shí)現(xiàn)9-12位的數(shù)字值讀數(shù)方式。DS18B20的性能特點(diǎn)如下:</p><p> ?。?)獨(dú)特的單線接口僅需要一個(gè)端口引腳進(jìn)行通信,DS18B20在與微處理器連接時(shí)僅需要一條口線即可實(shí)現(xiàn)微處理器與DS18B20的雙向通訊。</p><p> ?。?)DS18B20支持多點(diǎn)組網(wǎng)功能,多個(gè)DS18B20可以
23、并聯(lián)在惟一的三線上,實(shí)現(xiàn)多點(diǎn)組網(wǎng)測(cè)溫;</p><p> ?。?)無須外部器件,全部傳感元件及轉(zhuǎn)換電路集成在形如一只三極管的集成電路內(nèi);</p><p> ?。?)可通過數(shù)據(jù)線供電,電壓范圍為3.0-5.5V;</p><p><b> ?。?)零待機(jī)功耗;</b></p><p> ?。?)溫度以9或12位數(shù)字,對(duì)應(yīng)的
24、可分辨溫度分別為0.5℃、0.25℃、0.125℃和0.0625℃,可實(shí)現(xiàn)高精度測(cè)溫;</p><p> ?。?)用戶可定義報(bào)警設(shè)置;</p><p> ?。?)報(bào)警搜索命令識(shí)別并標(biāo)志超過程序限定溫度(溫度報(bào)警條件)的器件;</p><p> ?。?)負(fù)電壓特性,電源極性接反時(shí),溫度計(jì)不會(huì)因發(fā)熱而燒毀,但不能正常工作;</p><p> ?。?/p>
25、10)測(cè)量結(jié)果直接輸出數(shù)字溫度信號(hào),以"一線總線"串行傳送給CPU,同時(shí)可傳送CRC校驗(yàn)碼,具有極強(qiáng)的抗干擾糾錯(cuò)能力</p><p> DS18B20采用3腳PR35封裝或8腳SOIC封裝,其引腳排列及內(nèi)部結(jié)構(gòu)框圖如圖及測(cè)溫原理圖如下所示:</p><p> ?、?602液晶顯示屏</p><p> 1602液晶顯示流程圖:</p>
26、;<p> 三、系統(tǒng)軟件程序的設(shè)計(jì)(見附錄):</p><p><b> 軟件流程框圖:</b></p><p><b> 四、系統(tǒng)調(diào)試:</b></p><p><b> 1、仿真器的介紹:</b></p><p> ?、?keil軟件的開發(fā)運(yùn)用<
27、/p><p> ?。?)Keil C51單片機(jī)軟件開發(fā)系統(tǒng)的整體結(jié)構(gòu) </p><p> C51工具包的整體結(jié)構(gòu),uVision與Ishell分別是C51 for Windows和for Dos的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個(gè)開發(fā)流程。開發(fā)人員可用IDE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及C51編譯器編譯生成目標(biāo)文件(.OBJ)。目標(biāo)文件
28、可由LIB51創(chuàng)建生成庫文件,也可以與庫文件一起經(jīng)L51連接定位生成絕對(duì)目標(biāo)文件(.ABS)。ABS文件由OH51轉(zhuǎn)換成標(biāo)準(zhǔn)的Hex文件,以供調(diào)試器dScope51或tScope51使用進(jìn)行源代碼級(jí)調(diào)試,也可由仿真器使用直接對(duì)目標(biāo)板進(jìn)行調(diào)試,也可以直接寫入程序存貯器如EPROM中。</p><p> ?。?)使用獨(dú)立的Keil仿真器時(shí),注意事項(xiàng) </p><p> 仿真器標(biāo)配11.059
29、2MHz的晶振,但用戶可以在仿真器上的晶振插孔中換插其他頻率的晶振。 </p><p> 仿真器上的復(fù)位按鈕只復(fù)位仿真芯片,不復(fù)位目標(biāo)系統(tǒng)。 </p><p> 仿真芯片的31腳(/EA)已接至高電平,所以仿真時(shí)只能使用片內(nèi)ROM,不能使用片外ROM;但仿真器外引插針中的31腳并不與仿真芯片的31腳相連,故該仿真器仍可插入到擴(kuò)展有外部ROM(其CPU的/EA引腳接至低電平)的目標(biāo)系統(tǒng)中
30、使用。 </p><p> ?、趐roteus軟件的開發(fā)運(yùn)用</p><p> (1) Protues 軟件介紹</p><p> Proteus 是目前最好的模擬單片機(jī)外圍器件的工具,它可以仿真51系列、AVR,PIC 等常用的MCU 及其外圍電路。本文基于Proteus 6.9 和Keil uVision3 軟件。Proteus 與其它單片機(jī)仿真軟件不同的是
31、,它不僅能仿真單片機(jī)CPU 的工作情況,也能仿真單片機(jī)外圍電路或沒有單片機(jī)參與的其它電路的工作情況。因此在仿真和程序調(diào)試時(shí),關(guān)心的不再是某些語句執(zhí)行時(shí)單片機(jī)寄存器和存儲(chǔ)器內(nèi)容的改變,而是從工程的角度直接看程序運(yùn)行和電路工作的過程和結(jié)果。對(duì)于這樣的仿真實(shí)驗(yàn),從某種意義上講,是彌補(bǔ)了實(shí)驗(yàn)和工程應(yīng)用間脫節(jié)的矛盾和現(xiàn)象。</p><p> ?。?) proteus 的工作過程</p><p>
32、運(yùn)行proteus 的ISIS 程序后,進(jìn)入該仿真軟件的主界面。在工作前,要設(shè)</p><p> 置view 菜單下的捕捉對(duì)齊和system 下的顏色、圖形界面大小等項(xiàng)目。通過工</p><p> 具欄中的p 命令,在pick devices 窗口中選擇電路所需的元件,放置元件并調(diào)</p><p> 整其相對(duì)位置,元件參數(shù)設(shè)置,元器件間連線,編寫程序;在sou
33、rce 菜單的</p><p> Define code generation tools 菜單命令下,選擇程序編譯的工具、路徑、擴(kuò)展名等項(xiàng)目;在source 菜單的Add/removesource files 命令下,加入單片機(jī)硬件電路的對(duì)應(yīng)程序;通過debug 菜單的相應(yīng)命令仿真程序和電路的運(yùn)行情況。</p><p> Proteus 軟件提供了30 多個(gè)元件庫,數(shù)千種元件。元件涉
34、及數(shù)字和模擬、交流和直流等。</p><p><b> 2、系統(tǒng)整體調(diào)試</b></p><p><b> ①調(diào)試結(jié)果</b></p><p><b> ?、诮Y(jié)果分析</b></p><p> 在運(yùn)行仿真結(jié)果時(shí)通過改變溫度傳感器DS18B20的溫度,然后調(diào)用各種子函數(shù),可
35、以改變液晶顯示1602的第二行顯示數(shù)據(jù),說明程序編寫正確。</p><p> ?、巯到y(tǒng)設(shè)計(jì)電路的特點(diǎn)和方案的優(yōu)缺點(diǎn)</p><p> 我們組設(shè)計(jì)的數(shù)字溫度計(jì)系統(tǒng)知識(shí)運(yùn)用簡單的AT89S52芯片的I/O口傳輸功能,通過幾個(gè)小的讀數(shù)據(jù)、傳遞數(shù)據(jù)、延時(shí)子函數(shù)實(shí)現(xiàn)溫度的讀取傳輸功能,是比較簡單,容易實(shí)現(xiàn)的,所以我們的系統(tǒng)只是實(shí)現(xiàn)了一些簡單的功能,系統(tǒng)整體來說比較簡易,但好像這個(gè)溫度計(jì)沒有多大的應(yīng)
36、用價(jià)值,所以我們后續(xù)分析覺得這個(gè)系統(tǒng)可以加一個(gè)溫度復(fù)位系統(tǒng)提高AT89S52芯片的功能價(jià)值,也提高數(shù)字溫度計(jì)的智能價(jià)值,還可以增加一個(gè)報(bào)警子函數(shù),實(shí)現(xiàn)智能數(shù)字溫度計(jì)更高的應(yīng)用價(jià)值。</p><p> 五、課程設(shè)計(jì)心得體會(huì):</p><p> 經(jīng)過這次單片機(jī)課程設(shè)計(jì),終于完成了我的數(shù)字溫度計(jì)的設(shè)計(jì),雖然不能做到很完美,但從心底里說,還是高興的,畢竟這次設(shè)計(jì)把實(shí)物都做了出來,高興之余不得不
37、深思呀!</p><p> 在本次設(shè)計(jì)的過程中,我發(fā)現(xiàn)很多的問題,也許是第一次進(jìn)行這種系統(tǒng)的設(shè)計(jì)所以感覺完成這樣一次小系統(tǒng)設(shè)計(jì)我長進(jìn)了很多,單片機(jī)課程設(shè)計(jì)重點(diǎn)就在于軟件算法的設(shè)計(jì),需要有很巧妙的程序算法,雖然以前寫過幾次程序,但我覺的寫好一個(gè)程序并不是一件簡單的事,舉個(gè)例子,以前寫的那幾次,數(shù)據(jù)加減時(shí),我用的都是BCD碼,這一次,我全部用的都是16進(jìn)制的數(shù)直接加減,顯示處理時(shí)在用除法去刪分,感覺效果比較好,有好
38、多的東西,只有我們?nèi)ピ囍隽?,才能真正的掌握,只學(xué)習(xí)理論有些東西是很難理解的,更談不上掌握。</p><p> 從這次的課程設(shè)計(jì)中,我真真正正的意識(shí)到,在以后的學(xué)習(xí)中,要理論聯(lián)系實(shí)際,把我們所學(xué)的理論知識(shí)用到實(shí)際當(dāng)中,學(xué)習(xí)單機(jī)片機(jī)更是如此,程序只有在經(jīng)常的寫與讀的過程中才能提高,這就是我在這次課程設(shè)計(jì)中的最大收獲。通過這次對(duì)數(shù)字溫度計(jì)的設(shè)計(jì)與制作,讓我了解了設(shè)計(jì)電路的程序,也讓我了解了關(guān)于數(shù)字溫度計(jì)的原理與設(shè)計(jì)
39、理念,要設(shè)計(jì)一個(gè)電路總要先用仿真仿真成功之后才實(shí)際接線的。但是最后的成品卻不一定與仿真時(shí)完全一樣,因?yàn)?,再?shí)際接線中有著各種各樣的條件制約著。而且,在仿真中無法成功的電路接法,在實(shí)際中因?yàn)樾酒旧淼奶匦远軌虺晒?。所以,在設(shè)計(jì)時(shí)應(yīng)考慮兩者的差異,從中找出最適合的設(shè)計(jì)方法。</p><p> 通過這次學(xué)習(xí),讓我對(duì)各種電路都有了大概的了解,所以說,坐而言不如立而行,對(duì)于這些電路還是應(yīng)該自己動(dòng)手實(shí)際操作才會(huì)有深刻理解
40、。</p><p> 從這次的課程設(shè)計(jì)中,我真真正正的意識(shí)到,在以后的學(xué)習(xí)中,要理論聯(lián)系實(shí)際,把我們所學(xué)的理論知識(shí)用到實(shí)際當(dāng)中,學(xué)習(xí)單機(jī)片機(jī)更是如此,程序只有在經(jīng)常的寫與讀的過程中才能提高,這就是我在這次課程設(shè)計(jì)中的最大收獲。</p><p><b> 參考文獻(xiàn):</b></p><p> [2]科技教育創(chuàng)新中國科技信息2010 年第11
41、 期 CHINA SCIENCE AND TECHNOLOGY INFORMATION Jun.2010</p><p><b> 附錄:</b></p><p><b> 程序清單及其注釋:</b></p><p> //使用1602LCD顯示DS18B20轉(zhuǎn)換的溫度值</p><p>
42、#include <reg52.H></p><p> #include <intrins.H></p><p> #include <math.H></p><p> #define uchar unsigned char</p><p> #define uint unsigned int<
43、;/p><p> sbit RS = P2^6; //數(shù)據(jù)/命令選擇端(H/L)</p><p> sbit LCDEN = P2^7; //使能端</p><p> void delayUs() //短延時(shí)</p><p><b> {</b></p><p><b
44、> _nop_();</b></p><p><b> }</b></p><p> void delayMs(uint a) //長延時(shí)</p><p><b> {</b></p><p> uint i, j;</p><p>
45、for(i = a; i > 0; i--)</p><p> for(j = 100; j > 0; j--);</p><p><b> }</b></p><p> //第一行開始地址為0x80, 第二行開始地址為0xc0;</p><p> //寫命令:RS=0, RW=0;</p>
46、;<p> void writeComm(uchar comm)</p><p><b> {</b></p><p> RS = 0; </p><p> P1 = comm;</p><p> LCDEN = 1;</p><p> delayUs();<
47、/p><p> LCDEN = 0;</p><p> delayMs(1);</p><p><b> }</b></p><p> //寫數(shù)據(jù):RS=1, RW=00</p><p> void writeData(uchar dat)</p><p><b
48、> {</b></p><p><b> RS = 1;</b></p><p><b> P1 = dat;</b></p><p> LCDEN = 1;</p><p> delayUs();</p><p> LCDEN = 0;<
49、/p><p> delayMs(1);</p><p><b> }</b></p><p><b> //初始化函數(shù)</b></p><p> //顯示模式, 固定指令為00111000=0x38, 16*2顯示, 5*7點(diǎn)陣,8位數(shù)據(jù)接口</p><p> //顯示
50、開/關(guān)及光標(biāo)設(shè)置00001100=0x0c</p><p> //指令1: 00001DCB : D:開顯示/關(guān)顯示(H/L); C:顯示光標(biāo)/不顯示(H/L), B:光標(biāo)閃爍/不閃爍(H/L)</p><p> //指令2: 000001NS :</p><p> //N=1, 當(dāng)讀/寫一個(gè)字符后地址指針加1, 且光標(biāo)也加1; N=0則相反</p>
51、;<p> //S=1, 當(dāng)寫一個(gè)字符, 整屏顯示左移(N=1)或右移(N=0), 但光標(biāo)不移動(dòng); S=0, 整屏不移動(dòng)</p><p> void init()</p><p><b> {</b></p><p> writeComm(0x38); //顯示模式</p><p> writeC
52、omm(0x0c); //開顯示, 關(guān)光標(biāo)</p><p> writeComm(0x06); //寫字符后地址加1, 光標(biāo)加1</p><p> writeComm(0x01); //清屏</p><p><b> }</b></p><p> void writeString(uchar * str, uch
53、ar length)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i = 0; i < length; i++)</p><p><b> {</b></p><p>
54、 writeData(str[i]);</p><p><b> }</b></p><p><b> }</b></p><p> /*****************************DS18B20*******************************/</p><p>
55、 sbit ds = P3^4;</p><p> //初始化DS18B20</p><p> //讓DS18B20一段相對(duì)長時(shí)間低電平, 然后一段相對(duì)非常短時(shí)間高電平, 即可啟動(dòng)</p><p> void dsInit()</p><p><b> {</b></p><p> //
56、對(duì)于11.0592MHz時(shí)鐘, unsigned int型的i, 作一個(gè)i++操作的時(shí)間大于為8us</p><p> unsigned int i; </p><p><b> ds = 0;</b></p><p> i = 100; //拉低約800us, 符合協(xié)議要求的480us以上</p><p>
57、 while(i>0) i--;</p><p> ds = 1; //產(chǎn)生一個(gè)上升沿, 進(jìn)入等待應(yīng)答狀態(tài)</p><p><b> i = 4;</b></p><p> while(i>0) i--;</p><p><b> }</b></p><
58、;p> void dsWait()</p><p><b> {</b></p><p> unsigned int i;</p><p> while(ds); </p><p> while(~ds); //檢測(cè)到應(yīng)答脈沖</p><p><b> i = 4;
59、</b></p><p> while(i > 0) i--;</p><p><b> }</b></p><p> //向DS18B20讀取一位數(shù)據(jù)</p><p> //讀一位, 讓DS18B20一小周期低電平, 然后兩小周期高電平, </p><p> //之后
60、DS18B20則會(huì)輸出持續(xù)一段時(shí)間的一位數(shù)據(jù)</p><p> bit readBit()</p><p><b> {</b></p><p> unsigned int i;</p><p><b> bit b;</b></p><p><b> d
61、s = 0;</b></p><p> i++; //延時(shí)約8us, 符合協(xié)議要求至少保持1us</p><p><b> ds = 1; </b></p><p> i++; i++; //延時(shí)約16us, 符合協(xié)議要求的至少延時(shí)15us以上</p><p><b> b = ds;
62、</b></p><p><b> i = 8; </b></p><p> while(i>0) i--; //延時(shí)約64us, 符合讀時(shí)隙不低于60us要求</p><p><b> return b;</b></p><p><b> }</b>
63、;</p><p> //讀取一字節(jié)數(shù)據(jù), 通過調(diào)用readBit()來實(shí)現(xiàn)</p><p> unsigned char readByte()</p><p><b> {</b></p><p> unsigned int i;</p><p> unsigned char j, d
64、at;</p><p><b> dat = 0;</b></p><p> for(i=0; i<8; i++)</p><p><b> {</b></p><p> j = readBit();</p><p> //最先讀出的是最低位數(shù)據(jù)</p&
65、gt;<p> dat = (j << 7) | (dat >> 1);</p><p><b> }</b></p><p> return dat;</p><p><b> }</b></p><p> //向DS18B20寫入一字節(jié)數(shù)據(jù)<
66、/p><p> void writeByte(unsigned char dat)</p><p><b> {</b></p><p> unsigned int i;</p><p> unsigned char j;</p><p><b> bit b;</b>
67、</p><p> for(j = 0; j < 8; j++)</p><p><b> {</b></p><p> b = dat & 0x01;</p><p> dat >>= 1;//寫"1", 將DQ拉低15us后, 在15us~60us內(nèi)將DQ拉高,
68、即完成寫1</p><p><b> if(b) </b></p><p><b> {</b></p><p><b> ds = 0;</b></p><p> i++; i++; //拉低約16us, 符號(hào)要求15~60us內(nèi)</p><
69、p> ds = 1; </p><p> i = 8; while(i>0) i--; //延時(shí)約64us, 符合寫時(shí)隙不低于60us要求</p><p><b> }</b></p><p> else //寫"0", 將DQ拉低60us~120us</p><p>&
70、lt;b> {</b></p><p><b> ds = 0;</b></p><p> i = 8; while(i>0) i--; //拉低約64us, 符號(hào)要求</p><p><b> ds = 1;</b></p><p> i++; i++; //
71、整個(gè)寫0時(shí)隙過程已經(jīng)超過60us, 這里就不用像寫1那樣, 再延時(shí)64us了</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> //向DS18B20發(fā)送溫度轉(zhuǎn)換命令</p>
72、<p> void sendChangeCmd()</p><p><b> {</b></p><p> dsInit(); //初始化DS18B20, 無論什么命令, 首先都要發(fā)起初始化</p><p> dsWait(); //等待DS18B20應(yīng)答</p><p> delayMs(
73、1); //延時(shí)1ms, 因?yàn)镈S18B20會(huì)拉低DQ 60~240us作為應(yīng)答信號(hào)</p><p> writeByte(0xcc); //寫入跳過序列號(hào)命令字 Skip Rom</p><p> writeByte(0x44); //寫入溫度轉(zhuǎn)換命令字 Convert T</p><p><b> }</b></p>
74、<p> //向DS18B20發(fā)送讀取數(shù)據(jù)命令</p><p> void sendReadCmd()</p><p><b> {</b></p><p><b> dsInit();</b></p><p><b> dsWait();</b><
75、;/p><p> delayMs(1);</p><p> writeByte(0xcc); //寫入跳過序列號(hào)命令字 Skip Rom</p><p> writeByte(0xbe); //寫入讀取數(shù)據(jù)令字 Read Scratchpad</p><p><b> }</b></p><p&g
76、t;<b> //獲取當(dāng)前溫度值</b></p><p> int getTmpValue()</p><p><b> {</b></p><p> unsigned int tmpvalue;</p><p> int value; //存放溫度數(shù)值</p><p&
77、gt;<b> float t;</b></p><p> unsigned char low, high;</p><p> sendReadCmd();</p><p> //連續(xù)讀取兩個(gè)字節(jié)數(shù)據(jù)</p><p> low = readByte(); </p><p> high
78、= readByte();</p><p> //將高低兩個(gè)字節(jié)合成一個(gè)整形變量</p><p> //計(jì)算機(jī)中對(duì)于負(fù)數(shù)是利用補(bǔ)碼來表示的</p><p> //若是負(fù)值, 讀取出來的數(shù)值是用補(bǔ)碼表示的, 可直接賦值給int型的value</p><p> tmpvalue = high;</p><p>
79、tmpvalue <<= 8;</p><p> tmpvalue |= low;</p><p> value = tmpvalue;</p><p> //使用DS18B20的默認(rèn)分辨率12位, 精確度為0.0625度, 即讀回?cái)?shù)據(jù)的最低位代表0.0625度</p><p> t = value * 0.0625;&l
80、t;/p><p> //將它放大10倍, 使顯示時(shí)可顯示小數(shù)點(diǎn)后一位, 并對(duì)小數(shù)點(diǎn)后第二位進(jìn)行4舍5入</p><p> //如t=11.0625, 進(jìn)行計(jì)數(shù)后, 得到value = 111, 即11.1 度</p><p> //如t=-11.0625, 進(jìn)行計(jì)數(shù)后, 得到value = -111, 即-11.1 度</p><p>
81、value = t * 10 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5</p><p> return value;</p><p><b> }</b></p><p> void display(int v) </p><p><b> {&
82、lt;/b></p><p> unsigned char count;</p><p> unsigned char datas[] = {0, 0, 0, 0};</p><p> unsigned int tmp = abs(v);</p><p> datas[0] = tmp / 1000;</p>&l
83、t;p> datas[1] = tmp % 1000 / 100;</p><p> datas[2] = tmp % 100 / 10;</p><p> datas[3] = tmp % 10;</p><p> writeComm(0xc0+3);</p><p><b> if(v < 0)</b
84、></p><p><b> {</b></p><p> writeString("- ", 2);</p><p><b> }</b></p><p><b> else</b></p><p><b>
85、 {</b></p><p> writeString("+ ", 2);</p><p><b> }</b></p><p> if(datas[0] != 0)</p><p><b> {</b></p><p> writ
86、eData('0'+datas[0]);</p><p><b> }</b></p><p> for(count = 1; count != 4; count++)</p><p><b> {</b></p><p> writeData('0'+dat
87、as[count]);</p><p> if(count == 2)</p><p><b> {</b></p><p> writeData('.');</p><p><b> }</b></p><p><b> }</b&
88、gt;</p><p><b> }</b></p><p> /******************************DS18B20*******************************/</p><p> void main()</p><p><b> {</b><
89、/p><p> uchar table[] = "Now Temperature ";</p><p> delayMs(1);</p><p> sendChangeCmd();</p><p><b> init();</b></p><p> writeComm(0
90、x80);</p><p> writeString(table, 16);</p><p><b> while(1)</b></p><p><b> {</b></p><p> delayMs(1000); //溫度轉(zhuǎn)換時(shí)間需要750ms以上</p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)數(shù)字溫度計(jì)
- 數(shù)字溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 數(shù)字溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)報(bào)告課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--數(shù)字溫度計(jì)
- 基于51單片機(jī)的數(shù)字溫度計(jì)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告---數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)數(shù)字溫度計(jì)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)——數(shù)字溫度計(jì)
評(píng)論
0/150
提交評(píng)論