📄 ds18b20.s
字号:
.dbline -2
.dbline 31
L31:
.dbline 0 ; func end
ret
.dbend
.dbfunc e B20_readB _B20_readB fc
; retd -> R20
; i -> R22
.even
_B20_readB::
xcall push_gset2
.dbline -1
.dbline 39
.dbline 40
clr R20
.dbline 41
clr R22
xjmp L42
L39:
.dbline 42
.dbline 43
lsr R20
.dbline 44
sbi 0x1a,5
.dbline 45
cbi 0x1b,5
.dbline 46
sbi 0x1b,5
.dbline 47
ldi R16,5
ldi R17,0
xcall _Delayus
.dbline 48
cbi 0x1a,5
.dbline 49
sbis 0x19,5
rjmp L43
.dbline 50
.dbline 51
ori R20,128
.dbline 52
L43:
.dbline 53
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 54
L40:
.dbline 41
inc R22
L42:
.dbline 41
cpi R22,8
brlo L39
.dbline 55
mov R16,R20
.dbline -2
L38:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r retd 20 c
.dbsym r i 22 c
.dbend
.dbfunc e B20_writeB _B20_writeB fV
; i -> R20
; wrd -> R22
.even
_B20_writeB::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 64
.dbline 66
clr R20
xjmp L49
L46:
.dbline 67
.dbline 68
sbi 0x1a,5
.dbline 69
cbi 0x1b,5
.dbline 70
ldi R16,1
ldi R17,0
xcall _Delayus
.dbline 71
sbrs R22,0
rjmp L50
.dbline 72
.dbline 73
sbi 0x1b,5
.dbline 74
xjmp L51
L50:
.dbline 76
.dbline 77
cbi 0x1b,5
.dbline 78
L51:
.dbline 79
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 80
sbi 0x1b,5
.dbline 81
lsr R22
.dbline 82
L47:
.dbline 66
inc R20
L49:
.dbline 66
cpi R20,8
brlo L46
.dbline 83
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline -2
.dbline 84
L45:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r wrd 22 c
.dbend
.dbfunc e Read_temp _Read_temp fi
; temp -> R20,R21
; temph -> R22
; templ -> R20
.even
_Read_temp::
xcall push_gset2
.dbline -1
.dbline 92
; /*******************************************
; 函数名称: Read_temp
; 功 能: 读取温度值
; 参 数: 无
; 返回值 : rettemp--返回的温度值
; /********************************************/
; uint Read_temp(void)
; {
.dbline 95
; uchar templ,temph;
; uint temp;
; B20_init(); //初始化,每次写命令都从初始化开始
xcall _B20_init
.dbline 96
; B20_writeB(0xcc); //跳过ROM
ldi R16,204
xcall _B20_writeB
.dbline 97
; B20_writeB(0x44); //启动温度转换
ldi R16,68
xcall _B20_writeB
.dbline 98
; B20_init(); //初始化,每次写命令都从初始化开始
xcall _B20_init
.dbline 99
; B20_writeB(0xcc); //跳过ROM
ldi R16,204
xcall _B20_writeB
.dbline 100
; B20_writeB(0xbe); //读寄存器
ldi R16,190
xcall _B20_writeB
.dbline 101
; templ=B20_readB(); //读温度低字节
xcall _B20_readB
mov R20,R16
.dbline 102
; temph=B20_readB(); //读温度高字节
xcall _B20_readB
mov R22,R16
.dbline 103
; temp=templ+temph*256;//将温度整理成16位变量
mov R18,R22
clr R19
ldi R16,256
ldi R17,1
xcall empy16s
mov R2,R20
clr R3
add R2,R16
adc R3,R17
movw R20,R2
.dbline 104
; return temp; //返回16位变量
mov R16,R2
mov R17,R3
.dbline -2
L52:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r temp 20 i
.dbsym r temph 22 c
.dbsym r templ 20 c
.dbend
.dbfunc e Num_BCD _Num_BCD fpc
; rept -> R20,R21
; chr -> y+0
; i -> R22
; num -> R10,R11
.even
_Num_BCD::
xcall push_gset3
movw R10,R16
sbiw R28,3
.dbline -1
.dbline 113
; }
; /*******************************************
; 函数名称: Num_BCD
; 功 能: 将一个字节的整数转换成三位BCD码
; 参 数: num--需要转换的整数
; 返回值 : chr--三位BCD码数组指针
; /********************************************/
; uchar* Num_BCD(uint num)
; {
.dbline 116
; uchar i,chr[3];
; uchar *rept;
; rept=&(chr[0]); //返回指针指向BCD码数组
movw R20,R28
.dbline 117
; for(i=0;i<3;i++)
clr R22
xjmp L57
L54:
.dbline 118
.dbline 119
mov R2,R22
clr R3
ldi R30,2
ldi R31,0
sub R30,R2
sbc R31,R3
movw R24,R28
add R30,R24
adc R31,R25
ldi R18,10
ldi R19,0
movw R16,R10
xcall mod16u
std z+0,R16
.dbline 120
ldi R18,10
ldi R19,0
movw R16,R10
xcall div16u
movw R10,R16
.dbline 121
L55:
.dbline 117
inc R22
L57:
.dbline 117
cpi R22,3
brlo L54
.dbline 122
; {
; chr[2-i]=num%10; //对10取余数(其实是求模,但是对于正数,取余与求模是相等的)
; num/=10; //除以10,为取出下一位做准备
; }
; return rept; //返回指针
mov R16,R20
mov R17,R21
.dbline -2
L53:
adiw R28,3
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r rept 20 pc
.dbsym l chr 0 A[3:3]c
.dbsym r i 22 c
.dbsym r num 10 i
.dbend
.dbfunc e main _main fV
; t -> R22,R23
; temppt -> R10,R11
; temp -> y+0
; i -> R20
.even
_main::
sbiw R28,7
.dbline -1
.dbline 131
; }
; /*******************************************
; 函数名称: main
; 功 能: 完成温度的读取与显示
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void main(void)
; {
.dbline 135
; uint t;
; uchar *temppt;
; uchar i,temp[3];
; Board_init( ); //初始化开发板
xcall _Board_init
xjmp L60
L59:
.dbline 137
; while(1)
; {
.dbline 138
; t=Read_temp(); //读取温度值
xcall _Read_temp
movw R22,R16
.dbline 139
; t*=0.625; //转换成实际温度的10倍
ldi R16,<L64
ldi R17,>L64
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
ldi R16,<L65
ldi R17,>L65
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R22
lsr R17
ror R16
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall empy32fs
movw R16,R22
andi R16,1
andi R17,0
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall add32fs
xcall empy32f
movw R30,R28
std z+3,R16
std z+4,R17
std z+5,R18
std z+6,R19
ldd R2,z+3
ldd R3,z+4
ldd R4,z+5
ldd R5,z+6
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L66
ldi R17,>L66
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall cmp32f
brlt L62
movw R30,R28
ldd R2,z+3
ldd R3,z+4
ldd R4,z+5
ldd R5,z+6
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L66
ldi R17,>L66
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall sub32f
xcall fp2int
movw R20,R16
subi R20,0 ; offset = 32768
sbci R21,128
xjmp L63
L62:
movw R30,R28
ldd R16,z+3
ldd R17,z+4
ldd R18,z+5
ldd R19,z+6
xcall fp2int
movw R20,R16
L63:
movw R22,R20
.dbline 140
; temppt=Num_BCD(t);//将实际温度的10倍转换成BCD码
movw R16,R22
xcall _Num_BCD
movw R10,R16
.dbline 141
; for(i=0;i<3;i++) //将转换后的BCD码存入显示数组
clr R20
xjmp L70
L67:
.dbline 142
.dbline 143
mov R30,R20
clr R31
add R30,R10
adc R31,R11
ldd R2,z+0
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 144
L68:
.dbline 141
inc R20
L70:
.dbline 141
cpi R20,3
brlo L67
.dbline 145
; {
; temp[i]=*(temppt+i);
; }
; for(i=0;i<3;i++) //显示温度
clr R20
xjmp L74
L71:
.dbline 146
; {
.dbline 147
; if(i==1)
cpi R20,1
brne L75
.dbline 148
; {
.dbline 149
; temp[1]+=16; //如果是各位,则加上小数点(数码管的译码数组有所改变,读者可以看10_DS18B20文件夹下的SMG.C文件)
ldd R24,y+1
subi R24,240 ; addi 16
std y+1,R24
.dbline 150
; }
L75:
.dbline 151
mov R18,R20
subi R18,255 ; addi 1
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _One_smg_display
.dbline 152
ldi R16,5
ldi R17,0
xcall _Delayms
.dbline 153
L72:
.dbline 145
inc R20
L74:
.dbline 145
cpi R20,3
brlo L71
.dbline 154
L60:
.dbline 136
xjmp L59
X0:
.dbline -2
.dbline 155
; One_smg_display(temp[i],i+1);
; Delayms(5);
; }
; }
; }
L58:
adiw R28,7
.dbline 0 ; func end
ret
.dbsym r t 22 i
.dbsym r temppt 10 pc
.dbsym l temp 0 A[3:3]c
.dbsym r i 20 c
.dbend
.area lit(rom, con, rel)
L66:
.word 0x0,0x4700
L65:
.word 0x0,0x4000
L64:
.word 0x0,0x3f20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -