📄 ds18b20.lst
字号:
__start:
__text_start:
21 EFCF LDI R28,0xFF
22 E0D2 LDI R29,2
23 BFCD OUT 0x3D,R28
24 BFDE OUT 0x3E,R29
25 51CE SUBI R28,0x1E
26 40D0 SBCI R29,0
27 EA0A LDI R16,0xAA
28 8308 STD Y+0,R16
29 2400 CLR R0
2A E0EE LDI R30,0xE
2B E0F1 LDI R31,1
2C E011 LDI R17,1
2D 31EC CPI R30,0x1C
2E 07F1 CPC R31,R17
2F F011 BEQ 0x0032
30 9201 ST R0,Z+
31 CFFB RJMP 0x002D
32 8300 STD Z+0,R16
33 E3E4 LDI R30,0x34
34 E0F0 LDI R31,0
35 E0A0 LDI R26,0
36 E0B1 LDI R27,1
37 E010 LDI R17,0
38 E000 LDI R16,0
39 BF0B OUT 0x3B,R16
3A 34E2 CPI R30,0x42
3B 07F1 CPC R31,R17
3C F021 BEQ 0x0041
3D 95C8 LPM
3E 9631 ADIW R30,1
3F 920D ST R0,X+
40 CFF9 RJMP 0x003A
41 D001 RCALL _main
_exit:
42 CFFF RJMP _exit
FILE: E:\VB01D6~1\ComTest\DS18b20\ds18b20.c
(0001) /*************************************
(0002) ds18b20测温程序
(0003) 文 件 名 :ds18b20.c
(0004) 设 计 :毕京鹏
(0005) 最后修改日期:2008.11.13
(0006) 版 本 :V1.0
(0007) 主控芯片 :ATMEGA48V
(0008) 工作频率 :外部16MHz晶振
(0009) 备注 : 初步:实时测温并显示
(0010) 1.读数据时的处理方式
(0011) 2.数据口上需带上拉(5.1K)
(0012) 3.配置成9位时后三位始终为0,以此类推
(0013) 4.1s更新一次
(0014) *************************************/
(0015) #include<iom48v.h>
(0016) #include<macros.h>
(0017)
(0018) #define uchar unsigned char
(0019) #define uint unsigned int
(0020) /*DQ 接在PC0上*/
(0021) #define DQ(x) x ? (PORTC |= 0x01) : (PORTC &= 0xfe)
(0022) #define DRC(y) y ? (DDRC |= 0x01 ) : (DDRC &= 0xfe)
(0023) uchar flag;
(0024) void Init_1wire(void);
(0025) void WriteByte_1wire(uchar data);
(0026) uchar ReadByte_1wire(void);
(0027)
(0028) void PortInit(void);
(0029) void delay_1us(void);
(0030) void delay_10us(uchar n);
(0031) /*显示有关*/
(0032) #pragma interrupt_handler display_int:17
(0033) const uchar distable[]={0x27,0x2f,0x37,0x3f,0x67,0x6f,0x77,0x7f,0xa7,0xaf};
(0034) // 0 1 2 3 4 5 6 7 8 9
(0035) uchar time1,time2;
(0036) uchar count2=0;
(0037) uchar timeb1,timeb2,timeb3,timeb4,timeb5,timeb6;
(0038) void convert(void);
(0039) /*定时有关*/
(0040) uchar count1=0;
(0041) #pragma interrupt_handler timer1_int:14
(0042) /*通信有关*/
(0043) uchar Rece[2],Send[3];
(0044) uchar count3=0;
(0045) uchar flag1=0;
(0046) void UartInit(void);
(0047) void UartSend(uchar a[],uchar length);
(0048) #pragma interrupt_handler UartRece_int:19
(0049) /*******************主函数********************************/
(0050) main()
(0051) { uchar tempH,tempL;
(0052) PortInit();
_main:
tempL --> R10
tempH --> R12
43 D102 RCALL _PortInit
(0053) /***********此部分在初次配置完成后可略去*****************/
(0054) Init_1wire();
44 D147 RCALL _Init_1wire
(0055) WriteByte_1wire(0xcc);
45 EC0C LDI R16,0xCC
46 D161 RCALL _WriteByte_1wire
(0056) WriteByte_1wire(0x4e); //Write Scratchpad
47 E40E LDI R16,0x4E
48 D15F RCALL _WriteByte_1wire
(0057) WriteByte_1wire(0x7f); //TH
49 E70F LDI R16,0x7F
4A D15D RCALL _WriteByte_1wire
(0058) WriteByte_1wire(0xff); //TL
4B EF0F LDI R16,0xFF
4C D15B RCALL _WriteByte_1wire
(0059) WriteByte_1wire(0x1f); //CONFIGURATION REGISTER 9位
4D E10F LDI R16,0x1F
4E D159 RCALL _WriteByte_1wire
(0060)
(0061) Init_1wire();
4F D13C RCALL _Init_1wire
(0062) WriteByte_1wire(0xcc);
50 EC0C LDI R16,0xCC
51 D156 RCALL _WriteByte_1wire
(0063) WriteByte_1wire(0x48); //Copy Scratchpad
52 E408 LDI R16,0x48
53 D154 RCALL _WriteByte_1wire
(0064) /***********************************************/
(0065) SEI();
54 9478 BSET 7
55 C039 RJMP 0x008F
(0066) while(1)
(0067) {if(count1==100)
56 9180 010B LDS R24,count1
58 3684 CPI R24,0x64
59 F4D9 BNE 0x0075
(0068) {count1=0;
5A 2422 CLR R2
5B 9220 010B STS count1,R2
(0069) Init_1wire();
5D D12E RCALL _Init_1wire
(0070) WriteByte_1wire(0xcc);
5E EC0C LDI R16,0xCC
5F D148 RCALL _WriteByte_1wire
(0071) WriteByte_1wire(0x44);
60 E404 LDI R16,0x44
61 D146 RCALL _WriteByte_1wire
(0072) DRC(0); //判断转换是否完成
62 B187 IN R24,0x07
63 7F8E ANDI R24,0xFE
64 B987 OUT 0x07,R24
(0073) if(!(PINC&0x01));
65 9930 SBIC 0x06,0
66 C000 RJMP 0x0067
(0074) Init_1wire();
67 D124 RCALL _Init_1wire
(0075) WriteByte_1wire(0xcc);
68 EC0C LDI R16,0xCC
69 D13E RCALL _WriteByte_1wire
(0076) WriteByte_1wire(0xbe);
6A EB0E LDI R16,0xBE
6B D13C RCALL _WriteByte_1wire
(0077) tempL = ReadByte_1wire();
6C D15C RCALL _ReadByte_1wire
6D 2EA0 MOV R10,R16
(0078) tempH = ReadByte_1wire();
6E D15A RCALL _ReadByte_1wire
6F 2EC0 MOV R12,R16
(0079)
(0080) time1=tempH;
70 92C0 011A STS time1,R12
(0081) time2=tempL;
72 92A0 0119 STS time2,R10
(0082) convert();
74 D0EE RCALL _convert
(0083) }
(0084) if(flag1==1)
75 9180 010D LDS R24,flag1
77 3081 CPI R24,1
78 F4B1 BNE 0x008F
(0085) {flag1=0;
79 2422 CLR R2
7A 9220 010D STS flag1,R2
(0086) if((Rece[0]=='S')&&(Rece[1]=='T'))
7C 9180 0111 LDS R24,Rece
7E 3583 CPI R24,0x53
7F F479 BNE 0x008F
80 9180 0112 LDS R24,Rece+1
82 3584 CPI R24,0x54
83 F459 BNE 0x008F
(0087) {Send[0]='#';
84 E283 LDI R24,0x23
85 9380 010E STS Send,R24
(0088) Send[1]=tempH;
87 92C0 010F STS Send+1,R12
(0089) Send[2]=tempL;
89 92A0 0110 STS Send+2,R10
(0090) UartSend(Send,3); //向上位机发送数据
8B E023 LDI R18,3
8C E00E LDI R16,0xE
8D E011 LDI R17,1
8E D1B0 RCALL _UartSend
8F CFC6 RJMP 0x0056
90 9508 RET
_timer1_int:
91 938A ST R24,-Y
92 939A ST R25,-Y
93 B78F IN R24,0x3F
94 938A ST R24,-Y
(0091) }
(0092) }
(0093) }
(0094) }
(0095) /*******************中断函数****************************/
(0096) /*定时中断*/
(0097) void timer1_int(void)
(0098) {TCNT1=0xfd8f; //重赋初值
95 E88F LDI R24,0x8F
96 EF9D LDI R25,0xFD
97 9390 0085 STS 0x0085,R25
99 9380 0084 STS 0x0084,R24
(0099) if(count1!=100)count1++;
9B 9180 010B LDS R24,count1
9D 3684 CPI R24,0x64
9E F019 BEQ 0x00A2
9F 5F8F SUBI R24,0xFF
A0 9380 010B STS count1,R24
A2 9189 LD R24,Y+
A3 BF8F OUT 0x3F,R24
A4 9199 LD R25,Y+
A5 9189 LD R24,Y+
A6 9518 RETI
_display_int:
A7 922A ST R2,-Y
A8 923A ST R3,-Y
A9 930A ST R16,-Y
AA 931A ST R17,-Y
AB 938A ST R24,-Y
AC 939A ST R25,-Y
AD 93AA ST R26,-Y
AE 93EA ST R30,-Y
AF 93FA ST R31,-Y
B0 B62F IN R2,0x3F
B1 922A ST R2,-Y
(0100) }
(0101) /*显示中断*/
(0102) void display_int(void)
(0103) {count2++;
B2 9180 010A LDS R24,count2
B4 5F8F SUBI R24,0xFF
B5 9380 010A STS count2,R24
(0104) TCNT0=0xce; //重赋初值
B7 EC8E LDI R24,0xCE
B8 BD86 OUT 0x26,R24
(0105) PORTC|=0x0e; //0000 1110
B9 B188 IN R24,0x08
BA 608E ORI R24,0xE
BB B988 OUT 0x08,R24
(0106) PORTD|=0xd8; //1101 1000
BC B18B IN R24,0x0B
BD 6D88 ORI R24,0xD8
BE B98B OUT 0x0B,R24
(0107) switch(count2)
BF 9100 010A LDS R16,count2
C1 2711 CLR R17
C2 3001 CPI R16,1
C3 E0E0 LDI R30,0
C4 071E CPC R17,R30
C5 F0C1 BEQ 0x00DE
C6 3002 CPI R16,2
C7 E0E0 LDI R30,0
C8 071E CPC R17,R30
C9 F119 BEQ 0x00ED
CA 3003 CPI R16,3
CB E0E0 LDI R30,0
CC 071E CPC R17,R30
CD F171 BEQ 0x00FC
CE 3004 CPI R16,4
CF E0E0 LDI R30,0
D0 071E CPC R17,R30
D1 F409 BNE 0x00D3
D2 C038 RJMP 0x010B
D3 3005 CPI R16,5
D4 E0E0 LDI R30,0
D5 071E CPC R17,R30
D6 F409 BNE 0x00D8
D7 C042 RJMP 0x011A
D8 3006 CPI R16,6
D9 E0E0 LDI R30,0
DA 071E CPC R17,R30
DB F409 BNE 0x00DD
DC C04C RJMP 0x0129
DD C05C RJMP 0x013A
(0108) {case 1:
(0109) PORTC&=0xf1; //L6 1111 0001
DE B188 IN R24,0x08
DF 7F81 ANDI R24,0xF1
E0 B988 OUT 0x08,R24
(0110) PORTD&=distable[timeb6];
E1 E080 LDI R24,0
E2 E091 LDI R25,1
E3 91E0 0113 LDS R30,timeb6
E5 27FF CLR R31
E6 0FE8 ADD R30,R24
E7 1FF9 ADC R31,R25
E8 8020 LDD R2,Z+0
E9 B03B IN R3,0x0B
EA 2032 AND R3,R2
EB B83B OUT 0x0B,R3
(0111) break;
EC C04D RJMP 0x013A
(0112) case 2:
(0113) PORTC&=0xf3; //L5 1111 0011
ED B188 IN R24,0x08
EE 7F83 ANDI R24,0xF3
EF B988 OUT 0x08,R24
(0114) PORTD&=distable[timeb5];
F0 E080 LDI R24,0
F1 E091 LDI R25,1
F2 91E0 0114 LDS R30,timeb5
F4 27FF CLR R31
F5 0FE8 ADD R30,R24
F6 1FF9 ADC R31,R25
F7 8020 LDD R2,Z+0
F8 B03B IN R3,0x0B
F9 2032 AND R3,R2
FA B83B OUT 0x0B,R3
(0115) break;
FB C03E RJMP 0x013A
(0116) case 3:
(0117) PORTC&=0xf5; //L4 1111 0101
FC B188 IN R24,0x08
FD 7F85 ANDI R24,0xF5
FE B988 OUT 0x08,R24
(0118) PORTD&=distable[timeb4];
FF E080 LDI R24,0
100 E091 LDI R25,1
101 91E0 0115 LDS R30,timeb4
103 27FF CLR R31
104 0FE8 ADD R30,R24
105 1FF9 ADC R31,R25
106 8020 LDD R2,Z+0
107 B03B IN R3,0x0B
108 2032 AND R3,R2
109 B83B OUT 0x0B,R3
(0119) break;
10A C02F RJMP 0x013A
(0120) case 4:
(0121) PORTC&=0xf7; //L3 1111 0111
10B B188 IN R24,0x08
10C 7F87 ANDI R24,0xF7
10D B988 OUT 0x08,R24
(0122) PORTD&=distable[timeb3];
10E E080 LDI R24,0
10F E091 LDI R25,1
110 91E0 0116 LDS R30,timeb3
112 27FF CLR R31
113 0FE8 ADD R30,R24
114 1FF9 ADC R31,R25
115 8020 LDD R2,Z+0
116 B03B IN R3,0x0B
117 2032 AND R3,R2
118 B83B OUT 0x0B,R3
(0123) break;
119 C020 RJMP 0x013A
(0124) case 5:
(0125) PORTC&=0xf9; //L2 1111 1001
11A B188 IN R24,0x08
11B 7F89 ANDI R24,0xF9
11C B988 OUT 0x08,R24
(0126) PORTD&=distable[timeb2];
11D E080 LDI R24,0
11E E091 LDI R25,1
11F 91E0 0117 LDS R30,timeb2
121 27FF CLR R31
122 0FE8 ADD R30,R24
123 1FF9 ADC R31,R25
124 8020 LDD R2,Z+0
125 B03B IN R3,0x0B
126 2032 AND R3,R2
127 B83B OUT 0x0B,R3
(0127) break;
128 C011 RJMP 0x013A
(0128) case 6:
(0129) count2=0;
129 2422 CLR R2
12A 9220 010A STS count2,R2
(0130) PORTC&=0xfb; //L1 1111 1011
12C B188 IN R24,0x08
12D 7F8B ANDI R24,0xFB
12E B988 OUT 0x08,R24
(0131) PORTD&=distable[timeb1];
12F E080 LDI R24,0
130 E091 LDI R25,1
131 91E0 0118 LDS R30,timeb1
133 27FF CLR R31
134 0FE8 ADD R30,R24
135 1FF9 ADC R31,R25
136 8020 LDD R2,Z+0
137 B03B IN R3,0x0B
138 2032 AND R3,R2
139 B83B OUT 0x0B,R3
(0132) break;
13A 9029 LD R2,Y+
13B BE2F OUT 0x3F,R2
13C 91F9 LD R31,Y+
13D 91E9 LD R30,Y+
13E 91A9 LD R26,Y+
13F 9199 LD R25,Y+
140 9189 LD R24,Y+
141 9119 LD R17,Y+
142 9109 LD R16,Y+
143 9039 LD R3,Y+
144 9029 LD R2,Y+
145 9518 RETI
(0133) }
(0134) }
(0135) /*******************子函数***********************************/
(0136) /*端口及中断初始化*/
(0137) void PortInit(void)
(0138) {DDRC = 0xff;
_PortInit:
146 EF8F LDI R24,0xFF
147 B987 OUT 0x07,R24
(0139) PORTC=0xff;
148 B988 OUT 0x08,R24
(0140) DDRD=0xff;
149 B98A OUT 0x0A,R24
(0141) PORTD=0x00;
14A 2422 CLR R2
14B B82B OUT 0x0B,R2
(0142) /*T/C0*/
(0143) TCCR0A=0x00;
14C BC24 OUT 0x24,R2
(0144) TIMSK0=0x01;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -