微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机驱动DS18B20温度传感器程序及心得

51单片机驱动DS18B20温度传感器程序及心得

时间:12-01 来源:互联网 点击:

===========
{
uint8 j=0, dat =0;

for(j=0;j<8;j++)
{
dat>>=1;
wd=0; // A点mcu拉低电平3.26微秒;
delay2(); // 延时3.26微秒;
wd=1;
if(wd)
{
dat|=0x80;
} //读完数据后A点到此处是11.93微秒,保持在15微秒之内;
delay(9); // A点到此处80.29微秒; 理想时间范围是60--120微秒;
wd=1; //释放总线;
delay2(); //延时3.26微秒;
}

return dat;

}

start_sensor() //启动传感器;
{
reset_1820();
write_byte(0xcc); //跳跃命令;
write_byte(0x44); //转换temperature(温度)命令;
}
uint8 read_temp() //从温度传感器度温度数据过程;
{
uint8 ak[2];
uint16 dat=0 , j=0;
reset_1820(); //复位温度传感器
write_byte(0xcc); //跳跃rom命令;
write_byte(0xbe) ; // 发出读数据命令;
ak[0]=read_byte(); //读取第一个字节数据;
ak[1]=read_byte(); //读取第二个字节数据;
dat=ak[1]; //要把两个八位数据载入1个16位变量里;
dat<=8;
dat|=ak[0];
j= dat;

//==========以下是把温度传感器内部数据编译成16进制编码;
if((j>>11)==0x1f) //此语句是负温度进入.0x1f是二进制5个全1;
{
dat=(~dat)+1; //负温度要取反加一操作;
dat/=16; //传感器给的温度系数要除以16后,得到的数才是常规温度系数;
w=0; //此语句是在主函数中用来判断是正温度还是负温度;
return dat; //向主函数返回数据,并终止函数;
}
j=dat;
if((j>>11)==0) //如果是零则是正温度;
{
dat/=16; //数据直接除以16,就得到了常规温度系数;
w=1; //1代表正;
return dat; //向主函数返回数据,并终止函数;

}

return 130; //向主函数返回数据,并终止函数;

}

delay_ms() //延时1秒;
{
uint8 i=250;
uint16 j=608;
while(j--)
{ while(i--);
i=250;

}

}

error() //测温出错;
{
uint8 i=5, j=0 ,ak[]="Error!";

while(i--)
{
play_cmd(0x82);
while(ak[j]!=)
{
play_data(ak[j++]);
} j=0;
delay3();
play_cmd(0x01);
delay3();
}
}

main()
{

uint8 dat=0 ,j=3,len=0 ,num[]="start.....";

reset_1602();

while(j--) //这是启动电源时,液晶显示:start....(并闪烁3次)
{ play_cmd(0x82);
while(num[len]!=)
{
play_data(num[len++]);
}
len=0;
delay3();
play_cmd(0x01);
delay3();
}

while(1)
{
start_sensor(); //启动温度传感器;
delay_ms(); //等待1秒;
dat = read_temp(); //读取温度数据并赋给dat变量;

if(dat==130) //如果返回来的数据是130,表明采集温度出错;
{
error();
}
else if(w==1) //如果w是1,就代表正温度.输出;
{
play_cmd(0x83);
play_data(dat/10+0);
play_data(dat%10+0);
}
else //否则,就是负温度,输出时前面加一个负号;
{
play_cmd(0x82);
play_data(-);
play_data(dat/10+0);
play_data(dat%10+0);
}

} //我的亲娘四舅奶奶啊!!!!!!终于完成了!!!!2013年5月9日19:32:10

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top