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

📄 ds18b20.s

📁 DS18B20温度监控程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	ldi R24,4
	sts 129,R24
	.dbline 153
;  /*通信口初始化*/
;  UartInit();
	.dbline -2
L29:
	.dbline 0 ; func end
	rjmp _UartInit
	.dbend
	.dbfunc e convert _convert fV
	.even
_convert::
	.dbline -1
	.dbline 157
; }
; /*数据转换函数*/
; void convert(void)
; {timeb1=time1/100;
	.dbline 157
	ldi R17,100
	lds R16,_time1
	rcall div8u
	sts _timeb1,R16
	.dbline 158
;  timeb2=time1%100/10;
	ldi R17,100
	lds R16,_time1
	rcall mod8u
	ldi R17,10
	rcall div8u
	sts _timeb2,R16
	.dbline 159
;  timeb3=time1%10;
	ldi R17,10
	lds R16,_time1
	rcall mod8u
	sts _timeb3,R16
	.dbline 160
;  timeb4=time2/100;
	ldi R17,100
	lds R16,_time2
	rcall div8u
	sts _timeb4,R16
	.dbline 161
;  timeb5=time2%100/10;
	ldi R17,100
	lds R16,_time2
	rcall mod8u
	ldi R17,10
	rcall div8u
	sts _timeb5,R16
	.dbline 162
;  timeb6=time2%10;
	ldi R17,10
	lds R16,_time2
	rcall mod8u
	sts _timeb6,R16
	.dbline -2
L30:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Init_1wire _Init_1wire fV
	.even
_Init_1wire::
	.dbline -1
	.dbline 167
; }
; /*****************单总线时序**************/
; /*初始化*/
; void Init_1wire(void)
; {flag = SREG;				/*中断保护*/
	.dbline 167
	in R2,0x3f
	sts _flag,R2
	.dbline 168
;  CLI();	
	cli
	.dbline 170
;  					/*关中断*/
;  DRC(1);              //Out
	sbi 0x7,0
	.dbline 171
;  DQ(1);
	sbi 0x8,0
	.dbline 172
;  NOP();    //DQ拉低480-960US,接着将数据线拉高15-60US
	nop
	.dbline 173
;  DQ(0);
	in R24,0x8
	andi R24,254
	out 0x8,R24
	.dbline 174
;  delay_10us(56);   
	ldi R16,56
	rcall _delay_10us
	.dbline 175
;  DQ(1);
	sbi 0x8,0
	.dbline 176
;  DRC(0);        //In  释放总线  此时上拉电阻使能
	in R24,0x7
	andi R24,254
	out 0x7,R24
	.dbline 177
;  delay_10us(7);            
	ldi R16,7
	rcall _delay_10us
L32:
	.dbline 178
;  while(PINC & 0x01);
L33:
	.dbline 178
	sbic 0x6,0
	rjmp L32
X16:
	.dbline 179
;  delay_10us(50);     //presence pulse 60-240us  480us min
	ldi R16,50
	rcall _delay_10us
	.dbline 181
;  
;  if (flag & 0x80) 
	lds R2,_flag
	sbrs R2,7
	rjmp L35
X17:
	.dbline 182
;    {SEI();  /*恢复中断状态*/
	.dbline 182
	sei
	.dbline 183
;    }
L35:
	.dbline -2
L31:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e WriteByte_1wire _WriteByte_1wire fV
;           temp -> R10
;              i -> R20
;           data -> R12
	.even
_WriteByte_1wire::
	rcall push_xgset303C
	mov R12,R16
	.dbline -1
	.dbline 187
; }
; /*写字节*/                    
; void WriteByte_1wire(uchar data)
; {uchar i,temp;
	.dbline 188
;  temp=data;
	mov R10,R12
	.dbline 190
;  
;  flag = SREG;				/*中断保护*/
	in R2,0x3f
	sts _flag,R2
	.dbline 191
;  CLI();	
	cli
	.dbline 193
;  
;  DRC(1);
	sbi 0x7,0
	.dbline 194
;  for(i=0;i<8;i++)
	clr R20
	rjmp L41
L38:
	.dbline 195
;   {DQ(1);
	.dbline 195
	sbi 0x8,0
	.dbline 196
;    NOP();
	nop
	.dbline 197
;    DQ(0);               //写时间隙开始
	in R24,0x8
	andi R24,254
	out 0x8,R24
	.dbline 198
;    delay_10us(1);
	ldi R16,1
	rcall _delay_10us
	.dbline 199
;    if(temp&0x01)DQ(1);
	sbrs R10,0
	rjmp L42
X18:
	.dbline 199
	sbi 0x8,0
L42:
	.dbline 201
;    //else DQ(0);
;    temp>>=1;             //LSB First
	lsr R10
	.dbline 202
;    delay_10us(7);
	ldi R16,7
	rcall _delay_10us
	.dbline 203
;   }
L39:
	.dbline 194
	inc R20
L41:
	.dbline 194
	cpi R20,8
	brlo L38
X19:
	.dbline 204
;  DQ(1);
	sbi 0x8,0
	.dbline 206
;  
;  if (flag & 0x80) 
	lds R2,_flag
	sbrs R2,7
	rjmp L44
X20:
	.dbline 207
;    {SEI();  /*恢复中断状态*/
	.dbline 207
	sei
	.dbline 208
;    }  
L44:
	.dbline -2
L37:
	.dbline 0 ; func end
	rjmp pop_xgset303C
	.dbsym r temp 10 c
	.dbsym r i 20 c
	.dbsym r data 12 c
	.dbend
	.dbfunc e ReadByte_1wire _ReadByte_1wire fc
;           data -> R20
;              i -> R22
	.even
_ReadByte_1wire::
	st -y,R20
	st -y,R22
	.dbline -1
	.dbline 212
; }
; /*读字节*/                   
; uchar ReadByte_1wire(void)
; {uchar i,data=0;
	.dbline 212
	clr R20
	.dbline 214
; 
;  flag = SREG;				/*中断保护*/
	in R2,0x3f
	sts _flag,R2
	.dbline 215
;  CLI();
	cli
	.dbline 217
;  
;  for(i=0;i<8;i++)
	clr R22
	rjmp L50
L47:
	.dbline 218
;   {data>>=1;            //处理方法:先右移  后将最高位与 0x80相或 !!!
	.dbline 218
	lsr R20
	.dbline 219
;    DRC(1);              
	sbi 0x7,0
	.dbline 220
;    DQ(1);
	sbi 0x8,0
	.dbline 221
;    NOP();
	nop
	.dbline 222
;    DQ(0);
	in R24,0x8
	andi R24,254
	out 0x8,R24
	.dbline 223
;    delay_1us();        //delay 3us
	rcall _delay_1us
	.dbline 224
;    delay_1us();
	rcall _delay_1us
	.dbline 226
;    //DQ(1);
;    DRC(0);
	in R24,0x7
	andi R24,254
	out 0x7,R24
	.dbline 227
;    delay_10us(1);
	ldi R16,1
	rcall _delay_10us
	.dbline 228
;    if(PINC&0x01)data|=0x80;
	sbis 0x6,0
	rjmp L51
X21:
	.dbline 228
	ori R20,128
L51:
	.dbline 229
;    delay_10us(6);
	ldi R16,6
	rcall _delay_10us
	.dbline 231
;    
;   }
L48:
	.dbline 217
	inc R22
L50:
	.dbline 217
	cpi R22,8
	brlo L47
X22:
	.dbline 232
;  DRC(1);
	sbi 0x7,0
	.dbline 233
;  DQ(1);
	sbi 0x8,0
	.dbline 235
;  
;  if (flag & 0x80) 
	lds R2,_flag
	sbrs R2,7
	rjmp L53
X23:
	.dbline 236
;    {SEI();  /*恢复中断状态*/
	.dbline 236
	sei
	.dbline 237
;    } 
L53:
	.dbline 238
;  return(data);   
	mov R16,R20
	.dbline -2
L46:
	.dbline 0 ; func end
	ld R22,y+
	ld R20,y+
	ret
	.dbsym r data 20 c
	.dbsym r i 22 c
	.dbend
	.dbfunc e delay_10us _delay_10us fV
;              i -> R10
;              j -> R20
;              n -> R16
	.even
_delay_10us::
	st -y,R10
	st -y,R20
	.dbline -1
	.dbline 245
; }
; /********************************************************/
; 
; /* n*10us  
;  通过AVR Studio仿真*/
; void delay_10us(uchar n)
; {uchar i,j;
	.dbline 246
;  for(i=0;i<n;i++)
	clr R10
	rjmp L59
L56:
	.dbline 247
;    for(j=0;j<38;j++);
	clr R20
	rjmp L63
L60:
	.dbline 247
L61:
	.dbline 247
	inc R20
L63:
	.dbline 247
	cpi R20,38
	brlo L60
X24:
L57:
	.dbline 246
	inc R10
L59:
	.dbline 246
	cp R10,R16
	brlo L56
X25:
	.dbline -2
L55:
	.dbline 0 ; func end
	ld R20,y+
	ld R10,y+
	ret
	.dbsym r i 10 c
	.dbsym r j 20 c
	.dbsym r n 16 c
	.dbend
	.dbfunc e delay_1us _delay_1us fV
;              i -> R16
	.even
_delay_1us::
	.dbline -1
	.dbline 251
; }
; /* 1.75us */
; void delay_1us(void)
; {uchar i;
	.dbline 252
;  for(i=0;i<4;i++);
	clr R16
	rjmp L68
L65:
	.dbline 252
L66:
	.dbline 252
	inc R16
L68:
	.dbline 252
	cpi R16,4
	brlo L65
X26:
	.dbline -2
L64:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e UartRece_int _UartRece_int fV
	.even
_UartRece_int::
	st -y,R2
	st -y,R3
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	IN R2,63
	st -y,R2
	.dbline -1
	.dbline 256
; }
; /********************************通信部分*************************/
; void UartRece_int(void)
; {if(count3<2)Rece[count3++]=UDR0;
	.dbline 256
	lds R24,_count3
	cpi R24,2
	brsh L70
X27:
	.dbline 256
	mov R2,R24
	clr R3
	subi R24,255    ; addi 1
	sts _count3,R24
	ldi R24,<_Rece
	ldi R25,>_Rece
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	lds R2,198
	std z+0,R2
	rjmp L71
L70:
	.dbline 258
;  else 
;    {count3=0;
	.dbline 258
	clr R2
	sts _count3,R2
	.dbline 259
;     flag1=1;
	ldi R24,1
	sts _flag1,R24
	.dbline 260
;    }                	
L71:
	.dbline -2
L69:
	.dbline 0 ; func end
	ld R2,y+
	OUT 63,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R3,y+
	ld R2,y+
	reti
	.dbend
	.dbfunc e UartInit _UartInit fV
	.even
_UartInit::
	.dbline -1
	.dbline 264
; }
; /**************串口初始化函数*****************/
; void UartInit(void)
; {
	.dbline 266
;  /* 设置波特率*/
;  UBRR0H = 0x00;   /*9600 U2X0=0  103*/
	clr R2
	sts 197,R2
	.dbline 267
;  UBRR0L = 0x67;
	ldi R24,103
	sts 196,R24
	.dbline 269
;  /* 接收中断使能  接收器与发送器使能*/
;  UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
	ldi R24,152
	sts 193,R24
	.dbline 271
;  /* 设置帧格式: 8 个数据位, 1 个停止位 */
;  UCSR0C = (3<<UCSZ00);
	ldi R24,6
	sts 194,R24
	.dbline -2
L72:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e UartSend _UartSend fV
;              i -> R10
;         length -> R18
;              a -> R16,R17
	.even
_UartSend::
	st -y,R10
	.dbline -1
	.dbline 275
; }
; /****************串行发送函数****************/
; void UartSend(uchar a[],uchar length)
; {uchar i;
	.dbline 276
;  for(i=0;i<length;i++)
	clr R10
	rjmp L77
L78:
	.dbline 278
;   {/* 等待发送缓冲器为空*/
;    while ( !( UCSR0A & (1<<UDRE0)) );
L79:
	.dbline 278
	lds R2,192
	sbrs R2,5
	rjmp L78
X28:
	.dbline 280
;    /* 将数据放入缓冲器,发送数据*/
;    UDR0=a[i];
	mov R30,R10
	clr R31
	add R30,R16
	adc R31,R17
	ldd R2,z+0
	sts 198,R2
	.dbline 281
;   }
L75:
	.dbline 276
	inc R10
L77:
	.dbline 276
	cp R10,R18
	brlo L79
X29:
	.dbline -2
L73:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r i 10 c
	.dbsym r length 18 c
	.dbsym r a 16 pc
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\VB01D6~1\ComTest\DS18b20\ds18b20.c
_Send::
	.blkb 3
	.dbsym e Send _Send A[3:3]c
_Rece::
	.blkb 2
	.dbsym e Rece _Rece A[2:2]c
_timeb6::
	.blkb 1
	.dbsym e timeb6 _timeb6 c
_timeb5::
	.blkb 1
	.dbsym e timeb5 _timeb5 c
_timeb4::
	.blkb 1
	.dbsym e timeb4 _timeb4 c
_timeb3::
	.blkb 1
	.dbsym e timeb3 _timeb3 c
_timeb2::
	.blkb 1
	.dbsym e timeb2 _timeb2 c
_timeb1::
	.blkb 1
	.dbsym e timeb1 _timeb1 c
_time2::
	.blkb 1
	.dbsym e time2 _time2 c
_time1::
	.blkb 1
	.dbsym e time1 _time1 c
_flag::
	.blkb 1
	.dbsym e flag _flag c
; }

⌨️ 快捷键说明

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