一、DS18B20介绍

DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线(单总线)”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。
  DS18B20 温度传感器具有如下特点:

  1. 适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电。 独特的单线接口方式,DS18B20
  2. 在与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。
  3. DS18B20 支持多点组网功能,多个 DS18B20
  4. 可以并联在唯一的三线上,实现组网多点测温。 DS18B20
  5. 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
  6. 温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃ 可编程的分辨率为 9~12 位,对应的可分辨温度分别为
  7. 0.5℃、0.25℃、0.125℃ 和0.0625℃,可实现高精度测温。 在 9 位分辨率时最多在 93.75ms 内把温度转换为数字,12 位分辨率时最多在 750ms 内把温度值转换为数字,速度更快。
    8.测量结果直接输出数字温度信号,以"一根总线"串行传送给 CPU,同时可传送 CRC 校验码,具有极强的抗干扰纠错能力。
    9.负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
      DS18B20 外观实物如下图所示:

    实验代码:
main.c
#include "public.h"
#include "smg.h"
#include "ds18b20.h"
/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   u8 i=0;int temp_value;u8 temp_buf[5];ds18b20_init();//初始化DS18B20while(1){              i++;if(i%50==0)//间隔一段时间读取温度值,间隔时间要大于温度传感器转换温度时间temp_value=ds18b20_read_temperture()*100;//保留温度值小数后两位/*if(temp_value<0)//负温度{temp_value=-temp_value;temp_buf[0]=0x40;//显示负号 }*/elsetemp_buf[0]=gsmg_code[temp_value/10000];//百位temp_buf[1]=gsmg_code[temp_value/1000%10];//十位temp_buf[2]=gsmg_code[temp_value/100%10]|0x80;//个位+小数点temp_buf[3]=gsmg_code[temp_value/10%10];//小数点后一位temp_buf[4]=gsmg_code[temp_value%10];//小数点后两位smg_display(temp_buf,4);}
}
smg.c
#include "smg.h"
//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*******************************************************************************
* 函 数 名       : smg_display
* 函数功能       : 动态数码管显示
* 输    入       : dat:要显示的数据pos:从左开始第几个位置开始显示,范围1-8
* 输    出         : 无
*******************************************************************************/
void smg_display(u8 dat[],u8 pos)
{u8 i=0;u8 pos_temp=pos-1;for(i=pos_temp;i<8;i++){switch(7-i)//位选{case 0: LSC=1;LSB=1;LSA=1;break;case 1: LSC=1;LSB=1;LSA=0;break;case 2: LSC=1;LSB=0;LSA=1;break;case 3: LSC=1;LSB=0;LSA=0;break;case 4: LSC=0;LSB=1;LSA=1;break;case 5: LSC=0;LSB=1;LSA=0;break;case 6: LSC=0;LSB=0;LSA=1;break;case 7: LSC=0;LSB=0;LSA=0;break;}SMG_A_DP_PORT=dat[i-pos_temp];//传送段选数据delay_10us(100);//延时一段时间,等待显示稳定SMG_A_DP_PORT=0x00;//消音}
}
smg.h
#ifndef _smg_H
#define _smg_H#include "public.h"#define SMG_A_DP_PORT    P0  //使用宏定义数码管段码口//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;extern u8 gsmg_code[17];void smg_display(u8 dat[],u8 pos);#endif
ds18b20.c
#include "ds18b20.h"
#include "intrins.h"
/*******************************************************************************
* 函 数 名         : ds18b20_reset
* 函数功能         : 复位DS18B20
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ds18b20_reset(void)
{DS18B20_PORT=0;   //拉低DQdelay_10us(75);   //拉低750usDS18B20_PORT=1;   //DQ=1delay_10us(2);   //20US
}
/*******************************************************************************
* 函 数 名         : ds18b20_check
* 函数功能         : 检测DS18B20是否存在
* 输    入         : 无
* 输    出         : 1:未检测到DS18B20的存在,0:存在
*******************************************************************************/
u8 ds18b20_check(void)
{u8 time_temp=0;while(DS18B20_PORT&&time_temp<20)   //等待DQ为低电平{time_temp++;delay_10us(1); }if(time_temp>=20)return 1; //如果超时则强制返回1else time_temp=0;while((!DS18B20_PORT)&&time_temp<20)   //等待DQ为高电平{time_temp++;delay_10us(1);}if(time_temp>=20)return 1;  //如果超时则强制返回1return 0;
}
/*******************************************************************************
* 函 数 名         : ds18b20_read_bit
* 函数功能         : 从DS18B20读取一个位
* 输    入         : 无
* 输    出         : 1/0
*******************************************************************************/
u8 ds18b20_read_bit(void)
{u8 dat=0;DS18B20_PORT=0;_nop_();_nop_();DS18B20_PORT=1; _nop_();_nop_(); //该段时间不能过长,必须在15us内读取数据if(DS18B20_PORT)dat=1;  //如果总线上为1则数据dat为1,否则为0else dat=0;delay_10us(5);return dat;
}
/*******************************************************************************
* 函 数 名         : ds18b20_read_byte
* 函数功能         : 从DS18B20读取一个字节
* 输    入         : 无
* 输    出         : 一个字节数据
*******************************************************************************/
u8 ds18b20_read_byte(void)
{u8 i=0;u8 dat=0;u8 temp=0;for(i=0;i<8;i++)//循环8次,每次读取一位,且先读低位再读高位{temp=ds18b20_read_bit();dat=(temp<<7)|(dat>>1);}return dat;
}
/*******************************************************************************
* 函 数 名         : ds18b20_write_byte
* 函数功能         : 写一个字节到DS18B20
* 输    入         : dat:要写入的字节
* 输    出         : 无
*******************************************************************************/
void ds18b20_write_byte(u8 dat)
{u8 i=0;u8 temp=0;for(i=0;i<8;i++)//循环8次,每次写一位,且先写低位再写高位{temp=dat&0x01;//选择低位准备写入dat>>=1;//将次高位移到低位if(temp){DS18B20_PORT=0;_nop_();_nop_();DS18B20_PORT=1;  delay_10us(6);}else{DS18B20_PORT=0;delay_10us(6);DS18B20_PORT=1;_nop_();_nop_();  }   }
}
/*******************************************************************************
* 函 数 名         : ds18b20_start
* 函数功能         : 开始温度转换
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ds18b20_start(void)
{ds18b20_reset();//复位ds18b20_check();//检查DS18B20ds18b20_write_byte(0xcc);//SKIP ROMds18b20_write_byte(0x44);//转换命令
}
/*******************************************************************************
* 函 数 名         : ds18b20_init
* 函数功能         : 初始化DS18B20的IO口 DQ 同时检测DS的存在
* 输    入         : 无
* 输    出         : 1:不存在,0:存在
*******************************************************************************/
u8 ds18b20_init(void)
{ds18b20_reset();return ds18b20_check();
}
/*******************************************************************************
* 函 数 名         : ds18b20_read_temperture
* 函数功能         : 从ds18b20得到温度值
* 输    入         : 无
* 输    出         : 温度数据
*******************************************************************************/
float ds18b20_read_temperture(void)
{float temp;u8 dath=0;u8 datl=0;u16 value=0;ds18b20_start();//开始转换ds18b20_reset();//复位ds18b20_check();ds18b20_write_byte(0xcc);//SKIP ROMds18b20_write_byte(0xbe);//读存储器datl=ds18b20_read_byte();//低字节dath=ds18b20_read_byte();//高字节value=(dath<<8)+datl;//合并为16位数据if((value&0xf800)==0xf800)//判断符号位,负温度{value=(~value)+1; //数据取反再加1temp=value*(-0.0625);//乘以精度    }else //正温度{temp=value*0.0625; }return temp;
}
ds18b20.h
#ifndef _ds18b20_H
#define _ds18b20_H#include "public.h"//管脚定义
sbit DS18B20_PORT=P3^7;    //DS18B20数据口定义//函数声明
u8 ds18b20_init(void);
float ds18b20_read_temperture(void);#endif
public.c
#include "public.h"
/*******************************************************************************
* 函 数 名       : delay_10us
* 函数功能       : 延时函数,ten_us=1时,大约延时10us
* 输    入       : ten_us
* 输    出         : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{while(ten_us--);
}
/*******************************************************************************
* 函 数 名       : delay_ms
* 函数功能       : ms延时函数,ms=1时,大约延时1ms
* 输    入       : ms:ms延时时间
* 输    出         : 无
*******************************************************************************/
void delay_ms(u16 ms)
{u16 i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);
}
public.h
#ifndef _public_H
#define _public_H#include "reg52.h"typedef unsigned int u16;  //对系统默认数据类型进行重定义
typedef unsigned char u8;void delay_10us(u16 ten_us);
void delay_ms(u16 ms);#endif
reg52.h
/*--------------------------------------------------------------------------
REG52.HHeader file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/#ifndef __REG52_H__
#define __REG52_H__/*  BYTE Registers  */
sfr P0    = 0x80;
sfr P1    = 0x90;
sfr P2    = 0xA0;
sfr P3    = 0xB0;
sfr PSW   = 0xD0;
sfr ACC   = 0xE0;
sfr B     = 0xF0;
sfr SP    = 0x81;
sfr DPL   = 0x82;
sfr DPH   = 0x83;
sfr PCON  = 0x87;
sfr TCON  = 0x88;
sfr TMOD  = 0x89;
sfr TL0   = 0x8A;
sfr TL1   = 0x8B;
sfr TH0   = 0x8C;
sfr TH1   = 0x8D;
sfr IE    = 0xA8;
sfr IP    = 0xB8;
sfr SCON  = 0x98;
sfr SBUF  = 0x99;/*  8052 Extensions  */
sfr T2CON  = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2    = 0xCC;
sfr TH2    = 0xCD;/*  BIT Registers  */
/*  PSW  */
sbit CY    = PSW^7;
sbit AC    = PSW^6;
sbit F0    = PSW^5;
sbit RS1   = PSW^4;
sbit RS0   = PSW^3;
sbit OV    = PSW^2;
sbit P     = PSW^0; //8052 only/*  TCON  */
sbit TF1   = TCON^7;
sbit TR1   = TCON^6;
sbit TF0   = TCON^5;
sbit TR0   = TCON^4;
sbit IE1   = TCON^3;
sbit IT1   = TCON^2;
sbit IE0   = TCON^1;
sbit IT0   = TCON^0;/*  IE  */
sbit EA    = IE^7;
sbit ET2   = IE^5; //8052 only
sbit ES    = IE^4;
sbit ET1   = IE^3;
sbit EX1   = IE^2;
sbit ET0   = IE^1;
sbit EX0   = IE^0;/*  IP  */
sbit PT2   = IP^5;
sbit PS    = IP^4;
sbit PT1   = IP^3;
sbit PX1   = IP^2;
sbit PT0   = IP^1;
sbit PX0   = IP^0;/*  P3  */
sbit RD    = P3^7;
sbit WR    = P3^6;
sbit T1    = P3^5;
sbit T0    = P3^4;
sbit INT1  = P3^3;
sbit INT0  = P3^2;
sbit TXD   = P3^1;
sbit RXD   = P3^0;/*  SCON  */
sbit SM0   = SCON^7;
sbit SM1   = SCON^6;
sbit SM2   = SCON^5;
sbit REN   = SCON^4;
sbit TB8   = SCON^3;
sbit RB8   = SCON^2;
sbit TI    = SCON^1;
sbit RI    = SCON^0;/*  P1  */
sbit T2EX  = P1^1; // 8052 only
sbit T2    = P1^0; // 8052 only/*  T2CON  */
sbit TF2    = T2CON^7;
sbit EXF2   = T2CON^6;
sbit RCLK   = T2CON^5;
sbit TCLK   = T2CON^4;
sbit EXEN2  = T2CON^3;
sbit TR2    = T2CON^2;
sbit C_T2   = T2CON^1;
sbit CP_RL2 = T2CON^0;#endif
INTRINS.H
/*--------------------------------------------------------------------------
INTRINS.HIntrinsic functions for C51.
Copyright (c) 1988-2010 Keil Elektronik GmbH and ARM Germany GmbH
All rights reserved.
--------------------------------------------------------------------------*/#ifndef __INTRINS_H__
#define __INTRINS_H__#pragma SAVE#if defined (__CX2__)
#pragma FUNCTIONS(STATIC)
/* intrinsic functions are reentrant, but need static attribute */
#endifextern void          _nop_     (void);
extern bit           _testbit_ (bit);
extern unsigned char _cror_    (unsigned char, unsigned char);
extern unsigned int  _iror_    (unsigned int,  unsigned char);
extern unsigned long _lror_    (unsigned long, unsigned char);
extern unsigned char _crol_    (unsigned char, unsigned char);
extern unsigned int  _irol_    (unsigned int,  unsigned char);
extern unsigned long _lrol_    (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
#if defined (__CX2__)
extern int           abs       (int);
extern void          _illop_   (void);
#endif
#if !defined (__CX2__)
extern void          _push_    (unsigned char _sfr);
extern void          _pop_     (unsigned char _sfr);
#endif#pragma RESTORE#endif

硬件连接:


打叉那个不连,其他按对应颜色连接

实验结果:

采集并显示实时环境温度,环境温度范围为 0°C-40°C,LED 显示 5 位。相关推荐

  1. 黑苹果hidp显示不清楚_魔兽世界9.0:盟约指挥台不显示胜率?搞清楚机制,轻松收菜!...

    自从魔兽世界6.0版本开放了要塞仆从任务(收菜)以来,后续的几个版本,包括最新开放的9.0版本都延续了这个玩法,只不过名字不同罢了,9.0版本的仆从任务改成了盟约大厅指挥台任务,本质都是安排精英NPC ...

  2. 点阵LED显示原理(转)

    加个广告,我的淘宝网店,http://fengmm521.taobao.com 点阵LED显示原理(转2007年5月24日) 前几天看一个朋友做LED屏,就想自已试试看能不能做,在网上找到这个现在和大 ...

  3. 各种LED显示模组的技术分析

    各种LED显示模组的技术分析-序言 此系列文字主要是工作总结,表述不求严谨,目的是给自己的以后的工作留下参考资料.也给从事相关工作的其他设计和工程人员一些参考.如有错误之处还请包涵并请留言指正.我看到 ...

  4. 百度地图开发-显示实时位置信息 04

    在上一篇文章中,已经可以看到默认的百度地图,那就说明我们的操作是正确的,申请的密钥和引入地图SDK是没有问题的,接下来就是按照自己的业务需求来使用百度地图. 百度地图可以设置显示出不同的地图类型,有普 ...

  5. C# CRC16 在textbox中显示实时时间

    PC环境win10,编译器visual studio2015 CRC16的源码 static int crc16(byte[] data, int size) {int crc = 0x0;byte ...

  6. STM32F103+DHT11模块+DS18B20模块 显示实时温湿度并高温高湿报警

    目录 前言 代码下载: 功能介绍: 接线 DS18B20 DHT11 效果图 普通环境 普通版main.c 升级版 哈热气 普通版 升级版 搓手捂热 核心代码 普通版main.c 升级版main.c ...

  7. 思迈特软件Smartbi:数据大屏显示实时数据解决方案

    ​大数据时代 ,数据 是有价值 的"黄金 ",但是 数据 是不会 告诉你 ,那里 存在 价值 ,我们可以通过 大屏显示来直观 的了解 数据 中隐含 的价值 . 大屏显示是什么?顾名 ...

  8. Linux 命令之 env -- 显示系统的环境变量,定义执行命令时的环境变量

    文章目录 一.命令介绍 二.选项参数 三.命令示例 (一)显示系统的环境变量 (二)从当前环境中删除指定的变量 (三)定义指定的环境变量 (四)在一个修改后的环境下执行命令 一.命令介绍 env命令用 ...

  9. stm32数码管显示实时时间并有闹钟功能

    stm32数码管显示实时时间并有闹钟功能 功能描述 数码管介绍 数码管芯片 段选与位选 驱动数码管显示代码 实验思路 完整代码 Led.h Led.c Key.h Key.c beep.h beep. ...

最新文章

  1. node 常用指令 node 扩展链接
  2. oracle修改c root,从新发现Oracle太美之root.sh
  3. #100天计划# 2013年10月14日
  4. CSS自定义消息提示
  5. Mysql 函数入门
  6. 计算机网络之网络概述:1、基本概念
  7. php基础编程教程 pdf,手把手教你编程打印出PDF_PHP教程
  8. Konomi与去中心化借贷协议bZx合作推动DeFi生态发展
  9. 北风设计模式课程---代理模式
  10. 将 PDF 转换为矢量图 emf
  11. 使用 SPDK 技术优化虚拟机本地存储的 IO 性能
  12. 领导让我接私活,怎么办
  13. Coremail-0day敏感文件泄露漏洞送附批量检测脚本
  14. 非线性微分方程的线性化
  15. mysql红黑联盟_MySQL在Centos的卸载和安装 - MySQL - 红黑联盟
  16. tp3.2简单的图片上传实现
  17. C++图书馆资料管理系统
  18. 前端框架React Js入门教程【转】
  19. 【Vue】Vue 项目搭建
  20. 数商云助您“乘风破浪”,倾力打造PCB行业采购管理平台解决方案

热门文章

  1. 3D点云处理:点云聚类--FEC: Fast Euclidean Clustering for Point Cloud Segmentation
  2. Autofac程序集注入
  3. 你应该知道的requestIdleCallback
  4. 双系统安装红旗linux,红旗LINUX怎么安装成双系统?
  5. 关于对技术群中群友积极参与问答的一点看法
  6. 97年Mekka ’97 4K Intro比赛的一等奖作品
  7. 幸运大转盘php逻辑判断,jQuery幸运大转盘_jQuery+PHP抽奖程序(上)
  8. Apache Drill Architecture Introduction
  9. 湖南科技大学Android课程设计之个人理财小助手APP
  10. 【升级为阿里云云效Codeup】