程序的數(shù)據(jù)轉(zhuǎn)化子程序的40H~43H為什么是28H的低4位呢???如何確定出來的???疑惑啊~~~~
;使用DS18B20把溫度信號(hào)直接轉(zhuǎn)換成數(shù)字信號(hào)輸入單片機(jī) ;經(jīng)單片機(jī)處理后,將實(shí)時(shí)溫度顯示在兩個(gè)7段數(shù)碼管上 A_BIT EQU 20H ;存放個(gè)位數(shù)變量 B_BIT EQU 21H ;存放十位數(shù)變量 FLAG EQU 38H ;DS1820是否存在標(biāo)志 DQ EQU P2.7 ;DQ引腳由P2.7控制 MAIN:;主程序 ACALL RE_TEMP ;調(diào)用讀取溫度子程序 ACALL TURN ;調(diào)用數(shù)據(jù)轉(zhuǎn)化子程序 ACALL DISPLAY ;調(diào)用顯示子程序 JMP MAIN ;循環(huán) ;初始化及讀取溫度值子程序 RE_TEMP: SETB DQ ACALL RESET_1820;調(diào)用復(fù)位子程序 JB FLAG,ST ;判斷DS1820是否存在 RET ST: ;DS1820存在 MOV A,#0CCH ;跳過ROM匹配 ACALL WRITE_1820;調(diào)用寫入數(shù)據(jù)子程序 MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令 ACALL WRITE_1820;調(diào)用寫入數(shù)據(jù)子程序 ACALL RESET_1820;準(zhǔn)備讀溫度前先復(fù)位 MOV A,#0CCH ;跳過ROM匹配 ACALL WRITE_1820;調(diào)用寫入數(shù)據(jù)子程序 MOV A,#0BEH ;發(fā)出讀溫度命令 ACALL WRITE_1820;調(diào)用寫入數(shù)據(jù)子程序 ACALL READ_1820;調(diào)用數(shù)去數(shù)據(jù)子程序 RET ;復(fù)位子程序 RESET_1820: SETB DQ NOP CLR DQ ;------------------------ ;主機(jī)發(fā)出復(fù)位低脈沖 ;將數(shù)據(jù)線下拉至少500us MOV R1,#3 DLY:MOV R0,#107 DJNZ R0,$ DJNZ R1,DLY ;------------------------- ;然后拉高數(shù)據(jù)線 SETB DQ NOP NOP NOP ;--------------------------- ;等待DS1820回應(yīng) MOV R0,#25H T2: JNB DQ,T3 ;DQ=0,DS1820存在跳轉(zhuǎn) DJNZ R0,T2 ;等待16~60us JMP T4 ;DQ=1,DS1820不存在 ;-------------------------- ;DS1820存在 ;標(biāo)志位FLAG=1 T3: SETB FLAG JMP T5 ;--------------------------- ;DS1820不存在 ;標(biāo)志位FLAG=0 T4: CLR FLAG JMP T7 ;------------------------------ ;DS1820存在.時(shí)序要求延時(shí)一段時(shí)間 T5: MOV R0,#117 T6: DJNZ R0,T6 ;--------------------- T7: SETB DQ RET
;寫入子程序 WRITE_1820: MOV R2,#8;一共8位數(shù)據(jù) CLR C ;C=0 WR1: CLR DQ ;總線低位,開始寫入 MOV R3,#7 DJNZ R3,$;保持16us以上 RRC A ;把字節(jié)DATA分成8個(gè)位,環(huán)移給C MOV DQ,C;寫入一個(gè)位 MOV R3,#23 DJNZ R3,$;等待,48us SETB DQ;重新釋放總線 NOP DJNZ R2,WR1 ;寫入下一個(gè)位 SETB DQ RET
;讀取子程序 READ_1820: MOV R4,#2 ;讀出兩個(gè)字節(jié)的數(shù)據(jù) MOV R1,#29H ;低位存入29H,高位存入28H RE0: MOV R2,#8 ;數(shù)據(jù)一共8位 RE1: CLR C SETB DQ NOP NOP CLR DQ ;讀前,總線保持為低 NOP NOP NOP SETB DQ ;開始讀,總線釋放 MOV R3,#9 RE2: DJNZ R3,RE2 ;延時(shí)18us MOV C,DQ ;從總線讀到一個(gè)位 MOV R3,#23 RE3: DJNZ R3,RE3 ;等待50us RRC A ;把讀得的位值環(huán)移給A DJNZ R2,RE1;讀下一位 MOV @R1,A ;存低位(29H) DEC R1 ;存高位 (28H) DJNZ R4,RE0 RET
;數(shù)據(jù)轉(zhuǎn)化子程序 TURN: MOV A,29H MOV C,40H ;將28H中的最低位移入C RRC A MOV C,41H RRC A MOV C,42H RRC A MOV C,43H RRC A MOV 29H,A ;高位與低位合并,存入29H RET
;溫度顯示子程序 DISPLAY: MOV A,29H MOV B,#10 DIV AB MOV B_BIT,A ;十位在A MOV A_BIT,B ;個(gè)位在B MOV DPTR,#TAB ;指定查表起始地址 MOV R0,#4 DP1: MOV R1,#250 ;顯示100次 LOOP: MOV A,A_BIT ;取個(gè)位數(shù) MOVC A,@A+DPTR MOV P0,A CLR P3.1 ;開個(gè)位顯示 ACALL DELAY SETB P3.1 MOV A,B_BIT ;取十位顯示 MOVC A,@A+DPTR MOV P0,A CLR P3.0 ;開十位顯示 ACALL DELAY SETB P3.0 DJNZ R1,LOOP ;250次未完循環(huán) DJNZ R0,DP1 ;4個(gè)250次未完循環(huán) RET
;延時(shí)子程序 DELAY: ;160us MOV R7,#80 DJNZ R7,$ RET
;代碼表 TAB: DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H,82H,0F8H,80H,90H END
|