📄 ds18b20.s
字号:
.module DS18B20.C
.area text(rom, con, rel)
.dbfile F:\try\DS18B20\DS18B20.C
.dbfunc e init_1820 _init_1820 fV
.even
_init_1820::
.dbline -1
.dbline 19
; /*************************************************************************
; ds18b20头文件
; M16 内部8M
; *************************************************************************/
; #include <iom16v.h>
; #include <macros.h>
; #include "DS18B20.h"
;
; #define CLR_DIR_1WIRE DDRC&=~BIT(2)
; //只要修改这里的参数就可以了!呵呵!
; #define SET_DIR_1WIRE DDRC|=BIT(2)
; //里面什么都不用该!
; #define CLR_OP_1WIRE PORTC&=~BIT(2)
; #define SET_OP_1WIRE PORTC|=BIT(2)
; #define CHECK_IP_1WIRE (PINC & 0x04)
; //检测
; unsigned char wmh,wml;
; void init_1820(void)
; {
.dbline 20
; SET_DIR_1WIRE; //设置PC2 为输出
sbi 0x14,2
.dbline 21
; SET_OP_1WIRE;
sbi 0x15,2
.dbline 22
; CLR_OP_1WIRE;
cbi 0x15,2
.dbline 23
; delay_nus(500); //480us以上
ldi R16,500
ldi R17,1
xcall _delay_nus
.dbline 24
; SET_OP_1WIRE;
sbi 0x15,2
.dbline 25
; CLR_DIR_1WIRE;
cbi 0x14,2
.dbline 26
; delay_nus(25); //15~60us
ldi R16,25
ldi R17,0
xcall _delay_nus
L2:
.dbline 27
; while(CHECK_IP_1WIRE);
L3:
.dbline 27
sbic 0x13,2
rjmp L2
X0:
.dbline 28
; SET_DIR_1WIRE;
sbi 0x14,2
.dbline 29
; SET_OP_1WIRE;
sbi 0x15,2
.dbline 30
; delay_nus(180); //60~240us
ldi R16,180
ldi R17,0
xcall _delay_nus
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e write_1820 _write_1820 fV
; m -> R20
; x -> R10
.even
_write_1820::
st -y,R10
st -y,R20
mov R10,R16
.dbline -1
.dbline 33
; }
; void write_1820(unsigned char x)
; {
.dbline 35
; unsigned char m;
; for(m=0;m<8;m++)
clr R20
xjmp L9
L6:
.dbline 36
; {
.dbline 37
; CLR_OP_1WIRE;
cbi 0x15,2
.dbline 38
; if(x&(1<<m)) //写数据了,先写低位的!
ldi R16,1
mov R17,R20
xcall lsl8
mov R2,R10
and R2,R16
breq L10
X1:
.dbline 39
; SET_OP_1WIRE;
sbi 0x15,2
xjmp L11
L10:
.dbline 41
; else
; {CLR_OP_1WIRE;}
.dbline 41
cbi 0x15,2
.dbline 41
L11:
.dbline 42
; delay_nus(40); //15~60us
ldi R16,40
ldi R17,0
xcall _delay_nus
.dbline 43
; SET_OP_1WIRE;
sbi 0x15,2
.dbline 44
; }
L7:
.dbline 35
inc R20
L9:
.dbline 35
cpi R20,8
brlo L6
X2:
.dbline 45
; SET_OP_1WIRE;
sbi 0x15,2
.dbline -2
L5:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r m 20 c
.dbsym r x 10 c
.dbend
.dbfunc e read_1820 _read_1820 fc
; temp -> R10
; k -> R22
; n -> R20
.even
_read_1820::
xcall push_xgsetF00C
.dbline -1
.dbline 48
; }
; unsigned char read_1820(void)
; {
.dbline 50
; unsigned char temp,k,n;
; temp=0;
clr R10
.dbline 51
; for(n=0;n<8;n++)
clr R20
xjmp L16
L13:
.dbline 52
; {
.dbline 53
; CLR_OP_1WIRE;
cbi 0x15,2
.dbline 54
; SET_OP_1WIRE;
sbi 0x15,2
.dbline 55
; CLR_DIR_1WIRE;
cbi 0x14,2
.dbline 56
; k=(CHECK_IP_1WIRE); //读数据,从低位开始
in R22,0x13
andi R22,4
.dbline 57
; if(k)
breq L17
X3:
.dbline 58
; temp|=(1<<n);
ldi R16,1
mov R17,R20
xcall lsl8
or R10,R16
xjmp L18
L17:
.dbline 60
; else
; temp&=~(1<<n);
ldi R16,1
mov R17,R20
xcall lsl8
mov R2,R16
com R2
and R10,R2
L18:
.dbline 61
; delay_nus(80); //60~120us
ldi R16,80
ldi R17,0
xcall _delay_nus
.dbline 62
; SET_DIR_1WIRE;
sbi 0x14,2
.dbline 63
; }
L14:
.dbline 51
inc R20
L16:
.dbline 51
cpi R20,8
brlo L13
X4:
.dbline 64
; return (temp);
mov R16,R10
.dbline -2
L12:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r temp 10 c
.dbsym r k 22 c
.dbsym r n 20 c
.dbend
.dbfunc e gettemp _gettemp fc
; wm3 -> R10
; wm2 -> R10
; wm1 -> R22
; wm0 -> R20
; teml -> R20
; temh -> R22
.even
_gettemp::
xcall push_xgsetF00C
.dbline -1
.dbline 68
; }
;
; unsigned char gettemp(void) //读取温度值
; {
.dbline 70
; unsigned char temh,teml,wm0,wm1,wm2,wm3;
; init_1820(); //复位18b20
xcall _init_1820
.dbline 71
; write_1820(0xcc); // 发出转换命令
ldi R16,204
xcall _write_1820
.dbline 72
; write_1820(0x44);
ldi R16,68
xcall _write_1820
.dbline 73
; delay_nms(1100); //不延时也好使,不知道怎么回事!
ldi R16,1100
ldi R17,4
xcall _delay_nms
.dbline 74
; init_1820();
xcall _init_1820
.dbline 75
; write_1820(0xcc); //发出读命令
ldi R16,204
xcall _write_1820
.dbline 76
; write_1820(0xbe);
ldi R16,190
xcall _write_1820
.dbline 77
; teml=read_1820(); //读数据
xcall _read_1820
mov R20,R16
.dbline 78
; temh=read_1820();
xcall _read_1820
mov R22,R16
.dbline 79
; wm0=teml&0xF0; //只要高8位的低四位和低8位的高四位,温度范围0~99啦!
andi R20,240
.dbline 80
; wm1=temh&0x0F;
andi R22,15
.dbline 81
; wm2=wm1+wm0; //16进制转10进制
mov R10,R22
add R10,R20
.dbline 82
; wm3=wm2/100;
ldi R17,100
mov R16,R10
xcall div8u
mov R10,R16
.dbline 85
; //wmh=(wm2%100)/10; //出口参数了!wmh是显示的高位,wml使显示的低位
; //wml=(wm2%100)%10;
; return wm3;
.dbline -2
L19:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r wm3 10 c
.dbsym r wm2 10 c
.dbsym r wm1 22 c
.dbsym r wm0 20 c
.dbsym r teml 20 c
.dbsym r temh 22 c
.dbend
.dbfunc e delay_1us _delay_1us fV
.even
_delay_1us::
.dbline -1
.dbline 97
; }
;
;
; //延时程序:
;
; //delay.h
; /*-----------------------------------------------------------------------
; 延时函数
; 系统时钟:8M
; -----------------------------------------------------------------------*/
; void delay_1us(void) //1us延时函数
; {
.dbline 98
; asm("nop");
nop
.dbline -2
L20:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_nus _delay_nus fV
; i -> R20,R21
; n -> R10,R11
.even
_delay_nus::
xcall push_xgset300C
movw R10,R16
.dbline -1
.dbline 102
; }
;
; void delay_nus(unsigned int n) //N us延时函数
; {
.dbline 103
; unsigned int i=0;
clr R20
clr R21
.dbline 104
; for (i=0;i<n;i++)
xjmp L25
L22:
.dbline 105
; delay_1us();
xcall _delay_1us
L23:
.dbline 104
subi R20,255 ; offset = 1
sbci R21,255
L25:
.dbline 104
cp R20,R10
cpc R21,R11
brlo L22
X5:
.dbline -2
L21:
.dbline 0 ; func end
xjmp pop_xgset300C
.dbsym r i 20 i
.dbsym r n 10 i
.dbend
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 109
; }
;
; void delay_1ms(void) //1ms延时函数
; {
.dbline 111
; unsigned int i;
; for (i=0;i<1140;i++);
clr R16
clr R17
xjmp L30
L27:
.dbline 111
L28:
.dbline 111
subi R16,255 ; offset = 1
sbci R17,255
L30:
.dbline 111
cpi R16,116
ldi R30,4
cpc R17,R30
brlo L27
X6:
.dbline -2
L26:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay_nms _delay_nms fV
; i -> R20,R21
; n -> R10,R11
.even
_delay_nms::
xcall push_xgset300C
movw R10,R16
.dbline -1
.dbline 115
; }
;
; void delay_nms(unsigned int n) //N ms延时函数
; {
.dbline 116
; unsigned int i=0;
clr R20
clr R21
.dbline 117
; for (i=0;i<n;i++)
xjmp L35
L32:
.dbline 118
; delay_1ms();
xcall _delay_1ms
L33:
.dbline 117
subi R20,255 ; offset = 1
sbci R21,255
L35:
.dbline 117
cp R20,R10
cpc R21,R11
brlo L32
X7:
.dbline -2
L31:
.dbline 0 ; func end
xjmp pop_xgset300C
.dbsym r i 20 i
.dbsym r n 10 i
.dbend
.area bss(ram, con, rel)
.dbfile F:\try\DS18B20\DS18B20.C
_wml::
.blkb 1
.dbsym e wml _wml c
_wmh::
.blkb 1
.dbsym e wmh _wmh c
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -