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

📄 ds18b20.s

📁 ds18b20+1602液晶显示 基于atmega16l单片机的编程
💻 S
字号:
	.module ds18b20.c
	.area text(rom, con, rel)
	.dbfile F:\avr最小系统板\程序代码\ex15_ds18b20_1602\ds18b20.c
	.dbfunc e DS18B20_Reset _DS18B20_Reset fc
;            err -> R20
	.even
_DS18B20_Reset::
	xcall push_gset1
	.dbline -1
	.dbline 8
; #include <iom16v.h>
; #include <macros.h>
; #include "ds18b20.h"
; #include "lm1602.h"
; 
; 
; byte DS18B20_Reset(void)	 //DS18B20初始化函数
; {  
	.dbline 9
; 	 byte err=0;
	clr R20
	.dbline 10
; 	 DQ_OUT;     //DQ复位
	sbi 0x14,1
	.dbline 11
;      _NOP();
	nop
	.dbline 12
; 	 _NOP();
	nop
	.dbline 13
; 	 DQ_L;
	cbi 0x15,1
	.dbline 14
; 	 delay_nus(300);      //延时470us
	ldi R16,300
	ldi R17,1
	xcall _delay_nus
	.dbline 16
;     // DQ_H;
; 	 DQ_IN;
	cbi 0x14,1
	.dbline 17
; 	 delay_nus(60);       //延时100us
	ldi R16,60
	ldi R17,0
	xcall _delay_nus
	.dbline 18
; 	 if(DQ_IN_H)
	in R24,0x13
	andi R24,2
	cpi R24,2
	brne L2
	.dbline 19
; 	  err = 1;
	ldi R20,1
L2:
	.dbline 20
; 	  delay_nus(60);       //延时100us
	ldi R16,60
	ldi R17,0
	xcall _delay_nus
	.dbline 21
; 	 return err;
	mov R16,R20
	.dbline -2
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r err 20 c
	.dbend
	.dbfunc e DS18B20_WriteBit _DS18B20_WriteBit fV
;         bitval -> R20
	.even
_DS18B20_WriteBit::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 25
; }
; 
; void DS18B20_WriteBit(byte bitval)
; {
	.dbline 26
;     DQ_OUT;
	sbi 0x14,1
	.dbline 27
; 	_NOP();
	nop
	.dbline 28
; 	_NOP();
	nop
	.dbline 29
; 	 DQ_L;//将DQ线拉低,开始写时间隙
	cbi 0x15,1
	.dbline 30
; 	 delay_nus(10);      //延时30us
	ldi R16,10
	ldi R17,0
	xcall _delay_nus
	.dbline 31
; 	 if(bitval == 1)  //如果写1,DQ线拉高
	cpi R20,1
	brne L5
	.dbline 32
; 	   DQ_H;
	sbi 0x15,1
L5:
	.dbline 33
; 	 delay_nus(20);      //延时30us
	ldi R16,20
	ldi R17,0
	xcall _delay_nus
	.dbline 34
;      DQ_H;
	sbi 0x15,1
	.dbline -2
L4:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r bitval 20 c
	.dbend
	.dbfunc e DS18B20_ReadBit _DS18B20_ReadBit fc
;           rbit -> R20
	.even
_DS18B20_ReadBit::
	xcall push_gset1
	.dbline -1
	.dbline 38
; }
; 
; byte DS18B20_ReadBit(void)
; {
	.dbline 39
;     byte rbit = 0;
	clr R20
	.dbline 40
; 	DQ_OUT;
	sbi 0x14,1
	.dbline 41
; 	_NOP();
	nop
	.dbline 42
; 	_NOP();
	nop
	.dbline 43
; 	 DQ_L;  //将DQ线拉低,开始写时间隙
	cbi 0x15,1
	.dbline 44
;      delay_us();       //延时30us
	xcall _delay_us
	.dbline 47
; 	//DQ_H;
; 	// delay_nus(10);      //延时
; 	 DQ_IN;
	cbi 0x14,1
	.dbline 48
; 	 _NOP();
	nop
	.dbline 49
; 	 _NOP();
	nop
	.dbline 51
; 	// 
; 	 if(DQ_IN_H)
	in R24,0x13
	andi R24,2
	cpi R24,2
	brne L8
	.dbline 52
; 	 rbit =1;
	ldi R20,1
L8:
	.dbline 53
; 	 delay_nus(40);
	ldi R16,40
	ldi R17,0
	xcall _delay_nus
	.dbline 54
;      return (rbit);
	mov R16,R20
	.dbline -2
L7:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r rbit 20 c
	.dbend
	.dbfunc e DS18B20_WriteChar _DS18B20_WriteChar fV
;           temp -> R20
;              i -> R22
;            val -> R10
	.even
_DS18B20_WriteChar::
	xcall push_gset3
	mov R10,R16
	.dbline -1
	.dbline 58
; }
; 
; void DS18B20_WriteChar(byte val)
; {
	.dbline 61
;     byte i;
; 	byte temp;
; 	temp = val;
	mov R20,R10
	.dbline 62
; 	for(i = 0;i<8;i++)
	clr R22
	xjmp L14
L11:
	.dbline 63
; 	{
	.dbline 64
; 	    temp =val>>i;
	mov R16,R10
	mov R17,R22
	xcall lsr8
	mov R20,R16
	.dbline 65
; 		if((temp&0x01) == 0x01)
	mov R24,R20
	andi R24,1
	cpi R24,1
	brne L15
	.dbline 66
; 		DS18B20_WriteBit(1);
	ldi R16,1
	xcall _DS18B20_WriteBit
	xjmp L16
L15:
	.dbline 68
; 		else 
; 		DS18B20_WriteBit(0);
	clr R16
	xcall _DS18B20_WriteBit
L16:
	.dbline 71
L12:
	.dbline 62
	inc R22
L14:
	.dbline 62
	cpi R22,8
	brlo L11
	.dbline 73
; 		
; 		
; 	}
; 	
; 	 delay_nus(60);      //延时
	ldi R16,60
	ldi R17,0
	xcall _delay_nus
	.dbline -2
L10:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r i 22 c
	.dbsym r val 10 c
	.dbend
	.dbfunc e DS18B20_ReadChar _DS18B20_ReadChar fc
;         R_data -> R20
;              i -> R22
	.even
_DS18B20_ReadChar::
	xcall push_gset2
	.dbline -1
	.dbline 77
; }
; 
; byte DS18B20_ReadChar(void)	   //读一个字节数据函数
; {					    
	.dbline 78
;   unsigned char i = 0;
	clr R22
	.dbline 79
;   byte R_data = 0;
	clr R20
	.dbline 81
;    
;    for (i=0;i<8;i++)
	xjmp L21
L18:
	.dbline 82
;     {
	.dbline 83
; 	  if(DS18B20_ReadBit())
	xcall _DS18B20_ReadBit
	tst R16
	breq L22
	.dbline 84
; 	    R_data |=1<<i;
	ldi R16,1
	mov R17,R22
	xcall lsl8
	or R20,R16
L22:
	.dbline 85
L19:
	.dbline 81
	inc R22
L21:
	.dbline 81
	cpi R22,8
	brlo L18
	.dbline 86
;     }
;     return (R_data);
	mov R16,R20
	.dbline -2
L17:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r R_data 20 c
	.dbsym r i 22 c
	.dbend
	.dbfunc e ReadTemperature _ReadTemperature fi
;      tempValue -> R20,R21
;            Rom -> y+0
	.even
_ReadTemperature::
	xcall push_gset1
	sbiw R28,2
	.dbline -1
	.dbline 90
; }
; 
; unsigned int ReadTemperature(void)	 //读取温度函数
; {
	.dbline 93
; 	 byte Rom[2];
;      unsigned int tempValue;
; 	 if(DS18B20_Reset())
	xcall _DS18B20_Reset
	tst R16
	breq L25
	.dbline 94
; 	 {
	.dbline 95
; 		return 0xffff;
	ldi R16,65535
	ldi R17,255
	xjmp L24
L25:
	.dbline 97
; 	 }
;      DS18B20_WriteChar(0xcc) ;  //跳过读序号列号的操作
	ldi R16,204
	xcall _DS18B20_WriteChar
	.dbline 98
;      DS18B20_WriteChar(0x44) ;  //启动温度转换
	ldi R16,68
	xcall _DS18B20_WriteChar
	.dbline 99
; 	 delay_nus(100); 
	ldi R16,100
	ldi R17,0
	xcall _delay_nus
	.dbline 100
;       if(DS18B20_Reset())
	xcall _DS18B20_Reset
	tst R16
	breq L27
	.dbline 101
; 	 {
	.dbline 102
; 		return 0xffff;
	ldi R16,65535
	ldi R17,255
	xjmp L24
L27:
	.dbline 104
; 	 }
;      DS18B20_WriteChar(0xCC) ;  //跳过读序号列号的操作
	ldi R16,204
	xcall _DS18B20_WriteChar
	.dbline 105
;      DS18B20_WriteChar(0xBE) ;  //读取温度寄存器
	ldi R16,190
	xcall _DS18B20_WriteChar
	.dbline 106
;       delay_nus(200); 
	ldi R16,200
	ldi R17,0
	xcall _delay_nus
	.dbline 107
;      Rom[0] = DS18B20_ReadChar() ;   //读温度低8位
	xcall _DS18B20_ReadChar
	std y+0,R16
	.dbline 108
;      Rom[1] = DS18B20_ReadChar() ;   //读温度高8位 
	xcall _DS18B20_ReadChar
	std y+1,R16
	.dbline 112
; 	/* *tempValue = Rom[1];
; 	 *tempValue <<= 8;
; 	 *tempValue |= Rom[0];*/
; 	 tempValue = Rom[1];
	mov R20,R16
	clr R21
	.dbline 113
; 	 tempValue <<= 8;
	mov R21,R20
	clr R20
	.dbline 114
; 	 tempValue |= Rom[0];
	ldd R2,y+0
	clr R3
	or R20,R2
	or R21,R3
	.dbline 115
; 	 return tempValue;
	movw R16,R20
	.dbline -2
L24:
	adiw R28,2
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r tempValue 20 i
	.dbsym l Rom 0 A[2:2]c
	.dbend

⌨️ 快捷键说明

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