📄 ds18b20.lst
字号:
0003 FB 169 mov r3,a;
0004 120000 F 170 call reset_ds18b20; //
0007 74CC 171 mov A,#0cch; //跳跃ROM命令
0009 120000 F 172 call write_byte;
000C 74BE 173 mov A,#0beh; //读暂存器命令
000E 120000 F 174 call write_byte;
0011 175 r_scrat_loop:
0011 120000 F 176 call read_byte;
0014 F6 177 mov @r0,a;
0015 08 178 inc r0;
0016 DBF9 179 djnz r3,r_scrat_loop;
0018 120000 F 180 call reset_ds18b20;
001B 22 181 ret
182
183
184 ;================================================================================
185 ;主机写单从设备的3个暂存器函数
186 ;函数原型:void write_scrat(unsigned char data * buf)
187 ;入口:R7(buf)欲写数据的首地址
188
189 ;================================================================================
190 ?PR?_write_scrat?DS18B20 SEGMENT CODE
A51 MACRO ASSEMBLER DS18B20 04/23/2007 23:23:06 PAGE 4
191 PUBLIC _write_scrat
192
---- 193 RSEG ?PR?_write_scrat?DS18B20
0000 194 _write_scrat:
0000 7B03 195 mov r3,#3;
0002 EF 196 mov a,r7;
0003 F8 197 mov r0,a;
0004 120000 F 198 call reset_ds18b20; //
0007 74CC 199 mov a,#0cch; //跳跃ROM命令
0009 120000 F 200 call write_byte;
000C 744E 201 mov a,#04eh; //写暂存器命令
000E 120000 F 202 call write_byte;
0011 203 w_scrat_loop:
0011 E6 204 mov a,@r0;
0012 120000 F 205 call write_byte;//写数据
0015 08 206 inc r0;
0016 DBF9 207 djnz r3,w_scrat_loop;
0018 22 208 ret
209
210
211
212 ;===================================================================================
213
214 ;===================================================================================
215 ;温度数据(HEX)转换为8位(4字节)BCD码
216 ;函数原型:void hextobcd(unsigned char data * source ,unsigned char data * disten)
217 ;入口:source(R7):需转换数据的首地址指针;disten(R5):转换后数据保存地址指针
218 ;===================================================================================
219 ?PR?_hextobcd?DS18B20 SEGMENT CODE
220 PUBLIC _hextobcd
221
---- 222 RSEG ?PR?_hextobcd?DS18B20
0000 223 _hextobcd:
0000 EF 224 mov a,r7;
0001 F8 225 mov r0,a;
0002 ED 226 mov a,r5;
0003 F9 227 mov r1,a;
0004 E6 228 mov a,@r0;
0005 FD 229 mov r5,a;//低字节
0006 08 230 inc r0;
0007 E6 231 mov a,@r0;
0008 FF 232 mov r7,a;//高字节
0009 120000 F 233 call neg;//判负求补
000C 120000 F 234 call data_apart;整数与小数分离
000F 120000 F 235 call hbcd;//转换为BCD码
0012 E8 236 mov a,r0;//恢复数据指针
0013 FF 237 mov r7,a;
0014 E9 238 mov a,r1;
0015 FD 239 mov r5,a;
0016 22 240 ret
241
242
243
244 ;===================================================================================
245
246
247
248
249 ;===================================================================================
250 ;两字节HEX数据转换为两字节BCD(
251 ;入口:欲转换的数据在R6R7,R6为整数,R7为小数部分;
252 ; R1=转换后BCD数据保存首地址
253 ;出口:转换后的BCD码首地址在R1中,(R1),(R1)+1为整数部分,(R1)的第7位为数据符号位:1
=负数;0=正数
254 ; (R1)+2,(R1)+3为小数部分。
255 ;=================================================================================
A51 MACRO ASSEMBLER DS18B20 04/23/2007 23:23:06 PAGE 5
0017 256 hbcd:
257 ;整数部分转换
0017 E9 258 mov a,r1;
0018 C0E0 259 push acc;
001A EE 260 mov a,r6;
001B A2E7 261 mov c,acc.7;
001D 92D5 262 mov F0,c;//暂存符号位
001F 75F064 263 mov b,#100;
0022 84 264 div ab;
0023 A2D5 265 mov c,F0;
0025 92E7 266 mov acc.7,c;恢复符号位
0027 F7 267 mov @r1,a;
0028 740A 268 mov a,#10;
002A C5F0 269 xch a,b;
002C 84 270 div ab;
002D C4 271 swap a;
002E 45F0 272 orl a,b;
0030 09 273 inc r1;
0031 F7 274 mov @r1,a;
275 ;小数部分BCD码转换
0032 E4 276 clr a;
0033 FA 277 mov r2,a;
0034 FB 278 mov r3,a;
0035 EF 279 mov a,r7;
0036 30E702 280 jnb acc.7,hbcd_1;
0039 7A50 281 mov r2,#50h;
003B 30E605 282 hbcd_1: jnb acc.6,hbcd_2;
003E EA 283 mov a,r2;
003F 2425 284 add a,#25h;
0041 FA 285 mov r2,a;
0042 EF 286 mov a,r7;
0043 30E507 287 hbcd_2: jnb acc.5,hbcd_3;
0046 EA 288 mov a,r2;
0047 2412 289 add a,#12h;
0049 FA 290 mov r2,a;
004A 7B50 291 mov r3,#50h;
004C EF 292 mov a,r7;
004D 30E409 293 hbcd_3: jnb acc.4,hbcd_4;
0050 EA 294 mov a,r2;
0051 2406 295 add a,#06h;
0053 D4 296 da a;
0054 FA 297 mov r2,a;
0055 EB 298 mov a,r3;
0056 2425 299 add a,#25h;
0058 FB 300 mov r3,a;
0059 EA 301 hbcd_4: mov a,r2;
005A 09 302 inc r1;
005B F7 303 mov @r1,a;
005C EB 304 mov a,r3;
005D 09 305 inc r1;
005E F7 306 mov @r1,a;
005F D0E0 307 pop acc;//恢复数据指针
0061 F9 308 mov r1,a;
0062 22 309 ret
310 ;===================================================================================
311 ;数据求补运算子程序
312 ;入口:R5,R7;R7为高字节
313 ;出口:数据地址不变
314 ;===================================================================================
0063 315 neg:
0063 EF 316 mov a,r7;
0064 30E70D 317 jnb acc.7,neg_ret;//判断数据是否是负数,若非负数则直接退出
0067 ED 318 mov a,r5; //否则求补
0068 F4 319 cpl a;
0069 C3 320 clr c;
006A 2401 321 add a,#1;
A51 MACRO ASSEMBLER DS18B20 04/23/2007 23:23:06 PAGE 6
006C FD 322 mov r5,a;
006D EF 323 mov a,r7;
006E F4 324 cpl a;
006F 3400 325 addc a,#0;
0071 D2E3 326 setb acc.3;//设置负数标志
0073 FF 327 mov r7,a;
0074 22 328 neg_ret: ret
329
330
331
332
333
334 ;==========================================================================================
335 ;整数与小数部分的分离
336 ;入口:数据在R6,R7中,R7为高字节
337 ;出口:分离的整数在R6中,小数在R7中
338 ;=========================================================================================
0075 339 data_apart:
0075 EF 340 mov a,r7;//高字节
0076 540F 341 anl a,#0fh;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -