DS18B20智能溫度控制器_第1頁
DS18B20智能溫度控制器_第2頁
DS18B20智能溫度控制器_第3頁
免費預(yù)覽已結(jié)束,剩余15頁可下載查看

下載本文檔

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

文檔簡介

1、DS18B20 智能溫度控制器DALLAS 最新單線數(shù)字溫度傳感器 DS18B20 簡介新的“一線器件”體積更小、適用 電壓更寬、更經(jīng)濟 Dallas 半導(dǎo)體公司的數(shù)字化溫度傳感器 DS1820 是世界上第一片支持 “一 線總線” 接口的溫度傳感器。 一線總線獨特而且經(jīng)濟的特點, 使用戶可輕松地組建傳感器網(wǎng) 絡(luò),為測量系統(tǒng)的構(gòu)建引入全新概念。 DS18B20 、 DS1822 “一線總線” 數(shù)字化溫度傳感器 同 DS1820 樣,DS18B20也 支持“一線總線”接口,測量溫度范圍為-55 C+125°C,在-10+85 C范圍內(nèi),精度為土 0.5 Co DS1822的精度較差為土

2、2 °C?,F(xiàn)場溫度直接以“一線 總線”的數(shù)字方式傳輸, 大大提高了系統(tǒng)的抗干擾性。 適合于惡劣環(huán)境的現(xiàn)場溫度測量, 如: 環(huán)境控制、設(shè)備或過程控制、測溫類消費電子產(chǎn)品等。與前一代產(chǎn)品不同,新的產(chǎn)品支持 3V5.5V的電壓范圍,使系統(tǒng)設(shè)計更靈活、方便。而且新一代產(chǎn)品更便宜,體積更小。DS18B20、DS1822的特性 DS18B20可以程序設(shè)定 912位的分辨率,精度為土 0.5 C。可選更小的封裝方式,更寬的電壓適用范圍。分辨率設(shè)定,及用戶設(shè)定的報警溫度存儲在EEPROM中,掉電后依然保存。DS18B20的性能是新一代產(chǎn)品中最好的!性能價格比也非常出色! DS1822與DS18B20

3、軟件兼容,是 DS18B20的簡化版本。省略了存儲用戶定義 報警溫度、分辨率參數(shù)的 EEPROM,精度降低為土 2°C,適用于對性能要求不高,成本控制 嚴格的應(yīng)用,是經(jīng)濟型產(chǎn)品。繼“一線總線”的早期產(chǎn)品后,DS1820開辟了溫度傳感器技術(shù)的新概念。DS18B20和DS1822使電壓、特性及封裝有更多的選擇,讓我們可以構(gòu)建適合自己的經(jīng)濟的測溫系統(tǒng)。DS18B20 的內(nèi)部結(jié)構(gòu)DS18B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器TH和TL、配置寄存器。DS18B20的管腳排列如下:DQ 為數(shù)字信號輸入 /輸出端; GND 為電源地; VDD 為外接供

4、電電源輸入端(在寄生電 源接線方式時接地) o光刻 ROM 中的 64位序列號是出廠前被光刻好的, 它可以看作是該 DS18B20 的地址序 列碼。64位光刻ROM的排列是:開始8位(28H)是產(chǎn)品類型標號,接著的48位是該DS18B20 自身的序列號,最后8位是前面56位的循環(huán)冗余校驗碼 (CRC=X8+X5+X4+1 )。光刻ROM 的作用是使每一個 DS18B20 都各不相同, 這樣就可以實現(xiàn)一根總線上掛接多個 DS18B20 的 目的。DS18B20中的溫度傳感器可完成對溫度的測量,以12位轉(zhuǎn)化為例:用16位符號擴展的二進制補碼讀數(shù)形式提供,以0.0625 C /LSB形式表達,其中S

5、為符號位。這是12位轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲在18B20的兩個8比特的RAM中,二進制中 的前面 5位是符號位,如果測得的溫度大于 0,這 5位為 0,只要將測到的數(shù)值乘于0.0625即可得到實際溫度;如果溫度小于0,這 5 位為 1 ,測到的數(shù)值需要取反加 1 再乘于 0.0625即可得到實際溫度。例如+125C的數(shù)字輸出為 07D0H , +25.0625 C的數(shù)字輸出為 0191H , -25.0625 C的數(shù)字 輸出為FF6FH , -55 C的數(shù)字輸出為 FC90H 。DS18B20 溫度傳感器的存儲器DS18B20 溫度傳感器的內(nèi)部存儲器包括一個高速暫存 RAM 和一個非易失性

6、的可電擦 除的 E2RAM, 后者存放高溫度和低溫度觸發(fā)器TH 、 TL 和結(jié)構(gòu)寄存器。暫存存儲器包含了 8 個連續(xù)字節(jié), 前兩個字節(jié)是測得的溫度信息, 第一個字節(jié)的內(nèi)容是 溫度的低八位,第二個字節(jié)是溫度的高八位。第三個和第四個字節(jié)是TH、TL 的易失性拷貝,第五個字節(jié)是結(jié)構(gòu)寄存器的易失性拷貝, 這三個字節(jié)的內(nèi)容在每一次上電復(fù)位時被刷新。 第六、七、八個字節(jié)用于內(nèi)部計算。第九個字節(jié)是冗余檢驗字節(jié)。該字節(jié)各位的意義如下:TM R1 R0 1 1 1 1 1低五位一直都是 1 , TM 是測試模式位,用于設(shè)置 DS18B20 在工作模式還是在測試模式。 在DS18B20出廠時該位被設(shè)置為 0,用戶

7、不要去改動。R1和R0用來設(shè)置分辨率,如下表所示:(DS18B20出廠時被設(shè)置為12位)分辨率設(shè)置表 :R1 R0 分辨率 溫度最大轉(zhuǎn)換時間0 0 9位 93.75ms0 1 10位 187.5ms1 0 11位 375ms1 1 12位 750ms根據(jù) DS18B20 的通訊協(xié)議, 主機控制 DS18B20 完成溫度轉(zhuǎn)換必須經(jīng)過三個步驟: 每一 次讀寫之前都要對 DS18B20 進行復(fù)位, 復(fù)位成功后發(fā)送一條 ROM 指令, 最后發(fā)送 RAM 指 令,這樣才能對 DS18B20進行預(yù)定的操作。復(fù)位要求主CPU將數(shù)據(jù)線下拉500微秒,然后釋放,DS18B20收到信號后等待1660微秒左右,后發(fā)

8、出 60240微秒的存在低脈沖,主 CPU 收到此信號表示復(fù)位成功。DS1 820使用中注意事項DS1820 雖然具有測溫系統(tǒng)簡單、測溫精度高、連接方便、占用口線少等優(yōu)點,但在實 際應(yīng)用中也應(yīng)注意以下幾方面的問題:(1) 較小的硬件開銷需要相對復(fù)雜的軟件進行補償,由于 DS1820 與微處理器間采用串行數(shù)據(jù)傳送,因此,在對 DS1820 進行讀寫編程時,必須嚴格的保證讀寫時序,否則將無法讀 取測溫結(jié)果。在使用 PL/M、C等高級語言進行系統(tǒng)程序設(shè)計時,對DS1820操作部分最好采用匯編語言實現(xiàn)。(2) 在 DS1820 的有關(guān)資料中均未提及單總線上所掛 DS1 820數(shù)量問題, 容易使人誤認為

9、可以掛任意多個 DS1820,在實際應(yīng)用中并非如此。當單總線上所掛DS1820超過8個時,就需要解決微處理器的總線驅(qū)動問題,這一點在進行多點測溫系統(tǒng)設(shè)計時要加以注意。(3) 連接DS1820的總線電纜是有長度限制的。試驗中,當采用普通信號電纜傳輸長度超過 50m 時,讀取的測溫數(shù)據(jù)將發(fā)生錯誤。當將總線電纜改為雙絞線帶屏蔽電纜時,正常通 訊距離可達150m,當采用每米絞合次數(shù)更多的雙絞線帶屏蔽電纜時,正常通訊距離進一步 加長。這種情況主要是由總線分布電容使信號波形產(chǎn)生畸變造成的。因此,在用DS1820 進行長距離測溫系統(tǒng)設(shè)計時要充分考慮總線分布電容和阻抗匹配問題。(4) 在 DS1820 測溫程

10、序設(shè)計中, 向 DS1820 發(fā)出溫度轉(zhuǎn)換命令后, 程序總要等待 DS1820的返回信號, 一旦某個 DS1820 接觸不好或斷線, 當程序讀該 DS1820 時,將沒有返回信號, 程序進入死循環(huán)。這一點在進行DS1820硬件連接和軟件設(shè)計時也要給予一定的重視。測溫電纜線建議采用屏蔽 4芯雙絞線,其中一對線接地線與信號線,另一組接VCC 和地線,屏蔽層在源端單點接地。這是我們用網(wǎng)站提供的 AT89C51 實驗開發(fā)板做的溫度測量試驗, DS18B20 的正電源 就是紅線接+ 5伏,蘭線接地,棕色線接P2.2,(注意:四位撥碼開關(guān)的第 3位不能處于ON 的位置, 否則實驗無法成功! )+5V 和信

11、號線之間有一個 4.7K 的上拉電阻, 硬件就這么簡單, 網(wǎng)友可以加 15 元向我郵購 DS18B20 測溫電纜,可以直接插在實驗板上,就能使用。軟件如下:;這是關(guān)于DS18B20的讀寫程序,數(shù)據(jù)腳P2.2,晶振12MHZ;溫度傳感器18B20匯編程序,采用器件默認的12位轉(zhuǎn)化,最大轉(zhuǎn)化時間750微秒 ;可以將檢測到的溫度直接顯示到AT89C51 開發(fā)實驗板的兩個數(shù)碼管上;顯示溫度 00 到 99 度,很準確哦 無需校正 !ORG 0000H; 單片機內(nèi)存分配申明 !TEMPER_L EQU 29H; 用于保存讀出溫度的低 8位 TEMPER_H EQU 28H; 用于保存讀出溫度的高 8位F

12、LAG1 EQU 38H; 是否檢測到 DS18B20 標志位 a_bit equ 20h ; 數(shù)碼管個位數(shù)存放內(nèi)存位置 b_bit equ 21h ; 數(shù)碼管十位數(shù)存放內(nèi)存位置MAIN:LCALL GET_TEMPER; 調(diào)用讀溫度子程序;進行溫度顯示 ,這里我們考慮用網(wǎng)站提供的兩位數(shù)碼管來顯示溫度;顯示范圍 00 到 99 度,顯示精度為 1 度;因為 12 位轉(zhuǎn)化時每一位的精度為 0.0625 度 ,我們不要求顯示小數(shù)所以可以拋棄29H 的低 4位;將28H中的低4位移入29H中的高4位,這樣獲得一個新字節(jié),這個字節(jié)就是實際測量獲得 的溫度;這個轉(zhuǎn)化溫度的方法可是我想出來的哦非常簡潔無需

13、乘于 0.0625 系數(shù)MOV A,29HMOV C,40H; 將 28H 中的最低位移入 CRRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV 29H,ALCALL DISPLAY; 調(diào)用數(shù)碼管顯示子程序CPL P1.0AJMP MAIN; 這是 DS18B20 復(fù)位初始化子程序INIT_1820:SETB P2.2NOPCLR P2.2; 主機發(fā)出延時 537 微秒的復(fù)位低脈沖MOV R1,#3TSR1:MOV R0,#107DJNZ R0,$DJNZ R1,TSR1SETB P2.2; 然后拉高數(shù)據(jù)線NOPNOPNOPMOV R0,#25

14、HTSR2:JNB P2.2,TSR3; 等待 DS18B20 回應(yīng)DJNZ R0,TSR2LJMP TSR4 ; 延時TSR3:SETB FLAG1 ; 置標志位 ,表示 DS1820 存在 CLR P1.7; 檢查到 DS18B20 就點亮 P1.7LED LJMP TSR5TSR4:CLR FLAG1 ; 清標志位 ,表示 DS1820 不存在CLR P1.1LJMP TSR7TSR5:MOV R0,#117TSR6:DJNZ R0,TSR6 ; 時序要求延時一段時間TSR7:SETB P2.2RET; 讀出轉(zhuǎn)換后的溫度值GET_TEMPER:SETB P2.2LCALL INIT_18

15、20; 先復(fù)位 DS18B20JB FLAG1,TSS2CLR P1.2RET ; 判斷 DS1820 是否存在 ?若 DS18B20 不存在則返回TSS2:CLR P1.3;DS18B20 已經(jīng)被檢測到 !MOV A,#0CCH ; 跳過 ROM 匹配LCALL WRITE_1820MOV A,#44H ; 發(fā)出溫度轉(zhuǎn)換命令LCALL WRITE_1820;這里通過調(diào)用顯示子程序?qū)崿F(xiàn)延時一段時間,等待 AD 轉(zhuǎn)換結(jié)束 ,12位的話 750 微秒LCALL DISPLAYLCALL INIT_1820; 準備讀溫度前先復(fù)位MOV A,#0CCH ; 跳過 ROM 匹配LCALL WRITE_1

16、820MOV A,#0BEH ; 發(fā)出讀溫度命令LCALL WRITE_1820LCALL READ_18200; 將讀出的溫度數(shù)據(jù)保存到 35H/36HCLR P1.4RET;寫 DS18B20 的子程序 (有具體的時序要求 )WRITE_1820:MOV R2,#8; 一共 8 位數(shù)據(jù)CLR CWR1:CLR P2.2MOV R3,#6DJNZ R3,$RRC AMOV P2.2,CMOV R3,#23DJNZ R3,$SETB P2.2NOPDJNZ R2,WR1SETB P2.2RET; 讀 DS18B20 的程序 , 從 DS18B20 中讀出兩個字節(jié)的溫度數(shù)據(jù) READ_18200

17、:MOV R4,#2 ; 將溫度高位和低位從 DS18B20 中讀出MOV R1,#29H ; 低位存入 29H(TEMPER_L), 高位存入 28H(TEMPER_H) RE00:MOV R2,#8; 數(shù)據(jù)一共有 8 位RE01:CLR CSETB P2.2NOPNOPCLR P2.2NOPNOPNOP SETB P2.2MOV R3,#9RE10: DJNZ R3,RE10MOV C,P2.2MOV R3,#23RE20: DJNZ R3,RE20RRC A DJNZ R2,RE01MOV R1,A DEC R1DJNZ R4,RE00 RET10 進制;顯示子程序display: mo

18、v a,29H; 將 29H 中的十六進制數(shù)轉(zhuǎn)換成 mov b,#10 ;10 進制 /10=10 進制 div abmov b_bit,a ; 十位在 a mov a_bit,b ; 個位在 b mov dptr,#numtab ; 指定查表啟始地址 mov r0,#4dpl1: mov r1,#250 ; 顯示 1000 次 dplop: mov a,a_bit ; 取個位數(shù)MOVC A,A+DPTR ; 查個位數(shù)的 7 段代碼 mov p0,a ; 送出個位的 7 段代碼 clr p2.7 ; 開個位顯示 acall d1ms ; 顯示 1ms setb p2.7 mov a,b_bit

19、 ; 取十位數(shù)MOVC A,A+DPTR ; 查十位數(shù)的 7 段代碼 mov p0,a ; 送出十位的 7 段代碼 clr p2.6 ; 開十位顯示 acall d1ms ; 顯示 1ms setb p2.6 djnz r1,dplop ;100 次沒完循環(huán) djnz r0,dpl1 ;4 個 100 次沒完循環(huán) ret;1MS 延時 (按 12MHZ 算)D1MS: MOV R7,#80DJNZ R7,$RET;實驗板上的7段數(shù)碼管09數(shù)字的共陰顯示代碼numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBHend這是上面程序匯編以后獲得

20、的編程器燒寫文件: DS1820.hex下載燒寫文件的方法:將鼠標移到燒寫文件的超級鍵連處,點擊鼠標的右鍵,選擇“目標另存為( A ). ?!贝嫖募愋椭胁灰x擇“文本文件” ,應(yīng)該選擇“所有文件” ,這樣就能 獲得 *.hex 文件了。;這是關(guān)于DS18B20的讀寫程序,數(shù)據(jù)腳P2.2,晶振11.0592mhz;溫度傳感器18B20匯編程序,采用器件默認的12位轉(zhuǎn)化,最大轉(zhuǎn)化時間750微秒 ;可以將檢測到的溫度直接顯示到AT89C51 開發(fā)實驗板的兩個數(shù)碼管上;顯示溫度 00到99度,很準確哦無需校正 !ORG 0000H; 單片機內(nèi)存分配申明 !TEMPER_L EQU 29H; 用于保存

21、讀出溫度的低 8位TEMPER_H EQU 28H; 用于保存讀出溫度的高 8位 FLAG1 EQU 38H; 是否檢測到 DS18B20 標志位 a_bit equ 20h ; 數(shù)碼管個位數(shù)存放內(nèi)存位置 b_bit equ 21h ; 數(shù)碼管十位數(shù)存放內(nèi)存位置MAIN:LCALL GET_TEMPER; 調(diào)用讀溫度子程序;進行溫度顯示 ,這里我們考慮用網(wǎng)站提供的兩位數(shù)碼管來顯示溫度;顯示范圍 00 到 99 度,顯示精度為 1 度;因為 12 位轉(zhuǎn)化時每一位的精度為 0.0625 度,我們不要求顯示小數(shù)所以可以拋棄 29H 的低 4 位;將28H中的低4位移入29H中的高4位,這樣獲得一個新

22、字節(jié),這個字節(jié)就是實際測量獲得 的溫度;這個轉(zhuǎn)化溫度的方法可是我想出來的哦非常簡潔無需乘于 0.0625系數(shù)MOV A,29HMOV C,40H; 將 28H 中的最低位移入 CRRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV 29H,ALCALL DISPLAY; 調(diào)用數(shù)碼管顯示子程序CPL P1.0AJMP MAIN; 這是 DS18B20 復(fù)位初始化子程序INIT_1820:SETB P2.2NOPCLR P2.2;主機發(fā)出延時 537 微秒的復(fù)位低脈沖MOV R1,#3TSR1:MOV R0,#107DJNZ R0,$DJNZ R1,

23、TSR1SETB P2.2; 然后拉高數(shù)據(jù)線NOPNOPNOPMOV R0,#25HTSR2:JNB P2.2,TSR3; 等待 DS18B20 回應(yīng)DJNZ R0,TSR2LJMP TSR4 ; 延時TSR3:SETB FLAG1 ; 置標志位 ,表示 DS1820 存在 CLR P1.7; 檢查到 DS18B20 就點亮 P1.7LED LJMP TSR5TSR4:CLR FLAG1 ; 清標志位 ,表示 DS1820 不存在CLR P1.1LJMP TSR7TSR5:MOV R0,#117TSR6:DJNZ R0,TSR6 ; 時序要求延時一段時間TSR7:SETB P2.2RET; 讀

24、出轉(zhuǎn)換后的溫度值GET_TEMPER:SETB P2.2LCALL INIT_1820; 先復(fù)位 DS18B20JB FLAG1,TSS2CLR P1.2RET ; 判斷 DS1820 是否存在 ?若 DS18B20 不存在則返回TSS2:CLR P1.3;DS18B20 已經(jīng)被檢測到 !MOV A,#0CCH ; 跳過 ROM 匹配LCALL WRITE_1820MOV A,#44H ; 發(fā)出溫度轉(zhuǎn)換命令LCALL WRITE_1820;這里通過調(diào)用顯示子程序?qū)崿F(xiàn)延時一段時間,等待 AD 轉(zhuǎn)換結(jié)束 ,12位的話 750 微秒LCALL DISPLAYLCALL INIT_1820; 準備讀溫

25、度前先復(fù)位MOV A,#0CCH ; 跳過 ROM 匹配LCALL WRITE_1820MOV A,#0BEH ; 發(fā)出讀溫度命令LCALL WRITE_1820LCALL READ_18200; 將讀出的溫度數(shù)據(jù)保存到 35H/36HCLR P1.4RET;寫 DS18B20 的子程序 (有具體的時序要求 )WRITE_1820:MOV R2,#8; 一共 8 位數(shù)據(jù)CLR CWR1:CLR P2.2MOV R3,#5DJNZ R3,$RRC AMOV P2.2,CMOV R3,#21DJNZ R3,$SETB P2.2NOPDJNZ R2,WR1SETB P2.2RET; 讀 DS18B2

26、0 的程序 , 從 DS18B20 中讀出兩個字節(jié)的溫度數(shù)據(jù) READ_18200:MOV R4,#2 ; 將溫度高位和低位從 DS18B20 中讀出MOV R1,#29H ; 低位存入 29H(TEMPER_L), 高位存入 28H(TEMPER_H) RE00:MOV R2,#8; 數(shù)據(jù)一共有 8 位RE01:CLR CSETB P2.2NOPNOPCLR P2.2NOPNOPNOPSETB P2.2MOV R3,#8RE10:DJNZ R3,RE10MOV C,P2.2MOV R3,#21RE20:DJNZ R3,RE20RRC ADJNZ R2,RE01MOV R1,ADEC R1DJ

