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