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

📄 main.lst

📁 avr单片机操作温度传感器18B20的软件含仿真。
💻 LST
📖 第 1 页 / 共 5 页
字号:
 253 0056 9927      		clr r25
 254               	/* epilogue: frame size=0 */
 255 0058 0895      		ret
 256               	/* epilogue end (size=1) */
 257               	/* function ds18b20_reset size 32 (31) */
 271               	.Lscope3:
 274               	.global	ds18b20_write
 276               	ds18b20_write:
 147:ds18b20.h     **** 
 148:ds18b20.h     **** /*-------------------------------------------------------- 
 149:ds18b20.h     **** *  写命令或数据到温度芯片DS18B20(发送一个字节) 
 150:ds18b20.h     **** */ 
 151:ds18b20.h     **** void ds18b20_write(unsigned char dat) 
 152:ds18b20.h     **** { 
 278               	.LM26:
 279               	/* prologue: frame size=0 */
 280               	/* prologue end (size=0) */
 281 005a 282F      		mov r18,r24
 282 005c 37E0      		ldi r19,lo8(7)
 283               	.L50:
 153:ds18b20.h     ****     unsigned char count; 
 154:ds18b20.h     **** 
 155:ds18b20.h     ****     // 每个字节共8位,一次发一位 
 156:ds18b20.h     ****     for(count=0; count<8; count++) { 
 157:ds18b20.h     ****         cli();                   // 保证绝对不会发生中断! 
 285               	.LM27:
 286               	/* #APP */
 287 005e F894      		cli
 158:ds18b20.h     ****         DQ_TO_0();               // 设置1-wire总线为低电平 
 289               	.LM28:
 290               	/* #NOAPP */
 291 0060 8B9A      		sbi 49-0x20,3
 292               	.LBB8:
 294               	.Ltext9:
 296               	.LM29:
 297 0062 8BE0      		ldi r24,lo8(11)
 298 0064 90E0      		ldi r25,hi8(11)
 299               	.LBB9:
 301               	.LM30:
 302               	/* #APP */
 303 0066 0197      		1: sbiw r24,1
 304 0068 F1F7      		brne 1b
 305               	/* #NOAPP */
 306               	.LBE9:
 307               	.LBE8:
 309               	.Ltext10:
 159:ds18b20.h     ****         wait_us(4);              // about 2us 
 160:ds18b20.h     ****          
 161:ds18b20.h     ****         if(dat&0x01) DQ_TO_1();  // 并串转换,先低位后高位 
 311               	.LM31:
 312 006a 20FF      		sbrs r18,0
 313 006c 02C0      		rjmp .L46
 314 006e 8B98      		cbi 49-0x20,3
 315 0070 01C0      		rjmp .L47
 316               	.L46:
 162:ds18b20.h     ****         else DQ_TO_0(); 
 318               	.LM32:
 319 0072 8B9A      		sbi 49-0x20,3
 320               	.L47:
 163:ds18b20.h     ****         dat >>= 1;               // 下一位做好准备 
 322               	.LM33:
 323 0074 2695      		lsr r18
 324               	.LBB10:
 326               	.Ltext11:
 328               	.LM34:
 329 0076 82EE      		ldi r24,lo8(226)
 330 0078 90E0      		ldi r25,hi8(226)
 331               	.LBB11:
 333               	.LM35:
 334               	/* #APP */
 335 007a 0197      		1: sbiw r24,1
 336 007c F1F7      		brne 1b
 337               	/* #NOAPP */
 338               	.LBE11:
 339               	.LBE10:
 341               	.Ltext12:
 164:ds18b20.h     ****          
 165:ds18b20.h     ****         // 60us~120us(实际不能到120us, 因为其它语句也用时间了!) 
 166:ds18b20.h     ****         wait_us(82);             // 62us 
 167:ds18b20.h     ****          
 168:ds18b20.h     ****         DQ_TO_1(); 
 343               	.LM36:
 344 007e 8B98      		cbi 49-0x20,3
 169:ds18b20.h     ****         sei();                   // 恢复系统中断 
 346               	.LM37:
 347               	/* #APP */
 348 0080 7894      		sei
 349               	/* #NOAPP */
 350               	.LBB12:
 352               	.Ltext13:
 354               	.LM38:
 355 0082 8BE0      		ldi r24,lo8(11)
 356 0084 90E0      		ldi r25,hi8(11)
 357               	.LBB13:
 359               	.LM39:
 360               	/* #APP */
 361 0086 0197      		1: sbiw r24,1
 362 0088 F1F7      		brne 1b
 363               	/* #NOAPP */
 364               	.LBE13:
 365               	.LBE12:
 367               	.Ltext14:
 369               	.LM40:
 370 008a 3150      		subi r19,lo8(-(-1))
 371 008c 37FF      		sbrs r19,7
 372 008e E7CF      		rjmp .L50
 373               	/* epilogue: frame size=0 */
 374 0090 0895      		ret
 375               	/* epilogue end (size=1) */
 376               	/* function ds18b20_write size 36 (35) */
 390               	.Lscope4:
 392               	.global	ds18b20_read
 394               	ds18b20_read:
 170:ds18b20.h     ****         wait_us(4);              // 2us 
 171:ds18b20.h     **** 		} 
 172:ds18b20.h     **** } 
 173:ds18b20.h     **** 
 174:ds18b20.h     **** /*--------------------------------------------------------- 
 175:ds18b20.h     **** *  从温度芯片DS18B20读配置或数据(接收一个字节) 
 176:ds18b20.h     **** */ 
 177:ds18b20.h     **** unsigned char ds18b20_read(void) 
 178:ds18b20.h     **** { 
 396               	.LM41:
 397               	/* prologue: frame size=0 */
 398               	/* prologue end (size=0) */
 179:ds18b20.h     ****     unsigned char count,dat; 
 180:ds18b20.h     **** 
 181:ds18b20.h     ****     dat = 0x00;       // 数据接收准备 
 400               	.LM42:
 401 0092 20E0      		ldi r18,lo8(0)
 402 0094 37E0      		ldi r19,lo8(7)
 403               	.L61:
 182:ds18b20.h     ****      
 183:ds18b20.h     ****     // 每个字节共8位,一次收一位 
 184:ds18b20.h     ****     for(count=0; count<8; count++) { 
 185:ds18b20.h     ****         cli();        // 保证绝对不会发生中断! 
 405               	.LM43:
 406               	/* #APP */
 407 0096 F894      		cli
 186:ds18b20.h     ****          
 187:ds18b20.h     ****         // 从总线拉低到读总线状态,不能大于15us! 
 188:ds18b20.h     ****         DQ_TO_0();    // 设置1-wire总线为低电平(拉低总线以同步) 
 409               	.LM44:
 410               	/* #NOAPP */
 411 0098 8B9A      		sbi 49-0x20,3
 412               	.LBB14:
 414               	.Ltext15:
 416               	.LM45:
 417 009a 8BE0      		ldi r24,lo8(11)
 418 009c 90E0      		ldi r25,hi8(11)
 419               	.LBB15:
 421               	.LM46:
 422               	/* #APP */
 423 009e 0197      		1: sbiw r24,1
 424 00a0 F1F7      		brne 1b
 425               	/* #NOAPP */
 426               	.LBE15:
 427               	.LBE14:
 429               	.Ltext16:
 189:ds18b20.h     ****         wait_us(4);   // 2us 
 190:ds18b20.h     ****         DQ_TO_1();    // 设置1-wire总线为高电平(释放总线) 
 431               	.LM47:
 432 00a2 8B98      		cbi 49-0x20,3
 433               	.LBB16:
 435               	.Ltext17:
 437               	.LM48:
 438 00a4 83E1      		ldi r24,lo8(19)
 439 00a6 90E0      		ldi r25,hi8(19)
 440               	.LBB17:
 442               	.LM49:
 443               	/* #APP */
 444 00a8 0197      		1: sbiw r24,1
 445 00aa F1F7      		brne 1b
 446               	/* #NOAPP */
 447               	.LBE17:
 448               	.LBE16:
 450               	.Ltext18:
 191:ds18b20.h     ****         wait_us(7);   // 4us         
 192:ds18b20.h     ****         dat >>= 1; 
 452               	.LM50:
 453 00ac 2695      		lsr r18
 193:ds18b20.h     ****         if(DQ_status()) dat|=0x80;   // 读取总线电平,先收低位再收高位 
 455               	.LM51:
 456 00ae 8399      		sbic 48-0x20,3
 457 00b0 2068      		ori r18,lo8(-128)
 458               	.L59:
 194:ds18b20.h     ****          
 195:ds18b20.h     ****         sei();        // 恢复系统中断 
 460               	.LM52:
 461               	/* #APP */
 462 00b2 7894      		sei
 463               	/* #NOAPP */
 464               	.LBB18:
 466               	.Ltext19:
 468               	.LM53:
 469 00b4 82EE      		ldi r24,lo8(226)
 470 00b6 90E0      		ldi r25,hi8(226)
 471               	.LBB19:
 473               	.LM54:
 474               	/* #APP */
 475 00b8 0197      		1: sbiw r24,1
 476 00ba F1F7      		brne 1b
 477               	/* #NOAPP */
 478               	.LBE19:
 479               	.LBE18:
 481               	.Ltext20:
 483               	.LM55:
 484 00bc 3150      		subi r19,lo8(-(-1))
 485 00be 37FF      		sbrs r19,7
 486 00c0 EACF      		rjmp .L61
 196:ds18b20.h     ****         wait_us(82);  // 必须大于60us 
 197:ds18b20.h     ****     } 
 198:ds18b20.h     ****     return(dat); 
 199:ds18b20.h     **** } 
 488               	.LM56:
 489 00c2 822F      		mov r24,r18
 490 00c4 9927      		clr r25
 491               	/* epilogue: frame size=0 */
 492 00c6 0895      		ret
 493               	/* epilogue end (size=1) */
 494               	/* function ds18b20_read size 36 (35) */
 509               	.Lscope5:
 511               	.global	convert_T
 513               	convert_T:
 200:ds18b20.h     **** 
 201:ds18b20.h     **** /*------------------------------------------------------- 
 202:ds18b20.h     **** *     我的电路中只有一个器件DS18B20,所以不需要多个器件的ID 
 203:ds18b20.h     **** *  识别,跳过之后,启动温度转换,但在启动后,用户应等待几百个 
 204:ds18b20.h     **** *  毫秒,才能读到这次的转换值,这是DS18B20的数据手册规定的。 
 205:ds18b20.h     **** *  因为温度转换是需要时间的嘛!(^_^) 
 206:ds18b20.h     **** */ 
 207:ds18b20.h     **** void convert_T(void) 
 208:ds18b20.h     **** { 
 515               	.LM57:
 516               	/* prologue: frame size=0 */
 517               	/* prologue end (size=0) */
 209:ds18b20.h     ****     if(ds18b20_reset()==SUCC) {  // 如果复位成功 
 519               	.LM58:
 520 00c8 0E94 0000 		call ds18b20_reset
 521 00cc 8130      		cpi r24,lo8(1)
 522 00ce 31F4      		brne .L64
 210:ds18b20.h     ****         ds18b20_write(0xcc);     // 跳过多器件识别 
 524               	.LM59:

⌨️ 快捷键说明

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