📄 ds18b20.lst
字号:
__start:
__text_start:
32 E5CF LDI R28,0x5F
33 E0D4 LDI R29,4
34 BFCD OUT 0x3D,R28
35 BFDE OUT 0x3E,R29
36 51CE SUBI R28,0x1E
37 40D0 SBCI R29,0
38 EA0A LDI R16,0xAA
39 8308 STD Y+0,R16
3A 2400 CLR R0
3B E6EF LDI R30,0x6F
3C E0F0 LDI R31,0
3D E010 LDI R17,0
3E 37E0 CPI R30,0x70
3F 07F1 CPC R31,R17
40 F011 BEQ 0x0043
41 9201 ST R0,Z+
42 CFFB RJMP 0x003E
43 8300 STD Z+0,R16
44 E5E4 LDI R30,0x54
45 E0F0 LDI R31,0
46 E6A0 LDI R26,0x60
47 E0B0 LDI R27,0
48 E010 LDI R17,0
49 E000 LDI R16,0
4A BF0B OUT 0x3B,R16
4B 36E3 CPI R30,0x63
4C 07F1 CPC R31,R17
4D F021 BEQ 0x0052
4E 95C8 LPM
4F 9631 ADIW R30,1
50 920D ST R0,X+
51 CFF9 RJMP 0x004B
52 940E 0296 CALL _main
_exit:
54 CFFF RJMP _exit
_s_10us:
aa --> R20
ms --> R16
55 934A ST R20,-Y
56 935A ST R21,-Y
FILE: E:\单片机\16实验程序\DS18B20\DS18B20\18B20.h
(0001) //DS18B20连接在端口C的第7引脚
(0002)
(0003) //设置成输入
(0004) #define DQ_INPUT DDRC &= ~(1 << PC7)
(0005) //设置成输出
(0006) #define DQ_OUT DDRC |= (1 << PC7)
(0007) //设置成低电平
(0008) #define DQ_LO PORTC &= ~(1 << PC7)
(0009) //设置成高电平
(0010) #define DQ_HI PORTC |= (1 << PC7)
(0011) //读出
(0012) #define DQ_R PINC & (1 << PC7)
(0013)
(0014) //中断标志
(0015) unsigned char init_f;
(0016)
(0017) //延时函数
(0018) void s_10us(unsigned int ms)
(0019) {
(0020) unsigned int aa;
(0021) for(;ms>=1;ms--)
57 C00C RJMP 0x0064
(0022) {
(0023) for(aa=0;aa<=17;aa++)
58 2744 CLR R20
59 2755 CLR R21
5A C002 RJMP 0x005D
5B 5F4F SUBI R20,0xFF
5C 4F5F SBCI R21,0xFF
5D E181 LDI R24,0x11
5E E090 LDI R25,0
5F 1784 CP R24,R20
60 0795 CPC R25,R21
61 F7C8 BCC 0x005B
62 5001 SUBI R16,1
63 4010 SBCI R17,0
64 3001 CPI R16,1
65 E0E0 LDI R30,0
66 071E CPC R17,R30
67 F780 BCC 0x0058
68 9159 LD R21,Y+
69 9149 LD R20,Y+
6A 9508 RET
_ds1820_reset:
i --> R20
6B 934A ST R20,-Y
(0024) {;}
(0025) }
(0026) }
(0027)
(0028) //DS18B20复位
(0029) void ds1820_reset(void)
(0030) {
(0031) unsigned char i;
(0032) //中断保护
(0033) init_f = SREG;
6C B62F IN R2,0x3F
6D 9220 006F STS init_f,R2
(0034) //关中断
(0035) CLI();
6F 94F8 BCLR 7
(0036) DQ_OUT;
70 9AA7 SBI 0x14,7
(0037) DQ_LO;
71 98AF CBI 0x15,7
(0038) s_10us(50); //延时500us
72 E302 LDI R16,0x32
73 E010 LDI R17,0
74 DFE0 RCALL _s_10us
(0039) DQ_HI;
75 9AAF SBI 0x15,7
(0040) DQ_INPUT;
76 98A7 CBI 0x14,7
(0041) s_10us(8); //延时80us
77 E008 LDI R16,0x8
78 E010 LDI R17,0
79 DFDB RCALL _s_10us
(0042) i = DQ_R;
7A B343 IN R20,0x13
7B 7840 ANDI R20,0x80
(0043) s_10us(50); //延时500us
7C E302 LDI R16,0x32
7D E010 LDI R17,0
7E DFD6 RCALL _s_10us
(0044) if (init_f & 0x80) //恢复中断状态
7F 9020 006F LDS R2,init_f
81 FE27 SBRS R2,7
82 C001 RJMP 0x0084
(0045) {
(0046) SEI();
83 9478 BSET 7
(0047) }
84 9149 LD R20,Y+
85 9508 RET
_ds1820_read_byte:
value --> R20
i --> R22
86 934A ST R20,-Y
87 936A ST R22,-Y
(0048) }
(0049)
(0050) //DS18B20字节读取
(0051) unsigned char ds1820_read_byte(void)
(0052) {
(0053) unsigned char i;
(0054) unsigned char value = 0;
88 2744 CLR R20
(0055) //中断保护
(0056) init_f = SREG;
89 B62F IN R2,0x3F
8A 9220 006F STS init_f,R2
(0057) //关中断
(0058) CLI();
8C 94F8 BCLR 7
(0059) for (i = 8; i != 0; i--) {
8D E068 LDI R22,0x8
8E C012 RJMP 0x00A1
(0060) value >>= 1;
8F 9546 LSR R20
(0061) DQ_OUT;
90 9AA7 SBI 0x14,7
(0062) DQ_LO;
91 98AF CBI 0x15,7
(0063) s_10us(1);
92 E001 LDI R16,1
93 E010 LDI R17,0
94 DFC0 RCALL _s_10us
(0064) DQ_HI;
95 9AAF SBI 0x15,7
(0065) DQ_INPUT;
96 98A7 CBI 0x14,7
(0066) s_10us(1);
97 E001 LDI R16,1
98 E010 LDI R17,0
99 DFBB RCALL _s_10us
(0067) if (DQ_R) {
9A 9B9F SBIS 0x13,7
9B C001 RJMP 0x009D
(0068) value|=0x80;
9C 6840 ORI R20,0x80
(0069) }
(0070) s_10us(5); //延时60us
9D E005 LDI R16,5
9E E010 LDI R17,0
9F DFB5 RCALL _s_10us
A0 956A DEC R22
A1 2366 TST R22
A2 F761 BNE 0x008F
(0071) }
(0072) if (init_f & 0x80) //恢复中断状态
A3 9020 006F LDS R2,init_f
A5 FE27 SBRS R2,7
A6 C001 RJMP 0x00A8
(0073) {
(0074) SEI();
A7 9478 BSET 7
(0075) }
(0076) return(value);
A8 2F04 MOV R16,R20
A9 9169 LD R22,Y+
AA 9149 LD R20,Y+
AB 9508 RET
_ds1820_write_byte:
i --> R20
value --> R10
AC 92AA ST R10,-Y
AD 934A ST R20,-Y
AE 2EA0 MOV R10,R16
(0077) }
(0078)
(0079) //DS18B20字节写入
(0080) void ds1820_write_byte(unsigned char value)
(0081) {
(0082) unsigned char i;
(0083) //中断保护
(0084) init_f = SREG;
AF B62F IN R2,0x3F
B0 9220 006F STS init_f,R2
(0085) //关中断
(0086) CLI();
B2 94F8 BCLR 7
(0087) for (i = 8; i != 0; i--) {
B3 E048 LDI R20,0x8
B4 C00E RJMP 0x00C3
(0088) DQ_OUT;
B5 9AA7 SBI 0x14,7
(0089) DQ_LO;
B6 98AF CBI 0x15,7
(0090) s_10us(1);
B7 E001 LDI R16,1
B8 E010 LDI R17,0
B9 DF9B RCALL _s_10us
(0091) if (value & 0x01) {
BA FEA0 SBRS R10,0
BB C001 RJMP 0x00BD
(0092) DQ_HI;
BC 9AAF SBI 0x15,7
(0093) }
(0094) s_10us(8); //延时80us
BD E008 LDI R16,0x8
BE E010 LDI R17,0
BF DF95 RCALL _s_10us
(0095) DQ_HI;
C0 9AAF SBI 0x15,7
(0096) value >>= 1;
C1 94A6 LSR R10
C2 954A DEC R20
C3 2344 TST R20
C4 F781 BNE 0x00B5
(0097) }
(0098) if (init_f & 0x80)//恢复中断状态
C5 9020 006F LDS R2,init_f
C7 FE27 SBRS R2,7
C8 C001 RJMP 0x00CA
(0099) {
(0100) SEI();
C9 9478 BSET 7
(0101) }
CA 9149 LD R20,Y+
CB 90A9 LD R10,Y+
CC 9508 RET
(0102) }
(0103)
(0104) //启动ds1820转换
(0105) void ds1820_start(void)
(0106) {
(0107) ds1820_reset();
_ds1820_start:
CD DF9D RCALL _ds1820_reset
(0108) ds1820_write_byte(0xCC); //勿略ROM
CE EC0C LDI R16,0xCC
CF DFDC RCALL _ds1820_write_byte
(0109) ds1820_write_byte(0x44); //启动转换
D0 E404 LDI R16,0x44
D1 CFDA RJMP _ds1820_write_byte
_ds1820_read_temp:
buf --> Y,+0
i --> R20
D2 934A ST R20,-Y
D3 935A ST R21,-Y
D4 9729 SBIW R28,0x9
(0110) }
(0111)
(0112) //读温度
(0113) unsigned int ds1820_read_temp(void)
(0114) {
(0115) unsigned int i;
(0116) unsigned char buf[9];
(0117) ds1820_reset();
D5 DF95 RCALL _ds1820_reset
(0118) ds1820_write_byte(0xCC); //勿略ROM
D6 EC0C LDI R16,0xCC
D7 DFD4 RCALL _ds1820_write_byte
(0119) ds1820_write_byte(0xBE); //读温度
D8 EB0E LDI R16,0xBE
D9 DFD2 RCALL _ds1820_write_byte
(0120) for (i = 0; i < 9; i++) {
DA 2744 CLR R20
DB 2755 CLR R21
DC C008 RJMP 0x00E5
(0121) buf[i] = ds1820_read_byte();
DD DFA8 RCALL _ds1820_read_byte
DE 01CE MOVW R24,R28
DF 01FA MOVW R30,R20
E0 0FE8 ADD R30,R24
E1 1FF9 ADC R31,R25
E2 8300 STD Z+0,R16
E3 5F4F SUBI R20,0xFF
E4 4F5F SBCI R21,0xFF
E5 3049 CPI R20,0x9
E6 E0E0 LDI R30,0
E7 075E CPC R21,R30
E8 F3A0 BCS 0x00DD
(0122) }
(0123) i = buf[1];
E9 8149 LDD R20,Y+1
EA 2755 CLR R21
(0124) i <<= 8;
EB 2F54 MOV R21,R20
EC 2744 CLR R20
(0125) i |= buf[0];
ED 8028 LDD R2,Y+0
EE 2433 CLR R3
EF 2942 OR R20,R2
F0 2953 OR R21,R3
(0126) return i;
F1 018A MOVW R16,R20
F2 9629 ADIW R28,0x9
F3 9159 LD R21,Y+
F4 9149 LD R20,Y+
F5 9508 RET
FILE: E:\单片机\16实验程序\DS18B20\DS18B20\1602.h
(0001) #define uchar unsigned char
(0002) #define uint unsigned int
(0003)
(0004) #define RS 5
(0005) #define RW 6
(0006) #define EN 7
(0007)
(0008) void s_ms(uint ms)
(0009) {
(0010) for(;ms>1;ms--);
_s_ms:
ms --> R16
F6 C002 RJMP 0x00F9
F7 5001 SUBI R16,1
F8 4010 SBCI R17,0
F9 E081 LDI R24,1
FA E090 LDI R25,0
FB 1780 CP R24,R16
FC 0791 CPC R25,R17
FD F3C8 BCS 0x00F7
FE 9508 RET
_busy:
temp --> R20
FF 934A ST R20,-Y
(0011) }
(0012)
(0013) //查忙
(0014) void busy(void)
(0015) {
(0016) uchar temp;
(0017) s_ms(500);
100 EF04 LDI R16,0xF4
101 E011 LDI R17,1
102 DFF3 RCALL _s_ms
(0018) PORTA&=~(1<<RS); //RS=0
103 98DD CBI 0x1B,5
(0019) s_ms(500);
104 EF04 LDI R16,0xF4
105 E011 LDI R17,1
106 DFEF RCALL _s_ms
(0020) PORTA|=(1<<RW); //RW=1
107 9ADE SBI 0x1B,6
(0021) s_ms(500);
108 EF04 LDI R16,0xF4
109 E011 LDI R17,1
10A DFEB RCALL _s_ms
10B C01A RJMP 0x0126
(0022) while(temp)
(0023) {
(0024) PORTA|=(1<<EN); //EN=1
10C 9ADF SBI 0x1B,7
(0025) s_ms(500);
10D EF04 LDI R16,0xF4
10E E011 LDI R17,1
10F DFE6 RCALL _s_ms
(0026) DDRD=0x00; //A口变输入
110 2422 CLR R2
111 BA21 OUT 0x11,R2
(0027) PORTD=0xff; //上拉使能
112 EF8F LDI R24,0xFF
113 BB82 OUT 0x12,R24
(0028) s_ms(500);
114 EF04 LDI R16,0xF4
115 E011 LDI R17,1
116 DFDF RCALL _s_ms
(0029) temp = PIND&0x80; //读取A口
117 B340 IN R20,0x10
118 7840 ANDI R20,0x80
(0030) s_ms(500);
119 EF04 LDI R16,0xF4
11A E011 LDI R17,1
11B DFDA RCALL _s_ms
(0031) DDRD=0xff;
11C EF8F LDI R24,0xFF
11D BB81 OUT 0x11,R24
(0032) PORTD=0xff; //A口变输出
11E BB82 OUT 0x12,R24
(0033) s_ms(500);
11F EF04 LDI R16,0xF4
120 E011 LDI R17,1
121 DFD4 RCALL _s_ms
(0034) PORTA&=~(1<<EN); //EN=0
122 98DF CBI 0x1B,7
(0035) s_ms(500);
123 EF04 LDI R16,0xF4
124 E011 LDI R17,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -