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

📄 can18b20.s

📁 基于CAN总线的 温度采集方法。选用DS18B20温度传感器。
💻 S
📖 第 1 页 / 共 3 页
字号:
	.dbline 424
; 		   HC595_SENDDAT(table[ge]|0x80); //加小数点
	ldi R24,<_table
	ldi R25,>_table
	lds R30,_ge
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	ori R16,128
	rcall _HC595_SENDDAT
	.dbline 425
; 		   PORTC|=0x10;
	sbi 0x15,4
	.dbline 426
; 		   }
	rjmp L110
L109:
	.dbline 428
	.dbline 428
	clr R2
	sts _flag,R2
	.dbline 430
	in R24,0x15
	andi R24,231
	out 0x15,R24
	.dbline 431
	ldi R24,<_table
	ldi R25,>_table
	lds R30,_shi
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	rcall _HC595_SENDDAT
	.dbline 432
	sbi 0x15,3
	.dbline 433
L110:
	.dbline -2
L106:
	rcall pop_lset
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e main _main fV
	.area func_lit(rom, con, rel)
L156:
	.word `L145
	.word `L145
	.word `L146
	.word `L146
	.word `L147
	.word `L148
	.word `L148
	.word `L149
	.word `L150
	.word `L150
	.word `L151
	.word `L151
	.word `L152
	.word `L153
	.word `L153
	.word `L154
	.word `L155
	.area text(rom, con, rel)
	.dbfile F:\can-18b20(无浮点再调试)\can18b20.c
;              m -> R12,R13
;              a -> R10
;           temh -> R20
;           teml -> R22
;              i -> R12
;      temporary -> y+0
;              j -> R14
	.even
_main::
	sbiw R28,9
	.dbline -1
	.dbline 440
; 	else
; 	{     flag=0;		     
; 		   //十位显示
; 		   PORTC&=(~0x18);
; 		   HC595_SENDDAT(table[shi]); 
; 		   PORTC|=0x08;
; 		   }
; 		   
; }
; 
; /*************************** 主机先发送,等待接收***************************/
; /* 说明:外部中断0不使能,如果允许,显示保持不住。*/
; void main( void )
; {	unsigned char	i,j;
	.dbline 442
; 	unsigned char teml,temh;
;     unsigned char a=0; 
	clr R10
	.dbline 446
;     unsigned int m;
; 	unsigned char	temporary[9];
; 	 //M8 端口初始化
; 	 PORTB=0x07;  //MCP2515 disable(CS,PB2),PB1,PB0上、下行灯灭
	ldi R24,7
	out 0x18,R24
	.dbline 447
;      DDRB|=0x07; 
	in R24,0x17
	ori R24,7
	out 0x17,R24
	.dbline 448
; 	 DDRD=0xC0;  //1100 0000 PD7、PD6输出保持,PD5、PD4按键输入	
	ldi R24,192
	out 0x11,R24
	.dbline 449
; 	 PORTC=0x02;  //CS disable
	ldi R24,2
	out 0x15,R24
	.dbline 450
; 	 DDRC|=0x1F;    //PC3为595的位选COM2(十位),PC4为595的位选COM1(个位)+595(PC0、PC1、PC2)
	in R24,0x14
	ori R24,31
	out 0x14,R24
	.dbline 456
; 	 /*use int0*/
; 	// GICR|=0x40;   //int0 enable
; 	//MCUCR|=0x02;  //下降沿触发中断0
; 	//uart_init();  //串口初始化
; 	//初始化SPI
; 	 init_SPI();
	rcall _init_SPI
	.dbline 458
; 	//reset mcp2515
;    	 reset_MCP();  
	rcall _reset_MCP
	.dbline 460
; 	//初始化 CAN
;      init_can();
	rcall _init_can
	.dbline 461
; 	 minus_flag=0; //初始化负温度标志
	clr R2
	sts _minus_flag,R2
	.dbline 462
; 	 CLI(); //关中断
	cli
L112:
	.dbline 464
L113:
	.dbline 464
; 	//矫正第一次数据,不矫正第一次显示85
; 	    while(!ds1820_ack());
	rcall _ds1820_ack
	tst R16
	breq L112
	.dbline 465
; 	    write_byte(0xCC);						//	Skip ROM
	ldi R16,204
	rcall _write_byte
	.dbline 466
; 	    write_byte(0x44);						//	Start Conversion
	ldi R16,68
	rcall _write_byte
	.dbline 467
; 	    wait(750);
	ldi R16,750
	ldi R17,2
	rcall _wait
L115:
	.dbline 468
L116:
	.dbline 468
; 	    while(!ds1820_ack());
	rcall _ds1820_ack
	tst R16
	breq L115
	.dbline 469
; 		write_byte(0xCC);						//	Skip ROM
	ldi R16,204
	rcall _write_byte
	.dbline 470
; 	    write_byte(0xBE);						//	Read Scratch Pad
	ldi R16,190
	rcall _write_byte
	.dbline 471
; 	 	teml = read_byte();	
	rcall _read_byte
	mov R22,R16
	.dbline 472
; 		temh = read_byte();	
	rcall _read_byte
	mov R20,R16
	.dbline 473
; 		m=temh*256+teml;
	mov R18,R20
	clr R19
	ldi R16,256
	ldi R17,1
	rcall empy16s
	movw R12,R16
	mov R2,R22
	clr R3
	add R12,R2
	adc R13,R3
	.dbline 474
; 		  if ((m&0xf800)!=0)
	movw R24,R12
	andi R24,0
	andi R25,248
	cpi R24,0
	cpc R24,R25
	breq L118
X0:
	.dbline 475
;              {minus_flag=1;
	.dbline 475
	ldi R24,1
	sts _minus_flag,R24
	.dbline 476
; 			  m=(~m)+1; //取反
	movw R24,R12
	com R24
	com R25
	adiw R24,1
	movw R12,R24
	.dbline 477
;               a=(unsigned char)((m*5)/80);}
	ldi R16,5
	ldi R17,0
	movw R18,R24
	rcall empy16s
	ldi R18,80
	ldi R19,0
	rcall div16u
	mov R10,R16
	.dbline 477
	rjmp L119
L118:
	.dbline 479
;           else
;               a=(unsigned char)((m*5)/80);
	ldi R16,5
	ldi R17,0
	movw R18,R12
	rcall empy16s
	ldi R18,80
	ldi R19,0
	rcall div16u
	mov R10,R16
L119:
	.dbline 480
; 		shi=a/10;
	ldi R17,10
	mov R16,R10
	rcall div8u
	sts _shi,R16
	.dbline 481
;         ge=a%10;
	ldi R17,10
	mov R16,R10
	rcall mod8u
	sts _ge,R16
	.dbline 482
; 		if(minus_flag==1)
	lds R24,_minus_flag
	cpi R24,1
	brne L120
	.dbline 483
; 		wendu=a|0x80; //暂时做 char处理
	mov R24,R10
	ori R24,128
	sts _wendu,R24
	rjmp L121
L120:
	.dbline 485
; 		else
; 		wendu=a;
	sts _wendu,R10
L121:
	.dbline 486
; 	TCNT0=0xF8;//1ms
	ldi R24,248
	out 0x32,R24
	.dbline 487
; 	TCCR0=5; //1024
	ldi R24,5
	out 0x33,R24
	.dbline 488
; 	TIMSK=(1<<TOIE0);
	ldi R24,1
	out 0x39,R24
	.dbline 489
; 	count=0;
	clr R2
	clr R3
	sts _count+1,R3
	sts _count,R2
	.dbline 490
; 	dot1=0;
	sts _dot1,R2
	.dbline 492
; 	//开中断
; 	SEI(); 
	sei
	rjmp L123
L122:
	.dbline 494
; 	while(1)
; 	{ if(count==0)
	.dbline 494
	lds R2,_count
	lds R3,_count+1
	tst R2
	breq X4
	rjmp L125
X4:
	tst R3
	breq X5
	rjmp L125
X5:
X1:
	.dbline 495
; 	   { fill_msg_box_0(); //填充CAN数据
	.dbline 495
	rcall _fill_msg_box_0
	.dbline 496
; 	     send_box_0(); //发送CAN信息
	rcall _send_box_0
	.dbline 497
; 		 minus_flag=0;  //负温度标志清0
	clr R2
	sts _minus_flag,R2
	.dbline 499
; 		 // 读取温度值
; 		CLI();
	cli
L127:
	.dbline 500
L128:
	.dbline 500
; 	    while(!ds1820_ack());
	rcall _ds1820_ack
	tst R16
	breq L127
	.dbline 501
; 		SEI();
	sei
	.dbline 502
; 	    write_byte(0xCC);						//	Skip ROM
	ldi R16,204
	rcall _write_byte
	.dbline 503
; 	    write_byte(0x44);						//	Start Conversion
	ldi R16,68
	rcall _write_byte
	.dbline 504
; 		delay(20);
	ldi R16,20
	ldi R17,0
	rcall _delay
	.dbline 505
; 		CLI();
	cli
L130:
	.dbline 506
L131:
	.dbline 506
; 		while(!ds1820_ack());
	rcall _ds1820_ack
	tst R16
	breq L130
	.dbline 507
; 		SEI();
	sei
	.dbline 508
; 		write_byte(0xCC);						//	Skip ROM
	ldi R16,204
	rcall _write_byte
	.dbline 509
; 	    write_byte(0xBE);						//	Read Scratch Pad
	ldi R16,190
	rcall _write_byte
	.dbline 510
; 		for(j = 0; j < 9; j++)
	clr R14
	rjmp L136
L133:
	.dbline 511
	rcall _read_byte
	movw R24,R28
	mov R30,R14
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R16
L134:
	.dbline 510
	inc R14
L136:
	.dbline 510
	mov R24,R14
	cpi R24,9
	brlo L133
	.dbline 512
; 		temporary[j] = read_byte();
; 	     if(!crccheck(temporary,9))  //CRC校验正确
	ldi R18,9
	movw R16,R28
	rcall _crccheck
	tst R16
	breq X6
	rjmp L137
X6:
	.dbline 513
; 		   { 
	.dbline 514
; 		    teml=temporary[0];
	ldd R22,y+0
	.dbline 515
; 		    temh=temporary[1];
	ldd R20,y+1
	.dbline 517
; 		    // 处理小数第一位
; 			j=teml&0x0F;
	mov R24,R22
	andi R24,15
	mov R14,R24
	.dbline 519
; 			//温度十位个位处理
; 			 teml>>=4;
	mov R24,R22
	swap R24
	andi R24,#0x0F
	mov R22,R24
	.dbline 520
; 			 temh<<=4;
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 521
; 			 i=teml|temh;
	mov R12,R22
	or R12,R24
	.dbline 522
; 			 if(i>=0x80) //是负温度
	mov R24,R12
	cpi R24,128
	brlo L140
	.dbline 523
; 			  {minus_flag=1;
	.dbline 523
	ldi R24,1
	sts _minus_flag,R24
	.dbline 524
; 			   i=~i; //取反
	com R12
	.dbline 525
; 			   j=(~j)&0x0F;
	mov R24,R14
	com R24
	andi R24,15
	mov R14,R24
	.dbline 526
; 			   j=j+1;} //加1
	inc R14
	.dbline 526
L140:
	.dbline 527
; 			 switch(j) //小数第一位
	mov R10,R14
	clr R11
	movw R24,R10
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge X7
	rjmp L143
X7:
	ldi R24,16
	cp R24,R10
	cpc R25,R11
	brge X8
	rjmp L143
X8:
	ldi R16,2
	ldi R17,0
	movw R18,R10
	rcall empy16s
	movw R30,R16
	ldi R24,<L156
	ldi R25,>L156
	add R30,R24
	adc R31,R25
	lpm R0,Z+
	lpm R1,Z
	movw R30,R0
	ijmp
X2:
	.dbline 528
; 			  {case 0:
L145:
	.dbline 529
; 			   case 1:{dot1=0;break;}
	.dbline 529
	clr R2
	sts _dot1,R2
	.dbline 529
	rjmp L143
L146:
	.dbline 531
; 			   case 2:
; 			   case 3:{dot1=1;break;}
	.dbline 531
	ldi R24,1
	sts _dot1,R24
	.dbline 531
	rjmp L143
L147:
	.dbline 532
; 			   case 4:{dot1=2;break;}
	.dbline 532
	ldi R24,2
	sts _dot1,R24
	.dbline 532
	rjmp L143
L148:
	.dbline 534
; 			   case 5:
; 			   case 6:{dot1=3;break;}
	.dbline 534
	ldi R24,3
	sts _dot1,R24
	.dbline 534
	rjmp L143
L149:
	.dbline 535
; 			   case 7:{dot1=4;break;}
	.dbline 535
	ldi R24,4
	sts _dot1,R24
	.dbline 535
	rjmp L143
L150:
	.dbline 537
; 			   case 8:
; 			   case 9:{dot1=5;break;}
	.dbline 537
	ldi R24,5
	sts _dot1,R24
	.dbline 537
	rjmp L143
L151:
	.dbline 539
; 			   case 10:
; 			   case 11:{dot1=6;break;}
	.dbline 539
	ldi R24,6
	sts _dot1,R24
	.dbline 539
	rjmp L143
L152:
	.dbline 540
; 			   case 12:{dot1=7;break;}
	.dbline 540
	ldi R24,7
	sts _dot1,R24
	.dbline 540
	rjmp L143
L153:
	.dbline 542
; 			   case 13:
; 			   case 14:{dot1=8;break;}
	.dbline 542
	ldi R24,8
	sts _dot1,R24
	.dbline 542
	rjmp L143
L154:
	.dbline 543
; 			   case 15:{dot1=9;break;}
	.dbline 543
	ldi R24,9
	sts _dot1,R24
	.dbline 543
	rjmp L143
L155:
	.dbline 544
; 			   case 16:{dot1=0;i=i+1;break;}
	.dbline 544
	clr R2
	sts _dot1,R2
	.dbline 544
	inc R12
	.dbline 544
	.dbline 545
; 			   default:break;
L143:
	.dbline 547
; 			  }
; 			shi=i/10; //十位
	ldi R17,10
	mov R16,R12
	rcall div8u
	sts _shi,R16
	.dbline 548
; 			ge=i%10; //个位
	ldi R17,10
	mov R16,R12
	rcall mod8u
	sts _ge,R16
	.dbline 549
; 			if(minus_flag==1)//负温度
	lds R24,_minus_flag
	cpi R24,1
	brne L157
	.dbline 550
; 			wendu=i|0x80; //暂时做 char处理 
	mov R24,R12
	ori R24,128
	sts _wendu,R24
	rjmp L158
L157:
	.dbline 552
; 			else
; 			wendu=i;
	sts _wendu,R12
L158:
	.dbline 553
; 		 }
L137:
	.dbline 554
; 	   }   
L125:
	.dbline 555
L123:
	.dbline 493
	rjmp L122
X3:
	.dbline -2
L111:
	adiw R28,9
	.dbline 0 ; func end
	ret
	.dbsym r m 12 i
	.dbsym r a 10 c
	.dbsym r temh 20 c
	.dbsym r teml 22 c
	.dbsym r i 12 c
	.dbsym l temporary 0 A[9:9]c
	.dbsym r j 14 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\can-18b20(无浮点再调试)\can18b20.c
_minus_flag::
	.blkb 1
	.dbsym e minus_flag _minus_flag c
_dot1::
	.blkb 1
	.dbsym e dot1 _dot1 c
_ge::
	.blkb 1
	.dbsym e ge _ge c
_shi::
	.blkb 1
	.dbsym e shi _shi c
_wendu::
	.blkb 1
	.dbsym e wendu _wendu c
_count::
	.blkb 2
	.dbsym e count _count i

⌨️ 快捷键说明

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