51单片机~DS18B20温度传感器

(一)简介说明:


(二)接线:


1. 内部结构:



正温度前五位是0.
负温度前五位是1.


由LS,MS组成的四位十六进制数,和16位二进制数。(先MS后LS)
结合上下图直到温度计算:1乘2 ^ 6 + 0乘2 ^ 5 +1乘2^ 4 +0乘2^ 3 +……2^0 ==85







(二)使用流程,按照时序图编写程序(判断应用):
粗黑线是总线控制的电平
灰线表示DS18B20控制的;
电阻上拉是由于上图接线有一个上拉电阻


读时重复七次直到读完为止



测试温度代码:
temp.h

#ifndef __TEMP_H_
#define __TEMP_H_#include<reg52.h>
//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint unsigned int
#endif//--定义使用的IO口--//
sbit DSPORT=P3^7;//--声明全局函数--//
void Delay1ms(uint );
uchar Ds18b20Init();
void Ds18b20WriteByte(uchar com);
uchar Ds18b20ReadByte();
void  Ds18b20ChangTemp();
void  Ds18b20ReadTempCom();
int Ds18b20ReadTemp();#endif

main.c

/**************************************************************************************
实验现象:下载程序后,在温度传感器接口处,按照丝印方向插好温度传感器,数码管就会显示检测的温度值接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)注意事项:                                     ***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include"temp.h"  typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;char num=0;
u8 DisplayData[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名         : datapros()
* 函数功能         : 温度读取处理转换函数
* 输    入         : temp
* 输    出         : 无
*******************************************************************************/void datapros(int temp)
{float tp;  if(temp< 0)              //当温度值为负数{DisplayData[0] = 0x40;     //   -//因为读取的温度是实际温度的补码,所以减1,再取反求出原码temp=temp-1;temp=~temp;tp=temp;temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就//算加上0.5,还是在小数点后面。}else{         DisplayData[0] = 0x00;tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量//如果温度是正的那么,那么正数的原码就是补码它本身temp=tp*0.0625*100+0.5;    //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就//算加上0.5,还是在小数点后面。}DisplayData[1] = smgduan[temp % 10000 / 1000];DisplayData[2] = smgduan[temp % 1000 / 100];DisplayData[3] = smgduan[temp %  100 / 10];DisplayData[4] = smgduan[temp %  10 / 1];}/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<6;i++){switch(i)   //位选,选择点亮的数码管,{case(0):LSA=1;LSB=1;LSC=1; break;//显示第0位case(1):LSA=0;LSB=1;LSC=1; break;//显示第1位case(2):LSA=1;LSB=0;LSC=1; break;//显示第2位case(3):LSA=0;LSB=0;LSC=1; break;//显示第3位case(4):LSA=1;LSB=1;LSC=0; break;//显示第4位case(5):LSA=0;LSB=1;LSC=0; break;//显示第5位}P0=DisplayData[i];//发送数据delay(100); //间隔一段时间扫描    P0=0x00;//消隐}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   while(1){datapros(Ds18b20ReadTemp());    //数据处理函数DigDisplay();//数码管显示函数     }
}

temp.c

#include"temp.h"
/*******************************************************************************
* 函 数 名         : Delay1ms
* 函数功能         : 延时函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void Delay1ms(uint y)
{uint x;for( ; y>0; y--){for(x=110; x>0; x--);}
}
/*******************************************************************************
* 函 数 名         : Ds18b20Init
* 函数功能         : 初始化
* 输    入         : 无
* 输    出         : 初始化成功返回1,失败返回0
*******************************************************************************/uchar Ds18b20Init()
{uchar i;DSPORT = 0;            //将总线拉低480us~960usi = 70; while(i--);//延时642usDSPORT = 1;            //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低i = 0;while(DSPORT)  //等待DS18B20拉低总线{Delay1ms(1);i++;if(i>5)//等待>5MS{return 0;//初始化失败}}return 1;//初始化成功
}/*******************************************************************************
* 函 数 名         : Ds18b20WriteByte
* 函数功能         : 向18B20写入一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void Ds18b20WriteByte(uchar dat)
{uint i, j;for(j=0; j<8; j++){DSPORT = 0;              //每写入一位数据之前先把总线拉低1usi++;DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始i=6;while(i--); //延时68us,持续时间最少60usDSPORT = 1;  //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值dat >>= 1;}
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadByte
* 函数功能         : 读取一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/uchar Ds18b20ReadByte()
{uchar byte, bi;uint i, j;  for(j=8; j>0; j--){DSPORT = 0;//先将总线拉低1usi++;DSPORT = 1;//然后释放总线i++;i++;//延时6us等待数据稳定bi = DSPORT;   //读取数据,从最低位开始读取/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/byte = (byte >> 1) | (bi << 7);                         i = 4;       //读取完之后等待48us再接着读取下一个数while(i--);}              return byte;
}
/*******************************************************************************
* 函 数 名         : Ds18b20ChangTemp
* 函数功能         : 让18b20开始转换温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void  Ds18b20ChangTemp()
{Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);      //跳过ROM操作命令      Ds18b20WriteByte(0x44);        //温度转换命令//Delay1ms(100);    //等待转换成功,而如果你是一直刷着的话,就不用这个延时了}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadTempCom
* 函数功能         : 发送读取温度命令
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void  Ds18b20ReadTempCom()
{   Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);    //跳过ROM操作命令Ds18b20WriteByte(0xbe);  //发送读取温度命令
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadTemp
* 函数功能         : 读取温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/int Ds18b20ReadTemp()
{int temp = 0;uchar tmh, tml;Ds18b20ChangTemp();               //先写入转换命令Ds18b20ReadTempCom();          //然后等待转换完后发送读取温度命令tml = Ds18b20ReadByte();     //读取温度值共16位,先读低字节tmh = Ds18b20ReadByte();       //再读高字节temp=tmh; temp<<=8;    //将字符移位到高八位空出低八位temp |= tml;  //将低八位组合  0000 0000 | tel=tel; 从而使高低八位结合return temp;
}

51单片机~DS18B20温度传感器相关推荐

  1. 51单片机DS18B20温度传感器及数码管显示温度

    51单片机DS18B20温度传感器及数码管显示温度 大家好,今天给大家带来的代码及原理解释是,在51单片机在接收DS18B20温度传感器数据,并且在数码管上实时显示温度 DS18B20及数码管显示温度 ...

  2. 51单片机 | DS18B20 温度传感器实验

    文章目录 一.DS18B20介绍 二.硬件设计 三.软件设计 1.数码管显示函数 2.DS18B20 初始化函数及温度读取函数 4.主函数 四.实验现象   这一节我们来学习精度较高的外部 DS18B ...

  3. 51单片机DS18B20温度传感器使用及数码管温度计、LCD1602温度显示代码详解

    温馨提示:读者若要彻底理解并会灵活使用DS18B20温度传感器,请详细阅读中文手册,并且对照代码注释充分分析代码.请不要觉得中文手册内容繁多!如能静心分析,定能深有体会,获益匪浅! 一.DS18B20 ...

  4. 4.5 51单片机-DS18B20温度传感器

    4.5 DS18B20温度传感器 4.5.1 原理图介绍 图4-5-1 图4-5-2 实验板上的DS18B20模块接在单片机的P3.5 IO口上,在插入DS18B20芯片时,圆弧朝上插入,具体效果可以 ...

  5. 51单片机DS18B20温度传感器详解

    DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点.单总线,意味着没有时钟线,只有一根通信线.单总线读写数据是靠控制起始时间和 ...

  6. 51单片机DS18B20温度传感器原理及实验

    目录 DS18B20简介 外部结构 内部结构 数据温度的读取 实验 程序实现 附 DS18B20简介 DS18B20 是由 DALLAS 半导体公司推出的一种的"一线总线(单总线)" ...

  7. 51单片机——DS18B20温度传感器

    目录 DS18B20特性 内部存储器表 ROM指令表 RAM指令表 DS18B20暂存器表 单个DS18B20温度转换过程 温度读取及计算 配置寄存器(分辨率) 读写时序 复位及存在检测 写时序 读时 ...

  8. 51单片机DS18B20温度传感器

    DS18B20 DS18B20 是单线接口数字温度传感器,测量范围是-55℃-+125℃,-10℃-+85℃范围内精 度是±0.5℃,测量分辨率为 9-12 位(复位值为 12 位,最大转换时间为 7 ...

  9. 51单片机+DS18B20+数码管显示+串口通讯+Proteus仿真

    51单片机+DS18B20+数码管显示+串口通讯+Proteus仿真 本实验通过51单片机读取DS18B20温度传感器的温度,然后通过数码管显示,并通过串口,将读取到的温度数据发送出去. 本案例需要使 ...

最新文章

  1. 正确“假期休息模式”
  2. windows 2003几个优化技巧
  3. routeros v6.43.2_routeros软路由负载均衡,充分利用带宽,提高效率降低成本
  4. Dividing the numbers CodeForces - 899C (构造)
  5. 聊聊同步、异步、阻塞与非阻塞
  6. Ubuntu配置静态IP
  7. C#LeetCode刷题之#575-分糖果​​​​​​​(Distribute Candies)
  8. MongoDB更新文档(非常详细,不要错过~)
  9. 数据结构:二维ST表
  10. CRS-1714:Unable to discover any voting files
  11. Delphi2007卸载
  12. 4W字全面解读数据中台、数据仓库和数据湖
  13. HttpServletRequest--request.getParameter /getParameterValues/getParameterNames()/getParameterValues
  14. 代码炼金术·02集·卓越程序员磨刀不误砍柴工--快速学习能力
  15. 代理是如何实现IP伪装的呢?
  16. Unity VR开发教程 OpenXR+XR Interaction Toolkit 2.1.1 (四) 传送
  17. 企业WiFi管理 保卫我们的信息安全
  18. 大数据Impala系列之初识Impala
  19. 3G门户Android面试题(2013年)
  20. 什么是linux文件句柄,Linux中的“陈旧文件句柄”是什么意思?

热门文章

  1. 鱼C论坛小甲鱼Python课后题
  2. 解决Ubuntu中vi命令的编辑模式下不能正常使用方向键和退格键的问题
  3. xrd连续扫描和步进扫描_X射线衍射仪(XRD)相关术语解释
  4. 重构 java代码_java代码重构的方法学习
  5. My97DatePicker IE兼容问题
  6. 股权融资的有哪些方式
  7. 使用EXCEL 2007制作表格时,在下拉过程中使表头固定不动 冻结窗格(转载)
  8. html标签验证的作用,HTML元素blockquote标签的用法及作用
  9. GD32F303的SPI初始化完毕,发送SPI数据后。如果想要改变频率SPEED,必须重新初始化SPI时钟。否则SPI将失效
  10. 领导说,不懂汇报,怎么给你升职?让我学习麦肯锡的:金字塔原理、MECE法则...