📄 ds1820.lst
字号:
(0045) DQ_OUT;
011F 9AD3 SBI 0x1A,3
(0046) DQ_CLR;
0120 98DB CBI 0x1B,3
(0047) delay_10us(49); /*延时500uS(480-960)*/
0121 E301 LDI R16,0x31
0122 DFE9 RCALL _delay_10us
(0048) DQ_SET;
0123 9ADB SBI 0x1B,3
(0049) DQ_IN;
0124 98D3 CBI 0x1A,3
(0050) delay_10us(7); /*延时80uS*/
0125 E007 LDI R16,7
0126 DFE5 RCALL _delay_10us
(0051) i = DQ_R;
0127 B349 IN R20,0x19
0128 7048 ANDI R20,0x8
(0052) delay_10us(49); /*延时500uS(保持>480uS)*/
0129 E301 LDI R16,0x31
012A DFE1 RCALL _delay_10us
(0053) if (flag & 0x80) { /*恢复中断状态*/
012B 90200073 LDS R2,flag
012D FE27 SBRS R2,7
012E C001 RJMP 0x0130
(0054) SEI();
012F 9478 BSET 7
(0055) }
(0056) if (i) {
0130 2344 TST R20
0131 F011 BEQ 0x0134
(0057) return 0x00;
0132 2700 CLR R16
0133 C001 RJMP 0x0135
(0058) }
(0059) else {
(0060) return 0x01;
0134 E001 LDI R16,1
0135 940E0257 CALL pop_gset1
0137 9508 RET
_ds1820_read_byte:
value --> R20
i --> R22
0138 940E0252 CALL push_gset2
(0061) }
(0062) }
(0063)
(0064) /*DS18B20字节读取函数*/
(0065) unsigned char ds1820_read_byte(void) {
(0066)
(0067) unsigned char i;
(0068) unsigned char value = 0;
013A 2744 CLR R20
(0069) flag = SREG; /*中断保护*/
013B B62F IN R2,0x3F
013C 92200073 STS flag,R2
(0070) CLI(); /*关中断*/
013E 94F8 BCLR 7
(0071) for (i = 8; i != 0; i--) {
013F E068 LDI R22,0x8
0140 C019 RJMP 0x015A
(0072) value >>= 1;
0141 9546 LSR R20
(0073) DQ_OUT;
0142 9AD3 SBI 0x1A,3
(0074) DQ_CLR;
0143 98DB CBI 0x1B,3
(0075) delay4us; /*延时4uS*/
0144 0000 NOP
0145 0000 NOP
0146 0000 NOP
0147 0000 NOP
(0076) DQ_SET;
0148 9ADB SBI 0x1B,3
(0077) DQ_IN;
0149 98D3 CBI 0x1A,3
(0078) delay10us; /*延时10uS*/
014A 0000 NOP
014B 0000 NOP
014C 0000 NOP
014D 0000 NOP
014E 0000 NOP
014F 0000 NOP
0150 0000 NOP
0151 0000 NOP
0152 0000 NOP
0153 0000 NOP
(0079) if (DQ_R) {
0154 9BCB SBIS 0x19,3
0155 C001 RJMP 0x0157
(0080) value|=0x80;
0156 6840 ORI R20,0x80
(0081) }
(0082) delay_10us(5); /*延时60uS*/
0157 E005 LDI R16,5
0158 DFB3 RCALL _delay_10us
0159 956A DEC R22
015A 2366 TST R22
015B F729 BNE 0x0141
(0083) }
(0084) if (flag & 0x80) { /*恢复中断状态*/
015C 90200073 LDS R2,flag
015E FE27 SBRS R2,7
015F C001 RJMP 0x0161
(0085) SEI();
0160 9478 BSET 7
(0086) }
(0087) return(value);
0161 2F04 MOV R16,R20
0162 940E0246 CALL pop_gset2
0164 9508 RET
_ds1820_write_byte:
i --> R20
value --> R22
0165 940E0252 CALL push_gset2
0167 2F60 MOV R22,R16
(0088) }
(0089)
(0090) /*DS18B20字节写入函数*/
(0091) void ds1820_write_byte(unsigned char value) {
(0092)
(0093) unsigned char i;
(0094) flag = SREG; /*中断保护*/
0168 B62F IN R2,0x3F
0169 92200073 STS flag,R2
(0095) CLI(); /*关中断*/
016B 94F8 BCLR 7
(0096) for (i = 8; i != 0; i--) {
016C E048 LDI R20,0x8
016D C00D RJMP 0x017B
(0097) DQ_OUT;
016E 9AD3 SBI 0x1A,3
(0098) DQ_CLR;
016F 98DB CBI 0x1B,3
(0099) delay4us; /*延时4uS*/
0170 0000 NOP
0171 0000 NOP
0172 0000 NOP
0173 0000 NOP
(0100) if (value & 0x01) {DQ_SET;}
0174 FD60 SBRC R22,0
0175 9ADB SBI 0x1B,3
(0101) //每次都只写最低位,如果最低位是1的话输出高电平作为写1信号,否则无动作即为0
(0102) delay_10us(7); /*延时80uS*/
0176 E007 LDI R16,7
0177 DF94 RCALL _delay_10us
(0103) DQ_SET; /*位结束*/
0178 9ADB SBI 0x1B,3
(0104) value >>= 1;
0179 9566 LSR R22
017A 954A DEC R20
017B 2344 TST R20
017C F789 BNE 0x016E
(0105) }
(0106) if (flag & 0x80) { /*恢复中断状态*/
017D 90200073 LDS R2,flag
017F FE27 SBRS R2,7
0180 C001 RJMP 0x0182
(0107) SEI();
0181 9478 BSET 7
(0108) }
0182 940E0246 CALL pop_gset2
0184 9508 RET
(0109) }
(0110)
(0111) /*启动ds1820转换*/
(0112) void ds1820_start(void) {
(0113)
(0114) ds1820_reset();
_ds1820_start:
0185 DF93 RCALL _ds1820_reset
(0115) ds1820_write_byte(0xCC); /*勿略地址*/
0186 EC0C LDI R16,0xCC
0187 DFDD RCALL _ds1820_write_byte
(0116) ds1820_write_byte(0x44); /*启动转换*/
0188 E404 LDI R16,0x44
0189 DFDB RCALL _ds1820_write_byte
018A 9508 RET
_ds1820_read_temp:
buf --> Y+0
i --> R20
018B 940E0254 CALL push_gset1
018D 9729 SBIW R28,0x9
(0117) }
(0118)
(0119) /*DS8B20读取温度信息*/
(0120) unsigned int ds1820_read_temp(void) {
(0121)
(0122) unsigned int i;
(0123) unsigned char buf[9];
(0124)
(0125) ds1820_reset();
018E DF8A RCALL _ds1820_reset
(0126) ds1820_write_byte(0xCC); /*勿略地址*/
018F EC0C LDI R16,0xCC
0190 DFD4 RCALL _ds1820_write_byte
(0127) ds1820_write_byte(0xBE); /*读取温度*/
0191 EB0E LDI R16,0xBE
0192 DFD2 RCALL _ds1820_write_byte
(0128) for (i = 0; i < 9; i++)
0193 2744 CLR R20
0194 2755 CLR R21
0195 C008 RJMP 0x019E
(0129) {
(0130) buf[i] = ds1820_read_byte();
0196 DFA1 RCALL _ds1820_read_byte
0197 01CE MOVW R24,R28
0198 01FA MOVW R30,R20
0199 0FE8 ADD R30,R24
019A 1FF9 ADC R31,R25
019B 8300 STD Z+0,R16
019C 5F4F SUBI R20,0xFF
019D 4F5F SBCI R21,0xFF
019E 3049 CPI R20,0x9
019F E0E0 LDI R30,0
01A0 075E CPC R21,R30
01A1 F3A0 BCS 0x0196
(0131) }
(0132) i = buf[1];
01A2 8149 LDD R20,Y+1
01A3 2755 CLR R21
(0133) i <<= 8;
01A4 2F54 MOV R21,R20
01A5 2744 CLR R20
(0134) i |= buf[0];
01A6 8028 LDD R2,Y+0
01A7 2433 CLR R3
01A8 2942 OR R20,R2
01A9 2953 OR R21,R3
(0135)
(0136) return i;
01AA 018A MOVW R16,R20
01AB 9629 ADIW R28,0x9
01AC 940E0257 CALL pop_gset1
01AE 9508 RET
_ds1820:
i --> R20
01AF 940E0254 CALL push_gset1
(0137) }
(0138) void ds1820(void)
(0139) {unsigned int i;
(0140) ds1820_start(); /*启动一次转换*/
01B1 DFD3 RCALL _ds1820_start
(0141) delay_nms(300); /*等待转换结束*/
01B2 E20C LDI R16,0x2C
01B3 E011 LDI R17,1
01B4 DEBB RCALL _delay_nms
(0142) i = ds1820_read_temp(); /*读取温度数值*/
01B5 DFD5 RCALL _ds1820_read_temp
01B6 01A8 MOVW R20,R16
(0143) i = (i * 10) / 16; /*数值处理*/
01B7 E00A LDI R16,0xA
01B8 E010 LDI R17,0
01B9 019A MOVW R18,R20
01BA 940E0236 CALL empy16s
01BC 01A8 MOVW R20,R16
01BD 9556 LSR R21
01BE 9547 ROR R20
01BF 9556 LSR R21
01C0 9547 ROR R20
01C1 9556 LSR R21
01C2 9547 ROR R20
01C3 9556 LSR R21
01C4 9547 ROR R20
(0144) temp_1820[0] = i / 1000+48; /*将显示信息加载到显示缓存区*/
01C5 EE28 LDI R18,0xE8
01C6 E033 LDI R19,3
01C7 018A MOVW R16,R20
01C8 940E021C CALL div16u
01CA 01C8 MOVW R24,R16
01CB 96C0 ADIW R24,0x30
01CC 93800060 STS temp_1820,R24
(0145) i = i % 1000;
01CE EE28 LDI R18,0xE8
01CF E033 LDI R19,3
01D0 018A MOVW R16,R20
01D1 940E021A CALL mod16u
01D3 01A8 MOVW R20,R16
(0146) temp_1820[1] = i / 100+48;
01D4 E624 LDI R18,0x64
01D5 E030 LDI R19,0
01D6 940E021C CALL div16u
01D8 01C8 MOVW R24,R16
01D9 96C0 ADIW R24,0x30
01DA 93800061 STS temp_1820+1,R24
(0147) i = i % 100;
01DC E624 LDI R18,0x64
01DD E030 LDI R19,0
01DE 018A MOVW R16,R20
01DF 940E021A CALL mod16u
01E1 01A8 MOVW R20,R16
(0148) temp_1820[2] = i / 10+48;
01E2 E02A LDI R18,0xA
01E3 E030 LDI R19,0
01E4 940E021C CALL div16u
01E6 01C8 MOVW R24,R16
01E7 96C0 ADIW R24,0x30
01E8 93800062 STS temp_1820+2,R24
(0149) temp_1820[4] = i % 10+48;
01EA E02A LDI R18,0xA
01EB E030 LDI R19,0
01EC 018A MOVW R16,R20
01ED 940E021A CALL mod16u
01EF 01C8 MOVW R24,R16
01F0 96C0 ADIW R24,0x30
01F1 93800064 STS 0x64,R24
01F3 940E0257 CALL pop_gset1
01F5 9508 RET
_main:
01F6 9722 SBIW R28,2
FILE: D:\avr\+++精华+++\+M16范例+\18b20\main.c
(0001) /***************************************
(0002) * 温度计 *
(0003) * 程序功能: 用18b20探测温度 *
(0004) * 时钟频率: 内部1M *
(0005) * 设 计:莫锦攀 *
(0006) * 修改日期:2007年07月29日 *
(0007) * 编译环境:ICC-AVR6.31 *
(0008) * 实验环境:M16学习板 *
(0009) * 使用端口: LCD:PC4,PC5,PA4~PA7 *
(0010) * 18b20:PD7 *
(0011) * 相关说明: 18b20延时要求精确所以单独 *
(0012) * 延时函数. *
(0013) * *
(0014) ***************************************/
(0015)
(0016) #include <iom16v.h> /*包含相关头文件*/
(0017) #include "1602.h"
(0018) #include "delay.h"
(0019) #include "DS1820.h"
(0020)
(0021)
(0022) void main(void) {
(0023)
(0024)
(0025)
(0026) DDRA = 0x00; /*方向输入*/
01F7 2422 CLR R2
01F8 BA2A OUT 0x1A,R2
(0027) PORTA = 0xFF; /*打开上拉*/
01F9 EF8F LDI R24,0xFF
01FA BB8B OUT 0x1B,R24
(0028) DDRB = 0xFF; /*方向输出*/
01FB BB87 OUT 0x17,R24
(0029) PORTB = 0xF0; /*电平设置*/
01FC EF80 LDI R24,0xF0
01FD BB88 OUT 0x18,R24
(0030) DDRC = 0x00;
01FE BA24 OUT 0x14,R2
(0031) PORTC = 0xFF;
01FF EF8F LDI R24,0xFF
0200 BB85 OUT 0x15,R24
(0032) DDRD = 0x00;
0201 BA21 OUT 0x11,R2
(0033) PORTD = 0xFF;
0202 BB82 OUT 0x12,R24
(0034)
(0035) delay_nms(100);
0203 E604 LDI R16,0x64
0204 E010 LDI R17,0
0205 DE6A RCALL _delay_nms
(0036) //ds1820_reset(); /*复位D18B20*/
(0037) LCD_init(); /*启动显示任务*/
0206 DE78 RCALL _LCD_init
(0038) LCD_write_string(2,0,"Temperature");
0207 E687 LDI R24,0x67
0208 E090 LDI R25,0
0209 8399 STD Y+1,R25
020A 8388 STD Y+0,R24
020B 2722 CLR R18
020C E002 LDI R16,2
020D DEDC RCALL _LCD_write_string
020E C008 RJMP 0x0217
(0039) while (1) {
(0040) ds1820();
020F DF9F RCALL _ds1820
(0041) LCD_write_string(4,1,temp_1820);
FILE: <library>
0210 E680 LDI R24,0x60
0211 E090 LDI R25,0
0212 8399 STD Y+1,R25
0213 8388 STD Y+0,R24
0214 E021 LDI R18,1
0215 E004 LDI R16,4
0216 DED3 RCALL _LCD_write_string
0217 CFF7 RJMP 0x020F
0218 9622 ADIW R28,2
0219 9508 RET
mod16u:
021A 9468 BSET 6
021B C001 RJMP xdiv16u
div16u:
021C 94E8 BCLR 6
xdiv16u:
021D 92EA ST R14,-Y
021E 92FA ST R15,-Y
021F 938A ST R24,-Y
0220 24EE CLR R14
0221 24FF CLR R15
0222 E180 LDI R24,0x10
0223 0F00 LSL R16
0224 1F11 ROL R17
0225 1CEE ROL R14
0226 1CFF ROL R15
0227 16E2 CP R14,R18
0228 06F3 CPC R15,R19
0229 F018 BCS 0x022D
022A 1AE2 SUB R14,R18
022B 0AF3 SBC R15,R19
022C 9503 INC R16
022D 958A DEC R24
022E F7A1 BNE 0x0223
022F F416 BRTC 0x0232
0230 2D0E MOV R16,R14
0231 2D1F MOV R17,R15
0232 9189 LD R24,Y+
0233 90F9 LD R15,Y+
0234 90E9 LD R14,Y+
0235 9508 RET
empy16s:
0236 920A ST R0,-Y
0237 921A ST R1,-Y
0238 938A ST R24,-Y
0239 939A ST R25,-Y
023A 9F02 MUL R16,R18
023B 01C0 MOVW R24,R0
023C 9F12 MUL R17,R18
023D 0D90 ADD R25,R0
023E 9F03 MUL R16,R19
023F 0D90 ADD R25,R0
0240 018C MOVW R16,R24
0241 9199 LD R25,Y+
0242 9189 LD R24,Y+
0243 9019 LD R1,Y+
0244 9009 LD R0,Y+
0245 9508 RET
pop_gset2:
0246 E0E2 LDI R30,2
0247 940C0258 JMP pop
pop_gset3:
0249 E0E4 LDI R30,4
024A 940C0258 JMP pop
push_gset5:
024C 92FA ST R15,-Y
024D 92EA ST R14,-Y
push_gset4:
024E 92DA ST R13,-Y
024F 92CA ST R12,-Y
push_gset3:
0250 92BA ST R11,-Y
0251 92AA ST R10,-Y
push_gset2:
0252 937A ST R23,-Y
0253 936A ST R22,-Y
push_gset1:
0254 935A ST R21,-Y
0255 934A ST R20,-Y
0256 9508 RET
pop_gset1:
0257 E0E1 LDI R30,1
pop:
0258 9149 LD R20,Y+
0259 9159 LD R21,Y+
025A FDE0 SBRC R30,0
025B 9508 RET
025C 9169 LD R22,Y+
025D 9179 LD R23,Y+
025E FDE1 SBRC R30,1
025F 9508 RET
0260 90A9 LD R10,Y+
0261 90B9 LD R11,Y+
0262 FDE2 SBRC R30,2
0263 9508 RET
0264 90C9 LD R12,Y+
0265 90D9 LD R13,Y+
0266 FDE3 SBRC R30,3
0267 9508 RET
0268 90E9 LD R14,Y+
0269 90F9 LD R15,Y+
026A 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -