📄 ds18b20.asm
字号:
;用P2.3口,在C51里这样调用:char Te=(char)read_tem(1)/16;
void dis_temperature()
{
Te=(float)read_tem(1)/16;
sprintf(buffer,"%05.2f'C",Te);
lcd_moveto(20);
lcd_strall(buffer);
lcd_moveto(36);
}
;请多指教!!
NAME READ_EXP;程序名
; int read_tem(char a)
?PR?_read_tem?READ_EXP SEGMENT CODE;代码段
?DT?_read_tem?READ_EXP SEGMENT DATA;数据段
PUBLIC _read_tem;公共符号
RSEG ?DT?_read_tem?READ_EXP;★可覆盖数据段
;?_read_tem? : ;起始地址
a?00: DS 1 ;传递参数字节
RSEG ?PR?_read_tem?READ_EXP
_read_tem:
NOP
MOV a?00,R7
ACALL RESET_PULSE
ACALL PRESENCE
MOV A,#0CCH
ACALL WRITE_BYTE
MOV A,#44H
ACALL WRITE_BYTE
JNB P2.3,$
ACALL RESET_PULSE
ACALL PRESENCE
MOV A,#0CCH
ACALL WRITE_BYTE
MOV A,#0BEH
ACALL WRITE_BYTE
ACALL READ_BYTE
MOV R7,A ;LSB STORED IN R7
ACALL READ_BYTE
MOV R6,A ;MSB STORED IN R6
ACALL RESET_PULSE
ACALL PRESENCE
RET
READ_BYTE:
MOV R3,#8
READ1:
CLR P2.3
NOP
NOP
SETB P2.3
NOP
NOP
NOP
MOV R5,A
MOV C,P2.3
MOV A,R5
MOV R2,#30
DJNZ R2,$
RRC A
DJNZ R3,READ1
RET
PRESENCE:
JB P2.3,$
JNB P2.3,$
RET
RESET_PULSE:
CLR P2.3
MOV R2,#250
DJNZ R2,$
SETB P2.3
MOV R2,#10
DJNZ R2,$
RET
WRITE_BYTE:
MOV R3,#8
WRITE:
RRC A
JC WRITE1
CLR P2.3
MOV R2,#30
DJNZ R2,$
SETB P2.3
NOP
NOP
NOP
NOP
DJNZ R3,WRITE
RET
WRITE1:
CLR P2.3
NOP
NOP
NOP
NOP
SETB P2.3
MOV R2,#30
DJNZ R2,$
DJNZ R3,WRITE
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -