📄 ds1820.s
字号:
.module DS1820.C
.area text(rom, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\016-DS18B20-LED4\DS1820.C
.dbfunc e delay_10us _delay_10us fV
; i -> R16
.even
_delay_10us::
.dbline -1
.dbline 33
; /*
; DS18B20操作模块
;
; 1、DS18B20的电源脚接到VCC及GND上面,数据线接到PA7口。
; 2、晶振频率为内部1MHz。
; 3、DS18B20由PA7口实现单总线访问,实现读取温度。
; 4、函数中有对中断的保护处理,更具有实用价值。
; 5、此文件可以直接嵌入到项目中使用。
;
; AVR mega16学习板
; AVR_AFA
; www.iccavr.com
; 11:48 2007-6-30
; */
;
; #include <iom128v.h>
; #include <macros.h>
;
; #define DQ_IN DDRF &= ~(1 << PF2) /*设置输入*/
; #define DQ_OUT DDRF |= (1 << PF2) /*设置输出*/
; #define DQ_CLR PORTF &= ~(1 << PF2) /*置低电平*/
; #define DQ_SET PORTF |= (1 << PF2) /*置高电平*/
; #define DQ_R PINF & (1 << PF2) /*读了电平*/
;
; unsigned char flag; /*中断标志缓存*/
;
; /*
; 延时函数
;
; 延时时间:i X 10 + 16uS。
; CPU频率为:1MHz。
; */
; void delay_10us(unsigned char i) {
.dbline 35
;
; if (i == 0) {
tst R16
brne L5
.dbline 35
.dbline 36
; return ;
xjmp L1
L4:
.dbline 38
.dbline 39
nop
.dbline 40
nop
.dbline 41
nop
.dbline 42
nop
.dbline 43
L5:
.dbline 38
; }
; while (i--) {
mov R2,R16
clr R3
subi R16,1
tst R2
brne L4
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e ds1820_reset _ds1820_reset fc
; i -> R20
.even
_ds1820_reset::
xcall push_gset1
.dbline -1
.dbline 47
; NOP();
; NOP();
; NOP();
; NOP();
; }
; }
;
; /*DS18B20复位函数*/
; unsigned char ds1820_reset(void) {
.dbline 50
;
; unsigned char i;
; flag = SREG; /*中断保护*/
in R2,0x3f
sts _flag,R2
.dbline 51
; CLI(); /*关中断*/
cli
.dbline 52
; DQ_OUT;
lds R24,97
ori R24,4
sts 97,R24
.dbline 53
; DQ_CLR;
lds R24,98
andi R24,251
sts 98,R24
.dbline 54
; delay_10us(49); /*延时500uS(480-960)*/
ldi R16,49
xcall _delay_10us
.dbline 55
; DQ_SET;
lds R24,98
ori R24,4
sts 98,R24
.dbline 56
; DQ_IN;
lds R24,97
andi R24,251
sts 97,R24
.dbline 57
; delay_10us(7); /*延时80uS*/
ldi R16,7
xcall _delay_10us
.dbline 58
; i = DQ_R;
in R20,0x0
andi R20,4
.dbline 59
; delay_10us(49); /*延时500uS(保持>480uS)*/
ldi R16,49
xcall _delay_10us
.dbline 60
; if (flag & 0x80) { /*恢复中断状态*/
lds R2,_flag
sbrs R2,7
rjmp L8
.dbline 60
.dbline 61
; SEI();
sei
.dbline 62
; }
L8:
.dbline 63
; if (i) {
tst R20
breq L10
.dbline 63
.dbline 64
; return 0x00;
clr R16
xjmp L7
L10:
.dbline 66
; }
; else {
.dbline 67
; return 0x01;
ldi R16,1
.dbline -2
L7:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e ds1820_read_byte _ds1820_read_byte fc
; value -> R20
; i -> R22
.even
_ds1820_read_byte::
xcall push_gset2
.dbline -1
.dbline 72
; }
; }
;
; /*DS18B20字节读取函数*/
; unsigned char ds1820_read_byte(void) {
.dbline 75
;
; unsigned char i;
; unsigned char value = 0;
clr R20
.dbline 76
; flag = SREG; /*中断保护*/
in R2,0x3f
sts _flag,R2
.dbline 77
; CLI(); /*关中断*/
cli
.dbline 78
ldi R22,8
xjmp L16
L13:
.dbline 78
; for (i = 8; i != 0; i--) {
.dbline 79
; value >>= 1;
lsr R20
.dbline 80
; DQ_OUT;
lds R24,97
ori R24,4
sts 97,R24
.dbline 81
; DQ_CLR;
lds R24,98
andi R24,251
sts 98,R24
.dbline 82
; NOP(); /*延时4uS*/
nop
.dbline 83
; NOP();
nop
.dbline 84
; NOP();
nop
.dbline 85
; NOP();
nop
.dbline 86
; DQ_SET;
lds R24,98
ori R24,4
sts 98,R24
.dbline 87
; DQ_IN;
lds R24,97
andi R24,251
sts 97,R24
.dbline 88
; NOP(); /*延时10uS*/
nop
.dbline 89
; NOP();
nop
.dbline 90
; NOP();
nop
.dbline 91
; NOP();
nop
.dbline 92
; NOP();
nop
.dbline 93
; NOP();
nop
.dbline 94
; NOP();
nop
.dbline 95
; NOP();
nop
.dbline 96
; NOP();
nop
.dbline 97
; NOP();
nop
.dbline 98
; if (DQ_R) {
sbis 0x0,2
rjmp L17
.dbline 98
.dbline 99
; value|=0x80;
ori R20,128
.dbline 100
; }
L17:
.dbline 101
ldi R16,5
xcall _delay_10us
.dbline 102
L14:
.dbline 78
dec R22
L16:
.dbline 78
tst R22
brne L13
.dbline 103
; delay_10us(5); /*延时60uS*/
; }
; if (flag & 0x80) { /*恢复中断状态*/
lds R2,_flag
sbrs R2,7
rjmp L19
.dbline 103
.dbline 104
; SEI();
sei
.dbline 105
; }
L19:
.dbline 106
; return(value);
mov R16,R20
.dbline -2
L12:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r value 20 c
.dbsym r i 22 c
.dbend
.dbfunc e ds1820_write_byte _ds1820_write_byte fV
; i -> R20
; value -> R22
.even
_ds1820_write_byte::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 110
; }
;
; /*DS18B20字节写入函数*/
; void ds1820_write_byte(unsigned char value) {
.dbline 113
;
; unsigned char i;
; flag = SREG; /*中断保护*/
in R2,0x3f
sts _flag,R2
.dbline 114
; CLI(); /*关中断*/
cli
.dbline 115
ldi R20,8
xjmp L25
L22:
.dbline 115
; for (i = 8; i != 0; i--) {
.dbline 116
; DQ_OUT;
lds R24,97
ori R24,4
sts 97,R24
.dbline 117
; DQ_CLR;
lds R24,98
andi R24,251
sts 98,R24
.dbline 118
; NOP(); /*延时4uS*/
nop
.dbline 119
; NOP();
nop
.dbline 120
; NOP();
nop
.dbline 121
; NOP();
nop
.dbline 122
; if (value & 0x01) {
sbrs R22,0
rjmp L26
.dbline 122
.dbline 123
; DQ_SET;
lds R24,98
ori R24,4
sts 98,R24
.dbline 124
; }
L26:
.dbline 125
ldi R16,7
xcall _delay_10us
.dbline 126
lds R24,98
ori R24,4
sts 98,R24
.dbline 127
lsr R22
.dbline 128
L23:
.dbline 115
dec R20
L25:
.dbline 115
tst R20
brne L22
.dbline 129
lds R2,_flag
sbrs R2,7
rjmp L28
.dbline 129
.dbline 130
sei
.dbline 131
L28:
.dbline -2
L21:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r value 22 c
.dbend
.dbfunc e ds1820_start _ds1820_start fV
.even
_ds1820_start::
.dbline -1
.dbline 135
; delay_10us(7); /*延时80uS*/
; DQ_SET; /*位结束*/
; value >>= 1;
; }
; if (flag & 0x80) { /*恢复中断状态*/
; SEI();
; }
; }
;
; /*启动ds1820转换*/
; void ds1820_start(void) {
.dbline 137
;
; ds1820_reset();
xcall _ds1820_reset
.dbline 138
; ds1820_write_byte(0xCC); /*勿略地址*/
ldi R16,204
xcall _ds1820_write_byte
.dbline 139
; ds1820_write_byte(0x44); /*启动转换*/
ldi R16,68
xcall _ds1820_write_byte
.dbline -2
L30:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ds1820_read_temp _ds1820_read_temp fi
; buf -> y+0
; i -> R20,R21
.even
_ds1820_read_temp::
xcall push_gset1
sbiw R28,9
.dbline -1
.dbline 143
; }
;
; /*DS8B20读取温度信息*/
; unsigned int ds1820_read_temp(void) {
.dbline 148
;
; unsigned int i;
; unsigned char buf[9];
;
; ds1820_reset();
xcall _ds1820_reset
.dbline 149
; ds1820_write_byte(0xCC); /*勿略地址*/
ldi R16,204
xcall _ds1820_write_byte
.dbline 150
; ds1820_write_byte(0xBE); /*读取温度*/
ldi R16,190
xcall _ds1820_write_byte
.dbline 151
clr R20
clr R21
xjmp L35
L32:
.dbline 151
.dbline 152
xcall _ds1820_read_byte
movw R24,R28
movw R30,R20
add R30,R24
adc R31,R25
std z+0,R16
.dbline 153
L33:
.dbline 151
subi R20,255 ; offset = 1
sbci R21,255
L35:
.dbline 151
; for (i = 0; i < 9; i++) {
cpi R20,9
ldi R30,0
cpc R21,R30
brlo L32
.dbline 154
; buf[i] = ds1820_read_byte();
; }
; i = buf[1];
ldd R20,y+1
clr R21
.dbline 155
; i <<= 8;
mov R21,R20
clr R20
.dbline 156
; i |= buf[0];
ldd R2,y+0
clr R3
or R20,R2
or R21,R3
.dbline 158
;
; return i;
movw R16,R20
.dbline -2
L31:
adiw R28,9
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym l buf 0 A[9:9]c
.dbsym r i 20 i
.dbend
.area bss(ram, con, rel)
.dbfile E:\ICCAVR\project\AVRMEG~3\icc\016-DS18B20-LED4\DS1820.C
_flag::
.blkb 1
.dbsym e flag _flag c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -