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

📄 ds18b20.s

📁 非常经典的基于AVR m16的DS18B20 C 程序 !1
💻 S
字号:
	.module ds18b20.c
	.area text(rom, con, rel)
	.dbfile E:\DS18B20\ds18b20.c
	.dbfunc e rst_DS18B20 _rst_DS18B20 fc
;        errTime -> R20
	.even
_rst_DS18B20::
	xcall push_gset1
	.dbline -1
	.dbline 22
; /****************************************
; ** 文 件 名: DS18B20.c				   **
; ** 日    期: 2007年04月08日			   **
; ** 描    述: DS18B20函数			   **
; ** 作    者:tonghe					   **
; ** 版	 本: V1.0					   **
; ** 主控芯片:M16 					   **
; ** 晶振频率:7.3728MHZ, 波特率9600	   **
; ****************************************/
; #include <iom16v.h>
; #include <macros.h>
; #include <E:\DS18B20\define.h>
; #include <E:\DS18B20\function.h>
; 
; /****************************************
; * 函数名称: uchar rst_DS18B20(void)		*
; * 函数功能:DS18B20初始化				*
; * 入    口:无							*
; * 返    回:0x00为失败,0xFF为成功		*
; ****************************************/
; uchar rst_DS18B20(void)
;    {
	.dbline 23
; 	uchar errTime=0;
	clr R20
	.dbline 24
; 	RLS_DS18B20;		//释放总线
	cbi 0x11,4
	.dbline 25
; 	_NOP();
	nop
	.dbline 26
; 	HLD_DS18B20;		//Maga16控制总线
	sbi 0x11,4
	.dbline 27
; 	CLR_DS18B20;		//强制拉低
	cbi 0x12,4
	.dbline 28
; 	delay_us(255);		//209.42us
	ldi R16,255
	xcall _delay_us
	.dbline 29
; 	delay_us(255);		//209.42us
	ldi R16,255
	xcall _delay_us
	.dbline 30
; 	delay_us(255);		//83.28us
	ldi R16,255
	xcall _delay_us
	.dbline 32
; 	//以上的三个延时大于480us
; 	RLS_DS18B20;		//释放总线,总线自动上拉
	cbi 0x11,4
	.dbline 33
; 	_NOP();			
	nop
	xjmp L3
L2:
	.dbline 35
; 	while(STU_DS18B20)	
; 		{
	.dbline 36
; 		delay_us(4);	 	//5.15us
	ldi R16,4
	xcall _delay_us
	.dbline 37
; 		errTime++;
	inc R20
	.dbline 38
; 		if(errTime>20)
	ldi R24,20
	cp R24,R20
	brsh L5
	.dbline 39
; 		return(0x00);		//如果等大于5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
	clr R16
	xjmp L1
L5:
	.dbline 40
L3:
	.dbline 34
	sbic 0x10,4
	rjmp L2
	.dbline 41
; 		}
; 	errTime=0;
	clr R20
	xjmp L8
L7:
	.dbline 43
; 	while(!(STU_DS18B20))	
; 	    {
	.dbline 44
; 		delay_us(4);	 	//5.15us
	ldi R16,4
	xcall _delay_us
	.dbline 45
; 		errTime++;
	inc R20
	.dbline 46
; 		if(errTime>50)
	ldi R24,50
	cp R24,R20
	brsh L10
	.dbline 47
; 		return(0x00);		//如果等大于5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
	clr R16
	xjmp L1
L10:
	.dbline 48
L8:
	.dbline 42
	sbis 0x10,4
	rjmp L7
	.dbline 49
; 		}
; 	return(0xff);
	ldi R16,255
	.dbline -2
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r errTime 20 c
	.dbend
	.dbfunc e read_DS18B20 _read_DS18B20 fc
;         retVal -> R20
;              i -> R22
	.even
_read_DS18B20::
	xcall push_gset2
	.dbline -1
	.dbline 59
; 	}
; 
; /****************************************
; * 函数名称: uchar read_DS18B20(void)	*
; * 函数功能:读DS18B20一个字节			*
; * 入    口:无							*
; * 返    回:读出的数据字节				*
; ****************************************/
; uchar read_DS18B20(void)
;     {
	.dbline 61
; 	uchar i;
; 	uchar retVal=0;
	clr R20
	.dbline 62
; 	RLS_DS18B20;		//释放总线
	cbi 0x11,4
	.dbline 63
; 	for(i=8;i>0;i--)
	ldi R22,8
	xjmp L16
L13:
	.dbline 64
; 	    {
	.dbline 65
; 	 	retVal>>=1;
	lsr R20
	.dbline 66
; 	    HLD_DS18B20;	//Maga16控制总线
	sbi 0x11,4
	.dbline 67
; 		CLR_DS18B20;	//强制拉低
	cbi 0x12,4
	.dbline 68
; 		delay_us(5);		//延时大于1us	
	ldi R16,5
	xcall _delay_us
	.dbline 69
; 		RLS_DS18B20;		//释放总线,DS18B20会将总线强制拉低
	cbi 0x11,4
	.dbline 70
; 		delay_us(2);	
	ldi R16,2
	xcall _delay_us
	.dbline 71
; 		if(STU_DS18B20)
	sbis 0x10,4
	rjmp L17
	.dbline 72
; 		retVal|=0x80;
	ori R20,128
L17:
	.dbline 73
	ldi R16,16
	xcall _delay_us
	.dbline 74
	ldi R16,16
	xcall _delay_us
	.dbline 75
	cbi 0x11,4
	.dbline 76
	ldi R16,35
	xcall _delay_us
	.dbline 77
L14:
	.dbline 63
	dec R22
L16:
	.dbline 63
	clr R2
	cp R2,R22
	brlo L13
	.dbline 78
; 		delay_us(16);	 	//14.92us
; 		delay_us(16);	 	//14.92us
; 		RLS_DS18B20;		//释放总线
; 		delay_us(35);	 	//30.38us
; 		}
; 	delay_us(2);	 		//2.71us(大于1us就行了)
	ldi R16,2
	xcall _delay_us
	.dbline 79
; 	return(retVal);
	mov R16,R20
	.dbline -2
L12:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r retVal 20 c
	.dbsym r i 22 c
	.dbend
	.dbfunc e write_DS18B20 _write_DS18B20 fV
;           temp -> R20
;              i -> R22
;             wb -> R10
	.even
_write_DS18B20::
	xcall push_gset3
	mov R10,R16
	.dbline -1
	.dbline 89
; 	}
; 
; /****************************************
; * 函数名称: uchar write_DS18B20(void)	*
; * 函数功能:写DS18B20一个字节			*
; * 入    口:需写入的字节数据wb			*
; * 返    回:无							*
; ****************************************/
; void write_DS18B20(uchar wb)
;     {
	.dbline 92
; 	uchar i;
; 	uchar temp;
; 	RLS_DS18B20;		//释放总线
	cbi 0x11,4
	.dbline 93
; 	for(i=0;i<8;i++)
	clr R22
	xjmp L23
L20:
	.dbline 94
; 	    {
	.dbline 95
; 		HLD_DS18B20;		//Maga16控制总线
	sbi 0x11,4
	.dbline 96
; 		CLR_DS18B20;		//强制拉低
	cbi 0x12,4
	.dbline 97
; 		delay_us(16);	 	//14.92us
	ldi R16,16
	xcall _delay_us
	.dbline 98
; 		temp=wb>>i;
	mov R16,R10
	mov R17,R22
	xcall lsr8
	mov R20,R16
	.dbline 99
; 		temp&=0x01;
	andi R20,1
	.dbline 100
; 		if(temp)
	breq L24
	.dbline 101
; 		RLS_DS18B20;		//释放总线
	cbi 0x11,4
	xjmp L25
L24:
	.dbline 103
; 		else
; 		CLR_DS18B20;		//强制拉低
	cbi 0x12,4
L25:
	.dbline 104
	ldi R16,16
	xcall _delay_us
	.dbline 105
	ldi R16,35
	xcall _delay_us
	.dbline 106
	cbi 0x11,4
	.dbline 107
	ldi R16,2
	xcall _delay_us
	.dbline 108
L21:
	.dbline 93
	inc R22
L23:
	.dbline 93
	cpi R22,8
	brlo L20
	.dbline -2
L19:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r i 22 c
	.dbsym r wb 10 c
	.dbend
	.dbfunc e read_Temp _read_Temp fi
;              x -> R20,R21
;          tempH -> R20
;          tempL -> R22
	.even
_read_Temp::
	xcall push_gset2
	.dbline -1
	.dbline 118
; 		delay_us(16);	 	//14.92us
; 		delay_us(35);	 	//30.38us
; 		RLS_DS18B20;		//释放总线
; 		delay_us(2);	 	//2.71us(大于1us就行了)
; 	    }
;     }
; 
; /****************************************
; * 函数名称: uint read_Temp(void)	    *
; * 函数功能:读DS18B20温度				*
; * 入    口:无							*
; * 返    回:读出的数据字节				*
; ****************************************/
; uint read_Temp(void)
; 	{
	.dbline 121
; 	uchar tempL,tempH;
; 	uint x;
; 	rst_DS18B20();
	xcall _rst_DS18B20
	.dbline 122
; 	write_DS18B20(0xcc); 	    //跳过ROM
	ldi R16,204
	xcall _write_DS18B20
	.dbline 123
; 	write_DS18B20(0x44);		//启动温度转换
	ldi R16,68
	xcall _write_DS18B20
	.dbline 124
; 	delay_us(1);
	ldi R16,1
	xcall _delay_us
	.dbline 125
; 	rst_DS18B20();
	xcall _rst_DS18B20
	.dbline 126
; 	write_DS18B20(0xcc);		//跳过ROM
	ldi R16,204
	xcall _write_DS18B20
	.dbline 127
; 	write_DS18B20(0xbe);		//读数据
	ldi R16,190
	xcall _write_DS18B20
	.dbline 128
; 	tempL=read_DS18B20();
	xcall _read_DS18B20
	mov R22,R16
	.dbline 129
; 	tempH=read_DS18B20();
	xcall _read_DS18B20
	mov R20,R16
	.dbline 130
; 	x=(tempH<<8)|tempL;
	mov R21,R20
	mov R20,R22
	.dbline 131
; 	return(x);
	movw R16,R20
	.dbline -2
L26:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r x 20 i
	.dbsym r tempH 20 c
	.dbsym r tempL 22 c
	.dbend

⌨️ 快捷键说明

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