俺把程序补上吧... DQ BIT P3.3 //18B20单口数据总线
TEMP EQU 36H //读出(温度)高速暂存器(ram)的2个字节去掉小数和负数的存放单元
RS BIT P2.0 //1602 命令.数据选择端
RW BIT P2.1 //1602 写读( 数据.命令)选择端
E BIT P2.2 //1602 脉冲控制
COM EQU 40H //1602命令存放单元
DAT EQU 41H //1602 数据存放单元
ORG 0000H
AJMP MAIN
ORG 0020H
MAIN: LCALL init_1602 //1602液晶初始化
A5: LCALL TEMP //温度转换及采集
LCALL DOWITH //温度数据处理
lcall display_1602 //1602液晶显示
SJMP A5
TEM: LCALL INIT_1820 //温度采集子程序
MOV A,#0CCH //跳过ROM
LCALL WRITE
MOV A,#44H //温度转换指令
LCALL WRITE
mov r2,#50 //延时最少750ms
m5: LCALL DELAY_10MS
djnz r2,m5
LCALL INIT_1820
MOV A,#0CCH
LCALL WRITE
MOV A,#0BEH //读暂存器温度指令
LCALL WRITE
LCALL INIT_1820
LCALL READ
RET
INIT_1820: SETB DQ //初始化子程序
NOP
NOP
M3: CLR DQ
MOV R3,#35 //总线拉低延时480-960us之间 700us
LCALL DELAY1
SETB DQ
MOV R3,#20 //总线释放延时15-60us之间 40us
DJNZ R3,$
JNB DQ,M2 //判断DQ是否被拉低
AJMP M3
M2: MOV R3,#7
LCALL DELAY1 //存在(应答)脉冲时间 60—240us 140us
SETB DQ
MOV R3,#15
LCALL DELAY1
NOP
RET
WRITE: CLR C //写入子程序
MOV R2,#8
setb dq
L1: nop
nop //两次写入的位数据保持至少1Us
CLR DQ //写时间片开始
MOV R3,#4 //拉低总线至1us以上 8us
DJNZ R3,$
RRC A
MOV DQ,C //写入数据
MOV R3,#40
DJNZ R3,$ //15us—60us内18b20进行数据采样 80
DJNZ R2,L1
SETB DQ
RET
READ: MOV R1,#2 //读子程序
MOV R0,#30H //低八位存放30h单元
M6: MOV R2,#8
SETB DQ
CLR A
M4: nop //两次写入的位数据保持至少1Us
nop
CLR C
CLR DQ //读时间片开始
MOV R3,#2 //拉低总线至1us以上 4us
DJNZ R3,$
SETB DQ //释放总线
MOV R3,#3 //从读时间片开始15us内主机进行数据采用 6us
DJNZ R3,$
MOV C,DQ //读数据线
RRC A
MOV R3,#35
DJNZ R3,$ //读时间片最少60us—120us之间 70us
SETB DQ
DJNZ R2,M4
MOV @R0,A
INC R0 //高八位存放31h单元
DJNZ R1,M6
RET
DOWITH: MOV A,30H //数据处理子程序(2个温度寄存器) 只保留高字节的低3位和低字节的高4位 组成新的字节转换成十进制存放在百位33h 十位34h 个位35h单元
ANL A,#0F0H
SWAP A
MOV TEMP,A
MOV A,31H
ANL A,#07H
SWAP A
ORL A,TEMP
MOV B,#100
DIV AB
MOV 33H,A
MOV A,B
MOV B,#10
DIV AB
MOV 34H,A
MOV 35H,B
RET
display_1602:
MOV DPTR,#TABL
MOV COM,#83H //1602第一行显示温度值
LCALL WRITE_1602_COM
MOV A,33H
MOVC A,@A+DPTR
MOV DAT,A
lcall WRITE_1602_DAT
MOV COM,#84H
LCALL WRITE_1602_COM
MOV A,34H
MOVC A,@A+DPTR //转换成ASCII码让液晶显示
MOV DAT,A
lcall WRITe_1602_DAT
MOV COM,#85H
LCALL WRITE_1602_COM
MOV A,35H
MOVC A,@A+DPTR
MOV DAT,A
lcall WRITE_1602_DAT
ret
TABL:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
INIT_1602: MOV COM,#38H
LCALL WRITE_1602_COM //初始化1602
MOV COM,#06H
LCALL WRITE_1602_COM
MOV COM,#01H
LCALL WRITE_1602_COM
MOV COM,#0FH
LCALL WRITE_1602_COM
RET
WRITE_1602_COM: CLR RS
CLR rw
SETB E //向1602写命令
MOV p0,COM
MOV R7,#200
LCALL DELAY_10MS
DJNZ R7,$
CLR E
RET
WRITe_1602_DAT: SETB RS //向1602写数据
CLR rw
SETB E
MOV p0,DAT
MOV R7,#200
LCALL DELAY_10MS
DJNZ R7,$
CLR E
RET
DELAY1:MOV R2,#5 //20us 延时改变R3可改变延时
M1: NOP
DJNZ R2,M1
DJNZ R3,DELAY1
RET
DELAY_10ms: MOV R7,#10
W2: MOV R6,#250
W1: NOP
NOP
DJNZ R6,W1
DJNZ R7,W2
RET
end |