1、ds18b20 51单片机测温 自我总结+源程序DS18B20总结复位时序/* - 功能描述:DS18B20复位 - 隶属模块:DS18B20模块 - 函数属性:内部 - 参数说明:无 - 返回说明:返回值为0说明复位成功,否则失败 - 注:初始化是正确操作DS18B20是重要一步,必须复位成功 */unsigned char DS18B20_Reset() unsigned char x=0; DQ=1; /DQ拉高 DQ=0; /单片机将DQ拉低 delay(1800);/延时 480us960us DQ=1; /DQ拉高 /以上是由单片机产生“复位脉冲” delay(100); /延时1
2、5us60us x=DQ; /DS18B20产生“存在脉冲” /检测DQ 如果为低,说明复位成功,DS18B20存在 /如果为高,说明复位失败,DS18B20损坏或不存在 while(!DQ); /直到DQ为高 return x; /返回复位结果写时序/* - 功能描述:向DS18B20写入一个位(DS18B20的写时间片) - 隶属模块:DS18B20模块 - 函数属性:内部 - 参数说明:bdat:要写入的值,非0为1 - 返回说明:无 - 注:DS18B20的写时间片对时间的要求较为严格。因此将此代码移植到其它 CPU或场合时要注意延时函数 */void DS18B20_WriteSlo
3、t(unsigned char bdat) DQ=1; /将数据线置为高电平 delay(10); /两次写时间片间隔大于1us DQ=0; /开始一个写时间片 delay(10); /写时间片的低电平保持1us以上 DQ=bdat; delay(180); /写时间片开始15us后DS18B20对数据线进行采样 /写时间片最短60us DQ=1; /* - 功能描述:向DS18B20写入一个字节 - 隶属模块:DS18B20模块 - 函数属性:内部 - 参数说明:dat:将要向DS18B20写入字节 - 返回说明:无 - 注:此函数调用写时间片来实现字节的写入 */void DS18B20_
4、WriteByte(unsigned char dat) unsigned char i=0; for(i=0;i8;i+) /调用8次写时间片实现写入字节(8个位) DS18B20_WriteSlot(dat&(1i); 读时序/* - 功能描述:从DS18B20读取一个位(DS18B20的读时间片) - 隶属模块:DS18B20模块 - 函数属性:内部 - 参数说明:无 - 返回说明:读到的值,1或0 - 注:DS18B20的读时间片对时间的要求较为严格。因此将此代码移植到其它 CPU或场合时要注意延时函数 */unsigned char DS18B20_ReadSlot() unsign
5、ed char bdat=0; DQ=1; /将数据线置为高电平 delay(10); /两次读时间片间隔大于1us DQ=0; /开始一个读时间片 delay(10); /读时间片的低电平保持1us以上 DQ=1; /开始读取数据线状态 delay(20); /读时间片开始后15us内主机对数据线进行采样 bdat=DQ; delay(160);/读时间片最短60us return bdat; /* - 功能描述:从DS18B20读取一个字节 - 隶属模块:DS18B20模块 - 函数属性:内部 - 参数说明:无 - 返回说明:从DS18B20读到的字节 - 注:此函数调用读时间片来实现字节
6、的读取 */unsigned char DS18B20_ReadByte() unsigned char i=0,dat=0; for(i=0;i8;i+)/调用8次读时间片实现字节读取(8个位) dat|=(DS18B20_ReadSlot()i); return(dat);64位ROM编码/DS18B20 ROM指令#define Read_ROM 0x33 /读取ROM#define Match_ROM 0x55 /匹配ROM#define Skip_ROM 0xcc /跳过ROM#define Search_ROM 0xf0 /搜索ROM#define Alarm_ROM 0xec /
7、报警搜索 /DS18B20 暂存器指令#define Write_Scratchpad 0x4e /写暂存器#define Read_Scratchpad 0xbe /读暂存器#define Copy_Scratchpad 0x48 /拷贝暂存器#define Convert_T 0x44 /启动温度转换#define Recall_E2 0xb8 /重读E2#define Read_Power_Supply 0xb4 /读取供电方式/* - 功能描述:设置DS18B20的精度 - 隶属模块:DS18B20模块 - 函数属性:外部,供用户使用 - 参数说明:res:精度值 0:9位 1:10位
8、 2:11位 3:12位 - 返回说明:无 - 注:精度越低,可读的小数位数越少,比如在12位的精度下,可分辨温度 为0.0625,即可读小数位数为4位,而如果是10位的精度,则可分辨 温度为0.25,可读小数位数只有2位。 */void DS18B20_SetResolution(unsigned char res) while(DS18B20_Reset(); /复位,通信前必须复位 DS18B20_WriteByte(Write_Scratchpad); /写暂存器指令 DS18B20_WriteByte(0xff); /此值被写入TH DS18B20_WriteByte(0xff);
9、/此值被写入TL DS18B20_WriteByte(0x1f|(res5); /设置精度 0 res1-0 11111/* - 功能描述:从DS18B20中读取温度 - 隶属模块:DS18B20模块 - 函数属性:外部,供用户使用 - 参数说明:无 - 返回说明:由于返回的温度是浮点数(即小数),为了方便返回的值将为原 值的10000倍,即精确到小数点后2位,用户需要对返回值除以 10000得到实际的温度值 - 注:无 */long DS18B20_ReadTemperature() long t=0; while(DS18B20_Reset(); /复位,通信前必须复位 DS18B20_W
10、riteByte(Skip_ROM); /如果总线上只有一个DS18B20,则可跳过ROM操作 DS18B20_WriteByte(Convert_T); /启动温度转换 while(!DS18B20_ReadSlot(); /启动温度转换后要进行读忙,912位精度温度转换所需的 /最长时间分别为93.75ms、187.5ms、375ms、750ms /如果不读忙而紧接着进行后面的操作,将在首次上电时可能导致85现象 /因为读到的不是温度值,而是初始值0x0550,即85 while(DS18B20_Reset(); /温度转换后DS18B20处于空闲状态,要进行通信,需要重新复位 DS18B
11、20_WriteByte(Skip_ROM); /跳过ROM操作 DS18B20_WriteByte(Read_Scratchpad); /读取暂存器(共可读9个寄存器,前两个就是温度) t=DS18B20_ReadByte(); t|=(unsigned int)DS18B20_ReadByte()8; /将读到的两个字节进行整合 return t*625; /将结果乘以分辨温度0.0625 /扩大10000倍进行输出,不用浮点,同样可以保留4位小数精度 主函数 运行环境:STC51 1T单片机 22.1184M晶振 程序说明:此程序设置DS18B20精度为10位,不停的读取温度 值,并将温
12、度值的整数部分输出在P2 IO上 注:DS18B20相关教程请参见 振南的疯狂单片机(51)基础外围篇 之 DS18B20 一集 */void main() DS18B20_SetResolution(1); /设置DS18B20的精度为10位 while(1) P2=(DS18B20_ReadTemperature()/10000); /读取温度值,并将整数部分输出在P2上 while(1);DELAY 函数- 功能描述:延时函数 - 隶属模块:公开函数模块 - 函数属性:外部,用户可调用 - 参数说明:time:time值决定了延时的时间长短 - 返回说明:无 - 注:晶振为22.1184M 1T 在STC51单片机上延时的实际时间约为 time*0.4us */void delay(unsigned int time) while(time-);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1