基于51单片机+DS18B20温度测温器+LCD1602显示

发布者:科技创造者最新更新时间:2022-09-20 来源: csdn关键字:51单片机  DS18B20  LCD1602显示 手机看文章 扫描二维码
随时随地手机看文章

DS18B20特性

1.独特的单总线接口,就需一条线则可实现双向通信(测温)

2.测温范围:-55℃~+125℃,可通过编程设定9—12位分辨率,对应分辨温度分别为0.5、0.25、0.125、0.0625℃。

3.支持多点组网(可连接多个DS18B20温度传感器),多个DS18B20可以并联(3或2线)实现多个组网测温,但注意超过8个要解决好供电问题,否则电压过低会导致传输不稳定,从而数据不准确。

4.工作电压:3.0~5.5V (寄生电源方式下可由数据线供电)

5.在使用过程中不需要外围电路,全部传感元件及转换电路都在芯片内了。(上拉电阻

6.测温结果直接是数字量输出,单总线串行传送方式,同时可传送CRC校验码(校验数据采集是否正确),具有极强的抗干扰和纠错能力。

7.在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字。

8.负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。


封装形式与引脚说明

在这里插入图片描述

供电方式(外部电源供电、寄生电源供电、寄生电源强上拉)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

内部结构

DS18B20内部结构如图所示,其中与操作有关的是:64位光刻ROM、温度传感器、9个字节的RAM存储器、EEPROM(温度报警寄存器TH和TL、配置寄存器)。

在这里插入图片描述

光刻ROM中64位序列号是出厂前就光刻好的,相当地址序列号。排列是低位开始,低8位(产品类型标号),接着48位(自身序列号,)相当于身份证号、最高8位(前面56位的循环亢余校验码)。

如果一条总线挂接多个DS18B20需要MCU(微控制器)通过单总线对多个DS18B20进行寻址。

在这里插入图片描述

在这里插入图片描述

温度存储格式及配置寄存器(模式和分辨率)

DS18B20温度传感器进行测温,测温是以16位的二进制形式提供。

存放格式:

在这里插入图片描述

16位中 低4位是温度的小数部分、最高5位是温度的正负(全为0为正,全为1为负),中间的7位则是温度的整数部分。小数部分十进制等于16进制乘0.0625。


例子:

在这里插入图片描述

注意:如果是负数温度,那么得按位取反+1。

比如数据为 1111 1100 1001 0000

首先低4位都为0.所以温度小数部分为0。最高5位为1,所以温度是负数,所以我们得按位取反才是正确的数, 温度的整数部分为 100 1001——>按位取反得:011 0110 再+1 则结果是 011 0111 ——>0x37(16进制)——>55℃(十进制)


配置寄存器

image.png

TM:测试模式位,用于设置是在工作方式还是测试模式。在DS18B20出厂时该位设为0,用户不要改动。

R1 R0:分辨率设置

image.png

DS18B20指令(ROM指令操作)

image.png

注:每个指令在写都是 低位在前 高位在后 DS18B20发送也是先发低位,再发高位。

比如发送跳过ROM指令(CCH) 二进制位:1100 1100 。发送顺序为

0、0 、1、1、 0、 0、 1、 1 。


指令的使用

多个DS18B20情况: 对某一个操作时,主机先逐个与DS18B20挂接-搜索ROM——(F0H),发出匹配ROM指令(55H),紧接着提供64位序列号,之后操作就是针对DS18B20的了。


单个DS18B20情况: 不需要搜索ROM指令,读ROM指令以及匹配ROM等操作,直接跳过ROM指令(CCH),温度转换(44H),读温度操作(8EH)。


注意事项

一、 DS18B20硬件是简单,但软件就比较复杂,特别是时序要求。

二、 连接DS18B20线长限制:部分资料显示:

采用普通信号电缆传输超50m时,测温数据不稳定。

采用带屏蔽层双绞线电缆,正常通讯距离可达到150m。

采用每米绞合次数更多的带屏蔽层双绞线电缆时,通讯距离进一步加长。

三、 距离长了测温要考虑总线分布电容和阻抗匹配问题。

在测温程序设计中,一般如果硬件没什么问题,可以采用延时来跳过检测,但是如果要检测是否有应答要注意不要进入了死循环。


时序图

初始化

在这里插入图片描述

/*DS18B20初始化函数*/

void initDs18b20()

{

DS18B20 = 1;

delay20us();

DS18B20 = 0;   //拉低电平 

delay480us();  //480us-960us之间均可

DS18B20 = 1;   //拉高电平

delay50us();   //等待15us-60us

if(DS18B20 == 1) //如果未响应

{

ds18b20Flag = 1; //DS18B20未响应 标志位置1

}

delay240us();

}


写时序(写0或1)

在这里插入图片描述

/*DS18B20写命令函数*/

void ds18b20WriteData(unsigned char com)

{

unsigned char i;

for(i=0;i<8;i++)

{

DS18B20 = 0; //拉低电平

//延时至少1us

DS18B20 = com&0x01;

delay60us(); //至少60us直到周期结束

DS18B20 = 1;

com = com>>1; //右移一位

}

}


读时序(读0或1)

在这里插入图片描述

/*DS18B20读数据函数*/

unsigned char ds18b20ReadData()

{

unsigned char i;

unsigned char dat = 0; //接收数据


for(i=0;i<8;i++)

{

DS18B20 = 0;  //拉低电平至少1us

dat=dat>>1;   //右移一位

DS18B20 = 1; //释放总线

if(DS18B20 == 1) //如果是1

{

dat = dat|0x80;

}

delay45us(); //保持45us

DS18B20 = 1; //释放总线

}

return dat;

}


程序代码

每一次进行写ROM相关命令都记得初始化。

对于单个DS18B20我们可以直接跳过ROM指令 直接温度转换。读取温度


步骤:

1.初始化

2.跳过ROM指令

3.启动温度转换(需要时间)

4.延时(等待温度转换)

5.初始化 (记得每写ROM相关命令记得需要从初始化开始)

6.读取温度

7.显示温度


LCD1602显示温度

main.c(主函数)

#include

#include "delay.h"

#include "lcd1602.h"


sbit DS18B20 = P3^7; //DS18B20引脚

unsigned char ds18b20Flag; //DS18B20是否响应标志位

unsigned char temperature[2] = {''}; //存放温度整数和小数

unsigned char code array[14] = {"DS18B20 error!"};

unsigned char code array1[5] = {"Temp:"};


/*DS18B20初始化函数*/

void initDs18b20()

{

DS18B20 = 1;

delay20us();

DS18B20 = 0;   //拉低电平 

delay480us();  //480us-960us之间均可

DS18B20 = 1;   //拉高电平

delay50us();   //等待15us-60us

if(DS18B20 == 1) //如果未响应

{

ds18b20Flag = 1; //DS18B20未响应 标志位置1

}

delay240us();

}


/*DS18B20写命令函数*/

void ds18b20WriteData(unsigned char com)

{

unsigned char i;

for(i=0;i<8;i++)

{

DS18B20 = 0; //拉低电平

//延时至少1us

DS18B20 = com&0x01;

delay60us();

DS18B20 = 1;

com = com>>1;

}

}


/*DS18B20读数据函数*/

unsigned char ds18b20ReadData()

{

unsigned char i;

unsigned char dat = 0; //接收数据


for(i=0;i<8;i++)

{

DS18B20 = 0;  //拉低电平至少1us

dat=dat>>1;   //右移一位

DS18B20 = 1; //释放总线

if(DS18B20 == 1)

{

dat = dat|0x80;

}

delay45us(); //保持45us

DS18B20 = 1; //释放总线

}

return dat;

}


/*读取温度函数*/

void readTemperature()

{

unsigned char temperatureLow;  //温度低字节

unsigned char temperatureHigh; //温度高字节

unsigned char tempFlag = 0; //温度正负标志位

unsigned char disposeValue; //处理值


initDs18b20(); //初始化DS18B20

ds18b20WriteData(0xcc); //跳过ROM

ds18b20WriteData(0x44); //启动温度转换指令

//延时一段时间

delay800ms();

initDs18b20(); //每一次写命令都需要初始化

ds18b20WriteData(0xcc); //跳过ROM

ds18b20WriteData(0xbe); //读暂存器内容

temperatureLow = ds18b20ReadData(); //获取温度的第一个字节

temperatureHigh = ds18b20ReadData(); //获取温度的第二个字节

disposeValue = (temperatureHigh<<4)|(temperatureLow>>4);  //获取温度整数部分

if(disposeValue>=128)  //温度是负数

{

disposeValue = ~disposeValue+1;

tempFlag = 1;

}

temperature[0] = disposeValue; //温度整数

temperature[1] = temperatureLow & 0x0f; //温度小数 

}


void displayTemperature()

{

write_com(0x85);

write_data((temperature[0]/100) + 0x30); //温度百位

write_com(0x86);

write_data((temperature[0]/10%10) + 0x30); //温度十位

write_com(0x87);

write_data((temperature[0]%10) + 0x30);   //温度个位


write_com(0x88);

write_data('.');


write_com(0x89);

write_data((temperature[1]*10/16) + 0x30); //小数第一位

// write_data((tempterature[1]*625/1000));

write_com(0x8a);

write_data((temperature[1]*100/16%10) + 0x30); //小数第二位

// write_data((tempterature[1]*625/100%10));


/* 显示 ℃ */

write_com(0x8b);

write_data(0xdf);

write_com(0x8c); 

write_data('C');

}


void main()

{

unsigned char i;


init_lcd(); //初始化1602

write_com(0x80);

for(i=0;i<5;i++)

{

write_data(array1[i]);

}

while(1)

{

readTemperature();   //读取温度

if(ds18b20Flag == 1)  //如果初始化错误

{

for(i=0;i<14;i++)

{

write_com(0x80);

write_data(array[i]); //显示DS18B20 error!

}

}

else

{

displayTemperature(); //温度显示

}

}

}


项目展示

在这里插入图片描述

关键字:51单片机  DS18B20  LCD1602显示 引用地址:基于51单片机+DS18B20温度测温器+LCD1602显示

上一篇:基于51单片机+DS1302时钟模块+LCD1602显示
下一篇:基于51单片机+DHT11温湿度+LCD1602显示

推荐阅读最新更新时间:2024-11-11 14:40

51单片机PWM-呼吸灯源程序
/****************************************************************** * @file : main.c * @xu ran * @date : 2014年5月23日20:55:19 - 2014年5月23日22:32:12 * @version : V2.0 * @brief : PWM脉冲宽度调制技术 实现呼吸灯 **************************************************************** * @attention * 实验平台 : 51hei开发板 * 单片机 :
[单片机]
013_STM32程序移植之_DS18B20
1. 测试环境:STM32C8T6 2. 测试模块:DS18B20模块 3. 测试接口: 1. DS18B20模块接口: DS18B20引脚 单片机引脚 VCC--------------------5V GND-------------------GND DATA------------------PB12 2. 串口使用串口一,波特率9600 单片机引脚 CH340引脚 VCC--------------------VCC GND-------------------GND PA9--------------------RXD PA10-------------------TXD 移植测试 测试串口一程序
[单片机]
013_STM32程序移植之_<font color='red'>DS18B20</font>
51单片机实验3:led流水灯
开发板led模块电路图如下: 循环左/右移函数头文件为 intrins.h #include reg52.h #include intrins.h #define uc unsigned char void delay(uc n) { uc i,j; for(i=1;i =n;i++) for(j=110;j =1;j--); } void main() { P2=0xFE; while(1) { delay(200); p2=_crol_(P2,1); delay(200); } }
[单片机]
<font color='red'>51单片机</font>实验3:led流水灯
8051单片机(STC89C52)倒计时器
#include STC89C5xRC.H void delay()//用定时器0实现10ms精准定时 { TMOD = 0x01; TH0 = 0xd8; TL0 = 0xf0;//65536 - 10000 = 55536 TF0 = 0;//置溢出标志位为0 TR0 = 1;//开启定时器0 while(TF0 == 0); TR0 = 0;//暂停定时器0 } void disp_digit(int d) { unsigned char code DIG_CODE = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x
[单片机]
80<font color='red'>51单片机</font>(STC89C52)倒计时器
【自学51单片机】3 -- ​硬件基础知识介绍和闪烁LED小灯
1、电磁干扰 电磁干扰简称EMI,包括 ESD(静电放电现象)、EFT(快速瞬间群脉冲效果)、Surge(浪涌效果)等等,ESD、EFT、Surge都是高频信号,对半导体元器件损害较大,在电路设计中要去除电磁干扰影响。 2、电容介绍 1. 电容分类: 铝电解电容、钽电容、陶瓷电容等。 三种电容比较:相同容值下铝电解电容便宜,铝电解电容个头大,钽电容和陶瓷电容个头小,性能好,但贵 。 2. 电容单位:在国际单位制里,电容的单位是法拉,简称法,符号是F,由于法拉这个单位太大,所以常用的电容单位有毫法(mF)、微法(μF)、纳法(nF)和皮法(pF)等,换算关系是:1法拉(F)= 103毫法(mF)=106微法(μF)=10
[单片机]
【自学<font color='red'>51单片机</font>】3 -- ​硬件基础知识介绍和闪烁LED小灯
单片机控制无刷电机初步调试成果和学习经历
调了一天多的无刷电机,用的无刷电调,其实本来应该是用32做的,但是不知道原理, 于是用了比较熟悉的51单片剂一下来进行调试 一下,查询的资料,还是蛮简单的,但是实际操作并没有那么容易, 在网上查也没有能用的程序,尤其是51,因为基本用无刷的都是无人机 四六轴。所以今天贴上我的程序,分享给大家,希望能对各位减少时间学习,快速上手,本程序实现的功能是在第一次给无刷电机上电后,首先拉高油门,然后降低油门,最后满开油门,注意,,,,注意,,,,注意,一定不要用带螺旋桨的无刷电机来实验,危险,开机后会全速运行,我开全速是为了用涵道,所以全速,, 废话不多说,贴程序 51单片机源程序如下: /**********************
[单片机]
单片机控制无刷电机初步调试成果和学习经历
51单片机数字频率计仿真(可按键切换量程)
之前课程设计做的 误差很小 分享给大家 里面有程序和仿真 也做过实物 可以按键切换量程10倍和1倍 单片机源程序如下: #include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char sbit k1=P3^0; sbit k2=P2^0; sbit LED=P2^1; unsigned char code dispbit ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴数码管 unsigned char code dispcode ={0x3f,0x06,
[单片机]
<font color='red'>51单片机</font>数字频率计仿真(可按键切换量程)
51单片机做的音乐盒,带八段数码管显示程序+Proteus仿真
#include reg52.h #define uchar unsigned char #define uint unsigned int sbit key1=P3^2;//按key1可以暂停播放 sbit key2=P3^3;//按key2可切换歌曲 sbit fm=P3^7;//蜂鸣器连续的IO口 uchar code shuzi0=0x3f; uchar code shuzi1=0x06;//数字1 uchar code shuzi2=0x5b;//数字2 uchar code shuzi3=0x4f; uchar code shuzi4=0x66; uchar code shuzi5=0x6d; uchar code
[单片机]
<font color='red'>51单片机</font>做的音乐盒,带八段数码管<font color='red'>显示</font>程序+Proteus仿真
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved