📄 18b20ok.lst
字号:
(0248) RLS_DS18B20; //释放总线
(0249) delayUs(1); //2.71us(大于1us就行了)
(0250) */
(0251) }
(0252) }
(0253)
(0254) //////////////////////////////////////////////////////////
(0255)
(0256) /*******************************************************************************
(0257) functionName: unsigned int readTempDS18B20(void)
(0258) description :读DS18B20温度
(0259) ********************************************************************************/
(0260) unsigned int readTempDS18B20(void)
(0261) {
(0262) uint8 tempL,tempH;
(0263) uint16 x;
(0264) resetDS18B20();
F2 DF79 RCALL _resetDS18B20
(0265) writeuint8DS18B20(0xcc); //跳过ROM
F3 EC0C LDI R16,0xCC
F4 DFE8 RCALL _writeuint8DS18B20
(0266) writeuint8DS18B20(0x44); //启动温度转换
F5 E404 LDI R16,0x44
F6 DFE6 RCALL _writeuint8DS18B20
(0267) delayUs(1);
F7 E001 LDI R16,1
F8 DF5E RCALL _delayUs
(0268) resetDS18B20();
F9 DF72 RCALL _resetDS18B20
(0269) writeuint8DS18B20(0xcc); //跳过ROM
FA EC0C LDI R16,0xCC
FB DFE1 RCALL _writeuint8DS18B20
(0270) writeuint8DS18B20(0xbe); //读数据
FC EB0E LDI R16,0xBE
FD DFDF RCALL _writeuint8DS18B20
(0271) tempL=readuint8DS18B20();
FE DFC8 RCALL _readuint8DS18B20
FF 2EA0 MOV R10,R16
(0272) tempH=readuint8DS18B20();
100 DFC6 RCALL _readuint8DS18B20
101 2EC0 MOV R12,R16
(0273) x=(tempH<<8)|tempL;
102 2CBC MOV R11,R12
(0274) return(x);
103 0185 MOVW R16,R10
104 940C 0328 JMP pop_xgset003C
_USART_Init:
tmp --> R10
baud --> R10
106 940E 034D CALL push_xgsetF00C
108 0158 MOVW R10,R16
(0275) }
(0276)
(0277) /*******************************************************************************
(0278) 串口操作相关函数
(0279) *******************************************************************************/
(0280)
(0281) void USART_Init( unsigned int baud )
(0282) {
(0283) unsigned int tmp;
(0284) /* 设置波特率*/
(0285) tmp= F_CPU/baud/16-1;
109 0115 MOVW R2,R10
10A 2444 CLR R4
10B 2455 CLR R5
10C E040 LDI R20,0
10D E850 LDI R21,0x80
10E E760 LDI R22,0x70
10F E070 LDI R23,0
110 925A ST R5,-Y
111 924A ST R4,-Y
112 923A ST R3,-Y
113 922A ST R2,-Y
114 018A MOVW R16,R20
115 019B MOVW R18,R22
116 940E 02C4 CALL div32s
118 E140 LDI R20,0x10
119 E050 LDI R21,0
11A E060 LDI R22,0
11B E070 LDI R23,0
11C 937A ST R23,-Y
11D 936A ST R22,-Y
11E 935A ST R21,-Y
11F 934A ST R20,-Y
120 940E 02C4 CALL div32s
122 0118 MOVW R2,R16
123 0129 MOVW R4,R18
124 E041 LDI R20,1
125 E050 LDI R21,0
126 E060 LDI R22,0
127 E070 LDI R23,0
128 1A24 SUB R2,R20
129 0A35 SBC R3,R21
12A 0A46 SBC R4,R22
12B 0A57 SBC R5,R23
12C 0151 MOVW R10,R2
(0286) UBRRH = (unsigned char)(tmp>>8);
12D 2C23 MOV R2,R3
12E 2433 CLR R3
12F BC20 OUT 0x20,R2
(0287) UBRRL = (unsigned char)tmp;
130 B8A9 OUT 0x09,R10
(0288) /* 接收器与发送器使能*/
(0289) UCSRB = (1<<RXEN)|(1<<TXEN);
131 E188 LDI R24,0x18
132 B98A OUT 0x0A,R24
(0290) /* 设置帧格式: 8 个数据位, 2 个停止位*/
(0291) UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);
133 E88E LDI R24,0x8E
134 BD80 OUT 0x20,R24
135 940C 0354 JMP pop_xgsetF00C
(0292) }
(0293)
(0294) // 数据发送【发送5 到8 位数据位的帧】
(0295) void USART_Transmit( unsigned char data )
(0296) {
(0297) /* 等待发送缓冲器为空 */
(0298) while ( !( UCSRA & (1<<UDRE)) )
_USART_Transmit:
data --> R16
137 9B5D SBIS 0x0B,5
138 CFFE RJMP _USART_Transmit
(0299) ;
(0300) /* 将数据放入缓冲器,发送数据 */
(0301) UDR = data;
139 B90C OUT 0x0C,R16
13A 9508 RET
_read_rom:
end_flag --> R10
num2 --> Y,+10
chr --> R12
flag --> Y,+0
flag_count --> R20
num --> Y,+20
i --> R22
retVal --> Y,+19
temp --> Y,+18
13B 940E 0338 CALL push_xgsetF0FC
13D 9765 SBIW R28,0x15
(0302) }
(0303)
(0304)
(0305)
(0306) unsigned char read_rom(void){
(0307) unsigned char i;
(0308) unsigned char num=0;
13E 2400 CLR R0
13F 8A0C STD Y+20,R0
(0309) unsigned char num2[8];
(0310) unsigned char retVal=0;
140 8A0B STD Y+19,R0
(0311) unsigned char temp=0;
141 8A0A STD Y+18,R0
(0312) unsigned char chr;
(0313) unsigned char flag[10];
(0314) unsigned char flag_count=0;
142 2744 CLR R20
(0315) unsigned char end_flag=0;
143 24AA CLR R10
(0316) B20_num=0;
144 2422 CLR R2
145 9220 00A6 STS B20_num,R2
(0317)
(0318) do{
(0319) flag_count=0;
147 2744 CLR R20
(0320) end_flag=0;
148 24AA CLR R10
(0321) i=resetDS18B20();
149 DF22 RCALL _resetDS18B20
14A 2F60 MOV R22,R16
(0322) writeuint8DS18B20(0xf0);
14B EF00 LDI R16,0xF0
14C DF90 RCALL _writeuint8DS18B20
(0323) RLS_DS18B20; //释放总线
14D 98D0 CBI 0x1A,0
(0324) for(chr=0;chr<8;chr++){
14E 24CC CLR R12
14F C04D RJMP 0x019D
(0325) num=0;
150 2400 CLR R0
151 8A0C STD Y+20,R0
(0326) for(i=0;i<8;i++){
152 2766 CLR R22
153 C03D RJMP 0x0191
(0327) num=num>>1;
154 880C LDD R0,Y+20
155 9406 LSR R0
156 8A0C STD Y+20,R0
(0328) retVal=0;
157 2400 CLR R0
158 8A0B STD Y+19,R0
(0329) temp=0;
159 8A0A STD Y+18,R0
(0330)
(0331) temp=read_a_bit();
15A DF4D RCALL _read_a_bit
15B 8B0A STD Y+18,R16
(0332) if(temp)
15C 2E00 MOV R0,R16
15D 2300 TST R16
15E F019 BEQ 0x0162
(0333) retVal|=0x01;
15F 898B LDD R24,Y+19
160 6081 ORI R24,1
161 8B8B STD Y+19,R24
(0334) retVal<<=1;
162 880B LDD R0,Y+19
163 0C00 LSL R0
164 8A0B STD Y+19,R0
(0335) temp=0;
165 2400 CLR R0
166 8A0A STD Y+18,R0
(0336)
(0337) temp=read_a_bit();
167 DF40 RCALL _read_a_bit
168 2EE0 MOV R14,R16
169 8AEA STD Y+18,R14
(0338) if(temp)
16A 2C0E MOV R0,R14
16B 2300 TST R16
16C F019 BEQ 0x0170
(0339) retVal|=0x01;
16D 898B LDD R24,Y+19
16E 6081 ORI R24,1
16F 8B8B STD Y+19,R24
(0340)
(0341) if(retVal==bit_1){ //1
170 898B LDD R24,Y+19
171 3082 CPI R24,2
172 F431 BNE 0x0179
(0342) write_a_bit(1);
173 E001 LDI R16,1
174 DF1F RCALL _write_a_bit
(0343) num|=0x80;
175 898C LDD R24,Y+20
176 6880 ORI R24,0x80
177 8B8C STD Y+20,R24
(0344) }
178 C017 RJMP 0x0190
(0345) else if(retVal==bit_0){ //0
179 898B LDD R24,Y+19
17A 3081 CPI R24,1
17B F419 BNE 0x017F
(0346)
(0347) write_a_bit(0);
17C 2700 CLR R16
17D DF16 RCALL _write_a_bit
(0348) }else { //maybe o or 1
17E C011 RJMP 0x0190
(0349) if(flag[flag_count]==0){
17F 01CE MOVW R24,R28
180 2FE4 MOV R30,R20
181 27FF CLR R31
182 0FE8 ADD R30,R24
183 1FF9 ADC R31,R25
184 8020 LDD R2,Z+0
185 2022 TST R2
186 F419 BNE 0x018A
(0350) write_a_bit(0);
187 2700 CLR R16
188 DF0B RCALL _write_a_bit
(0351)
(0352) }
189 C005 RJMP 0x018F
(0353) else{
(0354) write_a_bit(0x01);
18A E001 LDI R16,1
18B DF08 RCALL _write_a_bit
(0355) num|=0x80;
18C 898C LDD R24,Y+20
18D 6880 ORI R24,0x80
18E 8B8C STD Y+20,R24
(0356)
(0357) }
(0358) flag_count++;
18F 9543 INC R20
190 9563 INC R22
191 3068 CPI R22,0x8
192 F408 BCC 0x0194
193 CFC0 RJMP 0x0154
(0359)
(0360) }
(0361)
(0362)
(0363) }
(0364) num2[chr]=num;
194 01CE MOVW R24,R28
195 960A ADIW R24,0xA
196 2DEC MOV R30,R12
197 27FF CLR R31
198 0FE8 ADD R30,R24
199 1FF9 ADC R31,R25
19A 880C LDD R0,Y+20
19B 8200 STD Z+0,R0
19C 94C3 INC R12
19D 2D8C MOV R24,R12
19E 3088 CPI R24,0x8
19F F408 BCC 0x01A1
1A0 CFAF RJMP 0x0150
(0365)
(0366)
(0367) }
(0368) for(i=0;i<8;i++){
1A1 2766 CLR R22
1A2 C022 RJMP 0x01C5
(0369) USART_Transmit(num2[i]);
1A3 01CE MOVW R24,R28
1A4 960A ADIW R24,0xA
1A5 2FE6 MOV R30,R22
1A6 27FF CLR R31
1A7 0FE8 ADD R30,R24
1A8 1FF9 ADC R31,R25
1A9 8100 LDD R16,Z+0
1AA DF8C RCALL _USART_Transmit
(0370) rom_seq[B20_num][i]=num2[i];
1AB EA87 LDI R24,0xA7
1AC E090 LDI R25,0
1AD 9020 00A6 LDS R2,B20_num
1AF 2433 CLR R3
1B0 0C22 LSL R2
1B1 1C33 ROL R3
1B2 0C22 LSL R2
1B3 1C33 ROL R3
1B4 0C22 LSL R2
1B5 1C33 ROL R3
1B6 0E28 ADD R2,R24
1B7 1E39 ADC R3,R25
1B8 2FE6 MOV R30,R22
1B9 27FF CLR R31
1BA 0DE2 ADD R30,R2
1BB 1DF3 ADC R31,R3
1BC 01CE MOVW R24,R28
1BD 960A ADIW R24,0xA
1BE 2FA6 MOV R26,R22
1BF 27BB CLR R27
1C0 0FA8 ADD R26,R24
1C1 1FB9 ADC R27,R25
1C2 902C LD R2,10(X)
1C3 8220 STD Z+0,R2
1C4 9563 INC R22
1C5 3068 CPI R22,0x8
1C6 F2E0 BCS 0x01A3
(0371) }
(0372) B20_num++;
1C7 9180 00A6 LDS R24,B20_num
1C9 5F8F SUBI R24,0xFF
1CA 9380 00A6 STS B20_num,R24
(0373) for(i=0;i<flag_count;i++){
1CC 2766 CLR R22
1CD C00A RJMP 0x01D8
(0374) if(flag[i]==1)end_flag++;
1CE 01CE MOVW R24,R28
1CF 2FE6 MOV R30,R22
1D0 27FF CLR R31
1D1 0FE8 ADD R30,R24
1D2 1FF9 ADC R31,R25
1D3 8180 LDD R24,Z+0
1D4 3081 CPI R24,1
1D5 F409 BNE 0x01D7
1D6 94A3 INC R10
1D7 9563 INC R22
1D8 1764 CP R22,R20
1D9 F3A0 BCS 0x01CE
(0375)
(0376) }
(0377)
(0378) if(end_flag==flag_count)
1DA 16A4 CP R10,R20
1DB F429 BNE 0x01E1
(0379) {
(0380) flag_count=0xff;
1DC EF4F LDI R20,0xFF
(0381) USART_Transmit(0xff);
1DD EF0F LDI R16,0xFF
1DE DF58 RCALL _USART_Transmit
(0382) return 0;
1DF 2700 CLR R16
1E0 C037 RJMP 0x0218
(0383) }
(0384)
(0385)
(0386)
(0387) if(flag_count>0&&flag_count!=0xff){ //has bentch
1E1 E080 LDI R24,0
1E2 1784 CP R24,R20
1E3 F008 BCS 0x01E5
1E4 C030 RJMP 0x0215
1E5 3F4F CPI R20,0xFF
1E6 F409 BNE 0x01E8
1E7 C02D RJMP 0x0215
(0388) flag_count--; //flag_count point to the next one
1E8 954A DEC R20
(0389) if(flag[flag_count]==0){
1E9 01CE MOVW R24,R28
1EA 2FE4 MOV R30,R20
1EB 27FF CLR R31
1EC 0FE8 ADD R30,R24
1ED 1FF9 ADC R31,R25
1EE 8020 LDD R2,Z+0
1EF 2022 TST R2
1F0 F491 BNE 0x0203
(0390) flag[flag_count]=1;
1F1 01CE MOVW R24,R28
1F2 2FE4 MOV R30,R20
1F3 27FF CLR R31
1F4 0FE8 ADD R30,R24
1F5 1FF9 ADC R31,R25
1F6 E081 LDI R24,1
1F7 8380 STD Z+0,R24
(0391) }
1F8 C01C RJMP 0x0215
(0392) else{
(0393) while((flag[flag_count]==1)&&(flag_count>0)){
(0394) flag[flag_count--]=0;
1F9 2F64 MOV R22,R20
1FA 2777 CLR R23
1FB 5041 SUBI R20,1
1FC 01CE MOVW R24,R28
1FD 2FE6 MOV R30,R22
1FE 27FF CLR R31
1FF 0FE8 ADD R30,R24
200 1FF9 ADC R31,R25
201 2422 CLR R2
202 8220 STD Z+0,R2
203 01CE MOVW R24,R28
204 2FE4 MOV R30,R20
205 27FF CLR R31
206 0FE8 ADD R30,R24
207 1FF9 ADC R31,R25
208 8180 LDD R24,Z+0
209 3081 CPI R24,1
20A F419 BNE 0x020E
20B E080 LDI R24,0
20C 1784 CP R24,R20
20D F358 BCS 0x01F9
(0395) }
(0396) flag[flag_count]=1;
20E 01CE MOVW R24,R28
20F 2FE4 MOV R30,R20
210 27FF CLR R31
211 0FE8 ADD R30,R24
212 1FF9 ADC R31,R25
213 E081 LDI R24,1
214 8380 STD Z+0,R24
(0397)
(0398)
(0399) }
(0400)
(0401) }
(0402)
(0403) }while(flag_count!=0xff);
215 3F4F CPI R20,0xFF
216 F009 BEQ 0x0218
217 CF2F RJMP 0x0147
218 9665 ADIW R28,0x15
219 940C 032D JMP pop_xgsetF0FC
_match_rom:
k --> R20
num --> R10
21B 92AA ST R10,-Y
21C 934A ST R20,-Y
21D 2EA0 MOV R10,R16
(0404)
(0405) }
(0406)
(0407) void match_rom(unsigned char num){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -