ds18b20 51单片机测温 自我总结+源程序.docx
《ds18b20 51单片机测温 自我总结+源程序.docx》由会员分享,可在线阅读,更多相关《ds18b20 51单片机测温 自我总结+源程序.docx(16页珍藏版)》请在冰豆网上搜索。
ds18b2051单片机测温自我总结+源程序
DS18B20总结
复位时序
/******************************************************************
-功能描述:
DS18B20复位
-隶属模块:
DS18B20模块
-函数属性:
内部
-参数说明:
无
-返回说明:
返回值为0说明复位成功,否则失败
-注:
初始化是正确操作DS18B20是重要一步,必须复位成功
******************************************************************/
unsignedcharDS18B20_Reset()
{
unsignedcharx=0;
DQ=1;//DQ拉高
DQ=0;//单片机将DQ拉低
delay(1800);//延时480us~960us
DQ=1;//DQ拉高
//以上是由单片机产生“复位脉冲”
delay(100);//延时15us~60us
x=DQ;//DS18B20产生“存在脉冲”
//检测DQ如果为低,说明复位成功,DS18B20存在
//如果为高,说明复位失败,DS18B20损坏或不存在
while(!
DQ);//直到DQ为高
returnx;//返回复位结果
}
写时序
/******************************************************************
-功能描述:
向DS18B20写入一个位(DS18B20的写时间片)
-隶属模块:
DS18B20模块
-函数属性:
内部
-参数说明:
bdat:
要写入的值,非0为1
-返回说明:
无
-注:
DS18B20的写时间片对时间的要求较为严格。
因此将此代码移植到其它
CPU或场合时要注意延时函数
******************************************************************/
voidDS18B20_WriteSlot(unsignedcharbdat)
{
DQ=1;//将数据线置为高电平
delay(10);//两次写时间片间隔大于1us
DQ=0;//开始一个写时间片
delay(10);//写时间片的低电平保持1us以上
DQ=bdat;
delay(180);//写时间片开始15us后DS18B20对数据线进行采样
//写时间片最短60us
DQ=1;
}
/******************************************************************
-功能描述:
向DS18B20写入一个字节
-隶属模块:
DS18B20模块
-函数属性:
内部
-参数说明:
dat:
将要向DS18B20写入字节
-返回说明:
无
-注:
此函数调用写时间片来实现字节的写入
******************************************************************/
voidDS18B20_WriteByte(unsignedchardat)
{
unsignedchari=0;
for(i=0;i<8;i++)//调用8次写时间片实现写入字节(8个位)
{
DS18B20_WriteSlot(dat&(1<
}
}
读时序
/******************************************************************
-功能描述:
从DS18B20读取一个位(DS18B20的读时间片)
-隶属模块:
DS18B20模块
-函数属性:
内部
-参数说明:
无
-返回说明:
读到的值,1或0
-注:
DS18B20的读时间片对时间的要求较为严格。
因此将此代码移植到其它
CPU或场合时要注意延时函数
******************************************************************/
unsignedcharDS18B20_ReadSlot()
{
unsignedcharbdat=0;
DQ=1;//将数据线置为高电平
delay(10);//两次读时间片间隔大于1us
DQ=0;//开始一个读时间片
delay(10);//读时间片的低电平保持1us以上
DQ=1;//开始读取数据线状态
delay(20);//读时间片开始后15us内主机对数据线进行采样
bdat=DQ;
delay(160);//读时间片最短60us
returnbdat;
}
/******************************************************************
-功能描述:
从DS18B20读取一个字节
-隶属模块:
DS18B20模块
-函数属性:
内部
-参数说明:
无
-返回说明:
从DS18B20读到的字节
-注:
此函数调用读时间片来实现字节的读取
******************************************************************/
unsignedcharDS18B20_ReadByte()
{
unsignedchari=0,dat=0;
for(i=0;i<8;i++)//调用8次读时间片实现字节读取(8个位)
{
dat|=(DS18B20_ReadSlot()<
}
return(dat);
64位ROM编码
//DS18B20ROM指令
#defineRead_ROM0x33//读取ROM
#defineMatch_ROM0x55//匹配ROM
#defineSkip_ROM0xcc//跳过ROM
#defineSearch_ROM0xf0//搜索ROM
#defineAlarm_ROM0xec//报警搜索
//DS18B20暂存器指令
#defineWrite_Scratchpad0x4e//写暂存器
#defineRead_Scratchpad0xbe//读暂存器
#defineCopy_Scratchpad0x48//拷贝暂存器
#defineConvert_T0x44//启动温度转换
#defineRecall_E20xb8//重读E2
#defineRead_Power_Supply0xb4//读取供电方式
/******************************************************************
-功能描述:
设置DS18B20的精度
-隶属模块:
DS18B20模块
-函数属性:
外部,供用户使用
-参数说明:
res:
精度值0:
9位1:
10位2:
11位3:
12位
-返回说明:
无
-注:
精度越低,可读的小数位数越少,比如在12位的精度下,可分辨温度
为0.0625,即可读小数位数为4位,而如果是10位的精度,则可分辨
温度为0.25,可读小数位数只有2位。
******************************************************************/
voidDS18B20_SetResolution(unsignedcharres)
{
while(DS18B20_Reset());//复位,通信前必须复位
DS18B20_WriteByte(Write_Scratchpad);//写暂存器指令
DS18B20_WriteByte(0xff);//此值被写入TH
DS18B20_WriteByte(0xff);//此值被写入TL
DS18B20_WriteByte(0x1f|(res<<5));//设置精度0res[1-0]11111
}
/******************************************************************
-功能描述:
从DS18B20中读取温度
-隶属模块:
DS18B20模块
-函数属性:
外部,供用户使用
-参数说明:
无
-返回说明:
由于返回的温度是浮点数(即小数),为了方便返回的值将为原
值的10000倍,即精确到小数点后2位,用户需要对返回值除以
10000得到实际的温度值
-注:
无
******************************************************************/
longDS18B20_ReadTemperature()
{
longt=0;
while(DS18B20_Reset());//复位,通信前必须复位
DS18B20_WriteByte(Skip_ROM);//如果总线上只有一个DS18B20,则可跳过ROM操作
DS18B20_WriteByte(Convert_T);//启动温度转换
while(!
DS18B20_ReadSlot());//启动温度转换后要进行读忙,9~12位精度温度转换所需的
//最长时间分别为93.75ms、187.5ms、375ms、750ms
//如果不读忙而紧接着进行后面的操作,将在首次上电时可能导致85现象
//因为读到的不是温度值,而是初始值0x0550,即85
while(DS18B20_Reset());//温度转换后DS18B20处于空闲状态,要进行通信,需要重新复位
DS18B20_WriteByte(Skip_ROM);//跳过ROM操作
DS18B20_WriteByte(Read_Scratchpad);//读取暂存器(共可读9个寄存器,前两个就是温度)
t=DS18B20_ReadByte();
t|=((unsignedint)DS18B20_ReadByte())<<8;//将读到的两个字节进行整合
returnt*625;//将结果乘以分辨温度0.0625
//扩大10000倍进行输出,不用浮点,同样可以保留4位小数精度
}
主函数
运行环境:
STC511T单片机22.1184M晶振
程序说明:
此程序设置DS18B20精度为10位,不停的读取温度
值,并将温度值的整数部分输出在P2IO上
注:
DS18B20相关教程请参见
《振南的疯狂单片机(51)》基础外围篇之《DS18B20》一集
**************************************************************/
voidmain()
{
DS18B20_SetResolution
(1);//设置DS18B20的精度为10位
while
(1)
{
P2=~(DS18B20_ReadTemperature()/10000);//读取温度值,并将整数部分输出在P2上
}
while
(1);
}
DELAY函数
-功能描述:
延时函数
-隶属模块:
公开函数模块
-函数属性:
外部,用户可调用
-参数说明:
time:
time值决定了延时的时间长短
-返回说明:
无
-注:
晶振为22.1184M@1T在STC51单片机上延时的实际时间约为time*0.4us
*********************************************************************/
voiddelay(unsignedinttime)
{
while(time--);
}