基于AT89C51单片机的DS18B20温度检测
2012-11-12
展开全部
/**********************************************************************/
Init_DS18B20(void)//初始化ds1820
{
unsigned char x = 0;
DQ = 1; //DQ复位 Delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay(60); //精确延时 大于 480us
//Delay(400); //精确延时 大于 480us
DQ = 1; //拉高总线 Delay(15);
x = DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
Delay(20);
}
ReadOneChar(void)//读一个字节
{
unsigned char i = 0;
unsigned char dat1 = 0;
for (i = 8; i > 0; i--)
{
DQ = 0; // 给脉冲信号
dat1 >>= 1;
DQ = 1; // 给脉冲信号
if(DQ)
dat1 |= 0x80;
Delay(15);
}
return (dat1);
}
WriteOneChar(unsigned char dat1)//写一个字节
{
unsigned char i = 0;
for (i = 8; i > 0; i--)
{
DQ = 0;
DQ = dat1&0x01;
Delay(5);
DQ = 1;
dat1>>=1;
}
}
Read_Disp_Temperature(void)//读取并显示温度
{ unsigned char i;
unsigned int a = 0, b = 0, c = 0,d=0,e=0, t = 0,g;
float tt = 0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a = ReadOneChar(); b = ReadOneChar();
t = b;
t <<= 8;
t = t | a;
tt = t * 0.0625; t = tt * 100 + 0.5; //放大100倍输出并四舍五入
a = t / 10000; //百位
b = t / 1000-a*10; //十位
c = t / 100 -a*100-b*10; //个位
d = t /10 - a*1000-b*100-c*10; //十分位
e = t -a*10000-b*1000-c*100-d*10;//百分位
wr_lcd (comm,0x30);
wr_lcd (comm,0x98);
for(i=0;i<5;i++)
{wr_lcd (dat,tab3[i]);
}
if(a==0){wr_lcd (dat,' ');} //不显示百位
else { g = Tab_Num[a]; //显示百位
wr_lcd (dat,g);
}
if(b==0){wr_lcd (dat,' ');} //不显示十位
else{g = Tab_Num[b]; //显示十位
wr_lcd (dat,g);
}
g = Tab_Num[c]; //显示个位
wr_lcd (dat,g);
wr_lcd (dat,tab3[5]); //显示点
g = Tab_Num[d];
wr_lcd (dat,g);//显示十分位
g = Tab_Num[e];
wr_lcd (dat,g);//显示百分位
wr_lcd (dat,tab3[6]); //显示符号
}
参考一下吧
Init_DS18B20(void)//初始化ds1820
{
unsigned char x = 0;
DQ = 1; //DQ复位 Delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay(60); //精确延时 大于 480us
//Delay(400); //精确延时 大于 480us
DQ = 1; //拉高总线 Delay(15);
x = DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
Delay(20);
}
ReadOneChar(void)//读一个字节
{
unsigned char i = 0;
unsigned char dat1 = 0;
for (i = 8; i > 0; i--)
{
DQ = 0; // 给脉冲信号
dat1 >>= 1;
DQ = 1; // 给脉冲信号
if(DQ)
dat1 |= 0x80;
Delay(15);
}
return (dat1);
}
WriteOneChar(unsigned char dat1)//写一个字节
{
unsigned char i = 0;
for (i = 8; i > 0; i--)
{
DQ = 0;
DQ = dat1&0x01;
Delay(5);
DQ = 1;
dat1>>=1;
}
}
Read_Disp_Temperature(void)//读取并显示温度
{ unsigned char i;
unsigned int a = 0, b = 0, c = 0,d=0,e=0, t = 0,g;
float tt = 0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a = ReadOneChar(); b = ReadOneChar();
t = b;
t <<= 8;
t = t | a;
tt = t * 0.0625; t = tt * 100 + 0.5; //放大100倍输出并四舍五入
a = t / 10000; //百位
b = t / 1000-a*10; //十位
c = t / 100 -a*100-b*10; //个位
d = t /10 - a*1000-b*100-c*10; //十分位
e = t -a*10000-b*1000-c*100-d*10;//百分位
wr_lcd (comm,0x30);
wr_lcd (comm,0x98);
for(i=0;i<5;i++)
{wr_lcd (dat,tab3[i]);
}
if(a==0){wr_lcd (dat,' ');} //不显示百位
else { g = Tab_Num[a]; //显示百位
wr_lcd (dat,g);
}
if(b==0){wr_lcd (dat,' ');} //不显示十位
else{g = Tab_Num[b]; //显示十位
wr_lcd (dat,g);
}
g = Tab_Num[c]; //显示个位
wr_lcd (dat,g);
wr_lcd (dat,tab3[5]); //显示点
g = Tab_Num[d];
wr_lcd (dat,g);//显示十分位
g = Tab_Num[e];
wr_lcd (dat,g);//显示百分位
wr_lcd (dat,tab3[6]); //显示符号
}
参考一下吧
leipole
2024-11-29 广告
2024-11-29 广告
作为上海雷普电气有限公司的一员,我们的udian温度控制器以其卓越的温控性能而著称。该产品采用先进的温控技术,能够精确感知环境温度并作出迅速响应,确保设备在理想温度范围内稳定运行。其设计紧凑、安装便捷,广泛应用于各类电气柜及工业设备中,有效...
点击进入详情页
本回答由leipole提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询