?? lcd讀取序列號.asm
字號:
RS EQU P2.5
RW EQU P2.6
E EQU P2.7
LCD EQU P1
TEMPER_L EQU 31H ;保存讀出溫度的低字節
TEMPER_H EQU 30H ;保存讀出溫度的高字節
FLAG BIT 20H ;標志位
DAT BIT P2.4 ;DS18B20數據線
;------------------------------主函數開始-----------------------------
ORG 0000H
MAIN:
MOV LCD,#01H
ACALL ENABLE
MOV LCD,#38H
ACALL ENABLE
MOV LCD,#0FH
ACALL ENABLE
MOV LCD,#06H
ACALL ENABLE
;###############################################################
;###############################################################
START: ; ####
LCALL Set_18B20 ;調用初使化子程序 ; 這段是 ####
MOV A,#033H ; 不 ####
LCALL WRITE_1820 ;送入讀ROM 命令 ; 是 ####
LCALL READ ; 你 ####
; 要 ####
MOV 50H,A ; 找 ####
LCALL READ ; 的程序 ####
; ####
MOV 51H,A ; ####
LCALL READ ; ? ####
MOV 52H,A ; ####
LCALL READ ; ####
MOV 53H,A ; ####
LCALL READ ; ####
MOV 54H,A ; ####
LCALL READ ; ####
MOV 55H,A ; ####
LCALL READ ; ####
MOV 56H,A ; ####
LCALL READ ; ####
MOV 57H,A ; ####
;###############################################################
;###############################################################
MOV R0,#50H
MOV R7,#80H
DIPSP: ACALL CHAIZI
MOV DPTR,#TAB
MOV A,7FH
MOVC A,@A+DPTR
MOV LCD,R7
ACALL ENABLE
; MOV A,@R0
ACALL WRITE
ACALL BUSY
MOV DPTR,#TAB
MOV A,7EH
MOVC A,@A+DPTR
MOV LCD,R7
ACALL ENABLE
; MOV A,@R0
ACALL WRITE
ACALL BUSY
INC R7
INC R0
CJNE R0,#58H,DIPSP
SJMP $
AJMP START
CHAIZI:MOV A,@R0
MOV B,A
ANL A,#0FH
MOV 7FH,A
MOV A,B
SWAP A
ANL A,#0FH
MOV 7EH,A
RET
;-----------------------DS18B20的溫度轉換子程序-----------------------
GET_TEMPER:
LCALL Set_18B20
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE_1820
MOV A,#44H ;發出溫度轉換命令
LCALL WRITE_1820
LCALL DELAY; DISPLAY ;用顯示溫度(持續1s左右)來等待AD轉換結束,12位的話要轉換750ms
LCALL Set_18B20 ;準備讀溫度前先初始化
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;發出讀溫度命令
LCALL WRITE_1820
LCALL READ_1820
RET
;--------------------------DS18B20初始化程序--------------------------
Set_18B20:
SETB DAT
NOP
CLR DAT
MOV R2,#250 ;主機發出延時500微秒的復位低脈沖
DJNZ R2,$
SETB DAT ;然后拉高數據線
MOV R2,#30
DJNZ R2,$ ;延時60us等待DS18B20回應
JNB DAT,INIT1
JMP Set_18B20 ;超時而沒有響應,重新初始化
INIT1: MOV R2,#120
DJNZ R2,$ ;延時240us
JB DAT,INIT2 ;數據變高,初始化成功
JMP Set_18B20
INIT2: MOV R2,#240
DJNZ R2,$
RET
;-----------------寫DS18B20的子程序(有具體的時序要求)-----------------
WRITE_1820:
MOV R2,#8 ;一共8位數據
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
READ:
CLR A
MOV B,#8 ;連續讀8 個bit
CLR C
RE1: SETB DAT
LCALL DELAY2us
CLR DAT ;讀前總線保持為低
LCALL DELAY2us
SETB DAT ;開始讀總線釋放
LCALL DELAY6us ;持續8us
LCALL DELAY3us
LCALL DELAY6us ; LCALL DELAY6us ;持續8us持續8us
MOV C,DAT ;從ds1820 總線讀得一個bit
RRC A ;把讀得的位值環移給 A
MOV R1,#10
LOOP6: LCALL DELAY6us
DJNZ R1,LOOP6 ;持續60us
DJNZ B,RE1 ;讀下一個bit
SETB DAT ;重新釋放ds1820 總線
RET
;------讀DAT的程序,從DAT中讀出兩個字節的溫度數據--------------------------
READ_1820:
MOV R4,#2 ;將溫度高位和低位從DAT中讀出
MOV R1,#TEMPER_L ;低位存入31H(TEMPER_L)
RE0: MOV R2,#8
RE11: 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,RE11
MOV @R1,A
DEC R1 ;高位存入30H(TEMPER_H)
DJNZ R4,RE0
RET
MOV LCD,#80H
ACALL ENABLE
MOV A,#'R'
ACALL WRITE
ACALL BUSY
WRITE: ACALL BUSY
CLR E
SETB RS
CLR RW
SETB E
MOV LCD,A
CLR E
RET
ENABLE: CLR RS
CLR RW
CLR E
ACALL BUSY
SETB E
RET
BUSY: MOV LCD,#0FFH
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,BUSY
RET
DELAY: MOV R7,#0FFH
DE1: MOV R6,#0FFH
DE2: MOV R5,#2
DJNZ R5,$
DJNZ R6,DE2
DJNZ R7,DE1
RET
DELAY2us:NOP
NOP
RET
DELAY3us:NOP
NOP
NOP
RET
DELAY6us:NOP
NOP
NOP
NOP
NOP
NOP
RET
TAB:
DB 30H,30H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -