📄 ds18b20.s
字号:
.module DS18B20.c
.area text(rom, con, rel)
.dbfile F:\我的设计\delphi\uartdispy\mcu\DS18B20.c
.dbfunc e resetDS18B20 _resetDS18B20 fc
; errTime -> R20
.even
_resetDS18B20::
xcall push_gset1
.dbline -1
.dbline 22
; /*********************************Copyright (c)*********************************
; **
; ** 文 件 名: defineLCD1602.h
; ** 最后修改日期: 2005年06月8日
; ** 描 述: 18B20温度检测IC驱动函数文件
; ** 版 本: V1.0
; ** 主 控 芯 片:M16 晶振频率:8 MHZ
; *******************************************************************************/
;
; #include <iom16v.h>
; #include <macros.h>
; #include "function.h"
; #include "define.h"
; #include "defineDS18B20.h"
;
;
; /**********************************************************************
; functionName: BYTE resetDS18B20(void)
; description :DS18B20初始化
; **********************************************************************/
; unsigned char resetDS18B20(void)
; {
.dbline 23
; unsigned char errTime=0;
clr R20
.dbline 24
; RLS_DS18B20; //释放总线
cbi 0x11,6
.dbline 25
; _NOP();
nop
.dbline 26
; HLD_DS18B20; //Maga16控制总线
sbi 0x11,6
.dbline 27
; CLR_DS18B20; //强制拉低
cbi 0x12,6
.dbline 28
; delayUs(255); //209.42us
ldi R16,255
xcall _delayUs
.dbline 29
; delayUs(255); //209.42us
ldi R16,255
xcall _delayUs
.dbline 30
; delayUs(255); //83.28us
ldi R16,255
xcall _delayUs
.dbline 32
; //以上的三个延时大于480us
; RLS_DS18B20; //释放总线,总线自动上拉
cbi 0x11,6
.dbline 33
; _NOP();
nop
xjmp L3
L2:
.dbline 35
; while(STU_DS18B20)
; {
.dbline 36
; delayUs(4); //5.15us
ldi R16,4
xcall _delayUs
.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,6
rjmp L2
.dbline 41
; }
; errTime=0;
clr R20
xjmp L8
L7:
.dbline 43
; while(!(STU_DS18B20))
; {
.dbline 44
; delayUs(4); //5.15us
ldi R16,4
xcall _delayUs
.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,6
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 readByteDS18B20 _readByteDS18B20 fc
; retVal -> R20
; i -> R22
.even
_readByteDS18B20::
xcall push_gset2
.dbline -1
.dbline 58
; }
;
;
; /**********************************************************************
; functionName: BYTE readByteDS18B20(void)
; description :读DS18B20一个字节
; **********************************************************************/
; unsigned char readByteDS18B20(void)
; {
.dbline 60
; unsigned char i;
; unsigned char retVal=0;
clr R20
.dbline 61
; RLS_DS18B20; //释放总线
cbi 0x11,6
.dbline 62
; for(i=8;i>0;i--)
ldi R22,8
xjmp L16
L13:
.dbline 63
; {
.dbline 64
; retVal>>=1;
lsr R20
.dbline 65
; HLD_DS18B20; //Maga16控制总线
sbi 0x11,6
.dbline 66
; CLR_DS18B20; //强制拉低
cbi 0x12,6
.dbline 67
; NOP();
nop
.dbline 68
; NOP();
nop
.dbline 69
; NOP();
nop
.dbline 70
; NOP();
nop
.dbline 71
; NOP();
nop
.dbline 72
; NOP();
nop
.dbline 73
; NOP();
nop
.dbline 74
; NOP(); //延时大于1us
nop
.dbline 75
; RLS_DS18B20; //释放总线,DS18B20会将总线强制拉低
cbi 0x11,6
.dbline 76
; NOP();
nop
.dbline 77
; NOP();
nop
.dbline 78
; NOP();
nop
.dbline 79
; if(STU_DS18B20)
sbis 0x10,6
rjmp L17
.dbline 80
; retVal|=0x80;
ori R20,128
L17:
.dbline 81
ldi R16,16
xcall _delayUs
.dbline 82
ldi R16,16
xcall _delayUs
.dbline 83
cbi 0x11,6
.dbline 84
ldi R16,35
xcall _delayUs
.dbline 85
L14:
.dbline 62
dec R22
L16:
.dbline 62
clr R2
cp R2,R22
brlo L13
.dbline 86
; delayUs(16); //14.92us
; delayUs(16); //14.92us
; RLS_DS18B20; //释放总线
; delayUs(35); //30.38us
; }
; delayUs(1); //2.71us(大于1us就行了)
ldi R16,1
xcall _delayUs
.dbline 87
; 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 writeByteDS18B20 _writeByteDS18B20 fV
; temp -> R20
; i -> R22
; wb -> R10
.even
_writeByteDS18B20::
xcall push_gset3
mov R10,R16
.dbline -1
.dbline 96
; }
;
;
; /**********************************************************************
; functionName: BYTE readByteDS18B20(void)
; description :写DS18B20一个字节
; **********************************************************************/
; void writeByteDS18B20(BYTE wb)
; {
.dbline 99
; unsigned char i;
; unsigned char temp;
; RLS_DS18B20; //释放总线
cbi 0x11,6
.dbline 100
; for(i=0;i<8;i++)
clr R22
xjmp L23
L20:
.dbline 101
; {
.dbline 102
; HLD_DS18B20; //Maga16控制总线
sbi 0x11,6
.dbline 103
; CLR_DS18B20; //强制拉低
cbi 0x12,6
.dbline 104
; delayUs(16); //14.92us
ldi R16,16
xcall _delayUs
.dbline 105
; temp=wb>>i;
mov R16,R10
mov R17,R22
xcall lsr8
mov R20,R16
.dbline 106
; temp&=0x01;
andi R20,1
.dbline 107
; if(temp)
breq L24
.dbline 108
; RLS_DS18B20; //释放总线
cbi 0x11,6
xjmp L25
L24:
.dbline 110
; else
; CLR_DS18B20; //强制拉低
cbi 0x12,6
L25:
.dbline 111
ldi R16,16
xcall _delayUs
.dbline 112
ldi R16,35
xcall _delayUs
.dbline 113
cbi 0x11,6
.dbline 114
ldi R16,1
xcall _delayUs
.dbline 115
L21:
.dbline 100
inc R22
L23:
.dbline 100
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 readTempDS18B20 _readTempDS18B20 fi
; x -> R20,R21
; tempH -> R20
; tempL -> R22
.even
_readTempDS18B20::
xcall push_gset2
.dbline -1
.dbline 128
; delayUs(16); //14.92us
; delayUs(35); //30.38us
; RLS_DS18B20; //释放总线
; delayUs(1); //2.71us(大于1us就行了)
; }
; }
;
;
;
;
;
;
; /**********************************************************************
; functionName: unsigned int readTempDS18B20(void)
; description :读DS18B20温度
; **********************************************************************/
; unsigned int readTempDS18B20(void)
; {
.dbline 131
; unsigned char tempL,tempH;
; unsigned int x;
; resetDS18B20();
xcall _resetDS18B20
.dbline 132
; writeByteDS18B20(0xcc); //跳过ROM
ldi R16,204
xcall _writeByteDS18B20
.dbline 133
; writeByteDS18B20(0x44); //启动温度转换
ldi R16,68
xcall _writeByteDS18B20
.dbline 134
; delayUs(2);
ldi R16,2
xcall _delayUs
.dbline 135
; resetDS18B20();
xcall _resetDS18B20
.dbline 136
; writeByteDS18B20(0xcc); //跳过ROM
ldi R16,204
xcall _writeByteDS18B20
.dbline 137
; writeByteDS18B20(0xbe); //读数据
ldi R16,190
xcall _writeByteDS18B20
.dbline 138
; tempL=readByteDS18B20();
xcall _readByteDS18B20
mov R22,R16
.dbline 139
; tempH=readByteDS18B20();
xcall _readByteDS18B20
mov R20,R16
.dbline 140
; x=(tempH<<8)|tempL;
mov R21,R20
mov R20,R22
.dbline 141
; 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 + -