DS18b20和51單片機(jī)連接的匯編程序
TEMP_TAB:
DB00H,01H,02H,03H,04H,05H,06H,07H
DB08H,09H,10H,11H,12H,13H,14H,15H
DB16H,17H,18H,19H,20H,21H,22H,23H
DB24H,25H,26H,27H,28H,29H,30H,31H
DB32H,33H,34H,35H,36H,37H,38H,39H
DB40H,41H,42H,43H,44H,45H,46H,47H
DB48H,49H,50H,51H,52H,53H,54H,55H
DB56H,57H,58H,59H,60H,61H,62H,63H
DB64H,65H,66H,67H,68H,69H,70H
;//*****************************************//
下面還介紹一個(gè)ds18b20匯編程序
;**********************************
FLAG1 BIT F0 ;DS18B20存在標(biāo)志位
DQ BIT P1.7
TEMPER_L EQU 29H
TEMPER_H EQU 28H
A_BIT EQU 35H
B_BIT EQU 36H
;************ds18b20匯編程序起始********************
ORG 0000H
AJMP MAIN
ORG 0100H
;**************主程序開始************
MAIN:
LCALL INIT_18B20
;LCALL RE_CONFIG
LCALL GET_TEMPER
AJMP CHANGE
;**********DS18B20復(fù)位程序*****************
INIT_18B20: SETB DQ
NOP
CLR DQ
MOV R0,#0FBH
TSR1: DJNZ R0,TSR1 ;延時(shí)
SETB DQ
MOV R0,#25H
TSR2: JNB DQ ,TSR3
DJNZ R0,TSR2
TSR3: SETB FLAG1 ;置標(biāo)志位,表明DS18B20存在
CLR P2.0 ;二極管指示
AJMP TSR5
TSR4: CLR FLAG1
LJMP TSR7
TSR5: MOV R0,#06BH
TSR6: DJNZ R0,TSR6
TSR7:SETB DQ ;表明不存在
RET
;********************設(shè)定DS18B20暫存器設(shè)定值**************
;RE_CONFIG:
;JB FLAG1,RE_CONFIG1
;RET
;RE_CONFIG1: MOV A,#0CCH ;放跳過ROM命令
;LCALL WRITE_18B20
;MOV A,#4EH
;LCALL WRITE_18B20 ;寫暫存器命令
;MOV A,#00H ;報(bào)警上限中寫入00H
;LCALL WRITE_18B20
;MOV A,#00H ;報(bào)警下限中寫入00H
; LCALL WRITE_18B20
;MOV A,#1FH ;選擇九位溫度分辨率
; LCALL WRITE_18B20
; RET
;*****************讀轉(zhuǎn)換后的溫度值****************
GET_TEMPER:
SETB DQ
LCALL INIT_18B20
JB FLAG1,TSS2
RET ;若不存在則返回
TSS2: MOV A,#0CCH ;跳過ROM
LCALL WRITE_18B20
MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
LCALL WRITE_18B20
LCALL DISPLAY ;延時(shí)
LCALL INIT_18B20
MOV A,#0CCH ;跳過ROM
LCALL WRITE_18B20
MOV A,#0BEH ;發(fā)出讀溫度換命令
LCALL WRITE_18B20
LCALL READ2_18B20 ;讀兩個(gè)字節(jié)的溫度
RET
;***************寫ds18b20匯編程序************
WRITE_18B20:
MOV R2,#8
CLR C
WR1:
CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;***********讀18B20程序,讀出兩個(gè)字節(jié)的溫度*********
READ2_18B20:
MOV R4,#2 ;低位存在29 H,高位存在28H
MOV R1,#29H
RE00: MOV R2,#8
RE01: CLR C
SETB C
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;************讀出的溫度進(jìn)行數(shù)據(jù)轉(zhuǎn)換**************
CHANGE: MOV A,29H
MOV C,28H.0 ;將28H中的最低位移入C
RRC A
MOV C,28H.1
RRC A
MOV C,28H.2
RRC A
MOV C,28H.3
RRC A
MOV 29H,A
;setb p2.0
LCALL DISPLAY ;調(diào)用數(shù)碼管顯示子程序
; setb P2.0
LJMP MAIN
;*******************DISPLAY******
DISPLAY: mov a,29H;將29H中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制
mov b,#10 ;10進(jìn)制/10=10進(jìn)制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;個(gè)位在b
mov dptr,#TAB ;指定查表啟始地址
mov r0,#4
dpl1: mov r1,#250 ;顯示1000次
dplop: mov a,a_bit ;取個(gè)位數(shù)
MOVC A,@A+DPTR ;查個(gè)位數(shù)的7段代碼
mov p0,a ;送出個(gè)位的7段代碼
clr p2.5;開個(gè)位顯示
acall d1ms ;顯示1ms
setb p2.5
mov a,b_bit ;取十位數(shù)
MOVC A,@A+DPTR ;查十位數(shù)的7段代碼
mov p0,a ;送出十位的7段代碼
clr p2.4;開十位顯示
acall d1ms ;顯示1ms
setb p2.4
djnz r1,dplop ;100次沒完循環(huán)
djnz r0,dpl1 ;4個(gè)100次沒完循環(huán)
ret
;***********************************
D1MS: MOV R7,#80 ;1MS延時(shí)(按12MHZ算)
DJNZ R7,$
RET
;*************************
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
51單片機(jī)相關(guān)文章:51單片機(jī)教程
評論