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

📄 can18b20.s

📁 基于CAN总线的 温度采集方法。选用DS18B20温度传感器。
💻 S
📖 第 1 页 / 共 3 页
字号:
	mov R2,R22
	clr R3
	eor R2,R24
	eor R3,R25
	mov R22,R2
L61:
	.dbline 194
	lsr R10
	.dbline 195
L58:
	.dbline 186
	inc R12
L60:
	.dbline 186
	mov R24,R12
	cpi R24,8
	brlo L57
	.dbline 196
L54:
	.dbline 183
	inc R20
L56:
	.dbline 183
	cp R20,R6
	brlo L53
	.dbline 197
;         		byte >>= 1;
;         	}
;     	}
; 	return	temp;	
	mov R16,R22
	.dbline -2
L52:
	adiw R28,1
	rcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r j 20 c
	.dbsym r r 14 c
	.dbsym l cbit 0 c
	.dbsym r bit0 8 c
	.dbsym r byte 10 c
	.dbsym r i 12 c
	.dbsym r temp 22 c
	.dbsym r len 6 c
	.dbsym r p 4 pc
	.dbend
	.dbfunc e delay_us _delay_us fV
;           time -> R16,R17
	.even
_delay_us::
	.dbline -1
	.dbline 207
; }
; 
; /*===================================================================
; //	函数功能:	us延时函数
; //	形参:		void
; //	返回:		void
; //	编写:		2004/8/25
; ===================================================================*/
; void	delay_us(unsigned int time)
; {     
L64:
	.dbline 209
; 	do
; 	{ //delay_1us();
	.dbline 210
; 		time--;
	subi R16,1
	sbci R17,0
	.dbline 211
; 	}	
L65:
	.dbline 212
; 	while (time>1);
	ldi R24,1
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brlo L64
	.dbline -2
L63:
	.dbline 0 ; func end
	ret
	.dbsym r time 16 i
	.dbend
	.dbfunc e ds1820_ack _ds1820_ack fc
;            ack -> R20
	.even
_ds1820_ack::
	rcall push_gset1
	.dbline -1
	.dbline 222
; }
; 
; /*===================================================================
; //	函数功能:	判断总线应答
; //	形参:		void
; //	返回:		unsigned char	true为应答
; //	编写:		2004/8/25
; ===================================================================*/
; unsigned char ds1820_ack(void)
; {
	.dbline 224
; 	unsigned char ack;
; 	DDRC |= DQ;
	sbi 0x14,5
	.dbline 225
; 	PORTC &= ~DQ;
	cbi 0x15,5
	.dbline 226
; 	delay_us(450);							//	reset
	ldi R16,450
	ldi R17,1
	rcall _delay_us
	.dbline 227
; 	PORTC |= DQ;
	sbi 0x15,5
	.dbline 228
; 	DDRC &= ~DQ;
	cbi 0x14,5
	.dbline 229
; 	delay_us(45);
	ldi R16,45
	ldi R17,0
	rcall _delay_us
	.dbline 230
; 	ack = DQ & PIND;
	in R20,0x10
	andi R20,32
	.dbline 231
; 	delay_us(450);							//	host receive
	ldi R16,450
	ldi R17,1
	rcall _delay_us
	.dbline 232
; 	if(ack)
	tst R20
	breq L68
	.dbline 233
; 		return 1;
	ldi R16,1
	rjmp L67
L68:
	.dbline 235
; 	else
; 		return 0;
	clr R16
	.dbline -2
L67:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r ack 20 c
	.dbend
	.dbfunc e read_byte _read_byte fc
;          value -> R20
;              i -> R22
	.even
_read_byte::
	rcall push_gset2
	.dbline -1
	.dbline 245
; }
; 
; /*===================================================================
; //	函数功能:	从 1-wire 总线上读取一个字节
; //	形参:		void
; //	返回:		unsigned char	读到的值
; //	编写:		2004/8/25
; ===================================================================*/
; unsigned char	read_byte(void)
; {
	.dbline 247
; 	unsigned char	i;
; 	unsigned char	value = 0;
	clr R20
	.dbline 248
; 	for(i = 8; i > 0; i--)
	ldi R22,8
	rjmp L74
L71:
	.dbline 249
; 	{
	.dbline 250
; 		value >>= 1;						//	low bit first
	lsr R20
	.dbline 251
; 		DDRC |= DQ;
	sbi 0x14,5
	.dbline 252
; 		PORTC &= ~DQ;						//	pull DQ low to start timeslot
	cbi 0x15,5
	.dbline 253
; 		delay_us(3);
	ldi R16,3
	ldi R17,0
	rcall _delay_us
	.dbline 254
; 		PORTC |= DQ;
	sbi 0x15,5
	.dbline 255
; 		DDRC &= ~DQ;						//	release bus
	cbi 0x14,5
	.dbline 256
; 		delay_us(10);
	ldi R16,10
	ldi R17,0
	rcall _delay_us
	.dbline 257
; 		if(DQ & PINC)
	sbis 0x13,5
	rjmp L75
	.dbline 258
; 		value|=0x80;
	ori R20,128
L75:
	.dbline 259
	ldi R16,100
	ldi R17,0
	rcall _delay_us
	.dbline 260
	sbi 0x14,5
	.dbline 261
	ldi R16,5
	ldi R17,0
	rcall _delay_us
	.dbline 262
L72:
	.dbline 248
	dec R22
L74:
	.dbline 248
	clr R2
	cp R2,R22
	brlo L71
	.dbline 263
; 		delay_us(100);
; 		DDRC |= DQ;
; 		delay_us(5);						//	time interval
; 	}
; 	return(value);
	mov R16,R20
	.dbline -2
L70:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r value 20 c
	.dbsym r i 22 c
	.dbend
	.dbfunc e write_byte _write_byte fV
;              i -> R20
;          value -> R22
	.even
_write_byte::
	rcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 273
; }
; 
; /*===================================================================
; //	函数功能:	向 1-WIRE 总线上写一个字节
; //	形参:		value		写到总线上的值
; //	返回:		void
; //	编写:		2004/8/25
; ===================================================================*/
; void	write_byte(unsigned char value)
; {
	.dbline 275
; 	unsigned char	i;
; 	DDRC |= DQ;
	sbi 0x14,5
	.dbline 276
; 	for(i = 8; i > 0; i--)
	ldi R20,8
	rjmp L81
L78:
	.dbline 277
; 	{
	.dbline 278
; 		if(value & 0x01)
	sbrs R22,0
	rjmp L82
	.dbline 279
; 		{
	.dbline 280
; 			PORTC &= ~DQ;					//	pull DQ low to start timeslot
	cbi 0x15,5
	.dbline 281
; 			delay_us(10);
	ldi R16,10
	ldi R17,0
	rcall _delay_us
	.dbline 282
; 			PORTC |= DQ;
	sbi 0x15,5
	.dbline 283
; 			delay_us(100);
	ldi R16,100
	ldi R17,0
	rcall _delay_us
	.dbline 284
; 		}
	rjmp L83
L82:
	.dbline 286
; 		else
; 		{
	.dbline 287
; 			PORTC &= ~DQ;					//	pull DQ low to start timeslot
	cbi 0x15,5
	.dbline 288
; 			delay_us(100);
	ldi R16,100
	ldi R17,0
	rcall _delay_us
	.dbline 289
; 			PORTC |= DQ;
	sbi 0x15,5
	.dbline 290
; 			delay_us(10);
	ldi R16,10
	ldi R17,0
	rcall _delay_us
	.dbline 291
; 		}
L83:
	.dbline 292
	lsr R22
	.dbline 293
L79:
	.dbline 276
	dec R20
L81:
	.dbline 276
	clr R2
	cp R2,R20
	brlo L78
	.dbline -2
L77:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r value 22 c
	.dbend
	.dbfunc e wait _wait fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_wait::
	rcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 377
; 		value >>= 1;
; 	}
; }
; 
; /*===================================================================
; //	函数功能:	读取温度
; //	形参:		*temperature	温度存储空间
; //	返回:		unsigned char	true为有效
; //	编写:		2004/8/25
; ===================================================================*/
; /*unsigned char	Read_Temperature(unsigned int *temperature)
; {
; 	unsigned char	i;
; 	union{
; 		unsigned char c[2];
; 		unsigned int x;
; 	}temp;
; 	unsigned char	temporary[9];
; 
; 	while(!ds1820_ack());
; 	write_byte(0xCC);						//	Skip ROM
; 	write_byte(0x44);						//	Start Conversion
; 	//for(i = 0; i < 16; i++)
; 		//delay_us(50000);
; 	delay(20);
; 	while(!ds1820_ack());
; 	write_byte(0xCC);						//	Skip ROM
; 	write_byte(0xBE);						//	Read Scratch Pad
; 	for(i = 0; i < 9; i++)
; 		temporary[i] = read_byte();
; 	temp.c[0] = temporary[0];
; 	temp.c[1] = temporary[1];
; 	
; 	if(crccheck(temporary,9))
; 		return	0;
; 	else
; 	{	
; 		*temperature = temp.x;
; 		return	1;
; 	}
; }
; */
; /*===================================================================
; //	函数功能:	读取Rom Code
; //	形参:		*temp		DS18B20的Rom Code存储空间
; //	返回:		unsigned char	true为有效
; //	编写:		2004/8/25
; ===================================================================*/
; /*unsigned char	Read_RomCode(unsigned char *temp)
; {
; 	ds1820_ack();
; 	write_byte(0x33);
; 	temp[0] = read_byte();
; 	temp[1] = read_byte();
; 	temp[2] = read_byte();
; 	temp[3] = read_byte();
; 	temp[4] = read_byte();
; 	temp[5] = read_byte();
; 	temp[6] = read_byte();
; 	temp[7] = read_byte();
; 	if(crccheck(temp,8))
; 		return	0;
; 	else
; 		return	1;
; }
; */
; /*===================================================================
; //	函数功能:	匹配DS18B20
; //	形参:		*p	DS18B20的Rom Code
; //	返回:		void
; //	编写:		2004/8/25
; ===================================================================*/
; /*void ds1820_match(unsigned char *p)
; {
; 	unsigned char i;
; 	ds1820_ack();
; 	write_byte(0x55);	 
; 	for(i=0;i<8;i++)
; 		write_byte(p[i]);
; }
; */
; 
; 
; /*nms delay*/
; void wait(unsigned int n)
; {unsigned int i;
	.dbline 378
;  for(i=0;i<n;i++)
	clr R20
	clr R21
	rjmp L88
L85:
	.dbline 379
	rcall _delay_1ms
L86:
	.dbline 378
	subi R20,255  ; offset = 1
	sbci R21,255
L88:
	.dbline 378
	cp R20,R22
	cpc R21,R23
	brlo L85
	.dbline -2
L84:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;              i -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 384
;  delay_1ms();
; }
; 
; /*1ms delay*/
; void delay_1ms(void)
; {unsigned int i;
	.dbline 385
	clr R16
	clr R17
	rjmp L93
L90:
	.dbline 385
L91:
	.dbline 385
	subi R16,255  ; offset = 1
	sbci R17,255
L93:
	.dbline 385
;  for(i=0;i<1035;i++);
	cpi R16,11
	ldi R30,4
	cpc R17,R30
	brlo L90
	.dbline -2
L89:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay _delay fV
;              i -> R20,R21
;              n -> R16,R17
	.even
_delay::
	rcall push_gset1
	.dbline -1
	.dbline 389
; }
; 
; void delay(unsigned int n)
; { unsigned int i;
	.dbline 390
;   for(i=0;i<n;i++)
	clr R20
	clr R21
	rjmp L98
L95:
	.dbline 391
	nop
L96:
	.dbline 390
	subi R20,255  ; offset = 1
	sbci R21,255
L98:
	.dbline 390
	cp R20,R16
	cpc R21,R17
	brlo L95
	.dbline -2
L94:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 16 i
	.dbend
	.dbfunc e HC595_SENDDAT _HC595_SENDDAT fV
;              i -> R20
;            dat -> R16
	.even
_HC595_SENDDAT::
	rcall push_gset1
	.dbline -1
	.dbline 396
;    asm("nop");
; }
; 
; /*595数据传输*/
; void HC595_SENDDAT(unsigned char dat)
; {unsigned char i;
	.dbline 397
;   C_CS;  //cs 拉低
	cbi 0x15,1
	.dbline 398
;   asm("nop");
	nop
	.dbline 399
;   for(i=0;i<8;i++)
	clr R20
	rjmp L103
L100:
	.dbline 400
;   {C_CLK ;  //时钟拉低
	.dbline 400
	cbi 0x15,0
	.dbline 401
;      asm("nop");
	nop
	.dbline 402
;      if((dat&0x80)!=0)
	sbrs R16,7
	rjmp L104
	.dbline 403
;      S_DATA;
	sbi 0x15,2
	rjmp L105
L104:
	.dbline 405
;      else
;      C_DATA; 
	cbi 0x15,2
L105:
	.dbline 406
	lsl R16
	.dbline 407
	nop
	.dbline 408
	sbi 0x15,0
	.dbline 409
L101:
	.dbline 399
	inc R20
L103:
	.dbline 399
	cpi R20,8
	brlo L100
	.dbline 410
;      dat<<=1;
; 	 asm("nop");
;   S_CLK;  // 时钟拉高
;  }
;  S_CS;  //cs 拉高
	sbi 0x15,1
	.dbline -2
L99:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r dat 16 c
	.dbend
	.area vector(rom, abs)
	.org 18
	rjmp _time0_ovf_isr
	.area text(rom, con, rel)
	.dbfile F:\can-18b20(无浮点再调试)\can18b20.c
	.dbfunc e time0_ovf_isr _time0_ovf_isr fV
	.even
_time0_ovf_isr::
	rcall push_lset
	.dbline -1
	.dbline 415
; }
; //定时器1中断,1ms中断一次
; #pragma interrupt_handler time0_ovf_isr:10
; void time0_ovf_isr(void)
; {
	.dbline 416
;  TCNT0=0xF8; //重新装置
	ldi R24,248
	out 0x32,R24
	.dbline 417
;  count++;
	lds R24,_count
	lds R25,_count+1
	adiw R24,1
	sts _count+1,R25
	sts _count,R24
	.dbline 418
;  if(count>=100)  //100ms
	cpi R24,100
	ldi R30,0
	cpc R25,R30
	brlo L107
	.dbline 419
;     count=0;
	clr R2
	clr R3
	sts _count+1,R3
	sts _count,R2
L107:
	.dbline 420
;    if(flag==0)
	lds R2,_flag
	tst R2
	brne L109
	.dbline 421
;      {     flag=1;
	.dbline 421
	ldi R24,1
	sts _flag,R24
	.dbline 423
; 	        //个位显示
; 	       PORTC&=(~0x18);
	in R24,0x15
	andi R24,231
	out 0x15,R24

⌨️ 快捷键说明

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