ds18b20测温程序详解
DS18B20是一种总线结构数据温度感应器,检测温度范围-55℃-125℃,具备体型小,硬件配置花销低,抗干扰性强,高精度的特性。在网上有关DS18B20的材料许多,可是光有程序流程,沒有解读,造成 身旁许多朋友即便取得源代码也找不到方向,下边就来说一下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 = temp0/10; //十位
A3 = temp; //个位数
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內部框架图
关键由2一部分构成:64位ROM、9字节数暂存器,如下图所示。
(1) 64 位ROM。它的具体内容是64 位系列号,它能够被看做是该DS18B20 的详细地址编码序列码,其功能是使每一个DS18B20 都不尽相同,那样就可以完成一根系统总线上建空好几个DS18B20 的目地。
(2) 9字节数暂存器包括:温度感应器、限制开启TH高溫报警系统、低限开启TL超低温报警系统、快速暂存器、8位CRC发生器。
一、ds18b20元器件基本原理:
电路原理图:
大部分所有的的重要信息都是在这幅图上啦。很与众不同的一个点便是数据信息I/O是同用一个引脚DQ的。
针对唯一的数据信息口,必须 一定的实行顺讯:
二、ds18b20实行编码序列
如图所示,每一次使用都需要符合以上次序,若是缺乏或是错乱,元器件将不容易传参。
1、复位:
根据总线结构的全部实行实际操作解决都从一个复位编码序列逐渐。复位编码序列包含一个从系统总线控制板产生的校准单脉冲和之后由从机发送的存有单脉冲,存有单脉冲让系统总线控制板了解DB18B20存有且早已搞好实际操作提前准备。
2、ROM命令:
这儿选用单单从机方式(只有一个DB18B20),只挑菌好多个非常关键的命令做以表明
READ ROM[33h](载入ROM命令):
仅有在数据总线上存有单只DS18B20的过程中能够应用这条指令。该指令容许系统总线控制板在没有应用检索ROM命令的情形下载入从机的64位片编码序列码。假如系统总线上面有不仅一只从机,当全部从机尝试与此同时传输数据信号时便会产生数据信息矛盾。
SKIP ROM[CCh](忽视ROM命令) :
这条命令容许系统总线控制板无需给予64位ROM编号便是用作用命令。比如,系统总线控制板能够先传出一条忽视ROM命令,随后传出温度换算命令[44h],进而进行温度换算实际操作。留意:当仅有一直从机在系统总线处时,不管怎样,忽视ROM命令以后只有跟随传出一条载入暂存器命令[BEh]。
3、作用命令:
在系统总线控制板发送给欲联接的DS18B20一条ROM命令后,跟随能够推送一条DS18B20作用命令。这种指令容许系统总线控制板读写能力DS18B20的暂存器,进行温度换算和鉴别电源模式。
CONVERT T[44h](温度换算命令):
这条指令用于运行一次温度换算。温度换算命令强制执行,造成的温度换算結果数据信息以两个字节数的方式被储存在告知暂存器中,然后DS18B20储存等候情况。假如DS18B20以外界开关电源供电系统,系统总线控制板在传出该指令后跟随传出读时钟频率,DS18B20假如处在变换中,将在数据总线上回到0,若温度换算进行,则回到1。
READ SCRATCHPAD(载入暂存器命令):
这条指令载入暂存器的內容。载入将从字节数0逐渐,一直开展下来,直至第9字节数(字节数8)看完,假如不愿看完全部字节数,控制板能够在其他時间传出校准指令来停止载入。
三.9字节数暂存器框架图
之上是內部9 个字节数的储存模块(包含EEPROM)。
字节数0~1 是溫度储存器,用于储存变换好的溫度。
字节数2~3 是客户用于设定最大警报和最少警报值。这一可以用手机软件来完成。
字节数4 是配备存储器,用于配备变换精密度,让它工作中在9~12 位。
字节数5~7 保存位。
字节数8 CRC校验位。是64位ROM中的前56位编号的检验码。由CRC产生器造成。
四.溫度存储器框架图
溫度存储器由2个字节数构成,分成低8位和高8位。一共16位。
在其中,第0位到第三位,储存的是溫度值的小数部分。
第4位到第一0位储存的是溫度值的整数金额一部分。
第一1位到第一5位为标记位。全0表明是正溫度,全1表明是负温度。
报表中的标值,假如对应的位为1,表明存有。假如对应的位为0,表明不会有。
五.配备存储器
精密度值:
9-bit 0.5℃
10-bit 0.25℃
11-bit 0.125℃
12-bit 0.0625℃
六.溫度/数据信息关联
留意:假如溫度是一个负温度,要将看到的数据信息减一再取反
最新更新
猜你喜欢
电工推荐
![电工技术基础_电工基础知识_电工之家-电工学习网](/skin/images/guanzhu.jpg)