DS18B20 测温程序完全解读
DS18B20时序详解
DS18B20时序详解初始化时序:DS18B20的所有通信都是以由复位脉冲组成的初始化序列开始的。
该初始化序列由主机发出,后跟由DS18B20发出的存在脉冲(presence pulse)。
下图阐述了这一点。
DS18B20发出存在脉冲,以通知主机它在总线上并且准备好操作了。
在初始化时序中,总线上的主机通过拉低单总线至少480μs来发送复位脉冲。
然后总线主机释放总线并进入接收模式。
总线释放后,4.7kΩ的上拉电阻把单总线上的电平拉回高电平。
当DS18B20检测到上升沿后等待15到60us,然后以拉低总线60-240us的方式发出存在脉冲。
如上所述,主机将总线拉低最短480us,之后释放总线。
由4.7kΩ上拉电阻将总线恢复到高电平。
DS18B20检测到上升沿后等待15到60us,发出存在脉冲:拉低总线60-240us。
至此,初始化和存在时序完毕。
/*延时函数:(由于DS18B20延时均以15us为单位,故编写了延时单位为15us的延时函数,注意:以下延时函数晶振为12MHz)*//*************************************函数:Delayxus_DS18B20功能:DS18B20延时函数参数:t为定时时间长度返回:无说明:延时公式:15n+15(近似),晶振12Mhz*******************************************/void Delayxus_DS18B20(unsigned int t){for(t;t>0;t--){_nop_();_nop_();_nop_();_nop_();}_nop_(); _nop_();}/*************************************函数:RST_DS18B20功能:复位DS18B20,读取存在脉冲并返回参数:无返回:1:复位成功;0:复位失败说明:拉低总线至少480us ;可用于检测DS18B20工作是否正常*******************************************/bit RST_DS18B20(){bit ret="1";DQ=0;/*拉低总线*/Delayxus_DS18B20(32);/*为保险起见,延时495us */DQ=1;/*释放总线,DS18B20检测到上升沿后会发送存在脉冲*/Delayxus_DS18B20(4);/*需要等待15~60us,这里延时75us后可以保证接受到的是存在脉冲*/ret=DQ;Delayxus_DS18B20(14);/*延时495us,让ds18b20释放总线,避免影响到下一步的操作*/DQ=1;/*释放总线*/return(~ret);}写时序:主机在写时隙向DS18B20写入数据,在读时隙从DS18B20读取数据。
DS18B20温度传感器详细注解及驱动程序解析
DS18B20独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条线即可实现微处理器与DS18B20的双向通讯。
测温范围-55℃~+125℃,固有测温误差(注意,不是分辨率,这里之前是错误的)1℃。
支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
工作电源:3.0~5.5V/DC(可以数据线寄生电源)在使用中不需要任何外围元件。
测量结果以9~12位数字量方式串行传送。
如果使用51单片机的话,那么中间那个引脚必须接上4.7K~10K的上拉电阻,否则,由于高电平不能正常输入/输出,要么通电后立即显示85℃,要么用几个月后温度在85℃与正常值上乱跳。
根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
读ROM 33H 读DS1820温度传感器ROM中的编码(即64位地址)发出此命令之后,接着发出64 位ROM 编码,访问单总线上与该编码相符合ROM 55H对应的DS1820 使之作出响应,为下一步对该DS1820 的读写作准备。
用于确定挂接在同一总线上DS1820 的个数和识别64 位ROM 地址。
为搜索ROM FOH操作各器件作好准备。
跳过ROM CCH 忽略64 位ROM 地址,直接向DS1820 发温度变换命令。
告警搜索ECH 执行后只有温度超过设定值上限或下限的片子才做出响应。
RAM命令启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75m温度变换44Hs)。
结果存入内部第0、1字节RAM中。
1、复位操作复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
温度传感器DS18B20检测程序说明
DS18B20美国达拉斯公司生产的单总线协议的数字温度检测芯片,数据的写入与读取都在一根总线上进行操作,在总线上可以连接多个DS18B20,因为每个DS18B20都有唯一的光刻ROM序列号,所以可以进行ROM匹配,搜索指令进行选择相应的从机序列号。
编写DS18B20的检测程序主要包括:初始化函数(复位脉冲+存在脉冲),写数据函数,读取数据的函数。
对DS18B20的操作包括:初始化函数,ROM指令,RAM指令这三个部分。
接下来我先说一下这三个部分所对应的时序图的理解吧。
初始化:由于上拉电阻的存在,总线默认状态是高电平,接着主机将总线拉低,维持480us 到960us的时间,再接着就是释放总线,维持时间为15us到60us,接着就由从机发出一个低电平信号,将总线拉低,表示该DS18B20是正常地,或者说是存在的,其维持时间为60us 到240us。
上面一图是写入数据的时序图。
写时序:默认状态为高电平,先将总线拉低,至少维持1us 的延时时间,接着就往总线上进行写数据操作,接着DS18B20就开始采样数据了,整个过程时间为60us到120us。
下面一图是读取数据的时序图。
读时序:默认状态为高电平,先将总线拉低,接着在15us 之前,主机进行数据采样,其维持时间也为60us到120us。
下面是我在理解了DS18B20的原理之后所写的程序,调试成功了,且能实时读取外界温度的功能,这里是不读取小数部分的温度,只读取温度的正数值。
#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sbit DQ=P2^2;sbit duan=P2^6;sbit wei=P2^7;//是在11.0592M赫兹的频率下void delay_ms(uint t){uint i;for(;t>0;t--)for(i=110;i>0;i--);} //约为tms的延时程序void delay(uint x){while(x--);}void init_ds18b20(){uchar n;DQ=1;delay(2); //约为38usDQ=0;delay(80); //约为800usDQ=1;delay(4); //约为58usn=DQ;delay(10); //约为110us}void write_byte(uchar dat){uchar i;for(i=0;i<8;i++){DQ=0; //无论是写0或写1都要有至少1us的低电平DQ=dat&0x01;//总线直接等于写入的数据(低位在前,高位在后)delay(4); //约为58usDQ=1; //释放总线,为下一步的数据变换做准备dat>>=1;//数据进行移位操作}delay(4);}uchar read_byte(){uchar i,value;for(i=0;i<8;i++){DQ=0;value>>=1; //移位7次DQ=1; //先要释放总线,那样才能采样到有效数据if(DQ) //判断8次{value|=0x80;}delay(6); //约为78us}return value;}uchar read_temperature(){uchar a,b;init_ds18b20(); //每次操作指令前,都必须进行初始化设置write_byte(0xcc);//跳过ROM指令write_byte(0x44);//进行温度转换处理delay(300);//进行一定地延时约为3ms左右init_ds18b20();write_byte(0xcc);//跳过ROM操作write_byte(0xbe);//读取温度a=read_byte();//温度低字节b=read_byte();//温度高字节b<<=4;//b左移四位,低四位为0000b=b+(a&0xf0)>>4;//将a的低四位屏蔽,不取小数点,进行右移四位,合并成一个字节的数据return b;}void display(uchar aa,uchar bb) {duan=1;P0=table[aa];duan=0;P0=0xff;wei=1;P0=0xfe;wei=0;delay_ms(5);duan=1;P0=table[bb];duan=0;P0=0xff;wei=1;P0=0xfd;wei=0;delay_ms(5);}void main(){uchar num,shi,ge;while(1){num=read_temperature();shi=num/10; //分离出十位ge=num%10; //分离出个位display(shi,ge);}}。
测温芯片DS18B20详细解读(转载)
测温芯片DS18B20详细解读(转载)大家好,首先感谢大家对我前几天发布的“Remind BOX”DIY实例帖的支持和捧场,在此谢过了。
我今天要发一篇技术帖,是关于DS18B20这款强大的测温芯片的技术帖。
本帖将从不同角度帮助广大不熟悉DS18B20测温芯片的坛友更加了解这款芯片,也希望已经或者将要用到这款芯片的坛友可以更加顺利地完成自己的DIY作品。
言归正传,下面开始技术部分。
第一部分:DS18B20的封装和管脚定义首先,我们来认识一下DS18B20这款芯片的外观和针脚定义,DS18B20芯片的常见封装为TO-92,也就是普通直插三极管的样子,当然也可以找到以SO(DS18B20Z)和μSOP(DS18B20U)形式封装的产品,下面为DS18B20各种封装的图示及引脚图。
了解了这些该芯片的封装形式,下面就要说到各个管脚的定义了,如下表即为该芯片的管脚定义:上面的表中提到了一个“奇怪”的词——“寄生电源”,那我有必要说明一下了,DS18B20芯片可以工作在“寄生电源模式”下,该模式允许DS18B20工作在无外部电源状态,当总线为高电平时,寄生电源由单总线通过VDD引脚,此时DS18B20可以从总线“窃取”能量,并将“偷来”的能量储存到寄生电源储能电容(Cpp)中,当总线为低电平时释放能量供给器件工作使用。
所以,当DS18B20工作在寄生电源模式时,VDD引脚必须接地。
第二部分:DS18B20的多种电路连接方式如下面的两张图片所示,分别为外部供电模式下单只和多只DS18B20测温系统的典型电路连接图。
(1)外部供电模式下的单只DS18B20芯片的连接图(2)外部供电模式下的多只DS18B20芯片的连接图这里需要说明的是,DS18B20芯片通过达拉斯公司的单总线协议依靠一个单线端口通讯,当全部器件经由一个三态端口或者漏极开路端口与总线连接时,控制线需要连接一个弱上拉电阻。
在多只DS18B20连接时,每个DS18B20都拥有一个全球唯一的64位序列号,在这个总线系统中,微处理器依靠每个器件独有的64位片序列号辨认总线上的器件和记录总线上的器件地址,从而允许多只DS18B20同时连接在一条单线总线上,因此,可以很轻松地利用一个微处理器去控制很多分布在不同区域的DS18B20,这一特性在环境控制、探测建筑物、仪器等温度以及过程监测和控制等方面都非常有用。
ds18b20详解及程序
ds18b20详解及程序最近都在学习和写单⽚机的程序, 今天有空⼜模仿DS18B20温度测量显⽰实验写了⼀个与DS18B20基于单总线通信的程序. DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应⽤)是DALLAS 公司⽣产的1-Wire,即单总线器件,具有线路简单,体积⼩的特点。
因此⽤它来组成⼀个测温系统,具有线路简单,在⼀根通信线,可以挂很多这样的数字温度计。
DS18B20 产品的特点:(1)、只要求⼀个I/O ⼝即可实现通信。
(2)、在DS18B20 中的每个器件上都有独⼀⽆⼆的序列号。
(3)、实际应⽤中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55 到+125℃之间; 在-10 ~ +85℃范围内误差为±5℃; (5)、数字温度计的分辨率⽤户可以从9 位到12 位选择。
将12位的温度值转换为数字量所需时间不超过750ms;(6)、内部有温度上、下限告警设置。
DS18B20引脚分布图DS18B20 详细引脚功能描述:1、GND 地信号;2、DQ数据输⼊出引脚。
开漏单总线接⼝引脚。
当被⽤在寄⽣电源下,此引脚可以向器件提供电源;漏极开路, 常太下⾼电平.通常要求外接⼀个约5kΩ的上拉电阻.3、VDD可选择的VDD 引脚。
电压范围:3~5.5V; 当⼯作于寄⽣电源时,此引脚必须接地。
DS18B20存储器结构图暂存储器的头两个字节为测得温度信息的低位和⾼位字节;第3, 4字节是TH和TL的易失性拷贝, 在每次电复位时都会被刷新;第5字节是配置寄存器的易失性拷贝, 同样在电复位时被刷新;第9字节是前⾯8个字节的CRC检验值.配置寄存器的命令内容如下:MSB LSBR0和R1是温度值分辨率位, 按下表进⾏配置.默认出⼚设置是R1R0 = 11, 即12位.温度值分辨率配置表4种分辨率对应的温度分辨率为0.5℃, 0.25℃, 0.125℃, 0.0625℃(即最低⼀位代表的温度值)12位分辨率时的两个温度字节的具体格式如下:⾼字节:其中⾼字节前5位都是符号位S, 若分辨率低于12位时, 相应地使最低为0, 如: 当分辨率为10位时, 低字节为:, ⾼字节不变....由上表可看出, 当输出是负温度时, 使⽤补码表⽰, ⽅便计算机运算(若是⽤C语⾔, 直接将结果赋值给⼀个int变量即可).DS18B20 的使⽤⽅法:由于DS18B20 采⽤的是1-Wire 总线协议⽅式,即在⼀根数据线实现数据的双向传输,⽽对单⽚机来说,我们必须采⽤软件的⽅法来模拟单总线的协议时序来完成对DS18B20芯⽚的访问。
ds18b20程序设计傻瓜式讲解
ds18b20程序设计傻瓜式讲解
DS18B20 是一款数字温度传感器,可以直接读出被测温度,并采用 9 位数字量串行输出。
下面是一个简单的 DS18B20 程序设计讲解:
1. 初始化
在 DS18B20 通信过程中,首先需要初始化数据线,即将其置为高电平。
在初始化时,需要持续至少 480 微秒的高电平。
2. 跳过 ROM
在 DS18B20 中,每个传感器都有一个唯一的 ROM 序列号,可以通过跳过ROM 操作来避免对 ROM 进行操作。
具体操作是先发出一个低电平,然后持续至少 60 微秒的高电平。
3. 发送命令
在跳过 ROM 后,需要向传感器发送命令。
常用的命令有温度转换命令和读取温度命令。
温度转换命令是 0x44,读取温度命令是 0xBE。
4. 读取数据
在发送命令后,需要等待传感器响应。
传感器响应的标志是数据线上的低电平。
在低电平持续约 60-240 微秒后,数据线将变为高电平,此时可以开始读取数据。
每次读取一位数据后,需要将数据线置为低电平,等待传感器响应。
5. 数据解析
DS18B20 的数据由 9 位数字量组成,其中最高位是符号位。
如果最高位为0,则表示温度为正数;如果最高位为 1,则表示温度为负数。
其余 8 位为温度值,可以通过一定的计算公式将其转换为实际温度值。
以上就是 DS18B20 的程序设计流程。
需要注意的是,在实际应用中,还需要考虑数据传输的校验、错误处理等问题。
DS18B20多点测温(51C程序)
DS18B20多点测温由于本人在前两天找DS18B20多点测温(51 C程序),网上下载了很多,但是都不是很理想,后来,自己总结前人的知识,重新写了这个程序。
其中包括程序一:单个读序列号。
程序二,匹配并且读两个DS18B20,当然,读多个与读两个基本原理一样,只要加上其序列号等即可。
本程序所有显示都是用LCD1602显示。
程序一:度序列号,并用1602显示,1602从左到右分别是低到高位。
#include<reg51。
h>#define uchar unsigned char#define uint unsigned intsbit DQ=P3^7;//ds18b20与单片机连接口sbit RS=P3^0;sbit RW=P3^1;sbit EN=P3^2;unsigned char code str1[]={" "};unsigned char code str2[]={” ”};uchar fCode[8];uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志/*************************lcd1602程序**************************/void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j〈100;j++);}void wr_com(unsigned char com)//写指令//{delay1ms(1);RS=0;RW=0;EN=0;P2=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{delay1ms(1);;RS=1;RW=0;EN=0;P2=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!=’\0'){wr_dat(*p);p++;delay1ms(1);}}void init_play()//初始化显示{lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str2);}/******************************ds1820 *********************/ void delay_18B20(unsigned int i)//延时1微秒{while(i——);}void ds1820rst()/*ds1820复位*/{ uchar x=0;DQ = 1; //DQ复位delay_18B20(4);//延时DQ = 0;//DQ拉低delay_18B20(100); //精确延时大于480us DQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ uchar i=0;uchar dat = 0;for (i=8;i〉0;i--){ DQ = 0;//给脉冲信号dat>〉=1;DQ = 1;//给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/ {uchar i=0;for (i=8; i>0;i——){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/ {uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<〈=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue);}/*******************************************************************/void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(tflag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:—if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}wr_com(0xc0);wr_dat(flagdat);//显示符号位wr_com(0xc1);wr_dat(disdata[0]);//显示百位wr_com(0xc2);wr_dat(disdata[1]);//显示十位wr_com(0xc3);wr_dat(disdata[2]);//显示个位wr_com(0xc4);wr_dat(0x2e);//显示小数点wr_com(0xc5);wr_dat(disdata[3]);//显示小数位}void DispCode(){unsigned char i,temp;ds1820rst();ds1820wr(0x33);for (i=0;i〈8;i++){fCode[i]=ds1820rd();}wr_com(0x80+0x40);for (i=0;i<8;i++){temp = fCode[i]〉>4; //显示高四位if (temp〈10)wr_dat(temp + 0x30);elsewr_dat(temp + 0x37);temp = fCode[i]&0x0f;//显示低四位if (temp〈10)wr_dat(temp+ 0x30);elsewr_dat(temp + 0x37);}}/********************主程序***********************************/ void main(){init_play();//初始化显示DispCode(); //系列号显示delay1ms(1000);while(1){//read_temp();//读取温度// ds1820disp();//显示;}}程序二:匹配序列号,并读温度。
DS18B20解析说明
DS18B20解析说明●D S18B20的性能指标●(1)只需⼀根⼝线与MCU连接,⽆需外部原件。
●由总线提供电源,或专线供电。
●测温范围为-55摄⽒度⾄+125摄⽒度。
●9到12位温度读数。
●温度转换时间为200ms。
●⽤户⾃⾏设定温度报警上下限,掉电后数据有效。
●可识别并寻址系统中温度超限报警的DS18B20,●D S18B20的电源及⼯作⽅式●DS18B20的供电⽅式,DS18B20有两种⼯作⽅式,⼀种是外部供电⽅式即从VCC引脚供电,GND接地,另⼀种是寄⽣电源供电⽅式,直接从DQ端上获得电源,当DQ为⾼电平是为内部电容充电,当DQ 为低电平是电容为DS18B20供电(VCC端必须接地)已确保芯⽚的稳定性,●DS18B20的测温原理,DS18B20通过内部温度寄存器接收⼀个受温度系数影响的振荡器输出的脉冲个数直接影响到数字温度数据,温度转化命令执⾏后,发送读⾼速暂存器命令(BEh)可将温度数据经单线总线读出,温度数据传输时,低位在先。
●当收到温度转换命令后,DS18B20的内部数字化温度转换器讲温度数据以⼆进制补吗形式储存到16位快速暂存器中,有效数据位可编程设定为9位,10位,11位,12位,分别对应4种分辨率:0.5摄⽒度0.25摄⽒度0.125摄⽒度0.0625摄⽒度。
有效数据最⾼位为符号位,可表⽰温度的正负值。
⾼字节的其他⾼位扩展为符号位;有效数据的第四位表⽰温度的⼩数位,DS18B20出⼚默认状态为12位。
表DS18B20温度值格式表bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8●表 8-2 温度与转换数据的关系//上电复位时温度寄存器的值为+85℃(0000 0101 0101 0000)●报警信号的应⽤。
DS18B20 每次执⾏完温度抓换后,温度值将与储存在TH和TL内的触发值相⽐较,如果测量的结果⼤于TH的值或⼩于TL的值,就会置位内部的报警标志位,在连接多⽚DS18B20的应⽤系统中,主机发送报警搜索命令(ECh)时,有置位报警标志位的DS18B20会响应总线主机发回标志位,其他没有置位报警标志位的DS18B20则保持沉默,这样便于主机⽴即识别DS18B20并读出数据。
温度传感器18B20程序,超全注释
#include "reg51.H"#include "stdio.h"#include "intrins.h"sbit DQ=P1^4; //接18B20的数据口#define uchar unsigned char#define uint unsigned intuint temp; //温度值variable of temperature/*****************DS18B20******************/void Init_Ds18b20(void) //DS18B20初始化send reset and initialization command{DQ = 0; //单片机拉低总线delay10us(60); //精确延时,维持至少480usDQ = 1; //释放总线,即拉高了总线delay10us(20); //此处延时有足够,确保能让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会控制总线,把数据传输到总线上delay10us(2); //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分if(DQ) //控制器进行采样{dat |= 0x80; //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0}delay10us(4); //此延时不能少,确保读时序的长度60us。
DS18B20温度传感器详解带c程序
00A2H
+0.5
0000 0000 0000 000
0000H
-0.5
1111 1111 1111 1000
FFF8H
-10.125
1111 1111 0110 1110
FF5EH
-25.0625
1111 1110 0110 1111
FF6FH
-55 执行序列与介绍 3.1 执行序列
duan=1; switch(i) {
case 0: if(zf==0) P1=numfh[zf];
else if(bai!=0) P1=numd[bai]; else if(shi!=0) P1=numd[shi]; else P1=numdg[ge]; break;
case 1: if(zf==0&&shi!=0) P1=numd[shi];
表 3.2 DS18B20 温度/数字对应关系表
温度(℃)
输出的二进制码
对应的十六进制码
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0001
0191H
+10.125
0000 0000 1010 0010
uchar x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); } /******************15us 延时函数****************/ void delay(uint z) {
while(z--); } /******************初始化 DS18B20 函数****************/ void reset_ds18b20() {
DS18B20测温流程图
主程序流程图:
DS18B20程序流程图:
程序按数据手册的时序图编写子函数模块:
1、DS18B20复位函数:resetDS18B20(void)
2、写一位的函数:WriteBit (unsigned char wb)
3、读一位的函数:unsigned char ReadBit (void)
4、读一个字节的函数:unsigned char readByteDS18B20(void)
即将位读取的时序循环8次。
5、写一个字节的函数:void writeByteDS18B20(unsigned char Data)。
即将位写入的时序循环8次。
6、first和next函数流程图:
1、端口初始化子函数;
2、串口初始化;
3、串口发送一个字符函数:void USART_Putchar(unsigned char
send_char)
4、串口发送数组函数:void UsartTransmit(unsigned char *data,
unsigned char len)
5、串口发送字符串函数:void USART1_Putstr(char *s)
即通过字符串长度控制USART_Putchar函数的循环次数。
6、串口发送字符串子程序(带有换行符):
void USART1_Puts(char *s)
7、串口接收字符串函数:unsigned char getchar1(void)
8、串口接收中断子程序:void USART_RXT(void)流程图
1、 数据打包子函数:void Packet_Data(void)
2、。
ds18b20学习及例程详解
• 当转换分辨率为 12 位时,最大转换时间 为750ms; • 用户可定义的,非易失性(及断电不消 失)的高低警报温度设置; • 可选择的 8-pin SO (150mil), 8-pin μSOP, 和 3-pin TO-92 封装; • 软件协议与ds1822兼容; • 在温度控制,工业系统,日常消费品, 等领域广泛使用。
• Ds18b20 存 在 一 个 内 部 电 容 Cpp,起到寄生电源的作用; • 这使得, ds18b20 的 Vdd 接地 时,依然可以通过数据线, 获取power,当DQ为高电平时, Cpp充电,当DQ为低电平时, Cpp 放电,为 ds18b20 提供能 量;
五,温度ห้องสมุดไป่ตู้存器
• Ds18b20内部有一个2byte的高速暂存寄存 器,用来存储ds18b20转换得到的温度数 据;
Ds18b20使用
一、ds18b20介绍
• 温度传感器的种类众多,在应用于高精 度、高可靠性的场合时 DALLAS(达拉斯) 公司生产的 DS18B20 温度传感器当仁不 让。超小的体积,超低的硬件开消,抗 干扰能力强,精度高,附加功能强,使 得 DS18B20 更受欢迎。
二,ds18b20实物与示例图
• 任何一个ds18b20,都有仅属于自己的一 个64位的识别码,这使得,可以有多个 ds18b20通过一条数据线与主机相连并发 挥功能,换句话说,也就是一个主机, 可以通过一条数据线,同时控制多个 ds18b20进行工作(可以在大范围,多地 点温度采集控制中使用);
四,ds18b20内部构造综述
• Ds18b20内部构造框架图为:
• 64位ROM存储了ds18b20的唯一的序列码:
• 高速暂存寄存器包含了2byte的温度存储 器,用来存储ds18b20温度转换得到的数 据;
DS18B20测温原理
DS18B 20测温原理当DS18B 20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1,2字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.062 5 ℃/LSB 形式表示。
温度值格式如图3.4所示。
MSB LSBMSBLSB图3.4 温度值格式这是12位转化后得到的12位数据,存储在18B 20的两个8比特的R AM 中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
图中,S 表示位。
对应的温度计算:当符号位S =0时,表示测得的温度植为正值,直接将二进制位转换为十进制;当S=1时,表示测得的温度植为负值,先将补码变换为原码,再计算十进制值。
例如+125℃的数字输出为07D0H ,+25.0625℃的数字输出为0191H ,—25.0625℃的数字输出为FF6F H ,—55℃的数字输出为FC90H 。
DS18B 20温度传感器主要用于对温度进行测量,数据可用16位符号扩展的二进制补码读数形式提供,并以0.0625℃/LSB 形式表示。
表3.1是部分温度值对应的二进制温度表示数据。
表3.1 部分温度值温度/ 二进制表示十六进制表示 +125 00000111 11010000 07D0H +25.062500000001 100100010191H +0.5 00000000 00001000 0008H 0 00000000 00000000 0000H -0.5 11111111 11111000 FFF8H -25.0625 11111110 01101111 FE6FH -551111110010010000FC90H 。
数字温度传感器DS18B20详解
数字温度传感器DS18B20详解一、概述传统的温度检测大多以热敏电阻为传感器,采用热敏电阻,可满足40℃至90℃测量范围,但热敏电阻可靠性差,测量温度准确率低,对于小于1℃的温度信号是不适用的,还得经过专门的接口电路转换成数字信号才能由微处理器进行处理。
目前常用的微机与外设之间进行的数据通信的串行总线主要有I2C总线,SPI总线等。
其中I2C总线以同步串行2线方式进行通信(一条时钟线,一条数据线),SPI总线则以同步串行3线方式进行通信(一条时钟线,一条数据输入线,一条数据输出线)。
这些总线至少需要两条或两条以上的信号线。
而单总线( 1-wire bus ),采用单根信号线,既可传输数据,而且数据传输是双向的,CPU 只需一根端口线就能与诸多单总线器件通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
因而,这种单总线技术具有线路简单,硬件开销少,成本低廉,软件设计简单,便于总线扩展和维护。
同时,基于单总线技术能较好地解决传统识别器普遍存在的携带不便,易损坏,易受腐馈,易受电磁干扰等不足,因此,单总线具有广阔的应用前景,是值得关注的一个发展领域。
单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。
主机或从机通过一个漏极开路或三态端口连至数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线。
单总线通常要求外接一个约为 4.7K 的上拉电阻,这样,当总线闲置时其状态为高电平。
DS18B20数字式温度传感器,与传统的热敏电阻有所不同的是,使用集成芯片,采用单总线技术,其能够有效的减小外界的干扰,提高测量的精度。
同时,它可以直接将被测温度转化成串行数字信号供微机处理,接口简单,使数据传输和处理简单化。
部分功能电路的集成,使总体硬件设计更简洁,能有效地降低成本,搭建电路和焊接电路时更快,调试也更方便简单化,这也就缩短了开发的周期。
DS18B20单线数字温度传感器,即“一线器件”,其具有独特的优点:( 1 )采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
DS18B20的工作原理
DS18B20的工作原理DS18B20是一种数字温度传感器,它采用单总线接口进行通信,并使用独特的1-Wire协议进行数据传输。
DS18B20的工作原理可以简单概括为温度测量和数据传输两个主要过程。
1. 温度测量过程:DS18B20内部集成为了一个温度传感器,它通过测量半导体材料的电阻值来获取环境温度。
在工作时,DS18B20会将电源电压应用到传感器上,并通过内部电路将传感器的电阻值转换为数字信号。
具体的温度测量过程如下:1.1 上电初始化:当DS18B20接收到电源电压时,它会进行一系列的初始化操作,包括复位传感器、读取存储在ROM中的惟一地址等。
1.2 温度转换:DS18B20内部的温度传感器会将环境温度转换为电阻值。
这个转换过程是通过将电源电压应用到传感器上,然后测量传感器两端的电压来实现的。
传感器的电阻值与环境温度之间存在一种特定的关系,DS18B20会根据这个关系将电阻值转换为温度值。
1.3 数字信号输出:经过温度转换后,DS18B20会将测量到的温度值以数字信号的形式输出。
它使用独特的1-Wire协议将温度数据传输到控制器或者其他外部设备。
2. 数据传输过程:DS18B20使用1-Wire协议进行数据传输,这种协议只需要一个数据线来实现通信。
数据传输过程如下:2.1 主设备发送指令:主设备(通常是控制器)向DS18B20发送指令,指令可以是温度转换命令、读取温度值命令等。
2.2 DS18B20接收指令:DS18B20接收到主设备发送的指令后,会进行相应的处理。
例如,如果是温度转换命令,DS18B20会启动温度转换过程。
2.3 DS18B20发送应答信号:DS18B20在接收到指令后,会向主设备发送一个应答信号,表示已经准备好进行数据传输。
2.4 DS18B20发送数据:DS18B20会将温度数据以1-Wire协议的格式发送给主设备。
数据传输过程中,DS18B20会按照一定的时序将数据位发送给主设备。
数字温度传感器DS18B20(含程序)
数字温度传感器DS18B20摘要DS-18B20 数字温度传感器具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
应用范围广泛,适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域,轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制和汽车空调、冰箱、冷柜、以及中低温干燥箱等。
一、引脚图DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)二、DS18B20的主要特性1.1、电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电1.2、DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯1.3、多个DS18B20可以并联在唯一的三线上,实现组网多点测温1.4、DS18B20在使用中不需要任何外围元件1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快1.8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力1.9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
三、DS18B20的外形和内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20内部结构图四、DS18B20工作原理DS18B20的温度转换时的延时时间由2s 减为750ms。
DS18B20测温原理如图3所示。
DS18B201602多点测温(51_C程序)解析
DS18B20多点测温(读序列,匹配序列,51 C程序,1602显示)由于本人在前两天找DS18B20多点测温(51 C程序),网上下载了很多,但是都不是很理想,后来,自己总结前人的知识,重新写了这个程序。
其中包括程序一:单个读序列号。
程序二,匹配并且读两个DS18B20,当然,读多个与读两个基本原理一样,只要加上其序列号等即可。
本程序所有显示都是用LCD1602显示。
程序一:度序列号,并用1602显示,1602从左到右分别是低到高位。
#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P2^3;//ds18b20与单片机连接口sbit RS=P2^5;sbit RW=P2^6;sbit EN=P2^7;unsigned char code str1[]={" "};unsigned char code str2[]={" "};uchar fCode[8];uchar data disdata[5];uint tvalue;//温度值uchar tflag;//温度正负标志/*************************lcd1602程序**************************/void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void wr_com(unsigned char com)//写指令//{ delay1ms(1);RS=0;RW=0;EN=0;P0=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{ delay1ms(1);;RS=1;RW=0;EN=0;P0=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}void init_play()//初始化显示{ lcd_init();wr_com(0x80);display(str1);wr_com(0xc0);display(str2);}/******************************ds1820 *********************/ void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst()/*ds1820复位*/{ uchar x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480us DQ = 1; //拉高delay_18B20(40);}uchar ds1820rd()/*读数据*/{ uchar i=0;uchar dat = 0;for (i=8;i>0;i--){ DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}void ds1820wr(uchar wdata)/*写数据*/ {uchar i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp()/*读取温度值并转换*/ {uchar a,b;ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0x44);//*启动温度转换*/ds1820rst();ds1820wr(0xcc);//*跳过读序列号*/ds1820wr(0xbe);//*读取温度*/a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数return(tvalue);}/*******************************************************************/ void ds1820disp()//温度值显示{ uchar flagdat;disdata[0]=tvalue/1000+0x30;//百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[3]=tvalue%10+0x30;//小数位if(tflag==0)flagdat=0x20;//正温度不显示符号elseflagdat=0x2d;//负温度显示负号:-if(disdata[0]==0x30){disdata[0]=0x20;//如果百位为0,不显示if(disdata[1]==0x30){disdata[1]=0x20;//如果百位为0,十位为0也不显示}}wr_com(0xc0);wr_dat(flagdat);//显示符号位wr_com(0xc1);wr_dat(disdata[0]);//显示百位wr_com(0xc2);wr_dat(disdata[1]);//显示十位wr_com(0xc3);wr_dat(disdata[2]);//显示个位wr_com(0xc4);wr_dat(0x2e);//显示小数点wr_com(0xc5);wr_dat(disdata[3]);//显示小数位}void DispCode(){unsigned char i,temp;ds1820rst();ds1820wr(0x33);for (i=0;i<8;i++){fCode[i]=ds1820rd();}wr_com(0x80+0x40);for (i=0;i<8;i++){temp = fCode[i]>>4; //显示高四位if (temp<10)wr_dat(temp + 0x30);elsewr_dat(temp + 0x37);temp = fCode[i]&0x0f;//显示低四位if (temp<10)wr_dat(temp+ 0x30);elsewr_dat(temp + 0x37);}}/********************主程序***********************************/ void main(){init_play();//初始化显示DispCode(); //系列号显示delay1ms(1000);while(1){//read_temp();//读取温度// ds1820disp();//显示;}}程序二:匹配序列号,并读温度。
DS18B20 测温程序完全解读
硬件:51板(1)单线ds18b20接P2.2(2)使用外部电源给ds18b20供电,没有使用寄生电源奥软件:Kei uVision 2刚开始对时序把握不好,可是在论坛里没找到比较详细的解释,所以俺倒塌了这个东东,就把俺的经验贴上来,供大家参考,呵呵……如有错误请指正#include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){while(us--);}void delay(uint count) //延时子函数{uint i;while(count){i=200;while(i>0)i--;count--;}}/*串口初始化,波特率9600,方式1 */void init_com(){TMOD=0x20; //设置定时器1为模式2TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示*/void display(uint temp){uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);}/*****************************************时序:初始化时序、读时序、写时序。
DS18B20使用方法解读
DS18B20的主要特性
(1)适应电压范围更宽,电压范围:3~5.5V,在寄生电源方式下可由数据线供电。 (2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器 与DS18B20的双向通信。 (3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测 温。 (4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极 管的集成电路内。 (5)测温范围55℃~+125℃,在10℃~+85℃时精度为0.5℃。 (6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和 0.0625℃,可实现高精度测温。 (7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms时间内 把温度值转换为数字,速度更快。 (8)测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校 验码,具有极强的抗干扰纠错能力。
DS18B20外形及引脚排列图
DS18B20工作原理
DS18B20测温原理框图如图所示:
图中低温度系数晶振的振荡频率受温度影响很小, 用于产生固定频率的脉冲信号送给计数器1。高温 度系数晶振随温度变化其振荡频率明显改变,所产 生的信号作为计数器2的脉冲输入。计数器1和温度 寄存器被预置在55℃所对应的一个基数值。计数 器1对低温度系数晶振产生的脉冲信号进行减法计 数,当计数器1的预置值减到0时,温度寄存器的值
数字化温度传感器DS18B20
美国DALLAS半导体公司的数字化温度传感器DS18B20是世界上第一片支 持“一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用 户可轻松地组建传感器网络,为测量系统的构建引入全新概念。现在,新
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS18B20 测温程序完全解读测温, 程序, 解读硬件:51板(1)单线ds18b20接P2.2(2)使用外部电源给ds18b20供电,没有使用寄生电源奥软件:Kei uVision 2刚开始对时序把握不好,可是在论坛里没找到比较详细的解释,所以俺倒塌了这个东东,就把俺的经验贴大家参考,呵呵……如有错误请指正#include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){while(us--);}void delay(uint count) //延时子函数{uint i;while(count){i=200;while(i>0)i--;count--;}}/*串口初始化,波特率9600,方式1 */void init_com(){TMOD=0x20; //设置定时器1为模式2TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据CON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示*/void display(uint temp){uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);}/*****************************************时序:初始化时序、读时序、写时序。
所有时序都是将主机(单片机)作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
初始化时序:复位脉冲存在脉冲读;1 或0时序写;1 或0时序只有存在脉冲信号是从18b20(从机)发出的,其它信号都是由主机发出的。
存在脉冲:让主机(总线)知道从机(18b20)已经做好了准备。
******************************************//*--------------------------------------------------------------------------------------------------------------------初始化:检测总线控制器发出的复位脉冲和ds18b20的任何通讯都要从初始化开始初始化序列包括一个由总线控制器发出的复位脉冲和跟在其后由从机发出的存在脉冲。
初始化:复位脉冲+存在脉冲具体操作:总线控制器发出(TX)一个复位脉冲(一个最少保持480μs 的低电平信号),然后释放总线,进入接收状态(RX)。
单线总线由5K 上拉电阻拉到高电平。
探测到I/O 引脚上的上升沿后DS1820 等待15~60μs,然后发出存在脉冲(一个60~240μs 的低电平信号)。
具体看"倒塌18b20"文档里的" 单线复位脉冲时序和1-wire presence detect "的时序图-------------------------------------------------------------------------------------------------------------------*/void ds_reset(void){ds=1;_nop_(); //1usds=0;TempDelay(80); //当总线停留在低电平超过480us,总线上所以器件都将被复位,这里//延时约530us总线停平超过480μs,总线上的所有器件都//将被复位。
_nop_();ds=1; //产生复位脉冲后,微处理器释放总线,让总线处于空闲状态,原因查//18b20中文资料TempDelay(5); //释放总线后,以便从机18b20通过拉低总线来指示其是否在线,//存在检测高电平时间:15~60us,所以延时44us,进行1-wire presence //de 存在检测)_nop_();_nop_();_nop_();if(ds==0)flag=1; //detect 18b20 successelseflag=0; //detect 18b20 failTempDelay(20); //存在检测低电平时间:60~240us,所以延时约140us_nop_();_nop_();ds=1; //再次拉高总线,让总线处于空闲状态/**/}/*----------------------------------------读/写时间隙:DS1820 的数据读写是通过时间隙处理位和命令字来确认信息交换。
------------------------------------------*/bit ds_read_bit(void) //读一位{bit dat;ds=0; //单片机(微处理器)将总线拉低_nop_(); //读时隙起始于微处理器将总线拉低至少1usds=1; //拉低总线后接着释放总线,让从机18b20能够接管总线,输出有效数据_nop_();_nop_(); //小延时一下,读取18b20上的数据,因为从ds18b20上输出的数据//在读"时间隙"下降沿出现15us内有效dat=ds; //主机读从机18b20输出的数据,这些数据在读时隙的下降沿出现//15us内有效TempDelay(10); //所有读"时间隙"必须60~120us,这里77usreturn(dat); //返回有效数据}uchar ds_read_byte(void ) //读一字节{uchar value,i,j;value=0; //一定别忘了给初值for(i=0;i<8;i++){j=ds_read_bit();value=(j<<7)|(value>>1); //这一步的说明在一个word文档里面}return(value); //返回一个字节的数据}void ds_write_byte(uchar dat) //写一个字节{uchar i;bit onebit; //一定不要忘了,onebit是一位for(i=1;i<=8;i++){onebit=dat&0x01;dat=dat>>1;if(onebit) //写1{ds=0;_nop_();_nop_(); //看时序图,至少延时1us,才产生写"时间隙"ds=1; //写时间隙开始后的15μs内允许数据线拉到高电平TempDelay(5); //所有写时间隙必须最少持续60us}else //写0{ds=0;TempDelay(8); //主机要生成一个写0 时间隙,必须把数据线拉到低电平并保持至少60μs,这里64us ds=1;_nop_();_nop_();}}}/*****************************************主机(单片机)控制18B20完成温度转换要经过三个步骤:每一次读写之前都要18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18b20进行预定的操作。
复位要求主CPU将数据线下拉500us,然后释放,当ds18B20受到信号后等待16~60us,后发出60~240us的存在低脉冲,主CPU收到此信号表示复位成功******************************************//*----------------------------------------进行温度转换:先初始化然后跳过ROM:跳过64位ROM地址,直接向ds18B20发温度转换命令,适合单片工作发送温度转换命令------------------------------------------*/void tem_change(){ds_reset();delay(1); //约2msds_write_byte(0xcc);ds_write_byte(0x44);}/*----------------------------------------获得温度:------------------------------------------*/uint get_temperature(){float wendu;uchar a,b;ds_reset();delay(1); //约2msds_write_byte(0xcc);ds_write_byte(0xbe);a=ds_read_byte();b=ds_read_byte();temp=b;temp<<=8;temp=temp|a;wendu=temp*0.0625; //温度读取的解释我记录在"倒塌18B20"里面temp=wendu*10+0.5;return temp;}/*----------------------------------------读ROM------------------------------------------*//*void ds_read_rom() //这里没有用到{uchar a,b;ds_reset();delay(30);ds_write_byte(0x33);a=ds_read_byte();b=ds_read_byte();}*/void main(){uint a;init_com();while(1){tem_change(); //12位转换时间最大为750ms for(a=10;a>0;a--){display( get_temperature());}}}。