DS18B20怎么用?有没有C语言编写的程序?

如题所述

DS18B20的使用方法

由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。

DS18B20的复位时序

DS18B20的读时序

对于DS18B20的读时序分为读0时序和读1时序两个过程。

对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。

DS18B20的写时序

对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。

对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。

4. 实验任务

用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+100度之间,用8位数码管显示出来。

5. 电路原理图

6. 系统板上硬件连线

(1). 把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“动态数码显示”区域中的ABCDEFGH端子上。

(2). 把“单片机系统”区域中的P2.0-P2.7用8芯排线连接到“动态数码显示”区域中的S1S2S3S4S5S6S7S8端子上。

(3). 把DS18B20芯片插入“四路单总线”区域中的任一个插座中,注意电源与地信号不要接反。

(4). 把“四路单总线”区域中的对应的DQ端子连接到“单片机系统”区域中的P3.7/RD端子上。

7. C语言源程序
#i nclude <AT89X52.H>
#i nclude <INTRINS.h>

unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00,0x40};
unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,
25,28,31,34,38,41,44,48,
50,53,56,59,63,66,69,72,
75,78,81,84,88,91,94,97};
unsigned char displaycount;
unsigned char displaybuf[8]={16,16,16,16,16,16,16,16};
unsigned char timecount;
unsigned char readdata[8];
sbit DQ=P3^7;
bit sflag;

bit resetpulse(void)
{
unsigned char i;

DQ=0;
for(i=255;i>0;i--);
DQ=1;
for(i=60;i>0;i--);
return(DQ);
for(i=200;i>0;i--);
}

void writecommandtods18b20(unsigned char command)
{
unsigned char i;
unsigned char j;

for(i=0;i<8;i++)
{
if((command & 0x01)==0)
{
DQ=0;
for(j=35;j>0;j--);
DQ=1;
}
else
{
DQ=0;
for(j=2;j>0;j--);
DQ=1;
for(j=33;j>0;j--);
}
command=_cror_(command,1);
}
}

unsigned char readdatafromds18b20(void)
{
unsigned char i;
unsigned char j;
unsigned char temp;

temp=0;
for(i=0;i<8;i++)
{
temp=_cror_(temp,1);
DQ=0;
_nop_();
_nop_();
DQ=1;
for(j=10;j>0;j--);
if(DQ==1)
{
temp=temp | 0x80;
}
else
{
temp=temp | 0x00;
}
for(j=200;j>0;j--);
}
return(temp);
}

void main(void)
{
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
ET0=1;
EA=1;

while(resetpulse());
writecommandtods18b20(0xcc);
writecommandtods18b20(0x44);
TR0=1;
while(1)
{
;
}
}

void t0(void) interrupt 1 using 0
{
unsigned char x;
unsigned int result;

TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
if(displaycount==2)
{
P0=displaycode[displaybuf[displaycount]] | 0x80;
}
else
{
P0=displaycode[displaybuf[displaycount]];
}
P2=displaybit[displaycount];
displaycount++;
if(displaycount==8)
{
displaycount=0;
}

timecount++;
if(timecount==150)
{
timecount=0;
while(resetpulse());
writecommandtods18b20(0xcc);
writecommandtods18b20(0xbe);
readdata[0]=readdatafromds18b20();
readdata[1]=readdatafromds18b20();
for(x=0;x<8;x++)
{
displaybuf[x]=16;
}
sflag=0;
if((readdata[1] & 0xf8)!=0x00)
{
sflag=1;
readdata[1]=~readdata[1];
readdata[0]=~readdata[0];
result=readdata[0]+1;
readdata[0]=result;
if(result>255)
{
readdata[1]++;
}
}
readdata[1]=readdata[1]<<4;
readdata[1]=readdata[1] & 0x70;
x=readdata[0];
x=x>>4;
x=x & 0x0f;
readdata[1]=readdata[1] | x;
x=2;
result=readdata[1];
while(result/10)
{
displaybuf[x]=result%10;
result=result/10;
x++;
}
displaybuf[x]=result;
if(sflag==1)
{
displaybuf[x+1]=17;
}
x=readdata[0] & 0x0f;
x=x<<1;
displaybuf[0]=(dotcode[x])%10;
displaybuf[1]=(dotcode[x])/10;
while(resetpulse());
writecommandtods18b20(0xcc);
writecommandtods18b20(0x44);
}
}

参考资料:http://www.mcublog.com/blog/blog2007/shuizhongzehui/archives/2007/22353.html

温馨提示:内容为网友见解,仅供参考
无其他回答

ds18b20的c语言程序
l_tmpdate[0]=temp\/1000; \/\/显示百位,这里用1000,是因为我们之前乖以10位了 if(l_tmpdate[0]==0)l_tmpdate[0]=12;\/\/判断温度为正温度且没有上百,前面不显示 } l_tmp=temp%1000;l_tmpdate[1]=l_tmp\/100;\/\/获取十位 l_tmp=l_tmp%100;l_tmpdate[2]=l_tmp\/10;\/\/获取个位 ...

DS18B20数字温度计
MOV P2,#0FFH MOV P3,#0FFH MAIN: LCALL GET_TEMPER ;调用读温度子程序 LCALL DISP ;调用数码管显示子程序 AJMP MAIN ;重复循环 ;--- 读DS18B20传感器的温度值 --- GET_TEMPER:SETB P3.3 LCALL RST18B20 ;复位DS18B20 JB 00H,DSS2 RET DSS2: MOV A,#0...

急需用温度传感器ds18b20,数码管显示温度的单片机的C语言程序,运用的是...
0x0fd,0x0fb,0x0f7}; uchar data disdata[5]; uint tvalue; \/\/温度值 uchar tflag; \/\/温度正负标志 \/***ds1820程序***\/ void delay_18B20(unsigned int i) \/\/延时1微秒 { while(i--); }void ds1820rst() ...

求STC89C52单片机与DS18B20传感器用Keil c语言设计程序
\/\/DS18B20单线温度检测的应用样例程序 \/ DS18B20处理的顺序:1.初始化 2.ROM操作命令 3.存储器操作命令 4.处理\/数据 \/ include<REG52.H> include<math.h> include<INTRINS.H> define uchar unsigned char define uint unsigned int;\/***\/ define duanx P0 \/\/数码管的段 sbit seg1=P2^0;...

求基于AT89C51单片机的DS18B20温度检测程序(用C语言)
\/\/DS18B20的读写程序,数据脚P3.3 \/\/ \/\/温度传感器18B20汇编程序,采用器件默认的12位转化 \/\/ \/\/最大转化时间750微秒,显示温度-55到+125度,显示精度 \/\/ \/\/为0.1度,显示采用4位LED共阳显示测温值 \/\/ \/\/P0口为段码输入,P24~P27为位选 \/\/ \/***\/ include "reg51.h"include...

用C语言对STC89C52芯片编程,实现对DS18B20采集温度并显示出来,求...
case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;} delay(100);} P0 = 0;} } \/\/延时程序 void delay(unsigned int i){ char j;for(i; i > 0; i--)for(j = 200; j...

DS18B20怎么设置上下限
首先对DS18B20进行初始化:ds18b20Check()这一步同时也是检测是否有DS18B20挂接在总线上;其次对DS18B20写ROM指令:ds18b20Write(0xcc)这一步是跳过ROM匹配,只适合总线挂载单个DS18B20的情况;接着对DS18B20写存储器指令:ds18b20Write(0x4e)这一步是向DS18B20发出写RAM第3、4字节的指令,第3个字节是上限...

用C语言制作基于单片机的数字温度计设计的原理图好程序 51单片机_百度...
void delay(unsigned int i)\/\/延时 1ms 子程序 { unsigned char j;while(i--){ for(j=0;j<125;j++);} } void Init_DS18B20(void){ unsigned char x=0;DQ = 1; \/\/DQ复位 ds18b20通信端口 delay_18B20(8); \/\/稍做延时 DQ = 0; \/\/单片机将DQ拉低 delay_18B20(80); \/\/...

用LCD1602和DS18B20显示温度和时间C语言程序
您研究一下以下这个程序,然后就可以加上时间功能.多做一点就能多学一点.开机时对DS18B20进行检测,如果DS18B20检测不正常,LCD1602显示: DS18B20 ERROR PLEASE CHECK 蜂鸣器报警。DS18B20检测正常,LCD1602显示: DS18B20 OK TEMP: 100.8℃如果温度值高位为0,将不显示出来。你可以通过拔插DS18B20查看DS18B20的检测功能。\/* ME...

谁能告诉我单片机从ds18b20中读取温度的原理,是怎样将ds18b20中输出的...
拉高数据总线,延时一段时间后进入下1bit的读取。注意:这里能否正确读取的关键是延时的量是否足够精确,因此在用C语言写DS18B20程序之前,需要先根据单片机型号和晶振频率找出一个自己对延时的精度有足够把握的延时函数,随便在网上DOWN别人的程序很有可能因为延时不对跑不起来。参考资料:DS18B20数据手册 ...

相似回答