企业年金怎么查询,海口百度seo,qq靓号申请免费网站,开封企业网络推广方案DS18B20温度传感器原理
内部结构 64位(激)光刻只读存储器 光刻ROM中的64位序列号是出厂前被光刻好的#xff0c;它可以看作是该DS18B20的地址序列号。64位光刻ROM的排列是#xff1a;开始8位#xff08;28H#xff09;是产品类型标号#xff0c;接着的48位是该DS18B20自身…DS18B20温度传感器原理
内部结构 64位(激)光刻只读存储器 光刻ROM中的64位序列号是出厂前被光刻好的它可以看作是该DS18B20的地址序列号。64位光刻ROM的排列是开始8位28H是产品类型标号接着的48位是该DS18B20自身的序列号最后8位是前面56位的循环冗余校验码。光刻ROM的作用是使每一个DS18B20都各不相同这样就可以实现一根总线上挂接多个DS18B20的目的。 DS18B20温度转换规则 DS18B20的核心功能是它可以直接读出数字的温度数值。温度传感器的精度为用户可编程的91011或12位分别以0.5℃0.25℃0.125℃和0.0625℃增量递增。在上电状态下默认的精度为12位。 DS18B20启动后保持低功耗等待状态,当需要执行温度测量和AD转换时总线控制器必须发出[44h]命令。转换完以后产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中DS18B20继续保持等待状态。 这是12位转化后得到的12位数据存储在DS18B20的两个8位的RAM中高字节的前5位是符号位如果测得的温度大于0这5位为‘0’只要将测到的数值乘以0.0625即可得到实际温度如果温度小于0这5位为‘1’测到的数值需要先减1再取反再乘以0.0625即可得到实际温度。 DS18B20温度传感器的存储器 DS18B20温度传感器的内部存储器包括一个高度的暂存器RAM和一个非易失性的可电擦除的EEPROM,后者存放高温度和低温度触发器TH、TL和结构寄存器。 配置寄存器 存储器的第4位为配置寄存器其组织见图8用户可按表3所示设置R0和R1位来设定DS18B20的精度。上电默认设置R01、R11(12位精度)。注意精度和转换时间之间有直接的关系。暂存器的位7和位0-4被器件保留禁止写入。
ROM指令表 RAM指令表 DS18B20初始化 数据线拉到低电平“0”。延时480微妙该时间的时间范围可以从480到960微妙。数据线拉到高电平“1”。延时等待80微妙。如果初始化成功则在15到60微妙时间内产生一个由DS18B20所返回的低电平“0”.根据该状态可以来确定它的存在但是应注意不能无限的进行等待不然会使程序进入死循环所以要进行超时判断。若CPU读到了数据线上的低电平“0”后还要做延时其延时的时间从发出的高电平算起第3步的时间算起最少要480微妙。
DS18B20读时序 将数据线拉低“0”。延时1微妙。将数据线拉高“1”,释放总线准备读数据。延时10微妙。读数据线的状态得到1个状态位并进行数据处理。延时45微妙。重复17步骤直到读完一个字节。
DS18B20写时序 数据线先置低电平“0”。延时15微妙。按从低位到高位的顺序发送数据(一次只发送一位)。延时60微妙。将数据线拉到高电平。重复15步骤直到发送完整的字节。最后将数据线拉高。
实验代码
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
sbit DSPORTP3^7;int Ds18b20ReadTemp();
#endiftemp.c
#include temp.hvoid Delay1ms(uint y)
{uint x;for(;y0;y--){for(x110;x0;x--);}
}uchar Ds18b20Init()
{uchar t1;uchar i0;DSPORT0;i70;while(i--);DSPORT1;i0;while(DSPORT){Delay1ms(1);i;if(i6){t0;return t;}}return t;
}void Ds18b20WriteByte(uchar dat)
{uchar i,j;for(j0;j8;j){DSPORT0;i;DSPORTdat0x01;i6;while(i--);DSPORT1;dat1;}
}uchar Ds18b20ReadByte()
{uchar i,j;uchar bi,byte;for(j8;j0;j--){DSPORT0;i;DSPORT1;i;i;biDSPORT;byte(byte1)|(bi7);i4;while(i--);}return byte;
}void Ds18b20ChangeTemp()
{Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);Ds18b20WriteByte(0x44);
}void Ds18b20ReadTempCom()
{Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);Ds18b20WriteByte(0xbe);
}int Ds18b20ReadTemp()
{int temp0;uchar tmh,tml;Ds18b20ChangeTemp();Ds18b20ReadTempCom();tmlDs18b20ReadByte();tmhDs18b20ReadByte();temptmh;temp8;temp|tml;return temp;
}main.c
#include reg52.h
#include temp.h
typedef unsigned char u8;
typedef unsigned int u16;sbit LSAP2^2;
sbit LSBP2^3;
sbit LSCP2^4;u8 code smgduan[16]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u8 num0,DisplayData[8];
u8 disp[4];void delay(u16 i)
{while(i--);
}void datapros(int temp)
{float tp;if(temp0){DisplayData[0]0x40;temp--;temp~temp;tptemp;temptp*0.0625*1000.5;}else{DisplayData[0]0x00;tptemp;temptp*0.0625*1000.5;}DisplayData[1]smgduan[temp/10000];DisplayData[2]smgduan[temp%10000/1000];DisplayData[3]smgduan[temp%10000%1000/100]|0x80;DisplayData[4]smgduan[temp%10000%1000%100/10];DisplayData[5]smgduan[temp%10000%1000%100%10];
}void DigDisplay()
{u8 i;for(i0;i6;i){switch(i){case(0):LSA0;LSB0;LSC0;break;case(1):LSA1;LSB0;LSC0;break;case(2):LSA0;LSB1;LSC0;break;case(3):LSA1;LSB1;LSC0;break;case(4):LSA0;LSB0;LSC1;break;case(5):LSA1;LSB0;LSC1;break;}P0DisplayData[5-i];delay(50);P00x00;}
}void main(){while(1){datapros(Ds18b20ReadTemp());DigDisplay();}
}