复习单片机:温度计DS18B20代码部分(内含代码部分详解+示意图)

简介: 复习单片机:温度计DS18B20代码部分(内含代码部分详解+示意图)

1.总思路:


DS18B20 的典型温度读取过程为:1.复位→2.发 SKIP ROM 命令(0XCC)→3.发开始转 换命令(0X44)→4.延时→5.复位→6.发送 SKIP ROM 命令(0XCC)→7.发读存储器命令 (0XBE)→8.连续读出两个字节数据(即温度)→9.结束。


2.初始化时序函数:


3bf9a4746ac1418e9635b449c44c2d75.png

//初始化
void ds18b20_reset(void)
{
DS18B20_PORT=0;//第一步拉低
delay_10us(75);//第二步延时
DS18B20_PORT=1;//第三步拉高
delay_10us(2);//第四步延时
}
//如果有相应(包括拉低,延时,拉高延时),返回0,没有相应返回1
u8 ds18b20_check(void)
{
u8 time_temp=0;//第五步拉低
//相应的拉低判断和延时时间长短判断
while(DS18B20&&time_temp<20)//用while循环判断,如果时间过长,则为没有相应
{ //意思是在200us之内可以持续等待ds18b20拉低
time_temp++;
delay_10us(1);
}
if(time_temp>=20) return 1;//确定没有相应
time_temp=0;
delay_10us(2);
while((!DS18B20)&&(time_temp<20))
{
time_temp++;
delay_10us(1);
}
if(time_temp>=20) return 1;
return 0;
}

3.写时序:


2143f5d165df4bbd865bcd2a29d5125f.png


//写时序
void ds18b20_write_type(u8 dat)
{
u8 i=0;
u8 temp=0;//为了接收dat并按位与传递
for(i=0;i<8;i++)
{
temp=dat&0x01;//得到dat最低位方法:dat与0x01进行按位与
dat>>=1;//每次移动一个位
if(temp)//写1时序时
{
DS18B20_PORT=0;//第一步,拉低
_nop_();_nop_();//第二步,延时,因为只需要2us,则只能用2us
DS18B20_PORT=1;//第三步,拉高
delay_10us(6);//第四步,延时
}
else//写0时序时
{
DS18B20_PORT=0;//第一步,拉低
delay_10us(6);//第二步,延时
DS18B20_PORT=1;//第三步,拉高
_nop_();_nop_(); //第四步,延时
}
}
}

4.读时序:

ac6badb7b9114e44bff475649a447bb3.png


//读时序---一个字节


u8 ds18b20_read_bit(void)
{
u8 dat=0;//返回dat来判断读一还是零
DS18B20_PORT=1;//准备工作
_nop_();_nop_();
DS18B20_PORT=0;//第一步,拉低
_nop_();_nop_();//第二步,延时
if(DS18B20_PORT) dat=1;//此处是对1和0的判断,用if比较好
else dat=0;//如果DS18B20是低,则返回的dat为0
delay_10us(45);
}

//读时序---将每个字节都写

u8 ds18b20_write_type(void)
{
u8 i=0;//for用到
u8 dat=0;
u8 temp=0;
for(i=0;i<7;i++)
{
temp=ds18b20_read_bit();//将读一个字节的值传递给temp
dat=temp<<7;//将temp左移7位,传递给dat
dat>>=dat;//向右移动一位,给下一个数做铺垫
}
return dat;//返回读时序每一位的1或0
}


5.温度读取过程:


dc9905c8030e47e1a651faca33592cb8.png


DS18B20 的典型温度读取过程为:1.复位→2.发 SKIP ROM 命令(0XCC)→3.发开始转 换命令(0X44)→4.延时→5.复位→6.发送 SKIP ROM 命令(0XCC)→7.发读存储器命令 (0XBE)→8.连续读出两个字节数据(即温度)→9.结束。


//DS18B20温度读取过程函数


