📄 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 0297 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\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 DFDA RCALL _ds1820_write_byte
D2 9508 RET
_ds1820_read_temp:
buf --> Y,+0
i --> R20
D3 934A ST R20,-Y
D4 935A ST R21,-Y
D5 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();
D6 DF94 RCALL _ds1820_reset
(0118) ds1820_write_byte(0xCC); //勿略ROM
D7 EC0C LDI R16,0xCC
D8 DFD3 RCALL _ds1820_write_byte
(0119) ds1820_write_byte(0xBE); //读温度
D9 EB0E LDI R16,0xBE
DA DFD1 RCALL _ds1820_write_byte
(0120) for (i = 0; i < 9; i++) {
DB 2744 CLR R20
DC 2755 CLR R21
DD C008 RJMP 0x00E6
(0121) buf[i] = ds1820_read_byte();
DE DFA7 RCALL _ds1820_read_byte
DF 01CE MOVW R24,R28
E0 01FA MOVW R30,R20
E1 0FE8 ADD R30,R24
E2 1FF9 ADC R31,R25
E3 8300 STD Z+0,R16
E4 5F4F SUBI R20,0xFF
E5 4F5F SBCI R21,0xFF
E6 3049 CPI R20,0x9
E7 E0E0 LDI R30,0
E8 075E CPC R21,R30
E9 F3A0 BCS 0x00DE
(0122) }
(0123) i = buf[1];
EA 8149 LDD R20,Y+1
EB 2755 CLR R21
(0124) i <<= 8;
EC 2F54 MOV R21,R20
ED 2744 CLR R20
(0125) i |= buf[0];
EE 8028 LDD R2,Y+0
EF 2433 CLR R3
F0 2942 OR R20,R2
F1 2953 OR R21,R3
(0126) return i;
F2 018A MOVW R16,R20
F3 9629 ADIW R28,0x9
F4 9159 LD R21,Y+
F5 9149 LD R20,Y+
F6 9508 RET
FILE: E:\产品\开发板\光盘\16实验程序\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
F7 C002 RJMP 0x00FA
F8 5001 SUBI R16,1
F9 4010 SBCI R17,0
FA E081 LDI R24,1
FB E090 LDI R25,0
FC 1780 CP R24,R16
FD 0791 CPC R25,R17
FE F3C8 BCS 0x00F8
FF 9508 RET
_busy:
temp --> R20
100 934A ST R20,-Y
(0011) }
(0012)
(0013) //查忙
(0014) void busy(void)
(0015) {
(0016) uchar temp;
(0017) s_ms(500);
101 EF04 LDI R16,0xF4
102 E011 LDI R17,1
103 DFF3 RCALL _s_ms
(0018) PORTA&=~(1<<RS); //RS=0
104 98DD CBI 0x1B,5
(0019) s_ms(500);
105 EF04 LDI R16,0xF4
106 E011 LDI R17,1
107 DFEF RCALL _s_ms
(0020) PORTA|=(1<<RW); //RW=1
108 9ADE SBI 0x1B,6
(0021) s_ms(500);
109 EF04 LDI R16,0xF4
10A E011 LDI R17,1
10B DFEB RCALL _s_ms
10C C01A RJMP 0x0127
(0022) while(temp)
(0023) {
(0024) PORTA|=(1<<EN); //EN=1
10D 9ADF SBI 0x1B,7
(0025) s_ms(500);
10E EF04 LDI R16,0xF4
10F E011 LDI R17,1
110 DFE6 RCALL _s_ms
(0026) DDRD=0x00; //A口变输入
111 2422 CLR R2
112 BA21 OUT 0x11,R2
(0027) PORTD=0xff; //上拉使能
113 EF8F LDI R24,0xFF
114 BB82 OUT 0x12,R24
(0028) s_ms(500);
115 EF04 LDI R16,0xF4
116 E011 LDI R17,1
117 DFDF RCALL _s_ms
(0029) temp = PIND&0x80; //读取A口
118 B340 IN R20,0x10
119 7840 ANDI R20,0x80
(0030) s_ms(500);
11A EF04 LDI R16,0xF4
11B E011 LDI R17,1
11C DFDA RCALL _s_ms
(0031) DDRD=0xff;
11D EF8F LDI R24,0xFF
11E BB81 OUT 0x11,R24
(0032) PORTD=0xff; //A口变输出
11F BB82 OUT 0x12,R24
(0033) s_ms(500);
120 EF04 LDI R16,0xF4
121 E011 LDI R17,1
122 DFD4 RCALL _s_ms
(0034) PORTA&=~(1<<EN); //EN=0
123 98DF CBI 0x1B,7
(0035) s_ms(500);
124 EF04 LDI R16,0xF4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -