?? wengdu2.asm
字號(hào):
;這是關(guān)于單個(gè)DS18B20的測(cè)溫程序,數(shù)據(jù)腳為P1.5,晶振是11.059MHZ
;溫度傳感器18B20采用器件默認(rèn)的12位轉(zhuǎn)化,最大轉(zhuǎn)化時(shí)間要750毫秒
;內(nèi)存分配聲明
TEMPER_L EQU 31H ;用于保存讀出溫度的低字節(jié)
TEMPER_H EQU 30H ;用于保存讀出溫度的高字節(jié)
TEMPER_NUM EQU 32H ;FORMAT后的整數(shù)部分(integer),將兩字節(jié)的溫度整合成1字節(jié)
DAT BIT P1.5 ;DS18B20數(shù)據(jù)線
;------------------------------主函數(shù)開(kāi)始-----------------------------
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
CLR EA ;使用DS18B20一定要禁止中斷
MOV SP,#60H
MOV TEMPER_NUM,#30
START: LCALL GET_TEMPER ;調(diào)用讀溫度子程序
LCALL T_FORMAT ;將讀出的2字節(jié)溫度格式化
LCALL DISPLAY ;顯示溫度
AJMP START
;-----------------------DS18B20的溫度轉(zhuǎn)換子程序-----------------------
GET_TEMPER:
LCALL Set_18B20
MOV A,#0CCH ;跳過(guò)ROM匹配
LCALL WRITE_1820
MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
LCALL WRITE_1820
LCALL DISPLAY ;用顯示溫度(持續(xù)1s左右)來(lái)等待AD轉(zhuǎn)換結(jié)束,12位的話要轉(zhuǎn)換750ms
LCALL Set_18B20 ;準(zhǔn)備讀溫度前先初始化
MOV A,#0CCH ;跳過(guò)ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;發(fā)出讀溫度命令
LCALL WRITE_1820
LCALL READ_1820
RET
;--------------------------DS18B20初始化程序--------------------------
Set_18B20:
SETB DAT
NOP
CLR DAT
MOV R2,#250 ;主機(jī)發(fā)出延時(shí)500微秒的復(fù)位低脈沖
DJNZ R2,$
SETB DAT ;然后拉高數(shù)據(jù)線
MOV R2,#30
DJNZ R2,$ ;延時(shí)60us等待DS18B20回應(yīng)
JNB DAT,INIT1
JMP Set_18B20 ;超時(shí)而沒(méi)有響應(yīng),重新初始化
INIT1: MOV R2,#120
DJNZ R2,$ ;延時(shí)240us
JB DAT,INIT2 ;數(shù)據(jù)變高,初始化成功
JMP Set_18B20
INIT2: MOV R2,#240
DJNZ R2,$
RET
;-----------------寫DS18B20的子程序(有具體的時(shí)序要求)-----------------
WRITE_1820:
MOV R2,#8 ;一共8位數(shù)據(jù)
WR0: CLR DAT
MOV R3,#6
DJNZ R3,$
RRC A
MOV DAT,C
MOV R3,#20
DJNZ R3,$
SETB DAT
NOP
NOP
DJNZ R2,WR0
SETB DAT
RET
;------讀DS18B20的程序,從DS18B20中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)--------------------------
READ_1820:
MOV R4,#2 ;將溫度高位和低位從DS18B20中讀出
MOV R1,#TEMPER_L ;低位存入31H(TEMPER_L)
RE0: MOV R2,#8
RE1: SETB DAT
NOP
NOP
CLR DAT
NOP
NOP
SETB DAT
MOV R3,#4
DJNZ R3,$
MOV C,DAT
RRC A
MOV R3,#30
DJNZ R3,$
DJNZ R2,RE1
MOV @R1,A
DEC R1 ;高位存入30H(TEMPER_H)
DJNZ R4,RE0
RET
;----------整合讀出的1字節(jié)溫度(關(guān)于DS18B20讀出的2字節(jié)溫度格式請(qǐng)參考資料)----------
T_FORMAT:
MOV A,#0F0H
ANL A,TEMPER_L ; 舍去溫度低位中小數(shù)點(diǎn)后的四位溫度數(shù)值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1 ; 四舍五入去溫度值
INC TEMPER_NUM
TEMPER_COV1:
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A ;
RET
;---------------------------顯示溫度子程序----------------------------
DISPLAY:MOV R1,#250
MOV DPTR,#TAB
DISP1:MOV A,TEMPER_NUM
MOV B,#100
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
CALL D1MS
SETB P2.3
MOV A,B
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR P2.2
CALL D1MS
SETB P2.2
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P2.1
CALL D1MS
SETB P2.1
DJNZ R1,DISP1
RET
;-------------------------1mS延時(shí)(按12MHZ算)--------------------------
D1MS: MOV R7,#250
LOOP0: NOP
NOP
DJNZ R7,LOOP0
RET
;-------------------------共陰數(shù)碼管對(duì)應(yīng)字型表-------------------------
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;段碼表
; 0 1 2 3 4 5 6 7 對(duì)應(yīng)內(nèi)容
DB 7FH,6FH,77H,7CH,39H,5EH
; 8 9 A B C D
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -