初级会员
- 积分
- 85
- 金钱
- 85
- 注册时间
- 2012-10-14
- 在线时间
- 0 小时
|
发表于 2014-5-25 09:52:45
|
显示全部楼层
回复【15楼】电子狼:
---------------------------------
楼主,我想问你一下,DS18B20的序列号我读出来了,但我参考你的第二个程序,能检测到DS18B20,但是读出来的温度为什么都是0啊?我是用STM32的。
u8 table1[]={0x28,0x30,0x27,0x20,0x05,0x00,0x00,0x54};//rom1 测得的序列号
u8 table2[]={0x28,0x61,0x06,0x20,0x05,0x00,0x00,0x24};//rom2
void check_rom(u8 a) //匹配序列号
{
u8 j;
DS18B20_Write_Byte(0x55);
if(a==1)
{
for(j=0;j<8;j++)
{
DS18B20_Write_Byte(table1[j]);
}
}
if(a==2)
{
for(j=0;j<8;j++)
{
DS18B20_Write_Byte(table2[j]);
}
}
}
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(u8 z)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Rst(); // ds1820 start convert
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Rst();
DS18B20_Check();
if(z==1)
{
check_rom(1); // 匹配rom1
}
if(z==2)
{
check_rom(2); // 匹配rom2
}
DS18B20_Write_Byte(0x44);// convert
delay_ms(800);
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Rst();
DS18B20_Check();
if(z==1)
{
check_rom(1); //
}
if(z==2)
{
check_rom(2); //
}
DS18B20_Write_Byte(0xbe);// convert
TL=DS18B20_Read_Byte(); // LSB
TH=DS18B20_Read_Byte(); // MSB
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0;//温度为负
}else temp=1;//温度为正
tem=TH; //获得高八位
tem<<=8;
tem+=TL;//获得底八位
tem=(float)tem*0.625;
if(temp)return tem; //返回温度值
else return -tem;
}
这是DS18B20.c上修改的程序
while(1)
{
if(t%10==0)//每100ms读取一次
{
temperature=DS18B20_Get_Temp(1);
if(temperature<0)
{
LCD_ShowChar(60+48,150,'-',16,0); //显示负号
temperature=-temperature; //转为正数
}else LCD_ShowChar(60+48,150,' ',16,0); //去掉负号
LCD_ShowNum(60+48+8,150,temperature/10,2,16); //显示正数部分
LCD_ShowNum(60+48+32,150,temperature%10,1,16); //显示小数部分
temperature=DS18B20_Get_Temp(2);
if(temperature<0)
{
LCD_ShowChar(60+48,170,'-',16,0); //显示负号
temperature=-temperature; //转为正数
}else LCD_ShowChar(60+48,170,' ',16,0); //去掉负号
LCD_ShowNum(60+48+8,170,temperature/10,2,16); //显示正数部分
LCD_ShowNum(60+48+32,170,temperature%10,1,16); //显示小数部分
}
delay_ms(10);
t++;
if(t==20)
{
t=0;
LED0=!LED0;
}
}
这是主程序修改的部分 |
|