📄 ds18b20.lst
字号:
A51 MACRO ASSEMBLER DS18B20 01/06/2009 10:18:37 PAGE 1
MACRO ASSEMBLER A51 V7.10
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
0008 1 N EQU 8 ;读出ROM的位数
00B2 2 DQ EQU P3.2 ;单总线的数据线
0028 3 TH EQU 40 ;最高极限温度
000A 4 TL EQU 10 ;最低极限温度
00F0 5 SROMC EQU 0F0H ;搜索ROM命令
0055 6 MROMC EQU 55H ;匹配ROM命令
00CC 7 LROMC EQU 0CCH ;跳过读ROM命令
0033 8 RROMC EQU 33H ;读ROM命令
0044 9 CTC EQU 44H ;转换温度命令
004E 10 WREGC EQU 4EH ;写暂存器命令
00BE 11 RREGC EQU 0BEH ;读暂存器命令
001F 12 CONFIG EQU 1FH ;配置寄存器的值,9位温度值
13
---- 14 DSEG AT 30H
0030 15 DAT: DS 1 ;温度值存储单元
0031 16 POINT: DS 1 ;小数点后温度值的存储单元
0032 17 ROMA: DS 8 ;器件A的ROM存储单元
003A 18 BUF: DS 9 ;暂存器中数据存储单元
0043 19 BUFT: DS 4 ;数码管动态显示的4个数据缓冲单元
0047 20 BTH: DS 1 ;显示ROM中某一字节高四位
0048 21 BTL: DS 1 ;显示ROM中某一字节低四位
22
---- 23 CSEG AT 0000H
0000 020100 24 LJMP MAIN
25
0100 26 ORG 0100H
0100 758000 27 MAIN: mov p0,#0
0103 758170 28 MOV SP,#70H
0106 75D000 29 MOV PSW,#00H
0109 120162 30 LCALL Initial
010C 74CC 31 MOV A,#LROMC ;写跳过ROM命令
010E 120171 32 LCALL W8BIT
0111 744E 33 MOV A,#WREGC ;写暂存器命令,可写入TH,TL,Configuration
0113 120171 34 LCALL W8BIT
0116 7428 35 MOV A,#TH ;写18B20的TH寄存器
0118 120171 36 LCALL W8BIT
011B 740A 37 MOV A,#TL ;写18B20的TL寄存器
011D 120171 38 LCALL W8BIT
0120 741F 39 MOV A,#CONFIG ;写18B20的配置寄存器,9位温度值
0122 120171 40 LCALL W8BIT
41
0125 120162 42 RETN: LCALL Initial ;18B20初始化
0128 74CC 43 MOV A,#LROMC ;写跳过ROM命令
012A 120171 44 LCALL W8BIT
012D 7444 45 MOV A,#CTC ;写转换温度命令
012F 120171 46 LCALL W8BIT
0132 1201EF 47 BUSY: LCALL Disply ;显示温度
0135 C2B2 48 CLR DQ ;读18B20的忙位
0137 00 49 NOP
0138 D2B2 50 SETB DQ
013A 00 51 NOP
013B A2B2 52 MOV C,DQ
013D 120220 53 LCALL DLY70 ;延时70微秒
0140 50F0 54 JNC BUSY ;如果18B20忙,转BUSY
0142 120162 55 LCALL Initial ;初始化
0145 74CC 56 MOV A,#LROMC ;写跳过ROM命令
0147 120171 57 LCALL W8BIT
014A 74BE 58 MOV A,#RREGC ;写读18B20暂存器命令
A51 MACRO ASSEMBLER DS18B20 01/06/2009 10:18:37 PAGE 2
014C 120171 59 LCALL W8BIT
014F 7B02 60 MOV R3,#2 ;设置计数器R3=2,从18B20读2个字节的温度值
0151 793A 61 MOV R1,#BUF ;置R1温度值缓冲区
0153 120182 62 RER: LCALL R8BIT ;读温度值
0156 F7 63 MOV @R1,A ;将温度值存入缓冲区
0157 09 64 INC R1 ;温度值缓冲区地址加1
0158 DBF9 65 DJNZ R3,RER ;如2个字节温度值没读完,转RER
015A 120193 66 LCALL STORE ;温度转换并存储子程序
015D 1201EF 67 LCALL Disply ;温度显示子程序,只所以调用2次该子程序
68 ;是为了增强数码管的亮度
0160 80C3 69 SJMP RETN
70
71
72 ;18B20初始化子程序,使用R7
0162 C2B2 73 Initial:CLR DQ ;数据线为低700微秒
0164 12021C 74 LCALL DLY700
0167 D2B2 75 SETB DQ ;置数据线为高,以便接收18B20信号
0169 A2B2 76 I1: MOV C,DQ ;等待数据线为低
016B 40FC 77 JC I1
016D 12021C 78 LCALL DLY700 ;延时700微秒
0170 22 79 RET
80
81 ;向18B20写8位子程序,被写的数在ACC中
82 ;使用R2、R7
0171 7A08 83 W8BIT: MOV R2,#8 ;设置计数器R2为8
0173 C2B2 84 W1: CLR DQ ;使数据线为低
0175 13 85 RRC A ;右移将被写位移如进位C
0176 5002 86 JNC W2 ;被写位为0,转W2
0178 D2B2 87 SETB DQ ;被写位为1,使数据线为高
017A 120220 88 W2: LCALL DLY70 ;延时70微秒
017D D2B2 89 SETB DQ ;使数据线为高
017F DAF2 90 DJNZ R2,W1 ;如果8位数据没写完,转W1
0181 22 91 RET
92
93 ;读8位子程序,读的数在ACC中
94 ;使用R2、R7
0182 7A08 95 R8BIT: MOV R2,#8 ;设置计数器R2为8
0184 C2B2 96 RR1: CLR DQ ;使数据线为低,启动读过程
0186 00 97 NOP ;等待4微秒
0187 D2B2 98 SETB DQ ;使数据线为高,以便从18B20读数据
0189 00 99 NOP ;等待4微秒
018A A2B2 100 MOV C,DQ ;将数据读入进位C
018C 13 101 RRC A ;通过右移将进位C送入ACC
018D 120220 102 LCALL DLY70 ;延时70微秒
0190 DAF2 103 DJNZ R2,RR1 ;如果8位数据没读完,转RR1
0192 22 104 RET
105
106
107 ;温度值存储子程序,使用R0
0193 783A 108 STORE: MOV R0,#BUF ;将温度缓冲区首址送R0
0195 E6 109 MOV A,@R0
0196 F5F0 110 MOV B,A
0198 5408 111 ANL A,#08H ;保留小数位
019A F531 112 MOV POINT,A
019C E5F0 113 MOV A,B
019E 54F0 114 ANL A,#0F0H ;保留高4位
01A0 F5F0 115 MOV B,A
01A2 08 116 INC R0
01A3 E6 117 MOV A,@R0
01A4 540F 118 ANL A,#0FH ;保留低4位
01A6 45F0 119 ORL A,B ;组成1个字节
01A8 C4 120 SWAP A
01A9 7843 121 MOV R0,#BUFT
01AB 20E707 122 JB ACC.7,NEG ;如果温度为负,转NEG
01AE F530 123 MOV DAT,A ;温度为正值,直接存到DAT里
01B0 7400 124 MOV A,#00H ;正号显示
A51 MACRO ASSEMBLER DS18B20 01/06/2009 10:18:37 PAGE 3
01B2 F6 125 MOV @R0,A
01B3 8018 126 JMP NST
01B5 F4 127 NEG: CPL A ;将相应的负值转换为其绝对值
01B6 F5F0 128 MOV B,A
01B8 E531 129 MOV A,POINT
01BA F4 130 CPL A
01BB C2E4 131 CLR ACC.4
01BD 2408 132 ADD A,#08H
01BF A2E4 133 MOV C,ACC.4
01C1 C5F0 134 XCH A,B
01C3 3400 135 ADDC A,#0
01C5 F530 136 MOV DAT,A ;把负温度值1-8位变正存储
01C7 85F031 137 MOV POINT,B ;把负温度值第9位变正存储
01CA 7440 138 MOV A,#40H ;负号显示
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -