can18b20.lis
来自「基于CAN总线的 温度采集方法。选用DS18B20温度传感器。」· LIS 代码 · 共 1,548 行 · 第 1/5 页
LIS
1,548 行
022E 602F mov R22,R16
0230 .dbline -1
0230 .dbline 273
0230 ; }
0230 ;
0230 ; /*===================================================================
0230 ; // 函数功能: 向 1-WIRE 总线上写一个字节
0230 ; // 形参: value 写到总线上的值
0230 ; // 返回: void
0230 ; // 编写: 2004/8/25
0230 ; ===================================================================*/
0230 ; void write_byte(unsigned char value)
0230 ; {
0230 .dbline 275
0230 ; unsigned char i;
0230 ; DDRC |= DQ;
0230 A59A sbi 0x14,5
0232 .dbline 276
0232 ; for(i = 8; i > 0; i--)
0232 48E0 ldi R20,8
0234 15C0 rjmp L81
0236 L78:
0236 .dbline 277
0236 ; {
0236 .dbline 278
0236 ; if(value & 0x01)
0236 60FF sbrs R22,0
0238 09C0 rjmp L82
023A .dbline 279
023A ; {
023A .dbline 280
023A ; PORTC &= ~DQ; // pull DQ low to start timeslot
023A AD98 cbi 0x15,5
023C .dbline 281
023C ; delay_us(10);
023C 0AE0 ldi R16,10
023E 10E0 ldi R17,0
0240 B6DF rcall _delay_us
0242 .dbline 282
0242 ; PORTC |= DQ;
0242 AD9A sbi 0x15,5
0244 .dbline 283
0244 ; delay_us(100);
0244 04E6 ldi R16,100
0246 10E0 ldi R17,0
0248 B2DF rcall _delay_us
024A .dbline 284
024A ; }
024A 08C0 rjmp L83
024C L82:
024C .dbline 286
024C ; else
024C ; {
024C .dbline 287
024C ; PORTC &= ~DQ; // pull DQ low to start timeslot
024C AD98 cbi 0x15,5
024E .dbline 288
024E ; delay_us(100);
024E 04E6 ldi R16,100
0250 10E0 ldi R17,0
0252 ADDF rcall _delay_us
0254 .dbline 289
0254 ; PORTC |= DQ;
0254 AD9A sbi 0x15,5
0256 .dbline 290
0256 ; delay_us(10);
0256 0AE0 ldi R16,10
0258 10E0 ldi R17,0
025A A9DF rcall _delay_us
025C .dbline 291
025C ; }
025C L83:
025C .dbline 292
025C 6695 lsr R22
025E .dbline 293
025E L79:
025E .dbline 276
025E 4A95 dec R20
0260 L81:
0260 .dbline 276
0260 2224 clr R2
0262 2416 cp R2,R20
0264 40F3 brlo L78
0266 .dbline -2
0266 L77:
0266 00D0 rcall pop_gset2
0268 .dbline 0 ; func end
0268 0895 ret
026A .dbsym r i 20 c
026A .dbsym r value 22 c
026A .dbend
026A .dbfunc e wait _wait fV
026A ; i -> R20,R21
026A ; n -> R22,R23
.even
026A _wait::
026A 00D0 rcall push_gset2
026C B801 movw R22,R16
026E .dbline -1
026E .dbline 377
026E ; value >>= 1;
026E ; }
026E ; }
026E ;
026E ; /*===================================================================
026E ; // 函数功能: 读取温度
026E ; // 形参: *temperature 温度存储空间
026E ; // 返回: unsigned char true为有效
026E ; // 编写: 2004/8/25
026E ; ===================================================================*/
026E ; /*unsigned char Read_Temperature(unsigned int *temperature)
026E ; {
026E ; unsigned char i;
026E ; union{
026E ; unsigned char c[2];
026E ; unsigned int x;
026E ; }temp;
026E ; unsigned char temporary[9];
026E ;
026E ; while(!ds1820_ack());
026E ; write_byte(0xCC); // Skip ROM
026E ; write_byte(0x44); // Start Conversion
026E ; //for(i = 0; i < 16; i++)
026E ; //delay_us(50000);
026E ; delay(20);
026E ; while(!ds1820_ack());
026E ; write_byte(0xCC); // Skip ROM
026E ; write_byte(0xBE); // Read Scratch Pad
026E ; for(i = 0; i < 9; i++)
026E ; temporary[i] = read_byte();
026E ; temp.c[0] = temporary[0];
026E ; temp.c[1] = temporary[1];
026E ;
026E ; if(crccheck(temporary,9))
026E ; return 0;
026E ; else
026E ; {
026E ; *temperature = temp.x;
026E ; return 1;
026E ; }
026E ; }
026E ; */
026E ; /*===================================================================
026E ; // 函数功能: 读取Rom Code
026E ; // 形参: *temp DS18B20的Rom Code存储空间
026E ; // 返回: unsigned char true为有效
026E ; // 编写: 2004/8/25
026E ; ===================================================================*/
026E ; /*unsigned char Read_RomCode(unsigned char *temp)
026E ; {
026E ; ds1820_ack();
026E ; write_byte(0x33);
026E ; temp[0] = read_byte();
026E ; temp[1] = read_byte();
026E ; temp[2] = read_byte();
026E ; temp[3] = read_byte();
026E ; temp[4] = read_byte();
026E ; temp[5] = read_byte();
026E ; temp[6] = read_byte();
026E ; temp[7] = read_byte();
026E ; if(crccheck(temp,8))
026E ; return 0;
026E ; else
026E ; return 1;
026E ; }
026E ; */
026E ; /*===================================================================
026E ; // 函数功能: 匹配DS18B20
026E ; // 形参: *p DS18B20的Rom Code
026E ; // 返回: void
026E ; // 编写: 2004/8/25
026E ; ===================================================================*/
026E ; /*void ds1820_match(unsigned char *p)
026E ; {
026E ; unsigned char i;
026E ; ds1820_ack();
026E ; write_byte(0x55);
026E ; for(i=0;i<8;i++)
026E ; write_byte(p[i]);
026E ; }
026E ; */
026E ;
026E ;
026E ; /*nms delay*/
026E ; void wait(unsigned int n)
026E ; {unsigned int i;
026E .dbline 378
026E ; for(i=0;i<n;i++)
026E 4427 clr R20
0270 5527 clr R21
0272 03C0 rjmp L88
0274 L85:
0274 .dbline 379
0274 07D0 rcall _delay_1ms
0276 L86:
0276 .dbline 378
0276 4F5F subi R20,255 ; offset = 1
0278 5F4F sbci R21,255
027A L88:
027A .dbline 378
027A 4617 cp R20,R22
027C 5707 cpc R21,R23
027E D0F3 brlo L85
0280 .dbline -2
0280 L84:
0280 00D0 rcall pop_gset2
0282 .dbline 0 ; func end
0282 0895 ret
0284 .dbsym r i 20 i
0284 .dbsym r n 22 i
0284 .dbend
0284 .dbfunc e delay_1ms _delay_1ms fV
0284 ; i -> R16,R17
.even
0284 _delay_1ms::
0284 .dbline -1
0284 .dbline 384
0284 ; delay_1ms();
0284 ; }
0284 ;
0284 ; /*1ms delay*/
0284 ; void delay_1ms(void)
0284 ; {unsigned int i;
0284 .dbline 385
0284 0027 clr R16
0286 1127 clr R17
0288 02C0 rjmp L93
028A L90:
028A .dbline 385
028A L91:
028A .dbline 385
028A 0F5F subi R16,255 ; offset = 1
028C 1F4F sbci R17,255
028E L93:
028E .dbline 385
028E ; for(i=0;i<1035;i++);
028E 0B30 cpi R16,11
0290 E4E0 ldi R30,4
0292 1E07 cpc R17,R30
0294 D0F3 brlo L90
0296 .dbline -2
0296 L89:
0296 .dbline 0 ; func end
0296 0895 ret
0298 .dbsym r i 16 i
0298 .dbend
0298 .dbfunc e delay _delay fV
0298 ; i -> R20,R21
0298 ; n -> R16,R17
.even
0298 _delay::
0298 00D0 rcall push_gset1
029A .dbline -1
029A .dbline 389
029A ; }
029A ;
029A ; void delay(unsigned int n)
029A ; { unsigned int i;
029A .dbline 390
029A ; for(i=0;i<n;i++)
029A 4427 clr R20
029C 5527 clr R21
029E 03C0 rjmp L98
02A0 L95:
02A0 .dbline 391
02A0 0000 nop
02A2 L96:
02A2 .dbline 390
02A2 4F5F subi R20,255 ; offset = 1
02A4 5F4F sbci R21,255
02A6 L98:
02A6 .dbline 390
02A6 4017 cp R20,R16
02A8 5107 cpc R21,R17
02AA D0F3 brlo L95
02AC .dbline -2
02AC L94:
02AC 00D0 rcall pop_gset1
02AE .dbline 0 ; func end
02AE 0895 ret
02B0 .dbsym r i 20 i
02B0 .dbsym r n 16 i
02B0 .dbend
02B0 .dbfunc e HC595_SENDDAT _HC595_SENDDAT fV
02B0 ; i -> R20
02B0 ; dat -> R16
.even
02B0 _HC595_SENDDAT::
02B0 00D0 rcall push_gset1
02B2 .dbline -1
02B2 .dbline 396
02B2 ; asm("nop");
02B2 ; }
02B2 ;
02B2 ; /*595数据传输*/
02B2 ; void HC595_SENDDAT(unsigned char dat)
02B2 ; {unsigned char i;
02B2 .dbline 397
02B2 ; C_CS; //cs 拉低
02B2 A998 cbi 0x15,1
02B4 .dbline 398
02B4 ; asm("nop");
02B4 0000 nop
02B6 .dbline 399
02B6 ; for(i=0;i<8;i++)
02B6 4427 clr R20
02B8 0BC0 rjmp L103
02BA L100:
02BA .dbline 400
02BA ; {C_CLK ; //时钟拉低
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?