📄 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 + -