📄 wendu.asm
字号:
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位(特别是可位寻址,程序中用的着哦)
FLAG1 EQU 38H;是否检测到DS18B20标志位
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV R0,#00H ;内部RAM低128字节清0
MOV R1,#80H
MAIN1: MOV @R0,#00H
INC R0
DJNZ R1,MAIN1
MOV SP,#60H
MAIN2: LCALL INIT_1820;调用复位DS18B20子程序
LCALL GET_TEMPER;调用读温度子程序
MOV A,TEMPER_L
MOV C,40H;将28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV 29H,A
JNB ACC.0,loop8
MOV 34H,#05H
AJMP loop0
loop8: mov 34h,#00h
loop0: mov 33h,#0ah
clr c
rrc a ;移除小数部分
mov b,#64h
div ab
mov 30h,a
mov a,#0ah
xch a,b
div ab
MOV 31H,A
MOV 32H,B
lcall DISPLAY
AJMP MAIN2
DISPLAY: PUSH PSW
PUSH ACC
SETB RS0
CLR C
MOV R0,#30H ;显示缓冲区首地址
MOV R2,#08H
MOV R3,#01H
LOOP2: MOV A,@R0 ;读显示数据
MOV DPTR,#TAB
MOVC A,@A+DPTR ; 转换为字行码
CLR C
LOOP: RLC A
MOV P1.0,C ;将字行码送595移位寄存器
CLR P1.1
SETB P1.1
CLR P1.1
DJNZ R2,LOOP
MOV R2,#08H
MOV A,R3 ;将位码送595移位寄存器
CLR C
LOOP1: RLC A
MOV P1.0,C
CLR P1.1
SETB P1.1
CLR P1.1
DJNZ R2,LOOP1
CLR P1.2 ;595锁存
SETB P1.2
CLR P1.2
ACALL DIMS
INC R0 ;显示缓冲区地址加1
MOV A,R3
JB ACC.4,QUIT
RL A
MOV R3,A
MOV R2,#08H
AJMP LOOP2
QUIT: POP ACC
POP PSW
CLR RS0
RET
DIMS: MOV R7,#02H
DL: MOV R6,#0FFH
DL1: DJNZ R6,DL1
DJNZ R7,DL
RET
D1S: MOV R7,#0AH
DL5: MOV R6,#0FFH
DL4: MOV R5,#0FFH
DL2: DJNZ R5,DL2
DL3: DJNZ R6,DL4
DJNZ R7,DL5
RET
GET_TEMPER: SETB P3.3 ; 定时入口
LCALL INIT_1820;先复位DS18B20
JB FLAG1,TSS2
RET
TSS2: MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL DIMS;这里通过调用子程序实现延时一段时间,等待AD转换结束,12位的话750微秒.
LCALL INIT_1820;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200; 将读出的温度低位字节送TEMPER_L
mov TEMPER_L,a
LCALL READ_18200; 将读出的温度高位字节送TEMPER_H
mov TEMPER_H,a
RET
; DS18B20复位初始化程序
INIT_1820:SETB P3.3
MOV R2,#200;主机发出延时600微秒的复位低脉冲
ini11: CLR p3.3
DJNZ R2,ini11
SETB p3.3 ;然后拉高数据线
MOV R2,#30
ini12: DJNZ R2,ini12 ;延时60微秒,等待DS18B20回应
clr c
ORL c,p3.3 ;DS18B20数据线变低码
jc INI16 ;DS18B20未准备好
SETB FLAG1
mov r6,#80
ini13: orl c,p3.3
jc ini14 ;DS18B20数据线变高,初始化成功
djnz r6,ini13
AJMP INI16
ini14: mov r2,#240
ini15: djnz r2,ini15
SETB P3.3
ret
INI16: CLR FLAG1
SETB P3.3
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820: MOV R3,#8; 一共8位数据
wr11: setb p3.3
mov r4,#8
rrc a ;写入位从A中移到CY
clr p3.3
wr12: djnz r4,wr12 ;等待16微秒
mov p3.3,c ;命令字按位依次送给DS18B20
mov r4,#20
wr13: djnz r4,wr13
djnz r3,wr11
setb p3.3
ret
; 读DS18B20的程序
READ_18200: MOV R6,#8 ; 一共8位数据
rd11: clr p3.3
mov r4,#4 ;低电平持续2微秒
nop
setb p3.3 ;口线设为输入
rd12: djnz r4,rd12 ;等待8微秒
mov c,p3.3
rrc a
mov r5,#30
rd13: djnz r5,rd13 ;保证读过程持续60微秒
djnz r6,rd11
setb p3.3
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H, 82H,0F8H,80H,90H,7FH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -