📄 ds18b20.lst
字号:
(0207) delayUs(255); //209.42us
00FF EF0F LDI R16,0xFF
0100 DFEF RCALL _delayUs
(0208) delayUs(255); //83.28us
0101 EF0F LDI R16,0xFF
0102 DFED RCALL _delayUs
(0209) //以上的三个延时大于480us
(0210) RLS_DS18B20; //释放总线,总线自动上拉
0103 98B9 CBI 0x17,1
(0211) _NOP();
0104 0000 NOP
0105 C008 RJMP 0x010E
(0212) while(STU_DS18B20)
(0213) {
(0214) delayUs(5); //5.15us
0106 E005 LDI R16,5
0107 DFE8 RCALL _delayUs
(0215) errTime++;
0108 9543 INC R20
(0216) if(errTime>20)
0109 E184 LDI R24,0x14
010A 1784 CP R24,R20
010B F410 BCC 0x010E
(0217) return(0x00); //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
010C 2700 CLR R16
010D C00F RJMP 0x011D
010E 99B1 SBIC 0x16,1
010F CFF6 RJMP 0x0106
(0218) }
(0219) errTime=0;
0110 2744 CLR R20
0111 C008 RJMP 0x011A
(0220) while(!(STU_DS18B20))
(0221) {
(0222) delayUs(5); //5.15us
0112 E005 LDI R16,5
0113 DFDC RCALL _delayUs
(0223) errTime++;
0114 9543 INC R20
(0224) if(errTime>50)
0115 E382 LDI R24,0x32
0116 1784 CP R24,R20
0117 F410 BCC 0x011A
(0225) return(0x00); //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
0118 2700 CLR R16
0119 C003 RJMP 0x011D
011A 9BB1 SBIS 0x16,1
011B CFF6 RJMP 0x0112
(0226) }
(0227) return(0xff);
011C EF0F LDI R16,0xFF
011D 940E02D9 CALL pop_gset1
011F 9508 RET
_readByteDS18B20:
retVal --> R20
i --> R22
0120 940E02D4 CALL push_gset2
(0228) }
(0229)
(0230)
(0231) /**********************************************************************
(0232) functionName: BYTE readByteDS18B20(void)
(0233) description :读DS18B20一个字节2
(0234) **********************************************************************/
(0235) unsigned char readByteDS18B20(void)
(0236) {
(0237) unsigned char i;
(0238) unsigned char retVal=0;
0122 2744 CLR R20
(0239) RLS_DS18B20; //释放总线
0123 98B9 CBI 0x17,1
(0240) for(i=8;i>0;i--)
0124 E068 LDI R22,0x8
0125 C01A RJMP 0x0140
(0241) {
(0242) retVal>>=1;
0126 9546 LSR R20
(0243) HLD_DS18B20; //Maga16控制总线
0127 9AB9 SBI 0x17,1
(0244) CLR_DS18B20; //强制拉低
0128 98C1 CBI 0x18,1
(0245) NOP();
0129 0000 NOP
(0246) NOP();
012A 0000 NOP
(0247) NOP();
012B 0000 NOP
(0248) NOP();
012C 0000 NOP
(0249) NOP();
012D 0000 NOP
(0250) NOP();
012E 0000 NOP
(0251) NOP();
012F 0000 NOP
(0252) NOP(); //延时大于1us
0130 0000 NOP
(0253) RLS_DS18B20; //释放总线,DS18B20会将总线强制拉低
0131 98B9 CBI 0x17,1
(0254) NOP();
0132 0000 NOP
(0255) NOP();
0133 0000 NOP
(0256) NOP();
0134 0000 NOP
(0257) if(STU_DS18B20)
0135 9BB1 SBIS 0x16,1
0136 C001 RJMP 0x0138
(0258) retVal|=0x80;
0137 6840 ORI R20,0x80
(0259)
(0260)
(0261) delayUs(20); //14.92us
0138 E104 LDI R16,0x14
0139 DFB6 RCALL _delayUs
(0262) delayUs(30); //14.92us
013A E10E LDI R16,0x1E
013B DFB4 RCALL _delayUs
(0263) RLS_DS18B20; //释放总线
013C 98B9 CBI 0x17,1
(0264) delayUs(45); //30.38us
013D E20D LDI R16,0x2D
013E DFB1 RCALL _delayUs
013F 956A DEC R22
0140 2422 CLR R2
0141 1626 CP R2,R22
0142 F318 BCS 0x0126
(0265)
(0266) }
(0267) delayUs(1); //2.71us(大于1us就行了)
0143 E001 LDI R16,1
0144 DFAB RCALL _delayUs
(0268) return(retVal);
0145 2F04 MOV R16,R20
0146 940E02C5 CALL pop_gset2
0148 9508 RET
_writeByteDS18B20:
temp --> R20
i --> R22
wb --> R10
0149 940E02D2 CALL push_gset3
014B 2EA0 MOV R10,R16
(0269) }
(0270)
(0271)
(0272) /**********************************************************************
(0273) functionName: BYTE readByteDS18B20(void)
(0274) description :写DS18B20一个字节
(0275) **********************************************************************/
(0276) void writeByteDS18B20(unsigned char wb)
(0277) {
(0278) unsigned char i;
(0279) unsigned char temp;
(0280) RLS_DS18B20; //释放总线
014C 98B9 CBI 0x17,1
(0281) for(i=0;i<8;i++)
014D 2766 CLR R22
014E C016 RJMP 0x0165
(0282) {
(0283) HLD_DS18B20; //Maga16控制总线
014F 9AB9 SBI 0x17,1
(0284) CLR_DS18B20; //强制拉低
0150 98C1 CBI 0x18,1
(0285) delayUs(16); //14.92us
0151 E100 LDI R16,0x10
0152 DF9D RCALL _delayUs
(0286) temp=wb>>i;
0153 2D0A MOV R16,R10
0154 2F16 MOV R17,R22
0155 940E030A CALL lsr8
0157 2F40 MOV R20,R16
(0287) temp&=0x01;
0158 7041 ANDI R20,1
(0288) if(temp)
0159 F011 BEQ 0x015C
(0289) RLS_DS18B20; //释放总线
015A 98B9 CBI 0x17,1
015B C001 RJMP 0x015D
(0290) else
(0291) CLR_DS18B20; //强制拉低
015C 98C1 CBI 0x18,1
(0292) delayUs(16); //14.92us
015D E100 LDI R16,0x10
015E DF91 RCALL _delayUs
(0293) delayUs(35); //30.38us
015F E203 LDI R16,0x23
0160 DF8F RCALL _delayUs
(0294) RLS_DS18B20; //释放总线
0161 98B9 CBI 0x17,1
(0295) delayUs(1); //2.71us(大于1us就行了)
0162 E001 LDI R16,1
0163 DF8C RCALL _delayUs
0164 9563 INC R22
0165 3068 CPI R22,0x8
0166 F340 BCS 0x014F
0167 940E02C8 CALL pop_gset3
0169 9508 RET
_readTempDS18B20:
x --> R20
tempH --> R20
tempL --> R22
016A 940E02D4 CALL push_gset2
(0296) }
(0297) }
(0298)
(0299)
(0300) /**********************************************************************
(0301) functionName: unsigned int readTempDS18B20(void)
(0302) description :读DS18B20温度
(0303) **********************************************************************/
(0304) unsigned int readTempDS18B20(void)
(0305) {
(0306) unsigned char tempL,tempH;
(0307) unsigned int x;
(0308) resetDS18B20();
016C DF89 RCALL _resetDS18B20
(0309) writeByteDS18B20(0xcc); //跳过ROM
016D EC0C LDI R16,0xCC
016E DFDA RCALL _writeByteDS18B20
(0310) writeByteDS18B20(0x44); //启动温度转换
016F E404 LDI R16,0x44
0170 DFD8 RCALL _writeByteDS18B20
(0311) delayUs(1);
0171 E001 LDI R16,1
0172 DF7D RCALL _delayUs
(0312) tempL=resetDS18B20();
0173 DF82 RCALL _resetDS18B20
(0313) writeByteDS18B20(0xcc); //跳过ROM
0174 EC0C LDI R16,0xCC
0175 DFD3 RCALL _writeByteDS18B20
(0314) writeByteDS18B20(0xbe); //读数据
0176 EB0E LDI R16,0xBE
0177 DFD1 RCALL _writeByteDS18B20
(0315) tempL=readByteDS18B20();
0178 DFA7 RCALL _readByteDS18B20
0179 2F60 MOV R22,R16
(0316) tempH=readByteDS18B20();
017A DFA5 RCALL _readByteDS18B20
017B 2F40 MOV R20,R16
(0317) x=(tempH<<8)|tempL;
017C 2F54 MOV R21,R20
017D 2F46 MOV R20,R22
(0318) return(x);
017E 018A MOVW R16,R20
017F 940E02C5 CALL pop_gset2
0181 9508 RET
_realTemp:
Temp --> Y+0
0182 9724 SBIW R28,4
(0319) }
(0320)
(0321)
(0322) /******************************************************************************
(0323) * 名称:float realTemp(void)
(0324) * 说明:倍率为0.0625
(0325) * 功能:计算真实温度值
(0326) * 调用:unsigned int readTempDS18B20(void)
(0327) * 输入:无
(0328) * 返回值:真实温度值(浮点数)
(0329) *******************************************************************************/
(0330) float realTemp(void)
(0331) {
(0332) float Temp= readTempDS18B20()*0.0625;
0183 DFE6 RCALL _readTempDS18B20
0184 0118 MOVW R2,R16
0185 E604 LDI R16,0x64
0186 E010 LDI R17,0
0187 940E02F6 CALL lpm32
0189 933A ST R19,-Y
018A 932A ST R18,-Y
018B 931A ST R17,-Y
018C 930A ST R16,-Y
018D E600 LDI R16,0x60
018E E010 LDI R17,0
018F 940E02F6 CALL lpm32
0191 933A ST R19,-Y
0192 932A ST R18,-Y
0193 931A ST R17,-Y
0194 930A ST R16,-Y
0195 0181 MOVW R16,R2
0196 9516 LSR R17
0197 9507 ROR R16
0198 940E0358 CALL int2fp
019A 933A ST R19,-Y
019B 932A ST R18,-Y
019C 931A ST R17,-Y
019D 930A ST R16,-Y
019E 940E0444 CALL empy32fs
01A0 0181 MOVW R16,R2
01A1 7001 ANDI R16,1
01A2 7010 ANDI R17,0
01A3 940E0358 CALL int2fp
01A5 933A ST R19,-Y
01A6 932A ST R18,-Y
01A7 931A ST R17,-Y
01A8 930A ST R16,-Y
01A9 940E03B2 CALL add32fs
01AB 940E0447 CALL empy32f
01AD 01FE MOVW R30,R28
01AE 8300 STD Z+0,R16
01AF 8311 STD Z+1,R17
01B0 8322 STD Z+2,R18
01B1 8333 STD Z+3,R19
(0333) return Temp;
01B2 01FE MOVW R30,R28
01B3 8100 LDD R16,Z+0
01B4 8111 LDD R17,Z+1
01B5 8122 LDD R18,Z+2
01B6 8133 LDD R19,Z+3
01B7 9624 ADIW R28,4
01B8 9508 RET
_displayTemp:
l --> Y+3
T --> Y+2
temp --> R10
num --> Y+19
j --> R22
i --> R20
01B9 940E02D0 CALL push_gset4
01BB 2F62 MOV R22,R18
01BC 2F40 MOV R20,R16
01BD 972B SBIW R28,0xB
(0334) }
(0335)
(0336)
(0337) /******************************************************************************
(0338) * 名称:displayTemp
(0339) * 说明:num为真实温度值,i列.j为行,
(0340) * 功能:显示温度值
(0341) * 调用:LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0342) * 输入:真实温度值
(0343) * 返回值:无
(0344) *******************************************************************************/
(0345) displayTemp( unsigned char i,unsigned char j, float num)//LCD显示
(0346) {unsigned char T[5] ,l;
(0347) unsigned int temp=num*100;
01BE E50C LDI R16,0x5C
01BF E010 LDI R17,0
01C0 940E02F6 CALL lpm32
01C2 933A ST R19,-Y
01C3 932A ST R18,-Y
01C4 931A ST R17,-Y
01C5 930A ST R16,-Y
01C6 01FE MOVW R30,R28
01C7 8827 LDD R2,Z+23
01C8 8C30 LDD R3,Z+24
01C9 8C41 LDD R4,Z+25
01CA 8C52 LDD R5,Z+26
01CB 925A ST R5,-Y
01CC 924A ST R4,-Y
01CD 923A ST R3,-Y
01CE 922A ST R2,-Y
01CF 940E0447 CALL empy32f
01D1 01FE MOVW R30,R28
01D2 8307 STD Z+7,R16
01D3 8710 STD Z+8,R17
01D4 8721 STD Z+9,R18
01D5 8732 STD Z+10,R19
01D6 01FE MOVW R30,R28
01D7 8027 LDD R2,Z+7
01D8 8430 LDD R3,Z+8
01D9 8441 LDD R4,Z+9
01DA 8452 LDD R5,Z+10
01DB 925A ST R5,-Y
01DC 924A ST R4,-Y
01DD 923A ST R3,-Y
01DE 922A ST R2,-Y
01DF E508 LDI R16,0x58
01E0 E010 LDI R17,0
01E1 940E02F6 CALL lpm32
01E3 933A ST R19,-Y
01E4 932A ST R18,-Y
01E5 931A ST R17,-Y
01E6 930A ST R16,-Y
01E7 940E0413 CALL cmp32f
01E9 F0D4 BLT 0x0204
01EA 01FE MOVW R30,R28
01EB 8027 LDD R2,Z+7
01EC 8430 LDD R3,Z+8
01ED 8441 LDD R4,Z+9
01EE 8452 LDD R5,Z+10
01EF 925A ST R5,-Y
01F0 924A ST R4,-Y
01F1 923A ST R3,-Y
01F2 922A ST R2,-Y
01F3 E508 LDI R16,0x58
01F4 E010 LDI R17,0
01F5 940E02F6 CALL lpm32
01F7 933A ST R19,-Y
01F8 932A ST R18,-Y
01F9 931A ST R17,-Y
01FA 930A ST R16,-Y
01FB 940E03BD CALL sub32f
01FD 940E0310 CALL fp2int
01FF 01C8 MOVW R24,R16
0200 5080 SUBI R24,0
0201 4890 SBCI R25,0x80
0202 016C MOVW R12,R24
0203 C008 RJMP 0x020C
0204 01FE MOVW R30,R28
0205 8107 LDD R16,Z+7
0206 8510 LDD R17,Z+8
0207 8521 LDD R18,Z+9
0208 8532 LDD R19,Z+10
0209 940E0310 CALL fp2int
020B 0168 MOVW R12,R16
020C 0156 MOVW R10,R12
(0348) T[0]='0'+temp/1000;
020D EE28 LDI R18,0xE8
020E E033 LDI R19,3
020F 0185 MOVW R16,R10
0210 940E02AB CALL div16u
0212 01C8 MOVW R24,R16
0213 96C0 ADIW R24,0x30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -