ds18b20显示程序学习笔记
DS18B20学习总结
我一般使用的是前三个指令,第四个和第五个我还没有掌握。
6
我们看到的就是写0和写一的时序了。我们先分析时间,注意的是DS1820在什么时候开始采集数据,最小值是在15us以后,最大值是在60us之后,典型值都是30us之后。我们只需保证15us之前就确定大小,60us之后退出就可以了。按照之前那个延时函数的计算,1×8+4=12us,7×8+4=60us,这两个值都可以。我们就可以得到下简单。我们先看一下数据结构吧。
由两个字节组成我们的温度数据,MSB的高5位是表示的正负数,正数都是0,负数则都是1。其余的各位则表示数据了。需要说明的是,这个温度的精度是由控制寄存器控制的。默认出厂时,设置为12位精度。我们不需要做修改。可以参见下节。
如果是正数,则直接把MSB和LSB连接起来,成为了一个16位的数,乘以0.0625即可。如果是负数,则需要把数据连接起来之后,取反加一。
我们看一下,ROM操作指令。这些指令一共有5个。
分别是33H,读ROM指令,这个指令是读取内部的固化数据的指令。第一个数据是系列码,我们之前说过了,DS18B20的值是28H。然后是48位的唯一序列号。然后是8位的CRC校验码。也就是说,我们发出了33H,就可以连续读出这8字节的数据。低位时系列码,它最先被读出来。
While(DAT) ; //DS18B20拉低总线,则表示响应。
Delay(30); //延时必须大于最大值240us,保证能够使总线变高。
If(DAT)
ComSendStr(“Reset DS18B20 OK!”);
}
DS18B20各程序功能
DS18B20各程序功能(急求!)2009-09-29 10:46 ke1783|分类:其他编程语言|浏览2045次我想知道,常规情况下,DS18B20各程序段的功能(1)主程序(2)显示子程序(3)中断子程序(4)延时子程序(5)DS18B20初始化子程序(6)读/写一个字节子程序(7)读出温度子程序(8)键盘扫描子程序keyscan在线等。
解释最好详细一点,好的再加50分。
扫描二维码下载下载知道APP10分钟有问必答!建议:可使用微信的“扫一扫”功能扫描下载分享到:2009-09-30 12:42 提问者采纳(1)主程序:程序的执行从主程序开始,首先调用初始化子程序,用于对中断配置等必要的初始赋值,然后进入主循环,不断重复的执行或调用主循环中的程序,实现数码管的动态扫描、按键的识别和键值处理、温度转换等功能。
(2)显示子程序:显示若用数码管,要显示完整的温度值,一般会选用4位一体数码管,在显示子程序中,对数码管的段、位以动态扫描的方式根据当前需要显示的内容不断对其进行更新和配置,利用人眼的惰性效应达到动态显示的目的。
(3)中断子程序:一般温度不需要实时测量,因为温度是不会突变的,没有必要实时,另一方面实时太占用系统资源,所以可以隔一段时间测量一次,用定时器中断来定时使能测温标志,供温度转换程序在主程序中查询。
(4)延时子程序:单总线时序是建立在延时操做基础上的。
(5)DS18B20初始化子程序:相当于给18B20数据头的作用,18B20检测到初使化电平,准备开始接收或发送数据,另一方面,可根据DS18B20是否作出应答来检测它是否在总线上。
(6)读/写一个字节子程序:在单总线上按照标准单总线的读/写时序,产生一个读/写单字节数据的操作事件,什么时候读/写,读/写些什么,由18B20这个单总线器件内部的数据协议和数据结构来决定(单总线的器件有很多种,操作协议和数据结构不尽相同,但读写时序都是一样的)。
DS18B20笔记
WriteOneChar(TH); //写入想设定的温度报警上限
WriteOneChar(TL); //写入想设定的温度报警下限
WriteOneChar(RS); //写配置寄存器,格式为0 R1 R0 1,1 1 1 1
//R1R0=00分辨率娄9位,R1R0=11分辨率为12位
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(unsigned char dat)
delay_18B20(80); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay_18B20(80); // this message is wery important
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
/**************读取ds18b20当前温度************/
DQ = ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
1我的ds18b20总结
我的ds18b20总结,一、初始化,如图一:数据线拉低至少480us后再将其拉高,大约等待15~60us,就会收到60~240us的低电平的存在脉冲,其后数据线会恢复被拉高状态,在数据线被拉高到初始化结束经过的时间至少为480us,以下是我根据对初始化时序写的子程序,用的是51:#include <reg52.h>#define uchar unsigned char#define uint unsigned intvoid delay1(uint z)//延时子程序{ uint x,y;for(x=10;x>0;x--) /*z=1时,延时子程序用时约为61.5US*/{for(y=z;y>0;y--);}}void reset(){ uint i;DQ=1;i++;DQ=0;delay1(120);//软件仿真测试为495usDQ=1;for(i=65;i>0;i--){ //i这个数值可以改,for语句只是作为收到存在脉冲时的延时只要满足>60us就可以if(!DQ)break; //当收到存在脉冲时跳出循环}delay1(120); //大于480us}其实这个子程序并没考虑到干扰,因为假设在初始化过程有低电平脉冲的干扰,那么即使ds18b20没有发送低电平,也会认为初始化成功。
二、写时隙(1)写1时隙,如上右图:主控器将数据线拉低至少1us,并在拉低后的15us内再将其拉高,整个过程大于60us,子程序如下uchar bit1_write18b20(){uint i=0;DQ=1;i++;DQ=0;for(i=0;i<1;i++); //for(i=0;i<1;i++)约为12.94usDQ=1;for(i=0;i<4;i++); //约为51us,整个过程大于60usreturn(DQ);}(2)写0时隙,如上左图,主控器将数据线拉低至少60us后将其拉高,子程序如下:uchar bit0_write18b20(){uint i=0;DQ=1;i++;DQ=0;for(i=0;i<5;i++);//大于60usreturn(DQ);}三、读时隙阴影部分表示数据线的在这个时间段状态不确定,整个时序图的意思是主控制器将数据线拉高至少1us后,再将其拉低,在拉低后15us内的数据有效,整个时隙时间要大于60us.虽然pdf中,用两个时序图分别表示读0时隙和读1时隙,实际上读一位数的子程序只要一个,数据线拉低后1us,将数据线拉高,在15us内储存数据,再延时,使其满足总时间大于60us,下面给个例子:uchar bit_read18b20(void){ uint i;uint k;DQ=1;k++;DQ=0;for(i=0;i<1;i++); /*for(i=0;i<1;i++)约为12.94us*/DQ=1; /*60us*/return(DQ);}四、写、读一个字节数子程序:/*写一字节数*/void byte_write18b20(uint w){ uint i=0;bit b;for(;i<8;i++){ b=w&0x01;if(b)bit1_write18b20();else bit0_write18b20();w=w>>1;}}/*读一字节*/uchar byte_read18b20(void){uchar i;uint k;uchar value=0;for(i=0;i<8;i++){if(bit_read18b20())value|=(0x01<<i);for(k=0;k<6;k++); //延时使其满足读时隙时间}return(value);}(1)unsigned int Readtemp() //温度转换{unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;reset();byte_write18b20(0xCC);byte_write18b20(0x44);reset();byte_write18b20(0xCC); //skip rom指令byte_write18b20(0xBE); //温度转换指令a=byte_read18b20(); //连续读两个字节数据//读低8位b=byte_read18b20(); //读高8位t=b; //数值处理t<<=8;t=t|a; //两字节合成一个整型变量。
DS18B20应用笔记
DS18B20应用笔记2010-03-04 13:03:54比赛结束了,回首这段经历,前前后后因为实习、项目组的课题、春节等各种缘故,我进入实质性工作的时间过晚,使得预定的功能和技术指标并没有完全实现,有些遗憾。
不过,在和搭档一起努力下,最后几天高强度的工作也让我收获了很多,我想这个比赛也算没有白参加。
尤其是对DS18B20的进一步理解和运用,下面简单总结一下,为自己留个纪念。
在没有示波器、不能在线调试等各种“恶劣”条件下,我们只能靠将最终测量结果通过LCD显示出来而检验功能及指标,对于第一次使用DS18B20这个时序要求极高的器件来讲,确实是一个相对很大的工作量。
我们先后解决了LCD 译码显示、DS18B20初始化时序、DS18B20读写时序等问题,才最终让LCD 显示出了正常的温度值。
硬件上是51内核的MCU,DS18B20通过单总线接入MCU的一个I/O口,同时接一个4.7K的上拉电阻到3.3V电源,DS18B20的VDD通过外部电压源供电(3.3V)。
这个硬件结构相对简单,但是在后来调试中,我们发现了该MC U自己的特色,使得此硬件结构暗藏玄机。
起初,考虑到LCD的验证性质,我们必须让LCD能够正确的译码,否则无法定位代码的错误源头,这个环节工作量不是很大,但是对于定制的LCD来讲,还是要费点周折的。
后来,在写一些冗余代码测试出LCD能够正确译码的情况下,我们才真正开始了DS18B20的艰苦历程。
一上来就遇到了LCD一直显示的是测试码,通过程序结构,我们推断出DS 18B20初始化未成功,从而产生了第一个棘手问题。
对照DS18B20的datashe et,看到其初始化时序图:主机发给DS18B20一个复位脉冲(低电平)持续4 80-960us,然后拉高(DS18B20等待15-60us)后,DS18B20发送一个存在(pr esence)脉冲持续60-240us!为做到精确延时,又没有示波器,我们用C写了一个循环,并通过反汇编得到了其汇编指令,再结合MCU的datasheet上各类指令的时钟周期,以及当前晶振频率(11.0592MHz),计算了这个循环的延时,通过Delay子函数去做精确延时,做完这些后,原本以为可以解决其初始化问题,可是事与愿违……又仔细检查硬件结构以及MCU关于I/O口的使用,才意识到因为其I/O口是双向口,所以在每次读写时是通过修改寄存器来置该I/O口为输入还是输出,才能有效地读写数据。
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应用笔记
DS18B20应用笔记2010-03-04 13:03:54比赛结束了,回首这段经历,前前后后因为实习、项目组的课题、春节等各种缘故,我进入实质性工作的时间过晚,使得预定的功能和技术指标并没有完全实现,有些遗憾。
不过,在和搭档一起努力下,最后几天高强度的工作也让我收获了很多,我想这个比赛也算没有白参加。
尤其是对DS18B20的进一步理解和运用,下面简单总结一下,为自己留个纪念。
在没有示波器、不能在线调试等各种“恶劣”条件下,我们只能靠将最终测量结果通过LCD显示出来而检验功能及指标,对于第一次使用DS18B20这个时序要求极高的器件来讲,确实是一个相对很大的工作量。
我们先后解决了LCD 译码显示、DS18B20初始化时序、DS18B20读写时序等问题,才最终让LCD 显示出了正常的温度值。
硬件上是51内核的MCU,DS18B20通过单总线接入MCU的一个I/O口,同时接一个4.7K的上拉电阻到3.3V电源,DS18B20的VDD通过外部电压源供电(3.3V)。
这个硬件结构相对简单,但是在后来调试中,我们发现了该MC U自己的特色,使得此硬件结构暗藏玄机。
起初,考虑到LCD的验证性质,我们必须让LCD能够正确的译码,否则无法定位代码的错误源头,这个环节工作量不是很大,但是对于定制的LCD来讲,还是要费点周折的。
后来,在写一些冗余代码测试出LCD能够正确译码的情况下,我们才真正开始了DS18B20的艰苦历程。
一上来就遇到了LCD一直显示的是测试码,通过程序结构,我们推断出DS 18B20初始化未成功,从而产生了第一个棘手问题。
对照DS18B20的datashe et,看到其初始化时序图:主机发给DS18B20一个复位脉冲(低电平)持续4 80-960us,然后拉高(DS18B20等待15-60us)后,DS18B20发送一个存在(pr esence)脉冲持续60-240us!为做到精确延时,又没有示波器,我们用C写了一个循环,并通过反汇编得到了其汇编指令,再结合MCU的datasheet上各类指令的时钟周期,以及当前晶振频率(11.0592MHz),计算了这个循环的延时,通过Delay子函数去做精确延时,做完这些后,原本以为可以解决其初始化问题,可是事与愿违……又仔细检查硬件结构以及MCU关于I/O口的使用,才意识到因为其I/O口是双向口,所以在每次读写时是通过修改寄存器来置该I/O口为输入还是输出,才能有效地读写数据。
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数据处理心得
low = Ds18b20Read();//低位
high = Ds18b20Read();//高位
temp = high;
temp temp |= low;
temp = ((low >> 4)+((high & 0x07)*16));
temp1=low&0x0f;//这就是小数位,不需要转成float,然后又要转回
b=ReadOneChar(); //高位
bt=a+b;
return(t);
}
int temp;
floattemperature;
ReadTempFlag=0;
temp=ReadTemperature();
temperature=(float)temp*0.0625;
2.
unsigned char temp;
WriteOneChar(0x44); //启动温度转换
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是
温度
a=ReadOneChar(); //低位
cc2530上做温度采集时,为了显示小数这一位,用了很多方法,显示整数两
位没有问题,一加上小数位,就读不出来,后来在网上看到第2中方法的处
理,它是一直用unsignedchar,这种处理数据方法,对于某些场合,真的很
好用。
DS18B20数据处理心得
采集完数据,数据的处理方法很多,选中一种好的思路,那才是王道!
我写DS18B20总结
DS18B20模块:DS18B20是温度传感器,它的结构很简单,外形像一个三极管,它有VCC/GND和DQ 等三条管脚,DQ是一个双向的数据输入输出端口,其实它不需要用电源来供电的(用自己的数据线DQ就可以完成自身的供电条件),但是这样做会使信号的读取和输入的速度上慢下来所以最好还是要提供电源的供电。
DS18B20测得的温度使用12位二进制数据来储存,用二进制数的补码转换成10进制数再除以2就可得到实际检测的温度,最高位是符号位,当为正温度的时候s=0;当为负温度的时候s=1;如0550H就是+85度。
如图就是18B20的储存数据的方式。
DS18B20的工作过程及时序的分析:每个类似于数据通信的模块之间都会有一个相应的协议,也就是调试内部的数据转换成外部读出的信息,必须遵从协议的规定才可以完成对所需信息的采集,DS18B20的协议有:初始化、ROM操作指令,存储器操作指令,还有处理数据等。
初始化:单总线上的所有处理均从初始化开始,初始化就是刚开始调节器件内部的工作状态,准备投入到工作中去,以及总线主机检测到DS18B20的存在。
ROM操作指令:一般常用的是SKIM ROM(CCH)跳过ROM;[CCH]还有的就是CONVERT TEMERA TURE[44H]用于温度的转换作用这样才可以将温度采集到。
时序时序图如下:第一个脉冲的区域是在400—960us之间的一般选到480us就可以了,在第二个高电平的约480us 15-60us 60—240us保持状态的时间是15us —60us 左右这个时候是等待的时间接着就是DS18B20在后一状态发出的存在的脉冲(低电平,持续60—240us 左右),这就是DS18B20的时序,再编写程序的时候要严格按照时序的要求完成协议之间的通信工作方式才可以让其内部准确的工作,根据时序图可以编写初始化时的c 代码如下:void delay(int m)//jiben1us{unsigned int n;for(n=0;n<m;n++) {};}//********************************************************void chushihua(){dq=0;delay(600); //送480us 脉冲;根据时序;dq=1;delay(35);//大约60us 左右;}这样就完成了DS18B20的初始化工作。
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使用笔记
DS18B20使用笔记作者:丁丁上路Email:dhj_20@当用C 语言对DS18B20进行编程时,其延时程序一定要注意,否则将不能对DS18B20进行正常操作。
当要对DS18B20进行操作时,必须遵循以下协议:即每次对DS18B20进行操作时,其操作流程为:初始化1-WIRE 总线——>发送ROM 命令——>发送Memory 命令(——>提取数据(可以没有))其中第四步并不是必须的,视情况而定。
比如:while((Reset()));//初始化WriteData(0xcc);//发跳过ROM 命令(ROM 命令)WriteData(0x44);//启动温度转换(MEMORY 命令)delay_us(125);//等待转换结束while((Reset()));//初始化WriteData(0xcc);//发跳过ROM 命令(ROM 命令)WriteData(0xbe);//发读取温度命令(MEMORY 命令)TepL =ReadData();//读温度值低8位(提取数据)TepH =ReadData();//读温度值高8位DS18B20控制时序图见下:初始化时序图1)Read ROM,2)Match ROM,3)Search ROM,4)Skip ROM,or 5)Alarm Search.P DFC r e a te !3Tr i a lwww.sc a n so f t .c o m写数据时序图读数据时序图注意:在进行读操作时,读的时间应控制在总线拉低后的10-15us ,超过15us 将不能正确读取。
P DFC r e a te !3T r i a lwww.sc a n so f t .c om注意:刚上电时,温度寄存器里的温度值为85P D F C r e a t e !3T r i a lw ww .s c a n s o f t .c om。
数字温度传感器DS18B20中文资料(含读写程序)
数字温度传感器DS18B20中文资料(含读写程序)数字温度传感器__中文资料(含读写程序)的学习供参考数字温度传感器__中文资料(含读写程序)__特点1.单线结构,只需一根信号线和CPU相连。
2. 不需要外部元件,直接输出串行数据。
3. 可不需要外部电源,直接通过信号线供电,电源电压范围为3.3V~5V。
4.测温精度高,测温范围为:一55℃~+125℃,在-10℃~+85℃范围内,精度为±O.5℃。
5.测温分辨率高,当选用12位转换位数时,温度分辨率可达0.0625℃。
6.数字量的转换精度及转换时间可通过简单的编程来控制:9位精度的转换时间为93.75 ms:10位精度的转换时间187.5ms:12位精度的转换时间750ms。
7.具有非易失性上、下限报警设定的功能,用户可方便地通过编程修改上、下限的数值。
8.可通过报警搜索命令识别哪片DS__采集的温度超越上、下限。
__引脚及管脚功能介绍__的常用封装有3脚、8脚等几种形式,如图1所示。
各脚含义如下:DQ:数字信号输入/输出端。
GND:电源地端。
VDD:外接供电电源输入端(在寄生电源接线时此脚应接地)。
__内部结构简要介绍:DS__的内部结构如图3所示:主要有64位光刻ROM、温度传感器、非易失性温度报警触发器TH和TL、配置寄存器等组成。
1.64位光刻ROM是生产厂家给每一个出厂的DS__命名的产品序列号,可以看作为该器件的地址序列号。
其作用是使每一个出厂的DS__地址序列号都各不相同,这样,就可以实现一根总线上挂接多个DS__的目的。
2.DS__中的温度传感器完成对温度的测量,输出格式为:16位符号扩展的二进制补码。
当测温精度设置为12位时,分辨率为O.0625℃,即O.0625℃/LSB。
其二进制补码格式如图2所示。
其中,S为符号位,S=1,表示温度为负值;S=0,表示温度为正值。
例如+125℃的数字输出为07D0H,-55℃的数字输出为FC90H。
数字温度传感器DS18B20报告
DS18B20报告一、DS18B20介绍DS18B20为单总线全双工通信的数字是温度传感器,其温度可以直接转换为9、10、11或12位,具体的位数由使用者通过程序写入指令改变,芯片默认的位数为12位。
芯片的形状如图。
芯片在电路的连接如图:二、读写时序1、复位时序(1)、单片机拉低总线480us~950us,然后释放总线(拉高电平)(2)、这时DS18B20会拉低信号,大约60~240us表示应答(3)、DS18B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,表示复位成功,否则不成功(此时一般要重负操作,直到成功为止,编程是要进行判断)(4)、DS18B20拉低电平60~240us之后,会释放总线。
2.写数据操作(1)、单片机拉低电平大约10~15us.(2)、加入要写入的时高电平,要将电平拉高,否则拉低电平。
此时要维持20~45us的时间(3)、释放总线写‘1’操作时序写‘0’操作时序3、读操作时序(1)、单片机拉低电平大约1us(2)、单片机释放总线,然后读取总线电平(3)、这时候DS18B20如果相应位是’1’会拉高电平,反之会拉低电平(4)、读取电平过后延迟大约40~45us读‘1’操作时序读‘0’操作时序三、温度读取函数步骤DS18B20开始转换:1.DS18B20复位2.写入跳过ROM的字节命令,0XCC.3.写入开始转换的功能命令,0X44.4.延迟大约750~900毫秒DS18B20读暂存数据1.DS18B20复位。
2.写入跳过ROM的字节命令,0XCC.3.写入读暂存功能命令,0XBE.4.读入第0个字节LS Byte,转换结果的低八位。
5.读入第1个字节MS Byte,转换结果的高八位。
6.DS18B20复位,表示读取暂存结束。
程序流程图:。
ds18b20显示程序学习笔记
ds18b20显示程序学习笔记ds18b20显示程序学习笔记本程序基于STM8S105K4 单片机学习程序。
程序硬件就是STM8的最小开发板搭建,用的内部晶振1分频。
经测试可以正常显示实际温度。
程序中遇到温度显示跳动问题,遇到了之前到达一定的温度之后超过这个温度读取的数据变为0xff. 显示温度为0 ,和始终显示85的情况。
这些情况程序中有注释。
最终通过调试和实验。
所有的程序如下:(程序中可能还有些其他没有发现的问题,或其他错误有问题再学习更改。
)//#ifndef __ds18b20_h//#define __ds18b20_h/**读取温度数值程序:unsigned char ds18b20_check(); //检测是否有DS18B20模块有则返回1,无则返回0void ds18b20_gone(); //复位和初始化void read_ds18b20_buff(); //转换和读取数据,最终温度数据在全局变量temp_last中当前模块状态:ds18b20_state*///包含以下可调用程序://*unsigned char ds18b20_check(); //检测是否有DS18B20模块有则返回1,无则返回0***////* ds18b20_reset(); */ //*将ds18b20复位//////*ds18b20_gone(); //DS18B20开始转换,包含复位////*read_ds18b20_buff(); //DS18B20 读取暂存数据值在temp_last中////*unsigned int temp_last; //处理后的最终温度值*10////*unsigned int temp_dec_x10(); //数据求出十进制范围十进制温度值,上一步已经包含////*当前模块状态:ds18b20_state //0xa0-0xa9 代表不同状态见下方//////////********************////////////***相关变量定义*****/////////C0端口的输入输出配置/////#define ds18b20_io_out GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST);#define ds18b20_io_in GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);#define ds18b20_dq_out1 GPIO_WriteHigh(GPIOD, GPIO_PIN_3);#define ds18b20_dq_out0 GPIO_WriteLow(GPIOD, GPIO_PIN_3);//端口输出数据////***ds18b20_state状态定义*****////#define checking 0xa0 //检测中#define resetbegin 0xa1 //开始复位#define resetover 0xa2 //复位完成#define writingdata 0xa3 //写数据中#define waitreport 0xa4 //复位等待#define readingdata 0xa5 //读数据中#define going 0xa6 //ds18b20开始工作#define gettempdata 0xa7 //获取温度数据中#define dataconversion 0xa8 //数据转换状态#define tempdataover 0xa9 //数据获取完成////////***************函数声明***************///////unsigned int temp_last; //读取处理后的最终温度值*10// unsigned char minus_flag=0; //定义符号位为全局变量unsigned char ds18b20_state; //模块状态unsigned char ds18b20_dq_read(void); //读取输入值unsigned int temp_buffer[]={0,0,0,0,0,0,0,0}; //保存读取的温度值,便于滤波unsigned char ds18b20_check(void); //检测是否有DS18B20模块有则返回1,无则返回0***//void ds18b20_reset(); //将ds18b20复位//void ds18b20_write_bit(unsigned char write_bit); //向ds18b20写位数据写入0或 1 ***// unsigned char ds18b20_read_bit(); //向ds18b20读位数据返回读取值0或1***// unsigned char ds18b20_read_bit(); //向ds18b20写字节数据// unsigned char ds18b20_read_byte(void); //向ds18b20读取字节数据并返回值//void ds18b20_gone(); //DS18B20开始转换//void read_ds18b20_buff(); //DS18B20 读取暂存数据//unsigned int temp_dec_x10(unsigned char temp1_in,unsigned char temp2_in);//数据求出十进制范围十进制温度值//unsigned char read_ds18b20(); //读取ds18b20的端口数据返回0或1 ***/////////***************函数声明结束***************///////unsigned char read_ds18b20(){// ds18b20_io_in ;if (GPIO_ReadInputPin(GPIOD, GPIO_PIN_3) )return 1;elsereturn 0;}unsigned char ds18b20_dq_read(void){if(GPIO_ReadInputPin(GPIOD, GPIO_PIN_3)==SET){ return 1; }else { return 0; }}void delay_us(unsigned int time_delay){while(time_delay--);}/*建档时间:20151215跟新记录:20151218测试通过。
DS18B20温度读取及显示讲解学习
void delay6us(uchar z){
while(z--);
}
void delayms(uchar z){
uchar i,j;
for(i=0;i<z;i++)
for(j=0;j<160;j++);
}
void init(){
uchar presence=1;
while(presence){
DS=ch&0x01;
delay6us(11);
DS=1;
delay6us(1);
ch>>=1;
}
}
void DSchange(){
DS=1;
init();
ds_write(0xcc);
ds_write(0x44);
}
void DSreadtempcom(){
DS=1;
init();
ds_write(0xcc);
return temp;
}
void display(uint wendu){
uchar bai,shi,ge,sfen,bfen,qfen;
uchar s,பைடு நூலகம்p,th,tl;
uint xs,flag;
flag=wendu&0x8000;
if(flag!=0)
wendu=~(wendu-1);
th=wendu/256;
wela=0;
if(flag!=0){
dula=0x40;//显示负号
}else
dula=0x00;
delayms(10);
wela=1;
if(bai!=0){
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ds18b20显示程序学习笔记本程序基于STM8S105K4 单片机学习程序。
程序硬件就是STM8的最小开发板搭建,用的内部晶振1分频。
经测试可以正常显示实际温度。
程序中遇到温度显示跳动问题,遇到了之前到达一定的温度之后超过这个温度读取的数据变为0xff. 显示温度为0 ,和始终显示85的情况。
这些情况程序中有注释。
最终通过调试和实验。
所有的程序如下:(程序中可能还有些其他没有发现的问题,或其他错误有问题再学习更改。
)//#ifndef __ds18b20_h//#define __ds18b20_h/**读取温度数值程序:unsigned char ds18b20_check(); //检测是否有DS18B20模块有则返回1,无则返回0void ds18b20_gone(); //复位和初始化void read_ds18b20_buff(); //转换和读取数据,最终温度数据在全局变量temp_last中当前模块状态:ds18b20_state*///包含以下可调用程序://*unsigned char ds18b20_check(); //检测是否有DS18B20模块有则返回1,无则返回0***////* ds18b20_reset(); */ //*将ds18b20复位//////*ds18b20_gone(); //DS18B20开始转换,包含复位////*read_ds18b20_buff(); //DS18B20 读取暂存数据值在temp_last中////*unsigned int temp_last; //处理后的最终温度值*10////*unsigned int temp_dec_x10(); //数据求出十进制范围十进制温度值,上一步已经包含////*当前模块状态:ds18b20_state //0xa0-0xa9 代表不同状态见下方//////////********************////////////***相关变量定义*****/////////C0端口的输入输出配置/////#define ds18b20_io_out GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_FAST);#define ds18b20_io_in GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);#define ds18b20_dq_out1 GPIO_WriteHigh(GPIOD, GPIO_PIN_3);#define ds18b20_dq_out0 GPIO_WriteLow(GPIOD, GPIO_PIN_3);//端口输出数据////***ds18b20_state状态定义*****////#define checking 0xa0 //检测中#define resetbegin 0xa1 //开始复位#define resetover 0xa2 //复位完成#define writingdata 0xa3 //写数据中#define waitreport 0xa4 //复位等待#define readingdata 0xa5 //读数据中#define going 0xa6 //ds18b20开始工作#define gettempdata 0xa7 //获取温度数据中#define dataconversion 0xa8 //数据转换状态#define tempdataover 0xa9 //数据获取完成////////***************函数声明***************///////unsigned int temp_last; //读取处理后的最终温度值*10// unsigned char minus_flag=0; //定义符号位为全局变量unsigned char ds18b20_state; //模块状态unsigned char ds18b20_dq_read(void); //读取输入值unsigned int temp_buffer[]={0,0,0,0,0,0,0,0}; //保存读取的温度值,便于滤波unsigned char ds18b20_check(void); //检测是否有DS18B20模块有则返回1,无则返回0***//void ds18b20_reset(); //将ds18b20复位//void ds18b20_write_bit(unsigned char write_bit); //向ds18b20写位数据写入0或1 ***// unsigned char ds18b20_read_bit(); //向ds18b20读位数据返回读取值0或1***//unsigned char ds18b20_read_bit(); //向ds18b20写字节数据//unsigned char ds18b20_read_byte(void); //向ds18b20读取字节数据并返回值//void ds18b20_gone(); //DS18B20开始转换//void read_ds18b20_buff(); //DS18B20 读取暂存数据//unsigned int temp_dec_x10(unsigned char temp1_in,unsigned char temp2_in);//数据求出十进制范围十进制温度值//unsigned char read_ds18b20(); //读取ds18b20的端口数据返回0或1 ***/////////***************函数声明结束***************///////unsigned char read_ds18b20(){// ds18b20_io_in ;if (GPIO_ReadInputPin(GPIOD, GPIO_PIN_3) )return 1;elsereturn 0;}unsigned char ds18b20_dq_read(void){if(GPIO_ReadInputPin(GPIOD, GPIO_PIN_3)==SET){ return 1; }else { return 0; }}void delay_us(unsigned int time_delay){while(time_delay--);}/*建档时间:20151215跟新记录:20151218测试通过。
注意事项:调试中遇到的问题有:void ds18b20_write_bit(unsigned char write_bit);unsigned char ds18b20_read_bit();中的delay_us();延时函数//这个时间特别重要,在调试中发现该时间小的时候会出现高于某个温度后显示000,此时适当增加这个延时的值就可以正常读取数值。
同时发现另外一个18b20之前一直显示85,以为有模块问题,但是把这个时间加长到60之后发现还是好的,可以读取正确的数据。
由此可以看出这个延时的时间很关键。
程序硬件:16MHZ晶振1分频;*/#include"ds18b20.h"//#include"delay.h"//*****检测是否有DS18B20模块有则返回1,无则返回0***//unsigned char ds18b20_check(void){u8 check=0;ds18b20_io_out; //ds18b20所接单片机IO引脚设置为输出ds18b20_dq_out0; //端口拉低480-950usdelay_us(700);// delay_us(700);ds18b20_io_in; //端口配置为输入等待应答//ds18b20_state=checking; //检查状态中////端口配置为输入等待应答//while((read_ds18b20())&&(check <= 200)) //大约60-240us内ds18b20会拉低主线// {check++;delay_us(1);delay_us(1);}if(check>=200)return 0; //如果没有拉低主线则没有检测到模块else check=0; //有检测到拉低的信号while (!(read_ds18b20())&&(check<240)) //拉低总线之后等待其释放{check++;delay_us(1);delay_us(1);}if(check>=240) return 0; //若拉高后240us后模块没有释放总线,检测失败else return 1;}void ds18b20_reset(){ds18b20_state=resetbegin; //开始复位//ds18b20_io_out; //ds18b20所接单片机IO引脚设置为输出ds18b20_dq_out0; //ds18b20的数据脚输出低电平,拉低总线480-950us,然后释放总线delay_us(700); //// delay_us(700);ds18b20_dq_out1; //delay_us(15); //等待ds18b20拉低应答。
// delay_us(15);ds18b20_state=waitreport;delay_us(65); //等待75us+15us=100us后读取总线电平// delay_us(65);ds18b20_io_in; //ds18b20的IO引脚设置为输入if(!read_ds18b20()) //读取端口状态,拉低则复位成功while(!read_ds18b20()); //等待从机ds18b20释放总线ds18b20_state=resetover; //ds18b20状态变化为复位完成。
}void ds18b20_write_bit(unsigned char write_bit){ds18b20_state=writingdata; //写数据状态ds18b20_io_out ; //单片机IO口设置为输出ds18b20_dq_out0; //单片机拉低电平10-15us// delay_us(15);delay_us(15);if(write_bit) //写入逻辑1{ds18b20_dq_out1;}else{ds18b20_dq_out0; //写入逻辑0}delay_us(60); //延时20-45us后释放总线//这个时间特别重要,在调试中发现该时间小的时候会出现高于某个温度后显示000// delay_us(45);ds18b20_dq_out1;ds18b20_io_in;}unsigned char ds18b20_read_bit(){ds18b20_state=readingdata; //读数据状态ds18b20_io_out; //单片机IO口设置为输出ds18b20_dq_out0;delay_us(2); //单片机拉低电平// delay_us(2);ds18b20_dq_out1;ds18b20_io_in; //单片机IO口设置为输入// delay_us(12);delay_us(12);if(read_ds18b20()){return(1);}else {return(0);}// delay_us(45);delay_us(60); //这个时间特别重要,在调试中发现该时间小的时候会出现高于某个温度后显示000void ds18b20_write_byte(unsigned char data){unsigned char i;ds18b20_io_out; //单片机IO口设置为输出for(i=0;i<8;i++){if(data&0x01)ds18b20_write_bit(1);elseds18b20_write_bit(0);data>>=1;}}unsigned char ds18b20_read_byte(void){unsigned char i,j,data=0;for(i=0;i<8;i++){j = ds18b20_read_bit();data = (j<<7)|(data>>1);}return data;}/*****DS18B20 温度读取函数参考步骤*************//*DS18B20开始转换1.DS18B20复位2.写入跳过ROM的字节命令,0xCC.3.写入开始转换的功能命令,0x44.4.延迟约750-900ms.DS18B20 读取暂存数据:1.DS18B20复位2.写入跳过ROM的字节命令,0xCC.3.写入开始转换的功能命令,0xee.4.读入第0个字节LSByte,转换结果的低八位。