📄 ds18b20.lst
字号:
A51 MACRO ASSEMBLER DS18B20 07/26/2007 20:21:38 PAGE 1
MACRO ASSEMBLER A51 V8.00
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 ;ORG 08500H
7 ?PR?GET_TEMPER?DS18B20 SEGMENT CODE
8 PUBLIC GET_TEMPER
---- 9 RSEG ?PR?GET_TEMPER?DS18B20
10
11
12
13 ; LJMP MAIN
14 ; ORG 8100H
15 ;MAIN:
16 ; MOV SP,#70H
17 ; LCALL GET_TEMPER ;从DS18B20读出温度数据
18 ; LCALL TEMPER_COV ;转换读出的温度数据并保存
19 ; SJMP $ ;完成一次数字温度采集
20 ;
21
22 ;-------读出转换后的温度值
23
0000 24 GET_TEMPER:
0000 D2B3 25 SETB DQ ; 定时入口
0002 120000 F 26 BCD: LCALL INIT_1820
0005 200003 27 JB FLAG1,S22
0008 020000 F 28 LJMP BCD ; 若DS18B20不存在则返回
000B 120000 F 29 S22: LCALL DELAY1
000E 74CC 30 MOV A,#0CCH ; 跳过ROM匹配------0CC
0010 120000 F 31 LCALL WRITE_1820
0013 7444 32 MOV A,#44H ; 发出温度转换命令
0015 120000 F 33 LCALL WRITE_1820
0018 00 34 NOP
0019 120000 F 35 LCALL DELAY
001C 120000 F 36 LCALL DELAY
001F 120000 F 37 CBA: LCALL INIT_1820
0022 200003 38 JB FLAG1,ABC
0025 020000 F 39 LJMP CBA
0028 120000 F 40 ABC: LCALL DELAY1
002B 74CC 41 MOV A,#0CCH ; 跳过ROM匹配
002D 120000 F 42 LCALL WRITE_1820
0030 74BE 43 MOV A,#0BEH ; 发出读温度命令
0032 120000 F 44 LCALL WRITE_1820
0035 120000 F 45 LCALL READ_18200 ;READ_1820
0038 AE35 46 mov r6,TEMPER_H
003A AF36 47 mov r7,TEMPER_L
003C 22 48 RET
49
50 ;-------读DS18B20的程序,从DS18B20中读出一个字节的数据
003D 51 READ_1820:
003D 7A08 52 MOV R2,#8
003F C3 53 RE1: CLR C
0040 D2B3 54 SETB DQ
0042 00 55 NOP
0043 00 56 NOP
0044 C2B3 57 CLR DQ
0046 00 58 NOP
A51 MACRO ASSEMBLER DS18B20 07/26/2007 20:21:38 PAGE 2
0047 00 59 NOP
0048 00 60 NOP
0049 D2B3 61 SETB DQ
004B 7B07 62 MOV R3,#7
004D DBFE 63 DJNZ R3,$
004F A2B3 64 MOV C,DQ
0051 7B17 65 MOV R3,#23
0053 DBFE 66 DJNZ R3,$
0055 13 67 RRC A
0056 DAE7 68 DJNZ R2,RE1
0058 22 69 RET
70
71 ;-------写DS18B20的程序
0059 72 WRITE_1820:
0059 7A08 73 MOV R2,#8
005B C3 74 CLR C
005C C2B3 75 WR1: CLR DQ
005E 7B06 76 MOV R3,#6
0060 DBFE 77 DJNZ R3,$
0062 13 78 RRC A
0063 92B3 79 MOV DQ,C
0065 7B17 80 MOV R3,#23
0067 DBFE 81 DJNZ R3,$
0069 D2B3 82 SETB DQ
006B 00 83 NOP
006C DAEE 84 DJNZ R2,WR1
006E D2B3 85 SETB DQ
0070 22 86 RET
87
88 ;-------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
0071 89 READ_18200:
0071 7C02 90 MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
0073 7936 91 MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
0075 7A08 92 RE00: MOV R2,#8
0077 C3 93 RE01: CLR C
0078 D2B3 94 SETB DQ
007A 00 95 NOP
007B 00 96 NOP
007C C2B3 97 CLR DQ
007E 00 98 NOP
007F 00 99 NOP
0080 00 100 NOP
0081 D2B3 101 SETB DQ
0083 7B07 102 MOV R3,#7
0085 DBFE 103 DJNZ R3,$
0087 A2B3 104 MOV C,DQ
0089 7B17 105 MOV R3,#23
008B DBFE 106 DJNZ R3,$
008D 13 107 RRC A
008E DAE7 108 DJNZ R2,RE01
0090 F7 109 MOV @R1,A
0091 19 110 DEC R1
0092 DCE1 111 DJNZ R4,RE00
0094 22 112 RET
113
114 ?PR?_TEMPER_COV?DS18B20 SEGMENT CODE
115 ;?DT?_TEMPER_COV?DS18B20 SEGMENT DATA OVERLAYABLE
116 ; PUBLIC ?_TEMPER_COV?BYTE
117 PUBLIC _TEMPER_COV
118
119 ; RSEG ?DT?_TEMPER_COV?DS18B20
120 ;?_TEMPER_COV?BYTE:
121 ; kk?00: DS 2
122
123 ; retval?01: ds 1
124
A51 MACRO ASSEMBLER DS18B20 07/26/2007 20:21:38 PAGE 3
---- 125 RSEG ?PR?_TEMPER_COV?DS18B20
126
127 ;-------将从DS18B20中读出的温度数据进行转换
0000 128 _TEMPER_COV:
0000 74F0 129 MOV A,#0F0H
0002 5536 130 ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
0004 C4 131 SWAP A
0005 F560 132 MOV TEMPER_NUM,A
0007 E536 133 MOV A,TEMPER_L
0009 30E302 134 JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值
000C 0560 135 INC TEMPER_NUM
136
000E 137 TEMPER_COV1:
000E E535 138 MOV A,TEMPER_H
0010 5407 139 ANL A,#07H
0012 C4 140 SWAP A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -