📄 ds18b20.s
字号:
ldi R24,4
sts 129,R24
.dbline 153
; /*通信口初始化*/
; UartInit();
.dbline -2
L29:
.dbline 0 ; func end
rjmp _UartInit
.dbend
.dbfunc e convert _convert fV
.even
_convert::
.dbline -1
.dbline 157
; }
; /*数据转换函数*/
; void convert(void)
; {timeb1=time1/100;
.dbline 157
ldi R17,100
lds R16,_time1
rcall div8u
sts _timeb1,R16
.dbline 158
; timeb2=time1%100/10;
ldi R17,100
lds R16,_time1
rcall mod8u
ldi R17,10
rcall div8u
sts _timeb2,R16
.dbline 159
; timeb3=time1%10;
ldi R17,10
lds R16,_time1
rcall mod8u
sts _timeb3,R16
.dbline 160
; timeb4=time2/100;
ldi R17,100
lds R16,_time2
rcall div8u
sts _timeb4,R16
.dbline 161
; timeb5=time2%100/10;
ldi R17,100
lds R16,_time2
rcall mod8u
ldi R17,10
rcall div8u
sts _timeb5,R16
.dbline 162
; timeb6=time2%10;
ldi R17,10
lds R16,_time2
rcall mod8u
sts _timeb6,R16
.dbline -2
L30:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Init_1wire _Init_1wire fV
.even
_Init_1wire::
.dbline -1
.dbline 167
; }
; /*****************单总线时序**************/
; /*初始化*/
; void Init_1wire(void)
; {flag = SREG; /*中断保护*/
.dbline 167
in R2,0x3f
sts _flag,R2
.dbline 168
; CLI();
cli
.dbline 170
; /*关中断*/
; DRC(1); //Out
sbi 0x7,0
.dbline 171
; DQ(1);
sbi 0x8,0
.dbline 172
; NOP(); //DQ拉低480-960US,接着将数据线拉高15-60US
nop
.dbline 173
; DQ(0);
in R24,0x8
andi R24,254
out 0x8,R24
.dbline 174
; delay_10us(56);
ldi R16,56
rcall _delay_10us
.dbline 175
; DQ(1);
sbi 0x8,0
.dbline 176
; DRC(0); //In 释放总线 此时上拉电阻使能
in R24,0x7
andi R24,254
out 0x7,R24
.dbline 177
; delay_10us(7);
ldi R16,7
rcall _delay_10us
L32:
.dbline 178
; while(PINC & 0x01);
L33:
.dbline 178
sbic 0x6,0
rjmp L32
X16:
.dbline 179
; delay_10us(50); //presence pulse 60-240us 480us min
ldi R16,50
rcall _delay_10us
.dbline 181
;
; if (flag & 0x80)
lds R2,_flag
sbrs R2,7
rjmp L35
X17:
.dbline 182
; {SEI(); /*恢复中断状态*/
.dbline 182
sei
.dbline 183
; }
L35:
.dbline -2
L31:
.dbline 0 ; func end
ret
.dbend
.dbfunc e WriteByte_1wire _WriteByte_1wire fV
; temp -> R10
; i -> R20
; data -> R12
.even
_WriteByte_1wire::
rcall push_xgset303C
mov R12,R16
.dbline -1
.dbline 187
; }
; /*写字节*/
; void WriteByte_1wire(uchar data)
; {uchar i,temp;
.dbline 188
; temp=data;
mov R10,R12
.dbline 190
;
; flag = SREG; /*中断保护*/
in R2,0x3f
sts _flag,R2
.dbline 191
; CLI();
cli
.dbline 193
;
; DRC(1);
sbi 0x7,0
.dbline 194
; for(i=0;i<8;i++)
clr R20
rjmp L41
L38:
.dbline 195
; {DQ(1);
.dbline 195
sbi 0x8,0
.dbline 196
; NOP();
nop
.dbline 197
; DQ(0); //写时间隙开始
in R24,0x8
andi R24,254
out 0x8,R24
.dbline 198
; delay_10us(1);
ldi R16,1
rcall _delay_10us
.dbline 199
; if(temp&0x01)DQ(1);
sbrs R10,0
rjmp L42
X18:
.dbline 199
sbi 0x8,0
L42:
.dbline 201
; //else DQ(0);
; temp>>=1; //LSB First
lsr R10
.dbline 202
; delay_10us(7);
ldi R16,7
rcall _delay_10us
.dbline 203
; }
L39:
.dbline 194
inc R20
L41:
.dbline 194
cpi R20,8
brlo L38
X19:
.dbline 204
; DQ(1);
sbi 0x8,0
.dbline 206
;
; if (flag & 0x80)
lds R2,_flag
sbrs R2,7
rjmp L44
X20:
.dbline 207
; {SEI(); /*恢复中断状态*/
.dbline 207
sei
.dbline 208
; }
L44:
.dbline -2
L37:
.dbline 0 ; func end
rjmp pop_xgset303C
.dbsym r temp 10 c
.dbsym r i 20 c
.dbsym r data 12 c
.dbend
.dbfunc e ReadByte_1wire _ReadByte_1wire fc
; data -> R20
; i -> R22
.even
_ReadByte_1wire::
st -y,R20
st -y,R22
.dbline -1
.dbline 212
; }
; /*读字节*/
; uchar ReadByte_1wire(void)
; {uchar i,data=0;
.dbline 212
clr R20
.dbline 214
;
; flag = SREG; /*中断保护*/
in R2,0x3f
sts _flag,R2
.dbline 215
; CLI();
cli
.dbline 217
;
; for(i=0;i<8;i++)
clr R22
rjmp L50
L47:
.dbline 218
; {data>>=1; //处理方法:先右移 后将最高位与 0x80相或 !!!
.dbline 218
lsr R20
.dbline 219
; DRC(1);
sbi 0x7,0
.dbline 220
; DQ(1);
sbi 0x8,0
.dbline 221
; NOP();
nop
.dbline 222
; DQ(0);
in R24,0x8
andi R24,254
out 0x8,R24
.dbline 223
; delay_1us(); //delay 3us
rcall _delay_1us
.dbline 224
; delay_1us();
rcall _delay_1us
.dbline 226
; //DQ(1);
; DRC(0);
in R24,0x7
andi R24,254
out 0x7,R24
.dbline 227
; delay_10us(1);
ldi R16,1
rcall _delay_10us
.dbline 228
; if(PINC&0x01)data|=0x80;
sbis 0x6,0
rjmp L51
X21:
.dbline 228
ori R20,128
L51:
.dbline 229
; delay_10us(6);
ldi R16,6
rcall _delay_10us
.dbline 231
;
; }
L48:
.dbline 217
inc R22
L50:
.dbline 217
cpi R22,8
brlo L47
X22:
.dbline 232
; DRC(1);
sbi 0x7,0
.dbline 233
; DQ(1);
sbi 0x8,0
.dbline 235
;
; if (flag & 0x80)
lds R2,_flag
sbrs R2,7
rjmp L53
X23:
.dbline 236
; {SEI(); /*恢复中断状态*/
.dbline 236
sei
.dbline 237
; }
L53:
.dbline 238
; return(data);
mov R16,R20
.dbline -2
L46:
.dbline 0 ; func end
ld R22,y+
ld R20,y+
ret
.dbsym r data 20 c
.dbsym r i 22 c
.dbend
.dbfunc e delay_10us _delay_10us fV
; i -> R10
; j -> R20
; n -> R16
.even
_delay_10us::
st -y,R10
st -y,R20
.dbline -1
.dbline 245
; }
; /********************************************************/
;
; /* n*10us
; 通过AVR Studio仿真*/
; void delay_10us(uchar n)
; {uchar i,j;
.dbline 246
; for(i=0;i<n;i++)
clr R10
rjmp L59
L56:
.dbline 247
; for(j=0;j<38;j++);
clr R20
rjmp L63
L60:
.dbline 247
L61:
.dbline 247
inc R20
L63:
.dbline 247
cpi R20,38
brlo L60
X24:
L57:
.dbline 246
inc R10
L59:
.dbline 246
cp R10,R16
brlo L56
X25:
.dbline -2
L55:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r i 10 c
.dbsym r j 20 c
.dbsym r n 16 c
.dbend
.dbfunc e delay_1us _delay_1us fV
; i -> R16
.even
_delay_1us::
.dbline -1
.dbline 251
; }
; /* 1.75us */
; void delay_1us(void)
; {uchar i;
.dbline 252
; for(i=0;i<4;i++);
clr R16
rjmp L68
L65:
.dbline 252
L66:
.dbline 252
inc R16
L68:
.dbline 252
cpi R16,4
brlo L65
X26:
.dbline -2
L64:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e UartRece_int _UartRece_int fV
.even
_UartRece_int::
st -y,R2
st -y,R3
st -y,R24
st -y,R25
st -y,R30
st -y,R31
IN R2,63
st -y,R2
.dbline -1
.dbline 256
; }
; /********************************通信部分*************************/
; void UartRece_int(void)
; {if(count3<2)Rece[count3++]=UDR0;
.dbline 256
lds R24,_count3
cpi R24,2
brsh L70
X27:
.dbline 256
mov R2,R24
clr R3
subi R24,255 ; addi 1
sts _count3,R24
ldi R24,<_Rece
ldi R25,>_Rece
mov R30,R2
clr R31
add R30,R24
adc R31,R25
lds R2,198
std z+0,R2
rjmp L71
L70:
.dbline 258
; else
; {count3=0;
.dbline 258
clr R2
sts _count3,R2
.dbline 259
; flag1=1;
ldi R24,1
sts _flag1,R24
.dbline 260
; }
L71:
.dbline -2
L69:
.dbline 0 ; func end
ld R2,y+
OUT 63,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R3,y+
ld R2,y+
reti
.dbend
.dbfunc e UartInit _UartInit fV
.even
_UartInit::
.dbline -1
.dbline 264
; }
; /**************串口初始化函数*****************/
; void UartInit(void)
; {
.dbline 266
; /* 设置波特率*/
; UBRR0H = 0x00; /*9600 U2X0=0 103*/
clr R2
sts 197,R2
.dbline 267
; UBRR0L = 0x67;
ldi R24,103
sts 196,R24
.dbline 269
; /* 接收中断使能 接收器与发送器使能*/
; UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
ldi R24,152
sts 193,R24
.dbline 271
; /* 设置帧格式: 8 个数据位, 1 个停止位 */
; UCSR0C = (3<<UCSZ00);
ldi R24,6
sts 194,R24
.dbline -2
L72:
.dbline 0 ; func end
ret
.dbend
.dbfunc e UartSend _UartSend fV
; i -> R10
; length -> R18
; a -> R16,R17
.even
_UartSend::
st -y,R10
.dbline -1
.dbline 275
; }
; /****************串行发送函数****************/
; void UartSend(uchar a[],uchar length)
; {uchar i;
.dbline 276
; for(i=0;i<length;i++)
clr R10
rjmp L77
L78:
.dbline 278
; {/* 等待发送缓冲器为空*/
; while ( !( UCSR0A & (1<<UDRE0)) );
L79:
.dbline 278
lds R2,192
sbrs R2,5
rjmp L78
X28:
.dbline 280
; /* 将数据放入缓冲器,发送数据*/
; UDR0=a[i];
mov R30,R10
clr R31
add R30,R16
adc R31,R17
ldd R2,z+0
sts 198,R2
.dbline 281
; }
L75:
.dbline 276
inc R10
L77:
.dbline 276
cp R10,R18
brlo L79
X29:
.dbline -2
L73:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r i 10 c
.dbsym r length 18 c
.dbsym r a 16 pc
.dbend
.area bss(ram, con, rel)
.dbfile E:\VB01D6~1\ComTest\DS18b20\ds18b20.c
_Send::
.blkb 3
.dbsym e Send _Send A[3:3]c
_Rece::
.blkb 2
.dbsym e Rece _Rece A[2:2]c
_timeb6::
.blkb 1
.dbsym e timeb6 _timeb6 c
_timeb5::
.blkb 1
.dbsym e timeb5 _timeb5 c
_timeb4::
.blkb 1
.dbsym e timeb4 _timeb4 c
_timeb3::
.blkb 1
.dbsym e timeb3 _timeb3 c
_timeb2::
.blkb 1
.dbsym e timeb2 _timeb2 c
_timeb1::
.blkb 1
.dbsym e timeb1 _timeb1 c
_time2::
.blkb 1
.dbsym e time2 _time2 c
_time1::
.blkb 1
.dbsym e time1 _time1 c
_flag::
.blkb 1
.dbsym e flag _flag c
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -