while(t--)
{
_nop_()
}
t在delayus(10)中已经赋值,即t=10,_nop_()是一个空 *** 作NOP(汇编语言中),即一个机器周期,主频12Mhz中就是1um.
正好我以前写过DS18B20的程序,现在共享给你。我的单片机频率是8M,如果你的频率不同,请自己计算后把延时参数修改一下就可以了。
read: push r24
in r24,SREG
push r24
ldi r22,$FF
clr r23
out PORTB,r22 升高单线总线
out DDRB,r22 B口为输出口
out PORTB,r23 拉低单线总线
ldi r24,$05
read1: dec r24
brne read1 延迟10个时钟周期(大约1.25微秒)
out DDRB,r23 B口为输入口
ldi r24,$30
read2: dec r24
brne read2 延迟96个时钟周期(大约12微秒)
in r21,PINB 读单线总线
ldi r24,$C8
read3: dec r24
brne read3 延迟400个时钟周期(大约50微秒)
pop r24
out SREG,r24
pop r24
ret
DS1820温度传感器单线总线写0时间片
write0: push r24
in r24,SREG
push r24
ldi r22,$FF
clr r23
out PORTB,r22 升高单线总线
out DDRB,r22 B口为输出口
out PORTB,r23 拉低单线总线
clr r24
wr0j1: dec r24
dec r24
nop
nop
brne wr0j1 延迟640个时钟周期(大约80微秒)
out PORTB,r22 升高单线总线
ldi r24,$07
wr0j2: dec r24
brne wr0j2 延迟14个时钟周期(大约1.75微秒)
out DDRB,r23 B口为输入口
pop r24
out SREG,r24
pop r24
ret
DS1820温度传感器单线总线写1时间片
write1: push r24
in r24,SREG
push r24
ldi r22,$FF
clr r23
out PORTB,r22 升高单线总线
out DDRB,r22 B口为输出口
out PORTB,r23 拉低单线总线
ldi r24,$07
wr1j1: dec r24
brne wr1j1 延迟14个时钟周期(大约1.75微秒)
out PORTB,r22 升高单线总线
clr r24
wr1j2: dec r24
dec r24
nop
nop
brne wr1j2 延迟640个时钟周期(大约80微秒)
out DDRB,r23 B口为输入口
pop r24
out SREG,r24
pop r24
ret
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)