📄 ds1820.lst
字号:
(0048)
(0049) /*延时函数*/
(0050) /*频率为1MHz,延时:i X 10 + 16uS*/
(0051) void delay_10us(unsigned char i) {
(0052)
(0053) if (i == 0) {
_delay_10us:
i --> R16
0131 2300 TST R16
0132 F429 BNE 0x0138
(0054) return ;
0133 C009 RJMP 0x013D
(0055) }
(0056) while (i--) {
(0057) NOP();
0134 0000 NOP
(0058) NOP();
0135 0000 NOP
(0059) NOP();
0136 0000 NOP
(0060) NOP();
0137 0000 NOP
0138 2E20 MOV R2,R16
0139 2433 CLR R3
013A 5001 SUBI R16,1
013B 2022 TST R2
013C F7B9 BNE 0x0134
013D 9508 RET
_ds1820_reset:
i --> R20
013E 940E0223 CALL push_gset1
(0061) }
(0062) }
(0063)
(0064) /*DS18B20复位函数*/
(0065) unsigned char ds1820_reset(void) {
(0066)
(0067) unsigned char i;
(0068) flag = SREG; /*中断保护*/
0140 B62F IN R2,0x3F
0141 92200076 STS flag,R2
(0069) CLI(); /*关中断*/
0143 94F8 BCLR 7
(0070) DQ_OUT;
0144 9AD7 SBI 0x1A,7
(0071) DQ_CLR;
0145 98DF CBI 0x1B,7
(0072) delay_10us(49); /*延时500uS(480-960)*/
0146 E301 LDI R16,0x31
0147 DFE9 RCALL _delay_10us
(0073) DQ_SET;
0148 9ADF SBI 0x1B,7
(0074) DQ_IN;
0149 98D7 CBI 0x1A,7
(0075) delay_10us(7); /*延时80uS*/
014A E007 LDI R16,7
014B DFE5 RCALL _delay_10us
(0076) i = DQ_R;
014C B349 IN R20,0x19
014D 7840 ANDI R20,0x80
(0077) delay_10us(49); /*延时500uS(保持>480uS)*/
014E E301 LDI R16,0x31
014F DFE1 RCALL _delay_10us
(0078) if (flag & 0x80) { /*恢复中断状态*/
0150 90200076 LDS R2,flag
0152 FE27 SBRS R2,7
0153 C001 RJMP 0x0155
(0079) SEI();
0154 9478 BSET 7
(0080) }
(0081) if (i) {
0155 2344 TST R20
0156 F011 BEQ 0x0159
(0082) return 0x00;
0157 2700 CLR R16
0158 C001 RJMP 0x015A
(0083) }
(0084) else {
(0085) return 0x01;
0159 E001 LDI R16,1
015A 940E0226 CALL pop_gset1
015C 9508 RET
_ds1820_read_byte:
value --> R20
i --> R22
015D 940E0221 CALL push_gset2
(0086) }
(0087) }
(0088)
(0089) /*===================================================================
(0090) // 函数功能: 从 1-wire 总线上读取一个字节
(0091) // 形参: void
(0092) // 返回: unsigned char 读到的值
(0093) // 编写: 2004/8/25
(0094) ===================================================================*/
(0095) unsigned char ds1820_read_byte(void) {
(0096)
(0097) unsigned char i;
(0098) unsigned char value = 0;
015F 2744 CLR R20
(0099) flag = SREG; /*中断保护*/
0160 B62F IN R2,0x3F
0161 92200076 STS flag,R2
(0100) CLI(); /*关中断*/
0163 94F8 BCLR 7
(0101) for (i = 8; i != 0; i--) {
0164 E068 LDI R22,0x8
0165 C019 RJMP 0x017F
(0102) value >>= 1;
0166 9546 LSR R20
(0103) DQ_OUT;
0167 9AD7 SBI 0x1A,7
(0104) DQ_CLR;
0168 98DF CBI 0x1B,7
(0105) NOP(); /*延时4uS*/
0169 0000 NOP
(0106) NOP();
016A 0000 NOP
(0107) NOP();
016B 0000 NOP
(0108) NOP();
016C 0000 NOP
(0109) DQ_SET;
016D 9ADF SBI 0x1B,7
(0110) DQ_IN;
016E 98D7 CBI 0x1A,7
(0111) NOP(); /*延时10uS*/
016F 0000 NOP
(0112) NOP();
0170 0000 NOP
(0113) NOP();
0171 0000 NOP
(0114) NOP();
0172 0000 NOP
(0115) NOP();
0173 0000 NOP
(0116) NOP();
0174 0000 NOP
(0117) NOP();
0175 0000 NOP
(0118) NOP();
0176 0000 NOP
(0119) NOP();
0177 0000 NOP
(0120) NOP();
0178 0000 NOP
(0121) if (DQ_R) {
0179 9BCF SBIS 0x19,7
017A C001 RJMP 0x017C
(0122) value|=0x80;
017B 6840 ORI R20,0x80
(0123) }
(0124) delay_10us(5); /*延时60uS*/
017C E005 LDI R16,5
017D DFB3 RCALL _delay_10us
017E 956A DEC R22
017F 2366 TST R22
0180 F729 BNE 0x0166
(0125) }
(0126) if (flag & 0x80) { /*恢复中断状态*/
0181 90200076 LDS R2,flag
0183 FE27 SBRS R2,7
0184 C001 RJMP 0x0186
(0127) SEI();
0185 9478 BSET 7
(0128) }
(0129) return(value);
0186 2F04 MOV R16,R20
0187 940E0218 CALL pop_gset2
0189 9508 RET
_ds1820_write_byte:
i --> R20
value --> R22
018A 940E0221 CALL push_gset2
018C 2F60 MOV R22,R16
(0130) }
(0131)
(0132) /*===================================================================
(0133) // 函数功能: 向 1-WIRE 总线上写一个字节
(0134) // 形参: value 写到总线上的值
(0135) // 返回: void
(0136) // 编写: 2004/8/25
(0137) ===================================================================*/
(0138) void ds1820_write_byte(unsigned char value) {
(0139)
(0140) unsigned char i;
(0141) flag = SREG; /*中断保护*/
018D B62F IN R2,0x3F
018E 92200076 STS flag,R2
(0142) CLI(); /*关中断*/
0190 94F8 BCLR 7
(0143) for (i = 8; i != 0; i--) {
0191 E048 LDI R20,0x8
0192 C00D RJMP 0x01A0
(0144) DQ_OUT;
0193 9AD7 SBI 0x1A,7
(0145) DQ_CLR;
0194 98DF CBI 0x1B,7
(0146) NOP(); /*延时4uS*/
0195 0000 NOP
(0147) NOP();
0196 0000 NOP
(0148) NOP();
0197 0000 NOP
(0149) NOP();
0198 0000 NOP
(0150) if (value & 0x01) {
0199 FD60 SBRC R22,0
(0151) DQ_SET;
019A 9ADF SBI 0x1B,7
(0152) }
(0153) delay_10us(7); /*延时80uS*/
019B E007 LDI R16,7
019C DF94 RCALL _delay_10us
(0154) DQ_SET; /*位结束*/
019D 9ADF SBI 0x1B,7
(0155) value >>= 1;
019E 9566 LSR R22
019F 954A DEC R20
01A0 2344 TST R20
01A1 F789 BNE 0x0193
(0156) }
(0157) if (flag & 0x80) { /*恢复中断状态*/
01A2 90200076 LDS R2,flag
01A4 FE27 SBRS R2,7
01A5 C001 RJMP 0x01A7
(0158) SEI();
01A6 9478 BSET 7
(0159) }
01A7 940E0218 CALL pop_gset2
01A9 9508 RET
(0160) }
(0161)
(0162) /*启动ds1820转换*/
(0163) void ds1820_start(void) {
(0164)
(0165) ds1820_reset();
_ds1820_start:
01AA DF93 RCALL _ds1820_reset
(0166) ds1820_write_byte(0xCC); /*勿略地址*/
01AB EC0C LDI R16,0xCC
01AC DFDD RCALL _ds1820_write_byte
(0167) ds1820_write_byte(0x44); /*启动转换*/
01AD E404 LDI R16,0x44
01AE DFDB RCALL _ds1820_write_byte
01AF 9508 RET
_ds1820_read_temp:
buf --> Y+0
i --> R20
01B0 940E0223 CALL push_gset1
01B2 9729 SBIW R28,0x9
(0168) }
(0169)
(0170) /*===================================================================
(0171) // 函数功能: 读取温度
(0172) // 形参: *temperature 温度存储空间
(0173) // 返回: unsigned char true为有效
(0174) // 编写: 2004/8/25
(0175) ===================================================================*/
(0176) unsigned int ds1820_read_temp(void) {
(0177)
(0178) unsigned int i;
(0179) unsigned char buf[9];
(0180)
(0181) ds1820_reset();
01B3 DF8A RCALL _ds1820_reset
(0182) ds1820_write_byte(0xCC); /*勿略地址*/
01B4 EC0C LDI R16,0xCC
01B5 DFD4 RCALL _ds1820_write_byte
(0183) ds1820_write_byte(0xBE); /*读取温度*/
01B6 EB0E LDI R16,0xBE
01B7 DFD2 RCALL _ds1820_write_byte
(0184) for (i = 0; i < 9; i++) {
01B8 2744 CLR R20
01B9 2755 CLR R21
01BA C008 RJMP 0x01C3
(0185) buf[i] = ds1820_read_byte();
01BB DFA1 RCALL _ds1820_read_byte
01BC 01CE MOVW R24,R28
01BD 01FA MOVW R30,R20
01BE 0FE8 ADD R30,R24
01BF 1FF9 ADC R31,R25
01C0 8300 STD Z+0,R16
01C1 5F4F SUBI R20,0xFF
01C2 4F5F SBCI R21,0xFF
01C3 3049 CPI R20,0x9
01C4 E0E0 LDI R30,0
01C5 075E CPC R21,R30
01C6 F3A0 BCS 0x01BB
(0186) }
(0187) i = buf[1];
01C7 8149 LDD R20,Y+1
01C8 2755 CLR R21
(0188) i <<= 8;
01C9 2F54 MOV R21,R20
01CA 2744 CLR R20
(0189) i |= buf[0];
01CB 8028 LDD R2,Y+0
01CC 2433 CLR R3
01CD 2942 OR R20,R2
01CE 2953 OR R21,R3
(0190)
(0191) return i;
FILE: <library>
01CF 018A MOVW R16,R20
01D0 9629 ADIW R28,0x9
01D1 940E0226 CALL pop_gset1
01D3 9508 RET
mod16u:
01D4 9468 BSET 6
01D5 C001 RJMP xdiv16u
div16u:
01D6 94E8 BCLR 6
xdiv16u:
01D7 92EA ST R14,-Y
01D8 92FA ST R15,-Y
01D9 938A ST R24,-Y
01DA 24EE CLR R14
01DB 24FF CLR R15
01DC E180 LDI R24,0x10
01DD 0F00 LSL R16
01DE 1F11 ROL R17
01DF 1CEE ROL R14
01E0 1CFF ROL R15
01E1 16E2 CP R14,R18
01E2 06F3 CPC R15,R19
01E3 F018 BCS 0x01E7
01E4 1AE2 SUB R14,R18
01E5 0AF3 SBC R15,R19
01E6 9503 INC R16
01E7 958A DEC R24
01E8 F7A1 BNE 0x01DD
01E9 F416 BRTC 0x01EC
01EA 2D0E MOV R16,R14
01EB 2D1F MOV R17,R15
01EC 9189 LD R24,Y+
01ED 90F9 LD R15,Y+
01EE 90E9 LD R14,Y+
01EF 9508 RET
mod8u:
01F0 9468 BSET 6
01F1 C001 RJMP xdiv8u
div8u:
01F2 94E8 BCLR 6
xdiv8u:
01F3 932A ST R18,-Y
01F4 92FA ST R15,-Y
01F5 92EA ST R14,-Y
01F6 24FF CLR R15
01F7 24EE CLR R14
01F8 E120 LDI R18,0x10
01F9 0F00 LSL R16
01FA 1CFF ROL R15
01FB 1CEE ROL R14
01FC 16E1 CP R14,R17
01FD F010 BCS 0x0200
01FE 1AE1 SUB R14,R17
01FF 9503 INC R16
0200 952A DEC R18
0201 F7B9 BNE 0x01F9
0202 F40E BRTC 0x0204
0203 2D0E MOV R16,R14
0204 90E9 LD R14,Y+
0205 90F9 LD R15,Y+
0206 9129 LD R18,Y+
0207 9508 RET
empy16s:
0208 920A ST R0,-Y
0209 921A ST R1,-Y
020A 938A ST R24,-Y
020B 939A ST R25,-Y
020C 9F02 MUL R16,R18
020D 01C0 MOVW R24,R0
020E 9F12 MUL R17,R18
020F 0D90 ADD R25,R0
0210 9F03 MUL R16,R19
0211 0D90 ADD R25,R0
0212 018C MOVW R16,R24
0213 9199 LD R25,Y+
0214 9189 LD R24,Y+
0215 9019 LD R1,Y+
0216 9009 LD R0,Y+
0217 9508 RET
pop_gset2:
0218 E0E2 LDI R30,2
0219 940C0227 JMP pop
push_gset5:
021B 92FA ST R15,-Y
021C 92EA ST R14,-Y
push_gset4:
021D 92DA ST R13,-Y
021E 92CA ST R12,-Y
push_gset3:
021F 92BA ST R11,-Y
0220 92AA ST R10,-Y
push_gset2:
0221 937A ST R23,-Y
0222 936A ST R22,-Y
push_gset1:
0223 935A ST R21,-Y
0224 934A ST R20,-Y
0225 9508 RET
pop_gset1:
0226 E0E1 LDI R30,1
pop:
0227 9149 LD R20,Y+
0228 9159 LD R21,Y+
0229 FDE0 SBRC R30,0
022A 9508 RET
022B 9169 LD R22,Y+
022C 9179 LD R23,Y+
022D FDE1 SBRC R30,1
022E 9508 RET
022F 90A9 LD R10,Y+
0230 90B9 LD R11,Y+
0231 FDE2 SBRC R30,2
0232 9508 RET
0233 90C9 LD R12,Y+
0234 90D9 LD R13,Y+
0235 FDE3 SBRC R30,3
0236 9508 RET
0237 90E9 LD R14,Y+
0238 90F9 LD R15,Y+
0239 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -