ds1820 测量外界环境温度?

作者&投稿:李骂 (若有异议请与网页底部的电邮联系)
如何用Ds1820测量环境温度?知道的帮一下,谢了~

电路接线:DS18B20可以直接和CPU相连的,1接地,3接电源,2接CPU,下面是控制程序下载:通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: 0.0~ +99.9度
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define DATAPORT P0 //定义P0口为Led数据口
//#define SETTEMP P1 //定义P1口为设定温度
#define SELECT P2 //定义P2口为选择信号
sbit L1 = P1^1; //灯作为电机
sbit L2 = P1^2;
sbit L3 = P1^3;

sbit DQ = P3^4; //定义ds18b20通信端口
char Num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9
int temp1,temp2,ID=0,set=0,blink;
int temp1=27,xs=5; //定义整数和小数

unsigned int max,mid,min,flag;
/////////////////////下面是小板的地址///大板对应为0xc700,0xc600,0xc500////
#define led_data XBYTE[0xe000] //显示数据端口
#define led_sel XBYTE[0xc000] //显示器选择端
#define key_addr XBYTE[0xa000] //按键端口

//uchar d[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0x0F8,0x80,0x90};//仿真时用到

/*********延时>K*1ms,*//////*12.000mhz>11.0596有误差********/

void delayms(int ms)
{
uchar i;
while(ms--)
{
for(i=250;i>0;i--);
}
}
/***********ds18b20延迟子函数(晶振11.0596MHz )*******/
void delay_18B20(unsigned int i)
{
while(i--);
}
/**********ds18b20初始化函数**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位 ds18b20通信端口
delay_18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_18B20(4);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(20);
}
/***********ds18b20读一个字节**************/
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 高电平拉成低电平时读周期开始
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80; // | *
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0; //从高电平拉至低电平时,写周期的开始
DQ = dat&0x01; //数据的最低位先写入
delay_18B20(5); //60us到120us延时
DQ = 1;
dat>>=1; //从最低位到最高位传入
}
}
/**************读取ds18b20当前温度************/
void ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay_18B20(100); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
delay_18B20(100);
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
temp1=b<<4; //高8位中后三位数的值
temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位数的值 temp1室温整数值
temp2=a&0x0f; //小数的值
// temp=((b*256+a)>>4); //当前采集温度值除16得 实际温度值
xs=temp2*0.0625*10; //小数位,若为0.5则算为5来显示 xs小数

我来回答吧,上个学期, 我做的课程设计就是基于单片机的数据温度计。

以下是我写出一程序,如果看不懂的话,就发邮件给我,amwjie72@163.com



#include
#include
#include
#include

#define uint unsigned int
#define uchar unsigned char

uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 用于共阳 低电平有效 不带小数点
uchar table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; // 带小数点 用于第三位

sbit w1 =P2^7;
sbit w2 =P2^6;
sbit w3 =P2^5; //此处要用带小数点的共阳编码
sbit w4 =P2^4;
sbit dat=P3^5; //P3^5为DS18B20的数据线

void delay_ds18b20(uint t) reentrant; //用于ds18b20的延时程序
bit reset_ds18b20(void); //用于复位ds18b20
void wr_bit(bit i); //用于向ds18b20写入一个bit
void wr_byte(uchar d); //用于向ds18b20写入一个byte
uchar rd_bit(void); //用于从ds18b20读出一个bit
uchar rd_byte(void); //用于从ds18b20读出一个byte
void start_ds18b20(void) small; //用于启动ds18b20的温度转换
void read_temperature(); //用于读取ds18b20的温度
void shift(); //用于转换读取的温度值
void obtain_temp(); //更新一次温度值
void delay();

uchar temph; //保存温度高八位
uchar templ; //保存温度低八位
bit nagetiveflag; //如果此bit为1表示温度为负
uint integral; //转换温度的整数部分
uint radix_point; //转换温度的小数点部分


void main()
{





while(1)
{
if(nagetiveflag==1)
{
P0=0xbf;
}
else if(integral/100==0)
{
P0=0xff;
}
else
{
P0=table[integral/100];
}
w1=0;
delay();
w1=1;

if((integral%100)/10==0)
{
P0=0xff;
}
else
{
P0=table[(integral%100)/10];
}
w2=0;
delay();
w2=1;

P0=table1[integral%10];
w3=0;
delay();
w3=1;

P0=table[radix_point];
w4=0;
delay();
w4=1;

obtain_temp();


}


}
/*
///////////////////////////////
函数: delay_ds18b20
功能: ds18b20延时函数
参数: t 为定时时间长度
返回: 无
说明: 延时公式:15*t+15(近似),晶振12Mhz
//////////////////////////////
*/
void delay_ds18b20(uint t)reentrant
{
for( ;t>0;t--)
{
_nop_;_nop_;_nop_;_nop_;
}
_nop_;_nop_;
}

/*
///////////////////////////////
函数: reset_ds18b20
功能: 复位ds18b20
参数: 无
返回: 1:复位成功 0:复位失败
说明: 拉低总线至少480us;可用于检测ds18b20, 晶振12Mhz
//////////////////////////////
*/
bit reset_ds18b20()
{
bit ret=1;
dat=0; //拉低总线
delay_ds18b20(32); //为保险起见,延时495us
dat=1; //释放总线
delay_ds18b20(4); //需要等待15~60us ,这里延时75us,保证接收的是存在脉冲
ret=dat;
delay_ds18b20(14); //让ds18b20释放总线。
dat=1;
return(~ret);
}

/*
///////////////////////////////
函数: wr_bit
功能: 向ds18b20写入一个bit
参数: i
返回: 无
说明: 拉低总线至少1us;并在0~15us内向总线写入要写入的bit 持续60us, 晶振12Mhz
//////////////////////////////
*/
void wr_bit(bit i)
{
dat=0; //拉低总线产生写时序
_nop_();
_nop_();
dat=i; //延时大于1us,并在15us内写入数据
delay_ds18b20(3);//延时60us 等待ds18b20采样读取
dat=1; //释放总线
}
/*
///////////////////////////////
函数: wr_byte
功能: 向ds18b20写入一个byte
参数: d
返回: 无
说明: 通过调用wr_bit(bit i)从低往高位写
//////////////////////////////
*/
void wr_byte(uchar d)
{
uchar i=0;
while(i++<8)
{
wr_bit(d&0x01); //此处&为按位与,但结果会传给一个bit 所以不会产生错误
d>>=1;
}
}
/*
///////////////////////////////
函数: rd_bit
功能: 从ds18b20读出一个bit
参数: 无
返回: bit
说明: 总线从高拉低总线,持续至少1us以上,再释放总线。产生读时序
//////////////////////////////
*/
uchar rd_bit()
{
uchar retu;
dat=0; //拉低总线
_nop_;_nop_;
dat=1; //释放总线
_nop_;_nop_;
_nop_;_nop_;
retu=dat; //读取数据
delay_ds18b20(3);
dat=1; //释放总线
return retu;
}
/*
///////////////////////////////
函数: rd_byte
功能: 从ds18b20读出一个byte
参数: 无
返回: ucahr
说明: 通过调用8次rd_bit()达到读出一个byte
//////////////////////////////
*/
uchar rd_byte()
{
uchar i;
uchar da;
for(i=0;i<8;i++)
{
da>>=1; //选读最低位
if(rd_bit())//读出来的是0可不用做或运算
{
da|=0x80;
}
}
return da;
}

/*
///////////////////////////////
函数: start_ds18b20
功能: 启动ds18b20
参数: 无
返回: 无
说明: 复位后,写入0xcc跳过对rom的操作,并写入0x44来启动温度转换
//////////////////////////////
*/
void start_ds18b20() small
{
dat=1;
reset_ds18b20();
wr_byte(0xcc); //跳过对rom的操作
wr_byte(0x44); //启动温度转换
}
/*
///////////////////////////////
函数: read_temperature
功能: 读取温度
参数: 无
返回: 无
说明: 复位后,写入0xcc跳过对rom的操作,并写入0xbe来读取温度。读两个字节
//////////////////////////////
*/
void read_temperature()
{
int temp;
reset_ds18b20();
wr_byte(0xcc); //跳过对rom的操作
wr_byte(0xbe); //发读取命令
templ=rd_byte();
temph=rd_byte();
}
/*
///////////////////////////////
函数: shift
功能: 温度转换
参数: 无
返回: 无
说明: 在读出温度后,用来将温度信息转换为对应该的温度数值大小
radix_point为小数点部分 integral整数部分
//////////////////////////////
*/
void shift()
{
if(temph>15)
{
nagetiveflag=1;
}
else
{
nagetiveflag=0;
}
radix_point=((float)(templ&0x0f))/1.6;
integral=(temph&0x07)*16+(templ>>4);
}
/*
///////////////////////////////
函数: delay
功能: 动态扫描延时
参数: 无
返回: 无
说明: 无
//////////////////////////////
*/
void delay()
{
uint k,j;
for(k=50;k>0;k--)
for(j=5;j>0;j--);
}
/*
///////////////////////////////
函数: obtain_temp
功能: 复位DS18B20读取温度值并对其进行转换
参数: 无
返回: 无
说明: 更新radix_point(小数点部分) integral(整数部分)
//////////////////////////////
*/
void obtain_temp()
{
start_ds18b20();
read_temperature();
shift();
}

单总线温度传感器DS18S20

单总线即1-Wire总线结构,是Dallas Semiconductor非常简单实用的总线协议。1-Wire可以通过一条公共数据线实现主机与一个或多个从机之间的半双工、双向通信。使用1-Wire将引脚的使用减少到了最少,因此特别适合于单片机系统中。
Dallas Semiconductor公司推出的DS18S20温度传感器即为1-Wire总线接口。

由于其所需的引脚最少、接口简单、无需外部元件和精度高等优点,广泛应用于单片机系统中进行测温以及温度监控。本章主要介绍1-Wire总线以及1-Wire总线接口的温度传感器DS18S20的应用。

单总线概述
单总线,即1-Wire总线,顾名思义是只需要一根数据线的数据传输方式。典型的1-Wire总线结构,如图33.1所示。其中,1-Wire主机包括一个开漏极I/O端口,并通过上拉电阻上拉至3.3V或5V电源。外部1-Wire设备可以包含一个或多个,除了公共的地线外,所有1-Wire设备共用一根数据总线。1-Wire总线结构中主机为数据传输的控制器,主动和1-Wire设备通信,而1-Wire设备则只能被动和1-Wire主机通信。因此1-Wire总线结构是一种半双工的双向数据传输结构。
DS18S20是一种典型的1-Wire总线接口温度传感器,由Dallas Semiconductor公司生产。DS18S20数字温度传感器提供了9位高精度的摄氏温度测量,同时具有非易失性、用户可编程上下触发门限的报警功能。由于其独特的1-Wire总线接口,使得其可以占用极少的I/O引脚资源,使用起来十分方便。

DS18S20采用带隙温度检测结构,是DS1820的升级产品。DS18S20内部有3个主要部件:64位激光刻制的唯一ROM序列号、温度传感器以及非易失性温度报警触发器TH和TL。DS18S20通过1-Wire总线结构,仅需一个引脚即可实现数据的发送或接收。另外,用于DS18S20的供电电源可以从数据线本身获得,无须外部电源。每个DS18S20在出厂时都有唯一的一个ROM序列号,可以将多个DS18S20同时连在一根单总线上,从而实现多点分布温度测量。

DS18S20的供电方式

DS18S20可以采用两种供电方式,即外部供电方式和寄生电源供电方式。如果采用外部供电方式,如图所示。此时DS18S20可以外接3.3V或者5V的电源,而GND引脚必需接地。

