📄 仿真多点温度测量(毕业设计).lst
字号:
(0136) }
149 C00A RJMP 0x0154
(0137) else
(0138) {
(0139) PORTA&=0xfe;
14A B38B IN R24,0x1B
14B 7F8E ANDI R24,0xFE
14C BB8B OUT 0x1B,R24
(0140) delay_18B20(100);
14D E604 LDI R16,0x64
14E E010 LDI R17,0
14F DF9D RCALL _delay_18B20
(0141) PORTA|=0x01;
150 9AD8 SBI 0x1B,0
(0142) delay_18B20(10);
151 E00A LDI R16,0xA
152 E010 LDI R17,0
153 DF99 RCALL _delay_18B20
(0143) }
(0144) wdata=wdata>>1;
154 9546 LSR R20
155 94A3 INC R10
156 E087 LDI R24,7
157 158A CP R24,R10
158 F710 BCC 0x013B
159 940C 02B1 JMP pop_xgsetF00C
_ds1820disp:
flagdat --> R20
15B 934A ST R20,-Y
(0145) }
(0146) }
(0147)
(0148) /******************************************************************/
(0149) void ds1820disp()//温度值显示
(0150) {
(0151) uchar flagdat;
(0152) DDRB|=0xFF;
15C B387 IN R24,0x17
15D 6F8F ORI R24,0xFF
15E BB87 OUT 0x17,R24
(0153) DDRC|=(1<<3)|(1<<4)|(1<<5);
15F B384 IN R24,0x14
160 6388 ORI R24,0x38
161 BB84 OUT 0x14,R24
(0154) adata[0]=tvalue/1000+0x30;//百位数
162 EE28 LDI R18,0xE8
163 E033 LDI R19,3
164 9100 00BD LDS R16,tvalue
166 9110 00BE LDS R17,tvalue+1
168 940E 0290 CALL div16u
16A 01C8 MOVW R24,R16
16B 96C0 ADIW R24,0x30
16C 9380 00C0 STS adata,R24
(0155) adata[1]=tvalue%1000/100+0x30;//十位数
16E EE28 LDI R18,0xE8
16F E033 LDI R19,3
170 9100 00BD LDS R16,tvalue
172 9110 00BE LDS R17,tvalue+1
174 940E 028E CALL mod16u
176 E624 LDI R18,0x64
177 E030 LDI R19,0
178 940E 0290 CALL div16u
17A 01C8 MOVW R24,R16
17B 96C0 ADIW R24,0x30
17C 9380 00C1 STS adata+1,R24
(0156) adata[2]=tvalue%100/10+0x30;//个位数
17E E624 LDI R18,0x64
17F E030 LDI R19,0
180 9100 00BD LDS R16,tvalue
182 9110 00BE LDS R17,tvalue+1
184 940E 028E CALL mod16u
186 E02A LDI R18,0xA
187 E030 LDI R19,0
188 940E 0290 CALL div16u
18A 01C8 MOVW R24,R16
18B 96C0 ADIW R24,0x30
18C 9380 00C2 STS adata+2,R24
(0157) adata[3]=tvalue%10+0x30;//小数位
18E E02A LDI R18,0xA
18F E030 LDI R19,0
190 9100 00BD LDS R16,tvalue
192 9110 00BE LDS R17,tvalue+1
194 940E 028E CALL mod16u
196 01C8 MOVW R24,R16
197 96C0 ADIW R24,0x30
198 9380 00C3 STS adata+3,R24
(0158) if(tflag==0)
19A 9020 00BC LDS R2,tflag
19C 2022 TST R2
19D F411 BNE 0x01A0
(0159) flagdat=0x20;//正温度不显示符号
19E E240 LDI R20,0x20
19F C001 RJMP 0x01A1
(0160) else
(0161) flagdat=0x2d;//负温度显示负号:-
1A0 E24D LDI R20,0x2D
(0162) if(adata[0]==0x30)
1A1 9180 00C0 LDS R24,adata
1A3 3380 CPI R24,0x30
1A4 F451 BNE 0x01AF
(0163) {
(0164) adata[0]=0x20;//如果百位为0,不显示
1A5 E280 LDI R24,0x20
1A6 9380 00C0 STS adata,R24
(0165) if(adata[1]==0x30)
1A8 9180 00C1 LDS R24,adata+1
1AA 3380 CPI R24,0x30
1AB F419 BNE 0x01AF
(0166) {
(0167) adata[1]=0x20;//如果百位为0,十位为0也不显示
1AC E280 LDI R24,0x20
1AD 9380 00C1 STS adata+1,R24
(0168) }
(0169) }
(0170) if(n==0)
1AF 9020 00BF LDS R2,n
1B1 2022 TST R2
1B2 F431 BNE 0x01B9
(0171) {
(0172) wr_com(0x80);
1B3 E800 LDI R16,0x80
1B4 DEDC RCALL _wr_com
(0173) display(str1);
1B5 E600 LDI R16,0x60
1B6 E010 LDI R17,0
1B7 DF22 RCALL _display
(0174) }
1B8 C01D RJMP 0x01D6
(0175) else if(n==1)
1B9 9180 00BF LDS R24,n
1BB 3081 CPI R24,1
1BC F431 BNE 0x01C3
(0176) {
(0177) wr_com(0x80);
1BD E800 LDI R16,0x80
1BE DED2 RCALL _wr_com
(0178) display(str2);
1BF E60F LDI R16,0x6F
1C0 E010 LDI R17,0
1C1 DF18 RCALL _display
(0179) }
1C2 C013 RJMP 0x01D6
(0180) else if(n==2)
1C3 9180 00BF LDS R24,n
1C5 3082 CPI R24,2
1C6 F431 BNE 0x01CD
(0181) {
(0182) wr_com(0x80);
1C7 E800 LDI R16,0x80
1C8 DEC8 RCALL _wr_com
(0183) display(str3);
1C9 E70E LDI R16,0x7E
1CA E010 LDI R17,0
1CB DF0E RCALL _display
(0184) }
1CC C009 RJMP 0x01D6
(0185) else if(n==3)
1CD 9180 00BF LDS R24,n
1CF 3083 CPI R24,3
1D0 F429 BNE 0x01D6
(0186) {
(0187) wr_com(0x80);
1D1 E800 LDI R16,0x80
1D2 DEBE RCALL _wr_com
(0188) display(str4);
1D3 E80D LDI R16,0x8D
1D4 E010 LDI R17,0
1D5 DF04 RCALL _display
(0189) }
(0190) wr_com(0xc0);
1D6 EC00 LDI R16,0xC0
1D7 DEB9 RCALL _wr_com
(0191) wr_dat(flagdat);//显示符号位
1D8 2F04 MOV R16,R20
1D9 DECA RCALL _wr_dat
(0192) wr_com(0xc1);
1DA EC01 LDI R16,0xC1
1DB DEB5 RCALL _wr_com
(0193) wr_dat(adata[0]);//显示百位
1DC 9100 00C0 LDS R16,adata
1DE DEC5 RCALL _wr_dat
(0194) wr_com(0xc2);
1DF EC02 LDI R16,0xC2
1E0 DEB0 RCALL _wr_com
(0195) wr_dat(adata[1]);//显示十位
1E1 9100 00C1 LDS R16,adata+1
1E3 DEC0 RCALL _wr_dat
(0196) wr_com(0xc3);
1E4 EC03 LDI R16,0xC3
1E5 DEAB RCALL _wr_com
(0197) wr_dat(adata[2]);//显示个位
1E6 9100 00C2 LDS R16,adata+2
1E8 DEBB RCALL _wr_dat
(0198) wr_com(0xc4);
1E9 EC04 LDI R16,0xC4
1EA DEA6 RCALL _wr_com
(0199) wr_dat(0x2e);//显示小数点
1EB E20E LDI R16,0x2E
1EC DEB7 RCALL _wr_dat
(0200) wr_com(0xc5);
1ED EC05 LDI R16,0xC5
1EE DEA2 RCALL _wr_com
(0201) wr_dat(adata[3]);//显示小数位
1EF 9100 00C3 LDS R16,adata+3
1F1 DEB2 RCALL _wr_dat
1F2 9149 LD R20,Y+
1F3 9508 RET
_readandisp_temp:
b --> R12
a --> R10
i --> R20
1F4 940E 02B8 CALL push_xgset303C
(0202) }
(0203) /*******************读取温度值并转换********************************/
(0204) void readandisp_temp()
(0205) {
(0206) unsigned char a,b,i;
(0207) DDRB|=0xFF;
1F6 B387 IN R24,0x17
1F7 6F8F ORI R24,0xFF
1F8 BB87 OUT 0x17,R24
(0208) DDRA|=(1<<3)|(1<<4)|(1<<5);
1F9 B38A IN R24,0x1A
1FA 6388 ORI R24,0x38
1FB BB8A OUT 0x1A,R24
(0209) lcd_init();
1FC DEBA RCALL _lcd_init
(0210) for(n=0;n<4;n++)
1FD 2422 CLR R2
1FE 9220 00BF STS n,R2
200 C082 RJMP 0x0283
(0211) {
(0212) do
(0213) i=ds1820rst();
201 DEF3 RCALL _ds1820rst
202 2F40 MOV R20,R16
(0214) while(i==0x01);
203 3041 CPI R20,1
204 F3E1 BEQ 0x0201
(0215) ds1820wr(0xCC);
205 EC0C LDI R16,0xCC
206 DF2E RCALL _ds1820wr
(0216) ds1820wr(0x44);
207 E404 LDI R16,0x44
208 DF2C RCALL _ds1820wr
(0217) delay_18B20(600);
209 E508 LDI R16,0x58
20A E012 LDI R17,2
20B DEE1 RCALL _delay_18B20
(0218) do
(0219) i=ds1820rst();
20C DEE8 RCALL _ds1820rst
20D 2F40 MOV R20,R16
(0220) while(i==0x01);
20E 3041 CPI R20,1
20F F3E1 BEQ 0x020C
(0221) ds1820wr(0x55);//匹配
210 E505 LDI R16,0x55
211 DF23 RCALL _ds1820wr
(0222) for(i=0;i<8;i++)
212 2744 CLR R20
213 C014 RJMP 0x0228
(0223) {
(0224) ds1820wr(str5[n][i]);
214 E98C LDI R24,0x9C
215 E090 LDI R25,0
216 9020 00BF LDS R2,n
218 2433 CLR R3
219 0C22 LSL R2
21A 1C33 ROL R3
21B 0C22 LSL R2
21C 1C33 ROL R3
21D 0C22 LSL R2
21E 1C33 ROL R3
21F 0E28 ADD R2,R24
220 1E39 ADC R3,R25
221 2FE4 MOV R30,R20
222 27FF CLR R31
223 0DE2 ADD R30,R2
224 1DF3 ADC R31,R3
225 8100 LDD R16,Z+0
226 DF0E RCALL _ds1820wr
227 9543 INC R20
228 3048 CPI R20,0x8
229 F350 BCS 0x0214
(0225) }
(0226) ds1820wr(0xbe);
22A EB0E LDI R16,0xBE
22B DF09 RCALL _ds1820wr
(0227) a=ds1820rd();
22C DEDF RCALL _ds1820rd
22D 2EA0 MOV R10,R16
(0228) b=ds1820rd();
22E DEDD RCALL _ds1820rd
22F 2EC0 MOV R12,R16
(0229) ds1820rst();
230 DEC4 RCALL _ds1820rst
(0230) tvalue=b;
231 2C2C MOV R2,R12
232 2433 CLR R3
233 9230 00BE STS tvalue+1,R3
235 9220 00BD STS tvalue,R2
(0231) tvalue<<=8;
237 2C32 MOV R3,R2
238 2422 CLR R2
239 9230 00BE STS tvalue+1,R3
23B 9220 00BD STS tvalue,R2
(0232) tvalue=tvalue|a;
23D 2C2A MOV R2,R10
23E 2433 CLR R3
23F 9040 00BD LDS R4,tvalue
241 9050 00BE LDS R5,tvalue+1
243 2842 OR R4,R2
244 2853 OR R5,R3
245 9250 00BE STS tvalue+1,R5
247 9240 00BD STS tvalue,R4
(0233) if(tvalue<0x0fff)
249 01C2 MOVW R24,R4
24A 3F8F CPI R24,0xFF
24B E0EF LDI R30,0xF
24C 079E CPC R25,R30
24D F420 BCC 0x0252
(0234) tflag=0;
24E 2422 CLR R2
24F 9220 00BC STS tflag,R2
251 C00E RJMP 0x0260
(0235) else
(0236) {
(0237) tvalue=~tvalue+1;
252 9180 00BD LDS R24,tvalue
254 9190 00BE LDS R25,tvalue+1
256 9580 COM R24
257 9590 COM R25
258 9601 ADIW R24,1
259 9390 00BE STS tvalue+1,R25
25B 9380 00BD STS tvalue,R24
(0238) tflag=1;
25D E081 LDI R24,1
25E 9380 00BC STS tflag,R24
(0239) }
(0240) tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
260 E504 LDI R16,0x54
261 E010 LDI R17,0
262 940E 02CF CALL lpm32
264 0118 MOVW R2,R16
265 0129 MOVW R4,R18
266 9100 00BD LDS R16,tvalue
268 9110 00BE LDS R17,tvalue+1
26A 940E 030F CALL uint2fp
26C 933A ST R19,-Y
26D 932A ST R18,-Y
26E 931A ST R17,-Y
26F 930A ST R16,-Y
270 0181 MOVW R16,R2
271 0192 MOVW R18,R4
272 940E 0407 CALL fpmule2
274 940E 02E3 CALL fpint
276 9310 00BE STS tvalue+1,R17
278 9300 00BD STS tvalue,R16
(0241) ds1820disp();
27A DEE0 RCALL _ds1820disp
(0242) delay1ms(1000);
27B EE08 LDI R16,0xE8
27C E013 LDI R17,3
27D DDFF RCALL _delay1ms
27E 9180 00BF LDS R24,n
280 5F8F SUBI R24,0xFF
281 9380 00BF STS n,R24
283 9180 00BF LDS R24,n
285 3084 CPI R24,4
286 F408 BCC 0x0288
287 CF79 RJMP 0x0201
288 940C 02BF JMP pop_xgset303C
(0243) }
(0244) }
(0245) /********************主程序***********************************/
(0246) void main()
(0247) {
_main:
28A C001 RJMP 0x028C
(0248) while(1)
(0249) {
(0250) readandisp_temp();//读取和显示温度
FILE: <library>
28B DF68 RCALL _readandisp_temp
28C CFFE RJMP 0x028B
28D 9508 RET
mod16u:
28E 9468 BSET 6
28F C001 RJMP xdiv16u
div16u:
290 94E8 BCLR 6
xdiv16u:
291 92EA ST R14,-Y
292 92FA ST R15,-Y
293 938A ST R24,-Y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -