DS18b20 测温程序详解

发布者:夜色迷离最新更新时间:2016-09-27 来源: eefocus关键字:DS18b20  测温程序 手机看文章 扫描二维码
随时随地手机看文章
DS18B20程序-超详细注释
 

#include
#include

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P2^2;                       //数据口define interface
sbit dula = P2^6;                     //数码管段选
sbit wela = P2^7;                    //数码管位选

uint temp;                           //温度值 variable of temperature

//不带小数点
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
         0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//带小数点
unsigned char code table1[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};


/*************精确延时函数*****************/
void delay(unsigned char i) 
{
while(--i); 
}
/******************************************
此延时函数针对的是12Mhz的晶振
delay(0):延时518us 误差:518-2*256=6
delay(1):延时7us   (原帖写"5us"是错的)
delay(10):延时25us    误差:25-20=5
delay(20):延时45us    误差:45-40=5
delay(100):延时205us 误差:205-200=5
delay(200):延时405us 误差:405-400=5
*******************************************/

/*****************DS18B20******************/

void Init_Ds18b20(void)     //DS18B20初始化send reset and initialization command
{
DQ = 1;                     //DQ复位,不要也可行。
delay(1);                  //稍做延时
DQ = 0;                    //单片机拉低总线
delay(250);                //精确延时,维持至少480us
DQ = 1;                    //释放总线,即拉高了总线
delay(100);                //此处延时有足够,确保能让DS18B20发出存在脉冲。
}

uchar Read_One_Byte()       //读取一个字节的数据read a byte date
                            //读数据时,数据以字节的最低有效位先从总线移出
{
uchar i   = 0;
uchar dat = 0;
for(i=8;i>0;i--)
{
   DQ = 0;                  //将总线拉低,要在1us之后释放总线
                           //单片机要在此下降沿后的15us内读数据才会有效。
   _nop_();                 //至少维持了1us,表示读时序开始
   dat >>= 1;               //让从总线上读到的位数据,依次从高位移动到低位。
   DQ = 1;                  //释放总线,此后DS18B20会控制总线,把数据传输到总线上
   delay(1);                 //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
   if(DQ)                   //控制器进行采样
   {
    dat |= 0x80;            //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
   }        
   delay(10);               //此延时不能少,确保读时序的长度60us。
}
return (dat);
}

void Write_One_Byte(uchar dat)
{
uchar i = 0;
for(i=8;i>0;i--)
{
   DQ = 0;                        //拉低总线
   _nop_();                       //至少维持了1us,表示写时序(包括写0时序或写1时序)开始
   DQ = dat&0x01;                 //从字节的最低位开始传输
                                 //指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
                                 //因为15us后DS18B20会对总线采样。
   delay(10);                     //必须让写时序持续至少60us
   DQ = 1;                        //写完后,必须释放总线,
   dat >>= 1;
   delay(1);
}
}


uint Get_Tmp()                   //获取温度get the temperature
{
float tt;
uchar a,b;
Init_Ds18b20();                //初始化
Write_One_Byte(0xcc);          //忽略ROM指令
Write_One_Byte(0x44);          //温度转换指令
Init_Ds18b20();                 //初始化
Write_One_Byte(0xcc);          //忽略ROM指令
Write_One_Byte(0xbe);          //读暂存器指令
a = Read_One_Byte();           //读取到的第一个字节为温度LSB
b = Read_One_Byte();           //读取到的第一个字节为温度MSB
temp = b;                      //先把高八位有效数据赋于temp
temp <<= 8;                    //把以上8位数据从temp低八位移到高八位
temp = temp|a;                //两字节合成一个整型变量
tt = temp*0.0625;              //得到真实十进制温度值
                                //因为DS18B20可以精确到0.0625度
                                //所以读回数据的最低位代表的是0.0625度
temp = tt*10+0.5;               //放大十倍
                                //这样做的目的将小数点后第一位也转换为可显示数字
                                //同时进行一个四舍五入操作。
return temp;
}

 

/****************数码码动态显示函数**************/

void Display(uint temp)   //显示程序
{
uchar A1,A2,A3;
A1 = temp/100;    //百位
A2 = temp%100/10;   //十位
A3 = temp%10;    //个位

dula = 0;
P0 = table[A1];    //显示百位
dula = 1;     //打开段选,对应74573的锁存位,高电平不锁存
dula = 0;

wela = 0;
P0 = 0x7e;
wela = 1;     //打开位选
wela = 0;
delay(0);

dula = 0;
P0 = table1[A2];   //显示十位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位)
dula = 1;
dula = 0;

wela = 0;
P0 = 0x7d;
wela = 1;
wela = 0;
delay(0);

P0 = table[A3];    //显示个位
dula = 1;
dula = 0;

P0 = 0x7b;
wela = 1;
wela = 0;
delay(0);
}


void main()
{
while(1)
{
     Display(Get_Tmp());
   }
}


关键字:DS18b20  测温程序 引用地址:DS18b20 测温程序详解

上一篇:51单片机矩阵键盘扫描程序
下一篇:单片机 音乐编写 《渴望》

推荐阅读最新更新时间:2024-03-16 15:12

数显温度计设计电路图大全(DS18B20/89S51单片机/液晶)
数显温度计设计电路图(一):液晶显示的数字式电脑温度计电路 如图为液晶显示的数字式电脑温度计电路。该八段式四位LCD显示器,内置驱动器,串行数据传送,使用方便。 液晶显示的数字式电脑温度计电路 数显温度计设计电路图(二) 介绍一种具有简单人工智能的温度控制电路,使用该电路进行温度控制时,只需将开关打在2的位置,通过设定控制温度,并通过3位半数显表头所显示的温度值,即可精确地控制温度,使得温控操作变得十分方便。LM35是一种内部电路已校准的集成温度传感器,其输出电压与摄氏温度成正比,线性度好,灵敏度高,精度适中.其输出灵敏度为10.0MV/℃,精度达 0.5℃.其测量范围为-55—150℃。在静止温度中自热效应低.工作电压较
[单片机]
数显温度计设计电路图大全(<font color='red'>DS18B20</font>/89S51单片机/液晶)
数字温度传感器DS18B20在变电站测温的应用
一 概述 温度是一种最基本的环境参数,与人民生活和工农业生产有着密切的关系,在电力供应中离不开温度测量。液压操作动机的断路器是电网的重要设备,保证断路器液压操作机构油路的正常运转对保证电网安全具有重要意义。当环境温度降低到一定程度后,断路器的油路流动受到影响,液压油黏度增大不利于油路的流动,影响断路器的特性。正常情况下,该装置显示当时温度值。当气温升高或降低到规定值时,此装置会立即自动安全关闭或打开加温装置,防止发生事故,是变电站不可缺少的保护装置。因此研究温度的测量方法和测量装置在实际生产中有着重要的意义。 测量温度的关键是温度传感器。随着技术飞速发展,传感器已进入第三代数字传感器。本测温系统采用的DS18B20就是属于
[单片机]
数字温度传感器<font color='red'>DS18B20</font>在变电站<font color='red'>测温</font>的应用
AT89C52单片机与DS18B20的接口电路及源代码
本文将介绍51单片机AT89C52与温度传感器芯片DS18B20构成测温系统,并提供源程序供读者参考.其测量的温度精度达到0.1度,测量的温度的范围在-20度到+50度之间,用4位数码管显示出来。 硬件电路原理图 图2 AT89S52与DS18B20组成的测温系统原理图 工作原理 DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。DS18B20产品的特点 (1)、只要求一个I/O口即可实现通信。 (2)、在DS18B20中的每个器件上都有独一无二的序列号。 (3)、实际应用中不需要外部任
[单片机]
AT89C52单片机与<font color='red'>DS18B20</font>的接口电路及源代码
DS18B20-Onewire Bus-单总线 单片机读取温度
DS18B20,单片机,11.0592MHZ /pre pre name= code class= cpp #ifndef __DELAY_H__ #define __DELAY_H__ /*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS ------------------------------------------------*/ vo
[单片机]
STM32 DS18B20 代码详解
DS18B20是最常用来学习某一个新的开发工具的,程序都是大同小异,主要是要注意时序中的延时要准确,指令要正确,这里记录一下! ------------------第一部分是--------ds18b20.h---------------------- #ifndef __DS18B20_H #define __DS18B20_H #include stm32f10x.h #include bsp_SysTick.h //精确延时函数头文件----参考http://blog.csdn.net/xuxuechen/article/details/40783209这个看一下 #define HIGH 1 #def
[单片机]
STM32 <font color='red'>DS18B20</font> 代码详解
AVR 单个DS18B20温度读取程序(可测负温度)
使用方法: 把两个文件放入工程,需要温度时调用DS18B20_ReadTemperature,返回值就是温度. DS18B20.h /****** AVR 单个DS18B20温度读取程序 ****** * 版本.........: 1.0 * 目标.........: AVR * 文件名.......: DS18B20.h * 编译器.......: IAR for AVR V5.5 *****************************************/ #ifndef __DS18B20_H__ #define __DS18B20_H__ #include #include delay.h #define
[单片机]
C51---13 DS18B20温度传感器
DS18B20介绍 引脚及电路 内部结构图 存储器的结构 单总线介绍 单总线电路规范 单总线时序结构❗ DS18B20操作流程 DS18B20数据帧 温度存储格式 DS18B20温度读取✨ 在LCD上显示温度 代码 main.c #include REGX52.H #include LCD1602.h #include DS18B20.h #include Delay.h float T; void main() { DS18B20_ConvertT(); //上电先转换一次温度,防止第一次读数据错误 Delay(1000); //等待转换完成
[单片机]
C51---13 <font color='red'>DS18B20</font>温度传感器
NTC热敏电阻测温度 单片机C和汇编源程序
NTC热敏电阻器参数介绍: 【标称阻值】 标称阻值是NTC热敏电阻器设计的电阻值,常在热敏电阻器表面标出。标称阻值是指在基准温度为25℃时零功率阻值,因此又被称为电阻值R25。 【额定功率】 额定功率是指热敏电阻器在环境温度25℃、相对湿度为45%~80%及大气压力为0.87~1.07Pa的大气条件下,长期连续负荷所允许的耗散功率。 【B值范围】 B值范围(K)是负温度系数热敏电阻器的热敏指数,反映了两个温度之间的电阻变化。它被定义为两个温度下零功率电阻值的自然对数之差与这个温度倒数之差的比值。B值可用下述公式计算,即 式中,R1、R2分别是绝对温度T1、T2时的电阻值(Ω)。 【零功率电阻值】 在规定温度下测量热敏电阻
[单片机]
NTC热敏电阻<font color='red'>测温</font>度 单片机C和汇编源<font color='red'>程序</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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