如果采用寄生电源供电方式,如图所示。此时,DS18S20的VDD引脚必须接地。另外为了得到足够的工作电流,应给1-Wire线提供一个强上拉,一般可以使用一个场效应管将I/O线直接拉到电源上。DS18S20从1-Wire单总线上汲取能量,在信号线DQ处于高电平期间把能量存储在内部电容里,在信号线DQ处于低电平期间消耗电容上的电量工作,直到高电平到来,再给DS18S20内部的寄生电源充电。


山西省18511633882: 温度传感器DS18B20 -
鄹宁其仙: 正好我以前写过DS18B20的程序,现在共享给你. 我的单片机频率是8M,如果你的频率不同,请自己计算后把延时参数修改一下就可以了. DS1820温度传感器单线总线读时间片 read: push r24 in r24,SREG push r24 ldi r22,$FF clr r23 out ...

山西省18511633882: 大学物理实验 温度传感器研究 -
鄹宁其仙: 这个比较复杂啊 一.课题背景1.课题的意义 传感器网络在我们日常生活中的应用越来越多,他的实用性也逐渐的被人们所接受.温度检测就是传感器网络中不可缺少的一个重要部分,我的课程设计,就是制作传感器网络中的温度检测部分. 整个...

山西省18511633882: 单片机 通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值 -
鄹宁其仙: void dsInit() //初使化DS18b20 dsWait() //等待,延时 bit readBit() //读取一bit(一位),返回值为一个bit unsigned char readByte() //读取一个字节(Byte),就是读ds18b20一个字节的信息 void writeByte(unsigned char dat) //写一个字节给ds18b20,参数就是要写进的数据 int getTmpValue() //获取温度值,这个会返回一个整型的温度值

山西省18511633882: 你好,可以给你的ds18b20多点测温的程序给我吗??万分感谢 -
鄹宁其仙: //DS18B20程序匹配序列号,并读温度.#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int sbit RS=P2^2; sbit RW=P2^1; sbit EN=P2^0; sbit DQ=P3^2; uchar code str1[]={0x8c,0x00,0x00,0x03,0xba,0x83,...

山西省18511633882: 我用DS18b20测温度 然后无线发送给PC 为什么接受的是汉字 -
鄹宁其仙: 这个问题比较专业,牵扯的节点好几个,先声明我对编程外行,只是了解电子基础.你应该在以下环节找原因:1.DS1820工作时序是否正确.2.DS1820中9位(16位)温度值是否正确读出;3.无线发送和接收是否同步;4.接收的数据值是否被计算机程序正确读取;5.显示方式是否正确.你把显示的汉子当成显示错误,寻找导致错误的原因.不知道你的PC程序是买/找/自编的,很大可能性问题出在PC程序上.真正找到原因可否分享下?

山西省18511633882: 用8051单片机和DS1820测温LCD显示,都需要什么器件?
鄹宁其仙: 8051单片机,12M晶振,ds18b20,lcd显示屏, 电容:33PF、10uF 电阻:1K、10K5V电源 电路板一块 电路和 电路图附上,给不给分就看你自己的了

山西省18511633882: 超声波测距用什么温度传感器较常用的 -
鄹宁其仙:[答案] DS-18B20 数字温度传感器 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器.一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念.现...

山西省18511633882: 有谁知道 如何修改ds18b20的温度转换精度? -
鄹宁其仙: 考虑到 DS1820测量温度的整数部分以 0.25℃、0.75℃为进位界限 的关系,实际温度 T实际可用下式计算得到:T实际=(T整数-0,然后切去测量结果中的最低有效位 (LSB),得到所测实际温度整数部分 T整数.5℃为分辨 率的温度测量结果,...

山西省18511633882: 单芯片的温度数据记录仪如何设计制作?
鄹宁其仙: 一个数据记录器是一种装置,记录一段时间的测量.测量该项目介绍了如何构建一个... 256字节内部EEPROM . 将与DS1820温度传感器测量温度.DS1820是一个线从达...

山西省18511633882: 用AT89S51单片机如何做数字温度计{用DS18B20温度传感器} -
鄹宁其仙: DS18B20感应到对应温度值时会出输一个对应电压,对过AD采样模快对电压采样,得到对应值,数据给单片机计算然后输出显示就行了!

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网