
我之前遇到过一个问题,弄了两天,就是初始化最后要释放总线,不知道你是不是这个问题,你可以试试,祝好运!
下面是我当时用ATmega128调的,希望有帮助u8t ds18b20_Reset(void)
{
u8t bus_flag=0
DDRE |= DQ_18B20 //输出
PORTE |= DQ_18B20 //输出高
delay_100us(1) //保持100us
PORTE &= ~DQ_18B20 //输出低电平
delay_100us(5) //低电平延时500us
PORTE |= DQ_18B20 //输出高
delay_100us(1) //延时100us
DDRE &= ~DQ_18B20 // 释放总线
char j=0
j=PINE //读取DQ
if(!(j&0x04))
{
bus_flag=1
}
while(!(PINE&DQ_18B20)) //很重要,等待复位完成
return(bus_flag)
}
unsigned char ds18b20_Read()
{
unsigned char i,j,Temp=0
for(i=0i<8i++)
{
Temp >>= 1 //数据右移
DDRE |= DQ_18B20 //DQ为输出状态
PORTE &= ~DQ_18B20 //拉低总线,启动输入
delay_5us()
PORTE |= DQ_18B20
DDRE &= ~DQ_18B20 //DQ为输入状态
j=PINE
if(j&DQ_18B20)
{
Temp|=0x80
}
delay_60us()
}
return Temp
}
void ds18b20_Write(u8t Data)
{
u8t i
DDRE |= DQ_18B20 //DQ为输出
for(i=0i<8i++)
{
PORTE &= ~DQ_18B20 //拉低总线
delay_5us() //2us
asm("nop")
asm("nop")
if(Data&0x01)
{
PORTE |= DQ_18B20
delay_60us()
}
else
{
delay_60us()
PORTE |= DQ_18B20
delay_5us()
}
Data >>= 1
}
}
void Read_Temperature(void)
{
u8t Temp1=0,Temp2=0
ds18b20_Reset() //DS18b20复位
ds18b20_Write(0xCC) //跳过ROM
ds18b20_Write(0x44) //温度转换
delay_100ms(5) //等待转换完成
ds18b20_Reset() //DS18b20 复位8
ds18b20_Write(0xCC) //跳过RO
ds18b20_Write(0xBE) //读取RAM
Temp1=ds18b20_Read() //读低八位,LSByte,RAM0
Temp2=ds18b20_Read() //读高八位,MSByte,RAM1
Uart0_Tx(Temp1)
Uart0_Tx(Temp2)
ds18b20_Reset() //DS18b20 复位,表示读取结束
//return (((Temp2<<8)|Temp1)*6.25)//0.0625=xx, 0.625=xx.x,6.25=xx.xx
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)