📄 ad1405.lst
字号:
A51 MACRO ASSEMBLER AD1405 09/22/2008 19:31:29 PAGE 1
MACRO ASSEMBLER A51 V8.00
OBJECT MODULE PLACED IN AD1405.OBJ
ASSEMBLER INVOKED BY: D:\Program Files\Keil\C51\BIN\A51.EXE AD1405.ASM SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ; 文件名:AD1405.ASM
2 ; 程序功能:数字温度计 ,已调好
3
0020 4 A_BIT EQU 20H ;存放个位数变量
0021 5 B_BIT EQU 21H ;存放十位数变量
0038 6 FLAG EQU 38H ;DS18B20是否存在标志
00A5 7 DQ EQU P2.5 ;DQ引脚由P2.5控制
0000 8 MAIN: ;主程序标号
0000 1108 9 ACALL RE_TEMP ;对传感器设置及读取
0002 118B 10 ACALL TURN ;转化温度子程序
0004 119C 11 ACALL DISPLAY ;显示子程序
0006 80F8 12 JMP MAIN ;循环
13
0008 14 RE_TEMP: ;对DS18B20初始化及读取
0008 D2A5 15 SETB DQ
000A 1125 16 ACALL RESET_1820 ;调用复位子程序
000C 203801 17 JB FLAG, ST ;判断DS1820是否存在?
000F 22 18 RET
19
0010 20 ST: ; DS18B20存在
0010 74CC 21 MOV A,#0CCH ;跳过ROM匹配
0012 114F 22 ACALL WRITE_1820 ;写入数据
0014 7444 23 MOV A,#44H ;发出温度转换命令
0016 114F 24 ACALL WRITE_1820 ;写入数据
0018 1125 25 ACALL RESET_1820 ;准备读温度前先复位
001A 74CC 26 MOV A,#0CCH ;跳过ROM匹配
001C 114F 27 ACALL WRITE_1820 ;写入数据
001E 74BE 28 MOV A,#0BEH ;发出读温度命令
0020 114F 29 ACALL WRITE_1820 ;写入数据
0022 1167 30 ACALL READ_1820 ;读出温度数据
0024 22 31 RET
32
0025 33 RESET_1820: ;复位(有具体的时序要求)
0025 D2A5 34 SETB DQ
0027 00 35 NOP
0028 C2A5 36 CLR DQ
37 ;――――――――――――
38 ;主机发出延时537微秒的复位低脉冲
002A 7903 39 MOV R1,#3
002C 786B 40 DLY: MOV R0,#107
002E D8FE 41 DJNZ R0,$
0030 D9FA 42 DJNZ R1,DLY
43 ;――――――――――――
44 ;然后拉高数据线
0032 D2A5 45 SETB DQ
0034 00 46 NOP
0035 00 47 NOP
0036 00 48 NOP
49 ;――――――――――――
0037 7825 50 MOV R0,#25H
0039 30A504 51 T2: JNB DQ ,T3 ;等待DS18B20回应
003C D8FB 52 DJNZ R0, T2
003E 8004 53 JMP T4
54 ;――――――――――――
0040 D238 55 T3: SETB FLAG ;置标志位,表示DS1820存在
0042 8004 56 JMP T5
57 ;――――――――――――
0044 C238 58 T4: CLR FLAG ;清标志位,表示DS1820不存在
A51 MACRO ASSEMBLER AD1405 09/22/2008 19:31:29 PAGE 2
0046 8004 59 JMP T7
60 ;――――――――――――
0048 7875 61 T5: MOV R0,#117
004A D8FE 62 T6: DJNZ R0,T6 ;时序要求延时一段时间
63 ;――――――――――――
004C D2A5 64 T7: SETB DQ
004E 22 65 RET
66 ;――――――――――――
67
004F 68 WRITE_1820: ;写入DS18B20(有具体的时序要求)
004F 7A08 69 MOV R2,#8 ;一共8位数据
0051 C3 70 CLR C
0052 71 WR1:
0052 C2A5 72 CLR DQ ;总线低位,开始写入
0054 7B07 73 MOV R3,#7
0056 DBFE 74 DJNZ R3,$ ;保持16微秒以上
0058 13 75 RRC A ;把字节DATA分成8个BIT环移给C
0059 92A5 76 MOV DQ, C ;写入一个BIT
005B 7B17 77 MOV R3,#23
005D DBFE 78 DJNZ R3,$ ;等待
005F D2A5 79 SETB DQ ;重新释放总线
0061 00 80 NOP
0062 DAEE 81 DJNZ R2,WR1 ;写入下一个BIT
0064 D2A5 82 SETB DQ
0066 22 83 RET
84
0067 85 READ_1820: ;将温度高位和低位从DS18B20中读出
0067 7C02 86 MOV R4,#2 ; 读出两个字节的数据
0069 7929 87 MOV R1,#29H ;低位存入29H,高位存入28h
006B 88 RE0:
006B 7A08 89 MOV R2,#8 ;数据一共有8位
006D 90 RE1:
006D C3 91 CLR C
006E D2A5 92 SETB DQ
0070 00 93 NOP
0071 00 94 NOP
0072 C2A5 95 CLR DQ ;读前总线保持为低
0074 00 96 NOP
0075 00 97 NOP
0076 00 98 NOP
0077 D2A5 99 SETB DQ ;开始读总线释放
0079 7B09 100 MOV R3,#9
007B 101 RE2:
007B DBFE 102 DJNZ R3,RE2 ;延时18微妙
007D A2A5 103 MOV C, DQ ;从总线读到一个BIT
007F 7B17 104 MOV R3,#23
0081 105 RE3: ;
0081 DBFE 106 DJNZ R3,RE3 ;等待100秒
0083 13 107 RRC A ;把读得的位价值环移给A
0084 DAE7 108 DJNZ R2,RE1 ;读下一个BIT
0086 F7 109 MOV @R1,A
0087 19 110 DEC R1
0088 DCE1 111 DJNZ R4,RE0
008A 22 112 RET
113
008B 114 TURN:
008B E529 115 MOV A,29H
008D A240 116 MOV C,40H ;将28中的最低位移入C
008F 13 117 RRC A
0090 A241 118 MOV C,41H
0092 13 119 RRC A
0093 A242 120 MOV C,42H
0095 13 121 RRC A
0096 A243 122 MOV C,43H
0098 13 123 RRC A
0099 F529 124 MOV 29H,A
A51 MACRO ASSEMBLER AD1405 09/22/2008 19:31:29 PAGE 3
009B 22 125 RET
126
009C 127 DISPLAY: ;将29H中的十六进制数成10进制
009C E529 128 MOV A,29H
009E 75F00A 129 MOV B,#10 ;10进制/10=10进制
00A1 84 130 DIV AB
00A2 F521 131 MOV B_BIT, A ;十位在A
00A4 85F020 132 MOV A_BIT, B ;个位在B
00A7 9000D6 133 MOV DPTR,#TABLE ;指定查表启始地址
00AA 7804 134 MOV R0,#4
00AC 135 DP1:
00AC 79FA 136 MOV R1, #250 ;显示1000次
00AE 137 LOOP:
00AE E520 138 MOV A,A_BIT ;取个位数
00B0 93 139 MOVC A,@A+DPTR ;查个位数的7段代码
00B1 F580 140 MOV P0,A ;送出个位的7段代码
00B3 C2A1 141 CLR P2.1 ;开个位显示
00B5 11C9 142 ACALL DELAY ;
00B7 D2A1 143 SETB P2.1
00B9 E521 144 MOV A,B_BIT ;取十位数
00BB 93 145 MOVC A,@A+DPTR ;查十位数的7段代码
00BC F580 146 MOV P0,A ;送出个十位的7段代码
00BE C2A0 147 CLR P2.0 ;开十位显示
00C0 11C9 148 ACALL DELAY ;显示1MS
00C2 D2A0 149 SETB P2.0
00C4 D9E8 150 DJNZ R1,LOOP ;250次没完循环
00C6 D8E4 151 DJNZ R0,DP1 ;4个250次没完循环
00C8 22 152 RET
00C9 153 DELAY: ;10Ms延时
00C9 7C05 154 MOV R4,#5
00CB 7E64 155 MOV R6,#100
00CD 7FFA 156 MOV R7, #250
00CF DFFE 157 DJNZ R7,$
00D1 DEFE 158 DJNZ R6, $
00D3 DCFE 159 DJNZ R4, $
00D5 22 160 RET
161
162
00D6 163 TABLE: ;数码管共阳极0~9代码
00D6 C0F9A4B0 164 DB 0C0H,0F9H,0A4H,0B0H,99H
00DA 99
00DB 9282F880 165 DB 92H,82H,0F8H,80H,90H
00DF 90
166
167 END
A51 MACRO ASSEMBLER AD1405 09/22/2008 19:31:29 PAGE 4
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
A_BIT. . . . . . . N NUMB 0020H A
B. . . . . . . . . D ADDR 00F0H A
B_BIT. . . . . . . N NUMB 0021H A
DELAY. . . . . . . C ADDR 00C9H A
DISPLAY. . . . . . C ADDR 009CH A
DLY. . . . . . . . C ADDR 002CH A
DP1. . . . . . . . C ADDR 00ACH A
DQ . . . . . . . . B ADDR 00A0H.5 A
FLAG . . . . . . . N NUMB 0038H A
LOOP . . . . . . . C ADDR 00AEH A
MAIN . . . . . . . C ADDR 0000H A
P0 . . . . . . . . D ADDR 0080H A
P2 . . . . . . . . D ADDR 00A0H A
RE0. . . . . . . . C ADDR 006BH A
RE1. . . . . . . . C ADDR 006DH A
RE2. . . . . . . . C ADDR 007BH A
RE3. . . . . . . . C ADDR 0081H A
READ_1820. . . . . C ADDR 0067H A
RESET_1820 . . . . C ADDR 0025H A
RE_TEMP. . . . . . C ADDR 0008H A
ST . . . . . . . . C ADDR 0010H A
T2 . . . . . . . . C ADDR 0039H A
T3 . . . . . . . . C ADDR 0040H A
T4 . . . . . . . . C ADDR 0044H A
T5 . . . . . . . . C ADDR 0048H A
T6 . . . . . . . . C ADDR 004AH A
T7 . . . . . . . . C ADDR 004CH A
TABLE. . . . . . . C ADDR 00D6H A
TURN . . . . . . . C ADDR 008BH A
WR1. . . . . . . . C ADDR 0052H A
WRITE_1820 . . . . C ADDR 004FH A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -