ORG 0000H TEMPER_H EQU 40H ;用于保存讀出溫度的高8位 FLAG1 EQU 38H ;是否檢測到DS18B20標志位 A_BIT1 EQU 31H ;數(shù)碼管個位數(shù)存放內(nèi)存位置 B_BIT1 EQU 32H ;數(shù)碼管十位數(shù)存放內(nèi)存位置 D_BIT1 EQU 35H ;數(shù)碼管百位數(shù)存放內(nèi)存位置 DQ EQU P3.2 ;30H,31H,32H,33H: X 個位 十位 X MOD7: MOV SP,#60H LCALL GET_TEMPER ;調(diào)用讀溫度子程序 LCALL TEMPCOV LCALL DISPLAY ;調(diào)用數(shù)碼管顯示子程序 AJMP MOD7 TEMP0: INC A AJMP TEMP1 TEMPCOV: MOV A,TEMPER_L ;數(shù)據(jù)處理子程序TEMPCOV MOV B,#16 DIV AB JB B.3,TEMP0 TEMP1: MOV 34H,A ;將TEMPER_L的高四位右移四位,存入34H中(溫度值) MOV A,B ;將TEMPER_L的低四位X10/16得小數(shù)后一位數(shù). MOV B,#10 MUL AB MOV B,#16 DIV AB MOV 30H,A ;將小數(shù)后一位數(shù).存入30H中 MOV A,TEMPER_H ;TEMPER_H中存放高8位數(shù),權(quán)重16 MOV B,#16 MUL AB ADD A,34H ;34H中存入溫度值的整數(shù)部分 MOV B,#10 DIV AB MOV 31H,B ;個位存入31H中 MOV B,#10 ; DIV AB ; MOV 32H,B ;十位存入32H中 MOV B,#10 ; DIV AB ; MOV 35H,B ;百位存入33H中 MOV A,TEMPER_H MOV 33H,#10H ; JB ACC.7,EXIT7 MOV 33H,#00H EXIT7: RET INIT_1820: ;這是DS18B20復(fù)位初始化子程序 SETB DQ NOP CLR DQ ;主機發(fā)出延時537微秒的復(fù)位低脈沖 MOV R1,#3 TSR1: MOV R0,#107 DJNZ R0,$ DJNZ R1,TSR1 SETB DQ ;然后拉高數(shù)據(jù)線 NOP NOP NOP MOV R0,#25H TSR2: JNB DQ,TSR3 ;等待DS18B20回應(yīng) DJNZ R0,TSR2 LJMP TSR4 ;延時 TSR3: SETB FLAG1 ;置標志位,表示DS1820存在 LJMP TSR5 TSR4: CLR FLAG1 ;清標志位,表示DS1820不存在 LJMP TSR7 TSR5: MOV R0,#117 TSR6: DJNZ R0,TSR6 ;時序要求延時一段時間 TSR7: SETB DQ RET ;------------------------------------------------- GET_TEMPER: ;讀出轉(zhuǎn)換后的溫度值 SETB DQ LCALL INIT_1820 ;先復(fù)位DS18B20 JB FLAG1,TSS2 RET ;判斷DS1820是否存在?若DS18B20不存在則返回 TSS2: MOV A,#0CCH ;跳過ROM匹配 LCALL WRITE_1820 MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令 LCALL WRITE_1820 LCALL DISPLAY ;等待AD轉(zhuǎn)換結(jié)束,12位的話750微秒 LCALL INIT_1820 ;準備讀溫度前先復(fù)位 MOV A,#0CCH ;跳過ROM匹配 LCALL WRITE_1820 MOV A,#0BEH ;發(fā)出讀溫度命令 LCALL WRITE_1820 LCALL READ_18200 ;將讀出的溫度數(shù)據(jù)保存到35H/36H RET ;寫DS18B20的子程序(有具體的時序要求) WRITE_1820: MOV R2,#8 ;一共8位數(shù)據(jù) CLR C WR1: CLR DQ MOV R3,#6 DJNZ R3,$ RRC A &n |