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

📄 main.s

📁 ds18b20多个时候的分辨函数
💻 S
📖 第 1 页 / 共 2 页
字号:
;  do{
	.dbline 319
;  flag_count=0;
	clr R20
	.dbline 320
;  end_flag=0;
	clr R10
	.dbline 321
;  i=resetDS18B20();
	xcall _resetDS18B20
	mov R22,R16
	.dbline 322
;  writeuint8DS18B20(0xf0);   
	ldi R16,240
	xcall _writeuint8DS18B20
	.dbline 323
;  RLS_DS18B20;     //释放总线
	cbi 0x1a,0
	.dbline 324
;  for(chr=0;chr<8;chr++){
	clr R12
	xjmp L53
L50:
	.dbline 324
	.dbline 325
;  num=0;
	clr R0
	std y+20,R0
	.dbline 326
;  for(i=0;i<8;i++){
	clr R22
	xjmp L57
L54:
	.dbline 326
	.dbline 327
;     num=num>>1;
	ldd R0,y+20
	lsr R0
	std y+20,R0
	.dbline 328
;     retVal=0;
	clr R0
	std y+19,R0
	.dbline 329
; 	temp=0;
	std y+18,R0
	.dbline 331
;     
;     temp=read_a_bit();
	xcall _read_a_bit
	std y+18,R16
	.dbline 332
; 	if(temp)
	mov R0,R16
	tst R16
	breq L58
X12:
	.dbline 333
; 	retVal|=0x01;
	ldd R24,y+19
	ori R24,1
	std y+19,R24
L58:
	.dbline 334
; 	retVal<<=1;
	ldd R0,y+19
	lsl R0
	std y+19,R0
	.dbline 335
; 	temp=0;
	clr R0
	std y+18,R0
	.dbline 337
; 
; 	temp=read_a_bit();
	xcall _read_a_bit
	mov R14,R16
	std y+18,R14
	.dbline 338
; 	if(temp)
	mov R0,R14
	tst R16
	breq L60
X13:
	.dbline 339
; 	retVal|=0x01;
	ldd R24,y+19
	ori R24,1
	std y+19,R24
L60:
	.dbline 341
;     
; 	if(retVal==bit_1){        //1
	ldd R24,y+19
	cpi R24,2
	brne L62
X14:
	.dbline 341
	.dbline 342
; 	write_a_bit(1);
	ldi R16,1
	xcall _write_a_bit
	.dbline 343
; 	num|=0x80;
	ldd R24,y+20
	ori R24,128
	std y+20,R24
	.dbline 344
; 	}
	xjmp L63
L62:
	.dbline 345
; 	else if(retVal==bit_0){    //0
	ldd R24,y+19
	cpi R24,1
	brne L64
X15:
	.dbline 345
	.dbline 347
; 	    
; 	    write_a_bit(0);
	clr R16
	xcall _write_a_bit
	.dbline 348
; 	}else {              //maybe o or 1
	xjmp L65
L64:
	.dbline 348
	.dbline 349
; 	    if(flag[flag_count]==0){
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	brne L66
X16:
	.dbline 349
	.dbline 350
; 		write_a_bit(0);
	clr R16
	xcall _write_a_bit
	.dbline 352
; 		
; 		}
	xjmp L67
L66:
	.dbline 353
; 		else{
	.dbline 354
; 		write_a_bit(0x01);
	ldi R16,1
	xcall _write_a_bit
	.dbline 355
; 		num|=0x80;
	ldd R24,y+20
	ori R24,128
	std y+20,R24
	.dbline 357
; 		
; 		}
L67:
	.dbline 358
; 		flag_count++;
	inc R20
	.dbline 360
; 		
; 	}
L65:
L63:
	.dbline 363
; 	
; 	
;  }
L55:
	.dbline 326
	inc R22
L57:
	.dbline 326
	cpi R22,8
	brsh X29
	xjmp L54
X29:
X17:
	.dbline 364
;   num2[chr]=num; 
	movw R24,R28
	adiw R24,10
	mov R30,R12
	clr R31
	add R30,R24
	adc R31,R25
	ldd R0,y+20
	std z+0,R0
	.dbline 367
;  
;   
;  }
L51:
	.dbline 324
	inc R12
L53:
	.dbline 324
	mov R24,R12
	cpi R24,8
	brsh X30
	xjmp L50
X30:
X18:
	.dbline 368
;    for(i=0;i<8;i++){
	clr R22
	xjmp L71
L68:
	.dbline 368
	.dbline 369
;    USART_Transmit(num2[i]);
	movw R24,R28
	adiw R24,10
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _USART_Transmit
	.dbline 370
;    rom_seq[B20_num][i]=num2[i];
	ldi R24,<_rom_seq
	ldi R25,>_rom_seq
	lds R2,_B20_num
	clr R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	add R2,R24
	adc R3,R25
	mov R30,R22
	clr R31
	add R30,R2
	adc R31,R3
	movw R24,R28
	adiw R24,10
	mov R26,R22
	clr R27
	add R26,R24
	adc R27,R25
	ld R2,x
	std z+0,R2
	.dbline 371
;    } 
L69:
	.dbline 368
	inc R22
L71:
	.dbline 368
	cpi R22,8
	brlo L68
X19:
	.dbline 372
;    B20_num++; 
	lds R24,_B20_num
	subi R24,255    ; addi 1
	sts _B20_num,R24
	.dbline 373
;    for(i=0;i<flag_count;i++){
	clr R22
	xjmp L75
L72:
	.dbline 373
	.dbline 374
;    if(flag[i]==1)end_flag++;
	movw R24,R28
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	cpi R24,1
	brne L76
X20:
	.dbline 374
	inc R10
L76:
	.dbline 376
;    
;    }
L73:
	.dbline 373
	inc R22
L75:
	.dbline 373
	cp R22,R20
	brlo L72
X21:
	.dbline 378
;   
;    if(end_flag==flag_count)
	cp R10,R20
	brne L78
X22:
	.dbline 379
;    {
	.dbline 380
;      flag_count=0xff;
	ldi R20,255
	.dbline 381
;      USART_Transmit(0xff);
	ldi R16,255
	xcall _USART_Transmit
	.dbline 382
; 	 return 0;
	clr R16
	xjmp L46
L78:
	.dbline 387
; 	 }
;    
;    
;    
;    if(flag_count>0&&flag_count!=0xff){    //has bentch
	ldi R24,0
	cp R24,R20
	brlo X31
	xjmp L80
X31:
X23:
	cpi R20,255
	brne X32
	xjmp L80
X32:
X24:
	.dbline 387
	.dbline 388
;       flag_count--;  //flag_count point to the next one
	dec R20
	.dbline 389
;       if(flag[flag_count]==0){
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	brne L85
X25:
	.dbline 389
	.dbline 390
;           flag[flag_count]=1;
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldi R24,1
	std z+0,R24
	.dbline 391
; 	  }
	xjmp L83
L84:
	.dbline 393
; 	  else{
; 	       while((flag[flag_count]==1)&&(flag_count>0)){
	.dbline 394
; 	             flag[flag_count--]=0;
	mov R22,R20
	clr R23
	subi R20,1
	movw R24,R28
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 395
; 	       }
L85:
	.dbline 393
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R24,z+0
	cpi R24,1
	brne L87
X26:
	ldi R24,0
	cp R24,R20
	brlo L84
X27:
L87:
	.dbline 396
; 	       flag[flag_count]=1; 
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldi R24,1
	std z+0,R24
	.dbline 399
; 
; 	
; 	  }
L83:
	.dbline 401
; 	
;    }
L80:
	.dbline 403
; 
;   }while(flag_count!=0xff);
L48:
	.dbline 403
	cpi R20,255
	breq X33
	xjmp L47
X33:
X28:
	.dbline -2
L46:
	.dbline 0 ; func end
	adiw R28,21
	xjmp pop_xgsetF0FC
	.dbsym r end_flag 10 c
	.dbsym l num2 10 A[8:8]c
	.dbsym r chr 12 c
	.dbsym l flag 0 A[10:10]c
	.dbsym r flag_count 20 c
	.dbsym l num 20 c
	.dbsym r i 22 c
	.dbsym l retVal 19 c
	.dbsym l temp 18 c
	.dbend
	.dbfunc e match_rom _match_rom fV
;              k -> R20
;            num -> R10
	.even
_match_rom::
	st -y,R10
	st -y,R20
	mov R10,R16
	.dbline -1
	.dbline 407
; 
; }
; 
; void match_rom(unsigned char num){
	.dbline 409
;   unsigned char k;
;   k=resetDS18B20();
	xcall _resetDS18B20
	.dbline 410
;   writeuint8DS18B20(0x55);  //match common
	ldi R16,85
	xcall _writeuint8DS18B20
	.dbline 411
;   for(k=0;k<8;k++)
	clr R20
	xjmp L92
L89:
	.dbline 412
;     writeuint8DS18B20(rom_seq[num][k]); 
	ldi R24,<_rom_seq
	ldi R25,>_rom_seq
	mov R2,R10
	clr R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	add R2,R24
	adc R3,R25
	mov R30,R20
	clr R31
	add R30,R2
	adc R31,R3
	ldd R16,z+0
	xcall _writeuint8DS18B20
L90:
	.dbline 411
	inc R20
L92:
	.dbline 411
	cpi R20,8
	brlo L89
X34:
	.dbline -2
L88:
	.dbline 0 ; func end
	ld R20,y+
	ld R10,y+
	ret
	.dbsym r k 20 c
	.dbsym r num 10 c
	.dbend
	.dbfunc e readTemp_DS18B20 _readTemp_DS18B20 fi
;              x -> R10,R11
;          tempH -> R12
;          tempL -> R10
;            num -> R10
	.even
_readTemp_DS18B20::
	xcall push_xgset003C
	mov R10,R16
	.dbline -1
	.dbline 416
;   
; }
; 
; unsigned int readTemp_DS18B20(unsigned char num){
	.dbline 419
;    unsigned char tempL,tempH;
;    unsigned int x;
;    match_rom(num);
	mov R16,R10
	xcall _match_rom
	.dbline 420
;    writeuint8DS18B20(0x44);     //启动温度转换
	ldi R16,68
	xcall _writeuint8DS18B20
	.dbline 421
;    delayUs(1);
	ldi R16,1
	xcall _delayUs
	.dbline 422
;    resetDS18B20();
	xcall _resetDS18B20
	.dbline 423
;    match_rom(num);
	mov R16,R10
	xcall _match_rom
	.dbline 424
;    writeuint8DS18B20(0xbe);     //读数据
	ldi R16,190
	xcall _writeuint8DS18B20
	.dbline 425
;    tempL=readuint8DS18B20();
	xcall _readuint8DS18B20
	mov R10,R16
	.dbline 426
;    tempH=readuint8DS18B20();
	xcall _readuint8DS18B20
	mov R12,R16
	.dbline 427
;    x=(tempH<<8)|tempL;
	mov R11,R12
	.dbline 428
;    return(x);
	movw R16,R10
	.dbline -2
L93:
	.dbline 0 ; func end
	xjmp pop_xgset003C
	.dbsym r x 10 i
	.dbsym r tempH 12 c
	.dbsym r tempL 10 c
	.dbsym r num 10 c
	.dbend
	.dbfunc e output _output fV
;              t -> R20
;         number -> R20
;           temp -> R22,R23
	.even
_output::
	xcall push_xgsetF000
	mov R20,R18
	movw R22,R16
	.dbline -1
	.dbline 431
; }
; 
; void output(uint16 temp,unsigned char number){
	.dbline 433
;      unsigned char t;
;      USART_Transmit('N');
	ldi R16,78
	xcall _USART_Transmit
	.dbline 434
;      USART_Transmit('O');
	ldi R16,79
	xcall _USART_Transmit
	.dbline 435
; 	 USART_Transmit(':');
	ldi R16,58
	xcall _USART_Transmit
	.dbline 436
; 	 USART_Transmit(number+0x30);
	mov R16,R20
	subi R16,208    ; addi 48
	xcall _USART_Transmit
	.dbline 437
;      USART_Transmit('-');
	ldi R16,45
	xcall _USART_Transmit
	.dbline 438
; 	 t=(temp&0xf0)>>4;
	movw R20,R22
	andi R20,240
	andi R21,0
	lsr R21
	ror R20
	lsr R21
	ror R20
	lsr R21
	ror R20
	lsr R21
	ror R20
	.dbline 439
; 	 if(t>9)t='A'+t-10;
	ldi R24,9
	cp R24,R20
	brsh L95
X35:
	.dbline 439
	mov R24,R20
	subi R24,191    ; addi 65
	subi R24,10
	mov R20,R24
	xjmp L96
L95:
	.dbline 440
; 	 else t='0'+t;
	subi R20,208    ; addi 48
L96:
	.dbline 441
; 	 USART_Transmit(t);
	mov R16,R20
	xcall _USART_Transmit
	.dbline 442
; 	 t=(temp&0x0f);
	mov R20,R22
	andi R20,15
	andi R21,0
	.dbline 443
; 	 if(t>9)t='A'+t-10;
	ldi R24,9
	cp R24,R20
	brsh L97
X36:
	.dbline 443
	mov R24,R20
	subi R24,191    ; addi 65
	subi R24,10
	mov R20,R24
	xjmp L98
L97:
	.dbline 444
; 	 else t='0'+t;
	subi R20,208    ; addi 48
L98:
	.dbline 445
; 	 USART_Transmit(t);
	mov R16,R20
	xcall _USART_Transmit
	.dbline 446
; 	 USART_Transmit(0x0d);
	ldi R16,13
	xcall _USART_Transmit
	.dbline -2
L94:
	.dbline 0 ; func end
	xjmp pop_xgsetF000
	.dbsym r t 20 c
	.dbsym r number 20 c
	.dbsym r temp 22 i
	.dbend
	.dbfunc e get_temp _get_temp fV
;           temp -> R10
;              i -> R12,R13
;         number -> R20
	.even
_get_temp::
	xcall push_xgset303C
	.dbline -1
	.dbline 451
; 	 
; 
; 
; }
; void get_temp(void){
	.dbline 453
; uint16 i; //读温度值的暂存变量
;   unsigned char temp=0;
	clr R10
	.dbline 454
;   unsigned char number=0;
	clr R20
	.dbline 455
;   i=resetDS18B20();
	xcall _resetDS18B20
	mov R12,R16
	clr R13
	.dbline 456
;   for(number=0;number<maxsize;number++){
	xjmp L103
L100:
	.dbline 456
	.dbline 457
;      i=readTemp_DS18B20(number);
	mov R16,R20
	xcall _readTemp_DS18B20
	movw R12,R16
	.dbline 458
;     if(i&(1<<3)) //判断倒数第四位是1还是0 
	sbrs R16,3
	rjmp L104
X37:
	.dbline 459
;     {
	.dbline 460
;       temp=i>>4+1;
	ldi R18,5
	ldi R19,0
	xcall lsr16
	mov R10,R16
	.dbline 461
;     }
	xjmp L105
L104:
	.dbline 463
;     else
;     {
	.dbline 464
;       temp=i>>4;
	movw R10,R12
	lsr R11
	ror R10
	lsr R11
	ror R10
	lsr R11
	ror R10
	lsr R11
	ror R10
	.dbline 465
;     }
L105:
	.dbline 466
;      tep[number][0]=temp;
	ldi R24,10
	mul R24,R20
	movw R30,R0
	ldi R24,<_tep
	ldi R25,>_tep
	add R30,R24
	adc R31,R25
	std z+0,R10
	.dbline 467
;   }
L101:
	.dbline 456
	inc R20
L103:
	.dbline 456
	cpi R20,7
	brlo L100
X38:
	.dbline -2
L99:
	.dbline 0 ; func end
	xjmp pop_xgset303C
	.dbsym r temp 10 c
	.dbsym r i 12 i
	.dbsym r number 20 c
	.dbend
	.dbfunc e main _main fV
;         number -> R12
;           temp -> R10
	.even
_main::
	.dbline -1
	.dbline 475
; 
; 
; }
; 
; 
; 
; void main(void)
; {
	.dbline 477
; 
;   unsigned char temp=0;
	.dbline 478
;   unsigned char number=0;
	clr R12
	.dbline 479
;   port_init();
	xcall _port_init
	.dbline 481
;   
;   USART_Init(9600); //波特率9600 初始化串口
	ldi R16,9600
	ldi R17,37
	xcall _USART_Init
	.dbline 482
;   USART_Transmit('O');
	ldi R16,79
	xcall _USART_Transmit
	.dbline 483
;   USART_Transmit('K');
	ldi R16,75
	xcall _USART_Transmit
	.dbline 484
;   temp=read_rom();
	xcall _read_rom
	mov R10,R16
L107:
	.dbline 487
; 
;   while(1)
;   {
	.dbline 490
; 
;    
;   }//end while(1)
L108:
	.dbline 486
	xjmp L107
X39:
	.dbline -2
L106:
	.dbline 0 ; func end
	ret
	.dbsym r number 12 c
	.dbsym r temp 10 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\cood\18b20\main.c
_tep::
	.blkb 70
	.dbsym e tep _tep A[70:7:10]c
_B20_num::
	.blkb 1
	.dbsym e B20_num _B20_num c
_rom_seq::
	.blkb 56
	.dbsym e rom_seq _rom_seq A[56:7:8]c
; }
; 
; /*
; 假设你只要精确到1度 
; 
; 换算温度用很简单的方法就可以处理: 
; 
; 首先判断是正温度还是负温度 
; 然后判断倒数第四位是1还是0 
; 如果是1且温度为正,那么 温度=x>>4+1; 
; 如果是1且温度为负,那么 温度=x>>4-1; 
; 如果是0,温度=x>>4; 
; 
; 这样的操作可以节省很多的flah空间。 
; */

⌨️ 快捷键说明

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