📄 ds18b20.lst
字号:
FE C010 RJMP 0x010F
(0036) {
(0037) CLR_OP_1WIRE;
FF 98AA CBI 0x15,2
(0038) if(x&(1<<m)) //写数据了,先写低位的!
100 E001 LDI R16,1
101 2F14 MOV R17,R20
102 940E 01AD CALL lsl8
104 2C2A MOV R2,R10
105 2220 AND R2,R16
106 F011 BEQ 0x0109
(0039) SET_OP_1WIRE;
107 9AAA SBI 0x15,2
108 C001 RJMP 0x010A
(0040) else
(0041) {CLR_OP_1WIRE;}
109 98AA CBI 0x15,2
(0042) delay_nus(40); //15~60us
10A E208 LDI R16,0x28
10B E010 LDI R17,0
10C D04A RCALL _delay_nus
(0043) SET_OP_1WIRE;
10D 9AAA SBI 0x15,2
10E 9543 INC R20
10F 3048 CPI R20,0x8
110 F370 BCS 0x00FF
(0044) }
(0045) SET_OP_1WIRE;
111 9AAA SBI 0x15,2
112 9149 LD R20,Y+
113 90A9 LD R10,Y+
114 9508 RET
_read_1820:
temp --> R10
k --> R22
n --> R20
115 940E 019F CALL push_xgsetF00C
(0046) }
(0047) unsigned char read_1820(void)
(0048) {
(0049) unsigned char temp,k,n;
(0050) temp=0;
117 24AA CLR R10
(0051) for(n=0;n<8;n++)
118 2744 CLR R20
119 C018 RJMP 0x0132
(0052) {
(0053) CLR_OP_1WIRE;
11A 98AA CBI 0x15,2
(0054) SET_OP_1WIRE;
11B 9AAA SBI 0x15,2
(0055) CLR_DIR_1WIRE;
11C 98A2 CBI 0x14,2
(0056) k=(CHECK_IP_1WIRE); //读数据,从低位开始
11D B363 IN R22,0x13
11E 7064 ANDI R22,4
(0057) if(k)
11F F031 BEQ 0x0126
(0058) temp|=(1<<n);
120 E001 LDI R16,1
121 2F14 MOV R17,R20
122 940E 01AD CALL lsl8
124 2AA0 OR R10,R16
125 C007 RJMP 0x012D
(0059) else
(0060) temp&=~(1<<n);
126 E001 LDI R16,1
127 2F14 MOV R17,R20
128 940E 01AD CALL lsl8
12A 2E20 MOV R2,R16
12B 9420 COM R2
12C 20A2 AND R10,R2
(0061) delay_nus(80); //60~120us
12D E500 LDI R16,0x50
12E E010 LDI R17,0
12F D027 RCALL _delay_nus
(0062) SET_DIR_1WIRE;
130 9AA2 SBI 0x14,2
131 9543 INC R20
132 3048 CPI R20,0x8
133 F330 BCS 0x011A
(0063) }
(0064) return (temp);
134 2D0A MOV R16,R10
135 940C 01A6 JMP pop_xgsetF00C
_gettemp:
wm3 --> R10
wm2 --> R10
wm1 --> R22
wm0 --> R20
teml --> R20
temh --> R22
137 940E 019F CALL push_xgsetF00C
(0065) }
(0066)
(0067) unsigned char gettemp(void) //读取温度值
(0068) {
(0069) unsigned char temh,teml,wm0,wm1,wm2,wm3;
(0070) init_1820(); //复位18b20
139 DFAD RCALL _init_1820
(0071) write_1820(0xcc); // 发出转换命令
13A EC0C LDI R16,0xCC
13B DFBE RCALL _write_1820
(0072) write_1820(0x44);
13C E404 LDI R16,0x44
13D DFBC RCALL _write_1820
(0073) delay_nms(1100); //不延时也好使,不知道怎么回事!
13E E40C LDI R16,0x4C
13F E014 LDI R17,4
140 D02E RCALL _delay_nms
(0074) init_1820();
141 DFA5 RCALL _init_1820
(0075) write_1820(0xcc); //发出读命令
142 EC0C LDI R16,0xCC
143 DFB6 RCALL _write_1820
(0076) write_1820(0xbe);
144 EB0E LDI R16,0xBE
145 DFB4 RCALL _write_1820
(0077) teml=read_1820(); //读数据
146 DFCE RCALL _read_1820
147 2F40 MOV R20,R16
(0078) temh=read_1820();
148 DFCC RCALL _read_1820
149 2F60 MOV R22,R16
(0079) wm0=teml&0xF0; //只要高8位的低四位和低8位的高四位,温度范围0~99啦!
14A 7F40 ANDI R20,0xF0
(0080) wm1=temh&0x0F;
14B 706F ANDI R22,0xF
(0081) wm2=wm1+wm0; //16进制转10进制
14C 2EA6 MOV R10,R22
14D 0EA4 ADD R10,R20
(0082) wm3=wm2/100;
14E E614 LDI R17,0x64
14F 2D0A MOV R16,R10
150 940E 017F CALL div8u
152 2EA0 MOV R10,R16
(0083) //wmh=(wm2%100)/10; //出口参数了!wmh是显示的高位,wml使显示的低位
(0084) //wml=(wm2%100)%10;
(0085) return wm3;
153 940C 01A6 JMP pop_xgsetF00C
(0086) }
(0087)
(0088)
(0089) //延时程序:
(0090)
(0091) //delay.h
(0092) /*-----------------------------------------------------------------------
(0093) 延时函数
(0094) 系统时钟:8M
(0095) -----------------------------------------------------------------------*/
(0096) void delay_1us(void) //1us延时函数
(0097) {
(0098) asm("nop");
_delay_1us:
155 0000 NOP
156 9508 RET
_delay_nus:
i --> R20
n --> R10
157 940E 0195 CALL push_xgset300C
159 0158 MOVW R10,R16
(0099) }
(0100)
(0101) void delay_nus(unsigned int n) //N us延时函数
(0102) {
(0103) unsigned int i=0;
15A 2744 CLR R20
15B 2755 CLR R21
(0104) for (i=0;i<n;i++)
15C C003 RJMP 0x0160
(0105) delay_1us();
15D DFF7 RCALL _delay_1us
15E 5F4F SUBI R20,0xFF
15F 4F5F SBCI R21,0xFF
160 154A CP R20,R10
161 055B CPC R21,R11
162 F3D0 BCS 0x015D
163 940C 019A JMP pop_xgset300C
(0106) }
(0107)
(0108) void delay_1ms(void) //1ms延时函数
(0109) {
(0110) unsigned int i;
(0111) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
165 2700 CLR R16
166 2711 CLR R17
167 C002 RJMP 0x016A
168 5F0F SUBI R16,0xFF
169 4F1F SBCI R17,0xFF
16A 3704 CPI R16,0x74
16B E0E4 LDI R30,4
16C 071E CPC R17,R30
16D F3D0 BCS 0x0168
16E 9508 RET
_delay_nms:
i --> R20
n --> R10
16F 940E 0195 CALL push_xgset300C
171 0158 MOVW R10,R16
(0112) }
(0113)
(0114) void delay_nms(unsigned int n) //N ms延时函数
(0115) {
(0116) unsigned int i=0;
172 2744 CLR R20
173 2755 CLR R21
(0117) for (i=0;i<n;i++)
174 C003 RJMP 0x0178
(0118) delay_1ms();
FILE: <library>
175 DFEF RCALL _delay_1ms
176 5F4F SUBI R20,0xFF
177 4F5F SBCI R21,0xFF
178 154A CP R20,R10
179 055B CPC R21,R11
17A F3D0 BCS 0x0175
17B 940C 019A JMP pop_xgset300C
mod8u:
17D 9468 BSET 6
17E C001 RJMP xdiv8u
div8u:
17F 94E8 BCLR 6
xdiv8u:
180 932A ST R18,-Y
181 92FA ST R15,-Y
182 92EA ST R14,-Y
183 24FF CLR R15
184 24EE CLR R14
185 E120 LDI R18,0x10
186 0F00 LSL R16
187 1CFF ROL R15
188 1CEE ROL R14
189 16E1 CP R14,R17
18A F010 BCS 0x018D
18B 1AE1 SUB R14,R17
18C 9503 INC R16
18D 952A DEC R18
18E F7B9 BNE 0x0186
18F F40E BRTC 0x0191
190 2D0E MOV R16,R14
191 90E9 LD R14,Y+
192 90F9 LD R15,Y+
193 9129 LD R18,Y+
194 9508 RET
push_xgset300C:
195 935A ST R21,-Y
196 934A ST R20,-Y
197 92BA ST R11,-Y
198 92AA ST R10,-Y
199 9508 RET
pop_xgset300C:
19A 90A9 LD R10,Y+
19B 90B9 LD R11,Y+
19C 9149 LD R20,Y+
19D 9159 LD R21,Y+
19E 9508 RET
push_xgsetF00C:
19F 937A ST R23,-Y
1A0 936A ST R22,-Y
1A1 935A ST R21,-Y
1A2 934A ST R20,-Y
1A3 92BA ST R11,-Y
1A4 92AA ST R10,-Y
1A5 9508 RET
pop_xgsetF00C:
1A6 90A9 LD R10,Y+
1A7 90B9 LD R11,Y+
1A8 9149 LD R20,Y+
1A9 9159 LD R21,Y+
1AA 9169 LD R22,Y+
1AB 9179 LD R23,Y+
1AC 9508 RET
lsl8:
1AD 2311 TST R17
1AE F019 BEQ 0x01B2
1AF 0F00 LSL R16
1B0 951A DEC R17
1B1 CFFB RJMP lsl8
1B2 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -