⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.lst

📁 一款电力行业使用的温湿度控制器源代码 湿度传感器采用HF3223 温度采用DS18B20 单片机采用mega8 编程采用winavr2007
💻 LST
📖 第 1 页 / 共 3 页
字号:
  84:drive/ds18b20.c **** *  复位函数冗余处理
  85:drive/ds18b20.c **** */ 
  86:drive/ds18b20.c **** inline BOOL ds18b20_reset(void)
  87:drive/ds18b20.c **** {
 270               	.LM19:
 271               	/* prologue: frame size=0 */
 272 0036 CF93      		push r28
 273               	/* prologue end (size=1) */
  88:drive/ds18b20.c **** 	u08 Cnt = 0;
 275               	.LM20:
 276 0038 C0E0      		ldi r28,lo8(0)
  89:drive/ds18b20.c **** 	while(!(_ds18b20_reset() == SUCC))
 278               	.LM21:
 279 003a 06C0      		rjmp .L9
 280               	.L12:
  90:drive/ds18b20.c **** 	{
  91:drive/ds18b20.c **** 		Cnt++;
 282               	.LM22:
 283 003c CF5F      		subi r28,lo8(-(1))
  92:drive/ds18b20.c **** 		if(Cnt > 3)
 285               	.LM23:
 286 003e C430      		cpi r28,lo8(4)
 287 0040 18F0      		brlo .L9
  93:drive/ds18b20.c **** 		return FAIL ;
 289               	.LM24:
 290 0042 80E0      		ldi r24,lo8(0)
 291 0044 90E0      		ldi r25,hi8(0)
 292 0046 05C0      		rjmp .L8
 293               	.L9:
 294 0048 DEDF      		rcall _ds18b20_reset
 295 004a 8130      		cpi r24,lo8(1)
 296 004c B9F7      		brne .L12
  94:drive/ds18b20.c **** 	}
  95:drive/ds18b20.c **** 	return SUCC ;
 298               	.LM25:
 299 004e 81E0      		ldi r24,lo8(1)
 300 0050 90E0      		ldi r25,hi8(1)
 301               	.L8:
 302               	/* epilogue: frame size=0 */
 303 0052 CF91      		pop r28
 304 0054 0895      		ret
 305               	/* epilogue end (size=2) */
 306               	/* function ds18b20_reset size 16 (13) */
 311               	.Lscope2:
 314               	.global	ds18b20_write
 316               	ds18b20_write:
  96:drive/ds18b20.c **** }
  97:drive/ds18b20.c **** 
  98:drive/ds18b20.c **** /*-------------------------------------------------------- 
  99:drive/ds18b20.c **** *  写命令或数据到温度芯片DS18B20(发送一个字节) 
 100:drive/ds18b20.c **** */ 
 101:drive/ds18b20.c **** void ds18b20_write(u08 dat) 
 102:drive/ds18b20.c **** { 
 318               	.LM26:
 319               	/* prologue: frame size=0 */
 320               	/* prologue end (size=0) */
 321 0056 282F      		mov r18,r24
 322 0058 37E0      		ldi r19,lo8(7)
 323               	.L22:
 103:drive/ds18b20.c ****     u08 count; 
 104:drive/ds18b20.c **** 
 105:drive/ds18b20.c ****     // 每个字节共8位,一次发一位 
 106:drive/ds18b20.c ****     for(count=0; count<8; count++) { 
 107:drive/ds18b20.c ****         cli();                   // 保证绝对不会发生中断! 
 325               	.LM27:
 326               	/* #APP */
 327 005a F894      		cli
 108:drive/ds18b20.c ****         DQ_TO_0();               // 设置1-wire总线为低电平 
 329               	.LM28:
 330               	/* #NOAPP */
 331 005c 8B9A      		sbi 49-0x20,3
 332               	.LBB8:
 334               	.Ltext7:
 336               	.LM29:
 337 005e 84E0      		ldi r24,lo8(4)
 338 0060 90E0      		ldi r25,hi8(4)
 339               	.LBB9:
 341               	.LM30:
 342               	/* #APP */
 343 0062 0197      		1: sbiw r24,1
 344 0064 F1F7      		brne 1b
 345               	/* #NOAPP */
 346               	.LBE9:
 347               	.LBE8:
 349               	.Ltext8:
 109:drive/ds18b20.c ****         wait_us(2);              // about 2us 
 110:drive/ds18b20.c ****          
 111:drive/ds18b20.c ****         if(dat&0x01) DQ_TO_1();  // 并串转换,先低位后高位 
 351               	.LM31:
 352 0066 20FF      		sbrs r18,0
 353 0068 02C0      		rjmp .L18
 354 006a 8B98      		cbi 49-0x20,3
 355 006c 01C0      		rjmp .L19
 356               	.L18:
 112:drive/ds18b20.c ****         else DQ_TO_0(); 
 358               	.LM32:
 359 006e 8B9A      		sbi 49-0x20,3
 360               	.L19:
 113:drive/ds18b20.c ****         dat >>= 1;               // 下一位做好准备 
 362               	.LM33:
 363 0070 2695      		lsr r18
 364               	.LBB10:
 366               	.Ltext9:
 368               	.LM34:
 369 0072 8CE7      		ldi r24,lo8(124)
 370 0074 90E0      		ldi r25,hi8(124)
 371               	.LBB11:
 373               	.LM35:
 374               	/* #APP */
 375 0076 0197      		1: sbiw r24,1
 376 0078 F1F7      		brne 1b
 377               	/* #NOAPP */
 378               	.LBE11:
 379               	.LBE10:
 381               	.Ltext10:
 114:drive/ds18b20.c ****          
 115:drive/ds18b20.c ****         // 60us~120us(实际不能到120us, 因为其它语句也用时间了!) 
 116:drive/ds18b20.c ****         wait_us(62);             // 62us 
 117:drive/ds18b20.c ****          
 118:drive/ds18b20.c ****         DQ_TO_1(); 
 383               	.LM36:
 384 007a 8B98      		cbi 49-0x20,3
 119:drive/ds18b20.c ****         sei();                   // 恢复系统中断 
 386               	.LM37:
 387               	/* #APP */
 388 007c 7894      		sei
 389               	/* #NOAPP */
 390               	.LBB12:
 392               	.Ltext11:
 394               	.LM38:
 395 007e 84E0      		ldi r24,lo8(4)
 396 0080 90E0      		ldi r25,hi8(4)
 397               	.LBB13:
 399               	.LM39:
 400               	/* #APP */
 401 0082 0197      		1: sbiw r24,1
 402 0084 F1F7      		brne 1b
 403               	/* #NOAPP */
 404               	.LBE13:
 405               	.LBE12:
 407               	.Ltext12:
 409               	.LM40:
 410 0086 3150      		subi r19,lo8(-(-1))
 411 0088 37FF      		sbrs r19,7
 412 008a E7CF      		rjmp .L22
 413               	/* epilogue: frame size=0 */
 414 008c 0895      		ret
 415               	/* epilogue end (size=1) */
 416               	/* function ds18b20_write size 36 (35) */
 430               	.Lscope3:
 432               	.global	ds18b20_read
 434               	ds18b20_read:
 120:drive/ds18b20.c ****         wait_us(2);              // 2us 
 121:drive/ds18b20.c ****     } 
 122:drive/ds18b20.c **** } 
 123:drive/ds18b20.c **** 
 124:drive/ds18b20.c **** /*--------------------------------------------------------- 
 125:drive/ds18b20.c **** *  从温度芯片DS18B20读配置或数据(接收一个字节) 
 126:drive/ds18b20.c **** */ 
 127:drive/ds18b20.c **** u08 ds18b20_read(void) 
 128:drive/ds18b20.c **** { 
 436               	.LM41:
 437               	/* prologue: frame size=0 */
 438               	/* prologue end (size=0) */
 129:drive/ds18b20.c ****     u08 count,dat; 
 130:drive/ds18b20.c **** 
 131:drive/ds18b20.c ****     dat = 0x00;       // 数据接收准备 
 440               	.LM42:
 441 008e 20E0      		ldi r18,lo8(0)
 442 0090 37E0      		ldi r19,lo8(7)
 443               	.L33:
 132:drive/ds18b20.c ****      
 133:drive/ds18b20.c ****     // 每个字节共8位,一次收一位 
 134:drive/ds18b20.c ****     for(count=0; count<8; count++) { 
 135:drive/ds18b20.c ****         cli();        // 保证绝对不会发生中断! 
 445               	.LM43:
 446               	/* #APP */
 447 0092 F894      		cli
 136:drive/ds18b20.c ****          
 137:drive/ds18b20.c ****         // 从总线拉低到读总线状态,不能大于15us! 
 138:drive/ds18b20.c ****         DQ_TO_0();    // 设置1-wire总线为低电平(拉低总线以同步) 
 449               	.LM44:
 450               	/* #NOAPP */
 451 0094 8B9A      		sbi 49-0x20,3
 452               	.LBB14:
 454               	.Ltext13:
 456               	.LM45:
 457 0096 84E0      		ldi r24,lo8(4)
 458 0098 90E0      		ldi r25,hi8(4)
 459               	.LBB15:
 461               	.LM46:
 462               	/* #APP */
 463 009a 0197      		1: sbiw r24,1
 464 009c F1F7      		brne 1b
 465               	/* #NOAPP */
 466               	.LBE15:
 467               	.LBE14:
 469               	.Ltext14:
 139:drive/ds18b20.c ****         wait_us(2);   // 2us 
 140:drive/ds18b20.c ****         DQ_TO_1();    // 设置1-wire总线为高电平(释放总线) 
 471               	.LM47:
 472 009e 8B98      		cbi 49-0x20,3
 473               	.LBB16:
 475               	.Ltext15:
 477               	.LM48:
 478 00a0 88E0      		ldi r24,lo8(8)
 479 00a2 90E0      		ldi r25,hi8(8)
 480               	.LBB17:
 482               	.LM49:
 483               	/* #APP */
 484 00a4 0197      		1: sbiw r24,1
 485 00a6 F1F7      		brne 1b
 486               	/* #NOAPP */
 487               	.LBE17:
 488               	.LBE16:
 490               	.Ltext16:
 141:drive/ds18b20.c ****         wait_us(4);   // 4us         
 142:drive/ds18b20.c ****         dat >>= 1; 
 492               	.LM50:
 493 00a8 2695      		lsr r18
 143:drive/ds18b20.c ****         if(DQ_status()) dat|=0x80;   // 读取总线电平,先收低位再收高位 
 495               	.LM51:
 496 00aa 8399      		sbic 48-0x20,3
 497 00ac 2068      		ori r18,lo8(-128)
 498               	.L31:
 144:drive/ds18b20.c ****          
 145:drive/ds18b20.c ****         sei();        // 恢复系统中断 
 500               	.LM52:
 501               	/* #APP */
 502 00ae 7894      		sei
 503               	/* #NOAPP */
 504               	.LBB18:
 506               	.Ltext17:
 508               	.LM53:
 509 00b0 8CE7      		ldi r24,lo8(124)
 510 00b2 90E0      		ldi r25,hi8(124)
 511               	.LBB19:
 513               	.LM54:
 514               	/* #APP */
 515 00b4 0197      		1: sbiw r24,1
 516 00b6 F1F7      		brne 1b
 517               	/* #NOAPP */
 518               	.LBE19:
 519               	.LBE18:
 521               	.Ltext18:
 523               	.LM55:
 524 00b8 3150      		subi r19,lo8(-(-1))
 525 00ba 37FF      		sbrs r19,7
 526 00bc EACF      		rjmp .L33
 146:drive/ds18b20.c ****         wait_us(62);  // 必须大于60us 
 147:drive/ds18b20.c ****     } 
 148:drive/ds18b20.c ****     return(dat); 
 149:drive/ds18b20.c **** } 
 528               	.LM56:
 529 00be 822F      		mov r24,r18
 530 00c0 9927      		clr r25
 531               	/* epilogue: frame size=0 */
 532 00c2 0895      		ret
 533               	/* epilogue end (size=1) */
 534               	/* function ds18b20_read size 36 (35) */
 549               	.Lscope4:
 551               	.global	convert_T
 553               	convert_T:
 150:drive/ds18b20.c **** 
 151:drive/ds18b20.c **** /*------------------------------------------------------- 
 152:drive/ds18b20.c **** *     我的电路中只有一个器件DS18B20,所以不需要多个器件的ID 
 153:drive/ds18b20.c **** *  识别,跳过之后,启动温度转换,但在启动后,用户应等待几百个 
 154:drive/ds18b20.c **** *  毫秒,才能读到这次的转换值,这是DS18B20的数据手册规定的。 
 155:drive/ds18b20.c **** *  因为温度转换是需要时间的嘛!(^_^) 
 156:drive/ds18b20.c **** */
 157:drive/ds18b20.c **** 
 158:drive/ds18b20.c **** BOOL convert_is_succ = FALSE ;
 159:drive/ds18b20.c **** 
 160:drive/ds18b20.c **** BOOL convert_T(void) 
 161:drive/ds18b20.c **** { 
 555               	.LM57:
 556               	/* prologue: frame size=0 */
 557 00c4 0F93      		push r16
 558 00c6 1F93      		push r17
 559               	/* prologue end (size=2) */
 560               	.LBB20:
 561               	.LBB21:
 563               	.LM58:
 564 00c8 00E0      		ldi r16,lo8(0)
 566               	.LM59:
 567 00ca 03C0      		rjmp .L38
 568               	.L42:
 570               	.LM60:
 571 00cc 0F5F      		subi r16,lo8(-(1))
 573               	.LM61:
 574 00ce 0430      		cpi r16,lo8(4)
 575 00d0 68F4      		brsh .L44
 576               	.L38:
 577 00d2 99DF      		rcall _ds18b20_reset
 578 00d4 8130      		cpi r24,lo8(1)
 579 00d6 D1F7      		brne .L42
 581               	.LM62:
 582 00d8 01E0      		ldi r16,lo8(1)
 583 00da 10E0      		ldi r17,hi8(1)
 584               	.LBE21:
 585               	.LBE20:
 162:drive/ds18b20.c ****     if(ds18b20_reset()==SUCC) {  // 如果复位成功 
 163:drive/ds18b20.c ****         ds18b20_write(0xcc);     // 跳过多器件识别 
 587               	.LM63:
 588 00dc 8CEC      		ldi r24,lo8(-52)
 589 00de BBDF      		rcall ds18b20_write
 164:drive/ds18b20.c ****         ds18b20_write(0x44);     // 启动温度转换 
 591               	.LM64:
 592 00e0 84E4      		ldi r24,lo8(68)
 593 00e2 B9DF      		rcall ds18b20_write
 165:drive/ds18b20.c **** 		convert_is_succ = TRUE;
 595               	.LM65:
 596 00e4 0093 0000 		sts convert_is_succ,r16
 166:drive/ds18b20.c **** 		return TRUE ;
 598               	.LM66:
 599 00e8 C801      		movw r24,r16
 600 00ea 04C0      		rjmp .L36
 601               	.L44:
 167:drive/ds18b20.c ****     }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -