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

📄 ds18b20.s

📁 户外显示屏源程序
💻 S
字号:
	.module DS18B20.c
	.area text(rom, con, rel)
	.dbfile F:\我的设计\delphi\uartdispy\mcu\DS18B20.c
	.dbfunc e resetDS18B20 _resetDS18B20 fc
;        errTime -> R20
	.even
_resetDS18B20::
	xcall push_gset1
	.dbline -1
	.dbline 22
; /*********************************Copyright (c)*********************************
; **                                
; ** 文   件   名: defineLCD1602.h
; ** 最后修改日期: 2005年06月8日
; ** 描        述: 18B20温度检测IC驱动函数文件
; ** 版	     本: V1.0
; ** 主  控  芯 片:M16  晶振频率:8 MHZ
; *******************************************************************************/
; 
; #include <iom16v.h>
; #include <macros.h>
; #include "function.h"
; #include "define.h"
; #include "defineDS18B20.h"
; 
; 
; /**********************************************************************
; functionName: BYTE resetDS18B20(void)
; description :DS18B20初始化
; **********************************************************************/
; unsigned char resetDS18B20(void)
; {
	.dbline 23
; 	unsigned char errTime=0;
	clr R20
	.dbline 24
; 	RLS_DS18B20;		//释放总线
	cbi 0x11,6
	.dbline 25
; 	_NOP();
	nop
	.dbline 26
; 	HLD_DS18B20;		//Maga16控制总线
	sbi 0x11,6
	.dbline 27
; 	CLR_DS18B20;		//强制拉低
	cbi 0x12,6
	.dbline 28
; 	delayUs(255);		//209.42us
	ldi R16,255
	xcall _delayUs
	.dbline 29
; 	delayUs(255);		//209.42us
	ldi R16,255
	xcall _delayUs
	.dbline 30
; 	delayUs(255);		//83.28us
	ldi R16,255
	xcall _delayUs
	.dbline 32
; 	//以上的三个延时大于480us
; 	RLS_DS18B20;		//释放总线,总线自动上拉
	cbi 0x11,6
	.dbline 33
; 	_NOP();			
	nop
	xjmp L3
L2:
	.dbline 35
; 	while(STU_DS18B20)	
; 	{
	.dbline 36
; 		delayUs(4);	 	//5.15us
	ldi R16,4
	xcall _delayUs
	.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,6
	rjmp L2
	.dbline 41
; 	}
; 	errTime=0;
	clr R20
	xjmp L8
L7:
	.dbline 43
; 	while(!(STU_DS18B20))	
; 	{
	.dbline 44
; 		delayUs(4);	 	//5.15us
	ldi R16,4
	xcall _delayUs
	.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,6
	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 readByteDS18B20 _readByteDS18B20 fc
;         retVal -> R20
;              i -> R22
	.even
_readByteDS18B20::
	xcall push_gset2
	.dbline -1
	.dbline 58
; }
; 
; 
; /**********************************************************************
; functionName: BYTE readByteDS18B20(void)
; description :读DS18B20一个字节
; **********************************************************************/
; unsigned char readByteDS18B20(void)
; {
	.dbline 60
; 	unsigned char i;
; 	unsigned char retVal=0;
	clr R20
	.dbline 61
; 	RLS_DS18B20;		//释放总线
	cbi 0x11,6
	.dbline 62
; 	for(i=8;i>0;i--)
	ldi R22,8
	xjmp L16
L13:
	.dbline 63
; 	{
	.dbline 64
; 	 	retVal>>=1;
	lsr R20
	.dbline 65
; 	        HLD_DS18B20;	//Maga16控制总线
	sbi 0x11,6
	.dbline 66
; 		CLR_DS18B20;	//强制拉低
	cbi 0x12,6
	.dbline 67
; 		NOP();
	nop
	.dbline 68
; 	   	NOP();
	nop
	.dbline 69
; 	   	NOP();
	nop
	.dbline 70
; 	   	NOP();
	nop
	.dbline 71
; 	   	NOP();
	nop
	.dbline 72
; 		NOP();
	nop
	.dbline 73
; 		NOP();	
	nop
	.dbline 74
; 		NOP();			//延时大于1us	
	nop
	.dbline 75
; 		RLS_DS18B20;		//释放总线,DS18B20会将总线强制拉低
	cbi 0x11,6
	.dbline 76
; 		NOP();
	nop
	.dbline 77
; 		NOP();
	nop
	.dbline 78
; 		NOP();
	nop
	.dbline 79
; 		if(STU_DS18B20)
	sbis 0x10,6
	rjmp L17
	.dbline 80
; 		retVal|=0x80;
	ori R20,128
L17:
	.dbline 81
	ldi R16,16
	xcall _delayUs
	.dbline 82
	ldi R16,16
	xcall _delayUs
	.dbline 83
	cbi 0x11,6
	.dbline 84
	ldi R16,35
	xcall _delayUs
	.dbline 85
L14:
	.dbline 62
	dec R22
L16:
	.dbline 62
	clr R2
	cp R2,R22
	brlo L13
	.dbline 86
; 		delayUs(16);	 	//14.92us
; 		delayUs(16);	 	//14.92us
; 		RLS_DS18B20;		//释放总线
; 		delayUs(35);	 	//30.38us
; 	}
; 	delayUs(1);	 		//2.71us(大于1us就行了)
	ldi R16,1
	xcall _delayUs
	.dbline 87
; 	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 writeByteDS18B20 _writeByteDS18B20 fV
;           temp -> R20
;              i -> R22
;             wb -> R10
	.even
_writeByteDS18B20::
	xcall push_gset3
	mov R10,R16
	.dbline -1
	.dbline 96
; }
; 
; 
; /**********************************************************************
; functionName: BYTE readByteDS18B20(void)
; description :写DS18B20一个字节
; **********************************************************************/
; void writeByteDS18B20(BYTE wb)
; {
	.dbline 99
; 	unsigned char i;
; 	unsigned char temp;
; 	RLS_DS18B20;		//释放总线
	cbi 0x11,6
	.dbline 100
; 	for(i=0;i<8;i++)
	clr R22
	xjmp L23
L20:
	.dbline 101
; 	{
	.dbline 102
; 		HLD_DS18B20;		//Maga16控制总线
	sbi 0x11,6
	.dbline 103
; 		CLR_DS18B20;		//强制拉低
	cbi 0x12,6
	.dbline 104
; 		delayUs(16);	 	//14.92us
	ldi R16,16
	xcall _delayUs
	.dbline 105
; 		temp=wb>>i;
	mov R16,R10
	mov R17,R22
	xcall lsr8
	mov R20,R16
	.dbline 106
; 		temp&=0x01;
	andi R20,1
	.dbline 107
; 		if(temp)
	breq L24
	.dbline 108
; 		RLS_DS18B20;		//释放总线
	cbi 0x11,6
	xjmp L25
L24:
	.dbline 110
; 		else
; 		CLR_DS18B20;		//强制拉低
	cbi 0x12,6
L25:
	.dbline 111
	ldi R16,16
	xcall _delayUs
	.dbline 112
	ldi R16,35
	xcall _delayUs
	.dbline 113
	cbi 0x11,6
	.dbline 114
	ldi R16,1
	xcall _delayUs
	.dbline 115
L21:
	.dbline 100
	inc R22
L23:
	.dbline 100
	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 readTempDS18B20 _readTempDS18B20 fi
;              x -> R20,R21
;          tempH -> R20
;          tempL -> R22
	.even
_readTempDS18B20::
	xcall push_gset2
	.dbline -1
	.dbline 128
; 		delayUs(16);	 	//14.92us
; 		delayUs(35);	 	//30.38us
; 		RLS_DS18B20;		//释放总线
; 		delayUs(1);	 		//2.71us(大于1us就行了)
; 	}
; }
; 
; 
; 
; 
; 
; 
; /**********************************************************************
; functionName: unsigned int readTempDS18B20(void)
; description :读DS18B20温度
; **********************************************************************/
; unsigned int readTempDS18B20(void)
; {
	.dbline 131
; 	unsigned char tempL,tempH;
; 	unsigned int x;
; 	resetDS18B20();
	xcall _resetDS18B20
	.dbline 132
; 	writeByteDS18B20(0xcc); 	//跳过ROM
	ldi R16,204
	xcall _writeByteDS18B20
	.dbline 133
; 	writeByteDS18B20(0x44);		//启动温度转换
	ldi R16,68
	xcall _writeByteDS18B20
	.dbline 134
; 	delayUs(2);
	ldi R16,2
	xcall _delayUs
	.dbline 135
; 	resetDS18B20();
	xcall _resetDS18B20
	.dbline 136
; 	writeByteDS18B20(0xcc);		//跳过ROM
	ldi R16,204
	xcall _writeByteDS18B20
	.dbline 137
; 	writeByteDS18B20(0xbe);		//读数据
	ldi R16,190
	xcall _writeByteDS18B20
	.dbline 138
; 	tempL=readByteDS18B20();
	xcall _readByteDS18B20
	mov R22,R16
	.dbline 139
; 	tempH=readByteDS18B20();
	xcall _readByteDS18B20
	mov R20,R16
	.dbline 140
; 	x=(tempH<<8)|tempL;
	mov R21,R20
	mov R20,R22
	.dbline 141
; 	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 + -