⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1820.asm

📁 DS1820汇编读写程序 包含从DS18B20中读出的温度数据进行转换和DS18B20暂存存储器设定值BCD数据转换
💻 ASM
字号:
晶振:12M
TEMPER_L EQU 36H
TEMPER_H EQU 35H
TEMPER_NUM EQU 60H
FLAG1 BIT 00H
DQ BIT P3.3 
AAA:MOV SP #70H
LCALL GET_TEMPER
LCALL TEMPER_COV
LJMP AAA
NOP
;------------------读出转换后的温度值
GET_TEMPER:
SETB DQ ; 定时入口
BCD:LCALL INIT_1820
JB FLAG1 S22
LJMP BCD ; 若DS18B20不存在则返回

S22:LCALL DELAY1
MOV A #0CCH ; 跳过ROM匹配------0CC
LCALL WRITE_1820
MOV A #44H ; 发出温度转换命令
LCALL WRITE_1820
NOP
LCALL DELAY
LCALL DELAY
CBA:LCALL INIT_1820
JB FLAG1 ABC
LJMP CBA
ABC:LCALL DELAY1
MOV A #0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A #0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;READ_1820
RET
;------------------读DS18B20的程序 从DS18B20中读出一个字节的数据
READ_1820:
MOV R2 #8
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3 #7
DJNZ R3 $
MOV C DQ
MOV R3 #23
DJNZ R3 $
RRC A
DJNZ R2 RE1
RET

;-------------------写DS18B20的程序
WRITE_1820:
MOV R2 #8
CLR C
WR1:
CLR DQ
MOV R3 #6
DJNZ R3 $
RRC A
MOV DQ C
MOV R3 #23
DJNZ R3 $
SETB DQ
NOP
DJNZ R2 WR1
SETB DQ
RET
;-------------------读DS18B20的程序 从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R4 #2 ; 将温度高位和低位从DS18B20中读出
MOV R1 #36H ; 低位存入36H(TEMPER_L) 高位存入35H(TEMPER_H)
RE00:
MOV R2 #8
RE01:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3 #7
DJNZ R3 $
MOV C DQ
MOV R3 #23
DJNZ R3 $
RRC A
DJNZ R2 RE01
MOV @R1 A
DEC R1
DJNZ R4 RE00
RET

;-------------------将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
MOV A #0F0H
ANL A TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM A
MOV A TEMPER_L
JNB ACC.3 TEMPER_COV1 ; 四舍五入去温度值
INC TEMPER_NUM

TEMPER_COV1:
MOV A TEMPER_H
ANL A #07H
SWAP A
ORL A TEMPER_NUM
MOV TEMPER_NUM A ; 保存变换后的温度数据
LCALL BIN_BCD
RET
;-------------------将16进制的温度数据转换成压缩BCD码
BIN_BCD:
MOV DPTR #TEMP_TAB
MOV A TEMPER_NUM
MOVC A @A+DPTR
MOV TEMPER_NUM A
RET

TEMP_TAB:
DB 00H 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 DQ
NOP
CLR DQ
MOV R0 #80H
TSR1:
DJNZ R0 TSR1 ; 延时
SETB DQ
MOV R0 #25H ;96US-25H
TSR2:
DJNZ R0 TSR2
JNB DQ TSR3
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位 表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位 表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0 #06BH ;200US
TSR6:
DJNZ R0 TSR6 ; 延时
TSR7:
SETB DQ
RET
;------------------重新写DS18B20暂存存储器设定值
RE_CONFIG:
JB FLAG1 RE_CONFIG1 ; 若DS18B20存在 转RE_CONFIG1
RET
RE_CONFIG1:
MOV A #0CCH ; 发SKIP ROM命令
LCALL WRITE_1820
MOV A #4EH ; 发写暂存存储器命令
LCALL WRITE_1820

MOV A #00H ; TH(报警上限)中写入00H
LCALL WRITE_1820
MOV A #00H ; TL(报警下限)中写入00H
LCALL WRITE_1820
MOV A #7FH ; 选择12位温度分辨率
LCALL WRITE_1820
RET
;------------------延时子程序
DELAY:MOV R7 #00H
MIN:DJNZ R7 YS500
RET
YS500:LCALL YS500US
LJMP MIN
YS500US:MOV R6 #00H
DJNZ R6 $
RET
DELAY1:MOV R7 #20H
DJNZ R7 $
RET


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -