DS18B20 测温程序完全解读

合集下载

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在与微处理器连接时仅需要一条线即可实现微处理器与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,因为每个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详细解读(转载)

测温芯片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 数字温度传感器(参考:智能温度传感器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程序设计傻瓜式讲解
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多点测温(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解析说明

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并读出数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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());}}}。

相关文档
最新文档