|
山東科技大學(xué)電工電子實(shí)驗(yàn)教學(xué)中心
創(chuàng)新性實(shí)驗(yàn)結(jié)題報(bào)告 實(shí)驗(yàn)項(xiàng)目名稱 _基于Proteus的溫度檢測(cè)_ 組長(zhǎng)姓名 婁猛__ 學(xué)號(hào) _2*01417 手機(jī) 159*917 成員姓名 ____ 學(xué)號(hào) _ _ 成員姓名 ____ 學(xué)號(hào) _ _ 專 業(yè) 電子信息工程_ 班級(jí) _ 09級(jí) 指導(dǎo)教師及職稱 ____呂常智______ 開課學(xué)期 至_學(xué)年_1_學(xué)期 提交時(shí)間 年1月日
一、實(shí)驗(yàn)摘要
根據(jù) DS18B20 的 1-wire 的通信原理,利用單片機(jī)匯編(或 C)語言實(shí)現(xiàn)一個(gè)溫度測(cè)試并顯示的電路,在 Proteus 平臺(tái)上進(jìn)行電路設(shè)計(jì),并且載入單片機(jī)程序進(jìn)行仿真驗(yàn)證。
|
二、實(shí)驗(yàn)目的
掌握虛擬仿真軟件 Proteus 的應(yīng)用,了解溫度傳感器 DS18B20 的 1-wire 的通信原理,學(xué)會(huì)采用 Proteus 虛擬仿真軟件工具,利用單片機(jī)匯編(或 C)語言實(shí)現(xiàn)一個(gè)溫度測(cè)試并顯示的電路,并且在 Proteus 軟件上仿真測(cè)試,進(jìn)行驗(yàn)證,綜合實(shí)驗(yàn)系統(tǒng)的使用方法,熟悉創(chuàng)新性實(shí)驗(yàn)報(bào)告的撰寫方法。
|
三、實(shí)驗(yàn)場(chǎng)地及儀器、設(shè)備和材料:
實(shí)驗(yàn)場(chǎng)地: 院實(shí)驗(yàn)室318、424 儀器設(shè)備: 計(jì)算機(jī)一臺(tái) 軟件: Proteus軟件 |
(1)DS18B20特點(diǎn): DS18B20采用一線通信接口。因?yàn)橐痪通信接口,必須在先完成ROM設(shè)定,否則記憶和控制 功能將無法使用。主要首先提供以下功能命令之一: <1> 讀ROM,<2>ROM匹配,<3>搜索ROM,<4>跳過ROM,<5>報(bào)警檢查。這些指令操作作用在沒有一個(gè)器件的64位光刻ROM序列號(hào),可以在掛在一線上多個(gè)器件選定某一個(gè)器件,同時(shí),總線也可以知道總線上掛有有多少,什么樣的設(shè)備。 若指令成功地使DS18B20完成溫度測(cè)量,數(shù)據(jù)存儲(chǔ)在DS18B20的存儲(chǔ)器。一個(gè)控制功能 指揮指示DS18B20的演出測(cè)溫。測(cè)量結(jié)果將被放置在DS18B20內(nèi)存中,并可以讓閱讀發(fā)出記憶功能的指揮,閱讀內(nèi)容的片上存儲(chǔ)器。溫度報(bào)警觸發(fā)器 TH和TL都有一字節(jié)EEPROM 的數(shù)據(jù)。如果DS18B20不使用報(bào)警檢查指令,這些寄存器可作為一般的用戶記憶用途。在片上還載有配置字節(jié)以理想的解決溫度數(shù)字轉(zhuǎn)換。寫TH,TL指令 以及配置字節(jié)利用一個(gè)記憶功能的指令完成。通過緩存器讀寄存器。所有數(shù)據(jù)的讀,寫都是從最低位開始。
DS18B20部分命令設(shè)置: 命令 | | | | | 這條命令允許總線控制器不用提供 64 位ROM 編碼就使用存儲(chǔ)器操作命令,在單點(diǎn)總線情況下右以節(jié)省時(shí)間。如果總線上不止一個(gè)從機(jī),在 Skip ROM命令之后跟著發(fā)一條讀命令,由于多個(gè)從機(jī)同時(shí)傳送信號(hào),總線上就會(huì)發(fā)生數(shù)據(jù)沖突(漏極開路下拉效果相當(dāng)于相與)。 | | | 這個(gè)命令向 DS1820 的暫存器中寫入數(shù)據(jù),開始位置在地址 2。接下來寫入的兩個(gè)字節(jié)將被存到暫存器中的地址位置 2 和3。可以在任何時(shí)刻發(fā)出復(fù)位命令來中止寫入。 | | | 這條命令啟動(dòng)一次溫度轉(zhuǎn)換而無需其他數(shù)據(jù)。溫度轉(zhuǎn)換命令被執(zhí)行,而后 DS1820保持等待狀態(tài)。如果總線控制器在這條命令之后跟著發(fā)出讀時(shí)間隙,而 DS1820 又忙于做時(shí)間轉(zhuǎn)換的話,DS1820 將在總線上輸出“0”,若溫度轉(zhuǎn)換完成,則輸出“1”。如果使用寄生電源,總線控制器必須在發(fā)出這條命令后立即起動(dòng)強(qiáng)上拉,并保持500ms。 | | | 這個(gè)命令讀取暫存器的內(nèi)容。讀取將從字節(jié) 0 開始,一直進(jìn)行下去,直到第 9(字節(jié) 8,CRC)字節(jié)讀完。如果不想讀完所有字節(jié),控制器可以在任何時(shí)間發(fā)出復(fù)位命令來中止讀取。 | | | 這條命令的流程圖和 Search ROM 相同。然而,只有在最近一次測(cè)溫后遇到符合報(bào)警條件的情況,DS1820才會(huì)響應(yīng)這條命令。報(bào)警條件定義為溫度高于TH或低于TL。只要 DS1820 不掉電,報(bào)警狀態(tài)將一直保持,直到再一次測(cè)得的溫度值達(dá)不到報(bào)警條件。 |
DS18B20讀寫時(shí)序圖: 說明: 主機(jī)要生成一個(gè)寫時(shí)間隙,必須把數(shù)據(jù)線拉到低電平然后釋放,在寫時(shí)間隙開始后的15μs內(nèi)允許數(shù)據(jù)線拉到高電平。 主機(jī)要生成一個(gè)寫 0 時(shí)間隙,必須把數(shù)據(jù)線拉到低電平并保持 60μs。 初始化過程“復(fù)位和存在脈沖”: 說明: DS1820 需要嚴(yán)格的協(xié)議以確保數(shù)據(jù)的完整性。協(xié)議包括幾種單線信號(hào)類型:復(fù)位脈沖、存在脈沖、寫0、寫 1、讀0 和讀1。所有這些信號(hào),除存在脈沖外,都是由總線控制器發(fā)出的。 和 DS1820 間的任何通訊都需要以初始化序列開始,一個(gè)復(fù)位脈沖跟著一個(gè)存在脈沖表明 DS1820 已經(jīng)準(zhǔn)備好發(fā)送和接收數(shù)據(jù)(適當(dāng)?shù)?ROM 命令和存儲(chǔ)器操作命令)。
DS18B20溫度值格式表: 說明: 這是12位轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲(chǔ)在18B20的兩個(gè)8比特的RAM中,二進(jìn)制中的前面 5位是符號(hào)位,如果測(cè)得的溫度大于0, 這5位為0,只要將測(cè)到的數(shù)值乘于0.0625即可得到實(shí)際溫度;如果溫度小于0,這5位為1,測(cè)到的數(shù)值需要取反加1再乘于0.0625即可得到實(shí)際 溫度。 例如+125℃的數(shù)字輸出為07D0H,+25.0625℃的數(shù)字輸出為0191H,-25.0625℃的數(shù)字輸出為FE6FH,-55℃的數(shù)字輸出為FC90H 。 (2)數(shù)碼顯示: 采用數(shù)碼管動(dòng)態(tài)顯示,通過位控線選擇數(shù)碼管,同時(shí)單片機(jī)通過查表送出段選送顯示的段碼,利用人的視覺暫留特點(diǎn)達(dá)到顯示的目的。 (3)復(fù)位電路: 復(fù)位電路采用手動(dòng)復(fù)位,實(shí)現(xiàn)單片機(jī)系統(tǒng)復(fù)位。 (4)震蕩電路; 為單片機(jī)提供恒定可靠的震蕩周期。 (5)驅(qū)動(dòng)電路: 由于單片機(jī)的驅(qū)動(dòng)能力有限,考慮到數(shù)碼管的特點(diǎn),實(shí)際應(yīng)加上驅(qū)動(dòng)電路,以提供合適的電流。 (6)測(cè)溫開關(guān) 給單片機(jī)信號(hào),給予其開始測(cè)溫,關(guān)閉測(cè)溫指示。 (7)Proteus 虛擬仿真 在keil中編寫單片機(jī)程序,生成相應(yīng)的.Hex文件,將文件復(fù)制到一個(gè)文件夾下,在Proteus里添加單片機(jī)并設(shè)置程序的路徑,找到該文件,仿真時(shí)就會(huì)調(diào)用該程序文件。
| 2、實(shí)驗(yàn)內(nèi)容 根據(jù)設(shè)計(jì)要求設(shè)計(jì)硬件電路,根據(jù)各項(xiàng)指標(biāo)選擇合適的原件,在Proteus原理圖中畫出原理圖。本設(shè)計(jì)采用六個(gè)八段數(shù)碼段動(dòng)態(tài)顯示,硬件電路主要有單片機(jī),復(fù)位電路,數(shù)碼顯示,震蕩電路,驅(qū)動(dòng)電路,測(cè)溫開關(guān)電路,傳感器電路等組成。開機(jī)顯示“HELLO”友好界面,測(cè)溫控制開關(guān)開始關(guān)閉測(cè)溫,當(dāng)開關(guān)閉合時(shí),處于測(cè)溫狀態(tài),顯示的溫度值即為真實(shí)溫度,開關(guān)打開時(shí)為關(guān)閉狀態(tài),數(shù)碼管組顯示“OFF”與最后一次測(cè)量值的交替顯示,警示測(cè)溫中斷,開關(guān)再次合上時(shí)又進(jìn)行正常測(cè)溫。考慮到成本問題單片機(jī)選用AT89C52,該單片機(jī)為一8位單片機(jī),詳細(xì)介紹再次就不過多陳述,具體參數(shù)參考技術(shù)資料。單片機(jī)程序采用匯編語言,在Keil環(huán)境下編譯。
| 3、實(shí)驗(yàn)步驟 (1)根據(jù)功能設(shè)計(jì)硬件電路 <1>數(shù)碼管顯示及其驅(qū)動(dòng)電路: 本設(shè)計(jì)采用的是6位8段共陽數(shù)碼管,如下圖所示,ABCDEFG個(gè)DP分別是數(shù)碼管的八個(gè)段,123456是對(duì)應(yīng)的六個(gè)線選線,由于單片機(jī)的灌電流能力也不是很強(qiáng),直接驅(qū)動(dòng)幾個(gè)數(shù)碼管有點(diǎn)困難,因此加上了373鎖存器,跟7407同向驅(qū)動(dòng)芯片。373鎖存p0(開漏輸出)口輸出的段選信號(hào),P2口是線選信號(hào)輸出口。P2口雖然內(nèi)部有上拉電阻,但是由于7407是集電極開路六組驅(qū)動(dòng)器,沒有上拉不能輸出高電平所以還要加上拉電阻。7407的驅(qū)動(dòng)能力比較強(qiáng),高電平時(shí)輸出最大電流可達(dá)41mA,而輸入高電平電流只需40uA即可,能夠滿足該六位數(shù)碼管正常顯示。
<2>振蕩電路 該振蕩電路外部由兩個(gè)電容C1,C2跟晶振X1組成,如下圖連接接地,并接到單片機(jī)的XTAL1跟XTAL2引腳上。由于51單片機(jī)內(nèi)部有一個(gè)用于構(gòu)成振蕩器的可控高增益反向放大器,兩個(gè)引腳XTAL1,XTAL2分別是該放大器的輸入端跟輸出端。按下圖所示,就可構(gòu)成一個(gè)自激振蕩器,匹配電容根據(jù)晶振的要求選取,一般選用20~30pF瓷片電容即可。
<3>復(fù)位電路 下圖是一個(gè)簡(jiǎn)單手動(dòng)復(fù)位與上電復(fù)位的綜合復(fù)位電路。R2,R3構(gòu)成手動(dòng)復(fù)位電路,R2一般取1~5KΩ。在實(shí)際電路中,當(dāng)R3=200Ω,R2=800Ω時(shí),按下按鍵實(shí)現(xiàn)可靠復(fù)位電壓為4V.即Urst=U*R2/(R2+R3)。由于仿真軟件的問題,當(dāng)R2大于1K時(shí),上電后RST引腳不能實(shí)現(xiàn)低電平,因此不能滿足復(fù)位的條件,采用800Ω電阻時(shí)能夠?qū)崿F(xiàn)。但實(shí)際電路中R2取到1K才能實(shí)現(xiàn)可靠的上電復(fù)位。(相關(guān)公式:Urst=5*e^(-t/τ), τ=R2*C,當(dāng)復(fù)位電壓大于等于3V時(shí)是可靠復(fù)位電壓。帶入上式,t=τ*ln(5/3) ≈0.15τ,當(dāng)R2=1KΩ,C=22uF時(shí),t≈11.2ms.即復(fù)位時(shí)間約為11.2ms。為保證可靠復(fù)位,復(fù)位時(shí)間大于10ms即可。) <4>測(cè)溫開關(guān): 測(cè)溫開關(guān)的實(shí)現(xiàn)時(shí)利用檢驗(yàn)其是否存在的原理進(jìn)而轉(zhuǎn)換顯示狀態(tài),故可以設(shè)置在DS18B20跟單片機(jī)相連的路徑之間(接在P3.3引腳),開關(guān)斷開,單片機(jī)就會(huì)檢測(cè)不到傳感器,轉(zhuǎn)換到關(guān)閉測(cè)溫狀態(tài),開關(guān)閉合,單片機(jī)又能檢測(cè)到傳感器,自動(dòng)轉(zhuǎn)到測(cè)溫顯示狀態(tài)。由于DS1820 的單總線端口(I/O 引腳)是漏極開路式的,一個(gè)多點(diǎn)總線由一個(gè)單線總線和多個(gè)掛于其上的從機(jī)構(gòu)成。在發(fā)出任何涉及拷貝到 E2存儲(chǔ)器或啟動(dòng)溫度轉(zhuǎn)換的協(xié)議之后,必須在最多 10μs之內(nèi)把 I/O 線轉(zhuǎn)換到強(qiáng)上拉,因此單線總線需要一個(gè)約 5KΩ的上拉電阻。 實(shí)際電路如下圖所示:
(2)設(shè)計(jì)單片機(jī)程序,畫出流程圖 通過單線總線端口訪問 DS1820 的協(xié)議如下: • 初始化 • ROM 操作命令 • 存儲(chǔ)器操作命令 • 執(zhí)行/數(shù)據(jù) 程序組成: 主程序 子程序: HELLO與OFF開關(guān)顯示、DS18B20初始化、重寫DB18B20、讀溫度、溫度數(shù)值轉(zhuǎn)換等。
主程序流程圖: HELLO與OFF開關(guān)顯示流程圖:
DS18B20初始化流程圖: 重寫DB18B20流程圖:
讀溫度流程圖: 溫度數(shù)值轉(zhuǎn)換流程圖:
(3)編寫程序 根據(jù)硬件電路編寫程序,程序見實(shí)驗(yàn)結(jié)果部分的程序清單。 (4)仿真調(diào)試 在Keil編譯環(huán)境下編譯匯編程序,設(shè)置晶振12MHz,生成.Hex文件。打開用Proteus畫好的原理圖,雙擊單片機(jī),設(shè)置震蕩頻率12MHz,與硬件電路相對(duì)應(yīng),瀏覽找到生成的該程序的.Hex文件作為其程序。設(shè)置完成,打開仿真按鈕,進(jìn)行仿真調(diào)試,打開閉合測(cè)溫開關(guān)觀察現(xiàn)象,調(diào)節(jié)DS18B20的溫度調(diào)節(jié)部分調(diào)節(jié)溫度,觀察數(shù)碼顯示溫度值。 |
五、實(shí)驗(yàn)結(jié)果與分析 1、實(shí)驗(yàn)現(xiàn)象、數(shù)據(jù)記錄 當(dāng)仿真開始時(shí),顯示開機(jī)界面“HELLO”: 測(cè)溫時(shí),當(dāng)測(cè)試零下溫度時(shí)顯示零下溫度值: 當(dāng)測(cè)試零上溫度時(shí)顯示正的溫度值: 當(dāng)測(cè)溫開關(guān)打開時(shí),顯示“OFF”與最后一次測(cè)溫值交替顯示界面:
2、對(duì)實(shí)驗(yàn)現(xiàn)象、數(shù)據(jù)及觀察結(jié)果的分析與討論: 開機(jī)時(shí)顯示“HELLO”問候,采用200次動(dòng)態(tài)掃描顯示,顯示完之后自動(dòng)轉(zhuǎn)到下面的初始化及測(cè)溫程序,傳感器存在時(shí),進(jìn)行正常測(cè)溫,零上溫度入上面圖示,顯示零上溫度,無效位消隱,實(shí)現(xiàn)方法是每次遍歷存儲(chǔ)空間,將無效位的段選置空,有效的位用數(shù)據(jù)填充,小數(shù)點(diǎn)另加到倒數(shù)第二個(gè)數(shù)碼管的小數(shù)點(diǎn)處。當(dāng)測(cè)試零下溫度時(shí),數(shù)值轉(zhuǎn)換要取反加1,還要在前面加負(fù)號(hào),考慮到負(fù)數(shù)最多顯示兩位,故將負(fù)號(hào)固定在倒數(shù)第四位,省去了判斷的麻煩。當(dāng)測(cè)溫開關(guān)斷開時(shí),由于檢測(cè)不到DS18B20的存在,故程序轉(zhuǎn)到顯示“OFF”界面,由于要不斷地檢測(cè)存在位,所以要循環(huán)檢測(cè),循環(huán)顯示,由于時(shí)序的原因,會(huì)使OFF與最后一次測(cè)溫結(jié)果交替顯示。開關(guān)閉合,又能檢測(cè)到標(biāo)志位,程序自動(dòng)進(jìn)入正常測(cè)溫序列。 | 3、主要關(guān)鍵和創(chuàng)新點(diǎn): 在Proteus仿真環(huán)境下,使用DS18B20進(jìn)行一路測(cè)溫,測(cè)溫精度達(dá)到到0.5攝氏度開機(jī)顯示友好界面“HELLO”問候,當(dāng)測(cè)溫關(guān)閉時(shí),會(huì)顯示“OFF”提醒,閉合開關(guān),又可以進(jìn)行正常測(cè)溫。本設(shè)計(jì)通過檢查存在標(biāo)志位的方法進(jìn)行了測(cè)溫開關(guān)的控制,避免了使用中斷進(jìn)行控制,從而避免了中斷導(dǎo)致的測(cè)溫時(shí)序混亂,測(cè)溫不準(zhǔn)的結(jié)果。 |
程序清單:
- ;===================================
- ;FLAG1: 標(biāo)志位,為"1"時(shí)表示檢測(cè)到DS18B20
- ;FLAG2: 標(biāo)志位,為“1”時(shí)測(cè)溫,為0時(shí)關(guān)閉
- ;DQ: DS18B20的數(shù)據(jù)總線接腳
- ;===================================
- ;RAM
- ByteCnt data 31H ;數(shù)據(jù)字節(jié)計(jì)數(shù)器
- TEMPER_H EQU 35H ;溫度高八位
- TEMPER_L EQU 36H ;溫度低八位
- TEMPER_NUM EQU 37H ;保存讀出的溫度數(shù)據(jù)
- ZhengShu EQU 38H ;存放整數(shù)部分?jǐn)?shù)據(jù)
- Show_Dat EQU 40H ;存儲(chǔ)要顯示的數(shù)據(jù)
- ;BIT
- FLAG1 EQU 20H ;標(biāo)志位,為"1"時(shí)表示檢測(cè)到DS18B20
- DQ BIT P3.3 ;;DS18B20的數(shù)據(jù)總線接腳
- ;===================================
- ORG 00H ;;給定主函數(shù)起始位置
- LJMP MAIN ;;跳至主函數(shù)
- ORG 000BH ;;定時(shí)器T0中斷服務(wù)程序入口
- LJMP INT_T0 ;;跳至T0中斷
- ;===================================
- ;MAIN
- ;主程序
- ;===================================
- MAIN: NOP
- MOV R3,#0C8H ;顯示200次
- MOV 50H,#0 ;顯示緩沖單元
- MOV 51H,#1
- MOV 52H,#2
- MOV 53H,#3
- MOV 54H,#4
- MOV 55H,#5
- CALL HELLO ;;調(diào)用開機(jī)顯示界面
- NOP
- MOV SP,#0E0H ;;設(shè)堆棧指針
- MOV TMOD,#01H ;T0工作在16位定時(shí)器
- MOV TH0,#0F8H ;定時(shí)2ms初值
- MOV TL0,#50H
- SETB ET0 ;允許定時(shí)器0中斷
- CLR EA ;關(guān)閉全局中斷
- SETB TR0 ;打開定時(shí)器0
- MOV R0,#40H ;該地址是存儲(chǔ)要顯示的數(shù)據(jù)區(qū)首址
- AGAIN: MOV @R0,#0FFH ;;存儲(chǔ)區(qū)初始化,置1
- INC R0
- CJNE R0,#48H,AGAIN ;;遍歷
- MAIN_1: CALL INIT_1820 ;;初始化18B20
- CALL RE_CONFIG ;;重新寫DS18B20
- CALL GET_TEMPER ;;讀溫度
- MOV Show_Dat+1,#0FFH ;;存儲(chǔ)區(qū)初始化,置1
- MOV Show_Dat+2,#0FFH
- MOV Show_Dat+3,#0FFH
- LCALL Temper_chng ;;數(shù)值轉(zhuǎn)換
- MOV R5,#01H ;;第一個(gè)位選
- MOV R0,#40H ;;顯示首址
- SETB EA ;;開全局中斷
- LCALL DELAY ;;延時(shí)
- CLR EA ;;關(guān)全局中
- JMP MAIN_1 ;;返回主函數(shù)
- ;===================================
- ;INIT_1820
- ;DS18B20初始化程序
- ;===================================
- INIT_1820:
- SETB DQ ;;先拉高總線,準(zhǔn)備拉低
- NOP ;;等待1us電平轉(zhuǎn)換狀態(tài)完畢
- CLR DQ ;;釋放總線
- MOV R0,#6BH ;為延時(shí)送初值
- MOV R1,#03H ;;為延時(shí)送初值
- TSR1: DJNZ R0,TSR1 ;延時(shí)約700us (480~960)
- MOV R0,#6BH ;;為延時(shí)送初值
- DJNZ R1,TSR1
- SETB DQ ;釋放總線
- NOP ;;延時(shí)
- NOP
- NOP
- MOV R0,#20H ;;為延時(shí)送初值
- TSR2: JNB DQ,TSR3 ;有存在信號(hào)跳轉(zhuǎn)
- DJNZ R0,TSR2 ;延時(shí)約70us,70us后如果數(shù)據(jù)線沒有存在脈沖(低電平)說明DS18B20不存在
- LJMP TSR4 ;;轉(zhuǎn)到清除標(biāo)志操作
- TSR3: SETB FLAG1 ;置標(biāo)志位,表示DS1820存在
- LJMP TSR5 ;;準(zhǔn)備延時(shí)
- TSR4: CLR FLAG1 ;清標(biāo)志位,表示DS18B20不存在
- LJMP TSR7 ;;準(zhǔn)備釋放總線繼續(xù)等
- TSR5: MOV R0,#05CH ;;送延時(shí)初值
- TSR6: DJNZ R0,TSR6 ;延時(shí)200us
- TSR7: SETB DQ ;釋放總線
- RET
- ;===================================
- ; RE_CONFIG
- ; 重新寫DS18B20暫存存儲(chǔ)器設(shè)定值
- ;===================================
- RE_CONFIG:
- JB FLAG1,RE_CONFIG1 ;若DS18B20存在,轉(zhuǎn)RE_CONFIG1
- MOV R3,#0C8H ;顯示200次
- MOV 60H,#0 ;顯示緩沖單元
- MOV 61H,#1
- MOV 62H,#2
- MOV 63H,#3
- MOV 64H,#4
- MOV 65H,#5
- CALL OFF
- RET
- RE_CONFIG1:
- MOV A,#0CCH ;發(fā)SKIP ROM命令
- LCALL WRITE_1820
- MOV A,#4EH ;發(fā)寫暫存存儲(chǔ)器命令
- LCALL WRITE_1820
- MOV A,#30H;TH(上限)中寫入00H
- LCALL WRITE_1820
- MOV A,#00H ;TL(下限)中寫入00H
- LCALL WRITE_1820
- MOV A,#1FH ;選擇9位溫度分辨率
- LCALL WRITE_1820
- RET
- ;===================================
- ; 讀出轉(zhuǎn)換后的溫度值
- ; 數(shù)據(jù)存儲(chǔ)到TEMPER_H和TEMPER_L中
- ; 包含告警搜索
- ;===================================
- GET_TEMPER:
- SETB DQ ;定時(shí)入口
- LCALL INIT_1820 ;初始化1820
- JB FLAG1,TSS2
- RET ;若DS18B20不存在則返回
- TSS2: MOV A,#0CCH ;跳過ROM匹配
- LCALL WRITE_1820 ;;調(diào)寫DS18B20的程序
- MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
- LCALL WRITE_1820
- LCALL INIT_1820
- MOV A,#0CCH ;跳過ROM匹配
- LCALL WRITE_1820
- MOV A,#0BEH ;發(fā)出讀溫度命令
- LCALL WRITE_1820
- LCALL READ_18200
- MOV TEMPER_NUM,A ;將讀出的溫度數(shù)據(jù)保存
- MOV A,#0ECH ;告警搜索
- CALL WRITE_1820
- RET
- ;===================================
- ; READ_1820
- ; 讀DS18B20的程序,從DS18B20中讀出一個(gè)字節(jié)的數(shù)據(jù)
- ; 讀出的數(shù)據(jù)在A中
- ;===================================
- READ_1820:
- MOV R2,#8 ;一個(gè)字節(jié)8位
- RE1:
- CLR C ;清零進(jìn)借位
- SETB DQ ;數(shù)據(jù)線拉高
- NOP ;延時(shí)
- NOP
- CLR DQ ;數(shù)據(jù)線拉低
- NOP ;延時(shí)
- NOP
- NOP
- SETB DQ;數(shù)據(jù)線拉高產(chǎn)生讀時(shí)間隙
- MOV R3,#3 ;;為延時(shí)6us送初值
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延時(shí)約6us
- MOV C,DQ ;讀入數(shù)據(jù)
- MOV R3,#23 ;為延時(shí)50us送初值
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延時(shí)約50us
- SETB DQ ;數(shù)據(jù)線拉高
- NOP
- RRC A
- DJNZ R2,RE1
- RET
- ;===================================
- ;WRITE_1820:
- ; 寫DS18B20的程序
- ;===================================
- WRITE_1820:
- MOV R2,#8 ;;8位
- CLR C ;;清空C
- WR1: CLR DQ ;數(shù)據(jù)線拉低產(chǎn)生寫時(shí)間隙
- MOV R3,#6 ;;為延時(shí)送數(shù)
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延時(shí)約6us(要求小于15us)
- RRC A ;;循環(huán)右移
- MOV DQ,C ;數(shù)據(jù)送到數(shù)據(jù)線
- MOV R3,#23 ;為延時(shí)送初值
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延時(shí)約25us(要求15us-60us)
- SETB DQ ;數(shù)據(jù)線拉高
- NOP ;延時(shí)1.085us(要求連續(xù)寫2 位間的間隙大于1us)
- DJNZ R2,WR1 ;判斷是否寫完沒寫完接著寫下一位
- SETB DQ ;;寫完拉高
- RET
- ;===================================
- ; READ_18200
- ; 讀DS18B20的程序,從DS18B20中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)
- ; 數(shù)據(jù)存儲(chǔ)到TEMPER_H和TEMPER_L中
- ;===================================
- READ_18200:
- MOV R4,#2 ;將溫度高位和低位從DS18B20中讀出
- MOV R1,#36H ;低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
- RE00:
- MOV R2,#8 ;;8位
- RE01:
- CLR C ;;清進(jìn)借位
- SETB DQ ;;拉高
- NOP
- NOP
- CLR DQ ;;拉低
- NOP
- NOP
- NOP
- SETB DQ ;;釋放總線
- MOV R3,#3 ;;為延時(shí)送數(shù)
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延時(shí)約6us
- MOV C,DQ ;;讀數(shù)據(jù)
- MOV R3,#23 ;;為延時(shí)送數(shù)
- DJNZ R3,[ DISCUZ_CODE_7 ]nbsp; ;延時(shí)約50us
- SETB DQ ;數(shù)據(jù)線拉高
- NOP
- RRC A ;;移位保存
- DJNZ R2,RE01;;判斷8位是否讀完
- MOV @R1,A ;;將低位數(shù)據(jù)保存
- DEC R1 ;;轉(zhuǎn)到存儲(chǔ)高位數(shù)據(jù)地址
- DJNZ R4,RE00;判斷兩個(gè)字節(jié)是否讀完
- RET
- Temper_chng:
- MOV DPTR,#TAB ;字形碼表頭地址
- MOV R0,#Show_Dat ;顯示首地址賦給R0
- MOV A,TEMPER_L ;;溫度低八位
- ANL A,#0FH ;取溫度低四位
- CJNE A,#0H,NEXT ;判斷小數(shù)部分?jǐn)?shù)據(jù)
- MOV @R0,#0C0H ;小數(shù)為0
- LJMP NEXT1
- NEXT: MOV @R0,#92H ;小數(shù)為5
- NEXT1: INC R0 ;;下一個(gè)地址
- MOV A,TEMPER_L ;整數(shù)移位到低四位
- RR A
- RR A
- RR A
- RR A
- ANL A,#0FH ;保留低四位
- MOV ZhengShu,A
- MOV A,TEMPER_H ;整數(shù)部分移位到高四位
- RL A
- RL A
- RL A
- RL A
- ANL A,#0F0H ;保留高四位
- ADD A,ZhengShu ;相加得到整數(shù)部分?jǐn)?shù)據(jù)
- MOV ZhengShu,A ;存儲(chǔ)整數(shù)部分
- ;===================================
- ;判斷正負(fù)數(shù) ,正數(shù)可以直接進(jìn)行轉(zhuǎn)換,負(fù)數(shù)取反加1并且加負(fù)號(hào)
- ;===================================
- PUSH ACC ;;保存A
- ANL A,#80H ;;取符號(hào)位
- JZ NEXT12 ;;符號(hào)位為零,跳轉(zhuǎn)至正數(shù)處理部分
- POP ACC
- CPL A ;;取反
- ADD A,#01H ;;加1
- PUSH ACC
- MOV R0,#Show_Dat ;顯示首地址賦給R0
- MOV A,TEMPER_L;;溫度低八位
- ANL A,#0FH ;;取溫度低四位
- CPL A ;;取反
- ADD A,#01H ;;加1
- CJNE A,#0H,NEXT13 ;判斷小數(shù)部分?jǐn)?shù)據(jù)
- MOV @R0,#0C0H ;小數(shù)為0
- INC R0 ;;移到下一位
- MOV A,#0BFH ;加負(fù)號(hào)
- MOV Show_Dat+3,A ;;送回
- POP ACC
- LJMP NEXT2
- NEXT13: MOV @R0,#92H ;小數(shù)為5
- INC R0
- MOV A,#0BFH ;加負(fù)號(hào)
- MOV Show_Dat+3,A ;送回
- POP ACC
- DEC A
- LJMP NEXT2
- NEXT12: POP ACC
- NEXT2: MOV B,#10 ;16進(jìn)制轉(zhuǎn)成十進(jìn)制
- DIV AB
- MOV R6,A ;;得高位
- MOV A,B
- MOVC A,@A+DPTR
- MOV @R0,A;將段碼送到相應(yīng)的地址空間
- INC R0 ;;轉(zhuǎn)移到下一個(gè)地址
- MOV A,R6
- CJNE A,#0,NEXT2 ;;判斷是否轉(zhuǎn)換完
- MOV A,Show_Dat+1 ;加小數(shù)點(diǎn)
- CLR C ;清除進(jìn)借位
- SUBB A,#80H ;;加點(diǎn)
- MOV Show_Dat+1,A ;;送回
- RET
- TAB: DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H
- ;;共陽數(shù)碼管對(duì)應(yīng)的字符表:0,1,2,3,4,5,6,7,8,9, 負(fù)號(hào):0BFH
- TAB1: DB 0C0H,0C7H,0C7H,86H,89H,0FFH
- ;;"HELLO"
- TAB2: DB 0FFH,8EH,8EH,0C0H,0FFH,0FFH
- ;;"OFF"
- ;===================================
- DELAY:
- MOV R3,#10 ;;為延時(shí)送初值
- DELAY2: MOV R7,#200 ;;為延時(shí)送初值
- DELAY1: MOV R4,#250 ;;為延時(shí)送初值
- DJNZ R4,$
- DJNZ R7,DELAY1
- DJNZ R3,DELAY2
- RET
- ;===================================
- INT_T0: MOV TH0,#0F8H ;重賦2ms的定時(shí)器時(shí)間常數(shù)
- MOV TL0,#50H
- MOV P0,#0FFH ;高電位滅碼
- MOV P2,R5 ;送當(dāng)前顯示數(shù)碼管的位選信號(hào)
- MOV A,@R0 ;;取數(shù)
- MOV P0,A ;送字形代碼
- INC R0 ;顯示數(shù)據(jù)緩沖器指針加1,為下一個(gè)顯示數(shù)據(jù)作準(zhǔn)備
- CJNE R0,#48H,NEXT3 ;判斷是否8個(gè)數(shù)據(jù)全部送完,未送完則不用調(diào)整顯示緩沖指針
- MOV R0,#40H ;送完則調(diào)整顯示緩沖指針
- NEXT3: MOV A,R5 ;將目前的位選暫存信號(hào)左移,為下一個(gè)數(shù)碼管顯示作準(zhǔn)備
- RL A ;左移
- MOV R5,A ;;下一個(gè)位選
- RETI
- ;===========顯示開關(guān)界面
- ;===================================
- HELLO: MOV R0,#50H ;顯示緩沖首址
- MOV R2,#2H ;位控初始碼(先亮最低位)
- LOOPs: MOV A,#0H ;共陰滅碼
- MOV P2,A
- MOV A,R2 ;送位控信號(hào)
- MOV P2,A
- MOV A,@R0 ;從顯示緩沖中取數(shù)
- MOV DPTR,#TAB1
- MOVC A,@A+DPTR ;查出字形代碼
- MOV P0,A ;送顯示字符段代碼
- MOV R7,#0FFH
- DJNZ R7,[ DISCUZ_CODE_7 ]nbsp; ;1ms延時(shí),穩(wěn)定顯示信息
- INC R0 ;取下一個(gè)數(shù)
- MOV A,R2
- JB ACC.6,EXIT1 ;判斷是否送到最高位?
- RL A
- MOV R2,A ;得到下一個(gè)位控信號(hào)
- AJMP LOOPs
- EXIT1: DJNZ R3,HELLO;是否顯示完200次
- RET
- OFF: MOV R0,#60H ;顯示緩沖首址
- MOV R2,#2H ;位控初始碼(先亮最低位)
- LOOPs2: MOV A,#0H ;共陰滅碼
- MOV P2,A
- MOV A,R2 ;送位控信號(hào)
- MOV P2,A
- MOV A,@R0 ;從顯示緩沖中取數(shù)
- MOV DPTR,#TAB2
- MOVC A,@A+DPTR;查出字形代碼
- MOV P0,A ;送顯示字符段代碼
- MOV R7,#0FFH
- DJNZ R7,[ DISCUZ_CODE_7 ]nbsp; ;1ms延時(shí),穩(wěn)定顯示信息
- INC R0 ;取下一個(gè)數(shù)
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
完整論文下載(word格式 可編輯):
基于單片機(jī)的DS18B20測(cè)溫系統(tǒng)的設(shè)計(jì).doc
(1.17 MB, 下載次數(shù): 21)
2017-9-7 09:10 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|