float ds18b20_read_temperture(void)
{
float temp;//读取并传递最终的值
u8 dath=0;//高字节,即高八位
u8 datl=0;//低字节,即第八位
u16 value=0;
ds18b20_reset();//第一步,复位
ds18b20_check();// 检测
ds18b20_write_byte(0xcc);//第二步,发0XCC命令
ds18b20_write_byte(0xbe);//第三步,发0x44
//第四步延时,可跳过,因为写函数里面自带延时
ds18b20_reset();//第五步,复位
ds18b20_check();// 检测
ds18b20_write_byte(0xcc);//第六步,发0XCC命令
ds18b20_write_byte(0xbe);//第七步,发0x44
//第八步 读两个字节,需要第八位+高八位,
//高八位按位向左移八位才是真正的高八位,
//并将此时的高八位和第八位相加,即是16位数据value
//之后判断符合位,如果是负温度,需要&0xf800,
//之后按位取反再+1,所得结果*0.0625,
//因为温度是负数,所以注意带负号
datl=ds18b20_read_byte();//第八步,读低字节+
dath=ds18b20_read_byte();//高字节
value=(dath<<8)+datl;//合并为16位数据
if((value&0xf800)==0xf800)//判断符号位,负温度
{
value=(~value)+1; //数据取反再加1
temp=value*(-0.0625);//乘以精度
}
else //正温度
{
temp=value*0.0625;
}
return temp;
}


相关文章
|
1月前
|
存储 算法 编译器
如何优化单片机程序里面的C代码方法
如何优化单片机程序里面的C代码方法
19 0
|
9月前
【单片机】简易计算器完整代码带电路图
【单片机】简易计算器完整代码带电路图
229 0
【单片机】简易计算器完整代码带电路图
|
9月前
|
传感器 芯片
51单片机读取DS18B20温度传感器
51单片机读取DS18B20温度传感器
150 0
|
9月前
|
传感器
【单片机】单片机课程设计(测温打铃)附完整代码和电路图
【单片机】单片机课程设计(测温打铃)附完整代码和电路图
143 0
|
10月前
|
传感器 存储 数据采集
单片机基于stm32单片机的数字温度计设计_kaic
古往今来,陶瓷在我们的生活中一直都是不可或缺的物品,而随着当今社会经济的快速发展,人们对于这些高档陶瓷产品的使用性能和产品质量上的要求也愈加严格。那么在陶瓷品的生产过程中,想要提高陶瓷品的品质和合格率,能够随时监测温度的温度计是必不可少的。 本课题的研究是基于单片机控制技术,设计出能够在陶瓷升温阶段对陶瓷温度进行检测和报警的温度计,以满足生产过程中对温度的实时检测的需求。 本文详细的阐述了温度计的设计原理以及它的硬件组成模块和软件设计方案。本课题是基于STM32单片机,使用K型热电偶温度传感器进行温度采集再通过OLED显示温度,并通过蓝牙模块进行远程控制和监测。在本课题的制作中,也考虑了本系统
|
11月前
|
传感器 芯片
基于51单片机的智能热水器STC89C52水位检测传感器DS18B20温度探头传感器
基于51单片机的智能热水器 由STC89C52单片机+水位检测传感器+DS18B20温度探头传感器+按键模块+继电器模块+报警及指示模块+LCD1602显示模块+电源构成。 具体功能: 1、LCD1602显示屏第一行显示温度及定时时间,第二行显示温度上限和下限值; 2、按键可以设置温度的上下限值及定时时间;定时时间到开始加热 3、用两个水位检测传感器检测水位:当水位下限传感器检测到有水时,继电器开始控制加水;当水位上限传感器检测到有水时,停止加水; 4、当温度低于设置的下限温度值时,继电器开始控制加热;当温度高于设置的上限温度值时,停止加热。
96 0
|
11月前
【51单片机】使用STC烧录软件生成定时器的代码以及注意事项
使用STC烧录软件生成定时器的代码以及注意事项
163 0
【51单片机】使用STC烧录软件生成定时器的代码以及注意事项
|
11月前
【51单片机】使用STC烧录软件自动生成延时代码
【51单片机】使用STC烧录软件自动生成延时代码
93 0
|
11月前
【STC15单片机】模拟I2C操作AT24C02数据读取,PCF8591的A/D转换代码
【STC15单片机】模拟I2C操作AT24C02数据读取,PCF8591的A/D转换代码
177 0
|
11月前
|
传感器 存储 编解码
51单片机&15单片机 温度传感器DS18B20
51单片机&15单片机 温度传感器DS18B20
281 0