|
曾经编写的DS18B20程序原来一切正常,但是最近拿来用时发现偶尔会出现数据错误,例如正常室温20度,但是偶尔会出现负值或很高的温度,怀疑新购的DS18B20时序参数同上批有点差别,有遇到过这种情况的吗?大家在使用DS18B20时是读出全部9个自己并用CRC进行校验吗?请大家指教。
晶振频率11.0592MHz,AT89C52,我的代码如下:
unsigned char DS18B20_ReadByte()
{
unsigned char i, dat=0;
for(i=0; i<8; i++)
{
dat >>= 1;
//开始另一个读周期前必须有1us以上的高电平恢复期
DQ = 1;
Delay2us();
//产生读起始信号,数据线保持在低电平至少1μs,DS18B20在总线下降沿后输出15us的有效数据
DQ = 0;
Delay2us();
DQ = 1;
Delay8us();
if(DQ) dat |= 0x80;
//延时60us以上来满足DS18B20的时序
Delay65us();
}
return dat;
}
/****************************************************************************************************************************************************
* 对总线上唯一的DS18B20进行温度转换及读取,返回带符号整形值。计算温度时需要乘以0.0625,如果出错返回值为200℃,超过其测温范围
*****************************************************************************************************************************************************/
int DS18B20_GetTemperature(void)
{
unsigned char i, tempL, tempH;
//温度转换
if(!DS18B20_Reset()) return 0x0C80;
DS18B20_WriteByte(0xCC); //跳过ROM
DS18B20_WriteByte(0x44); //进行温度转换
//等待温度转换结束
for(i=0; i<200; i++)
{
if(DS18B20_ReadByte() == 0xFF) break;
Delay5ms();
}
//读取温度
if(!DS18B20_Reset()) return 0x0C80;
DS18B20_WriteByte(0xCC); //跳过ROM
DS18B20_WriteByte(0xBE); //读寄存器
tempL = DS18B20_ReadByte(); //先读低8位数据
tempH = DS18B20_ReadByte(); //再读高8位数据
DS18B20_Reset(); //通过再次复位中断读取
return (tempH<<8)|tempL;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|