下載手機(jī)汽配人

DS18B20溫度傳感器的使用方法

提問者:網(wǎng)友 2017-04-30
最佳回答
;這是關(guān)于DS18B20的讀寫程序,數(shù)據(jù)腳P2.2,晶振11.0592mhz;溫度傳感器18B20匯編程序,采用器件默認(rèn)的12位轉(zhuǎn)化,最大轉(zhuǎn)化時間750微秒;可以將檢測到的溫度直接顯示到AT89C51的兩個數(shù)碼管上;顯示溫度00到99度,很準(zhǔn)確無需校正!ORG 0000H;單片機(jī)內(nèi)存分配申明!TEMPER_L EQU 29H;用于保存讀出溫度的低8位TEMPER_H EQU 28H;用于保存讀出溫度的高8位FLAG1 EQU 38H;是否檢測到DS18B20標(biāo)志位a_bit equ 20h ;數(shù)碼管個位數(shù)存放內(nèi)存位置b_bit equ 21h ;數(shù)碼管十位數(shù)存放內(nèi)存位置MAIN:LCALL GET_TEMPER;調(diào)用讀溫度子程序;進(jìn)行溫度顯示,這里我們考慮用網(wǎng)站提供的兩位數(shù)碼管來顯示溫度;顯示范圍00到99度,顯示精度為1度;因?yàn)?2位轉(zhuǎn)化時每一位的精度為0.0625度,我們不要求顯示小數(shù)所以可以拋棄29H的低4位;將28H中的低4位移入29H中的高4位,這樣獲得一個新字節(jié),這個字節(jié)就是實(shí)際測量獲得的溫度;這個轉(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;主機(jī)發(fā)出延時537微秒的復(fù)位低脈沖MOV R1,#3TSR1:MOV R0,#107DJNZ R0,$DJNZ R1,TSR1SETB P2.2;然后拉高數(shù)據(jù)線NOPNOPNOPMOV R0,#25HTSR2:JNB P2.2,TSR3;等待DS18B20回應(yīng)DJNZ R0,TSR2LJMP TSR4 ; 延時TSR3:SETB FLAG1 ; 置標(biāo)志位,表示DS1820存在CLR P1.7;檢查到DS18B20就點(diǎn)亮P1.7LEDLJMP TSR5TSR4:CLR FLAG1 ; 清標(biāo)志位,表示DS1820不存在CLR P1.1LJMP TSR7TSR5:MOV R0,#117TSR6:DJNZ R0,TSR6 ; 時序要求延時一段時間TSR7:SETB P2.2RET; 讀出轉(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;準(zhǔn)備讀溫度前先復(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.2RETREAD_18200: ; 讀DS18B20的程序,從DS18B20中讀出兩個字節(jié)的溫度數(shù)據(jù)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 R1DJNZ R4,RE00RET;顯示子程序display: mov a,29H;將29H中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制mov b,#10 ;10進(jìn)制/10=10進(jìn)制div abmov b_bit,a ;十位在amov a_bit,b ;個位在bmov 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 ;顯示1mssetb p2.7mov a,b_bit ;取十位數(shù)MOVC A,@A+DPTR ;查十位數(shù)的7段代碼mov p0,a ;送出十位的7段代碼clr p2.6 ;開十位顯示acall d1ms ;顯示1mssetb p2.6djnz r1,dplop ;100次沒完循環(huán)djnz r0,dpl1 ;4個100次沒完循環(huán)ret;1MS延時D1MS: MOV R7,#80DJNZ R7,$RET;實(shí)驗(yàn)板上的7段數(shù)碼管0~9數(shù)字的共陰顯示代碼numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBHEND
回答者:網(wǎng)友
產(chǎn)品精選
搜索問答
還沒有汽配人賬號?立即注冊

我要提問

汽配限時折扣

本頁是網(wǎng)友提供的關(guān)于“DS18B20溫度傳感器的使用方法”的解答,僅供您參考,汽配人網(wǎng)不保證該解答的準(zhǔn)確性。