can18b20.lis
来自「基于CAN总线的 温度采集方法。选用DS18B20温度传感器。」· LIS 代码 · 共 1,548 行 · 第 1/5 页
LIS
1,548 行
02BA .dbline 400
02BA A898 cbi 0x15,0
02BC .dbline 401
02BC ; asm("nop");
02BC 0000 nop
02BE .dbline 402
02BE ; if((dat&0x80)!=0)
02BE 07FF sbrs R16,7
02C0 02C0 rjmp L104
02C2 .dbline 403
02C2 ; S_DATA;
02C2 AA9A sbi 0x15,2
02C4 01C0 rjmp L105
02C6 L104:
02C6 .dbline 405
02C6 ; else
02C6 ; C_DATA;
02C6 AA98 cbi 0x15,2
02C8 L105:
02C8 .dbline 406
02C8 000F lsl R16
02CA .dbline 407
02CA 0000 nop
02CC .dbline 408
02CC A89A sbi 0x15,0
02CE .dbline 409
02CE L101:
02CE .dbline 399
02CE 4395 inc R20
02D0 L103:
02D0 .dbline 399
02D0 4830 cpi R20,8
02D2 98F3 brlo L100
02D4 .dbline 410
02D4 ; dat<<=1;
02D4 ; asm("nop");
02D4 ; S_CLK; // 时钟拉高
02D4 ; }
02D4 ; S_CS; //cs 拉高
02D4 A99A sbi 0x15,1
02D6 .dbline -2
02D6 L99:
02D6 00D0 rcall pop_gset1
02D8 .dbline 0 ; func end
02D8 0895 ret
02DA .dbsym r i 20 c
02DA .dbsym r dat 16 c
02DA .dbend
.area vector(rom, abs)
.org 18
0012 6DC1 rjmp _time0_ovf_isr
.area text(rom, con, rel)
02DA .dbfile F:\can-18b20(无浮点再调试)\can18b20.c
02DA .dbfunc e time0_ovf_isr _time0_ovf_isr fV
.even
02DA _time0_ovf_isr::
02DA 00D0 rcall push_lset
02DC .dbline -1
02DC .dbline 415
02DC ; }
02DC ; //定时器1中断,1ms中断一次
02DC ; #pragma interrupt_handler time0_ovf_isr:10
02DC ; void time0_ovf_isr(void)
02DC ; {
02DC .dbline 416
02DC ; TCNT0=0xF8; //重新装置
02DC 88EF ldi R24,248
02DE 82BF out 0x32,R24
02E0 .dbline 417
02E0 ; count++;
02E0 80910500 lds R24,_count
02E4 90910600 lds R25,_count+1
02E8 0196 adiw R24,1
02EA 90930600 sts _count+1,R25
02EE 80930500 sts _count,R24
02F2 .dbline 418
02F2 ; if(count>=100) //100ms
02F2 8436 cpi R24,100
02F4 E0E0 ldi R30,0
02F6 9E07 cpc R25,R30
02F8 30F0 brlo L107
02FA .dbline 419
02FA ; count=0;
02FA 2224 clr R2
02FC 3324 clr R3
02FE 30920600 sts _count+1,R3
0302 20920500 sts _count,R2
0306 L107:
0306 .dbline 420
0306 ; if(flag==0)
0306 20900000 lds R2,_flag
030A 2220 tst R2
030C 91F4 brne L109
030E .dbline 421
030E ; { flag=1;
030E .dbline 421
030E 81E0 ldi R24,1
0310 80930000 sts _flag,R24
0314 .dbline 423
0314 ; //个位显示
0314 ; PORTC&=(~0x18);
0314 85B3 in R24,0x15
0316 877E andi R24,231
0318 85BB out 0x15,R24
031A .dbline 424
031A ; HC595_SENDDAT(table[ge]|0x80); //加小数点
031A 80E0 ldi R24,<_table
031C 90E0 ldi R25,>_table
031E E0910200 lds R30,_ge
0322 FF27 clr R31
0324 E80F add R30,R24
0326 F91F adc R31,R25
0328 0081 ldd R16,z+0
032A 0068 ori R16,128
032C C1DF rcall _HC595_SENDDAT
032E .dbline 425
032E ; PORTC|=0x10;
032E AC9A sbi 0x15,4
0330 .dbline 426
0330 ; }
0330 10C0 rjmp L110
0332 L109:
0332 .dbline 428
0332 .dbline 428
0332 2224 clr R2
0334 20920000 sts _flag,R2
0338 .dbline 430
0338 85B3 in R24,0x15
033A 877E andi R24,231
033C 85BB out 0x15,R24
033E .dbline 431
033E 80E0 ldi R24,<_table
0340 90E0 ldi R25,>_table
0342 E0910300 lds R30,_shi
0346 FF27 clr R31
0348 E80F add R30,R24
034A F91F adc R31,R25
034C 0081 ldd R16,z+0
034E B0DF rcall _HC595_SENDDAT
0350 .dbline 432
0350 AB9A sbi 0x15,3
0352 .dbline 433
0352 L110:
0352 .dbline -2
0352 L106:
0352 00D0 rcall pop_lset
0354 .dbline 0 ; func end
0354 1895 reti
0356 .dbend
0356 .dbfunc e main _main fV
.area func_lit(rom, con, rel)
0000 L156:
0000 8F02 .word `L145
0002 8F02 .word `L145
0004 9302 .word `L146
0006 9302 .word `L146
0008 9702 .word `L147
000A 9B02 .word `L148
000C 9B02 .word `L148
000E 9F02 .word `L149
0010 A302 .word `L150
0012 A302 .word `L150
0014 A702 .word `L151
0016 A702 .word `L151
0018 AB02 .word `L152
001A AF02 .word `L153
001C AF02 .word `L153
001E B302 .word `L154
0020 B702 .word `L155
.area text(rom, con, rel)
0356 .dbfile F:\can-18b20(无浮点再调试)\can18b20.c
0356 ; m -> R12,R13
0356 ; a -> R10
0356 ; temh -> R20
0356 ; teml -> R22
0356 ; i -> R12
0356 ; temporary -> y+0
0356 ; j -> R14
.even
0356 _main::
0356 2997 sbiw R28,9
0358 .dbline -1
0358 .dbline 440
0358 ; else
0358 ; { flag=0;
0358 ; //十位显示
0358 ; PORTC&=(~0x18);
0358 ; HC595_SENDDAT(table[shi]);
0358 ; PORTC|=0x08;
0358 ; }
0358 ;
0358 ; }
0358 ;
0358 ; /*************************** 主机先发送,等待接收***************************/
0358 ; /* 说明:外部中断0不使能,如果允许,显示保持不住。*/
0358 ; void main( void )
0358 ; { unsigned char i,j;
0358 .dbline 442
0358 ; unsigned char teml,temh;
0358 ; unsigned char a=0;
0358 AA24 clr R10
035A .dbline 446
035A ; unsigned int m;
035A ; unsigned char temporary[9];
035A ; //M8 端口初始化
035A ; PORTB=0x07; //MCP2515 disable(CS,PB2),PB1,PB0上、下行灯灭
035A 87E0 ldi R24,7
035C 88BB out 0x18,R24
035E .dbline 447
035E ; DDRB|=0x07;
035E 87B3 in R24,0x17
0360 8760 ori R24,7
0362 87BB out 0x17,R24
0364 .dbline 448
0364 ; DDRD=0xC0; //1100 0000 PD7、PD6输出保持,PD5、PD4按键输入
0364 80EC ldi R24,192
0366 81BB out 0x11,R24
0368 .dbline 449
0368 ; PORTC=0x02; //CS disable
0368 82E0 ldi R24,2
036A 85BB out 0x15,R24
036C .dbline 450
036C ; DDRC|=0x1F; //PC3为595的位选COM2(十位),PC4为595的位选COM1(个位)+595(PC0、PC1、PC2)
036C 84B3 in R24,0x14
036E 8F61 ori R24,31
0370 84BB out 0x14,R24
0372 .dbline 456
0372 ; /*use int0*/
0372 ; // GICR|=0x40; //int0 enable
0372 ; //MCUCR|=0x02; //下降沿触发中断0
0372 ; //uart_init(); //串口初始化
0372 ; //初始化SPI
0372 ; init_SPI();
0372 46DE rcall _init_SPI
0374 .dbline 458
0374 ; //reset mcp2515
0374 ; reset_MCP();
0374 4BDE rcall _reset_MCP
0376 .dbline 460
0376 ; //初始化 CAN
0376 ; init_can();
0376 A2DE rcall _init_can
0378 .dbline 461
0378 ; minus_flag=0; //初始化负温度标志
0378 2224 clr R2
037A 20920000 sts _minus_flag,R2
037E .dbline 462
037E ; CLI(); //关中断
037E F894 cli
0380 L112:
0380 .dbline 464
0380 L113:
0380 .dbline 464
0380 ; //矫正第一次数据,不矫正第一次显示85
0380 ; while(!ds1820_ack());
0380 1EDF rcall _ds1820_ack
0382 0023 tst R16
0384 E9F3 breq L112
0386 .dbline 465
0386 ; write_byte(0xCC); // Skip ROM
0386 0CEC ldi R16,204
0388 51DF rcall _write_byte
038A .dbline 466
038A ; write_byte(0x44); // Start Conversion
038A 04E4 ldi R16,68
038C 4FDF rcall _write_byte
038E .dbline 467
038E ; wait(750);
038E 0EEE ldi R16,750
0390 12E0 ldi R17,2
0392 6BDF rcall _wait
0394 L115:
0394 .dbline 468
0394 L116:
0394 .dbline 468
0394 ; while(!ds1820_ack());
0394 14DF rcall _ds1820_ack
0396 0023 tst R16
0398 E9F3 breq L115
039A .dbline 469
039A ; write_byte(0xCC); // Skip ROM
039A 0CEC ldi R16,204
039C 47DF rcall _write_byte
039E .dbline 470
039E ; write_byte(0xBE); // Read Scratch Pad
039E 0EEB ldi R16,190
03A0 45DF rcall _write_byte
03A2 .dbline 471
03A2 ; teml = read_byte();
03A2 24DF rcall _read_byte
03A4 602F mov R22,R16
03A6 .dbline 472
03A6 ; temh = read_byte();
03A6 22DF rcall _read_byte
03A8 402F mov R20,R16
03AA .dbline 473
03AA ; m=temh*256+teml;
03AA 242F mov R18,R20
03AC 3327 clr R19
03AE 00E0 ldi R16,256
03B0 11E0 ldi R17,1
03B2 00D0 rcall empy16s
03B4 6801 movw R12,R16
03B6 262E mov R2,R22
03B8 3324 clr R3
03BA C20C add R12,R2
03BC D31C adc R13,R3
03BE
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?