27、NZ R4,RE00RET ;顯示子程序display: mov a,29H; 將 29H 中的十六進制數(shù)轉(zhuǎn)換成10 進制mov b,#10 ;10 進制 /10=10 進制 div abmov b_bit,a ; 十位在 a mov a_bit,b ; 個位在 b mov dptr,#numtab ; 指定查表啟始地址 mov r0,#4dpl1: mov r1,#250 ; 顯示 1000 次 dplop: mov a,a_bit ; 取個位數(shù)MOVC A,A+DPTR ; 查個位數(shù)的 7 段代碼 mov p0,a ; 送出個位的 7 段代碼 clr p2.7 ; 開個位顯示 acall

28、d1ms ; 顯示 1ms setb p2.7 mov a,b_bit ; 取十位數(shù)MOVC A,A+DPTR ; 查十位數(shù)的 7 段代碼 mov p0,a ; 送出十位的 7 段代碼 clr p2.6 ; 開十位顯示 acall d1ms ; 顯示 1ms setb p2.6 djnz r1,dplop ;100 次沒完循環(huán) djnz r0,dpl1 ;4 個 100 次沒完循環(huán) ret;1MS 延時D1MS: MOV R7,#80 DJNZ R7,$RET;實驗板上的7段數(shù)碼管09數(shù)字的共陰顯示代碼numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,

29、0DFH,0DBH end750 微秒; 溫度傳感器 18B20 匯編程序 ,采用器件默認的 12 位轉(zhuǎn)化 ,最大轉(zhuǎn)化時間 ; 將溫度數(shù)據(jù)通過串口發(fā)送出去,波特率 2400;本程序?qū)?AT89C51 實驗開發(fā)板編寫 .適合 12 晶振; 本程序經(jīng)過驗證 ,可以顯示溫度 +/-和兩位整數(shù)溫度和兩位小數(shù)溫度數(shù)據(jù)DOT EQU 30HZHENGSHU EQU 31HFLAG1 EQU 38H ; 是否檢測到 DS18B20 的標志位;定義溫度數(shù)據(jù)DIS_1 EQU 32H ; 符號DIS_2 EQU 33H ; 十位DIS_3 EQU 34H ; 個位DIS_4 EQU 35H ; 小數(shù)點后第一位

30、DIS_5 EQU 36H ; 小數(shù)點后第二位WDDATA BIT P2.2 ; 定義 DS18B20 的數(shù)據(jù)腳為 P2.2 端口ORG 0000H;以下為主程序進行 CPU 中斷方式設(shè)置CLR EA ; 關(guān)閉總中斷MOV SCON,#50H ; 設(shè)置成串口 1 方式MOV TMOD,#20H ; 波特率發(fā)生器 T1 工作在模式 2上MOV TH1,#0F3H ; 預(yù)置初值 (按照波特率 2400BPS 預(yù)置初值 )MOV TL1,#0F3H ; 預(yù)置初值 (按照波特率 2400BPS 預(yù)置初值 ) SETB TR1 ; 啟動定時器 T1; 以上完成串口 2400 通訊初始化設(shè)置; 主程序MA

31、IN:LCALL INIT_1820 ; 調(diào)用復(fù)位 DS18B20 子程序 MAIN1:LCALL GET_TEMPER; 調(diào)用讀溫度子程序LCALL FORMULA ; 通過公式計算 ,小數(shù)點后顯示兩位LCALL BCDLCALL DISPLAY ; 調(diào)用串口顯示子程序LCALL DELAY500 ; 延時 0.5 秒LCALL DELAY500 ; 延時 0.5 秒LCALL DELAY500 ; 延時 0.5 秒 AJMP MAIN1; DS18B20 復(fù)位初始化程序INIT_1820:SETB WDDATANOPCLR WDDATA;主機發(fā)出延時 540 微秒的復(fù)位低脈沖MOV R0,

32、#36LCALL DELAYSETB WDDATA; 然后拉高數(shù)據(jù)線NOPNOPMOV R0,#36TSR2:JNB WDDATA,TSR3; 等待 DS18B20 回應(yīng)DJNZ R0,TSR2LJMP TSR4 ; 延時TSR3:SETB FLAG1 ; 置標志位 ,表示 DS1820 存在LJMP TSR5TSR4:CLR FLAG1 ; 清標志位 ,表示 DS1820 不存在LJMP TSR7TSR5:MOV R0,#06BHTSR6:DJNZ R0,TSR6 ;復(fù)位成功 !時序要求延時一段時間TSR7:SETB WDDATARET ; 讀出轉(zhuǎn)換后的溫度值GET_TEMPER:SETB

33、WDDATA ; 定時入口LCALL INIT_1820 ; 先復(fù)位 DS18B20JB FLAG1,TSS2RET ; 判斷 DS1820 是否存在 ?若 DS18B20 不存在則返回TSS2:MOV A,#0CCH ; 跳過 ROM 匹配LCALL WRITE_1820MOV A,#44H ; 發(fā)出溫度轉(zhuǎn)換命令LCALL WRITE_1820MOV R0,#50 ; 等待 AD 轉(zhuǎn)換結(jié)束 ,12 位的話 750 微秒 .LCALL DELAYLCALL INIT_1820 ; 準備讀溫度前先復(fù)位MOV A,#0CCH ; 跳過 ROM 匹配LCALL WRITE_1820MOV A,#0B

34、EH ; 發(fā)出讀溫度命令LCALL WRITE_1820LCALL READ_18200; 將讀出的九個字節(jié)數(shù)據(jù)保存到 60H-68HRET;寫 DS18B20 的子程序 (有具體的時序要求 )WRITE_1820:MOV R2,#8 ; 一共 8 位數(shù)據(jù)CLR CWR1:CLR WDDATAMOV R3,#6DJNZ R3,$RRC AMOV WDDATA,CMOV R3,#24DJNZ R3,$SETB WDDATANOPDJNZ R2,WR1SETB WDDATARET ; 讀 DS18B20 的程序 , 從 DS18B20 中讀出九個字節(jié)的數(shù)據(jù)READ_18200:MOV R4,#9M

35、OV R1,#60H ; 存入 60H 開始的九個單元RE00:MOV R2,#8RE01:CLR CSETB WDDATANOPNOPCLR WDDATANOPNOPNOPSETB WDDATAMOV R3,#09RE10:DJNZ R3,RE10MOV C,WDDATAMOV R3,#23RE20:DJNZ R3,RE20 RRC ADJNZ R2,RE01MOV R1,AINC R1DJNZ R4,RE00RET;溫度計算子程序FORMULA:;按公式:T實際=(T整數(shù)-0.25)+( M每度-M剩余” M每度;計算出實際溫度,整數(shù)部分和小數(shù)部分分別存于 ZHENGSHU 單元和 DOT

36、 單元;將61H中的低4位移入60H中的高4位,得到溫度的整數(shù)部分,并存于 ZHENGSHU單元MOV 29H,61HMOV A,60HMOV C,48HRRC AMOV C,49HRRC AMOV C,4AHRRC AMOV C,4BHRRC AMOV ZHENGSHU,A;(M每度-M剩余” M每度,小數(shù)值存于A中MOV A,67hSUBB A,66hMOV B,#64HMUL ABMOV R4,BMOV R5,AMOV R7,67HLCALL DIV457MOV A,R3;再減去 0.25,實際應(yīng)用中減去 25SUBB A,#19HMOV DOT,A ; 小數(shù)部分存于 DOT 中MOV

37、A,ZHENGSHUSUBB A,#00H ; 整數(shù)部分減去來自小數(shù)部分的借位 MOV ZHENGSHU,AMOV C,4BHJNC ZHENG ; 是否為負數(shù)CPL AINC AMOV DIS_1,#2DH ; 零度以下時 ,第一位顯示 "-" 號MOV ZHENGSHU,AZHENG:MOV DIS_1,#2BH ; 零度以上時 ,第一位顯示 "+" 號 RET ;雙字節(jié)除以單字節(jié)子程序DIV457: CLR CMOV A,R4SUBB A,R7JC DV50SETB OV ; 商溢出RETDV50: MOV R6,#8 ;求平均值(R4R5/ R7 R3)DV51: MOV A,R5RLC AMOV R

溫馨提示

  • 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

提交評論