📄 ds18b20.s
字号:
.module ds18b20.c
.area text(rom, con, rel)
.dbfile E:\DS18B20\ds18b20.c
.dbfunc e rst_DS18B20 _rst_DS18B20 fc
; errTime -> R20
.even
_rst_DS18B20::
xcall push_gset1
.dbline -1
.dbline 22
; /****************************************
; ** 文 件 名: DS18B20.c **
; ** 日 期: 2007年04月08日 **
; ** 描 述: DS18B20函数 **
; ** 作 者:tonghe **
; ** 版 本: V1.0 **
; ** 主控芯片:M16 **
; ** 晶振频率:7.3728MHZ, 波特率9600 **
; ****************************************/
; #include <iom16v.h>
; #include <macros.h>
; #include <E:\DS18B20\define.h>
; #include <E:\DS18B20\function.h>
;
; /****************************************
; * 函数名称: uchar rst_DS18B20(void) *
; * 函数功能:DS18B20初始化 *
; * 入 口:无 *
; * 返 回:0x00为失败,0xFF为成功 *
; ****************************************/
; uchar rst_DS18B20(void)
; {
.dbline 23
; uchar errTime=0;
clr R20
.dbline 24
; RLS_DS18B20; //释放总线
cbi 0x11,4
.dbline 25
; _NOP();
nop
.dbline 26
; HLD_DS18B20; //Maga16控制总线
sbi 0x11,4
.dbline 27
; CLR_DS18B20; //强制拉低
cbi 0x12,4
.dbline 28
; delay_us(255); //209.42us
ldi R16,255
xcall _delay_us
.dbline 29
; delay_us(255); //209.42us
ldi R16,255
xcall _delay_us
.dbline 30
; delay_us(255); //83.28us
ldi R16,255
xcall _delay_us
.dbline 32
; //以上的三个延时大于480us
; RLS_DS18B20; //释放总线,总线自动上拉
cbi 0x11,4
.dbline 33
; _NOP();
nop
xjmp L3
L2:
.dbline 35
; while(STU_DS18B20)
; {
.dbline 36
; delay_us(4); //5.15us
ldi R16,4
xcall _delay_us
.dbline 37
; errTime++;
inc R20
.dbline 38
; if(errTime>20)
ldi R24,20
cp R24,R20
brsh L5
.dbline 39
; return(0x00); //如果等大于5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
clr R16
xjmp L1
L5:
.dbline 40
L3:
.dbline 34
sbic 0x10,4
rjmp L2
.dbline 41
; }
; errTime=0;
clr R20
xjmp L8
L7:
.dbline 43
; while(!(STU_DS18B20))
; {
.dbline 44
; delay_us(4); //5.15us
ldi R16,4
xcall _delay_us
.dbline 45
; errTime++;
inc R20
.dbline 46
; if(errTime>50)
ldi R24,50
cp R24,R20
brsh L10
.dbline 47
; return(0x00); //如果等大于5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
clr R16
xjmp L1
L10:
.dbline 48
L8:
.dbline 42
sbis 0x10,4
rjmp L7
.dbline 49
; }
; return(0xff);
ldi R16,255
.dbline -2
L1:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r errTime 20 c
.dbend
.dbfunc e read_DS18B20 _read_DS18B20 fc
; retVal -> R20
; i -> R22
.even
_read_DS18B20::
xcall push_gset2
.dbline -1
.dbline 59
; }
;
; /****************************************
; * 函数名称: uchar read_DS18B20(void) *
; * 函数功能:读DS18B20一个字节 *
; * 入 口:无 *
; * 返 回:读出的数据字节 *
; ****************************************/
; uchar read_DS18B20(void)
; {
.dbline 61
; uchar i;
; uchar retVal=0;
clr R20
.dbline 62
; RLS_DS18B20; //释放总线
cbi 0x11,4
.dbline 63
; for(i=8;i>0;i--)
ldi R22,8
xjmp L16
L13:
.dbline 64
; {
.dbline 65
; retVal>>=1;
lsr R20
.dbline 66
; HLD_DS18B20; //Maga16控制总线
sbi 0x11,4
.dbline 67
; CLR_DS18B20; //强制拉低
cbi 0x12,4
.dbline 68
; delay_us(5); //延时大于1us
ldi R16,5
xcall _delay_us
.dbline 69
; RLS_DS18B20; //释放总线,DS18B20会将总线强制拉低
cbi 0x11,4
.dbline 70
; delay_us(2);
ldi R16,2
xcall _delay_us
.dbline 71
; if(STU_DS18B20)
sbis 0x10,4
rjmp L17
.dbline 72
; retVal|=0x80;
ori R20,128
L17:
.dbline 73
ldi R16,16
xcall _delay_us
.dbline 74
ldi R16,16
xcall _delay_us
.dbline 75
cbi 0x11,4
.dbline 76
ldi R16,35
xcall _delay_us
.dbline 77
L14:
.dbline 63
dec R22
L16:
.dbline 63
clr R2
cp R2,R22
brlo L13
.dbline 78
; delay_us(16); //14.92us
; delay_us(16); //14.92us
; RLS_DS18B20; //释放总线
; delay_us(35); //30.38us
; }
; delay_us(2); //2.71us(大于1us就行了)
ldi R16,2
xcall _delay_us
.dbline 79
; return(retVal);
mov R16,R20
.dbline -2
L12:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r retVal 20 c
.dbsym r i 22 c
.dbend
.dbfunc e write_DS18B20 _write_DS18B20 fV
; temp -> R20
; i -> R22
; wb -> R10
.even
_write_DS18B20::
xcall push_gset3
mov R10,R16
.dbline -1
.dbline 89
; }
;
; /****************************************
; * 函数名称: uchar write_DS18B20(void) *
; * 函数功能:写DS18B20一个字节 *
; * 入 口:需写入的字节数据wb *
; * 返 回:无 *
; ****************************************/
; void write_DS18B20(uchar wb)
; {
.dbline 92
; uchar i;
; uchar temp;
; RLS_DS18B20; //释放总线
cbi 0x11,4
.dbline 93
; for(i=0;i<8;i++)
clr R22
xjmp L23
L20:
.dbline 94
; {
.dbline 95
; HLD_DS18B20; //Maga16控制总线
sbi 0x11,4
.dbline 96
; CLR_DS18B20; //强制拉低
cbi 0x12,4
.dbline 97
; delay_us(16); //14.92us
ldi R16,16
xcall _delay_us
.dbline 98
; temp=wb>>i;
mov R16,R10
mov R17,R22
xcall lsr8
mov R20,R16
.dbline 99
; temp&=0x01;
andi R20,1
.dbline 100
; if(temp)
breq L24
.dbline 101
; RLS_DS18B20; //释放总线
cbi 0x11,4
xjmp L25
L24:
.dbline 103
; else
; CLR_DS18B20; //强制拉低
cbi 0x12,4
L25:
.dbline 104
ldi R16,16
xcall _delay_us
.dbline 105
ldi R16,35
xcall _delay_us
.dbline 106
cbi 0x11,4
.dbline 107
ldi R16,2
xcall _delay_us
.dbline 108
L21:
.dbline 93
inc R22
L23:
.dbline 93
cpi R22,8
brlo L20
.dbline -2
L19:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r i 22 c
.dbsym r wb 10 c
.dbend
.dbfunc e read_Temp _read_Temp fi
; x -> R20,R21
; tempH -> R20
; tempL -> R22
.even
_read_Temp::
xcall push_gset2
.dbline -1
.dbline 118
; delay_us(16); //14.92us
; delay_us(35); //30.38us
; RLS_DS18B20; //释放总线
; delay_us(2); //2.71us(大于1us就行了)
; }
; }
;
; /****************************************
; * 函数名称: uint read_Temp(void) *
; * 函数功能:读DS18B20温度 *
; * 入 口:无 *
; * 返 回:读出的数据字节 *
; ****************************************/
; uint read_Temp(void)
; {
.dbline 121
; uchar tempL,tempH;
; uint x;
; rst_DS18B20();
xcall _rst_DS18B20
.dbline 122
; write_DS18B20(0xcc); //跳过ROM
ldi R16,204
xcall _write_DS18B20
.dbline 123
; write_DS18B20(0x44); //启动温度转换
ldi R16,68
xcall _write_DS18B20
.dbline 124
; delay_us(1);
ldi R16,1
xcall _delay_us
.dbline 125
; rst_DS18B20();
xcall _rst_DS18B20
.dbline 126
; write_DS18B20(0xcc); //跳过ROM
ldi R16,204
xcall _write_DS18B20
.dbline 127
; write_DS18B20(0xbe); //读数据
ldi R16,190
xcall _write_DS18B20
.dbline 128
; tempL=read_DS18B20();
xcall _read_DS18B20
mov R22,R16
.dbline 129
; tempH=read_DS18B20();
xcall _read_DS18B20
mov R20,R16
.dbline 130
; x=(tempH<<8)|tempL;
mov R21,R20
mov R20,R22
.dbline 131
; return(x);
movw R16,R20
.dbline -2
L26:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r x 20 i
.dbsym r tempH 20 c
.dbsym r tempL 22 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -