📄 ds18b20.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 + -