📄 用89c2051做温度计.lst
字号:
8051 Assembler Version 1.00 07/12/106 23:49:39 Page 1
D:\200642523202081112\用89C2051做0-125度的温度计\用89C2051做温度计.asm
1 0000 ORG 0000H ;DS18B20.ASM 0-125度的温度计 原创:陈永飞 QQ:49204743 地址:江苏省南京市
2 0000 TEMPER_L EQU 41H ;用于保存读出温度的低8位 信箱:baiyni888@163.com
3 0000 TEMPER_H EQU 40H ;用于保存读出温度的高8位
4 0000 FLAG1 EQU 38H ;是否检测到DS18B20标志位
5 0000 A_BIT1 EQU 31H ;数码管个位数存放内存位置
6 0000 B_BIT1 EQU 32H ;数码管十位数存放内存位置
7 0000 D_BIT1 EQU 35H ;数码管百位数存放内存位置
8 0000 DQ EQU P3.2 ;30H,31H,32H,33H: X 个位 十位 X
9 0000 758160 MOD7: MOV SP,#60H
10 0003 12007E LCALL GET_TEMPER ;调用读温度子程序
11 0006 120011 LCALL TEMPCOV
12 0009 1200E1 LCALL DISPLAY ;调用数码管显示子程序
13 000C 0100 AJMP MOD7
14 000E 04 TEMP0: INC A
15 000F 011A AJMP TEMP1
16 0011 E541 TEMPCOV: MOV A,TEMPER_L ;数据处理子程序TEMPCOV
17 0013 75F010 MOV B,#16
18 0016 84 DIV AB
19 0017 20F3F4 JB B.3,TEMP0
20 001A F534 TEMP1: MOV 34H,A ;将TEMPER_L的高四位右移四位,存入34H中(温度值)
21 001C E5F0 MOV A,B ;将TEMPER_L的低四位X10/16得小数后一位数.
22 001E 75F00A MOV B,#10
23 0021 A4 MUL AB
24 0022 75F010 MOV B,#16
25 0025 84 DIV AB
26 0026 F530 MOV 30H,A ;将小数后一位数.存入30H中
27 0028 E540 MOV A,TEMPER_H ;TEMPER_H中存放高8位数,权重16
28 002A 75F010 MOV B,#16
29 002D A4 MUL AB
30 002E 2534 ADD A,34H ;34H中存入温度值的整数部分
31 0030 75F00A MOV B,#10
32 0033 84 DIV AB
33 0034 85F031 MOV 31H,B ;个位存入31H中
34 0037 75F00A MOV B,#10 ;
35 003A 84 DIV AB ;
36 003B 85F032 MOV 32H,B ;十位存入32H中
37 003E 75F00A MOV B,#10 ;
38 0041 84 DIV AB ;
39 0042 85F035 MOV 35H,B ;百位存入33H中
40 0045 E540 MOV A,TEMPER_H
41 0047 753310 MOV 33H,#10H ;
42 004A 20E703 JB ACC.7,EXIT7
43 004D 753300 MOV 33H,#00H
44 0050 22 EXIT7: RET
45 0051 INIT_1820: ;这是DS18B20复位初始化子程序
46 0051 D2B2 SETB DQ
47 0053 00 NOP
48 0054 C2B2 CLR DQ ;主机发出延时537微秒的复位低脉冲
49 0056 7903 MOV R1,#3
50 0058 786B TSR1: MOV R0,#107
51 005A D8FE DJNZ R0,$
52 005C D9FA DJNZ R1,TSR1
53 005E D2B2 SETB DQ ;然后拉高数据线
54 0060 00 NOP
55 0061 00 NOP
56 0062 00 NOP
57 0063 7825 MOV R0,#25H
8051 Assembler Version 1.00 07/12/106 23:49:39 Page 2
D:\200642523202081112\用89C2051做0-125度的温度计\用89C2051做温度计.asm
58 0065 30B205 TSR2: JNB DQ,TSR3 ;等待DS18B20回应
59 0068 D8FB DJNZ R0,TSR2
60 006A 020072 LJMP TSR4 ;延时
61 006D D238 TSR3: SETB FLAG1 ;置标志位,表示DS1820存在
62 006F 020077 LJMP TSR5
63 0072 C238 TSR4: CLR FLAG1 ;清标志位,表示DS1820不存在
64 0074 02007B LJMP TSR7
65 0077 7875 TSR5: MOV R0,#117
66 0079 D8FE TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间
67 007B D2B2 TSR7: SETB DQ
68 007D 22 RET
69 007E ;-------------------------------------------------
70 007E GET_TEMPER: ;读出转换后的温度值
71 007E D2B2 SETB DQ
72 0080 120051 LCALL INIT_1820 ;先复位DS18B20
73 0083 203801 JB FLAG1,TSS2
74 0086 22 RET ;判断DS1820是否存在?若DS18B20不存在则返回
75 0087 74CC TSS2: MOV A,#0CCH ;跳过ROM匹配
76 0089 1200A5 LCALL WRITE_1820
77 008C 7444 MOV A,#44H ;发出温度转换命令
78 008E 1200A5 LCALL WRITE_1820
79 0091 1200E1 LCALL DISPLAY ;等待AD转换结束,12位的话750微秒
80 0094 120051 LCALL INIT_1820 ;准备读温度前先复位
81 0097 74CC MOV A,#0CCH ;跳过ROM匹配
82 0099 1200A5 LCALL WRITE_1820
83 009C 74BE MOV A,#0BEH ;发出读温度命令
84 009E 1200A5 LCALL WRITE_1820
85 00A1 1200BD LCALL READ_18200 ;将读出的温度数据保存到35H/36H
86 00A4 22 RET
87 00A5 ;写DS18B20的子程序(有具体的时序要求)
88 00A5 7A08 WRITE_1820: MOV R2,#8 ;一共8位数据
89 00A7 C3 CLR C
90 00A8 C2B2 WR1: CLR DQ
91 00AA 7B06 MOV R3,#6
92 00AC DBFE DJNZ R3,$
93 00AE 13 RRC A
94 00AF 92B2 MOV DQ,C
95 00B1 7B17 MOV R3,#23
96 00B3 DBFE DJNZ R3,$
97 00B5 D2B2 SETB DQ
98 00B7 00 NOP
99 00B8 DAEE DJNZ R2,WR1
100 00BA D2B2 SETB DQ
101 00BC 22 RET
102 00BD ;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
103 00BD 7C02 READ_18200: MOV R4,#2 ;将温度高位和低位从DS18B20中读出
104 00BF 7941 MOV R1,#TEMPER_L ;低位存入TEMPER_L(TEMPER_L),高位存入(TEMPER_H)
105 00C1 7A08 RE00: MOV R2,#8 ;数据一共有8位
106 00C3 C3 RE01: CLR C
107 00C4 D2B2 SETB DQ
108 00C6 00 NOP
109 00C7 00 NOP
110 00C8 C2B2 CLR DQ
111 00CA 00 NOP
112 00CB 00 NOP
113 00CC 00 NOP
114 00CD D2B2 SETB DQ
8051 Assembler Version 1.00 07/12/106 23:49:39 Page 3
D:\200642523202081112\用89C2051做0-125度的温度计\用89C2051做温度计.asm
115 00CF 7B09 MOV R3,#9
116 00D1 DBFE RE10: DJNZ R3,RE10
117 00D3 A2B2 MOV C,DQ
118 00D5 7B17 MOV R3,#23
119 00D7 DBFE RE20: DJNZ R3,RE20
120 00D9 13 RRC A
121 00DA DAE7 DJNZ R2,RE01
122 00DC F7 MOV @R1,A
123 00DD 19 DEC R1
124 00DE DCE1 DJNZ R4,RE00
125 00E0 22 RET
126 00E1 ;显示子程序
127 00E1 900116 DISPLAY: MOV DPTR,#TAB ;指定查表启始地址
128 00E4 7804 MOV R0,#4
129 00E6 79FA DPL1: MOV R1,#250 ;显示1000次
130 00E8 E531 DPLOP: MOV A,A_BIT1 ;取个位数
131 00EA 93 MOVC A,@A+DPTR ;查个位数的7段代码
132 00EB F590 MOV P1,A ;送出个位的7段代码
133 00ED C2A6 CLR P2.6 ;开个位显示
134 00EF 3111 ACALL D1MS ;显示1MS
135 00F1 D2A6 SETB P2.6
136 00F3 E532 MOV A,B_BIT1 ;取十位数
137 00F5 93 MOVC A,@A+DPTR ;查十位数的7段代码
138 00F6 F590 MOV P1,A ;送出十位的7段代码
139 00F8 C2A5 CLR P2.5 ;开十位显示
140 00FA 3111 ACALL D1MS ;显示1MS
141 00FC D2A5 SETB P2.5
142 00FE E535 MOV A,D_BIT1 ;取百位数
143 0100 93 MOVC A,@A+DPTR ;查百位数的7段代码
144 0101 F590 MOV P1,A ;送出百位的7段代码
145 0103 C2A4 CLR P2.4 ;开百位显示
146 0105 3111 ACALL D1MS ;显示1MS
147 0107 D2A4 SETB P2.4
148 0109 759000 MOV P1,#00H
149 010C D9DA DJNZ R1,DPLOP ;100次没完循环
150 010E D8D6 DJNZ R0,DPL1 ;4个100次没完循环
151 0110 22 RET
152 0111 ;1MS延时(按12MHZ算)
153 0111 7FFF D1MS: MOV R7,#0FFH
154 0113 DFFE DJNZ R7,$
155 0115 ; DJNZ R7,$
156 0115 22 RET
157 0116 ;实验板上的7段数码管0~9数字的共阴显示代码
158 0116 7D TAB: DB 07DH;0
159 0117 18 DB 018H;1
160 0118 6E DB 06EH;2
161 0119 3E DB 03EH;3
162 011A 1B DB 01BH;4
163 011B 37 DB 037H;5
164 011C 77 DB 077H;6
165 011D 1C DB 01CH;7
166 011E 7F DB 07FH;8
167 011F 3F DB 03FH;9
168 0120
169 0120 END
Defined Symbols:
A_BIT1 000031 49
B_BIT1 000032 50
D_BIT1 000035 53
DQ 0000B2 178
FLAG1 000038 56
TEMPER_H 000040 64
TEMPER_L 000041 65
Defined Labels:
D1MS 000111 273
DISPLAY 0000E1 225
DPL1 0000E6 230
DPLOP 0000E8 232
EXIT7 000050 80
GET_TEMPER 00007E 126
INIT_1820 000051 81
MOD7 000000 0
RE00 0000C1 193
RE01 0000C3 195
RE10 0000D1 209
RE20 0000D7 215
READ_18200 0000BD 189
TAB 000116 278
TEMP0 00000E 14
TEMP1 00001A 26
TEMPCOV 000011 17
TSR1 000058 88
TSR2 000065 101
TSR3 00006D 109
TSR4 000072 114
TSR5 000077 119
TSR6 000079 121
TSR7 00007B 123
TSS2 000087 135
WR1 0000A8 168
WRITE_1820 0000A5 165
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -