📄 18b20.asm
字号:
;18B20测温程序晶振11.0592MHZ ,最高到127C,#7FFH
;液晶型号SMS0501E2,5位带背光
ORG 0000H
DQ EQU P3.7 ;DQ引脚由P2.5控制
DAT EQU P2.2 ;定义数据引脚
A_BIT EQU 20H ;存放个位数变量
B_BIT EQU 21H ;存放十位数变量
C_BIT EQU 22H ;存放百位
FUS EQU 39H ;负数标志位 27H.1
FLAG EQU 38H ;DS18B20是否存在标志 27H.0
ZHENSHU EQU 29H ; 整数部分存放地址
XIAOSHU EQU 23H ; 小数部分存放地址
CLKPIN BIT P1.0 ;用户自定义CLK对应引脚
DIPIN BIT P1.1 ;用户自定义DI对应引脚
LCDBUF EQU 41H ;用户自定义LCD缓冲区首地址
LCDBUFEND EQU 46H;LCDBUF+(N-1) ;用户自定义LCD缓冲区末地址(N表示几位显示缓冲区)
COL EQU 2FH.7;数码COL位
SJ1 EQU 41H;数码1位数据
SJ2 EQU 42H;数码2位数据
SJ3 EQU 43H;数码3位数据
SJ4 EQU 44H;数码4位数据
SJ5 EQU 45H;数码5位数据
LJMP SATA
ORG 0040H
SATA: CLR P1.2
MOV P2,#0FFH ;
MAIN: ACALL RE_TEMP ;调用读取温度子程序
ACALL TURN ;数据转化子程序
ACALL DISPLAY ;运算程序
LCALL XIANSHI ;显示子程序
JMP MAIN ;循环 主程序
RE_TEMP: ;初始化及读取温度值
SETB DQ
ACALL RESET_1820 ;调用复位子程序
JB FLAG, ST ;判断DS1820是否存在?
RET
ST: ;DS18B20存在
MOV A,#0CCH ;跳过ROM匹配
ACALL WRITE_1820 ;调用写入数据子程序
;ACALL READ_1820
;MOV A,#04EH
;ACALL WRITE_1820
;MOV A,#0AAH
;ACALL WRITE_1820
;MOV A,#0BBH
;ACALL WRITE_1820
;MOV A,#0CCH ;跳过ROM匹配
;ACALL WRITE_1820 ;调用写入数据子程序
MOV A,#44H ;发出温度转换命令
ACALL WRITE_1820 ;调用写入数据子程序
ACALL RESET_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
ACALL WRITE_1820 ;调用写入数据子程序
MOV A,#0BEH ;发出读温度命令
ACALL WRITE_1820 ;调用写入数据子程序
ACALL READ_1820 ;调用读取数据子程序 设置传感器
RET ;读取温度数据
RESET_1820: ;复位(有具体的时序要求)
SETB DQ
NOP
CLR DQ
;――――――――――――;主机发出复位低脉冲
LCALL YASS3
LCALL YASS3
;――――――――――――;然后拉高数据线
SETB DQ
NOP
NOP
NOP
;――――――――――――;等待DS18B20回应
MOV R0,#040H ;最长58.3us
T2: JNB DQ ,T3
DJNZ R0, T2
JMP T4
;――――――――――――;标志位FLAG=1,表示DS1820存在
T3: SETB FLAG
JMP T5
;――――――――――――;标志位FLAG=0,表示DS1820不存在
T4: CLR FLAG
JMP T7
;――――――――――――;时序要求延时一段时间
T5: LCALL YASS3
;――――――――――――
T7: SETB DQ
RET; 复位子程序
WRITE_1820: ;写入DS18B20(有具体的时序要求)
MOV R2,#8 ;一共8位数据
CLR C ;C=0
WR1:
CLR DQ ;总线低位,开始写入
MOV R3,#20 ;
DJNZ R3,$ ;保持16微秒以上
RRC A ;把字节DATA分成8个BIT环移给C
MOV DQ, C ;写入一个BIT
MOV R3,#100 ;47US
DJNZ R3,$ ;等待
SETB DQ ;重新释放总线
MOV R3,#7 ;
DJNZ R3,$
DJNZ R2,WR1 ;写入下一个BIT
SETB DQ
RET ; 写入子程序
READ_1820: ;将温度高位和低位读出
MOV R4,#9 ;读出两个字节的数据
MOV R1,#30H ;低位存入30H,高位存入31h
RE0:
MOV R2,#8 ;数据一共有8位
RE1:
CLR C
SETB DQ
NOP
CLR DQ ;读前总线保持为低
NOP
NOP
NOP
SETB DQ ;开始读总线释放
MOV R3,#20
RE2:
DJNZ R3,RE2 ;延时18微妙
MOV C, DQ ;从总线读到一个BIT
MOV R3,#100
RE3: DJNZ R3,RE3 ;等待50微妙
RRC A ;把读得的位值环移给A
DJNZ R2,RE1 ;读下一个BIT
MOV @R1,A
INC R1
DJNZ R4,RE0
RET; 读取子程序
TURN:MOV A,31H ;数据分离把整数部分取出放到ZHENGSHU内
SWAP A
ANL A,#0F0H
MOV 40H,A
MOV A,30H
ANL A,#0FH
MOV XIAOSHU,A ;把小数部分放到XIAOSHU中
MOV A,30H
SWAP A
ANL A,#0FH
ADD A,40H
MOV ZHENSHU,A
JB ZHENSHU.7,FUSHU
CLR FUS
RET
FUSHU:MOV A,XIAOSHU
CPL A
ANL A,#0FH
MOV XIAOSHU,A
MOV A,ZHENSHU
CPL A
SETB FUS
MOV ZHENSHU,A
RET; 数据转化子程序
SBCDM: MOV 24H,#062H ;确定乘数
MOV R0,#XIAOSHU ;计算数据小数
MOV A,@R0
MOV R1,A ;将被乘数暂存到R1
MOV R7,#03H
CLR A
MOV @R0,A
LOOP0: MOV R0,#23H ;指向乘积
XCHD A,@R0 ;交换底四位
MOV R4,A
MOV A,@R0 ;高四位右移四次
SWAP A
MOV @R0,A
INC R0 ;指向乘积
MOV A,R4 ;取回低四位
XCHD A,@R0
MOV R2,A ;暂存乘数
MOV A,@R0 ;乘数高四位右移四次
SWAP A
MOV @R0,A ;乘数高四位移入低四位
MOV A,R2 ;判断乘数低四位是否为0
JZ LOOP3
DEC R0 ;指向乘积
MOV A,@R0
MOV R3,#00h
LOOP1: CLR C
ADD A,R1
DA A
JNC LOOP2
INC R3
LOOP2: DJNZ R2,LOOP1
MOV @R0,A
MOV A,R3
LOOP3: DJNZ R7,LOOP0
RET
DISPLAY: ;将29H中的十六进制数成10进制
MOV DPTR,#TABLE ;指定查表启始地址
MOV A,XIAOSHU ;小数部分转换为十进制数
MOV B,#10
DIV AB
SWAP A
ORL A,B
MOV XIAOSHU,A
CALL SBCDM
MOV A,23H
MOVC A,@A+DPTR
MOV SJ4,A
MOV A,24H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV SJ5,A
MOV A,29H
MOV B,#100 ;10进制/10=10进制
DIV AB
MOV C_BIT, A ;百位位在A
MOV A,#10
XCH A,B
DIV AB
MOV B_BIT,A
MOV A_BIT, B ;个位在B
MOV A,A_BIT
ANL A,#0FH
MOVC A,@A+DPTR
SUBB A,#040H
MOV SJ3,A ;送个位数数据
MOV A,B_BIT
MOVC A,@A+DPTR
MOV SJ2,A ; 送十位数数据
JB FUS,FUBIAO
MOV A,C_BIT
MOVC A,@A+DPTR
MOV SJ1,A ; 送百位数数据
CJNE A,#041H,QINGBAI
MOV SJ1,#0ffH
RET
FUBIAO: MOV SJ1,#0FEH
QINGBAI: RET
;*******************************************显示程序
XIANSHI:
MOV R1,#LCDBUF
TSR_PA: MOV A,@R1
CALL TRANSBYTE
INC R1
CJNE R1,#LCDBUFEND,TSR_PA
RET
TRANSBYTE:
MOV R0,#8
TSB_PA: RRC A
CALL TRANSBIT
DJNZ R0,TSB_PA
RRC A
RET
TRANSBIT:
MOV DIPIN,C ;先送数据到数据口线DI
SETB CLKPIN ;再使时钟口线发一个负脉冲
CLR CLKPIN
SETB CLKPIN
RET
YANSS: MOV R0,#02FH
YS2: MOV R1,#0FFH
YS1: MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,YS1
DJNZ R0,YS2
RET
DELAY:MOV R7,#200
DJNZ R7,$ ;
RET ; 延时子程序
YASS: MOV 23H,#01H ;1.9us
DJNZ 23H,$
RET
YASS1:MOV 23H,#01DH ;14.6us
DJNZ 23H,$
RET
YASS2:MOV 23H,#3FH ;29.6us
DJNZ 23H,$
RET
YASS3:MOV 23H,#02H ;233.2us
YAS1: MOV 24H,#0FFH
DJNZ 24H,$
DJNZ 23H,YAS1
RET
DLY5: NOP
NOP
NOP
NOP
RET
TABLE:DB 041H,077H,0C2H,052H,074H,058H ;0,1,2,3,4,5,
DB 048H,073H,040H,050H,060H,04CH ;6,7,8,9,A,B,
DB 0C9H,046H,0C8H,0E8H ;C,D,E,F
END ; 程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -