?? main.asm
字號(hào):
MAINP SEGMENT CODE ;程序段
PUBLIC MAIN ;入口地址,跳轉(zhuǎn)到DL標(biāo)號(hào)處執(zhí)行匯編程序
RSEG MAINP ;程序段
;這是關(guān)于DS18B20的讀寫程序,數(shù)據(jù)腳IN,晶振12MHZ
;溫度傳感器18B20匯編程序,采用器件默認(rèn)的12位轉(zhuǎn)化,最大轉(zhuǎn)化時(shí)間750微秒
;可以將檢測(cè)到的溫度直接顯示到AT89C51開發(fā)實(shí)驗(yàn)板的兩個(gè)數(shù)碼管上
;顯示溫度00到99度,很準(zhǔn)確哦~~無需校正!
;單片機(jī)內(nèi)存分配申明!
TEMPER_L EQU 29H;用于保存讀出溫度的低8位
TEMPER_H EQU 28H;用于保存讀出溫度的高8位
in equ P3.3
MAIN:
LCALL GET_TEMPER;調(diào)用讀溫度子程序
;進(jìn)行溫度顯示,這里我們考慮用網(wǎng)站提供的兩位數(shù)碼管來顯示溫度
;顯示范圍00到99度,顯示精度為1度
;因?yàn)?2位轉(zhuǎn)化時(shí)每一位的精度為0.0625度,我們不要求顯示小數(shù)所以可以拋棄29H的低4位
;將28H中的低4位移入29H中的高4位,這樣獲得一個(gè)新字節(jié),這個(gè)字節(jié)就是實(shí)際測(cè)量獲得的溫度
;這個(gè)轉(zhuǎn)化溫度的方法可是我想出來的哦~~非常簡潔無需乘于0.0625系數(shù)
MOV A,29H
MOV B,28H
MOV C,B.0;將28H中的最低位移入C
RRC A
MOV C,B.1
RRC A
MOV C,B.2
RRC A
MOV C,B.3
RRC A
MOV 29H,A
RET
; 這是DS18B20復(fù)位初始化子程序
INIT_1820:
SETB IN
NOP
CLR IN
;主機(jī)發(fā)出延時(shí)537微秒的復(fù)位低脈沖
MOV R1,#3
TSR1:MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB IN;然后拉高數(shù)據(jù)線
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB IN,TSR3;等待DS18B20回應(yīng)
DJNZ R0,TSR2
LJMP TSR4 ; 延時(shí)
TSR3:
;SETB FLAG1 ; 置標(biāo)志位,表示DS1820存在
LJMP TSR5
TSR4:
;CLR FLAG1 ; 清標(biāo)志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ; 時(shí)序要求延時(shí)一段時(shí)間
TSR7:
SETB IN
RET
; 讀出轉(zhuǎn)換后的溫度值
GET_TEMPER:
SETB IN
LCALL INIT_1820;先復(fù)位DS18B20
;JB FLAG1,TSS2
;CLR P1.2
;RET ; 判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:
;CLR P1.3;DS18B20已經(jīng)被檢測(cè)到!!!!!!!!!!!!!!!!!!
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 發(fā)出溫度轉(zhuǎn)換命令
LCALL WRITE_1820
;這里通過調(diào)用顯示子程序?qū)崿F(xiàn)延時(shí)一段時(shí)間,等待AD轉(zhuǎn)換結(jié)束,12位的話750微秒
;LCALL D1MS;DISPLAY
LCALL INIT_1820;準(zhǔn)備讀溫度前先復(fù)位
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 發(fā)出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200; 將讀出的溫度數(shù)據(jù)保存到35H/36H
RET
;寫DS18B20的子程序(有具體的時(shí)序要求)
WRITE_1820:
MOV R2,#8;一共8位數(shù)據(jù)
CLR C
WR1:
CLR IN
MOV R3,#6
DJNZ R3,$
RRC A
MOV IN,C
MOV R3,#23
DJNZ R3,$
SETB IN
NOP
DJNZ R2,WR1
SETB IN
RET
; 讀DS18B20的程序,從DS18B20中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)
READ_18200:
MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;數(shù)據(jù)一共有8位
RE01:
CLR C
SETB IN
NOP
NOP
CLR IN
NOP
NOP
NOP
SETB IN
MOV R3,#9
RE10:
DJNZ R3,RE10
MOV C,IN
MOV R3,#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
end
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -