📄 ds18b20.lst
字号:
A51 MACRO ASSEMBLER DS18B20 05/08/2005 14:40:39 PAGE 1
MACRO ASSEMBLER A51 V7.00a
OBJECT MODULE PLACED IN ds18b20.OBJ
ASSEMBLER INVOKED BY: D:\Program Files\keil\C51\BIN\A51.EXE ds18b20.ASM SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 NAME YCLPROGRAM
2 ;单片机内存分配申明!
3 PUBLIC RW_TEMP
4 PUBLIC TEMPER_L ;TEMPER_L EQU 29H;用于保存读出温度的低8位
5 PUBLIC TEMPER_H ;TEMPER_H EQU 28H;用于保存读出温度的高8位
6 PUBLIC FLAG1 ;FLAG1 EQU 38H;是否检测到DS18B20标志位
7 PUBLIC a_bit ;a_bit equ 20h ;数码管个位数存放内存位置
8 PUBLIC b_bit ;b_bit equ 21h ;数码管十位数存放内存位置
9
10 YCLDATA SEGMENT DATA
11 YCLCODE SEGMENT CODE
12 YCLBIT SEGMENT BIT
13
---- 14 RSEG YCLDATA
0000 15 TEMPER_L: DS 1
0001 16 TEMPER_H: DS 1
---- 17 RSEG YCLBIT
0000 18 FLAG1: DBIT 1
0001 19 a_bit: DBIT 1
0002 20 b_bit: DBIT 1
---- 21 RSEG YCLCODE
0000 22 RW_TEMP:
23
0000 120000 F 24 LCALL GET_TEMPER;调用读温度子程序
25
26 ;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度
27 ;显示范围00到99度,显示精度为1度
28 ;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
29 ;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
30 ;这个转化温度的方法可是我想出来的哦~~非常简洁无需乘于0.0625系数
31
0003 22 32 RET
33
34 ; 这是DS18B20复位初始化子程序
0004 35 INIT_1820:
0004 D2B3 36 SETB P3.3
0006 00 37 NOP
0007 C2B3 38 CLR P3.3
39 ;主机发出延时537微秒的复位低脉冲
0009 7903 40 MOV R1,#3
000B 786B 41 TSR1:MOV R0,#107
000D D8FE 42 DJNZ R0,$
000F D9FA 43 DJNZ R1,TSR1
0011 D2B3 44 SETB P3.3;然后拉高数据线
0013 00 45 NOP
0014 00 46 NOP
0015 00 47 NOP
0016 7825 48 MOV R0,#25H
0018 49 TSR2:
0018 30B305 50 JNB P3.3,TSR3;等待DS18B20回应
001B D8FB 51 DJNZ R0,TSR2
001D 020000 F 52 LJMP TSR4 ; 延时
0020 53 TSR3:
0020 D200 F 54 SETB FLAG1 ; 置标志位,表示DS1820存在
0022 C297 55 CLR P1.7;检查到DS18B20就点亮P1.7LED
0024 020000 F 56 LJMP TSR5
0027 57 TSR4:
0027 C200 F 58 CLR FLAG1 ; 清标志位,表示DS1820不存在
A51 MACRO ASSEMBLER DS18B20 05/08/2005 14:40:39 PAGE 2
0029 C291 59 CLR P1.1
002B 020000 F 60 LJMP TSR7
61
002E 62 TSR5:
002E 7875 63 MOV R0,#117
0030 64 TSR6:
0030 D8FE 65 DJNZ R0,TSR6 ; 时序要求延时一段时间
0032 66 TSR7:
0032 D2B3 67 SETB P3.3
0034 22 68 RET
69
70 ; 读出转换后的温度值
0035 71 GET_TEMPER:
0035 D2B3 72 SETB P3.3
0037 120000 F 73 LCALL INIT_1820;先复位DS18B20
003A 200003 F 74 JB FLAG1,TSS2
003D C292 75 CLR P1.2
003F 22 76 RET ; 判断DS1820是否存在?若DS18B20不存在则返回
0040 77 TSS2:
0040 C293 78 CLR P1.3;DS18B20已经被检测到!!!!!!!!!!!!!!!!!!
0042 74CC 79 MOV A,#0CCH ; 跳过ROM匹配
0044 120000 F 80 LCALL WRITE_1820
0047 7444 81 MOV A,#44H ; 发出温度转换命令
0049 120000 F 82 LCALL WRITE_1820
83
004C 120000 F 84 LCALL D1MS
85
004F 120000 F 86 LCALL INIT_1820;准备读温度前先复位
87
0052 74CC 88 MOV A,#0CCH ; 跳过ROM匹配
0054 120000 F 89 LCALL WRITE_1820
90
0057 74BE 91 MOV A,#0BEH ; 发出读温度命令
0059 120000 F 92 LCALL WRITE_1820
93
005C 120000 F 94 LCALL READ_18200; 将读出的温度数据保存到35H/36H
005F C294 95 CLR P1.4
96
0061 22 97 RET
98
99 ;写DS18B20的子程序(有具体的时序要求)
0062 100 WRITE_1820:
0062 7A08 101 MOV R2,#8;一共8位数据
0064 C3 102 CLR C
0065 103 WR1:
0065 C2B3 104 CLR P3.3
0067 7B05 105 MOV R3,#5
0069 DBFE 106 DJNZ R3,$
006B 13 107 RRC A
006C 92B3 108 MOV P3.3,C
006E 7B15 109 MOV R3,#21
0070 DBFE 110 DJNZ R3,$
0072 D2B3 111 SETB P3.3
0074 00 112 NOP
0075 DAEE 113 DJNZ R2,WR1
0077 D2B3 114 SETB P3.3
0079 22 115 RET
116
117 ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
007A 118 READ_18200:
007A 7C02 119 MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
007C 7900 F 120 MOV R1,#TEMPER_L ; 低位存入TEMPER_L,高位存入TEMPER_H
007E 121 RE00:
007E 7A08 122 MOV R2,#8;数据一共有8位
0080 123 RE01:
0080 C3 124 CLR C
A51 MACRO ASSEMBLER DS18B20 05/08/2005 14:40:39 PAGE 3
0081 D2B3 125 SETB P3.3
0083 00 126 NOP
0084 00 127 NOP
0085 C2B3 128 CLR P3.3
0087 00 129 NOP
0088 00 130 NOP
0089 00 131 NOP
008A D2B3 132 SETB P3.3
133
008C 7B08 134 MOV R3,#8
008E 135 RE10:
008E DBFE 136 DJNZ R3,RE10
137
0090 A2B3 138 MOV C,P3.3
139
0092 7B15 140 MOV R3,#21
0094 141 RE20:
0094 DBFE 142 DJNZ R3,RE20
143
0096 13 144 RRC A
0097 DAE7 145 DJNZ R2,RE01
0099 F7 146 MOV @R1,A
009A 7900 F 147 MOV R1,#TEMPER_H ; 低位存入TEMPER_L,高位存入TEMPER_H
009C DCE0 148 DJNZ R4,RE00
009E 22 149 RET
150
151 ;1MS延时
009F 7F50 152 D1MS: MOV R7,#80
00A1 DFFE 153 DJNZ R7,$
00A3 22 154 RET
155
156 end
A51 MACRO ASSEMBLER DS18B20 05/08/2005 14:40:39 PAGE 4
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
A_BIT. . . . . . . B ADDR 0000H.1 R SEG=YCLBIT
B_BIT. . . . . . . B ADDR 0000H.2 R SEG=YCLBIT
D1MS . . . . . . . C ADDR 009FH R SEG=YCLCODE
FLAG1. . . . . . . B ADDR 0000H.0 R SEG=YCLBIT
GET_TEMPER . . . . C ADDR 0035H R SEG=YCLCODE
INIT_1820. . . . . C ADDR 0004H R SEG=YCLCODE
P1 . . . . . . . . D ADDR 0090H A
P3 . . . . . . . . D ADDR 00B0H A
RE00 . . . . . . . C ADDR 007EH R SEG=YCLCODE
RE01 . . . . . . . C ADDR 0080H R SEG=YCLCODE
RE10 . . . . . . . C ADDR 008EH R SEG=YCLCODE
RE20 . . . . . . . C ADDR 0094H R SEG=YCLCODE
READ_18200 . . . . C ADDR 007AH R SEG=YCLCODE
RW_TEMP. . . . . . C ADDR 0000H R SEG=YCLCODE
TEMPER_H . . . . . D ADDR 0001H R SEG=YCLDATA
TEMPER_L . . . . . D ADDR 0000H R SEG=YCLDATA
TSR1 . . . . . . . C ADDR 000BH R SEG=YCLCODE
TSR2 . . . . . . . C ADDR 0018H R SEG=YCLCODE
TSR3 . . . . . . . C ADDR 0020H R SEG=YCLCODE
TSR4 . . . . . . . C ADDR 0027H R SEG=YCLCODE
TSR5 . . . . . . . C ADDR 002EH R SEG=YCLCODE
TSR6 . . . . . . . C ADDR 0030H R SEG=YCLCODE
TSR7 . . . . . . . C ADDR 0032H R SEG=YCLCODE
TSS2 . . . . . . . C ADDR 0040H R SEG=YCLCODE
WR1. . . . . . . . C ADDR 0065H R SEG=YCLCODE
WRITE_1820 . . . . C ADDR 0062H R SEG=YCLCODE
YCLBIT . . . . . . B SEG 0003H REL=UNIT
YCLCODE. . . . . . C SEG 00A4H REL=UNIT
YCLDATA. . . . . . D SEG 0002H REL=UNIT
YCLPROGRAM . . . . N NUMB -----
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -