本帖最后由 Ethen 于 2013-3-6 15:19 编辑
50 05 4B 46 7F FF 0C 10 1C 这组数据是内部寄存器读取出来的,我3S采样并读取,发现一直都是这组数据,就是85度,读取了18b20的默认值,不知道是什么原因?
以下是程序代码:
//11.0592晶振 51单片机
void mDelay(uint num)
{
uint i;
for(;num>0;num--)
{ for(i=0;i<124;i++)
{;}
}
}
void TempDelay(unsigned int n)
{
do
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();
n--;
}while(n);
}
/*****************DS18B20******************/
void Init_Ds18b20(void)
{
DQ=1;
_nop_();
DQ=0;
TempDelay(35);
_nop_();
DQ=1;
TempDelay(10);
if(DQ==0)
detect = 1;
else
detect = 0;
TempDelay(1);
_nop_();
_nop_();
DQ = 1;
}
uchar Read_One_Byte (void) //读取单字节
{
uchar i,u=0;
for(i=0;i<8;i++)
{
DQ = 0;
u >>= 1;
_nop_();_nop_();_nop_();
DQ = 1;
TempDelay (1);
if(DQ==1)
u |= 0x80;
TempDelay (4);
//_nop_();
}
return(u);
}
void Write_One_Byte (uchar wr) //单字节写入
{
uchar i;
for (i=0;i<8;i++)
{
DQ = 0;
_nop_();_nop_();_nop_();
DQ=wr&0x01;
TempDelay(3);
//_nop_();
//_nop_();
DQ=1;
wr >>= 1;
}
}
void read_bytes (uchar j)
{
uchar i;
for(i=0;i<j;i++)
{
*p = Read_One_Byte();
p++;
}
}
uchar CRC (uchar j)
{
uchar i,crc_data=0;
for(i=0;i<9;i++)
{
tx_byte(temp_buff);
}
for(i=0;i<j;i++)
crc_data = CrcTable[crc_data^temp_buff];
return (crc_data);
}
uint Get_Tmp() //获取温度get the temperature
{
float tt;
EA=0;
Init_Ds18b20(); //初始化
Write_One_Byte(0xcc); //忽略ROM指令
Write_One_Byte(0x44); //温度转换指令
mDelay(200);
Init_Ds18b20(); //初始化
Write_One_Byte(0xCC); //忽略ROM指令
Write_One_Byte(0xBE); //读暂存器指令
p = temp_buff;
read_bytes (9);
EA=1;
if (CRC(9)==0) //校验正确
{
temp = temp_buff[1];
temp <<= 8;
temp = temp|temp_buff[0];
if (temp&0XF800)//判定temp 的高五位是否為 1
{
temp=~temp + 1;//若temp 的高五位為1,則取temp 的補碼
fuhao=1;
}
else
{
fuhao=0;
}
tt = temp*0.0625;//得到真实十进制温度值 //因为DS18B20可以精确到0.0625度 //所以读回数据的最低位代表
的是0.0625度
temp = tt*10+0.5; //放大十倍//这样做的目的将小数点后第一位也转换为可显示数字//同时进行一个四舍五入操作
。
if(fuhao==1)
{
temp=-1*temp-1;
}
}
else
{
temp=0;
}
return temp;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
但是I2C总线应该是通的,看一下具体的命令,然后把delay什么的加长看一下吧。
一周热门 更多>