📄 ds18b20.lst
字号:
A51 MACRO ASSEMBLER DS18B20 04/23/2007 23:23:06 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
1 ;===========================================================================
2 ;DS18B20与77E58系列单片机的接口程序
3 ;单片机晶振40MHz,机器周期为0.1uS
4 ;此代码已调试通过。
5
6 ; 温度转换--->....→读取温度→CRC校验→温度转换→数据处理→其他服务→
7 ; ↑_________↓_____________________________↓
8 ;===========================================================================
9 ;1 wire 总线DQ
00B5 10 DQ bit P3^5
11
12
13 ;===========================================================================
14 NAME DS18B20 ;模块名称
15
16 ;===========================================================================
17
18 ;===========================================================================
19 ;主机对1 wire 设备初始化子程序
20 ;函数原型:bit reset_ds18b20(void)
21 ;返回值Cy:1=设备存在;0=设备不存在
22 ;===========================================================================
23 ?PR?reset_ds18b20?DS18B20 SEGMENT CODE
24 PUBLIC reset_ds18b20
25
---- 26 RSEG ?PR?reset_ds18b20?DS18B20
0000 27 reset_ds18b20:
0000 C2AF 28 clr ea;
0002 C2B5 29 clr DQ;
0004 120000 F 30 call delay_500uS;
0007 D2B5 31 setb DQ;
0009 120000 F 32 call delay_90uS;
000C D3 33 setb c; 设备存在
000D 30B503 34 jnb DQ,i_ret;
0010 C3 35 clr c; 设备不存在
0011 0100 F 36 ajmp j_ret;
0013 120000 F 37 i_ret: call delay_400uS;
38
0016 D2AF 39 j_ret: setb ea;
0018 22 40 ret
41
42 ;==============================================================================
43 ;主机向DS18B20写一个字节数据
44 ;入口:欲写的数据在A中
45
46
47 ;==============================================================================
0019 48 write_byte:
0019 C0D0 49 push psw;
001B 7C08 50 mov r4,#8;
001D C3 51 clr c;
001E 52 w_loop1:
001E 13 53 rrc a; 数据的低位先发,后发高位
001F C2AF 54 clr ea;//禁止中断
0021 4009 55 jc write1;
0023 C2B5 56 clr DQ;
0025 120000 F 57 call delay_90uS;
0028 D2B5 58 setb DQ;
A51 MACRO ASSEMBLER DS18B20 04/23/2007 23:23:06 PAGE 2
002A 0100 F 59 ajmp w_loop2;
002C C2B5 60 write1: clr DQ;
61 ; mov r7,#1; 恢复时间延时必须大于1uS
62 ; djnz r7,$;
002E 00 63 NOP
002F D2B5 64 setb DQ;
0031 120000 F 65 call delay_90uS;
0034 D2AF 66 w_loop2:setb ea;开中断
0036 DCE6 67 djnz r4,w_loop1;
0038 D0D0 68 pop psw;
003A 22 69 ret
70
71 ;==============================================================================
72 ;主机从DS18B20读取一个字节数据
73 ;出口:数据在A中
74 ;
75
76 ;===============================================================================
003B 77 read_byte:
78
003B C0D0 79 push psw;
003D 7C08 80 mov r4,#8;
003F E4 81 clr a
0040 82 read_loop:
0040 C2AF 83 clr ea;禁止中断
0042 C2B5 84 clr DQ;
85 ; mov r7,#1; 拉低总线时间应大于1uS
86 ; djnz r7,$;
0044 00 87 NOP
0045 D2B5 88 setb DQ;
0047 7F05 89 mov r7,#5; //必须在从拉低总线开始的15uS以内采样总线
0049 DFFE 90 djnz r7,$;
91 ; mov c,DQ;
004B 120000 F 92 call DQ_select_responses1
004E 13 93 rrc a;
004F 7F19 94 mov r7,#25;延时50uS
0051 DFFE 95 djnz r7,$;
96 ;mov r7,#1;3; 恢复时间延时必须大于1uS
97 ;djnz r7,$;
0053 00 98 NOP
0054 D2AF 99 setb ea;开中断
0056 DCE8 100 djnz r4,read_loop;
0058 D0D0 101 pop psw;
005A 22 102 ret
005B 103 DQ_select_responses1:
005B C0E0 104 PUSH acc
005D 7402 105 mov a,#2
005F 5580 106 anl a,P0 ;选择对应的端口
0061 D3 107 setb c
0062 6002 108 jz c_next
0064 8001 109 sjmp c_next1
0066 C3 110 c_next: clr c
0067 111 c_next1:
0067 D0E0 112 pop acc
0069 22 113 ret
114 ;===============================================================================
115 ;读取ROM序列码
116 ;函数原型:void read_rom(unsigned char data * buf)
117 ?PR?_read_rom?DS18B20 SEGMENT CODE
118 PUBLIC _read_rom
119
---- 120 RSEG ?PR?_read_rom?DS18B20
0000 121 _read_rom:
0000 EF 122 mov a,r7;
0001 F8 123 mov r0,a;
0002 7B08 124 mov r3,#8;
A51 MACRO ASSEMBLER DS18B20 04/23/2007 23:23:06 PAGE 3
0004 120000 F 125 call reset_ds18b20;
0007 7433 126 mov a,#33h;
0009 120000 F 127 call write_byte;
000C 120000 F 128 read: call read_byte;
000F F6 129 mov @r0,a;
0010 08 130 inc r0;
0011 DBF9 131 djnz r3,read;
0013 120000 F 132 call reset_ds18b20;
0016 22 133 ret
134
135
136
137 ;=================================================================================
138 ;单从设备温度转换函数
139 ;函数原型:void temp_conver(void)
140 ;
141
142 ;=================================================================================
143 ?PR?temp_conver?DS18B20 SEGMENT CODE
144 PUBLIC temp_conver
145
---- 146 RSEG ?PR?temp_conver?DS18B20
0000 147 temp_conver:
0000 120000 F 148 call reset_ds18b20;
0003 74CC 149 mov A,#0cch; //跳跃ROM命令
0005 120000 F 150 call write_byte;
0008 7444 151 mov A,#044h; //温度转换命令
000A 120000 F 152 call write_byte;
000D 22 153 ret
154
155 ;=================================================================================
156 ;主机读取单从设备暂存器函数
157 ;函数原型:void read_scrat(unsigned char data * buf,unsigned char n)
158 ;入口:r7(buf):数据缓冲区首址
159 ; R5(n):欲读取的字节数
160 ;================================================================================
161 ?PR?_read_scrat?DS18B20 SEGMENT CODE
162 PUBLIC _read_scrat
163
---- 164 RSEG ?PR?_read_scrat?DS18B20
0000 165 _read_scrat:
0000 EF 166 mov a,r7;
0001 F8 167 mov r0,a;
0002 ED 168 mov a,r5;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -