ds18b20 51单片机测温 自我总结+源程序.docx

上传人:b****2 文档编号:23090590 上传时间:2023-04-30 格式:DOCX 页数:16 大小:8.30MB
下载 相关 举报
ds18b20 51单片机测温 自我总结+源程序.docx_第1页
第1页 / 共16页
ds18b20 51单片机测温 自我总结+源程序.docx_第2页
第2页 / 共16页
ds18b20 51单片机测温 自我总结+源程序.docx_第3页
第3页 / 共16页
ds18b20 51单片机测温 自我总结+源程序.docx_第4页
第4页 / 共16页
ds18b20 51单片机测温 自我总结+源程序.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

ds18b20 51单片机测温 自我总结+源程序.docx

《ds18b20 51单片机测温 自我总结+源程序.docx》由会员分享,可在线阅读,更多相关《ds18b20 51单片机测温 自我总结+源程序.docx(16页珍藏版)》请在冰豆网上搜索。

ds18b20 51单片机测温 自我总结+源程序.docx

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--);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1