📄 dsi8b20.s
字号:
.module dsi8b20.c
.area text(rom, con, rel)
.dbfile D:\开发板\source\ds18b20\dsi8b20.c
.dbfunc e reset_ov _reset_ov fc
; c -> R20
.even
_reset_ov::
rcall push_gset1
.dbline -1
.dbline 24
; /******************************************/
; /* 北京MCU学习之家 */
; /* ADC通信演示程序 */
; /* 作者:白如冰 */
; /* 2005年10月1日 */
; /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
; /******************************************/
; // 1、使用WIN9X/WIN2000/XP的超级终端,进行通信调试。
; // 2、通信波特率为9600(8位数据,无校验,1位停止位,无数据流控制)。
; #include <iom8v.h>
; #include <macros.h>
; extern void delay_us(unsigned int n);
; extern void delay_ms(unsigned int n);
; extern void uart_init(void);
; extern void putchar(unsigned char c);
; extern void puts(char *s);
; extern void puts_hh(char *s);
;
; #define ds1820_data_s PORTD|=BIT(PORTD6)
; #define ds1820_data_c PORTD&=~BIT(PORTD6)
;
;
; unsigned char reset_ov(void) //18b20 复位函数
; {
.dbline 25
; char c=0;
clr R20
.dbline 26
; ds1820_data_s;
sbi 0x12,6
.dbline 27
; delay_us(1);//6
ldi R16,1
ldi R17,0
rcall _delay_us
.dbline 28
; ds1820_data_c;
cbi 0x12,6
.dbline 29
; delay_us(660);//500
ldi R16,660
ldi R17,2
rcall _delay_us
.dbline 30
; ds1820_data_s;
sbi 0x12,6
.dbline 31
; delay_us(73);//60us
ldi R16,73
ldi R17,0
rcall _delay_us
.dbline 32
; c=(PIND&=0x40);//dq_in;
in R24,0x10
andi R24,64
out 0x10,R24
mov R20,R24
.dbline 33
; if(c==0x40)
cpi R24,64
brne L2
.dbline 34
; return (0);
clr R16
rjmp L1
L2:
.dbline 36
; else
; {
.dbline 37
; delay_us(326);//250
ldi R16,326
ldi R17,1
rcall _delay_us
.dbline 38
; return (1);
ldi R16,1
.dbline -2
L1:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r c 20 c
.dbend
.dbfunc e write_data _write_data fV
; temp -> R20
; i -> R22
; data -> R10
.even
_write_data::
rcall push_gset3
mov R10,R16
.dbline -1
.dbline 43
; }
; }
;
; void write_data(unsigned char data) //DS18B20写函数
; {
.dbline 45
; unsigned char i,temp;
; temp=data;
mov R20,R10
.dbline 47
;
; for (i=0; i<8; i++)
clr R22
rjmp L8
L5:
.dbline 48
; {
.dbline 49
; if((temp&0x01)&&0x01)
sbrs R20,0
rjmp L9
.dbline 50
; {
.dbline 51
; ds1820_data_c;
cbi 0x12,6
.dbline 52
; delay_us(6);//10
ldi R16,6
ldi R17,0
rcall _delay_us
.dbline 53
; ds1820_data_s;
sbi 0x12,6
.dbline 54
; delay_us(73);//60
ldi R16,73
ldi R17,0
rcall _delay_us
.dbline 55
; }
rjmp L10
L9:
.dbline 57
; else
; {
.dbline 58
; ds1820_data_c;
cbi 0x12,6
.dbline 59
; delay_us(80);//70
ldi R16,80
ldi R17,0
rcall _delay_us
.dbline 60
; ds1820_data_s;
sbi 0x12,6
.dbline 61
; delay_us(1);//6
ldi R16,1
ldi R17,0
rcall _delay_us
.dbline 62
; }
L10:
.dbline 63
lsr R10
.dbline 64
mov R20,R10
.dbline 65
L6:
.dbline 47
inc R22
L8:
.dbline 47
cpi R22,8
brlo L5
.dbline -2
L4:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r i 22 c
.dbsym r data 10 c
.dbend
.dbfunc e read_data _read_data fc
; value -> R20
; i -> R22
.even
_read_data::
rcall push_gset2
.dbline -1
.dbline 70
; data>>=1;
; temp=data;
; }
;
; }
;
; unsigned char read_data(void) //DS18B20 读函数
; {
.dbline 73
; unsigned char i;
;
; char value = 0;
clr R20
.dbline 74
; for (i=0;i<8;i++)
clr R22
rjmp L15
L12:
.dbline 75
; {
.dbline 76
; value>>=1;
lsr R20
.dbline 77
; ds1820_data_c;
cbi 0x12,6
.dbline 78
; delay_us(1);//6
ldi R16,1
ldi R17,0
rcall _delay_us
.dbline 79
; ds1820_data_s;
sbi 0x12,6
.dbline 80
; delay_us(1); //6
ldi R16,1
ldi R17,0
rcall _delay_us
.dbline 83
;
;
; if((PIND&=0x40)==0x40)
in R24,0x10
andi R24,64
out 0x10,R24
cpi R24,64
brne L16
.dbline 84
; value|=0x80;
ori R20,128
L16:
.dbline 85
ldi R16,73
ldi R17,0
rcall _delay_us
.dbline 86
L13:
.dbline 74
inc R22
L15:
.dbline 74
cpi R22,8
brlo L12
.dbline 89
; delay_us(73);//60
; }
;
;
; return(value);
mov R16,R20
.dbline -2
L11:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r value 20 c
.dbsym r i 22 c
.dbend
.dbfunc e init_ds1820 _init_ds1820 fV
; i -> R20
.even
_init_ds1820::
rcall push_gset1
.dbline -1
.dbline 93
; }
;
; void init_ds1820(void)
; {
.dbline 95
; unsigned char i;
; for(i=0;i<40;i++)
clr R20
rjmp L22
L19:
.dbline 96
; {if(reset_ov())
.dbline 96
rcall _reset_ov
tst R16
breq L23
.dbline 97
; break;
rjmp L21
L23:
.dbline 98
L20:
.dbline 95
inc R20
L22:
.dbline 95
cpi R20,40
brlo L19
L21:
.dbline 100
; }
;
; write_data(0xcc); //跳过ROM
ldi R16,204
rcall _write_data
.dbline 101
; write_data(0x4e); //写配置寄存器指令
ldi R16,78
rcall _write_data
.dbline 102
; write_data(0x00);
clr R16
rcall _write_data
.dbline 103
; write_data(0x00);
clr R16
rcall _write_data
.dbline 104
; write_data(0x7f); //配置转换位数为12位,转换时间为750ms
ldi R16,127
rcall _write_data
.dbline 105
; for(i=0;i<40;i++)
clr R20
rjmp L28
L25:
.dbline 106
; {if(reset_ov())
.dbline 106
rcall _reset_ov
tst R16
breq L29
.dbline 107
; break;
rjmp L27
L29:
.dbline 108
L26:
.dbline 105
inc R20
L28:
.dbline 105
cpi R20,40
brlo L25
L27:
.dbline 109
; }
; write_data(0xcc);
ldi R16,204
rcall _write_data
.dbline 110
; write_data(0x44); //转换命令 开始第一次转换
ldi R16,68
rcall _write_data
.dbline -2
L18:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e read_temper _read_temper fi
; temph -> R20
; templ -> R22
; x -> R20,R21
; i -> R10
.even
_read_temper::
rcall push_gset3
.dbline -1
.dbline 115
; }
;
; //读温度值
; unsigned int read_temper(void)
; {
.dbline 118
; unsigned int x;
; unsigned char templ,temph,i;
; for(i=0;i<40;i++)
clr R10
rjmp L35
L32:
.dbline 119
; {if(reset_ov())
.dbline 119
rcall _reset_ov
tst R16
breq L36
.dbline 120
; break;
rjmp L34
L36:
.dbline 121
L33:
.dbline 118
inc R10
L35:
.dbline 118
mov R24,R10
cpi R24,40
brlo L32
L34:
.dbline 124
; }
;
;
; write_data(0xcc); //跳过ROM
ldi R16,204
rcall _write_data
.dbline 125
; write_data(0xbe); //读温度命令
ldi R16,190
rcall _write_data
.dbline 126
; templ=read_data();
rcall _read_data
mov R22,R16
.dbline 127
; temph=read_data();
rcall _read_data
mov R20,R16
.dbline 128
; for(i=0;i<40;i++)
clr R10
rjmp L41
L38:
.dbline 129
; {if(reset_ov())
.dbline 129
rcall _reset_ov
tst R16
breq L42
.dbline 130
; break;
rjmp L40
L42:
.dbline 131
L39:
.dbline 128
inc R10
L41:
.dbline 128
mov R24,R10
cpi R24,40
brlo L38
L40:
.dbline 132
; }
; write_data(0xcc);
ldi R16,204
rcall _write_data
.dbline 133
; write_data(0x44); //转换命令
ldi R16,68
rcall _write_data
.dbline 134
; x=temph;
clr R21
.dbline 135
; x<<=8;
mov R21,R20
clr R20
.dbline 136
; x+=templ;
mov R2,R22
clr R3
add R20,R2
adc R21,R3
.dbline 137
; return x;
movw R16,R20
.dbline -2
L31:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r temph 20 c
.dbsym r templ 22 c
.dbsym r x 20 i
.dbsym r i 10 c
.dbend
.dbfunc e main _main fV
; temper_data -> R20,R21
; temp -> y+0
.even
_main::
sbiw R28,9
.dbline -1
.dbline 140
; }
; void main(void)
; {
.dbline 143
; unsigned char temp[5];
; unsigned int temper_data;
; DDRD=0XFF;
ldi R24,255
out 0x11,R24
.dbline 144
; PORTD=0Xff;
out 0x12,R24
.dbline 145
; uart_init();
rcall _uart_init
.dbline 146
; init_ds1820();
rcall _init_ds1820
rjmp L46
L45:
.dbline 149
;
; while(1)
; {
.dbline 150
; delay_ms(1000);
ldi R16,1000
ldi R17,3
rcall _delay_ms
.dbline 152
;
; temper_data=read_temper();
rcall _read_temper
movw R20,R16
.dbline 153
; temper_data*=0.625;
ldi R16,<L50
ldi R17,>L50
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
ldi R16,<L51
ldi R17,>L51
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R20
lsr R17
ror R16
rcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall empy32fs
movw R16,R20
andi R16,1
andi R17,0
rcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall add32fs
rcall empy32f
movw R30,R28
std z+5,R16
std z+6,R17
std z+7,R18
std z+8,R19
movw R30,R28
ldd R2,z+5
ldd R3,z+6
ldd R4,z+7
ldd R5,z+8
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L52
ldi R17,>L52
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall cmp32f
brlt L48
movw R30,R28
ldd R2,z+5
ldd R3,z+6
ldd R4,z+7
ldd R5,z+8
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L52
ldi R17,>L52
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
rcall sub32f
rcall fp2int
movw R22,R16
subi R22,0 ; offset = 32768
sbci R23,128
rjmp L49
L48:
movw R30,R28
ldd R16,z+5
ldd R17,z+6
ldd R18,z+7
ldd R19,z+8
rcall fp2int
movw R22,R16
L49:
movw R20,R22
.dbline 154
ldi R18,10
ldi R19,0
movw R16,R20
rcall mod16u
movw R24,R16
adiw R24,48
std y+0,R24
.dbline 155
ldi R18,10
ldi R19,0
movw R16,R20
rcall div16u
ldi R18,10
ldi R19,0
rcall mod16u
movw R24,R16
adiw R24,48
std y+1,R24
.dbline 156
ldi R18,100
ldi R19,0
movw R16,R20
rcall div16u
ldi R18,10
ldi R19,0
rcall mod16u
movw R24,R16
adiw R24,48
std y+2,R24
.dbline 157
ldi R16,<L55
ldi R17,>L55
rcall _puts
.dbline 158
ldd R16,y+2
rcall _putchar
.dbline 159
ldd R16,y+1
rcall _putchar
.dbline 160
ldi R16,46
rcall _putchar
.dbline 161
ldd R16,y+0
rcall _putchar
.dbline 162
ldi R16,96
rcall _putchar
.dbline 163
ldi R16,67
rcall _putchar
.dbline 164
ldi R16,<L58
ldi R17,>L58
rcall _puts_hh
.dbline 167
L46:
.dbline 148
rjmp L45
X0:
.dbline -2
L44:
adiw R28,9
.dbline 0 ; func end
ret
.dbsym r temper_data 20 i
.dbsym l temp 0 A[5:5]c
.dbend
.area data(ram, con, rel)
.dbfile D:\开发板\source\ds18b20\dsi8b20.c
L58:
.blkb 3
.area idata
.byte 32,32,0
.area data(ram, con, rel)
.dbfile D:\开发板\source\ds18b20\dsi8b20.c
L55:
.blkb 13
.area idata
.byte 181,177,199,176,206,194,182,200,202,199,163,186,0
.area data(ram, con, rel)
.dbfile D:\开发板\source\ds18b20\dsi8b20.c
.area lit(rom, con, rel)
L52:
.word 0x0,0x4700
L51:
.word 0x0,0x4000
L50:
.word 0x0,0x3f20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -