📄 ds18b20.lst
字号:
A51 MACRO ASSEMBLER DS18B20 09/17/2004 11:10:57 PAGE 1
MACRO ASSEMBLER A51 V7.09
OBJECT MODULE PLACED IN Ds18b20.OBJ
ASSEMBLER INVOKED BY: C:\KEIL\C51\BIN\A51.EXE Ds18b20.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
0036 1 TEMPER_L EQU 36H ;存放读出温度低位数据
0035 2 TEMPER_H EQU 35H ;存放读出温度高位数据
0060 3 TEMPER_NUM EQU 60H ;存放转换后的温度值
0000 4 FLAG1 BIT 00H
00B3 5 DQ BIT P3.3 ;一线总线控制端口
6
0000 7 ORG 0000H
0000 020100 8 LJMP MAIN
0100 9 ORG 0100H
0100 10 MAIN:
0100 758170 11 MOV SP,#70H
0103 12010B 12 LCALL GET_TEMPER ;从DS18B20读出温度数据
0106 12019C 13 LCALL TEMPER_COV ;转换读出的温度数据并保存
0109 80FE 14 SJMP $ ;完成一次数字温度采集
15
16
17 ;-------读出转换后的温度值
010B 18 GET_TEMPER:
010B D2B3 19 SETB DQ ; 定时入口
010D 120224 20 BCD: LCALL INIT_1820
0110 200003 21 JB FLAG1,S22
0113 02010D 22 LJMP BCD ; 若DS18B20不存在则返回
0116 120278 23 S22: LCALL DELAY1
0119 74CC 24 MOV A,#0CCH ; 跳过ROM匹配------0CC
011B 120160 25 LCALL WRITE_1820
011E 7444 26 MOV A,#44H ; 发出温度转换命令
0120 120160 27 LCALL WRITE_1820
0123 00 28 NOP
0124 120268 29 LCALL DELAY
0127 120268 30 LCALL DELAY
012A 120224 31 CBA: LCALL INIT_1820
012D 200003 32 JB FLAG1,ABC
0130 02012A 33 LJMP CBA
0133 120278 34 ABC: LCALL DELAY1
0136 74CC 35 MOV A,#0CCH ; 跳过ROM匹配
0138 120160 36 LCALL WRITE_1820
013B 74BE 37 MOV A,#0BEH ; 发出读温度命令
013D 120160 38 LCALL WRITE_1820
0140 120178 39 LCALL READ_18200 ;READ_1820
0143 22 40 RET
41
42 ;-------读DS18B20的程序,从DS18B20中读出一个字节的数据
0144 43 READ_1820:
0144 7A08 44 MOV R2,#8
0146 C3 45 RE1: CLR C
0147 D2B3 46 SETB DQ
0149 00 47 NOP
014A 00 48 NOP
014B C2B3 49 CLR DQ
014D 00 50 NOP
014E 00 51 NOP
014F 00 52 NOP
0150 D2B3 53 SETB DQ
0152 7B07 54 MOV R3,#7
0154 DBFE 55 DJNZ R3,$
0156 A2B3 56 MOV C,DQ
0158 7B17 57 MOV R3,#23
015A DBFE 58 DJNZ R3,$
A51 MACRO ASSEMBLER DS18B20 09/17/2004 11:10:57 PAGE 2
015C 13 59 RRC A
015D DAE7 60 DJNZ R2,RE1
015F 22 61 RET
62
63 ;-------写DS18B20的程序
0160 64 WRITE_1820:
0160 7A08 65 MOV R2,#8
0162 C3 66 CLR C
0163 C2B3 67 WR1: CLR DQ
0165 7B06 68 MOV R3,#6
0167 DBFE 69 DJNZ R3,$
0169 13 70 RRC A
016A 92B3 71 MOV DQ,C
016C 7B17 72 MOV R3,#23
016E DBFE 73 DJNZ R3,$
0170 D2B3 74 SETB DQ
0172 00 75 NOP
0173 DAEE 76 DJNZ R2,WR1
0175 D2B3 77 SETB DQ
0177 22 78 RET
79
80 ;-------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
0178 81 READ_18200:
0178 7C02 82 MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
017A 7936 83 MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
017C 7A08 84 RE00: MOV R2,#8
017E C3 85 RE01: CLR C
017F D2B3 86 SETB DQ
0181 00 87 NOP
0182 00 88 NOP
0183 C2B3 89 CLR DQ
0185 00 90 NOP
0186 00 91 NOP
0187 00 92 NOP
0188 D2B3 93 SETB DQ
018A 7B07 94 MOV R3,#7
018C DBFE 95 DJNZ R3,$
018E A2B3 96 MOV C,DQ
0190 7B17 97 MOV R3,#23
0192 DBFE 98 DJNZ R3,$
0194 13 99 RRC A
0195 DAE7 100 DJNZ R2,RE01
0197 F7 101 MOV @R1,A
0198 19 102 DEC R1
0199 DCE1 103 DJNZ R4,RE00
019B 22 104 RET
105
106 ;-------将从DS18B20中读出的温度数据进行转换
019C 107 TEMPER_COV:
019C 74F0 108 MOV A,#0F0H
019E 5536 109 ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
01A0 C4 110 SWAP A
01A1 F560 111 MOV TEMPER_NUM,A
01A3 E536 112 MOV A,TEMPER_L
01A5 30E302 113 JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值
01A8 0560 114 INC TEMPER_NUM
115
01AA 116 TEMPER_COV1:
01AA E535 117 MOV A,TEMPER_H
01AC 5407 118 ANL A,#07H
01AE C4 119 SWAP A
01AF 2560 120 ADD A,TEMPER_NUM
01B1 F560 121 MOV TEMPER_NUM,A ; 保存变换后的温度数据
01B3 1201B7 122 LCALL BIN_BCD
01B6 22 123 RET
124
A51 MACRO ASSEMBLER DS18B20 09/17/2004 11:10:57 PAGE 3
125 ;-------将16进制的温度数据转换成压缩BCD码
01B7 126 BIN_BCD:
01B7 9001C0 127 MOV DPTR,#TEMP_TAB
01BA E560 128 MOV A,TEMPER_NUM
01BC 93 129 MOVC A,@A+DPTR
01BD F560 130 MOV TEMPER_NUM,A
01BF 22 131 RET
01C0 132 TEMP_TAB:
01C0 00010203 133 DB 00H,01H,02H,03H,04H,05H,06H,07H
01C4 04050607
01C8 08091011 134 DB 08H,09H,10H,11H,12H,13H,14H,15H
01CC 12131415
01D0 16171819 135 DB 16H,17H,18H,19H,20H,21H,22H,23H
01D4 20212223
01D8 24252627 136 DB 24H,25H,26H,27H,28H,29H,30H,31H
01DC 28293031
01E0 32333435 137 DB 32H,33H,34H,35H,36H,37H,38H,39H
01E4 36373839
01E8 40414243 138 DB 40H,41H,42H,43H,44H,45H,46H,47H
01EC 44454647
01F0 48495051 139 DB 48H,49H,50H,51H,52H,53H,54H,55H
01F4 52535455
01F8 56575859 140 DB 56H,57H,58H,59H,60H,61H,62H,63H
01FC 60616263
0200 64656667 141 DB 64H,65H,66H,67H,68H,69H,70H,71H
0204 68697071
0208 72737475 142 DB 72H,73H,74H,75H,76H,77H,78H,79H
020C 76777879
0210 80818283 143 DB 80H,81H,82H,83H,84H,85H,86H,87H
0214 84858687
0218 88899091 144 DB 88H,89H,90H,91H,92H,93H,94H,95H
021C 92939495
0220 96979899 145 DB 96H,97H,98H,99H
146
147 ;-------DS18B20初始化程序
0224 148 INIT_1820:
0224 D2B3 149 SETB DQ
0226 00 150 NOP
0227 C2B3 151 CLR DQ
0229 7880 152 MOV R0,#80H
022B D8FE 153 TSR1: DJNZ R0,TSR1 ; 延时
022D D2B3 154 SETB DQ
022F 7825 155 MOV R0,#25H ;96US-25H
0231 D8FE 156 TSR2: DJNZ R0,TSR2
0233 30B303 157 JNB DQ,TSR3
0236 02023E 158 LJMP TSR4 ; 延时
0239 D200 159 TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在
023B 020243 160 LJMP TSR5
023E C200 161 TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在
0240 020247 162 LJMP TSR7
0243 786B 163 TSR5: MOV R0,#06BH ;200US
0245 D8FE 164 TSR6: DJNZ R0,TSR6 ; 延时
0247 D2B3 165 TSR7: SETB DQ
0249 22 166 RET
167
168 ;-------重新写DS18B20暂存存储器设定值
024A 169 RE_CONFIG:
024A 200001 170 JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
024D 22 171 RET
024E 172 RE_CONFIG1:
024E 74CC 173 MOV A,#0CCH ; 发SKIP ROM命令
0250 120160 174 LCALL WRITE_1820
0253 744E 175 MOV A,#4EH ; 发写暂存存储器命令
0255 120160 176 LCALL WRITE_1820
177
0258 7400 178 MOV A,#00H ; TH(报警上限)中写入00H
A51 MACRO ASSEMBLER DS18B20 09/17/2004 11:10:57 PAGE 4
025A 120160 179 LCALL WRITE_1820
025D 7400 180 MOV A,#00H ; TL(报警下限)中写入00H
025F 120160 181 LCALL WRITE_1820
0262 747F 182 MOV A,#7FH ; 选择12位温度分辨率
0264 120160 183 LCALL WRITE_1820
0267 22 184 RET
185
186 ;------------------延时子程序
0268 187 DELAY:
0268 7F00 188 MOV R7,#00H
026A DF01 189 MIN: DJNZ R7,YS500
026C 22 190 RET
026D 120273 191 YS500: LCALL YS500US
0270 02026A 192 LJMP MIN
0273 7E00 193 YS500US:MOV R6,#00H
0275 DEFE 194 DJNZ R6,$
0277 22 195 RET
0278 7F20 196 DELAY1: MOV R7,#20H
027A DFFE 197 DJNZ R7,$
027C 22 198 RET
199
200 END
A51 MACRO ASSEMBLER DS18B20 09/17/2004 11:10:57 PAGE 5
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
ABC. . . . . . . . C ADDR 0133H A
ACC. . . . . . . . D ADDR 00E0H A
BCD. . . . . . . . C ADDR 010DH A
BIN_BCD. . . . . . C ADDR 01B7H A
CBA. . . . . . . . C ADDR 012AH A
DELAY. . . . . . . C ADDR 0268H A
DELAY1 . . . . . . C ADDR 0278H A
DQ . . . . . . . . B ADDR 00B0H.3 A
FLAG1. . . . . . . B ADDR 0020H.0 A
GET_TEMPER . . . . C ADDR 010BH A
INIT_1820. . . . . C ADDR 0224H A
MAIN . . . . . . . C ADDR 0100H A
MIN. . . . . . . . C ADDR 026AH A
P3 . . . . . . . . D ADDR 00B0H A
RE00 . . . . . . . C ADDR 017CH A
RE01 . . . . . . . C ADDR 017EH A
RE1. . . . . . . . C ADDR 0146H A
READ_1820. . . . . C ADDR 0144H A
READ_18200 . . . . C ADDR 0178H A
RE_CONFIG. . . . . C ADDR 024AH A
RE_CONFIG1 . . . . C ADDR 024EH A
S22. . . . . . . . C ADDR 0116H A
SP . . . . . . . . D ADDR 0081H A
TEMPER_COV . . . . C ADDR 019CH A
TEMPER_COV1. . . . C ADDR 01AAH A
TEMPER_H . . . . . N NUMB 0035H A
TEMPER_L . . . . . N NUMB 0036H A
TEMPER_NUM . . . . N NUMB 0060H A
TEMP_TAB . . . . . C ADDR 01C0H A
TSR1 . . . . . . . C ADDR 022BH A
TSR2 . . . . . . . C ADDR 0231H A
TSR3 . . . . . . . C ADDR 0239H A
TSR4 . . . . . . . C ADDR 023EH A
TSR5 . . . . . . . C ADDR 0243H A
TSR6 . . . . . . . C ADDR 0245H A
TSR7 . . . . . . . C ADDR 0247H A
WR1. . . . . . . . C ADDR 0163H A
WRITE_1820 . . . . C ADDR 0160H A
YS500. . . . . . . C ADDR 026DH A
YS500US. . . . . . C ADDR 0273H A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -