DS18B20时序问题
参考坛子内的程序但MCLK=20M
初始化可以通过
但得不到正确温度
读和写时序是否有错
/*******************************************
函数名称:Init_18B20
功 能:对DS18B20进行复位操作
参 数:无
返回值:初始化状态标志:1--失败,0--成功
********************************************/
unsigned char Init_18B20(void)
{
unsigned char flag;
_DINT();
OW_OUT_0;
delay_us(480); //480us
OW_OUT_1;
delay_us(70); //15-60us
OW_IN;
delay_us(1);
if (OW_IN_DATA)
{
flag = 1; //初始化失败
}
else
{
flag = 0; //初始化OK
}
OW_OUT_1;
delay_us(480); //410us
_EINT();
return flag;
}
/*******************************************
函数名称:Write_18B20
功 能:向DS18B20写入一个字节的数据
参 数:wdata--写入的资料
返回值:无
********************************************/
void Write_18B20(unsigned char data)
{
unsigned char i;
_DINT();
for (i = 0; i < 8; i++)
{
OW_OUT_0;
delay_us(1);
if (data & 0x01)
{OW_OUT_1;}
else OW_OUT_0;
delay_us(1);
data >>= 1;
delay_us(70); //延时70us
OW_OUT_1;
}
_EINT();
}
/*******************************************
函数名称:Read_18B20
功 能:从DS18B20读取一个字节的数据
参 数:无
返回值:读出的一个字节数据
********************************************/
unsigned char Read_18B20(void)
{
unsigned char i;
unsigned char temp = 0;
_DINT();
for (i = 0; i < 8; i++)
{
temp >>= 1;
OW_OUT_0;
delay_us(1);
OW_OUT_1;
delay_us(1);
if (OW_IN_DATA)temp |= 0x80;
delay_us(70);
}
_EINT();
returntemp;
}
/*******************************************
函数名称:Skip
功 能:发送跳过读取产品ID号命令
参 数:无
返回值:无
********************************************/
void Skip(void)
{
Write_18B20(0xcc);
}
/*******************************************
函数名称:Convert
功 能:发送温度转换命令
参 数:无
返回值:无
********************************************/
void Convert(void)
{
Write_18B20(0x44);
}
/*******************************************
函数名称:Read_SP
功 能:发送读ScratchPad命令
参 数:无
返回值:无
********************************************/
void Read_SP(void)
{
Write_18B20(0xbe);
}
/*******************************************
函数名称:ReadTemp
功 能:从DS18B20的ScratchPad读取温度转换结果
参 数:无
返回值:读取的温度数值
********************************************/
unsigned int ReadTemp(void)
{
unsigned char temp_low;
unsigned inttemp;
temp_low = Read_18B20(); //读低位
temp = Read_18B20(); //读高位
temp = (temp << 8) | temp_low;
returntemp;
}
/*******************************************
函数名称:ReadTemp
功 能:控制DS18B20完成一次温度转换
参 数:无
返回值:测量的温度数值
********************************************/
unsigned int Do1Convert(void)
{
unsigned char i, j;
j = 0;
do
{
i = Init_18B20();
j++;
if (j > 200) return 0x0000;//复位超时返回0
}
while (i);
Skip();
Convert();
for (i = 20; i > 0; i--)
{
__delay_cycles(22000); //延时800ms以上
}
j = 0;
do
{
i = Init_18B20();
j++;
if (j > 200) return 0x0000;//复位超时返回0
}
while (i);
Skip();
Read_SP();
return ReadTemp();
}
好像不大对,看了下自己的程序,读和写每BIT时都有延时十几微秒,你才延时1微秒,应该不对吧。
现在手上没18B20的数据手册,你自己分析下吧,尽量模拟手册上的时序,读写不难的。 调试快一天了
高手帮忙~~~
页:
[1]